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 recursos de localização, que são descritas na Globalização e localização no ASP.NET Core.

Recursos ausentes

As causas comuns para não localizar recursos incluem:

  • Nomes de recursos digitados incorretamente no arquivo de recurso XML .NET (.resx) ou na solicitação do localizador.
  • O recurso está ausente do arquivo de recurso para alguns idiomas, mas presente em outros.
  • Se ainda houver problemas, verifique as mensagens de log de localização (registradas 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. Por exemplo, c='en-UK'|uic='en-US' é um valor cookie inválido, enquanto c=en-UK|uic=en-US é válido.

Problemas de recursos e bibliotecas de 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:

CustomRequestCultureProvider não funciona conforme o esperado

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

O CustomRequestCultureProvider permite personalizar como a cultura de localização é fornecida. 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 zero na lista RequestCultureProviders:

    options.AddInitialRequestCultureProvider(
        new CustomRequestCultureProvider(async context =>
        {
            // My custom request culture logic
            return new ProviderCultureResult("en");
        }));
    
  • Insira o provedor personalizado na posição zero na lista RequestCultureProviders:

    options.RequestCultureProviders.Insert(0, 
        new CustomRequestCultureProvider(async context =>
        {
            // My custom request culture logic
            return new ProviderCultureResult("en");
        }));
    

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 o atributo RootNamespace, que é descrito em Globalização e localização no ASP.NET Core.

Aviso

Um problema de namespace raiz pode ocorrer quando o nome de um projeto não é um identificador .NET válido. Por exemplo, my-project-name.csproj usa o namespace raiz my_project_name e o nome do assembly my-project-name, o que resulta nesse 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. Use o Recurso inserido; caso contrário, o ResourceStringLocalizer não é capaz de localizar esses recursos.

Substituição de local usando o painel "Sensores" nas ferramentas de desenvolvedor

Ao usar a substituição de local usando o painel Sensores nas ferramentas de desenvolvedor do Google Chrome ou do Microsoft Edge, a linguagem de fallback é redefinida após a pré-renderização. Evite definir o idioma usando o painel Sensores ao testar. Defina o idioma usando as configurações de idioma do navegador.

Para obter mais informações, consulte Blazor A localização não funciona com InteractiveServer (dotnet/aspnetcore nº 53707).

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