ASP.NET meertalig schakelen met de ingebouwde MVC-kernfuncties

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Milieu

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

In eerste instantie

ASP.NET kernmvc-lokalisatiefuncties gebruiken om tussen meerdere talen te schakelen om ze weer te geven.

Een bronbestand maken voor vertaalde tekst

Maak een map om de bronbestanden (Resx) op te slaan die de tekst beheren. De locatie is overal, maar laat het direct onder de route. Dit pad is ook van invloed op latere instellingen.

Klik met de rechtermuisknop op het project en selecteer Toevoegen of Nieuwe map.

image

Laat de mapnaambronnen achter. U deze mapnaam ook willekeurig instellen, maar u deze mapnaam in latere instellingen opgeven.

image

Maak vervolgens een bronbestand om tekst voor elke taal in te voeren.

Klik met de rechtermuisknop op de map Resources en selecteer Toevoegen of Nieuw item.

image

Selecteer het bronbestand (.resx). De bestandsnaam kan willekeurig zijn, maar moet overeenkomen met de naam die u later opgeeft. Voor nu, laten we zeggen SharedResource.resx.

image

Nadat u het .resx-bestand hebt gemaakt, dubbelklikt u om het bestand te openen en typt u de naam die de tekst en de tekst identificeert die u daadwerkelijk wilt weergeven. Het bestand SharedResource.resx is het bestand dat moet worden gebruikt als de taal niet bestaat. Ik heb het hier in het Japans ingevoerd. Als u wilt dat andere talen, zoals Engels, de standaardinstelling zijn, voert u deze in die taal in.

Hier gaan we Hello and Goodbye in als samples. Houd er rekening mee dat het hoofdlettergevoelig is.

image

Doorgaan met het maken van bronbestanden voor andere talen. Als u de taal wilt identificeren, geeft u de bestandsnaam op, zoals SharedResource.<Cultuurcode>.resx. U een of beide combinaties van ISO 639 en ISO 3166 opgeven voor de cultuurcode. Ondersteuningscode kan van tijd tot tijd worden gewijzigd, dus de klasse CultureInfo op de Microsoft-site Raadpleeg de pagina.

Deze keer worden en (Engels) en es (Spaans) voorbereid. Japans is niet beschikbaar omdat het de standaardinstelling is.

image

Voer de vertaalde tekst in met de toetsen in dezelfde status voor elk bestand.

image

image

Vervolgens heb je een bestand dat alleen de klassen definieert. U maakt dit met dezelfde naam als het bronbestand dat u zojuist hebt gemaakt.

In feite kan het me niet schelen wat de naam van de code bestand zelf is, omdat je alleen maar aan de naam van de klasse binnen wedstrijd, maar laat het hetzelfde, zodat het gemakkelijk te begrijpen. Het maakt niet uit waar je de code wilt schrijven.

image

Maak van de naamruimte de hoofdmap van het project en maak een lege klasse.

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

Elk programma oplossen

Startup.cs

Repareer Startup.cs. Beschrijf de methode ConfigureServices als volgt:

Diensten. AddMvc(). Als er een methode AddViewLocalisatie is, wordt de tekst vertaald door zowel de weergavezijde als de controllerzijde Ik weet zeker dat ik het kan krijgen, maar. Zoals ook op de officiële website diensten. Er is geen probleem met het samen aanroepen van de addlocalisatiemethode.

Opties. ResourcesPath geeft het pad op van de map waarin het Resx-bestand zich bevindt. Als beide zijn opgegeven, services. AddMvc(). De methode AddViewLocalization heeft voorrang.

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

Wijzig vervolgens de methode Configureren voor Startup.cs. Als u alleen het bronbestand wilt lezen, hebt u het niet nodig. Code die nodig is om de gebruiker in staat te stellen een taal willekeurig op te geven.

We gebruiken standaard de functies die zijn ingebouwd in ASP.NET Core MVC. De volgende code beschrijft de 'querytekenreeks', 'cookie' en 'Http-header accepteren' afhankelijk van de omgeving van de gebruiker. U schakelen tussen weergavetalen in een van deze talen. We zien je later hoe je de werkelijke operatie controleren.

De schakelbare taal wordt hier in de array (ondersteundCulturen) gespecificeerd. Ik heb ja opgegeven als de standaardtaal, maar ik heb het ja-bestand deze keer niet gemaakt. SharedResource.resx wordt gebruikt als een andere taal dan en, es is opgegeven.

U de gebruikersinterface scheiden van de talen die u ondersteunt, maar het is niet veel voordeel om deze te scheiden. Je hebt dezelfde taal.

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-bestand. Om een gelokaliseerde taal aan de controllerzijde te krijgen, wordt iStringLocalizer ontvangen in de constructor. SharedResource moet dezelfde naam hebben als de klasse die u eerder hebt gemaakt. De tekst wordt doorgegeven aan de importeur van de ontvangen lokalisator door de sleuteltekenreeks door te geven die in het bronbestand is ingevoerd. kan worden opgehaald. De taal van de tekst wordt bepaald op basis van de cultuur die wordt gevraagd.

By the way, in aanvulling op IStringLocalizer, is er ook een IHtmlLocalizer die HTML kan krijgen zoals het is.

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

  // 省略
}

Weergaven\_ViewImports.cshtml

Views\_ViewImports.cshtml-bestand. Als u een lokalisator aan de weergavezijde wilt gebruiken, moet u IHtmlLocalizer injecteren. Als u het als volgt voor nu beschrijft, is het o.k. SharedResource moet ook dezelfde naam hebben als het bronbestand en de klasse die u eerder hebt gemaakt.

IHtmlLocalizer bevindt zich in de naamruimte Microsoft.AspNetCore.Mvc.Localization, dus ik definieer dit als gebruiken.

Als u de lokalisator alleen op een bepaald punt wilt gebruiken, u de volgende code opnemen in een afzonderlijk weergavebestand. Als u het in een bestand _ViewImports.cshtml schrijft, u het automatisch gebruiken in alle weergavebestanden.

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

Weergaven\Home\Index.cshtml

Weergaven\Home\Index.cshtml-bestand. De tekst verkregen aan de controller zijde en de tekst verkregen direct aan de zichtzijde worden weergegeven. De localisator aan de weergavezijde krijgt de tekst ook door een toetstekenreeks voor de indexer op te geven.

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

Bewerking controleren

Queryreeks

U de weergavetaal wisselen door een cultuurcode op te geven in de queryreeks van de URL. Het formaat is ?culture=<culture code>. Als u het wilt scheiden van de gebruikersinterface, is het ?culture=<culture code>&ui-culture=<culture code>.

Als u niets opgeeft: Als dit niet is opgegeven, wordt SharedResource.resx gebruikt. (In feite is een ander arrest toegepast...)

image

Het patroon gespecificeerd voor ?culture=nl. De weergavetaal is Engels.

image

Het patroon gespecificeerd voor ?cultuur=es. De weergavetaal is Spaans.

image

Het patroon gespecificeerd voor ?culture=ja. Oorspronkelijk wordt het Bestand SharedResource.ja.resx gebruikt. SharedResource.resx wordt gebruikt omdat het niet bestaat.

image

Probeer een taal op te geven die niet bestaat. SharedResource.resx wordt gebruikt omdat er hier geen bijbehorend bestand is.

image

Cookies

Cookies kunnen de weergavetaal veranderen. Normaal gesproken gepubliceerd vanaf de server kant, maar deze keer zal ik proberen om cookies direct te registreren in de browser functie.

Omdat elke webbrowser een ontwikkelaarstool heeft, gebruikt u deze om cookies te registreren. In de onderstaande afbeelding u op F12 op Edge drukken om de hulpprogramma's voor ontwikkelaars weer te geven.

De naam van de bijbehorende cookie is . AspNetCore.Culture en de waarde die de taal aangeeft, is Voer de vorm in van c=<cultuurcode>|uic=<cultuurcode>. Voor cookies moet u ook de ui-code invoeren. Zodra u uw cookie hebt geregistreerd, vernieuwt u uw webbrowserpagina om deze te vernieuwen. Er wordt een cookie naar de server verzonden, zodat de server de opgegeven taal ophaalt.

In de onderstaande afbeelding u c=en|uic=en invoeren om Engels weer te geven.

image

c=es|uic=es typen om Spaans weer te geven.

image

HTTP-header in accepteren

De HTTP-header Accepteren controleert de headergegevens die van de webbrowser naar de server worden gevraagd. Het is de mogelijkheid om dienovereenkomstig van taal te wisselen.

U elke accepttaal verzenden in de instellingen van uw webbrowser, maar standaard u de taalinstellingen van het besturingssysteem aanpassen. Accepterentaal wordt nu verzonden. (Of het daadwerkelijk wordt verzonden, hangt af van het besturingssysteem en de webbrowser.) De taal wordt geïnitialiseerd in de webbrowser voor de taal van het besturingssysteem, maar het kan juist zijn.)

Zo u, bijvoorbeeld, zoals in de onderstaande afbeelding wordt weergegeven, de pagina openen in de webbrowser van het Engelstalige besturingssysteem en informatie verzenden, zodat u automatisch informatie verzenden SharedResource.nl.resx is geselecteerd om Engels weer te geven.

image

Als u een taal probeert op te geven die niet in de querytekenreeks voorkomt, moet u sharedresource.resx oorspronkelijk gebruiken. In accepteren-taal wordt Engels weergegeven omdat en bestaat.

image

Als ja is opgegeven in de querytekenreeks, heeft de querytekenreeks voorrang en wordt het Japans weergegeven.

image

Samenvatting

Hier heb ik geprobeerd om de meertalige omschakeling op de gemakkelijkste manier te implementeren. Als u van taal wilt wisselen die overeenkomt met de omgeving van de gebruiker, gebruikt u de HTTP-koptekst accepteren als standaardweergavetaal. Als de gebruiker een taal kiest, is het een goed idee om cookies toe te voegen of de querytekenreeks toe te voegen (of rechtstreeks in te voeren).