ASP.NET daugiakalbis perjungimas su pagrindinėmis MVC integruotomis funkcijomis

Puslapis atnaujintas :
Puslapio sukūrimo data :

Aplinkos

Visual Studija
  • "Visual Studio 2019"
ASP.NET branduolys
  • 3.0
  • 3.1

Iš pradžių

ASP.NET naudoti pagrindines MVC lokalizavimo funkcijas, kad perjungtumėte kelias kalbas, kad jos būtų rodomos.

Kurti išversto teksto išteklių failą

Sukurkite aplanką, kuriame saugomi išteklių failai (Resx), kurie valdo tekstą. Vieta yra bet kur, bet palikite ją tiesiai žemiau maršruto. Šis kelias taip pat turi įtakos vėlesniams parametrams.

Dešiniuoju pelės mygtuku spustelėkite projektą ir pasirinkite Įtraukti arba Naujas aplankas.

image

Palikite aplanko pavadinimo išteklius. Taip pat galite nustatyti šio aplanko pavadinimą savavališkai, bet šį aplanko pavadinimą galite nurodyti vėlesniuose parametruose.

image

Tada sukurkite išteklių failą, kad įvestumėte tekstą kiekvienai kalbai.

Dešiniuoju pelės mygtuku spustelėkite aplanką Ištekliai ir pasirinkite Įtraukti arba Naujas elementas.

image

Pasirinkite išteklių failą (.resx). Failo vardas gali būti savavališkas, tačiau jis turi atitikti vardą, kurį nurodėte vėliau. Nes dabar, tarkim SharedResource.resx.

image

Sukūrę .resx failą, dukart spustelėkite, kad jį atidarytumėte, tada įveskite pavadinimą, identifikuojantį tekstą ir tekstą, kurį norite iš tikrųjų rodyti. SharedResource.resx failas yra failas, kuris bus naudojamas, jei kalbos nėra. Aš įvedžiau jį japonų kalba čia. Jei norite, kad kitos kalbos, pvz., anglų, būtų numatytosios, įveskite jas ta kalba.

Čia mes įvedame Hello ir Suatsisveikinti kaip pavyzdžiai. Atkreipkite dėmesį, kad jame skiriamos didžiosios ir mažosios raidės.

image

Toliau kurkite išteklių failus kitoms kalboms. Norėdami identifikuoti kalbą, nurodykite failo vardą, pvz., SharedResource.<Kultūros kodas>.resx. Galite nurodyti vieną arba abu ISO 639 ir ISO 3166 deriniai kultūros kodui. Palaikymo kodas kartais keičiasi, todėl "Microsoft" svetainės "CultureInfo" klasė Prašome kreiptis į puslapį.

Šį kartą yra paruošti en (anglų) ir es (ispanų). Japonų kalba negalima, nes ji yra numatytoji.

image

Įveskite išverstą tekstą su raktais toje pačioje būsenoje kiekvienam failui.

image

image

Tada turėsite failą, kuris apibrėžia tik klases. Galite sukurti tai tokiu pačiu pavadinimu kaip išteklių failą, kurį ką tik sukūrėte.

Tiesą sakant, i don't care, ką kodo failo pavadinimas yra todėl, kad jums tereikia suderinti klasės pavadinimą viduje, bet palikti jį tą patį, kad būtų lengva suprasti. Nesvarbu, kur norite parašyti kodą.

image

Sukurkite vardų sritį projekto šaknimi ir sukurkite tuščią klasę.

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

Taisyti kiekvieną programą

Startup.cs

Pataisyk Startup.cs. Apibūdinkite ConfigureServices metodą taip:

Paslaugos. AddMvc(). Jei yra AddViewLocalization metodas, tekstas išverstas ir rodinio pusėje, ir valdiklio pusėje yra Aš tikiu, kad aš galiu jį gauti, bet Kaip ir oficialiose svetainės paslaugose. Nėra jokių problemų su skambinimo AddLocalization metodas kartu.

Parinktys. ResourcesPath nurodo aplanko, kuriame yra Resx failas, maršrutą. Jei abi nurodytos, paslaugos. AddMvc(). AddViewLocalization metodas yra viršesnis.

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

Tada modifikuokite Startup.cs konfigūravimo metodą. Jei tiesiog norite perskaityti išteklių failą, jo nereikia. Kodas, kurio reikia, kad vartotojas galėtų savavališkai nurodyti kalbą.

Mes naudojame funkcijas, pastatytas ASP.NET Core MVC kaip standartas. Šis kodas apibūdina "užklausos eilutę", "slapuką" ir "Priimti kalbos HTTP antraštę", atsižvelgiant į vartotojo aplinką. Galite perjungti rodymo kalbas vienoje iš jų. Vėliau pamatysime, kaip patikrinti faktinę operaciją.

Perjungiama kalba čia nurodyta masyve (palaikomaKultūros). Aš nurodyta ja kaip numatytąją kalbą, bet aš ne sukūrė ja failą šį kartą. SharedResource.resx naudojamas, jei nurodyta kita nei en, es kalba.

Vartotojo sąsają galite atskirti nuo jūsų palaikomos kalbos, tačiau jos atskyrimas nėra labai naudingas. Jūs turite tą pačią kalbą.

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

  // 省略
}

Valdiklis\HomeController.cs

Controllers\HomeController.cs failą. Norėdami gauti lokalizuota kalba valdiklio pusėje, iStringLocalizer gaunamas konstruktorius. SharedResource pavadinimas turi būti toks pat kaip klasės, kurią sukūrėte anksčiau. Tekstas perduodamas gauto lokatoriaus importuotojui, perduodant rakto eilutę, įvestą į išteklių failą. galima gauti. Teksto kalba nustatoma pagal prašomą kultūrą.

Beje, be iStringLocalizer, taip pat yra IHtmlLocalizer, kad gali gauti HTML, nes ji yra.

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

  // 省略
}

Peržiūros\_ViewImports.cshtml

Views\_ViewImports.cshtml failas. Norėdami naudoti lokalizatorių rodinio pusėje, turite švirkšti IHtmlLocalizer. Jei apibūdintumėte jį taip dabar, tai gerai. Be to, SharedResource turi turėti tą patį pavadinimą kaip išteklių failą ir klasės, kurį sukūrėte anksčiau.

IHtmlLocalizer yra Microsoft.AspNetCore.Mvc.Localization vardų srityje, todėl aš apibrėžti tai kaip naudojant.

Jei norite naudoti tik lokalizatorių tam tikru momentu, į atskirą rodinio failą galite įtraukti šį kodą. Jei rašote jį _ViewImports.cshtml faile, galėsite automatiškai jį naudoti visuose rodinio failuose.

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

Rod\Home\Index.cshtml (Rod\Home\Index.cshtml)

Views\Home\Index.cshtml failą. Valdiklio pusėje gautas tekstas ir tekstas, gautas tiesiai į rodinio pusę, rodomi atitinkamai. Rodinio lokatorius taip pat gauna tekstą, nurodydamas rodyklės kūrimo priemonę rakto eilutę.

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

Tikrinti operaciją

Užklausos eilutė

Rodymo kalbą galite perjungti URL užklausos eilutėje nurodydami kultūros kodą. Formatas yra ?culture=<kultūros kodas>. Jei norite atskirti ją nuo vartotojo sąsajos, tai bus ?culture=<kultūros kodas>&ui-culture=<kultūros kodas>.

Jei nieko nenurodysite: Jei nenurodyta, naudojamas SharedResource.resx. (Iš tikrųjų buvo taikomas kitas teismo sprendimas...)

image

Nurodytas ?culture=en. Rodymo kalba yra anglų.

image

Nurodytas ?culture=es. Rodymo kalba yra ispanų.

image

Nurodytas ?culture=ja. modelis. Iš pradžių naudojamas SharedResource.ja.resx failas. SharedResource.resx naudojamas, nes jo nėra.

image

Pabandykite nurodyti kalbą, kurios nėra. SharedResource.resx naudojamas, nes čia nėra atitinkamo failo.

image

Slapukus

Slapukai gali perjungti rodymo kalbą. Paprastai skelbiama iš serverio pusėje, bet šį kartą bandysiu užregistruoti slapukus tiesiai naršyklės funkcija.

Kadangi kiekviena žiniatinklio naršyklė turi kūrėjo įrankį, jį naudojate slapukams registruoti. Toliau pateiktame paveikslėlyje galite paspausti F12 edge, kad būtų rodomi kūrėjo įrankiai.

Atitinkamo slapuko pavadinimas yra . AspNetCore.Culture, ir reikšmę, kuri nurodo kalba yra Įveskite c=<kultūros kodas>|uic=<kultūros kodas>. Slapukams taip pat turite įvesti vartotojo sąsajos kodą. Užregistravę slapuką, atnaujinkite žiniatinklio naršyklės puslapį, kad jį atnaujintumėte. Slapukas siunčiamas į serverį, kad serveris gautų nurodytą kalbą.

Toliau pateiktame paveikslėlyje galite įvesti c=en|uic=en, kad būtų rodoma anglų kalba.

image

įveskite c=es|uic=es, kad būtų rodoma ispanų kalba.

image

Priimti kalbos HTTP antraštę

Priimti kalbą HTTP antraštė patikrina antraštės informaciją, kurios prašoma iš žiniatinklio naršyklės į serverį. Tai gebėjimas atitinkamai perjungti kalbas.

Žiniatinklio naršyklės parametruose galite siųsti bet kurią priėmimo kalbą, tačiau pagal numatytuosius nustatymus galite suderinti os kalbos parametrus. Dabar siunčiama priėmimo kalba. (Nesvarbu, ar jis iš tikrųjų siunčiamas, priklauso nuo OS ir žiniatinklio naršyklės.) Kalba inicijuojama os kalbos žiniatinklio naršyklėje, tačiau ji gali būti teisinga.)

Pavyzdžiui, kaip parodyta toliau pateiktame paveikslėlyje, galite atidaryti puslapį anglų kalbos OS žiniatinklio naršyklėje ir siųsti en informaciją, kad galėtumėte automatiškai SharedResource.en.resx yra pasirinkta rodyti anglų kalbą.

image

Jei bandote nurodyti kalbą, kurios nėra užklausos eilutėje, iš pradžių turėtumėte naudoti SharedResource.resx. Priimti kalbą rodoma anglų kalba, nes en egzistuoja.

image

Jei ja nurodytas užklausos eilutėje, užklausos eilutė turi pirmenybę ir rodoma japonų kalba.

image

Santrauka

Čia aš bandžiau įgyvendinti daugiakalbį perjungimą lengviausiu būdu. Norėdami perjungti kalbas, kad jos atitiktų vartotojo aplinką, naudokite antraštės Priimti kalbą HTTP kaip numatytąją rodymo kalbą. Jei vartotojas pasirenka bet kurią kalbą, patartina pridėti slapukus arba pridėti (arba įvesti tiesiogiai) užklausos eilutę.