Локализация строк. IStringLocalizer

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 18.12.2019

В прошлых темах было рассмотрено, как получать и устанавливать текущую языковую культуру. И теперь посмотрим, как мы можем в зависимости от культуры локализовать определенные значения.

ASP.NET Core предоставляет ряд встроенных сервисов, которые автоматически позволяют локализовать строки. И одним из таких сервисов является IStringLocalizer и IStringLocalizer<T>. Чтобы детальнее понять, как работает этот сервис, определим его реализацию. Для этого добавим в проект новый класс, который назовем CustomStringLocalizer:

using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Globalization;

namespace LocalizationApp
{
    public class CustomStringLocalizer : IStringLocalizer
    {
        Dictionary<string, Dictionary<string, string>> resources;
        // ключи ресурсов
        const string HEADER = "Header";
        const string MESSAGE = "Message";

        public CustomStringLocalizer()
        {
            // словарь для английского языка
            Dictionary<string, string> enDict = new Dictionary<string, string>
            {
                {HEADER, "Welcome" },
                {MESSAGE, "Hello World!" }
            };
            // словарь для русского языка
            Dictionary<string, string> ruDict = new Dictionary<string, string>
            {
                {HEADER, "Добо пожаловать" },
                {MESSAGE, "Привет мир!" }
            };
            // словарь для немецкого языка
            Dictionary<string, string> deDict = new Dictionary<string, string>
            {
                {HEADER, "Willkommen" },
                {MESSAGE, "Hallo Welt!" }
            };
            // создаем словарь ресурсов
            resources = new Dictionary<string, Dictionary<string, string>>
            {
                {"en", enDict },
                {"ru", ruDict },
                {"de", deDict }
            };
        }
        // по ключу выбираем для текущей культуры нужный ресурс
        public LocalizedString this[string name]
        {
            get
            {
                var currentCulture = CultureInfo.CurrentUICulture;
                string val = "";
                if (resources.ContainsKey(currentCulture.Name))
                {
                    if (resources[currentCulture.Name].ContainsKey(name))
                    {
                        val = resources[currentCulture.Name][name];
                    }
                }
                return new LocalizedString(name, val);
            }
        }

        public LocalizedString this[string name, params object[] arguments] => throw new NotImplementedException();

        public IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures)
        {
            throw new NotImplementedException();
        }

        public IStringLocalizer WithCulture(CultureInfo culture)
        {
            return this;
        }
    }
}

Этот класс реализует интерфейс IStringLocalizer. Для демонстрации его работы реализован только индексатор, который по некоторому ключу возвращает объект LocalizedString.

Для простоты здесь определены словари для трех языков, каждом из которых по два ресурса HEADER и MESSAGE. Затем все три словаря объединяются в один общий словарь ресурсов.

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

Встроим сервис в конвейер ASP.NET Core. Для этого изменим класс Startup:

using System.Globalization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;

namespace LocalizationApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<IStringLocalizer, CustomStringLocalizer>();
            services.AddControllersWithViews();
        }

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

Сервис IStringLocalizer устанавливается в методе ConfigureServices, а в методе Configure вызывается рассмотренный в прошлой теме компонент RequestLocalizationMiddleware.

Используем сервис в контроллере HomeController:

using System;
using Microsoft.AspNetCore.Mvc;
using System.Globalization;
using Microsoft.Extensions.Localization;

namespace LocalizationApp.Controllers
{
    public class HomeController : Controller
    {
        private readonly IStringLocalizer _localizer;
        public HomeController(IStringLocalizer localizer)
        {
            _localizer = localizer;
        }
        public IActionResult Index()
        {
            ViewData["Title"] = _localizer["Header"];
            ViewData["Message"] = _localizer["Message"];
            return View();
        }
    }
}

Для тестирования сервиса в методе Index в представление через объект ViewData передаются два значения.

И определим простейшее представление для метода Index для вывода этих значений:

<h1>@ViewData["Title"]</h1>
<h3>@ViewData["Message"]</h3>

Запустим приложение и вначале посредством параметра culture через сроку запроса установим одну культуру:

IStringLocalizer в ASP.NET Core

Затем установим другую культуру:

Сервис IStringLocalizer в ASP.NET Core MVC

Таким образом, при изменении культуры сервис IStringLocalizer автоматически будет выбирать нужный ресурс.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850