Extensibilidade de localização

Por Hisham Bin Ateya

Este artigo:

  • Lista os pontos de extensibilidade nas APIs de localização.
  • Fornece instruções sobre como estender a localização de aplicativos ASP.NET Core.

Pontos extensíveis em APIs de localização

As APIs de localização ASP.NET Core foram criadas para serem extensíveis. A extensibilidade permite que os desenvolvedores personalizem a localização de acordo com suas necessidades. Por exemplo, OrchardCore tem um POStringLocalizer. POStringLocalizer descreve em detalhes o uso da Localização de objeto portátil para usar arquivos PO para armazenar recursos de localização.

Este artigo lista os dois pontos de extensibilidade principais que as APIs de localização fornecem:

Provedores de cultura de localização

As APIs de localização ASP.NET Core têm quatro provedores padrão que podem determinar a cultura atual de uma solicitação em execução:

Os provedores anteriores são descritos em detalhes na documentação sobre Middleware de localização. Se os provedores padrão não atenderem às suas necessidades, crie um provedor personalizado usando uma das seguintes abordagens:

Usar CustomRequestCultureProvider

CustomRequestCultureProvider fornece um RequestCultureProvider personalizado que usa um delegado simples para determinar a cultura de localização atual:

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

Usar uma nova implementação de RequestCultureProvider

Uma nova implementação de RequestCultureProvider pode ser criada para determinar as informações de cultura da solicitação de uma fonte personalizada. Por exemplo, a origem personalizada pode ser um arquivo de configuração ou um banco de dados.

O exemplo a seguir mostra AppSettingsRequestCultureProvider, que estende o RequestCultureProvider para determinar as informações de cultura da solicitação de 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);
    }
}

Recursos de localização

A localização do ASP.NET Core fornece ResourceManagerStringLocalizer. ResourceManagerStringLocalizer é uma implementação de IStringLocalizer que usa resx para armazenar recursos de localização.

Você não fica limitado a usar arquivos resx. Implementando IStringLocalizer, qualquer fonte de dados pode ser usada.

Os seguintes projetos de exemplo implementam IStringLocalizer: