Расширяемость локализации

Автор: Хишам Бин Атея (Hisham Bin Ateya)

В этой статье:

  • Перечисляет точки расширения в API локализации.
  • В этой статье приводятся инструкции по расширениям локализации в приложениях ASP.NET Core.

Точки расширения в API локализации

API локализации ASP.NET Core созданы с учетом потребностей расширения. Расширяемость позволяет разработчикам настраивать локализацию в соответствии со своими потребностями. Например, OrchardCore имеет POStringLocalizer. В POStringLocalizer приводится подробное описание использования локализации переносимых объектов для использования файлов PO для хранения ресурсов локализации.

В этой статье описаны две основные точки расширения, предоставляемые API локализации.

Поставщики языка и региональных параметров локализации

API локализации ASP.NET Core имеют четыре поставщика по умолчанию, которые могут определить текущий язык и региональные параметры выполняемого запроса:

Указанные выше поставщики подробно описаны в документации ПО промежуточного слоя локализации. Если поставщики по умолчанию не отвечают вашим потребностям, создайте свой поставщик, используя один из следующих подходов:

Используя CustomRequestCultureProvider

CustomRequestCultureProvider предоставляет пользовательский RequestCultureProvider, использующий простой делегат для определения текущего языка и региональных параметров локализации:

options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
    var currentCulture = "en";
    var segments = context.Request.Path.Value.Split(new char[] { '/' }, 
        StringSplitOptions.RemoveEmptyEntries);

    if (segments.Length > 1 && segments[0].Length == 2)
    {
        currentCulture = segments[0];
    }

    var requestCulture = new ProviderCultureResult(currentCulture);

    return Task.FromResult(requestCulture);
}));
options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
{
    var currentCulture = "en";
    var segments = context.Request.Path.Value.Split(new char[] { '/' }, 
        StringSplitOptions.RemoveEmptyEntries);

    if (segments.Length > 1 && segments[0].Length == 2)
    {
        currentCulture = segments[0];
    }

    var requestCulture = new ProviderCultureResult(currentCulture);

    return Task.FromResult(requestCulture);
}));

Использование новой реализации RequestCultureProvider

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

В следующем примере показан класс AppSettingsRequestCultureProvider, который расширяет класс RequestCultureProvider для определения сведений о языке и региональных параметрах запроса из appsettings.json:

public class AppSettingsRequestCultureProvider : RequestCultureProvider
{
    public string CultureKey { get; set; } = "culture";

    public string UICultureKey { get; set; } = "ui-culture";

    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentNullException();
        }

        var configuration = httpContext.RequestServices.GetService<IConfigurationRoot>();
        var culture = configuration[CultureKey];
        var uiCulture = configuration[UICultureKey];

        if (culture == null && uiCulture == null)
        {
            return Task.FromResult((ProviderCultureResult)null);
        }

        if (culture != null && uiCulture == null)
        {
            uiCulture = culture;
        }

        if (culture == null && uiCulture != null)
        {
            culture = uiCulture;
        }
        
        var providerResultCulture = new ProviderCultureResult(culture, uiCulture);

        return Task.FromResult(providerResultCulture);
    }
}

Ресурсы локализации

Для локализации в ASP.NET Core есть ResourceManagerStringLocalizer. ResourceManagerStringLocalizer — это реализация IStringLocalizer, которая использует resx для хранения ресурсов локализации.

Вы не ограничены использованием файлов resx. При реализации IStringLocalizer можно использовать любой источник данных.

В следующих примерах проектов реализуется IStringLocalizer: