ASP.NET багатомовне перемикання з основними вбудованими функціями MVC

Сторінка оновлюється :
Дата створення сторінки :

Середовищі

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 3,0
  • 3,1

На перший

ASP.NET використовуйте основні функції локалізації MVC для переключення між декількома мовами для їх відображення.

Створення файлу ресурсів для перекладеного тексту

Створіть папку для зберігання файлів ресурсів (RESX), які керують текстом. Розташування знаходиться в будь-якому місці, але Залиште його прямо під маршрутом. Цей шлях також впливає на пізніші настройки.

Проект, клацніть правою кнопкою миші та виберіть Додати або створити папку.

image

Залиште ресурси ім'я папки. Ви також можете встановити ім'я цієї папки довільно, але ви можете вказати ім'я цієї папки в пізніших налаштуваннях.

image

Потім створіть файл ресурсу для введення тексту для кожної мови.

Папку ресурсів, клацніть правою кнопкою миші та виберіть Додати або новий елемент.

image

Виберіть файл ресурсів (. RESX). Ім'я файлу може бути довільним, але воно має збігатися з іменем, яке ви вкажете пізніше. Тепер, скажімо SharedResource. RESX.

image

Після створення файлу. RESX двічі клацніть, щоб відкрити його, а потім введіть ім'я, яке ідентифікує текст і текст, який насправді відображається. Файл SharedResource. RESX-це файл, який використовуватиметься, якщо мова не існує. Я увійшов до нього в японському тут. Якщо потрібно, щоб інші мови, наприклад англійську мову, були за замовчуванням, введіть їх цією мовою.

Тут ми вводимо Привіт і Прощавай, як зразки. Зверніть увагу, що це чутливий до регістру.

image

Продовжуйте створювати файли ресурсів для інших мов. Щоб визначити мову, укажіть ім'я файлу, наприклад Sharedresource. ≪ код культури >. RESX. Ви можете вказати одну або обидві комбінації ISO 639 та ISO 3166 для коду культури. Код підтримки, можуть змінюватися час від часу, тому клас на сайті Microsoft Будь ласка, зверніться до сторінки.

Цей час, EN (англійська) і ES (Іспанська) підготовлені. Японська недоступна, оскільки вона є типовою.

image

Введіть перекладений текст ключами в тому ж стані для кожного файлу.

image

image

Далі, у вас буде файл, який визначає тільки класи. Створення цього з таким самим іменем, як файл ресурсу, який ви тільки що створили.

Насправді, я не хвилює, що ім'я самого файлу коду, тому що ви тільки повинні відповідати назві класу всередині, але Залиште його так само, так що це легко зрозуміти. Неважливо, де ви хочете написати код.

image

Зробити простір імен корінь проекту і створити порожній клас.

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

Виправлення кожної програми

Startup.cs

Fix Startup.CS. Опишіть метод ConfigureServices наступним чином:

Послуги. AddMvc (). Якщо метод AddViewLocalization, текст, перекладений як з боку подання, так і контролер сторона Я впевнений, що я можу отримати його, але Як і на офіційному сайті послуги. Немає ніяких проблем з викликом метод AddLocalization разом.

Параметри. Ресурсишлях визначає шлях до папки, де розташовано файл RESX. Якщо обидва вказані, служби. AddMvc (). Метод 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 як стандарт. Наступний код описує "рядок запиту", "cookie" та "прийняти-Language заголовок HTTP" залежно від середовища користувача. Можна переключатися між мовами відображення в одному з них. Ми побачимо вас пізніше, як перевірити фактичну операцію.

Тут у масиві (підтримки культур) вказано мову, що перемикається. Я вказаний ja як мову за замовчуванням, але я не створив 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();

  // 省略
}

Controllers\HomeController.cs

Controllers\HomeController.CS File. Для отримання локалізованої мови на стороні контролера, iStringLocalizer отримав у конструкторі. SharedResource повинен мати те саме ім'я, що і клас, який ви створили раніше. Текст передається імпортеру отриманого Локалізатора, передаючи рядок ключа, введений у файлі ресурсу. можна отримати. Мова тексту визначається на основі культури, що запитується.

До речі, на додаток до IStringLocalizer, є також Ihtmllocзатор, який може отримати 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 . Щоб використовувати локалізатор з боку подання, необхідно ввести IHtmlLocalizer. Якщо ви описали його наступним чином, це нормально. Крім того, SharedResource повинен мати таке ж ім'я, як файл ресурсів і клас, який ви створили раніше.

IHtmlLocalizer знаходиться в Microsoft. AspNetCore. MVC. простір імен локалізації, тому я буду визначати це як використання.

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

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

Views\Home\Index.cshtml

Views\Home\Index.cshtml File. Текст, отриманий на стороні контролера та текст, отриманий безпосередньо на стороні подання, відображаються відповідно. Засіб локалізації також отримує текст, вказавши ключовий рядок програми індексування.

@{
    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-адреси. Формат ? культура = < код культури >. Якщо ви хочете відокремити його від призначеного для користувача інтерфейсу, це буде ? культура = < код культури > & UI-культура = < код культури >.

Якщо ви нічого не вкажете: Якщо не вказано, використовується SharedResource. RESX. (Насправді, ще одне судження було застосовано...)

image

Шаблон, вказаний для ? культура = en. Мова інтерфейсу – Англійська.

image

Візерунок, вказаний для ? культура = ES. Мова відображення Іспанська.

image

Шаблон, вказаний для ? культура = ja. Спочатку використовується файл SharedResource. ja. RESX. SharedResource. RESX використовується, тому що він не існує.

image

Спробуйте вказати мову, яка не існує. SharedResource. RESX використовується, тому що немає відповідного файлу тут.

image

Печиво

Файли cookie можуть перемикати мову відображення. Зазвичай публікується з боку сервера, але на цей раз я постараюся зареєструвати Cookies безпосередньо в браузері функції.

Оскільки кожен веб-браузер має інструмент розробника, ви використовуєте його для реєстрації файлів cookie. На малюнку нижче ви можете натиснути F12 на краю, щоб відобразити Інструменти розробника.

Ім'я відповідного печива . AspNetCore. культура і значення, що визначає мову, є Введіть у вигляді c = < код культури > | uic = < код культури >. Для файлів cookie потрібно також ввести код інтерфейсу користувача. Після того як ви зареєстрували свій cookie, оновіть сторінку веб-браузера, щоб оновити його. Файл cookie надсилається на сервер так, що сервер буде отримати зазначену мову.

На малюнку нижче ви можете ввести c = EN | uic = EN для відображення англійської мови.

image

тип c = ES | uic = ES для відображення іспанської.

image

Погодитися з мовою заголовка HTTP

HTTP заголовок прийняти-language перевіряє заголовок інформацію, Запитувана з веб-браузера на сервері. Це можливість перемикати мови відповідно.

Ви можете надсилати будь-яку мову в налаштуваннях веб-браузера, але за замовчуванням ви можете зіставити налаштування мови ОС. Прийняти-мова зараз надіслано. (Незалежно від того, чи дійсно це надіслано, залежить від операційної системи та веб-переглядача.) Мова ініціалізується у веб-браузері для мови ОС, але це може бути правильним.)

Так, наприклад, як показано на малюнку нижче, ви можете відкрити сторінку у веб-браузері англійською мовою ОС і відправити інформацію про, так що ви можете автоматично SharedResource. en. RESX вибрано для відображення англійської мови.

image

Якщо ви спробуєте вказати мову, яка не існує в рядку запиту, слід спочатку використовувати SharedResource. RESX. Прийняти-мова відображає англійську мову, оскільки існує.

image

Якщо ja вказано в рядку запиту, буде відображено рядок запиту, який має пріоритет, і відображається Японська.

image

Резюме

Тут я спробував реалізувати багатомовні перемикання в найпростіший спосіб. Щоб перемикати мови відповідно до оточення користувача, використовуйте заголовок HTTP прийняти-мова як мову відображення за промовчанням. Якщо користувач вибирає будь-яку мову, це гарна ідея, щоб додати файли cookie або додати (або введіть безпосередньо) рядок запиту.