ASP.NET wielojęzyczne przełączanie z wbudowanymi funkcjami MVC
Ś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.
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.
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.
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.
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.
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ą.
Wprowadź przetłumaczony tekst z kluczami w tym samym stanie dla każdego pliku.
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.
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
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
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...)
Wzorzec określony dla ?culture=en. Językiem wyświetlania jest angielski.
Wzorzec określony dla ?culture=es. Językiem wyświetlania jest hiszpański.
Wzorzec określony dla ?culture=ja. Pierwotnie używany jest plik SharedResource.ja.resx. SharedResource.resx jest używany, ponieważ nie istnieje.
Spróbuj określić język, który nie istnieje. SharedResource.resx jest używany, ponieważ nie ma odpowiedniego pliku w tym miejscu.
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.
typ c=es|uic=es, aby wyświetlić język hiszpański.
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.
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.
Jeśli ja jest określony w ciągu zapytania, ciąg zapytania ma pierwszeństwo i japoński jest wyświetlany.
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.