Partilhar via


Resolução de problemas de localização no ASP.NET Core

Por Hisham Bin Ateya

Este artigo fornece instruções sobre como diagnosticar problemas de localização de aplicações ASP.NET Core.

Problemas de configuração de localização

Ordem do middleware de localização
A aplicação pode não localizar porque o middleware de localização não está ordenado como esperado.

Para resolver este problema, certifique-se de que o middleware de localização está registado antes do middleware MVC. Caso contrário, o middleware de localização não é aplicado.

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

    services.AddMvc();
}

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

As Culturas Suportadas no RequestCultureProvider não coincidem com as registadas

Problemas de nomenclatura de ficheiros de recursos

ASP.NET Core tem regras e diretrizes pré-definidas para a nomeação de ficheiros de recursos de localização, descritas em Globalização e localização no ASP.NET Core.

Recursos em falta

As causas comuns de não serem encontrados recursos incluem:

  • Seja no ficheiro XML do .NET .resx ou no pedido do localizador, os nomes dos recursos são escritos incorretamente.
  • O recurso está ausente do ficheiro de recursos em algumas línguas, mas existe noutras.
  • Se ainda tiver dificuldades, consulte as mensagens do log de localização (registadas ao Debug nível de log) para obter mais detalhes sobre os recursos em falta.

Sugestão

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

Recursos e questões relacionadas com as bibliotecas de classes

ASP.NET Core por padrão fornece uma forma de permitir que as bibliotecas de classes encontrem os seus ficheiros de recursos através de ResourceLocationAttribute.

Problemas comuns com bibliotecas de classes incluem:

CustomRequestCultureProvider não funciona como esperado

A RequestLocalizationOptions classe tem três fornecedores predefinidos:

Permite-te CustomRequestCultureProvider personalizar a forma como a cultura de localização é fornecida. O CustomRequestCultureProvider é usado quando os fornecedores padrão não cumprem os seus requisitos.

Uma razão comum para um fornecedor personalizado não funcionar corretamente é que não é o primeiro fornecedor da RequestCultureProviders lista. Para resolver esse problema:

  • Insira o fornecedor personalizado na posição zero da RequestCultureProviders lista:

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

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

Problemas com o namespace raiz

Quando o namespace raiz de uma assembleia é diferente do nome da assembleia, a localização não funciona por defeito. Para evitar este problema, use o RootNamespace atributo, que é descrito em Globalização e localização no ASP.NET Core.

Advertência

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 espaço de nomes raiz my_project_name e o nome da assembly my-project-name, o que resulta neste erro.

Recursos e ação de construção

Se usar ficheiros de recurso para localização, é importante que eles tenham uma ação de compilação apropriada. Utilize Recursos Incorporados; caso contrário, o ResourceStringLocalizer não conseguirá encontrar esses recursos.

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

Ao usar a substituição da localização no painel Sensores nas ferramentas de desenvolvedor do Google Chrome ou do Microsoft Edge, o idioma de reserva é redefinido após a pré-renderização. Evite definir o idioma usando o painel Sensores durante o teste. Defina o idioma usando as configurações de idioma do navegador.

Para obter mais informações, consulte Blazor a localização não é compatível com o InteractiveServer (dotnet/aspnetcore #53707).

Problemas no GitHub com dicas úteis para resolução de problemas