Partilhar via


Extensibilidade da Localização

Observação

Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.

Advertência

Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 10 deste artigo.

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 aplicações em ASP.NET Core.

Pontos Extensíveis em APIs de Localização

ASP.NET APIs de localização Core são construídas para serem extensíveis. A extensibilidade permite aos programadores personalizar a localização de acordo com as suas necessidades. Por exemplo, o OrchardCore tem um POStringLocalizer. POStringLocalizer descreve em detalhe a utilização da localização por Objetos Portáteis para a utilização de PO ficheiros para armazenar recursos de localização.

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

Fornecedores de Cultura de Localização

ASP.NET APIs de localização Core têm quatro fornecedores padrão que podem determinar a cultura atual de um pedido em execução:

Os fornecedores anteriores são descritos em detalhe na documentação do Localization Middleware . Se os fornecedores padrão não corresponderem às suas necessidades, construa um prestador personalizado usando uma das seguintes abordagens:

Usar CustomRequestCultureProvider

CustomRequestCultureProvider fornece um RequestCultureProvider personalizado que utiliza 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);
}));

Use uma nova implementação do RequestCultureProvider

Pode ser criada uma nova implementação de RequestCultureProvider que determina a informação da cultura associada ao pedido a partir de uma fonte personalizada. Por exemplo, a fonte personalizada pode ser um ficheiro de configuração ou uma base de dados.

O exemplo seguinte mostra AppSettingsRequestCultureProvider, que estende o RequestCultureProvider para determinar a informação da cultura do pedido a partir 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 no ASP.NET Core fornece ResourceManagerStringLocalizer. ResourceManagerStringLocalizer é uma implementação de IStringLocalizer que utiliza resx para armazenar recursos de localização.

Não estás limitado a usar resx ficheiros. Ao implementar IStringLocalizer, qualquer fonte de dados pode ser utilizada.

Os seguintes exemplos de projetos implementam IStringLocalizer: