ASP.NET vícejazyčné spínání s vestavěnými základními funkcemi MVC

Stránky aktualizovány :
Datum vytvoření stránky :

Prostředí

Visual Studio
  • Visual Studio 2019
ASP.NET jádro
  • 3.0
  • 3.1

Zpočátku

ASP.NET k jejich zobrazení pomocí základních lokalizačních funkcí MVC přepínat mezi více jazyky.

Vytvoření souboru prostředků pro přeložený text

Vytvořte složku pro uložení souborů prostředků (Resx), které spravují text. Poloha je kdekoli, ale nechte ji přímo pod trasou. Tato cesta také ovlivňuje pozdější nastavení.

Klikněte pravým tlačítkem myši na projekt a vyberte Přidat nebo Nová složka.

image

Ponechte prostředky názvu složky. Tento název složky můžete také nastavit libovolně, ale tento název složky můžete zadat v pozdějších nastaveních.

image

Potom vytvořte soubor prostředků pro zadávání textu pro každý jazyk.

Klikněte pravým tlačítkem myši na složku Zdroje a vyberte Přidat nebo Novou položku.

image

Vyberte soubor prostředků (.resx). Název souboru může být libovolný, ale musí se shodovat s názvem, který zadáte později. Prozatím řekněme SharedResource.resx.

image

Po vytvoření souboru Resx jej poklepáním otevřete a zadejte název, který identifikuje text a text, který chcete skutečně zobrazit. Soubor SharedResource.resx je soubor, který se má použít, pokud jazyk neexistuje. Vstoupil jsem to v japonštině zde. Pokud chcete, aby výchozí byly jiné jazyky, například angličtina, zadejte je do tohoto jazyka.

Zde zadáváme Hello and Goodbye jako ukázky. Všimněte si, že se rozlišuje malá a velká písmena.

image

Pokračujte ve vytváření souborů prostředků pro jiné jazyky. Chcete-li jazyk identifikovat, zadejte název souboru, například SharedResource.<Culture Code>.resx. Pro kód jazykové verze můžete zadat jednu nebo obě kombinace ISO 639 a ISO 3166. Kód podpory se může čas od času změnit, takže třída CultureInfo na webu společnosti Microsoft Naleznete na stránce.

Tentokrát jsou připraveny en (anglicky) a es (španělština). Japonština není k dispozici, protože se jedná o výchozí hodnotu.

image

Zadejte přeložený text s klíči ve stejném stavu pro každý soubor.

image

image

Dále budete mít soubor, který definuje pouze třídy. Vytvoříte jej se stejným názvem jako soubor prostředků, který jste právě vytvořili.

Ve skutečnosti je mi jedno, jaký je název samotného souboru kódu, protože stačí, abyste se shodovali s názvem třídy uvnitř, ale nechte to stejné, aby bylo snadné pochopit. Nezáleží na tom, kde chcete napsat kód.

image

Vytvořte obor názvů kořen projektu a vytvořte prázdnou třídu.

namespace LocalizationText
{
  // クラス名は作成した .resx のファイル名と同じにする必要がある
  public class SharedResource { }
}

Oprava každého programu

Startup.cs

Opravte Startup.cs. Popište metodu ConfigureServices následujícím způsobem:

Služby. AddMvc(). Pokud existuje metoda AddViewLocalization, text přeložený na straně zobrazení i na straně kontroloru je Jsem si jistý, že to dostanu, ale Jak je také na oficiálních stránkách služby. Neexistuje žádný problém s voláním AddLocalization metoda společně.

Možnosti. ResourcesPath určuje cestu ke složce, ve které je soubor Resx umístěn. Pokud jsou zadány obě, služby. AddMvc(). Metoda AddViewLocalization má přednost.

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"; });
}

Potom upravte metodu Configure pro Startup.cs. Pokud si chcete soubor prostředků přečíst, nepotřebujete ho. Kód, který je nutný k tomu, aby uživatel mohl libovolně zadat jazyk.

Standardně používáme funkce zabudované ASP.NET Core MVC. Následující kód popisuje "řetězec dotazu", "cookie" a "Hlavička HTTP v jazyce přijetí jazyka" v závislosti na prostředí uživatele. V jednom z nich můžete přepínat mezi jazyky zobrazení. Uvidíme se později, jak zkontrolovat skutečnou operaci.

Přepínatelný jazyk je zde zadán v poli (supportedCultures). Zadal jsem ja jako výchozí jazyk, ale tentokrát jsem soubor ja nevytvořil. SharedResource.resx se používá, pokud je zadán jiný jazyk než en, es.

Můžete oddělit ui z jazyků, které podporujete, ale není velký přínos pro jeho oddělení. Máte stejný jazyk.

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();

  // 省略
}

Řadiče\HomeController.cs

Soubor Controllers\HomeController.cs. Chcete-li získat lokalizovaný jazyk na straně řadiče, iStringLocalizer je přijat v konstruktoru. SharedResource musí mít stejný název jako třída, kterou jste vytvořili dříve. Text je předán importérovi přijatého lokalizátoru předáním řetězce klíče zadaného v souboru prostředků. lze načíst. Jazyk textu je určen na základě požadované jazykové verze.

Mimochodem, kromě IStringLocalizer, je také IHtmlLocalizer, který může získat HTML, jak to je.

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();
  }

  // 省略
}

Zobrazení\_ViewImports.cshtml

Zobrazení\_ViewImports.cshtml. Chcete-li použít lokalizační prostředek na straně zobrazení, je nutné vložit IHtmlLocalizer. Pokud to prozatím popíšete takto, je to v pořádku. Sdílený prostředek musí mít také stejný název jako soubor prostředků a třídu, kterou jste vytvořili dříve.

IHtmlLocalizer je v oboru názvů Microsoft.AspNetCore.Mvc.Localization, takže to budu definovat jako použití.

Pokud chcete použít pouze localizer v určitém okamžiku, můžete zahrnout následující kód do samostatného souboru zobrazení. Pokud jej napíšete do souboru _ViewImports.cshtml, budete jej moci automaticky používat ve všech souborech zobrazení.

@using LocalizationText
@using LocalizationText.Models
@using Microsoft.AspNetCore.Mvc.Localization
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@* ビュー側でローカライザーを使用できるように定義します *@
@inject IHtmlLocalizer<SharedResource> Localizer

Zobrazení\Domů\Index.cshtml

Zobrazení\Domů\Index.cshtml. Text získaný na straně regulátoru a text získaný přímo na straně pohledu jsou zobrazeny. Lokalizátor na straně zobrazení také získá text zadáním řetězce klíče pro indexer.

@{
    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>

Zkontrolovat provoz

Řetězec dotazu

Jazyk zobrazení můžete přepnout zadáním kódu jazykové verze v řetězci dotazu adresy URL. Formát je ?culture=<culture code>. Pokud jej chcete oddělit od ui, bude to ?culture=<culture code>&ui-culture=<culture>.

Pokud nic nezadáte: Pokud není zadán, sharedResource.resx se používá. (Ve skutečnosti byl použit jiný rozsudek...)

image

Vzor zadaný pro ?culture=en. Jazyk zobrazení je angličtina.

image

Vzor zadaný pro ?culture=es. Jazyk zobrazení je španělština.

image

Vzor zadaný pro ?culture=ja. Původně se používá soubor SharedResource.ja.resx. SharedResource.resx se používá, protože neexistuje.

image

Zkuste zadat jazyk, který neexistuje. SharedResource.resx se používá, protože zde není žádný odpovídající soubor.

image

Soubory cookie

Soubory cookie mohou přepnout jazyk zobrazení. Normálně publikoval ze strany serveru, ale tentokrát se budu snažit zaregistrovat cookies přímo ve funkci prohlížeče.

Protože každý webový prohlížeč má vývojářský nástroj, můžete jej použít k registraci souborů cookie. Na obrázku níže můžete stisknutím klávesy F12 na hraně zobrazit vývojářské nástroje.

Název odpovídajícího souboru cookie je . AspNetCore.Culture a hodnota, která určuje jazyk, je Zadejte ve formě c=<kód jazykové verze>|uic=<culture code>. U souborů cookie musíte také zadat kód ui. Jakmile soubor cookie zaregistrujete, aktualizujte stránku webového prohlížeče a aktualizujte jej. Soubor cookie je odeslán na server tak, aby server načetl zadaný jazyk.

Na obrázku níže můžete zadat c=en|uic=en pro zobrazení angličtiny.

image

zadejte c=es|uic=es pro zobrazení španělštiny.

image

Hlavička HTTP v jazyce přijetí

Hlavička HTTP v jazyce přijetí jazyka kontroluje informace záhlaví požadované z webového prohlížeče na server. Je to schopnost odpovídajícím způsobem přepínat jazyky.

V nastavení webového prohlížeče můžete odeslat libovolný jazyk Accept-Language, ale ve výchozím nastavení můžete odpovídat nastavení jazyka operačního systému. Accept-Language je nyní odeslán. (Zda je či není skutečně odeslána, závisí na os a webový prohlížeč.) Jazyk je inicializován ve webovém prohlížeči pro jazyk operačního serveru, ale může být správný.)

Tak, například, jak je znázorněno na obrázku níže, můžete otevřít stránku ve webovém prohlížeči v anglickém jazyce OS a odeslat en informace, takže můžete automaticky SharedResource.en.resx je vybrán pro zobrazení angličtiny.

image

Pokud se pokusíte zadat jazyk, který v řetězci dotazu neexistuje, měli byste původně použít SharedResource.resx. Accept-Language zobrazí angličtinu, protože en existuje.

image

Pokud je ja zadána v řetězci dotazu, má přednost řetězec dotazu a zobrazí se japonština.

image

Shrnutí

Zde jsem se snažil implementovat vícejazyčné přepínání v nejjednodušším způsobem. Chcete-li přepnout jazyky tak, aby odpovídaly prostředí uživatele, použijte jako výchozí jazyk zobrazení hlavičku HTTP v jazyce přijetí jazyka. Pokud si uživatel zvolí libovolný jazyk, je vhodné přidat soubory cookie nebo přidat (nebo zadat přímo) řetězce dotazu.