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. Можно указать одну или обе комбинации ISO 639 и ISO 3166 для культурного кода. Код поддержки время от времени изменяется, поэтому класс CultureInfo на сайте Майкрософт Пожалуйста, обратитесь к странице.

На этот раз готовятся en (английский) и es (испанский). Японский язык недоступен, потому что он по умолчанию.

image

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

image

image

Далее у вас будет файл, определяющий только классы. Вы создаете это с тем же именем, что и только что созданный файл ресурса.

В самом деле, мне все равно, что название кода файлсам, потому что вы только должны соответствовать названию класса внутри, но оставить его же так, что это легко понять. Не имеет значения, где вы хотите написать код.

image

Сделайте пространство имен корнем проекта и создайте пустой класс.

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

Исправить каждую программу

Startup.cs

Исправить Startup.cs. Опишите метод ConfigureServices следующим образом:

Услуги. AddMvc(). Если есть метод AddViewЛокization, текст, переведенный как стороной представления, так и стороной контроллера, Я уверен, что я могу получить его, но Как и на официальном сайте услуг. Нет проблем с вызовом метода AddLocalization вместе.

Параметры. ResourcesPath определяет траекторию папки, в которой находится файл Resx. Если оба указаны, услуги. AddMvc(). Приоритет имеет метод ЛоквьюЛокализация.

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" и "Accept-Language HTTP заголовок" в зависимости от среды пользователя. Вы можете переключаться между языками отображения в одном из них. Мы увидим вас позже, как проверить фактическую операцию.

Коммутируемый язык указан здесь, в массиве (поддерживаемыхКультуры). Я указал ja как язык по умолчанию, но на этот раз я не создал файл ja. SharedResource.resx используется, если язык, не превышающей en, es указан.

Вы можете отделить uI от языков, которые вы поддерживаете, но нет большой пользы для его разделения. У тебя один и тот же язык.

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 получается в конструкторе. SharedResource должен иметь то же имя, что и класс, созданный ранее. Текст передается импортеру полученного локализатора, передавая строку ключа, введенную в файл ресурса. могут быть извлечены. Язык текста определяется на основе запрашиваемой культуры.

Кстати, в дополнение к IStringLocalizer, есть также IHtmlLocalizer, которые могут получить 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

Просмотры»Домашний индекс.cshtml

Просмотр файла «Домашний индекс.cshtml». Текст, полученный на стороне контроллера, и текст, полученный непосредственно на стороне вида, отображаются соответственно. Локализующий элемент view side также получает текст, указывая строку ключа для индекса.

@{
    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. Формат : ?культура и lt;культурный код-gt;. Если вы хотите отделить его от uI, то будет «культура» lt;код культуры и код и ui-культура»lt;культура код»gt;gt;

Если вы ничего не уконзначите: Если не указано, используется SharedResource.resx. (На самом деле, другое решение было применено ...)

image

Шаблон, указанный для ?culture'en. Язык отображения — английский.

image

Шаблон, указанный для ?culture.es. Язык отображения - испанский.

image

Шаблон, указанный для ?culture'ja. Первоначально используется файл SharedResource.ja.resx. SharedResource.resx используется, поскольку он не существует.

image

Попробуйте указать язык, который не существует. SharedResource.resx используется, потому что здесь нет соответствующего файла.

image

Печенье

Файлы cookie могут переключать язык отображения. Обычно публикуется со стороны сервера, но на этот раз я постараюсь зарегистрировать файлы cookie непосредственно в функции браузера.

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

Название соответствующего cookie . AspNetCore.Культура, и значение, которое определяет язык Введите в виде c'lt;культурный код ,gt; Для файлов cookie необходимо также ввести код ui. После того как вы зарегистрировали cookie- обновите страницу веб-браузера, чтобы обновить его. Файл cookie отправляется на сервер, чтобы сервер получил указанный язык.

На рисунке ниже можно ввести c'en-uic'en для отображения английского языка.

image

для c=es|uic=es отображения испанского языка.

image

Примите язык HTTP заголовок

Заголовок «Accept-Language HTTP» проверяет информацию заголовка, запрашиваемую из веб-браузера на сервер. Это возможность соответствующим образом переключаться на языках.

Вы можете отправить любой Accept-Language в настройках веб-браузера, но по умолчанию вы можете соответствовать настройкам языка os. Accept-Language теперь отправляется. (Независимо от того, отправлено оно или нет, зависит от ОС и веб-браузера.) Язык инициализирован в веб-браузере для языка ОС, но это может быть правильным.)

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

image

Если вы попытаетесь указать язык, который не существует в строке запроса, следует использовать SharedResource.resx. Accept-Language отображает английский язык, потому что en существует.

image

Если ja указан в строке запроса, строка запроса имеет приоритет и отображается японский язык.

image

Сводка

Здесь я попытался реализовать многоязычный переключение самым простым способом. Чтобы переключить языки в соответствии с средой пользователя, используйте заголовок Accept-Language HTTP в качестве языка отображения по умолчанию. Если пользователь выбирает какой-либо язык, рекомендуется добавить файлы cookie или добавить (или ввести непосредственно) строку запроса.