ASP.NET wielojęzyczne przełączanie z wbudowanymi funkcjami MVC

Strona zaktualizowana :
Data utworzenia strony :

Środowiska

Visual Studio
  • Visual Studio 2019
Rdzeń ASP.NET
  • 3.0
  • 3.1

Na początku

ASP.NET używać podstawowych funkcji lokalizacji MVC, aby przełączać się między wieloma językami, aby je wyświetlić.

Tworzenie pliku zasobów dla przetłumaczonego tekstu

Utwórz folder do przechowywania plików zasobów (Resx), które zarządzają tekstem. Lokalizacja jest wszędzie, ale pozostawić go bezpośrednio pod trasą. Ta ścieżka wpływa również na późniejsze ustawienia.

Kliknij prawym przyciskiem myszy projekt i wybierz polecenie Dodaj lub Nowy folder.

image

Pozostaw zasoby nazwy folderu. Można również ustawić tę nazwę folderu dowolnie, ale tę nazwę folderu można określić w późniejszych ustawieniach.

image

Następnie utwórz plik zasobów, aby wprowadzić tekst dla każdego języka.

Kliknij prawym przyciskiem myszy folder Zasoby i wybierz polecenie Dodaj lub Nowy element.

image

Wybierz plik zasobu (.resx). Nazwa pliku może być dowolna, ale musi być zgodna z nazwą określoną później. Na razie powiedzmy SharedResource.resx.

image

Po utworzeniu pliku .resx kliknij dwukrotnie, aby go otworzyć, a następnie wpisz nazwę identyfikującą tekst i tekst, który ma być faktycznie wyświetlany. Plik SharedResource.resx jest plikiem, który ma być używany, jeśli język nie istnieje. Wszedłem tutaj po japońsku. Jeśli chcesz, aby inne języki, takie jak angielski, były domyślne, wprowadź je w tym języku.

Tutaj wprowadzamy Hello i Goodbye jako próbki. Należy zauważyć, że wielkość liter jest rozróżniana.

image

Kontynuuj tworzenie plików zasobów dla innych języków. Aby zidentyfikować język, określ nazwę pliku, taką jak SharedResource.<Culture Code>.resx. Można określić jedną lub obie kombinacje ISO 639 i ISO 3166 dla kodu kultury. Kod pomocy technicznej może się od czasu do czasu zmieniać, więc klasa CultureInfo w witrynie firmy Microsoft Prosimy o zapoznanie się ze stroną.

Tym razem, pl (angielski) i es (hiszpański) są przygotowane. Język japoński jest niedostępny, ponieważ jest wartością domyślną.

image

Wprowadź przetłumaczony tekst z kluczami w tym samym stanie dla każdego pliku.

image

image

Następnie będziesz mieć plik, który definiuje tylko klasy. Utwórz to o takiej samej nazwie jak plik zasobu, który właśnie utworzono.

W rzeczywistości, nie obchodzi mnie, jaka jest nazwa samego pliku kodu, ponieważ musisz tylko dopasować nazwę klasy w środku, ale zostaw to samo, aby było łatwe do zrozumienia. Nie ma znaczenia, gdzie chcesz napisać kod.

image

Spraw, aby obszar nazw był głównym elementem projektu i utwórz pustą klasę.

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

Naprawianie każdego programu

Startup.cs

Napraw Startup.cs. Opis metody ConfigureServices w następujący sposób:

Usług. AddMvc(). Jeśli istnieje metoda AddViewLocalization, tekst przetłumaczony zarówno po stronie widoku, jak i po stronie kontrolera jest Jestem pewien, że mogę go zdobyć, ale Jak również na oficjalnej stronie internetowej usług. Nie ma problemu z wywołaniem AddLocalization metody razem.

Opcje. ResourcesPath określa ścieżkę folderu, w którym znajduje się plik Resx. Jeśli oba są określone, usługi. AddMvc(). AddViewLocalization Metoda ma pierwszeństwo.

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

Następnie zmodyfikuj metodę Configure dla Startup.cs. Jeśli chcesz tylko odczytać plik zasobu, nie potrzebujesz go. Kod, który jest wymagany, aby umożliwić użytkownikowi dowolnie określić język.

Używamy funkcji wbudowanych w ASP.NET Core MVC w standardzie. Poniższy kod opisuje "ciąg zapytania", "plik cookie" i "Accept-Language HTTP header" w zależności od środowiska użytkownika. W jednym z nich można przełączać się między językami wyświetlania. Do zobaczenia później, jak sprawdzić rzeczywistą operację.

Język przełączania jest określony w tym miejscu w tablicy (obsługiwaneKultury). Określiłem ja jako domyślny język, ale tym razem nie utworzyłem pliku ja. SharedResource.resx jest używany, jeśli określony jest język inny niż en, es.

Interfejs użytkownika można oddzielić od obsługiwanych języków, ale oddzielenie go nie ma zbyt wiele korzyści. Masz ten sam język.

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

  // 省略
}

Kontrolery\HomeController.cs

Plik Controllers\HomeController.cs. Aby uzyskać zlokalizowany język po stronie kontrolera, iStringLocalizer jest odbierany w konstruktorze. SharedResource musi mieć taką samą nazwę jak klasa, która została utworzona wcześniej. Tekst jest przekazywany do importera odebranego lokalizatora, przekazując ciąg klucza wprowadzony w pliku zasobu. można pobrać. Język tekstu jest określany na podstawie żądanej kultury.

Nawiasem mówiąc, oprócz IStringLocalizer, istnieje również IHtmlLocalizer, który może uzyskać HTML, jak to jest.

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

  // 省略
}

Widoki\_ViewImports.cshtml

Plik Views\_ViewImports.cshtml. Aby użyć lokalizatora po stronie widoku, należy wstrzyknąć IHtmlLocalizer. Jeśli opiszesz to w następujący sposób na razie, jest OK. Ponadto SharedResource musi mieć taką samą nazwę jak plik zasobu i klasy utworzone wcześniej.

IHtmlLocalizer znajduje się w obszarze nazw Microsoft.AspNetCore.Mvc.Localization, więc zdefiniuję to jako użycie.

Jeśli chcesz używać tylko localizer w pewnym momencie, można dołączyć następujący kod w pliku widoku oddzielne. Jeśli zapiszesz go w pliku _ViewImports.cshtml, automatycznie będziesz mógł go używać we wszystkich plikach widoku.

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

Widoki\Strona główna\Indeks.cshtml

Pliki Views\Home\Index.cshtml. Tekst uzyskany po stronie kontrolera i tekst uzyskany bezpośrednio po stronie widoku są wyświetlane odpowiednio. Lokalizator po stronie widoku pobiera również tekst, określając ciąg klucza dla indeksatora.

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

Sprawdź działanie

Ciąg zapytania

Język wyświetlania można przełączyć, określając kod kultury w ciągu zapytania adresu URL. Format to ?culture=<culture code>. Jeśli chcesz oddzielić go od interfejsu użytkownika, będzie to kod ?culture=<culture code>&ui-culture=<culture code>.

Jeśli nic nie określisz: Jeśli nie zostanie określony, SharedResource.resx jest używany. (W rzeczywistości zastosowano inny wyrok...)

image

Wzorzec określony dla ?culture=en. Językiem wyświetlania jest angielski.

image

Wzorzec określony dla ?culture=es. Językiem wyświetlania jest hiszpański.

image

Wzorzec określony dla ?culture=ja. Pierwotnie używany jest plik SharedResource.ja.resx. SharedResource.resx jest używany, ponieważ nie istnieje.

image

Spróbuj określić język, który nie istnieje. SharedResource.resx jest używany, ponieważ nie ma odpowiedniego pliku w tym miejscu.

image

Pliki cookie

Pliki cookie mogą zmieniać język wyświetlania. Normalnie publikowane od strony serwera, ale tym razem postaram się zarejestrować pliki cookie bezpośrednio w funkcji przeglądarki.

Ponieważ każda przeglądarka sieci Web ma narzędzie programistyczne, służy do rejestrowania plików cookie. Na poniższym rysunku możesz nacisnąć klawisz F12 na krawędzi, aby wyświetlić narzędzia programistyczne.

Nazwa odpowiedniego pliku cookie to . AspNetCore.Culture, a wartość określająca język jest Wprowadź kod c=<culture>|uic=<kod kultury>. W przypadku plików cookie należy również wprowadzić kod interfejsu użytkownika. Po zarejestrowaniu pliku cookie odśwież stronę przeglądarki internetowej, aby go odświeżyć. Plik cookie jest wysyłany do serwera, dzięki czemu serwer będzie pobierał określony język.

Na poniższym rysunku można wprowadzić c=en|uic=en, aby wyświetlić język angielski.

image

typ c=es|uic=es, aby wyświetlić język hiszpański.

image

Nagłówek HTTP w języku akceptującym

Nagłówek HTTP w języku akceptującym sprawdza informacje nagłówka wymagane od przeglądarki sieci Web do serwera. Jest to możliwość odpowiedniego przełączania języków.

W ustawieniach przeglądarki sieci Web można wysyłać dowolną opcję Akceptowanie języka, ale domyślnie można dopasować ustawienia języka systemu operacyjnego. Język akceptujący jest teraz wysyłany. (To, czy jest faktycznie wysyłane, zależy od systemu operacyjnego i przeglądarki internetowej). Język jest inicjowany w przeglądarce sieci Web dla języka systemu operacyjnego, ale może być poprawny.)

Tak więc, na przykład, jak pokazano na poniższym rysunku, możesz otworzyć stronę w przeglądarce sieci Web systemu operacyjnego w języku angielskim i wysłać informacje en, dzięki czemu można automatycznie SharedResource.en.resx jest wybrany do wyświetlania w języku angielskim.

image

Jeśli spróbujesz określić język, który nie istnieje w ciągu zapytania, należy pierwotnie użyć SharedResource.resx. Accept-Language wyświetla angielski, ponieważ en istnieje.

image

Jeśli ja jest określony w ciągu zapytania, ciąg zapytania ma pierwszeństwo i japoński jest wyświetlany.

image

Krótki opis

Tutaj próbowałem wdrożyć wielojęzyczne przełączanie w najprostszy sposób. Aby przełączyć języki w celu dopasowania do środowiska użytkownika, użyj nagłówka HTTP w języku akceptującym jako domyślnego języka wyświetlania. Jeśli użytkownik wybierze dowolny język, warto dodać pliki cookie lub dodać (lub wprowadzić bezpośrednio) ciąg zapytania.