ASP.NET Core'de genelleştirme ve yerelleştirme
Rick Anderson ,Life Bowden, Bart Bartxto, Nadeem Afanave Hisham Bin Bartya
Çok dilli bir web sitesi, sitenin daha geniş bir kitleye ulaştırmalarını sağlar. ASP.NET Core dillere ve kültürlere yerelleştirme için hizmetler ve ara yazılım sağlar.
Uluslararasılaştırma, Genelleştirme ve Yerelleştirmeyi içerir. Genelleştirme, farklı kültürleri destekleyen uygulamalar tasarlama işlemidir. Genelleştirme, belirli coğrafi alanlara yönelik tanımlı bir dil betikleri kümesi giriş, görüntüleme ve çıkış desteği ekler.
Yerelleştirme, yerelleştirme için işledikten sonra genelleştirilmiş bir uygulamayı belirli bir kültüre/yerele uyarlama işlemidir. Daha fazla bilgi için bu belgenin sonuna yakın genelleştirme ve yerelleştirme terimlerine bakın.
Uygulama yerelleştirmesi şunları içerir:
- Uygulamanın içeriğini yerelleştirilebilir yapma
- Desteklenen diller ve kültürler için yerelleştirilmiş kaynaklar sağlama
- Her istek için dil/kültür seçmek için bir strateji uygulama
Örnek kodu görüntüleme veya indirme ( nasılindir)
Uygulamanın içeriğini yerelleştirilebilir yapma
IStringLocalizer ve IStringLocalizer<T> yerelleştirilmiş uygulamalar geliştirerek üretkenliği artırmak için mimari haline getirildi. IStringLocalizer çalışma zamanında ResourceManager ResourceReader kültüre özgü kaynaklar sağlamak için ve kullanır. Arabirimin bir dizine ve yerelleştirilmiş IEnumerable dizeleri döndüren bir'e sahiptir. IStringLocalizer varsayılan dil dizelerinin bir kaynak dosyasında depolanmasına gerek yoktur. Yerelleştirme için hedeflenen bir uygulama geliştirebilirsiniz ve geliştirmenin erken bir aşamasında kaynak dosyaları oluşturmanıza gerek olmaz. Aşağıdaki kod, yerelleştirme için "Başlık Hakkında" dizesini sarmalamayı gösterir.
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
namespace Localization.Controllers
{
[Route("api/[controller]")]
public class AboutController : Controller
{
private readonly IStringLocalizer<AboutController> _localizer;
public AboutController(IStringLocalizer<AboutController> localizer)
{
_localizer = localizer;
}
[HttpGet]
public string Get()
{
return _localizer["About Title"];
}
}
}
Yukarıdaki kodda, uygulama IStringLocalizer<T> Bağımlılık Ekleme'den gelir. Yerelleştirilmiş "Başlık Hakkında" değeri bulunamazsa dizin oluşturma anahtarı döndürülür, yani "Başlık Hakkında" dizesi döndürülür. Varsayılan dil değişmez değer dizelerini uygulamada bırakıp yerelleştiricide sarmalar, böylece uygulamayı geliştirmeye odaklanabilirsiniz. Varsayılan diliniz ile uygulama geliştirin ve önce varsayılan bir kaynak dosyası oluşturmadan yerelleştirme adımına hazırlayın. Alternatif olarak, geleneksel yaklaşımı kullanabilir ve varsayılan dil dizesini almak için bir anahtar suşuna sahip oluruz. Birçok geliştirici için yeni iş akışı varsayılan dil .resx dosyasına sahip değil ve yalnızca dize değişmez değerleri sarmalama bir uygulama yerelleştirme ek yükünü azaltabilirsiniz. Diğer geliştiriciler, daha uzun dize değişmez değeriyle çalışma ve yerelleştirilmiş dizeleri güncelleştirmeyi kolaylaştırma gibi geleneksel iş akışını tercih eder.
HTML IHtmlLocalizer<T> içeren kaynaklar için uygulamasını kullanın. IHtmlLocalizer HTML, kaynak dizesinde biçimlendirilmiş bağımsız değişkenleri kodlar, ancak HTML kaynak dizesini kodlamaz. Aşağıda vurgulanan örnekte yalnızca parametresinin name değeri HTML ile kodlanmıştır.
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Localization;
namespace Localization.Controllers
{
public class BookController : Controller
{
private readonly IHtmlLocalizer<BookController> _localizer;
public BookController(IHtmlLocalizer<BookController> localizer)
{
_localizer = localizer;
}
public IActionResult Hello(string name)
{
ViewData["Message"] = _localizer["<b>Hello</b><i> {0}</i>", name];
return View();
}
Not
Genellikle, HTML değil yalnızca metni yerelleştirin.
En düşük düzeyde, Bağımlılık IStringLocalizerFactory Ekleme'den çıkar:
{
public class TestController : Controller
{
private readonly IStringLocalizer _localizer;
private readonly IStringLocalizer _localizer2;
public TestController(IStringLocalizerFactory factory)
{
var type = typeof(SharedResource);
var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
_localizer = factory.Create(type);
_localizer2 = factory.Create("SharedResource", assemblyName.Name);
}
public IActionResult About()
{
ViewData["Message"] = _localizer["Your application description page."]
+ " loc 2: " + _localizer2["Your application description page."];
Yukarıdaki kod, iki fabrika oluşturma yönteminin her birini gösteriyor.
Yerelleştirilmiş dizelerinizi denetleyiciye, alana göre bölümleme veya yalnızca bir kapsayıcıya sahip olabilirsiniz. Örnek uygulamada, paylaşılan kaynaklar için adlı bir SharedResource sahte sınıf kullanılır.
// Dummy class to group shared resources
namespace Localization
{
public class SharedResource
{
}
}
Bazı geliştiriciler genel veya Startup paylaşılan dizeler içermek için sınıfını kullanır. Aşağıdaki örnekte ve InfoController SharedResource yerelleştiricileri kullanılır:
public class InfoController : Controller
{
private readonly IStringLocalizer<InfoController> _localizer;
private readonly IStringLocalizer<SharedResource> _sharedLocalizer;
public InfoController(IStringLocalizer<InfoController> localizer,
IStringLocalizer<SharedResource> sharedLocalizer)
{
_localizer = localizer;
_sharedLocalizer = sharedLocalizer;
}
public string TestLoc()
{
string msg = "Shared resx: " + _sharedLocalizer["Hello!"] +
" Info resx " + _localizer["Hello!"];
return msg;
}
Yerelleştirmeyi görüntüleme
Hizmet, IViewLocalizer görünümü için yerelleştirilmiş dizeler sağlar. sınıfı ViewLocalizer bu arabirimi uygulayan ve görünüm dosya yolundan kaynak konumunu bulur. Aşağıdaki kod, varsayılan uygulamasının nasıl kullanılalı olduğunu IViewLocalizer gösterir:
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = Localizer["About"];
}
<h2>@ViewData["Title"].</h2>
<h3>@ViewData["Message"]</h3>
<p>@Localizer["Use this area to provide additional information."]</p>
varsayılan IViewLocalizer uygulaması, görünümün dosya adına göre kaynak dosyasını bulur. Genel paylaşılan kaynak dosyası kullanma seçeneği yoktur. ViewLocalizer kullanarak yerelleştiriciyi uygulamaya IHtmlLocalizer alır, Razor bu nedenle HTML yerelleştirilmiş dizeyi kodlamaz. Kaynak dizelerini parametreleştirebilirsiniz IViewLocalizer ve HTML parametreleri kodlar, ancak kaynak dizesini kodlamaz. Aşağıdaki işaretlemeyi Razor göz önünde önünde yapın:
@Localizer["<i>Hello</i> <b>{0}!</b>", UserManager.GetUserName(User)]
Bir Fransızca kaynak dosyası şunları içerebilir:
| Anahtar | Değer |
|---|---|
<i>Hello</i> <b>{0}!</b> |
<i>Bonjour</i> <b>{0} !</b> |
İşlenen görünüm, kaynak dosyasındaki HTML işaretlemesini içerir.
Not
Genellikle, HTML değil yalnızca metni yerelleştirin.
Bir görünümde paylaşılan kaynak dosyası kullanmak için, IHtmlLocalizer<T> ekleme:
@using Microsoft.AspNetCore.Mvc.Localization
@using Localization.Services
@inject IViewLocalizer Localizer
@inject IHtmlLocalizer<SharedResource> SharedLocalizer
@{
ViewData["Title"] = Localizer["About"];
}
<h2>@ViewData["Title"].</h2>
<h1>@SharedLocalizer["Hello!"]</h1>
DataAnnotations yerelleştirmesi
DataAnnotations hata iletileri ile IStringLocalizer<T> yerelleştirilmiştir. seçeneği ResourcesPath = "Resources" kullanılarak, 'daki hata RegisterViewModel iletileri aşağıdaki yollardan herhangi biri içinde depolanmış olabilir:
- Resources/ViewModels.Account.RegisterViewModel.fr.resx
- Resources/ViewModels/Account/RegisterViewModel.fr.resx
public class RegisterViewModel
{
[Required(ErrorMessage = "The Email field is required.")]
[EmailAddress(ErrorMessage = "The Email field is not a valid email address.")]
[Display(Name = "Email")]
public string Email { get; set; }
[Required(ErrorMessage = "The Password field is required.")]
[StringLength(8, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
MVC ASP.NET Core 1.1.0 ve üzerinde doğrulama olmayan öznitelikler yerelleştirilmiştir. ASP.NET Core MVC 1.0, doğrulama olmayan öznitelikler için yerelleştirilmiş dizeleri aramaz.
Birden çok sınıf için bir kaynak dizesi kullanma
Aşağıdaki kod, birden çok sınıfa sahip doğrulama öznitelikleri için bir kaynak dizesinin nasıl kullanıla bir olduğunu gösterir:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddDataAnnotationsLocalization(options => {
options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(SharedResource));
});
}
Yukarıdaki kodda, SharedResource doğrulama iletilerinizin depolandığı resx'e karşılık gelen sınıftır. Bu yaklaşımda, DataAnnotations her sınıf için SharedResource kaynak yerine yalnızca kullanır.
Desteklenen diller ve kültürler için yerelleştirilmiş kaynaklar sağlama
SupportedCultures ve SupportedUICultures
ASP.NET Core iki kültür değeri belirtmenize olanak SupportedCultures sağlar: ve SupportedUICultures . için CultureInfo nesnesi tarih, saat, sayı ve para birimi biçimlendirmesi gibi kültüre bağlı SupportedCultures işlevlerin sonuçlarını belirler. SupportedCultures ayrıca metin sıralama sıralama sıralamasını, büyük/sn kuralları ve dize karşılaştırmalarını da belirler. Sunucunun Kültürü nasıl alan hakkında daha fazla bilgi için bkz. CultureInfo.CurrentCulture. , SupportedUICultures hangi çevrilen dizelerin (.resx dosyalarından) ResourceManager tarafından arama olduğunu belirler. , ResourceManager tarafından belirlenen kültüre özgü dizeleri aramadır. CurrentUICulture .NET'te her iş parçacığında CurrentCulture ve nesneleri CurrentUICulture vardır. ASP.NET Core, kültüre bağımlı işlevleri işleme sırasında bu değerleri inceler. Örneğin, geçerli iş parçacığının kültürü "en-US" (İngilizce, Birleşik Devletler) olarak ayarlanırsa DateTime.Now.ToLongDateString() " Thursday, Şubat 18, 2016" görüntülenir, ancak CurrentCulture "es-ES" (İspanyolca, İspanya) olarak ayarlanırsa çıkış "jueves, 18 de febrero de 2016" olur.
Kaynak dosyalar
Kaynak dosyası, yerelleştirilebilir dizeleri koddan ayırmak için kullanışlı bir mekanizmadır. Varsayılan olmayan dil için çevrilmiş dizeler .resx kaynak dosyalarında yalıtılmıştır. Örneğin, çevrilmiş dizeleri içeren Welcome.es.resx adlı İspanyolca kaynak dosyası oluşturmak istiyor olabilir. "es", İspanyolca dil kodudur. Bu kaynak dosyasını Visual Studio:
Bu Çözüm Gezgini, Yeni Öğe Ekle'nin kaynak dosyasını > > klasöre sağ tıklayın.

Yüklü şablonları ara kutusuna "resource" yazın ve dosyayı bir ad olarak girin.

Name sütununa anahtar değerini (yerel dize) ve Value sütununa çevrilmiş dizeyi girin.

Visual Studio Welcome.es.resx dosyasını gösterir.

Kaynak dosyası adlandırma
Kaynaklar, sınıflarının tam tür adı için derleme adını eksi olarak adlandırılmıştır. Örneğin, ana derlemesi sınıfına ait olan bir proje içinde Bulunan Fransızca LocalizationWebsite.Web.dll kaynak LocalizationWebsite.Web.Startup Startup.fr.resx olarak adlandırılmıştır. sınıf için bir kaynak LocalizationWebsite.Web.Controllers.HomeController Controllers olarak adlandırılmıştır. Home Controller.fr.resx. Hedeflenen sınıfın ad alanı derleme adıyla aynı değilse tam tür adına ihtiyacınız olacaktır. Örneğin, örnek projesinde türü için bir kaynak ExtraNamespace.Tools ExtraNamespace.Tools.fr.resx olarak adlandırılmıştır.
Örnek projede yöntemi , "Kaynaklar" olarak ayarlar, bu nedenle ana denetleyicinin Fransızca kaynak dosyasının proje göreli yolu ConfigureServices ResourcesPath Kaynaklar/Denetleyiciler'tir. Home Controller.fr.resx. Alternatif olarak, kaynak dosyalarını düzenlemek için klasörleri kullanabilirsiniz. Giriş denetleyicisi için yol Resources/Controllers/ Home Controller.fr.resx olur. seçeneğini ResourcesPath kullanamıyorsanız.resx dosyası proje temel dizinine gider. için kaynak dosyası HomeController Controllers olarak adlandırılmıştır. Home Controller.fr.resx. Nokta veya yol adlandırma kuralını kullanma seçimi, kaynak dosyalarınızı nasıl düzenlemek istediğinize bağlıdır.
| Kaynak adı | Nokta veya yol adlandırma |
|---|---|
| Kaynaklar/Denetleyiciler. Home Controller.fr.resx | Nokta |
| Kaynaklar/Denetleyiciler/ Home Controller.fr.resx | Yol |
Görünümlerde kullanan @inject IViewLocalizer kaynak dosyaları benzer bir Razor desene sahiptir. Bir görünümün kaynak dosyası, nokta adlandırma veya yol adlandırması kullanılarak adlandırabilirsiniz. Razor kaynak dosyalarını görüntüleme, ilişkili görünüm dosyalarının yolunu taklit ediyor. 'yi ResourcesPath "Kaynaklar" olarak ayarlaysak, Views/ Home /About.cshtml görünümüyle ilişkili Fransızca kaynak dosyası aşağıdakilerden biri olabilir:
Kaynaklar/Görünümler/ Home /About.fr.resx
Kaynaklar/Görünümler. Home . About.fr.resx
seçeneğini kullanamıyorsanız, bir görünümün ResourcesPath .resx dosyası görünümle aynı klasörde bulunur.
Rootnamespaceattribute
Özniteliği, RootNamespaceAttribute bir derlemenin kök ad alanı derlemenin adı farklı olduğunda bir derlemenin kök ad alanını sağlar.
Uyarı
Bir projenin adı geçerli bir .NET tanımlayıcısı değilse bu durum oluşabilir. Örneğin, my-project-name.csproj kök ad alanını ve bu my_project_name hataya neden olan derleme adını my-project-name kullanır.
Bir derlemenin kök ad alanı derlemenin adıyla farklı ise:
- Yerelleştirme varsayılan olarak çalışmıyor.
- Derleme içinde kaynakların aranma yolu nedeniyle yerelleştirme başarısız oluyor.
RootNamespace, yürütme işlemi için kullanılabilir olmayan bir derleme zamanı değeridir.
, RootNamespace parametresinden farklı AssemblyName ise, AssemblyInfo.cs dosyasına aşağıdakileri dahil eder (parametre değerleri gerçek değerlerle değiştirilir):
using System.Reflection;
using Microsoft.Extensions.Localization;
[assembly: ResourceLocation("Resource Folder Name")]
[assembly: RootNamespace("App Root Namespace")]
Yukarıdaki kod resx dosyalarının başarılı bir şekilde çözümlenene kadar devam ediyor.
Kültür geri dönüş davranışı
Bir kaynağı ararken, yerelleştirme "kültür geri dönüş" ile etkileşime olur. İstenen kültürden başlayarak, bulunamıyorsa bu kültürün üst kültürüne geri döner. CultureInfo.Parent özelliği de üst kültürü temsil eder. Bu genellikle (ancak her zaman değil) ulusal imzalayıcının ISO'dan kaldırılması anlamına gelir. Örneğin Meksika'da konuşulan İspanyolca diyalekti "es-MX" şeklindedir. Herhangi bir ülkeye özgü olmayan üst "es" — İspanyolca'ya sahip.
Imagine "fr-CA" kültürü kullanılarak "Hoş Geldiniz" kaynağı için bir istek alır. Yerelleştirme sistemi sırayla aşağıdaki kaynakları seçer ve ilk eşleşmeyi seçer:
- Welcome.fr-CA.resx
- Welcome.fr.resx
- Welcome.resx
NeutralResourcesLanguage("fr-CA" ise)
Örneğin, ".fr" kültür atamayı kaldırırsanız ve kültürü Fransızca olarak ayarlarsanız varsayılan kaynak dosyası okunur ve dizeler yerelleştirilmiş olur. Resource Manager, isteğiniz kültüre uygun bir şey yoksa için varsayılan veya geri dönüş kaynağı gösterir. İstenen kültür için bir kaynak eksik olduğunda anahtarı yalnızca geri almak için varsayılan kaynak dosyanız olması gerekir.
Kaynak dosyaları oluşturma ve Visual Studio
dosya adı içinde bir Visual Studio dosyası (örneğin, Welcome.resx) olmadan bir kaynak dosyası oluşturmanız Visual Studio her dize için bir özelliği olan bir C# sınıfı oluşturacağız. Bu durum genellikle bu şekilde ASP.NET Core. Genellikle varsayılan bir .resx kaynak dosyanız (kültür adı olmayan bir .resx dosyası) olmaz. .resx dosyasını bir kültür adıyla (örneğin, Welcome.fr.resx) oluşturmanızı öneririz. Kültür adıyla bir .resx dosyası sanız Visual Studio sınıf dosyası oluşturulmaz.
Diğer kültürleri ekleme
Her dil ve kültür birleşimi (varsayılan dil dışında) benzersiz bir kaynak dosyası gerektirir. ISO dil kodlarının dosya adının parçası olduğu (örneğin, en-us, fr-ca ve en-gb) yeni kaynak dosyaları oluşturarak farklı kültürler ve yereller için kaynak dosyaları oluşturabilirsiniz. Bu ISO kodları, Welcome.es-MX.resx (İspanyolca/Meksika) gibi dosya adı ve .resx dosya uzantısı arasına yerleştirilir.
Her istek için dil/kültür seçmek için bir strateji uygulama
Yerelleştirmeyi yapılandırma
Yerelleştirme yönteminde Startup.ConfigureServices yapılandırılır:
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
AddLocalization, yerelleştirme hizmetlerini hizmetler kapsayıcıya ekler. Yukarıdaki kod ayrıca kaynak yolunu "Kaynaklar" olarak ayarlar.AddViewLocalizationyerelleştirilmiş görünüm dosyaları için destek ekler. Bu örnek görünümde yerelleştirme, dosya görüntüleme son eklerini temel alır. Örneğin Index.fr.cshtml dosyasındaki "fr".AddDataAnnotationsLocalizationsoyutlamalar aracılığıylaDataAnnotationsyerelleştirilmiş doğrulama iletileriIStringLocalizeriçin destek ekler.
Yerelleştirme ara yazılımı
Bir istekte geçerli kültür, yerelleştirme Ara Yazılımı'nde ayarlanır. Yerelleştirme ara yazılımı yönteminde Startup.Configure etkindir. Yerelleştirme ara yazılımı, istek kültürünü (örneğin, ) kontrol edecek herhangi bir ara yazılımdan önce app.UseMvcWithDefaultRoute() yapılandırıldı.
var supportedCultures = new[] { "en-US", "fr" };
var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
Ingilizce dışındaki dillere çevrilmiş kod açıklamalarını görmek isterseniz, Bu GitHub tartışma sorununubize tanıyın.
UseRequestLocalization bir nesnesi RequestLocalizationOptions başlatıyor. Her istekte içinde listesi numaralandı ve istek kültürünü başarıyla RequestCultureProvider RequestLocalizationOptions belirleyen ilk sağlayıcı kullanılır. Varsayılan sağlayıcılar sınıfından RequestLocalizationOptions gelir:
QueryStringRequestCultureProviderCookieRequestCultureProviderAcceptLanguageHeaderRequestCultureProvider
Varsayılan liste en özelden en az belirliye doğru gider. Makalenin devamlarında, siparişi nasıl değiştirebilirsiniz, hatta özel bir kültür sağlayıcısı nasıl ekleyebilirsiniz göreceğiz. Sağlayıcılardan hiçbiri istek kültürünü belirleyene kadar DefaultRequestCulture kullanılır.
QueryStringRequestCultureProvider
Bazı uygulamalar, 'i ayarlamak için bir sorgu dizesi CultureInfo kullanır. veya üst bilgi yaklaşımını Accept-Language uygulamalar için URL'ye bir sorgu dizesi eklemek, kodda hata cookie ayıklama ve test etme için yararlıdır. Varsayılan olarak, QueryStringRequestCultureProvider listesinde ilk yerelleştirme sağlayıcısı olarak RequestCultureProvider kaydedilir. Sorgu dizesi parametrelerini ve ile ile birlikte culture ui-culture iletirsiniz. Aşağıdaki örnek, belirli bir kültürü (dil ve bölge) İspanyolca/Meksika olarak ayarlar:
http://localhost:5000/?culture=es-MX&ui-culture=es-MX
Yalnızca ikiden birini ( veya ) iletirsiniz, sorgu dizesi sağlayıcısı her culture iki değeri de geçirilen değeri kullanarak ui-culture ayarlar. Örneğin, yalnızca kültürü ayarlamak hem hem de Culture 'i UICulture ayarlar:
http://localhost:5000/?culture=es-MX
CookieRequestCultureProvider
Üretim uygulamaları genellikle kültür ile kültür ayarlamak için bir mekanizma ASP.NET Core cookie sağlar. oluşturmak MakeCookieValue için yöntemini cookie kullanın.
CookieRequestCultureProvider DefaultCookieName , kullanıcının tercih ettiği kültür bilgilerini izlemek cookie için kullanılan varsayılan adı döndürür. Varsayılan cookie ad: .AspNetCore.Culture .
cookie c=%LANGCODE%|uic=%LANGCODE% biçimidir, burada ve c Culture uic UICulture olur, örneğin:
c=en-UK|uic=en-US
Yalnızca bir kültür bilgisi ve kullanıcı arabirimi kültürü belirtirsiniz, belirtilen kültür hem kültür bilgisi hem de kullanıcı arabirimi kültürü için kullanılır.
Accept-Language HTTP üst bilgisi
Accept-Language üst bilgisi çoğu tarayıcıda ayarlanamayan bir üst bilgidir ve başlangıçta kullanıcının dilini belirtmek için tasarlanmıştır. Bu ayar, tarayıcının neleri göndermek için ayar yaptığını veya temel işletim sisteminden devralınmış olduğunu gösterir. Tarayıcı Accept-Language http üst bilgisi, kullanıcının tercih ettiği dili algılamanın kolay bir yolu değildir (bkz. Tarayıcıda dil tercihlerini ayarlama). Üretim uygulaması, kullanıcının kendi kültür tercihlerini özelleştirmesi için bir yol içermesi gerekir.
IE'Accept-Language HTTP üst bilgilerini ayarlama
Dişli simgesinden İnternet Seçenekleri'ne dokunun.
Diller'e dokunun.

Dil Tercihlerini Ayarla'ya dokunun.
Dil ekle'ye dokunun.
Dili ekleyin.
Dile dokunun ve ardından Yukarı Taşı'ya dokunun.
Content-Language HTTP üst bilgisi
Content-Language varlık üst bilgisi:
- Hedef kitleye yönelik dilleri tanımlamak için kullanılır.
- Bir kullanıcının kullanıcıların tercih ettiği dile göre ayırt ettiğine izin verir.
Varlık üst bilgileri hem HTTP isteklerinde hem de yanıtlarında kullanılır.
üst Content-Language bilgisi özelliği ayar tarafından ApplyCurrentCultureToResponseHeaders eklenebilir.
Üst bilgi Content-Language ekleme:
- RequestLocalizationMiware'in üst bilgisi ile
Content-Languageayarlaması için izinCurrentUICultureverir. - Yanıt üst bilgisini açıkça ayarlama ihtiyacı
Content-Languageortadan kaldırıyor.
app.UseRequestLocalization(new RequestLocalizationOptions
{
ApplyCurrentCultureToResponseHeaders = true
});
Özel sağlayıcı kullanma
Müşterilerin dillerini ve kültürlerini veritabanlarında depolamasına izin vermenizi istediğinizi varsayalım. Kullanıcı için bu değerleri araması için bir sağlayıcı yazabilirsiniz. Aşağıdaki kodda özel sağlayıcının nasıl ekli olduğu gösterir:
private const string enUSCulture = "en-US";
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo(enUSCulture),
new CultureInfo("fr")
};
options.DefaultRequestCulture = new RequestCulture(culture: enUSCulture, uiCulture: enUSCulture);
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
// My custom request culture logic
return new ProviderCultureResult("en");
}));
});
Yerelleştirme RequestLocalizationOptions sağlayıcılarını eklemek veya kaldırmak için kullanın.
Kültürü program aracılığıyla ayarlama
Bu örnek Yerelleştirme.StarterWeb projesi GitHub için kullanıcı arabirimi Culture içerir. Views/Shared/_SelectLanguagePartial.cshtml dosyası, desteklenen kültürler listesinden kültürü seçmenize olanak sağlar:
@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options
@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions
@{
var requestCulture = Context.Features.Get<IRequestCultureFeature>();
var cultureItems = LocOptions.Value.SupportedUICultures
.Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
.ToList();
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
}
<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
<form id="selectLanguage" asp-controller="Home"
asp-action="SetLanguage" asp-route-returnUrl="@returnUrl"
method="post" class="form-horizontal" role="form">
<label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> <select name="culture"
onchange="this.form.submit();"
asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
</select>
</form>
</div>
Görünümler/Paylaşılan/_SelectLanguagePartial.cshtml dosyası düzen dosyasının bölümüne eklenir, böylece footer tüm görünümler tarafından kullanılabilir:
<div class="container body-content" style="margin-top:60px">
@RenderBody()
<hr>
<footer>
<div class="row">
<div class="col-md-6">
<p>© @System.DateTime.Now.Year - Localization</p>
</div>
<div class="col-md-6 text-right">
@await Html.PartialAsync("_SelectLanguagePartial")
</div>
</div>
</footer>
</div>
yöntemi, SetLanguage kültürünü cookie ayarlar.
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}
Bu proje için örnek koda _SelectLanguagePartial.cshtml dosyasını takabilirsiniz. GitHub üzerinde Localization.StarterWeb projesinin, Bağımlılık Ekleme kapsayıcısı aracılığıyla 'i kısmi akışa RequestLocalizationOptions Razor akan kodu vardır.
Model bağlama yönlendirme verileri ve sorgu dizeleri
Bkz. Model bağlama yol verileri ve sorgu dizelerinin genelleştirme davranışı.
Genelleştirme ve yerelleştirme terimleri
Ayrıca, uygulamanızı yerelleştirme işlemi, modern yazılım geliştirmede yaygın olarak kullanılan ilgili karakter kümelerini temel olarak anlamanızı ve onlarla ilişkili sorunları anlamanızı gerektirir. Tüm bilgisayarlar metinleri sayı (kodlar) olarak depolasa da, farklı sistemler farklı sayılar kullanarak aynı metni depolar. Yerelleştirme işlemi, belirli bir kültür/yerel değer için uygulama kullanıcı arabirimini (UI) çeviriyi ifade eder.
Yerelleştirme, genelleştirilmiş bir uygulamanın yerelleştirme için hazır olduğunu doğrulamak için bir ara işlemdir.
Kültür adı için RFC 4646 biçimi, dil <languagecode2>-<country/regioncode2> kodu ve alt kültür <languagecode2> <country/regioncode2> kodudur. Örneğin İspanyolca es-CL (İspanyolca), İngilizce en-US (Birleşik Devletler) ve İngilizce en-AU (Avustralya) için. RFC 4646, bir dille ilişkili ISO 639 iki harfli küçük harfli kültür kodunun ve bir ülke veya bölgeyle ilişkili ISO 3166 iki harfli büyük harfli alt kültür kodunun birleşimidir. Daha fazla bilgi için bkz. System.Globalization.CultureInfo.
Uluslararasıleştirme genellikle "I18N" olarak kısaltıldı. Kısaltma ilk ve son harfleri ve aralarındaki harf sayısını alır, dolayısıyla 18, ilk "I" ile son "N" arasındaki harf sayısını ifade ediyor. Aynı durum Genelleştirme (G11N) ve Yerelleştirme (L10N) için de geçerlidir.
Terim:
- Genelleştirme (G11N): Bir uygulamayı farklı dilleri ve bölgeleri destekleme işlemi.
- Yerelleştirme (L10N): Bir uygulamayı verilen dil ve bölge için özelleştirme işlemi.
- Uluslararasılaştırma (I18N): Hem genelleştirmeyi hem de yerelleştirmeyi açıklar.
- Kültür: Bu bir dil ve isteğe bağlı olarak bir bölgedir.
- Nötr kültür: Belirli bir dile sahip olan ancak bölgeye sahip olan bir kültür değildir. (örneğin"en", "es")
- Belirli bir kültür: Belirtilen dile ve bölgeye sahip bir kültür. (örneğin, "en-US", "en-GB", "es-CL")
- Üst kültür: Belirli bir kültürü içeren nötr kültür. (örneğin, "en", "en-US" ve "en-GB" üst kültürüdür")
- Yerel: Yerel bir yerel, kültürle aynıdır.
Not
Ondalık alanlara ondalık virgüller giremeyebilirsiniz. Ondalık bir nokta ve US-English tarih biçimleri için virgül (",") kullanan Ingilizce olmayan yerel ayarlarda jQuery doğrulamasını desteklemek için, uygulamanızı globalize için adımlar uygulamanız gerekir. Ondalık virgülden ekleme hakkında yönergeler için bkz. GitHub sorunu 4076 .
Not
Core 3.0 web ASP.NET önce, istenen kültür desteklenmiyorsa istek başına LogLevel.Warning türünde bir günlük yazar. İstek başına LogLevel.Warning bir günlük kaydı, yedekli bilgilerle büyük günlük dosyalarına neden olabilir. Bu davranış 3.0 ASP.NET değiştirilmiştir. RequestLocalizationMiddleware, üretim günlüklerinin boyutunu LogLevel.Debug azaltan türünde bir günlük yazar.
Ek kaynaklar
Rick Anderson ,Life Bowden, Bart Bartxto, Nadeem Afanave Hisham Bin Bartya
Çok dilli bir web sitesi, sitenin daha geniş bir kitleye ulaştırmalarını sağlar. ASP.NET Core dillere ve kültürlere yerelleştirme için hizmetler ve ara yazılım sağlar.
Uluslararasılaştırma, Genelleştirme ve Yerelleştirmeyi içerir. Genelleştirme, farklı kültürleri destekleyen uygulamalar tasarlama işlemidir. Genelleştirme, belirli coğrafi alanlara yönelik tanımlı bir dil betikleri kümesi giriş, görüntüleme ve çıkış desteği ekler.
Yerelleştirme, yerelleştirme için işledikten sonra genelleştirilmiş bir uygulamayı belirli bir kültüre/yerele uyarlama işlemidir. Daha fazla bilgi için bu belgenin sonuna yakın genelleştirme ve yerelleştirme terimlerine bakın.
Uygulama yerelleştirmesi şunları içerir:
- Uygulamanın içeriğini yerelleştirilebilir yapma
- Desteklenen diller ve kültürler için yerelleştirilmiş kaynaklar sağlama
- Her istek için dil/kültür seçmek için bir strateji uygulama
Örnek kodu görüntüleme veya indirme ( nasılindir)
Uygulama içeriğini yerelleştirilebilir yapma
IStringLocalizer ve IStringLocalizer<T> yerelleştirilmiş uygulamalar geliştirerek üretkenliği artırmak için mimari haline getirildi. IStringLocalizer çalışma zamanında ResourceManager ResourceReader kültüre özgü kaynaklar sağlamak için ve kullanır. Arabirimin bir dizine ve yerelleştirilmiş IEnumerable dizeleri döndüren bir'e sahiptir. IStringLocalizer varsayılan dil dizelerinin bir kaynak dosyasında depolanmasına gerek yoktur. Yerelleştirme için hedeflenen bir uygulama geliştirebilirsiniz ve geliştirmenin erken bir aşamasında kaynak dosyaları oluşturmanıza gerek olmaz. Aşağıdaki kod, yerelleştirme için "Başlık Hakkında" dizesini sarmalamayı gösterir.
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
namespace Localization.Controllers
{
[Route("api/[controller]")]
public class AboutController : Controller
{
private readonly IStringLocalizer<AboutController> _localizer;
public AboutController(IStringLocalizer<AboutController> localizer)
{
_localizer = localizer;
}
[HttpGet]
public string Get()
{
return _localizer["About Title"];
}
}
}
Yukarıdaki kodda, uygulama IStringLocalizer<T> Bağımlılık Ekleme'den gelir. Yerelleştirilmiş "Başlık Hakkında" değeri bulunamazsa dizin oluşturma anahtarı döndürülür, yani "Başlık Hakkında" dizesi döndürülür. Varsayılan dil değişmez değer dizelerini uygulamada bırakıp yerelleştiricide sarmalar, böylece uygulamayı geliştirmeye odaklanabilirsiniz. Varsayılan diliniz ile uygulama geliştirin ve önce varsayılan bir kaynak dosyası oluşturmadan yerelleştirme adımına hazırlayın. Alternatif olarak, geleneksel yaklaşımı kullanabilir ve varsayılan dil dizesini almak için bir anahtar suşuna sahip oluruz. Birçok geliştirici için yeni iş akışı varsayılan dil .resx dosyasına sahip değil ve yalnızca dize değişmez değerleri sarmalama bir uygulama yerelleştirme ek yükünü azaltabilirsiniz. Diğer geliştiriciler, daha uzun dize değişmez değeriyle çalışma ve yerelleştirilmiş dizeleri güncelleştirmeyi kolaylaştırma gibi geleneksel iş akışını tercih eder.
HTML IHtmlLocalizer<T> içeren kaynaklar için uygulamasını kullanın. IHtmlLocalizer HTML, kaynak dizesinde biçimlendirilmiş bağımsız değişkenleri kodlar, ancak HTML kaynak dizesini kodlamaz. Aşağıda vurgulanan örnekte yalnızca parametresinin name değeri HTML ile kodlanmıştır.
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Localization;
namespace Localization.Controllers
{
public class BookController : Controller
{
private readonly IHtmlLocalizer<BookController> _localizer;
public BookController(IHtmlLocalizer<BookController> localizer)
{
_localizer = localizer;
}
public IActionResult Hello(string name)
{
ViewData["Message"] = _localizer["<b>Hello</b><i> {0}</i>", name];
return View();
}
Not
Genellikle, HTML değil yalnızca metni yerelleştirin.
En düşük düzeyde, Bağımlılık IStringLocalizerFactory Ekleme'den çıkar:
{
public class TestController : Controller
{
private readonly IStringLocalizer _localizer;
private readonly IStringLocalizer _localizer2;
public TestController(IStringLocalizerFactory factory)
{
var type = typeof(SharedResource);
var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
_localizer = factory.Create(type);
_localizer2 = factory.Create("SharedResource", assemblyName.Name);
}
public IActionResult About()
{
ViewData["Message"] = _localizer["Your application description page."]
+ " loc 2: " + _localizer2["Your application description page."];
Yukarıdaki kod, iki fabrika oluşturma yönteminin her birini gösteriyor.
Yerelleştirilmiş dizelerinizi denetleyiciye, alana göre bölümleme veya yalnızca bir kapsayıcıya sahip olabilirsiniz. Örnek uygulamada, paylaşılan kaynaklar için adlı bir SharedResource sahte sınıf kullanılır.
// Dummy class to group shared resources
namespace Localization
{
public class SharedResource
{
}
}
Bazı geliştiriciler genel veya Startup paylaşılan dizeler içermek için sınıfını kullanır. Aşağıdaki örnekte ve InfoController SharedResource yerelleştiricileri kullanılır:
public class InfoController : Controller
{
private readonly IStringLocalizer<InfoController> _localizer;
private readonly IStringLocalizer<SharedResource> _sharedLocalizer;
public InfoController(IStringLocalizer<InfoController> localizer,
IStringLocalizer<SharedResource> sharedLocalizer)
{
_localizer = localizer;
_sharedLocalizer = sharedLocalizer;
}
public string TestLoc()
{
string msg = "Shared resx: " + _sharedLocalizer["Hello!"] +
" Info resx " + _localizer["Hello!"];
return msg;
}
Yerelleştirmeyi görüntüleme
Hizmet, IViewLocalizer görünümü için yerelleştirilmiş dizeler sağlar. sınıfı ViewLocalizer bu arabirimi uygulayan ve görünüm dosya yolundan kaynak konumunu bulur. Aşağıdaki kod, varsayılan uygulamasının nasıl kullanılalı olduğunu IViewLocalizer gösterir:
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = Localizer["About"];
}
<h2>@ViewData["Title"].</h2>
<h3>@ViewData["Message"]</h3>
<p>@Localizer["Use this area to provide additional information."]</p>
varsayılan IViewLocalizer uygulaması, görünümün dosya adına göre kaynak dosyasını bulur. Genel paylaşılan kaynak dosyası kullanma seçeneği yoktur. ViewLocalizer kullanarak yerelleştiriciyi uygulamaya IHtmlLocalizer alır, Razor bu nedenle HTML yerelleştirilmiş dizeyi kodlamaz. Kaynak dizelerini parametreleştirebilirsiniz IViewLocalizer ve HTML parametreleri kodlar, ancak kaynak dizesini kodlamaz. Aşağıdaki işaretlemeyi Razor göz önünde önünde yapın:
@Localizer["<i>Hello</i> <b>{0}!</b>", UserManager.GetUserName(User)]
Bir Fransızca kaynak dosyası şunları içerebilir:
| Anahtar | Değer |
|---|---|
<i>Hello</i> <b>{0}!</b> |
<i>Bonjour</i> <b>{0} !</b> |
İşlenmiş görünüm, kaynak dosyasındaki HTML işaretlemesini içerir.
Not
Genellikle, HTML değil yalnızca metni yerelleştirin.
Bir görünümde paylaşılan kaynak dosyasını kullanmak için şunu ekleme IHtmlLocalizer<T> :
@using Microsoft.AspNetCore.Mvc.Localization
@using Localization.Services
@inject IViewLocalizer Localizer
@inject IHtmlLocalizer<SharedResource> SharedLocalizer
@{
ViewData["Title"] = Localizer["About"];
}
<h2>@ViewData["Title"].</h2>
<h1>@SharedLocalizer["Hello!"]</h1>
Dataaçıklamaların yerelleştirilmesi
Dataek açıklamalar hata iletileri ile yereldir IStringLocalizer<T> . Seçeneğini kullanarak ResourcesPath = "Resources" , içindeki hata iletileri RegisterViewModel aşağıdaki yollardan birinde depolanabilir:
- Resources/Viewmodeller. account. RegisterViewModel. fr. resx
- Kaynaklar/Viewmodeller/hesap/RegisterViewModel. fr. resx
public class RegisterViewModel
{
[Required(ErrorMessage = "The Email field is required.")]
[EmailAddress(ErrorMessage = "The Email field is not a valid email address.")]
[Display(Name = "Email")]
public string Email { get; set; }
[Required(ErrorMessage = "The Password field is required.")]
[StringLength(8, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
Doğrulama olmayan öznitelikler yereldir.
Birden çok sınıf için bir kaynak dizesi kullanma
Aşağıdaki kod, birden çok sınıfa sahip doğrulama öznitelikleri için bir kaynak dizesinin nasıl kullanılacağını gösterir:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddDataAnnotationsLocalization(options => {
options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(SharedResource));
});
}
Yukarıdaki kodda, SharedResource doğrulama iletilerinizin depolandığı resx öğesine karşılık gelen sınıftır. Bu yaklaşımda, veri açıklamaları yalnızca her bir SharedResource sınıf için kaynak yerine yalnızca kullanılır.
Destekettiğiniz diller ve kültürler için yerelleştirilmiş kaynaklar sağlayın
Supportedkültürleri ve SupportedUICultures
ASP.NET Core iki kültür değeri belirtmenize olanak tanır SupportedCultures SupportedUICultures . CultureInfoNesnesi, SupportedCultures Tarih, saat, sayı ve para birimi biçimlendirme gibi kültüre bağımlı işlevlerin sonuçlarını belirler. SupportedCultures Ayrıca metnin, büyük/küçük harf kurallarının ve dize karşılaştırmalarının sıralama sırasını belirler. Sunucunun kültürü nasıl aldığı hakkında daha fazla bilgi için bkz CultureInfo.CurrentCulture CultureInfo.CurrentUICulture . ve. , SupportedUICultures Tarafından hangi çevrilmiş dizelerin ( .resx dosyalarından) arandığını belirler ResourceManager . , ResourceManager Tarafından belirlenen kültüre özgü dizeleri arar CurrentUICulture . .NET 'teki her iş parçacığında CurrentCulture ve CurrentUICulture nesneler bulunur. Framework, kültüre bağımlı işlevleri işlerken bu değerleri inceler. Geçerli iş parçacığının kültürü en-US (İngilizce, Birleşik Devletler) olarak ayarlandıysa, DateTime.Now.ToLongDateString() görüntüler Thursday, February 18, 2016 ; ancak CurrentCulture es-ES (İspanyolca, İspanya) olarak ayarlandıysa çıkış olur jueves, 18 de febrero de 2016 .
Kaynak dosyalar
Kaynak dosyası, koddan yerelleştirilebilir dizeleri ayırmak için kullanışlı bir mekanizmadır. Varsayılan olmayan dil için çevrilmiş dizeler . resx kaynak dosyalarında yalıtılmıştır. Örneğin, çevrilmiş dizeleri içeren Welcome. es. resx adlı İspanyolca kaynak dosyası oluşturmak isteyebilirsiniz. "es", Ispanyolca için dil kodudur. Visual Studio içinde bu kaynak dosyasını oluşturmak için:
Çözüm Gezgini' de, > Yeni öğe Ekle > kaynak dosyasını içerecek klasöre sağ tıklayın.

Yüklü şablonları ara kutusuna "kaynak" yazın ve dosyayı adlandırın.

Ad sütununa anahtar değerini (yerel dize) ve değer sütununda çevrilmiş dizeyi girin.

Visual Studio, Welcome. es. resx dosyasını gösterir.

Kaynak dosyası adlandırma
Kaynaklar, sınıfının tam tür adı için derleme adı eksi olarak adlandırılır. Örneğin, ana derlemesi sınıf için olan bir projedeki bir Fransızca kaynak, LocalizationWebsite.Web.dll LocalizationWebsite.Web.Startup Startup. fr. resx olarak adlandırılır. Sınıf için bir kaynak, LocalizationWebsite.Web.Controllers.HomeController denetleyiciler olarak adlandırılır . Home Controller. fr. resx. Hedeflenen sınıfınızın ad alanı, derleme adı ile aynı değilse, tam tür adına ihtiyacınız olur. Örneğin, örnek projede, tür için bir kaynak ExtraNamespace.Tools ExtraNamespace. Tools. fr. resx olarak adlandırılır.
Örnek projede, ConfigureServices yöntemi ResourcesPath "resources" olarak ayarlıyor, bu nedenle ana denetleyicinin Fransızca kaynak dosyası için proje göreli yolu kaynaklar/denetleyiciler olur. Home Controller. fr. resx. Alternatif olarak, kaynak dosyalarını düzenlemek için klasörleri de kullanabilirsiniz. Ana denetleyici için yol kaynaklar/denetleyiciler/ Home Controller. fr. resx olacaktır. ResourcesPathSeçeneğini kullanmazsanız, . resx dosyası proje temel dizinine gidecek. İçin kaynak dosyası, HomeController denetleyiciler olarak adlandırılır . Home Controller. fr. resx. Nokta veya yol adlandırma kuralını kullanma seçeneği, kaynak dosyalarınızı nasıl düzenlemek istediğinize bağlıdır.
| Kaynak adı | Nokta veya yol adlandırma |
|---|---|
| Kaynaklar/denetleyiciler. Home Controller. fr. resx | Nokta |
| Kaynaklar/denetleyiciler/ Home Controller. fr. resx | Yol |
Görünümlerde kullanılan kaynak @inject IViewLocalizer dosyaları Razor benzer bir model izler. Bir görünüm için kaynak dosyası, nokta adlandırması veya yol adlandırması kullanılarak adlandırılabilir. Razor kaynak dosyalarını görüntüleme, ilişkili görünüm dosyalarının yolunu taklit eden. ResourcesPath"Resources" olarak belirlediğimiz varsayılarak, views/ Home /About.exe görünümü ile ilişkili Fransızca kaynak dosyası aşağıdakilerden biri olabilir:
Kaynaklar/Görünümler/ Home /About.fr.resx
Kaynaklar/görünümler. Home . . Fr. resx hakkında
ResourcesPathSeçeneğini kullanmazsanız, bir görünüm için . resx dosyası görünümüyle aynı klasörde bulunur.
RootNamespaceAttribute
RootNamespaceAttributeÖzniteliği, bir derlemenin kök ad alanı derleme adından farklı olduğunda, bir derlemenin kök ad alanını sağlar.
Uyarı
Bu durum, projenin adı geçerli bir .NET tanımlayıcısı olmadığında ortaya çıkabilir. Örneğin, my-project-name.csproj my_project_name Bu hata için kök ad alanını ve derleme adını kullanır my-project-name .
Bir derlemenin kök ad alanı, derleme adından farklıysa:
- Yerelleştirme varsayılan olarak çalışmaz.
- Yerelleştirme, derleme içinde kaynakların aranacağı yol nedeniyle başarısız olur.
RootNamespace, yürütme işlemi için kullanılamayan bir derleme zamanı değeridir.
, RootNamespace Öğesinden farklıysa, AssemblyName AssemblyInfo. cs içine aşağıdakini ekleyin (parametre değerleri gerçek değerlerle değiştirilmiştir):
using System.Reflection;
using Microsoft.Extensions.Localization;
[assembly: ResourceLocation("Resource Folder Name")]
[assembly: RootNamespace("App Root Namespace")]
Yukarıdaki kod resx dosyalarının başarıyla çözümlenmesine izin vermez.
Kültür geri dönüş davranışı
Bir kaynak aranırken, yerelleştirme "kültür geri dönüş" bölümünde ilgilenir. İstenen kültürden başlayarak, bulunamazsa bu kültürün üst kültürüne geri döner. Bir kenara de, CultureInfo. Parent özelliği üst kültürü temsil eder. Bu genellikle (her zaman değil), National signifier 'in ISO 'dan kaldırılması anlamına gelir. Örneğin, Meksika 'da konuşulan Ispanyolca diyalekt "es-MX" dir. Ana "es" — İspanyolca herhangi bir ülkeye özgü değildir.
sitenizin "fr-CA" kültürünü kullanarak "hoş geldiniz" kaynağı için bir istek aldığından Imagine. Yerelleştirme sistemi aşağıdaki kaynakları sırayla arar ve ilk eşleşmeyi seçer:
- Welcome.fr-CA. resx
- Welcome. fr. resx
- Welcome. resx (
NeutralResourcesLanguage"fr-CA" ise)
Örnek olarak, ". fr" kültür göstergesini kaldırırsanız ve kültürü Fransızca olarak ayarlarsanız, varsayılan kaynak dosyası okunurdur ve dizeler yerelleştirilir. Kaynak Yöneticisi, istenen kültürü hiçbir şey karşılamıyorsa, için bir varsayılan veya geri dönüş kaynağı belirler. Yalnızca istenen kültür için bir kaynak eksik olduğunda anahtarı döndürmek istiyorsanız varsayılan bir kaynak dosyanız olmamalıdır.
Visual Studio ile kaynak dosyaları oluşturma
dosya adında kültür olmadan Visual Studio bir kaynak dosyası oluşturursanız (örneğin, Welcome. resx), Visual Studio her dize için bir özelliği olan bir C# sınıfı oluşturur. ASP.NET Core, genellikle istediğiniz gibi değildir. Genellikle Default . resx kaynak dosyanız (kültür adı olmayan bir . resx dosyası) yoktur. . Resx dosyasını bir kültür adı (örneğin, Welcome. fr. resx) ile oluşturmanızı öneririz. kültür adı ile bir . resx dosyası oluşturduğunuzda Visual Studio sınıf dosyası oluşturmaz.
Diğer kültürleri Ekle
Her dil ve kültür bileşimi (varsayılan dil dışında), benzersiz bir kaynak dosyası gerektirir. ISO dili kodlarının dosya adının parçası olduğu yeni kaynak dosyaları oluşturarak farklı kültürler ve yerel ayarlar için kaynak dosyaları oluşturun (örneğin, en-US, fr-CA ve en-GB). Bu ISO kodları, Welcome.es-MX. resx (Ispanyolca/Meksika) içinde olduğu gibi dosya adı ve . resx dosya uzantısı arasına yerleştirilir.
Her istek için dil/kültür seçmek üzere bir strateji uygulayın
Yerelleştirmeyi yapılandırma
Yerelleştirme, Startup.ConfigureServices yönteminde yapılandırılır:
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
AddLocalizationYerelleştirme hizmetlerini hizmetler kapsayıcısına ekler. Yukarıdaki kod, kaynakların yolunu da "resources" olarak ayarlar.AddViewLocalizationyerelleştirilmiş görünüm dosyaları için destek ekler. Bu örnek görünümde yerelleştirme, görünüm dosyası sonekini temel alır. Örneğin, Index. fr. cshtml dosyasındaki "fr".AddDataAnnotationsLocalization``DataAnnotationssoyutlamalar aracılığıyla yerelleştirilmiş doğrulama iletileri için destek eklerIStringLocalizer.
Yerelleştirme ara yazılımı
Bir istekteki geçerli kültür, yerelleştirme Araortamında ayarlanır. Yerelleştirme ara yazılımı Startup.Configure yönteminde etkindir. Yerelleştirme ara yazılımı, istek kültürünü denetlemeyebilir (örneğin,) herhangi bir ara yazılım önce yapılandırılmalıdır app.UseMvcWithDefaultRoute() . Kullanılıyorsa, yazılım yönlendirmede, yerelleştirme ara yazılımı gelmelidir RouteDataRequestCultureProvider . Ara yazılım sıralaması hakkında daha fazla bilgi için bkz ASP.NET Core Middleware ..
var supportedCultures = new[] { "en-US", "fr" };
var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
Ingilizce dışındaki dillere çevrilmiş kod açıklamalarını görmek isterseniz, Bu GitHub tartışma sorununubize tanıyın.
UseRequestLocalization bir RequestLocalizationOptions nesnesi başlatır. Her istekte içindeki listesinin listesi RequestCultureProvider RequestLocalizationOptions numaralandırılır ve istek kültürünü başarıyla belirleyebilmesi için ilk sağlayıcı kullanılır. Varsayılan sağlayıcılar RequestLocalizationOptions sınıftan gelir:
QueryStringRequestCultureProviderCookieRequestCultureProviderAcceptLanguageHeaderRequestCultureProvider
Varsayılan liste, en çok belirli olan en az özel. Makalenin ilerleyen kısımlarında, sırayı nasıl değiştirekullanabileceğinizi ve hatta özel bir kültür sağlayıcısı nasıl ekleyebileceğiniz hakkında bilgi edineceksiniz. Sağlayıcıların hiçbiri istek kültürünü belirleyeiyorsa, DefaultRequestCulture kullanılır.
QueryStringRequestCultureProvider
Bazı uygulamalar, ayarlamak için bir sorgu dizesi kullanır CultureInfo . cookieVeya Accept-Language üstbilgi yaklaşımını kullanan uygulamalar için, URL 'ye bir sorgu dizesi eklemek hata ayıklama ve test kodu için yararlıdır. Varsayılan olarak,, QueryStringRequestCultureProvider listede ilk yerelleştirme sağlayıcısı olarak kaydedilir RequestCultureProvider . Sorgu dizesi parametrelerini ve öğesini geçirirsiniz culture ui-culture . Aşağıdaki örnek, belirli kültürü (dil ve bölge) Ispanyolca/Meksika olarak ayarlar:
http://localhost:5000/?culture=es-MX&ui-culture=es-MX
Yalnızca iki ( culture veya) birini geçirirseniz ui-culture , sorgu dizesi sağlayıcısı, her iki değeri de geçirdiğiniz birini kullanarak ayarlar. Örneğin, yalnızca kültür ayarlandığında, ve ' nin her ikisi de ayarlanır Culture UICulture :
http://localhost:5000/?culture=es-MX
CookieRequestCultureProvider
üretim uygulamaları genellikle ASP.NET Core kültür ile kültürü ayarlamak için bir mekanizma sağlar cookie . MakeCookieValueOluşturmak için yöntemini kullanın cookie .
, CookieRequestCultureProvider DefaultCookieName cookie Kullanıcının tercih ettiği kültür bilgilerini izlemek için kullanılan varsayılan adı döndürür. Varsayılan cookie ad .AspNetCore.Culture .
cookieBiçimi c=%LANGCODE%|uic=%LANGCODE% , ve nerede olduğu c , Culture uic UICulture Örneğin:
c=en-UK|uic=en-US
Kültür bilgisi ve UI kültürünün yalnızca birini belirtirseniz, belirtilen kültür hem kültür bilgileri hem de UI kültürü için kullanılacaktır.
Accept-Language HTTP üstbilgisi
Accept-Language üst bilgisi tarayıcıların çoğu tarayıcıda ayarlanabilir ve başlangıçta kullanıcının dilini belirtmeye yöneliktir. Bu ayar, tarayıcının temel alınan işletim sisteminden gönderme veya devralma olarak ayarlandığını gösterir. Tarayıcı isteğinden Accept-Language HTTP üst bilgisi, kullanıcının tercih ettiği dili algılamamanız için güvenilir bir yoldur (bkz. bir tarayıcıda dil tercihlerini ayarlama). Bir üretim uygulaması, kullanıcının kültür seçimini özelleştirmenin bir yolunu içermelidir.
IE 'de Accept-Language HTTP üst bilgisini ayarlama
Dişli simgesinden Internet seçenekleri' ne dokunun.
Diller' e dokunun.

Dil tercihlerini ayarla' ya dokunun.
Dil ekle' ye dokunun.
Dilini ekleyin.
Dile dokunun ve ardından Yukarı taşı' ya dokunun.
Özel bir sağlayıcı kullan
Müşterilerinizin kendi dil ve kültürünü veritabanlarınızı veritabanlarına depolamasına izin vermek istediğinizi varsayalım. Kullanıcı için bu değerleri aramak üzere bir sağlayıcı yazabilirsiniz. Aşağıdaki kod, özel bir sağlayıcının nasıl ekleneceğini göstermektedir:
private const string enUSCulture = "en-US";
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo(enUSCulture),
new CultureInfo("fr")
};
options.DefaultRequestCulture = new RequestCulture(culture: enUSCulture, uiCulture: enUSCulture);
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
// My custom request culture logic
return new ProviderCultureResult("en");
}));
});
RequestLocalizationOptionsYerelleştirme sağlayıcıları eklemek veya kaldırmak için kullanın.
Kültürü program aracılığıyla ayarlama
GitHub bu örnek yerelleştirme. starterweb projesi, ayarlamak için kullanıcı arabirimi içerir Culture . Views/Shared/_SelectLanguagePartial. cshtml dosyası desteklenen kültürler listesinden kültürü seçmenize olanak sağlar:
@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options
@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions
@{
var requestCulture = Context.Features.Get<IRequestCultureFeature>();
var cultureItems = LocOptions.Value.SupportedUICultures
.Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
.ToList();
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
}
<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
<form id="selectLanguage" asp-controller="Home"
asp-action="SetLanguage" asp-route-returnUrl="@returnUrl"
method="post" class="form-horizontal" role="form">
<label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> <select name="culture"
onchange="this.form.submit();"
asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
</select>
</form>
</div>
Görünümler/Shared/_SelectLanguagePartial. cshtml dosyası, footer Düzen dosyasının bölümüne eklenir, bu nedenle tüm görünümlerde kullanılabilir hale gelir:
<div class="container body-content" style="margin-top:60px">
@RenderBody()
<hr>
<footer>
<div class="row">
<div class="col-md-6">
<p>© @System.DateTime.Now.Year - Localization</p>
</div>
<div class="col-md-6 text-right">
@await Html.PartialAsync("_SelectLanguagePartial")
</div>
</div>
</footer>
</div>
SetLanguageYöntemi kültürü ayarlar cookie .
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}
Bu proje için örnek koda _SelectLanguagePartial. cshtml 'yi ekleyemezsiniz. GitHub üzerindeki yerelleştirme. starterweb projesi, RequestLocalizationOptions Razor bağımlılığı ekleme kapsayıcısı aracılığıyla kısmi bir akışa akacak kodu içerir.
Model bağlama yolu verileri ve sorgu dizeleri
Model bağlama yolu verilerinin ve sorgu dizelerinin Genelleştirme davranışınıinceleyin.
Genelleştirme ve yerelleştirme koşulları
Uygulamanızı yerelleştirme işlemi, modern yazılım geliştirmede yaygın olarak kullanılan ilgili karakter kümelerinin temel olarak anlaşılmasını ve bunlarla ilişkili sorunların anlaşılmasını gerektirir. Tüm bilgisayarlar metni sayı (kodlar) olarak depolayabilse de, farklı sistemler farklı sayılar kullanarak aynı metni depolar. Yerelleştirme süreci, belirli bir kültür/yerel ayar için uygulama kullanıcı arabirimini (UI) çevirmeye başvurur.
Yerelleştirilebilirlik , bir Genelleştirilmiş uygulamasının yerelleştirme için hazırlandığının doğrulanması için bir ara işlemdir.
Kültür adı için RFC 4646 biçimi <languagecode2>-<country/regioncode2> , burada <languagecode2> dil kodudur ve <country/regioncode2> alt kültür kodudur. Örneğin, es-CL İspanyolca (Şili) için, en-US ingilizce (Birleşik Devletler) ve en-AU İngilizce (Avustralya) için. RFC 4646 , bir dille ILIŞKILI bir ISO 639 2-Letter küçük harfli kültür kodu ve bir ülke veya bölgeyle ILIŞKILI bir ISO 3166 2 harfli büyük harf alt kültür kodu birleşimidir. Daha fazla bilgi için bkz. System.Globalization.CultureInfo.
Uluslararası duruma getirme genellikle "I18N" olarak kısaltılır. Kısaltma ilk ve son harfleri ve aralarındaki harflerin sayısını alır, bu nedenle 18 ilk "I" ve son "N" arasındaki harflerin sayısını temsil eder. Aynı Genelleştirme (G11N) ve yerelleştirme (L10N) için de geçerlidir.
Larındaki
- Genelleştirme (G11N): bir uygulamanın farklı dil ve bölgeleri desteklemesini sağlama işlemi.
- Yerelleştirme (L10N): belirli bir dil ve bölge için bir uygulamayı özelleştirme işlemi.
- Uluslararası duruma getirme (I18N): hem Genelleştirme hem de yerelleştirmeyi açıklar.
- Kültür: bir dildir ve isteğe bağlı olarak bir bölgedir.
- Nötr kültür: belirtilen dile sahip, ancak bölge olmayan bir kültür. (örneğin, "en", "es")
- Belirli kültür: belirtilen dile ve bölgeye sahip bir kültür. (örneğin, "en-US", "en-GB", "es-CL")
- Üst kültür: belirli bir kültürü içeren nötr kültür. (örneğin, "tr", "en-US" ve "en-GB" öğesinin üst kültürüdür)
- Yerel ayar: bir yerel ayar kültür ile aynıdır.
Not
Ondalık alanlara ondalık virgüller giremeyebilirsiniz. Ondalık bir nokta ve US-English tarih biçimleri için virgül (",") kullanan Ingilizce olmayan yerel ayarlarda jQuery doğrulamasını desteklemek için, uygulamanızı globalize için adımlar uygulamanız gerekir. Ondalık virgülden ekleme hakkında yönergeler için bkz. GitHub sorunu 4076 .
Not
Core 3.0 web ASP.NET önce, istenen kültür desteklenmiyorsa istek başına LogLevel.Warning türünde bir günlük yazar. İstek başına LogLevel.Warning bir günlük kaydı, yedekli bilgilerle büyük günlük dosyalarına neden olabilir. Bu davranış 3.0 ASP.NET değiştirilmiştir. RequestLocalizationMiddleware, üretim günlüklerinin boyutunu LogLevel.Debug azaltan türünde bir günlük yazar.