Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Для локализации строк в представлении применяется сервис IViewLocalizer, который по своему действию аналогичен сервису IStringLocalizer. Встроенная реализация этого интерфейса - класс ViewLocalizer в зависимости от пути к локализуемому представлению пытается найти нужный файл ресурсов.
При локализации представлений применяются те же соглашения по именованию, что и при локализации контроллеров. То есть имя файла ресурсов, предназначенного для представления, должно отражать его путь в проекте. Например, пусть нам надо локализовать представление Views/Home/Index.cshtml. В этом случае ViewLocalizer будет искать для него файл ресурсов по следующим путям:
[папка_ресурсов]/Views/Home/Index.[код_культуры].resx
[папка_ресурсов]/Views.Home.Index.[код_культуры].resx
Например, добавим для представления Views/Home/Index.cshtml ресурсы в папку Resources. Воспользуемся первым вариантов:
Как видно из скриншота, папка ресурсов в данном случае называется Resources, и в ней с прошлой темы остались ресурсы для локализации контроллеров. Использование структуры папок позволяет избежать мешанины в одной папке ресурсов для локализуемых сущностей и должным образом их структуризировать.
В данном случае я определил три файла ресурсов:
Resources/Views/Home/Index.ru.resx (для русского языка)
Resources/Views/Home/Index.en.resx (для английского языка)
Resources/Views/Home/Index.de.resx (для немецкого языка)
Каждый из файлов ресурсов имеет два ресурса с одинаковыми ключами Header и Message, но значениями на соответствующем языке. Например, ресурс для английского языка:
А аналогичный ресурс для русского языка выглядит следующим образом:
После добавления ресурсов сделаем ребилд (перестроение) проекта.
Используем эти ресурсы в представлении Views/Home/Index.cshtml:
@using Microsoft.AspNetCore.Mvc.Localization @inject IViewLocalizer Localizer <h1>@Localizer["Header"]</h1> <h3>@Localizer["Message"]</h3>
Первой строкой подключаем пространство имен, где определен IViewLocalizer. Второй строкой инжектируем данный сервис в представление и даем ему название
Localizer
.
И в конце добавим данный сервис в приложение, изменив класс Startup:
using System.Globalization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Localization; using Microsoft.Extensions.DependencyInjection; namespace LocalizationApp { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddLocalization(options => options.ResourcesPath = "Resources"); services.AddControllersWithViews() .AddViewLocalization();// добавляем локализацию представлений; } public void Configure(IApplicationBuilder app) { app.UseDeveloperExceptionPage(); var supportedCultures = new[] { new CultureInfo("en"), new CultureInfo("ru"), new CultureInfo("de") }; app.UseRequestLocalization(new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture("ru"), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures }); app.UseStaticFiles(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } } }
Для добавления сервиса IViewLocalizer в методе ConfigureServices вызывается метод AddViewLocalization().
Также следует отметить, что в методе Configure подключен RequestLocalizationMiddleware, который определяет набор допустимых культур и культуру по умолчанию.
Запустим приложение и передадим русскоязычную культуру:
Передадим другую культуру, например, англоязычную: