Temel MVC yerleşik özellikleriyle ASP.NET çok dilli anahtarlama

Sayfa güncel :
Sayfa oluşturma tarihi :

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.

image

Klasör adı kaynaklarını bırakın. Bu klasör adını rasgele ayarlayabilirsiniz, ancak bu klasör adını sonraki ayarlarda belirtebilirsiniz.

image

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.

image

Kaynak dosyasını (.resx) seçin. Dosya adı rasgele olabilir, ancak daha sonra belirttiğiniz adla eşleşmelidir. Şimdilik SharedResource.resx diyelim.

image

.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.

image

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.

image

Çevrilmiş metni her dosya için aynı durumda anahtarlarla girin.

image

image

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.

image

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 oluşturucu alınır. SharedResource, daha önce oluşturduğunuz sınıfla aynı ada sahip olmalıdır. Metin, kaynak dosyasına girilen anahtar dizesini geçirerek alınan yerelleştiricinin içe aktarıcısına geçirilir. alınabilir. Metnin dili istenen kültüre göre belirlenir.

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 enjekte etmeniz gerekir. Şimdilik aşağıdaki gibi tanımlarsanız, tamam. Ayrıca, SharedResource daha önce oluşturduğunuz kaynak dosyası ve sınıfile aynı ada sahip olmalıdır.

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 ...)

image

?culture=en için belirtilen desen. Görüntü dili İngilizcedir.

image

?culture=es için belirtilen desen. Görüntü dili İspanyolcadır.

image

?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.

image

Var olmayan bir dili belirtmeye çalışın. Burada karşılık gelen bir dosya olmadığından SharedResource.resx kullanılır.

image

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.

image

c=es|uic=es yazın.

image

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.

image

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.

image

Sorgu dizesinde ja belirtilirse, sorgu dizesi önce gelir ve Japonca görüntülenir.

image

Ö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.