Solucionar problemas de Localização no ASP.NET Core

Por Hisham Bin Ateya

Este artigo contém instruções sobre como diagnosticar problemas de localização em aplicativos do ASP.NET Core.

Problemas de configuração da localização

Ordem do middleware de localização
O aplicativo pode não localizar porque o middleware de localização não está ordenado conforme o esperado.

Para resolver esse problema, verifique se o middleware de localização foi registrado antes do middleware do MVC. Caso contrário, o middleware de localização não será aplicado.

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(options => options.ResourcesPath = "Resources");

    services.AddMvc();
}

Caminho dos recursos de localização não encontrado

As culturas compatíveis em RequestCultureProvider não correspondem ao registrado uma vez

Problemas de nomenclatura do arquivo de recurso

O ASP.NET Core tem regras e diretrizes predefinidas para a nomenclatura de arquivos de recurso de localização, que são descritas em detalhes aqui.

Recursos ausentes

As causas comuns para não localizar recursos incluem:

  • Nomes de recursos digitados incorretamente no arquivo resx ou na solicitação do localizador.
  • O recurso está ausente do resx para alguns idiomas, mas presente em outros.
  • Se ainda houver problemas, verifique as mensagens de log de localização (que estão no nível de log Debug) para saber mais detalhes sobre os recursos ausentes.

Dica: ao usar CookieRequestCultureProvider, verifique se aspas simples não são usadas com as culturas dentro do valor do cookie de localização cookie. Por exemplo, c='en-UK'|uic='en-US' é um valor cookie inválido, enquanto c=en-UK|uic=en-US é válido.

Problemas de bibliotecas de recursos e classes

Por padrão, o ASP.NET Core oferece uma maneira de permitir que as bibliotecas de classes localizem seus arquivos de recurso por meio de ResourceLocationAttribute.

Problemas comuns com bibliotecas de classes incluem:

  • Ausência do ResourceLocationAttribute em uma biblioteca de classes evitará que ResourceManagerStringLocalizerFactory descubra os recursos.
  • Nomenclatura do arquivo de recurso. Para saber mais, confira a seção Problemas de nomenclatura do arquivo de recurso.
  • Altere o namespace raiz da biblioteca de classes. Para saber mais, confira a seção Problemas do namespace raiz.

CustomRequestCultureProvider não funciona conforme o esperado

A classe RequestLocalizationOptions tem três provedores padrão:

  1. QueryStringRequestCultureProvider
  2. CookieRequestCultureProvider
  3. AcceptLanguageHeaderRequestCultureProvider

O CustomRequestCultureProvider permite personalizar como a cultura de localização é fornecida no aplicativo. O CustomRequestCultureProvider é usado quando os provedores padrão não atendem aos seus requisitos.

  • Um motivo comum para o provedor personalizado não funcionar corretamente é não ser o primeiro provedor na lista RequestCultureProviders. Para resolver o problema:

  • Insira o provedor personalizado na posição 0 da lista RequestCultureProviders, desta maneira:

options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
    {
        // My custom request culture logic
        return new ProviderCultureResult("en");
    }));
options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
    {
        // My custom request culture logic
        return new ProviderCultureResult("en");
    }));
  • Use o método de extensão AddInitialRequestCultureProvider para definir o provedor personalizado como provedor inicial.

Problemas do namespace raiz

Quando o namespace raiz de um assembly for diferente do nome do assembly, a localização não funcionará por padrão. Para evitar esse problema, use RootNamespace, que é descrito em detalhes aqui

Aviso

Isso pode ocorrer quando o nome de um projeto não for um identificador .NET válido. Por exemplo, my-project-name.csproj usará o namespace raiz my_project_name e o nome do assembly my-project-name que gera esse erro.

Recursos e ação de build

Se você usa arquivos de recurso para localização, é importante que eles tenham uma ação de build correta. Eles precisam ser um Recurso inserido; caso contrário, o ResourceStringLocalizer não conseguirá localizar os recursos.

Problemas do GitHub com dicas úteis para a solução de problemas