ASP.NET многоезично превключване с вградени основни MVC функции

Страницата се актуализира :
Дата на създаване на страница :

Околната среда

Визуален студио
  • Визуална оферта 2019
ASP.NET ядро
  • 3.0
  • 3.1

На първо място

ASP.NET използвате основни функции за локализация на MVC, за да превключвате между няколко езика, за да ги покажете.

Създаване на ресурсен файл за преведен текст

Създайте папка за съхраняване на ресурсните файлове (Resx), които управляват текста. Местоположението е навсякъде, но го оставете точно под маршрута. Този път също засяга по-късни настройки.

Щракнете с десния бутон на проекта и изберете Добавяне или Нова папка.

image

Оставете ресурсите за име на папка. Можете също да зададете произволно тази папка, но можете да укажете името на тази папка в по-късни настройки.

image

След това създайте ресурсен файл, за да въведете текст за всеки език.

Щракнете с десния бутон върху папката "Ресурси" и изберете Добавяне или Нов елемент.

image

Изберете ресурсния файл (.resx). Името на файла може да бъде произволно, но трябва да съответства на името, което сте задали по-късно. Засега, да кажем sharedResource.resx.

image

След като създадете .resx файл, щракнете двукратно, за да го отворите и въведете името, което идентифицира текста и текста, който искате да се показва действително. Файлът SharedResource.resx е файлът, който ще се използва, ако езикът не съществува. Влязох на японски тук. Ако искате други езици, като например английски, да бъдат по подразбиране, въведете ги на този език.

Тук влизаме в "Здравей" и "Сбогом" като мостри. Обърнете внимание, че е чувствителен към малки и големи букви.

image

Продължете да създавате ресурсни файлове за други езици. За да идентифицирате езика, укажете името на файла, например SharedResource.<Culture Code>.resx. Можете да зададете една или и двете комбинации от ISO 639 и ISO 3166 за кода на културата. Кодът за поддръжка подлежи на промяна от време на време, така че Class CultureInfo на сайта на Microsoft Моля, вижте страницата.

Този път се приготвят en (английски) и исове (испански). Японският не е наличен, защото е по подразбиране.

image

Въведете преведения текст с клавишите в същото състояние за всеки файл.

image

image

След това ще имате файл, който определя само класовете. Можете да създадете това със същото име като ресурсния файл, който току-що създадохте.

Всъщност, не ме интересува името на самия кодов файл, защото трябва да съвпада само с името на класа вътре, но го оставете същото, така че да е лесно да се разбере. Няма значение къде искате да напишете кода.

image

Направете пространството на имената в главната директория на проекта и създайте празен клас.

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

Фиксирайте всяка програма

Startup.cs

Оправи Startup.cs. Опишете метода ConfigureServices както следва:

Услуги. () Ако има AddViewLocalization метод, текстът, преведен от страната на изгледа и от страната на контролера, е Сигурен съм, че ще го получа, но Както е и на официалния сайт услуги. Няма проблем при повикване addLocalization метод заедно.

Опции. ResourcesPath задава пътя на папката, където се намира Resx файл. Ако и двете са посочени, услуги. () Метод addViewлокализация има предимство.

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

След това променете метода Конфигуриране за Startup.cs. Ако искате да прочетете ресурсния файл, не ви е нужен. Код, който е необходим, за да позволи на потребителя да определи език произволно.

Използваме функциите, вградени в ASP.NET Core MVC като стандарт. Следният код описва "низ за заявка", "бисквитка" и "Accept-Language HTTP header" в зависимост от средата на потребителя. Можете да превключвате между езиците на показване на един от тях. Ще се видим по-късно как да проверите действителната операция.

Тук в масива (поддържаникултури) е зададен езикът за превключване. Зададох я като език по подразбиране, но този път не съм създал файла ja. SharedResource.resx се използва, ако е зададен език, различен от en, es.

Можете да отделите потребителския интерфейс от езиците, които поддържате, но няма голяма полза от отделянето му. Ти имаш същия език.

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

  // 省略
}

Контролери\HomeController.cs

Контролери\HomeController.cs файл. За да получите локализиран език от страна на контролера, iStringLocalizer се получава в конструктора. Споделеният ресурс трябва да има същото име като класа, който сте създали по-рано. Текстът се предава на вносителя на получения локализатор чрез преминаване на ключовия низ, въведен в ресурсния файл. може да бъде възстановен. Езикът на текста се определя въз основа на културата, която се иска.

Между другото, в допълнение към IStringLocalizer, има и IHtmlЛокализатор, който може да получи HTML, тъй като е.

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

  // 省略
}

Изгледи\_ViewImports.cshtml

Изгледи\_ViewImports.cshtml файл. За да използвате локализатор от страната на изгледа, трябва да инжектирате IHtmlЛокализатор. Ако го опишете по следния начин за сега, това е ОК. Също така sharedResource трябва да има същото име като ресурсния файл и клас, който сте създали по-рано.

IHtmlЛокализатор е в Microsoft.AspNetCore.Mvc.локализация пространство на имената, така че ще дефинирам това като използване.

Ако искате да използвате само локализатора в определена точка, можете да включите следния код в отделен файл за изглед. Ако го напишете в _ViewImports.cshtml файл, автоматично ще можете да го използвате във всички прегледи на файлове.

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

Изгледи\Начало\Индекс.cshtml

Изгледи\Начало\Индекс.cshtml файл. Текстът, получен от страната на контролера и полученият текст директно от страната на изгледа, се показват съответно. Локализаторът на страната на изгледа получава и текст чрез задаване на ключов низ за индексатора.

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

Проверка на операцията

Низ на заявка

Можете да превключвате езика на показване, като посочите код на култура в низа на заявката на URL адреса. Форматът е ?култура=<код на култура>. Ако искате да го отделите от потребителския интерфейс, това ще бъде ?culture=<код на култура>&ui-култура=<код на култура>.

Ако не посочите нищо: Ако не е зададен, се използва SharedResource.resx. (Всъщност е приложено друго решение...)

image

Образецът, определен за ?култура=ен. Езикът на показване е английски.

image

Образецът, определен за ?култура=es. Езикът на показване е испански.

image

Образецът, определен за ?култура=джа. Първоначално се използва файла SharedResource.ja.resx. Използва се SharedResource.resx, защото не съществува.

image

Опитайте се да зададете език, който не съществува. Използва се sharedResource.resx, защото няма съответен файл тук.

image

Бисквитки

Бисквитките могат да превключват езика на дисплея. Обикновено се публикува от страна на сървъра, но този път ще се опитам да се регистрират бисквитки директно в браузъра функция.

Тъй като всеки уеб браузър има инструмент за разработчици, вие го използвате, за да регистрирате бисквитки. На фигурата по-долу можете да натиснете F12 на Edge, за да се покажат инструментите за разработчици.

Името на съответната бисквитка е . AspNetCore.Култура и стойността, която задава езика е Въведете под формата на c=<код на култура>|Uic=<код на култура>. За бисквитки те трябва да въведете и кода на потребителския интерфейс. След като регистрирате "бисквитката", обновете страницата на уеб браузъра си, за да я опресните. Бисквитка та се изпраща на сървъра, така че сървърът да извлече указания език.

На фигурата по-долу можете да въведете c=en|uic=en, за да покажете английски.

image

въведете c=es|uic=es за показване на испански.

image

Http заглавка на приемния език

Accept-Language HTTP заглавката проверява заглавната информация, поискана от уеб браузъра на сървъра. Това е възможността да се превключват езици те съответно.

Можете да изпратите всеки accept-Language в настройките на вашия уеб браузър, но по подразбиране можете да отговаряте на настройките на езика на ос. Приемане на език е изпратен. (Дали всъщност е изпратено, зависи от операционната система и уеб браузъра.) Езикът се инициализира в уеб браузъра за езика на операционната система, но може да е правилен.)

Така например, както е показано на фигурата по-долу, можете да отворите страницата в уеб браузъра на операционната система на английски език и да изпратите информация, така че да можете автоматично да SharedResource.en.resx е избран за показване на английски.

image

Ако се опитате да зададете език, който не съществува в низа на заявката, трябва да използвате sharedResource.resx. Accept-Language показва английски, защото en съществува.

image

Ако ja е указан в низа на заявката, низа на заявката има предимство и се показва японски.

image

Резюме

Тук се опитах да внедря многоезичното превключване по най-лесния начин. За да превключите езици, така че да съответстват на средата на потребителя, използвайте accept-Language HTTP заглавката като език за показване по подразбиране. Ако потребителят избере някой език, добра идея е да добавите бисквитки или да добавите (или да въведете директно) на низа на заявката.