ASP.NET flerspråkig växling med inbyggda MVC-kärnfunktioner

Sidan uppdaterad :
Datum för skapande av sida :

Miljö

Visuell studio
  • Visual Studio 2019
ASP.NET kärna
  • 3.0
  • 3.1

Först

ASP.NET använda grundläggande MVC-lokaliseringsfunktioner för att växla mellan flera språk för att visa dem.

Skapa en resursfil för översatt text

Skapa en mapp för att lagra resursfilerna (Resx) som hanterar texten. Platsen är var som helst, men lämna den direkt under rutten. Den här sökvägen påverkar också senare inställningar.

Högerklicka på projektet och välj Lägg till eller Ny mapp.

image

Lämna mappnamnsresurserna. Du kan också ange det här mappnamnet godtyckligt, men du kan ange det här mappnamnet i senare inställningar.

image

Skapa sedan en resursfil för att skriva text för varje språk.

Högerklicka på mappen Resurser och välj Lägg till eller Nytt objekt.

image

Markera resursfilen (.resx). Filnamnet kan vara godtyckligt, men det måste matcha det namn du anger senare. För nu, låt oss säga SharedResource.resx.

image

När du har skapat .resx-filen dubbelklickar du för att öppna den och skriver sedan namnet som identifierar texten och den text som du vill visa. Filen SharedResource.resx är den fil som ska användas om språket inte finns. Jag skrev in den på japanska här. Om du vill att andra språk, till exempel engelska, ska vara standard anger du dem på det språket.

Här anger vi Hej och Adjö som prover. Observera att det är skiftlägeskänsligt.

image

Fortsätt att skapa resursfiler för andra språk. Om du vill identifiera språket anger du filnamnet, till exempel SharedResource.<Culture Code>.resx. Du kan ange en eller båda kombinationerna av ISO 639 och ISO 3166 för kulturkoden. Supportkoden kan komma att ändras då och då, så klassen CultureInfo på Microsofts webbplats Se sidan.

Den här gången förbereds en (engelska) och es (spanska). Japanska är inte tillgängligt eftersom det är standard.

image

Ange den översatta texten med tangenterna i samma läge för varje fil.

image

image

Därefter har du en fil som bara definierar klasserna. Du skapar detta med samma namn som den resursfil som du just skapade.

I själva verket, jag bryr mig inte vad namnet på kodfilen i sig är att du bara behöver matcha namnet på klassen inuti, men lämna det samma så att det är lätt att förstå. Det spelar ingen roll var du vill skriva koden.

image

Gör namnområdet till projektets rot och skapa en tom klass.

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

Åtgärda varje program

Startup.cs

Fixa Startup.cs. Beskriv metoden ConfigureServices enligt följande:

Tjänster. AddMvc(). Om det finns en AddViewLocalization-metod är den text som översätts av både vysidan och styrenhetssidan Jag är säker på att jag kan få det, men Som också finns på den officiella webbplatsen tjänster. Det är inga problem med att anropa AddLocalization-metoden tillsammans.

Alternativ. ResourcesPath anger sökvägen till mappen där filen Resx finns. Om båda anges, tjänster. AddMvc(). Metoden AddViewLocalization har företräde.

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

Ändra sedan metoden Konfigurera för Startup.cs. Om du bara vill läsa resursfilen behöver du den inte. Kod som krävs för att användaren ska kunna ange ett språk godtyckligt.

Vi använder de funktioner som är inbyggda ASP.NET Core MVC som standard. Följande kod beskriver "frågesträngen", "cookie" och "Accept-Language HTTP-header" beroende på användarens miljö. Du kan växla mellan visningsspråk i något av dem. Vi ses senare hur du kontrollerar själva operationen.

Det omkopplingsbara språket anges här i matrisen (stödsKulturer). Jag angav ja som standardspråk, men jag har inte skapat ja-filen den här gången. SharedResource.resx används om ett annat språk än en, es anges.

Du kan skilja användargränssnittet från de språk du stöder, men det finns inte mycket nytta av att separera det. Du har samma språk.

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

  // 省略
}

Controllers\HomeController.cs

Controllers\HomeController.cs fil. För att få ett lokaliserat språk på kontrollantsidan tas iStringLocalizer emot i konstruktorn. SharedResource måste ha samma namn som den klass som du skapade tidigare. Texten skickas till importören av den mottagna localizern genom att skicka nyckelsträngen som anges i resursfilen. kan hämtas. Textens språk bestäms utifrån den kultur som efterfrågas.

Förresten, förutom IStringLocalizer, det finns också en IHtmlLocalizer som kan få HTML som det ä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();
  }

  // 省略
}

Vyer\_ViewImports.cshtml

Views\_ViewImports.cshtml-fil. Om du vill använda en lokaliserare på vysidan måste du injicera IHtmlLocalizer. Om du beskriver det på följande sätt för nu, är det OK. SharedResource måste också ha samma namn som resursfilen och klassen som du skapade tidigare.

IHtmlLocalizer finns i namnområdet Microsoft.AspNetCore.Mvc.Localization, så jag definierar detta som att använda.

Om du bara vill använda localizern vid en viss punkt kan du inkludera följande kod i en separat vyfil. Om du skriver det i en _ViewImports.cshtml-fil kan du automatiskt använda den i alla vyfiler.

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

Vyer\Start\Index.cshtml

Views\Home\Index.cshtml-fil. Texten som erhålls på kontrollledarens sida och den text som erhålls direkt på vysidan visas. Den vy-side localizer får också texten genom att ange en nyckelsträng för indexeraren.

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

Kontrollera åtgärden

Frågesträngen

Du kan växla visningsspråk genom att ange en kulturkod i frågesträngen för URL:en. Formatet är ?culture=<culture code>. Om du vill skilja det från användargränssnittet blir det ?culture=<culture code>&ui-culture=<culture code>.

Om du inte anger något: Om inget anges används SharedResource.resx. (I själva verket har en annan dom tillämpats ...)

image

Det mönster som angetts för ?culture=en. Visningsspråket är engelska.

image

Det mönster som anges för ?culture=es. Visningsspråket är spanska.

image

Mönstret som anges för ?culture=ja. Ursprungligen används filen SharedResource.ja.resx. SharedResource.resx används eftersom det inte finns.

image

Försök att ange ett språk som inte finns. SharedResource.resx används eftersom det inte finns någon motsvarande fil här.

image

Cookies

Cookies kan byta visningsspråk. Normalt publiceras från serversidan, men den här gången ska jag försöka registrera cookies direkt i webbläsarens funktion.

Eftersom varje webbläsare har ett utvecklarverktyg använder du det för att registrera cookies. I bilden nedan kan du trycka på F12 på Edge för att visa utvecklarverktygen.

Namnet på motsvarande cookie är . AspNetCore.Culture och det värde som anger språket är Ange i form av c=<kulturkod>|uic=<kulturkod>. För cookies måste du också ange ui-koden. När du har registrerat din cookie uppdaterar du din webbläsarsida för att uppdatera den. En cookie skickas till servern så att servern hämtar det angivna språket.

I bilden nedan kan du ange c=en|uic=en för att visa engelska.

image

typ c=es|uic=es för att visa spanska.

image

HTTP-huvud för acceptera språk

HTTP-huvudet för acceptera språk kontrollerar den huvudinformation som begärs från webbläsaren till servern. Det är förmågan att byta språk i enlighet med detta.

Du kan skicka alla accept-språk i webbläsarens inställningar, men som standard kan du matcha os-språkinställningarna. Acceptera-Språk skickas nu. (Huruvida det faktiskt skickas beror på operativsystemet och webbläsaren.) Språket initieras i webbläsaren för operativsystemets språk, men det kan vara korrekt.)

Som visas i bilden nedan kan du till exempel öppna sidan i webbläsaren i det engelskspråkiga operativsystemet och skicka information, så att du automatiskt kan SharedResource.en.resx är valt att visa engelska.

image

Om du försöker ange ett språk som inte finns i frågesträngen bör du från början använda SharedResource.resx. Acceptera-språk visar engelska eftersom en finns.

image

Om ja anges i frågesträngen har frågesträngen företräde och japanska visas.

image

Sammanfattning

Här försökte jag genomföra flerspråkiga byte på det enklaste sättet. Om du vill växla språk så att de matchar användarens miljö använder du HTTP-huvudet acceptera språk som standardvisningsspråk. Om användaren väljer något språk är det en bra idé att lägga till cookies eller lägga till (eller ange direkt) i frågesträngen.