Temel MVC yerleşik özellikleriyle ASP.NET çok dilli anahtarlama
Ortam
- Görsel Stüdyo
-
- Visual Studio 2019
- ASP.NET Çekirdek
-
- 3.0
- 3.1
İlk başta
ASP.NET, bunları görüntülemek için birden çok dil arasında geçiş yapmak için temel MVC yerelleştirme özelliklerini kullanır.
Çevrilmiş metin için kaynak dosyası oluşturma
Metni yöneten kaynak dosyalarını (Resx) depolamak için bir klasör oluşturun. Konum herhangi bir yerde, ancak doğrudan rotanın altına bırakın. Bu yol sonraki ayarları da etkiler.
Projeyi sağ tıklatın ve Ekle veya Yeni Klasör'ü seçin.
Klasör adı kaynaklarını bırakın. Bu klasör adını rasgele ayarlayabilirsiniz, ancak bu klasör adını sonraki ayarlarda belirtebilirsiniz.
Ardından, her dil için metin girmek için bir kaynak dosyası oluşturun.
Kaynaklar klasörüne sağ tıklayın ve Ekle veya Yeni Öğe'yi seçin.
Kaynak dosyasını (.resx) seçin. Dosya adı rasgele olabilir, ancak daha sonra belirttiğiniz adla eşleşmelidir. Şimdilik SharedResource.resx diyelim.
.resx dosyasını oluşturduktan sonra, açmak için çift tıklatın ve ardından gerçekte görüntülemek istediğiniz metni ve metni tanımlayan adı yazın. SharedResource.resx dosyası, dil yoksa kullanılacak dosyadır. Japonca olarak girdim. İngilizce gibi diğer dillerin varsayılan olmasını istiyorsanız, bunları bu dile girin.
Burada merhaba ve güle güle örnek olarak girin. Büyük/küçük harf duyarlı olduğunu unutmayın.
Diğer diller için kaynak dosyaları oluşturmaya devam edin. Dili tanımlamak için SharedResource.<Culture Code>.resx gibi dosya adını belirtin. Kültür kodu için ISO 639 ve ISO 3166'nın bir veya her iki birleşimini belirtebilirsiniz. Destek kodu zaman zaman değişebilir, bu nedenle Microsoft sitesindeki CultureInfo sınıfı Lütfen sayfaya bakın.
Bu kez, en (İngilizce) ve es (İspanyolca) hazırlanır. Varsayılan olduğu için Japonca kullanılamıyor.
Çevrilmiş metni her dosya için aynı durumda anahtarlarla girin.
Ardından, yalnızca sınıfları tanımlayan bir dosyanız olacak. Bunu, oluşturduğunuz kaynak dosyasıyla aynı adla oluşturursunuz.
Aslında, kod dosyasının adının ne olduğu umurumda değil çünkü sadece içindeki sınıfın adını eşleştirmeniz gerekiyor, ama bunu anlamak kolay olacak şekilde aynı bırakın. Kodu nereye yazmak istediğiniz önemli değil.
Ad alanını projenin kökü haline getirin ve boş bir sınıf oluşturun.
namespace LocalizationText
{
// クラス名は作成した .resx のファイル名と同じにする必要がある
public class SharedResource { }
}
Her programı düzeltme
Startup.cs
Startup.cs düzelt. ConfigureServices yöntemini aşağıdaki gibi açıklayın:
Hizmetleri. AddMvc(). AddViewLocalization yöntemi varsa, hem görünüm tarafı hem de denetleyici tarafı tarafından çevrilen metin Eminim alabilirim, ama. Resmi web sitesi hizmetlerinde olduğu gibi. AddLocalization yöntemini birlikte çağırmakla ilgili bir sorun yoktur.
Seçenekler. ResourcesPath, Resx dosyasının bulunduğu klasörün yolunu belirtir. Her ikisi de belirtilirse, hizmetler. AddMvc(). AddViewLocalization yöntemi önceliklidir.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Resx ファイルのあるフォルダを指定する。
// コントローラー側でしか使用しないならこちらでもよい。AddViewLocalization を使用するならこちらはなくても動作する。
//services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
// ローカライズに必要。Resx ファイルのフォルダパスを指定
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, opts => { opts.ResourcesPath = "Resources"; });
}
Ardından Startup.cs için Yapılandırma yöntemini değiştirin. Kaynak dosyasını okumak istiyorsanız, dosyaya ihtiyacınız yoktur. Kullanıcının bir dili rasgele belirtmesine izin vermek için gereken kod.
Core MVC'de ASP.NET yerleşik özellikleri standart olarak kullanıyoruz. Aşağıdaki kod, kullanıcının ortamına bağlı olarak "sorgu dizesi", "çerez" ve "Kabul-Dil HTTP üstbilgisi" açıklanır. Bunlardan birinde görüntü dilleri arasında geçiş yapabilirsiniz. Gerçek operasyonu nasıl kontrol edeceğiniz le daha sonra görüşürüz.
Değiştirilebilir dil burada dizi (desteklenen Kültürler) belirtilir. Ja'yı varsayılan dil olarak belirttim, ancak bu sefer ja dosyasını oluşturmadım. SharedResource.resx en, es dışında bir dil belirtilmişse kullanılır.
UI'yi desteklediğiniz dillerden ayırabilirsiniz, ancak onu ayırmanın pek bir yararı yoktur. Sen de aynı dile sahipsin.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
// 省略
}
// 標準の機能で切り替えたい言語を定義します。
var supportedCultures = new[]
{
new CultureInfo("ja"),
new CultureInfo("en"),
new CultureInfo("es"),
};
// 標準の言語切り替え機能を有効にします。対応しているのは「クエリ文字列」「Cookie」「Accept-Language HTTP ヘッダー」です。
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("ja"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
app.UseHttpsRedirection();
app.UseStaticFiles();
// 省略
}
Denetleyiciler\HomeController.cs
Denetleyiciler\HomeController.cs dosyası.
Denetleyici tarafında yerelleştirilmiş bir dil elde etmek için, iStringLocalizer
Bu arada, IStringLocalizer ek olarak, olduğu gibi HTML alabilirsiniz bir IHtmlLocalizer da vardır.
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IStringLocalizer<SharedResource> _localizer;
// DI でローカライザーを取得します。
public HomeController(ILogger<HomeController> logger, IStringLocalizer<SharedResource> localizer)
{
_logger = logger;
_localizer = localizer;
}
public IActionResult Index()
{
// ローカライザーを使用して設定されている言語のリソースファイルからテキストを取得します。
ViewData["Message"] = _localizer["Goodbye"];
return View();
}
// 省略
}
Görünümler\_ViewImports.cshtml
Görünümler\_ViewImports.cshtml dosyası.
Görünüm tarafında bir yerelleştirici kullanmak için
IHtmlLocalizer Microsoft.AspNetCore.Mvc.Localization namespace, bu yüzden kullanarak olarak bu tanımlayacağım.
Yerelleştiriciyi yalnızca belirli bir noktada kullanmak istiyorsanız, aşağıdaki kodu ayrı bir görünüm dosyasına ekleyebilirsiniz. _ViewImports.cshtml dosyasına yazarsanız, otomatik olarak tüm görünüm dosyalarında kullanabilirsiniz.
@using LocalizationText
@using LocalizationText.Models
@using Microsoft.AspNetCore.Mvc.Localization
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@* ビュー側でローカライザーを使用できるように定義します *@
@inject IHtmlLocalizer<SharedResource> Localizer
Görünümler\Ana Sayfa\Index.cshtml
Görünümler\Ana Sayfa\Index.cshtml dosyası. Denetleyici tarafında elde edilen metin ve doğrudan görünüm tarafında elde edilen metin sırasıyla görüntülenir. Görünüm tarafı yerelleştirici de dizinleyici için anahtar dize belirterek metin alır.
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
@* ローカライザーから取得したテキストを表示します。 *@
<p>@Localizer["Hello"]</p>
<p>@ViewData["Message"]</p>
İşlemi kontrol et
Sorgu dizesi
URL'nin sorgu dizesinde bir kültür kodu belirterek görüntü dilini değiştirebilirsiniz. Biçim ?culture=<kültür kodu>. UI'den ayırmak isterseniz?culture=<culture code>&ui-culture=<culture code>olacaktır.
Hiçbir şey belirtmezseniz: Belirtilmemişse, SharedResource.resx kullanılır. (Aslında, başka bir yargı uygulanmıştır ...)
?culture=en için belirtilen desen. Görüntü dili İngilizcedir.
?culture=es için belirtilen desen. Görüntü dili İspanyolcadır.
?culture=ja için belirtilen desen. Başlangıçta, SharedResource.ja.resx dosyası kullanılır. SharedResource.resx, yok olduğu için kullanılır.
Var olmayan bir dili belirtmeye çalışın. Burada karşılık gelen bir dosya olmadığından SharedResource.resx kullanılır.
Kurabiye
Çerezler görüntü dilini değiştirebilir. Normalde sunucu tarafında yayınlanan, ancak bu sefer doğrudan tarayıcı işlevi çerezleri kaydetmeye çalışacağım.
Her Web tarayıcısı bir geliştirici aracı olduğundan, tanımlama bilgilerini kaydetmek için kullanırsınız. Aşağıdaki şekilde, geliştirici araçlarını görüntülemek için Edge'deki F12 tuşuna basabilirsiniz.
Karşılık gelen çerezin adı. AspNetCore.Culture ve dili belirten değer c=<kültür kodu>|uic=<kültür kodu>şeklinde girin. Çerezler için ui kodunu da girmeniz gerekir. Çerezinizi kaydettikten sonra, çerezinizi yenilemek için web tarayıcısayfanızı yenileyin. Sunucunun belirtilen dili alması için sunucuya bir çerez gönderilir.
Aşağıdaki şekilde, İngilizce görüntülemek için c=en|uic=en girebilirsiniz.
c=es|uic=es yazın.
Kabul Dili HTTP üstbilgisi
Kabul Dili HTTP üstbilgisi, Web tarayıcısından istenen üstbilgi bilgilerini sunucuya denetler. Bu, dilleri buna göre değiştirebilme yeteneğidir.
Web tarayıcıayarlarınızda herhangi bir Kabul Dili gönderebilirsiniz, ancak varsayılan olarak işletim sistemi dil ayarlarıyla eşleşebilirsiniz. Accept-Language artık gönderildi. (Aslında gönderilen olsun veya olmasın işletim sistemi ve web tarayıcısı bağlıdır.) Dil işletim sistemi dili için Web tarayıcısında başharfe getirilmiş, ancak doğru olabilir.)
Örneğin, aşağıdaki şekilde gösterildiği gibi, İngilizce işletim sistemi web tarayıcısında sayfayı açabilir ve en bilgi gönderebilirsiniz, böylece otomatik olarak İngilizce görüntülemek için SharedResource.en.resx seçilir.
Sorgu dizesinde bulunmayan bir dil belirtmeye çalışırsanız, başlangıçta SharedResource.resx'i kullanmanız gerekir. Accept-Language, İngilizceyi görüntüler çünkü en var.
Sorgu dizesinde ja belirtilirse, sorgu dizesi önce gelir ve Japonca görüntülenir.
Özet
Burada en kolay şekilde çok dilli anahtarlama uygulamaya çalıştım. Kullanıcının ortamıyla eşleşecek dillerarasında geçiş yapmak için varsayılan görüntü dili olarak Kabul Dili HTTP üstbilgisini kullanın. Kullanıcı herhangi bir dil seçerse, sorgu dizesine tanımlama bilgileri eklemek veya (veya doğrudan girmek) iyi bir fikirdir.