ASP.NET mehrsprachiges Switching mit integrierten MVC-Kernfunktionen

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Umgebung

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

Zunächst

ASP.NET verwenden Sie die zentralen MVC-Lokalisierungsfunktionen, um zwischen mehreren Sprachen zu wechseln, um sie anzuzeigen.

Erstellen einer Ressourcendatei für übersetzten Text

Erstellen Sie einen Ordner zum Speichern der Ressourcendateien (Resx), die den Text verwalten. Die Lage ist überall, aber lassen Sie es direkt unter der Route. Dieser Pfad wirkt sich auch auf spätere Einstellungen aus.

Klicken Sie mit der rechten Maustaste auf das Projekt, und wählen Sie Hinzufügen oder Neuer Ordner aus.

image

Lassen Sie die Ordnernamenressourcen. Sie können diesen Ordnernamen auch beliebig festlegen, aber Sie können diesen Ordnernamen in späteren Einstellungen angeben.

image

Erstellen Sie dann eine Ressourcendatei, um Text für jede Sprache einzugeben.

Klicken Sie mit der rechten Maustaste auf den Ordner Ressourcen, und wählen Sie Hinzufügen oder Neues Element aus.

image

Wählen Sie die Ressourcendatei (.resx) aus. Der Dateiname kann beliebiger sein, muss jedoch mit dem Namen übereinstimmen, den Sie später angeben. Sagen wir jetzt SharedResource.resx.

image

Nachdem Sie die .resx-Datei erstellt haben, doppelklicken Sie, um sie zu öffnen, und geben Sie dann den Namen ein, der den Text und den Text identifiziert, den Sie tatsächlich anzeigen möchten. Die Datei SharedResource.resx ist die Datei, die verwendet werden soll, wenn die Sprache nicht vorhanden ist. Ich habe es hier auf Japanisch eingegeben. Wenn andere Sprachen, z. B. Englisch, als Standard verwendet werden sollen, geben Sie diese in dieser Sprache ein.

Hier geben wir Hello und Goodbye als Beispiele ein. Beachten Sie, dass die Groß-/Kleinschreibung beachtet wird.

image

Erstellen Sie weiterhin Ressourcendateien für andere Sprachen. Um die Sprache zu identifizieren, geben Sie den Dateinamen an, z. B. SharedResource.<Culture Code>.resx. Sie können eine oder beide Kombinationen von ISO 639 und ISO 3166 für den Kulturcode angeben. Supportcode kann sich von Zeit zu Zeit ändern, sodass sich die CultureInfo-Klasse auf der Microsoft-Website ändert. Bitte beachten Sie die Seite.

Dieses Mal werden en (Englisch) und es (Spanisch) vorbereitet. Japanisch ist nicht verfügbar, da es die Standardeinstellung ist.

image

Geben Sie den übersetzten Text mit den Schlüsseln im gleichen Zustand für jede Datei ein.

image

image

Als Nächstes haben Sie eine Datei, die nur die Klassen definiert. Sie erstellen diese mit demselben Namen wie die soeben erstellte Ressourcendatei.

In der Tat ist es mir egal, was der Name der Codedatei selbst ist, weil Sie nur mit dem Namen der Klasse im Inneren übereinstimmen müssen, aber lassen Sie es das gleiche, so dass es leicht zu verstehen ist. Es spielt keine Rolle, wo Sie den Code schreiben möchten.

image

Machen Sie den Namespace zum Stamm des Projekts, und erstellen Sie eine leere Klasse.

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

Fix jedes Programm

Startup.cs

Fix Startup.cs. Beschreiben Sie die ConfigureServices-Methode wie folgt:

Dienstleistungen. AddMvc(). Wenn es eine AddViewLocalization-Methode gibt, wird der Text, der sowohl von der Ansichtsseite als auch von der Controllerseite übersetzt wird, Ich bin sicher, dass ich es bekommen kann, aber Wie auch auf der offiziellen Website Dienstleistungen. Es ist kein Problem, die AddLocalization-Methode zusammen aufzurufen.

Optionen. ResourcesPath gibt den Pfad des Ordners an, in dem sich die Resx-Datei befindet. Wenn beide angegeben sind, dienste. AddMvc(). Die AddViewLocalization-Methode hat Vorrang.

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

Ändern Sie dann die Configure-Methode für Startup.cs. Wenn Sie nur die Ressourcendatei lesen möchten, benötigen Sie sie nicht. Code, der erforderlich ist, damit der Benutzer eine Sprache willkürlich angeben kann.

Wir verwenden die in ASP.NET Core MVC integrierten Funktionen standardmäßig. Der folgende Code beschreibt die "Abfragezeichenfolge", "Cookie" und "Accept-Language HTTP-Header" je nach Umgebung des Benutzers. Sie können in einer von ihnen zwischen Anzeigesprachen wechseln. Wir werden Sie später sehen, wie Sie den tatsächlichen Vorgang überprüfen.

Die schaltbare Sprache wird hier im Array (supportedCultures) angegeben. Ich habe ja als Standardsprache angegeben, aber ich habe die ja-Datei dieses Mal nicht erstellt. SharedResource.resx wird verwendet, wenn eine andere Sprache als en, es angegeben wird.

Sie können die Benutzeroberfläche von den unterstützten Sprachen trennen, aber es bringt nicht viel, sie zu trennen. Sie haben die gleiche Sprache.

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

  // 省略
}

Controller-HomeController.cs

Controllers-HomeController.cs-Datei. Um eine lokalisierte Sprache auf der Controllerseite zu erhalten, wird iStringLocalizer im Konstruktor empfangen. SharedResource muss denselben Namen wie die zuvor erstellte Klasse haben. Der Text wird an den Importer des empfangenen Lokalisierers übergeben, indem die in der Ressourcendatei eingegebene Schlüsselzeichenfolge übergeben wird. kann abgerufen werden. Die Sprache des Textes wird auf der Grundlage der gewünschten Kultur bestimmt.

Übrigens gibt es neben IStringLocalizer auch einen IHtmlLocalizer, der HTML so abrufen kann, wie er ist.

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

  // 省略
}

Ansichten:_ViewImports.cshtml

Views-_ViewImports.cshtml-Datei. Um einen Lokalisierer auf der Ansichtsseite zu verwenden, müssen Sie IHtmlLocalizer injizieren. Wenn Sie es für den Moment wie folgt beschreiben, ist es OK. Außerdem muss SharedResource denselben Namen wie die zuvor erstellte Ressourcendatei und -klasse haben.

IHtmlLocalizer befindet sich im Microsoft.AspNetCore.Mvc.Localization-Namespace, daher definiere ich dies als Verwendung.

Wenn Sie den Localizer nur an einem bestimmten Punkt verwenden möchten, können Sie den folgenden Code in eine separate Ansichtsdatei aufnehmen. Wenn Sie es in eine _ViewImports.cshtml-Datei schreiben, können Sie sie automatisch in allen Ansichtsdateien verwenden.

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

Ansichten, Startseite, Index.cshtml

Views-Home-Datei,Index.cshtml. Der auf der Controllerseite erhaltene Text und der direkt auf der Ansichtsseite erhaltene Text werden angezeigt. Der ansichtsseitige Lokalisierer ruft den Text auch ab, indem er eine Schlüsselzeichenfolge für den Indexer angibt.

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

Prüfvorgang

Abfragezeichenfolge

Sie können die Anzeigesprache wechseln, indem Sie einen Kulturcode in der Abfragezeichenfolge der URL angeben. Das Format ist ?culture=<culture code>. Wenn Sie sie von der Benutzeroberfläche trennen möchten, handelt es sich um ?culture=<culture code>&ui-culture=<culture code>.

Wenn Sie nichts angeben: Wenn nicht angegeben, wird SharedResource.resx verwendet. (In der Tat wurde ein anderes Urteil angewandt...)

image

Das für ?culture=de angegebene Muster. Die Anzeigesprache ist Englisch.

image

Das für ?culture=es angegebene Muster. Die Anzeigesprache ist Spanisch.

image

Das für ?culture=ja angegebene Muster. Ursprünglich wurde die Datei SharedResource.ja.resx verwendet. SharedResource.resx wird verwendet, da es nicht vorhanden ist.

image

Versuchen Sie, eine Sprache anzugeben, die nicht vorhanden ist. SharedResource.resx wird verwendet, da hier keine entsprechende Datei vorhanden ist.

image

Cookies

Cookies können die Anzeigesprache wechseln. Normalerweise von der Serverseite veröffentlicht, aber dieses Mal werde ich versuchen, Cookies direkt in der Browser-Funktion zu registrieren.

Da jeder Webbrowser über ein Entwicklertool verfügt, verwenden Sie es zum Registrieren von Cookies. In der folgenden Abbildung können Sie F12 auf Edge drücken, um die Entwicklertools anzuzeigen.

Der Name des entsprechenden Cookies lautet . AspNetCore.Culture und der Wert, der die Sprache angibt, ist Geben Sie in Form von c=<culture code>|uic=<culture code>ein. Für Cookies müssen Sie auch den ui-Code eingeben. Nachdem Sie Ihr Cookie registriert haben, aktualisieren Sie Ihre Webbrowserseite, um es zu aktualisieren. Ein Cookie wird an den Server gesendet, sodass der Server die angegebene Sprache abruft.

In der Abbildung unten können Sie c=en|uic=en eingeben, um Englisch anzuzeigen.

image

typ c=es|uic=es, um Spanisch anzuzeigen.

image

Accept-Language HTTP-Header

Der HTTP-Header Accept-Language überprüft die vom Webbrowser an den Server angeforderten Headerinformationen. Es ist die Fähigkeit, die Sprachen entsprechend zu wechseln.

Sie können jede Accept-Language in Den Einstellungen Ihres Webbrowsers senden, aber standardmäßig können Sie die os-Spracheinstellungen anpassen. Accept-Language wird jetzt gesendet. (Ob es tatsächlich gesendet wird, hängt vom Betriebssystem und Webbrowser ab.) Die Sprache wird im Webbrowser für die Sprache des Betriebssystems initialisiert, kann jedoch korrekt sein.)

So können Sie z. B., wie in der Abbildung unten gezeigt, die Seite im Webbrowser des englischsprachigen Betriebssystems öffnen und en-Informationen senden, sodass Sie automatisch SharedResource.en.resx ist ausgewählt, um Englisch anzuzeigen.

image

Wenn Sie versuchen, eine Sprache anzugeben, die in der Abfragezeichenfolge nicht vorhanden ist, sollten Sie ursprünglich SharedResource.resx verwenden. Accept-Language zeigt Englisch an, weil en vorhanden ist.

image

Wenn ja in der Abfragezeichenfolge angegeben ist, hat die Abfragezeichenfolge Vorrang, und Japanisch wird angezeigt.

image

Zusammenfassung

Hier habe ich versucht, die mehrsprachige Schaltung auf einfachste Weise umzusetzen. Um die Sprache so zu wechseln, dass sie der Umgebung des Benutzers entspricht, verwenden Sie den HTTP-Header Accept-Language als Standardanzeigesprache. Wenn der Benutzer eine beliebige Sprache wählt, ist es eine gute Idee, Cookies hinzuzufügen oder (oder direkt) der Abfragezeichenfolge einzugeben.