ASP.NET comutare multilingvă cu caracteristici încorporate MVC de bază

Pagina actualizată :
Data creării paginii :

Mediu

Discutii pe forum Visual C
  • Discutii pe forum Visual C...
ASP.NET Core
  • 3.0
  • 3.1

La început,

ASP.NET utilizați caracteristici de localizare MVC de bază pentru a comuta între mai multe limbi pentru a le afișa.

Crearea unui fișier de resurse pentru textul tradus

Creați un folder pentru a stoca fișierele de resurse (Resx) care gestionează textul. Locația este oriunde, dar lăsați-l direct sub traseu. Această cale afectează, de asemenea, setările ulterioare.

Faceți clic cu butonul din dreapta pe proiect și selectați Adăugare sau Folder nou.

image

Lăsați resursele de nume de folder. De asemenea, aveți posibilitatea să setați acest nume de folder în mod arbitrar, dar aveți posibilitatea să specificați acest nume de folder în setări ulterioare.

image

Apoi creați un fișier de resurse pentru a introduce text pentru fiecare limbă.

Faceți clic cu butonul din dreapta pe folderul Resurse și selectați Adăugare sau Element nou.

image

Selectați fișierul de resurse (.resx). Numele fișierului poate fi arbitrar, dar trebuie să se potrivească cu numele specificat mai târziu. Pentru moment, să spunem SharedResource.resx.

image

După ce creați fișierul .resx, faceți dublu clic pentru a-l deschide, apoi tastați numele care identifică textul și textul pe care doriți să îl afișați efectiv. Fișierul SharedResource.resx este fișierul de utilizat dacă limba nu există. Am introdus-o în japoneză aici. Dacă doriți ca alte limbi, ar fi engleza, să fie implicite, introduceți-le în limba respectivă.

Aici vom intra Hello and Goodbye ca mostre. Rețineți că este sensibil la litere mari și mici.

image

Continuați să creați fișiere de resurse pentru alte limbi. Pentru a identifica limba, specificați numele fișierului, ar fi SharedResource.<Cod cultură>.resx. Puteți specifica una sau ambele combinații de ISO 639 și ISO 3166 pentru codul de cultură. Codul de suport este supus modificării din când în când, astfel încât clasa CultureInfo pe site-ul Microsoft Vă rugăm să consultați pagina.

De data aceasta, en (engleză) și es (spaniolă) sunt pregătite. Japoneza nu este disponibilă, deoarece este implicită.

image

Introduceți textul tradus cu tastele în aceeași stare pentru fiecare fișier.

image

image

Apoi, veți avea un fișier care definește numai clasele. Creați acest lucru cu același nume ca fișierul de resurse tocmai ați creat.

De fapt, nu-mi pasă ce numele fișierului de cod în sine este pentru că trebuie doar să se potrivească cu numele clasei în interiorul, dar lăsați-l la fel, astfel încât este ușor de înțeles. Nu contează unde vrei să scrii codul.

image

Faceți spațiul de nume rădăcina proiectului și creați o clasă goală.

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

Remediați fiecare program

Startup.cs

Repară-Startup.cs. Descrieți metoda ConfigureServices după urmează:

Servicii. AddMvc(). Dacă există o metodă AddViewLocalization, textul tradus atât de partea de vizualizare, cât și de partea controlerului este Sunt sigur că pot să-l, dar Așa este, de asemenea, pe site-ul oficial de servicii. Nu există nici o problemă cu apelarea metoda AddLocalization împreună.

Opţiuni. ResourcesPath specifică calea folderului în care se află fișierul Resx. Dacă ambele sunt specificate, serviciile. AddMvc(). Metoda AddViewLocalization are prioritate.

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

Apoi modificați metoda Configurare pentru Startup.cs. Dacă doriți doar să citiți fișierul de resurse, nu aveți nevoie de el. Cod care este necesar pentru a permite utilizatorului să specifice o limbă în mod arbitrar.

Folosim caracteristicile construite în ASP.NET Core MVC ca standard. Următorul cod descrie "șirul de interogare", "cookie" și "Antethttp accept-language", în funcție de mediul utilizatorului. Puteți comuta între limbile de afișare într-una dintre ele. Ne vedem mai târziu să verifici operațiunea.

Limba comutabilă este specificată aici în matrice (supportedCultures). Am specificat ja ca limbă implicită, dar nu am creat fișierul ja de această dată. SharedResource.resx este utilizat dacă este specificată o altă limbă decât en, es.

Puteți separa interfața cu utilizatorul de limbile pe care le acceptați, dar nu există prea multe beneficii pentru separarea acesteia. Ai aceeași limbă.

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

  // 省略
}

Controlere\HomeController.cs

Controllers\HomeController.cs fișier. Pentru a obține o limbă localizată pe partea controlerului, iStringLocalizer este primit în constructor. SharedResource trebuie să aibă același nume ca și clasa pe care ați creat-o mai devreme. Textul este transmis importatorului localizatorului primit prin transmiterea șirului de chei introdus în fișierul de resurse. poate fi preluată. Limba textului este determinată pe baza culturii solicitate.

Apropo, în plus față de IStringLocalizer, există, de asemenea, un IHtmlLocalizer care poate obține HTML așa este.

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

  // 省略
}

Vizualizări\_ViewImports.cshtml

Fișier Views\_ViewImports.cshtml. Pentru a utiliza un localizer pe partea de vizualizare, trebuie să injectați IHtmlLocalizer. Dacă îl descrieți după urmează pentru acum, este OK. De asemenea, SharedResource trebuie să aibă același nume ca fișierul de resurse și clasa pe care ați creat-o mai devreme.

IHtmlLocalizer este în spațiul de nume Microsoft.AspNetCore.Mvc.Localization, așa că voi defini acest lucru ca folosind.

Dacă doriți să utilizați localizatorul numai la un anumit punct, aveți posibilitatea să includeți următorul cod într-un fișier de vizualizare separat. Dacă îl scrieți într-un fișier _ViewImports.cshtml, îl veți putea utiliza automat în toate fișierele de vizualizare.

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

Views\Home\Index.cshtml Vizualizari \\ Home \\ Index.cshtml

Fișier views\Home\Index.cshtml. Textul obținut pe partea de controler și, respectiv, textul obținut direct pe partea de vizualizare sunt afișate. Localizatorul de vizualizare primește, de asemenea, textul specificând un șir de chei pentru indexator.

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

Verificarea funcționării

Șir de interogare

Aveți posibilitatea să comutați limba de afișare specificând un cod de cultură în șirul de interogare al URL-ului. Formatul este ?culture=<culture code>. Dacă doriți să-l separați de UI, acesta va fi ?culture=<culture code>&ui-culture=<culture code>.

Dacă nu specificați nimic: Dacă nu este specificat, se utilizează SharedResource.resx. (De fapt, o altă hotărâre a fost aplicată ...)

image

Modelul specificat pentru ?culture=ro. Limba de afișare este engleza.

image

Modelul specificat pentru ?culture=es. Limba de afișare este spaniolă.

image

Modelul specificat pentru ?culture=ja. Inițial, se utilizează fișierul SharedResource.ja.resx. SharedResource.resx este utilizat deoarece nu există.

image

Încercați să specificați o limbă care nu există. SharedResource.resx este utilizat, deoarece nu există nici un fișier corespunzător aici.

image

Modulele cookie

Modulele cookie pot comuta limba de afișare. În mod normal, publicat e din partea serverului, dar de data aceasta voi încerca să înregistreze cookie-uri direct în funcția de browser.

Deoarece fiecare browser Web are un instrument pentru dezvoltatori, îl utilizați pentru a înregistra module cookie. În figura de mai jos, puteți apăsa F12 pe Edge pentru a afișa instrumentele pentru dezvoltatori.

Numele cookie-ului corespunzator este . AspNetCore.Culture, iar valoarea care specifică limba este Introduceți sub formă de c=<cod cultură>|uic=<cod cultură>. Pentru cookie-uri, trebuie să introduceți, de asemenea, codul ui. După ce v-ați înregistrat cookie-ul, reîmprospătați pagina browserului web pentru a o reîmprospăta. Un cookie este trimis la server, astfel încât serverul va prelua limba specificată.

În figura de mai jos, puteți introduce c=en|uic=en pentru a afișa limba engleză.

image

tip c=es|uic=es pentru a afișa spaniola.

image

Antet HTTP în limba de acceptare

Antetul HTTP în limba acceptată verifică informațiile de antet solicitate din browserul Web pe server. Este capacitatea de a comuta limbi în consecință.

Aveți posibilitatea să trimiteți orice limbă acceptată în setările browserului Web, dar în mod implicit puteți potrivi setările de limbă a osului. Accept-Language este acum trimis. (Dacă este sau nu este de fapt trimis depinde de os și browser-ul web.) Limba este inițializată în browserul Web pentru limba osului, dar poate fi corectă.)

Deci, de exemplu, așa se arată în figura de mai jos, puteți deschide pagina în browser-ul Web al osului în limba engleză și trimite ți informații, astfel încât să puteți automat SharedResource.en.resx este selectat pentru a afișa limba engleză.

image

Dacă încercați să specificați o limbă care nu există în șirul de interogare, ar trebui să utilizați inițial SharedResource.resx. Accept-Language afișează engleza deoarece en există.

image

Dacă ja este specificatîn șirul de interogare, șirul de interogare are prioritate și se afișează japoneză.

image

Rezumat

Aici am încercat să pună în aplicare multilingv de comutare în cel mai simplu mod. Pentru a comuta limbi le corespunde mediului utilizatorului, utilizați antetul HTTP în mod acceptat ca limbă de afișare implicită. Dacă utilizatorul alege orice limbă, este o idee bună să adăugați cookie-uri sau să adăugați (sau să introduceți direct) șirul de interogare.