ASP.NET flersproget kobling med indbyggede kernefunktioner i MVC

Side opdateret :
Dato for oprettelse af side :

Miljø

Visual Studio
  • Visual Studio 2019
ASP.NET kerne
  • 3.0
  • 3.1

I første omgang

ASP.NET bruger centrale MVC-lokaliseringsfunktioner til at skifte mellem flere sprog for at få dem vist.

Oprette en ressourcefil til oversat tekst

Opret en mappe til lagring af de ressourcefiler (Resx), der administrerer teksten. Placeringen er overalt, men lad det være lige under ruten. Denne sti påvirker også senere indstillinger.

Højreklik på projektet, og vælg Tilføj eller Ny mappe.

image

Lad mappenavnet være ressourcer. Du kan også angive mappenavnet vilkårligt, men du kan angive mappenavnet i senere indstillinger.

image

Opret derefter en ressourcefil for at skrive tekst for hvert sprog.

Højreklik på mappen Ressourcer, og vælg Tilføj eller Nyt element.

image

Vælg ressourcefilen (.resx). Filnavnet kan være vilkårligt, men det skal svare til det navn, du angiver senere. For nu, lad os sige SharedResource.resx.

image

Når du har oprettet .resx-filen, skal du dobbeltklikke for at åbne den og derefter skrive det navn, der identificerer teksten og den tekst, du rent faktisk vil vise. Filen SharedResource.resx er den fil, der skal bruges, hvis sproget ikke findes. Jeg gik ind i det på japansk her. Hvis andre sprog, f.eks.

Her går vi ind i Hej og Farvel som eksempler. Bemærk, at der skelnes mellem store og små bogstaver.

image

Fortsæt med at oprette ressourcefiler til andre sprog. Hvis du vil identificere sproget, skal du angive filnavnet, f.eks. Du kan angive en eller begge kombinationer af ISO 639 og ISO 3166 for kulturkoden. Supportkoden kan ændres fra tid til anden, så CultureInfo-klassen på Microsoft-webstedet Se venligst siden.

Denne gang tilberedes en (engelsk) og es (spansk). Japansk er ikke tilgængelig, fordi det er standard.

image

Skriv den oversatte tekst med tasterne i samme tilstand for hver fil.

image

image

Derefter skal du have en fil, der kun definerer klasserne. Du opretter dette med samme navn som den ressourcefil, du lige har oprettet.

Faktisk er jeg ligeglad med, hvad navnet på selve kodefilen er, fordi du kun behøver at matche navnet på klassen inde, men lad det være det samme, så det er let at forstå. Det er ligegyldigt, hvor du vil skrive koden.

image

Gør navneområdet til roden af projektet, og opret en tom klasse.

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

Ret hvert program

Startup.cs

Fix Startup.cs. Beskriv metoden ConfigureServices på følgende måde:

Tjenester. AddMvc(). Hvis der findes en AddViewLocalization-metode, er den tekst, der er oversat af både visningssiden og controllersiden, Jeg er sikker på jeg kan få det, men Som det også er på den officielle hjemmeside tjenester. Der er ikke noget problem med at kalde AddLocalization metode sammen.

Muligheder. ResourcesPath angiver stien til den mappe, hvor Resx-filen er placeret. Hvis begge er angivet, tjenester. AddMvc(). Metoden AddViewLocalization har forrang.

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

Rediger derefter metoden Configure for Startup.cs. Hvis du bare vil læse ressourcefilen, har du ikke brug for den. Kode, der kræves for at give brugeren mulighed for at angive et sprog vilkårligt.

Vi bruger de indbyggede funktioner ASP.NET Core MVC som standard. Følgende kode beskriver "forespørgselsstrengen", "cookie" og "HTTP-header på acceptsprog" afhængigt af brugerens miljø. Du kan skifte mellem visningssprog på et af dem. Vi vil se dig senere, hvordan du kontrollerer den faktiske operation.

Det omskiftelige sprog er angivet her i matrixen (supportedCultures). Jeg har angivet ja som standardsprog, men jeg har ikke oprettet ja-filen denne gang. SharedResource.resx bruges, hvis der er angivet et andet sprog end da, es.

Du kan adskille brugergrænsefladen fra de sprog, du understøtter, men der er ikke meget gavn ved at adskille den. Du har samme sprog.

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

  // 省略
}

Controllere\Hjemmecontroller.cs

Controllere\HomeController.cs-filen. For at få et lokaliseret sprog på controllersiden modtages iStringLocalizer i konstruktøren. SharedResource skal have samme navn som den klasse, du oprettede tidligere. Teksten sendes til importøren af den modtagne localizer ved at overføre den nøglestreng, der er angivet i ressourcefilen. kan hentes. Tekstens sprog bestemmes på grundlag af den kultur, der anmodes om.

Af den måde, ud over IStringLocalizer, er der også en IHtmlLocalizer, der kan få HTML som det er.

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

  // 省略
}

Visninger\_ViewImports.cshtml

Visninger\_ViewImports.cshtml-fil. Hvis du vil bruge en localizer på visningssiden, skal du injicere IHtmlLocalizer. Hvis du beskriver det som følger for nu, er det OK. SharedResource skal også have samme navn som den ressourcefil og klasse, du oprettede tidligere.

IHtmlLocalizer er i Microsoft.AspNetCore.Mvc.Localization navneområde, så jeg vil definere dette som ved hjælp af.

Hvis du kun vil bruge datamatoren på et bestemt tidspunkt, kan du medtage følgende kode i en separat visningsfil. Hvis du skriver det i en _ViewImports.cshtml fil, vil du automatisk være i stand til at bruge det i alle visningsfiler.

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

Visninger\Startside\Index.cshtml

Visninger\Home\Index.cshtml-fil. Den tekst, der er anskaffet på controllersiden, og den tekst, der er anskaffet direkte på visningssiden, vises henholdsvis. Den lokaliserede visningsside henter også teksten ved at angive en nøglestreng til indekseringen.

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

Kontrol af handling

Forespørgselsstreng

Du kan skifte visningssprog ved at angive en kulturkode i url-adressens forespørgselsstreng. Formatet er ?culture=<culture code>. Hvis du vil adskille den fra brugergrænsefladen, vil det være ?culture=<culture code>&ui-culture=<culture code>.

Hvis du ikke angiver noget: Hvis det ikke er angivet, bruges SharedResource.resx. (Faktisk er en anden dom blevet anvendt...)

image

Det mønster, der er angivet for ?culture=en. Visningssproget er engelsk.

image

Det mønster, der er angivet for ?culture=es. Visningssproget er spansk.

image

Det mønster, der er angivet for ?culture=ja. Oprindeligt bruges filen SharedResource.ja.resx. SharedResource.resx bruges, fordi den ikke findes.

image

Prøv at angive et sprog, der ikke findes. SharedResource.resx bruges, fordi der ikke er nogen tilsvarende fil her.

image

Cookies

Cookies kan skifte visningssprog. Normalt offentliggjort fra serveren side, men denne gang vil jeg prøve at registrere cookies direkte i browseren funktion.

Da hver webbrowser har et udviklerværktøj, bruger du det til at registrere cookies. I figuren nedenfor kan du trykke på F12 på Edge for at få vist udviklerværktøjerne.

Navnet på den tilsvarende cookie er . AspNetCore.Culture, og den værdi, der angiver sproget, er Angiv i form af c=<kulturkode>|uic=<kulturkode>. For cookies skal du også indtaste ui-koden. Når du har registreret din cookie, skal du opdatere din webbrowserside for at opdatere den. Der sendes en cookie til serveren, så serveren henter det angivne sprog.

I figuren nedenfor kan du indtaste c=en|uic=en for at få vist engelsk.

image

skriv c=es|uic=es for at få vist spansk.

image

HTTP-header på accept sprog

HTTP-headeren på accept er sprog, kontrollerer de headeroplysninger, der anmodes om fra webbrowseren til serveren. Det er evnen til at skifte sprog i overensstemmelse hermed.

Du kan sende alle acceptsprog i webbrowserindstillingerne, men som standard kan du matche indstillingerne for OS-sprog. Accepter-Sprog er nu sendt. (Hvorvidt det rent faktisk sendes, afhænger af OS og webbrowser.) Sproget initialiseres i webbrowseren for operativsystemets sprog, men det kan være korrekt.)

Så for eksempel, som vist i figuren nedenfor, kan du åbne siden i webbrowseren på den engelsksprogede OS og sende en information, så du kan automatisk SharedResource.en.resx er valgt til at vise engelsk.

image

Hvis du forsøger at angive et sprog, der ikke findes i forespørgselsstrengen, skal du oprindeligt bruge SharedResource.resx. Acceptsprog viser engelsk, fordi der findes en.

image

Hvis ja er angivet i forespørgselsstrengen, har forespørgselsstrengen forrang, og japansk vises.

image

Resumé

Her forsøgte jeg at gennemføre den flersprogede skift på den nemmeste måde. Hvis du vil skifte sprog, så de svarer til brugerens miljø, skal du bruge HTTP-headeren accepter sprog som standardsprog. Hvis brugeren vælger et sprog, er det en god ide at tilføje cookies eller tilføje (eller indtaste direkte) forespørgselsstrengen.