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

Por Hisham Bin AteyaBy Hisham Bin Ateya

Este artigo contém instruções sobre como diagnosticar problemas de localização em aplicativos do ASP.NET Core.This article provides instructions on how to diagnose ASP.NET Core app localization issues.

Problemas de configuração da localizaçãoLocalization configuration issues

Ordem do middleware de localizaçãoLocalization middleware order
O aplicativo pode não localizar porque o middleware de localização não está ordenado conforme o esperado.The app may not localize because the localization middleware isn't ordered as expected.

Para resolver esse problema, verifique se o middleware de localização foi registrado antes do middleware do MVC.To resolve this issue, ensure that localization middleware is registered before MVC middleware. Caso contrário, o middleware de localização não será aplicado.Otherwise, the localization middleware isn't applied.

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

    services.AddMvc();
}

Caminho dos recursos de localização não encontradoLocalization resources path not found

As culturas compatíveis em RequestCultureProvider não correspondem ao registrado uma vezSupported Cultures in RequestCultureProvider don't match with registered once

Problemas de nomenclatura do arquivo de recursoResource file naming issues

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.ASP.NET Core has predefined rules and guidelines for localization resources file naming, which are described in detail here.

Recursos ausentesMissing resources

As causas comuns para não localizar recursos incluem:Common causes of resources not being found include:

  • Nomes de recursos digitados incorretamente no arquivo resx ou na solicitação do localizador.Resource names are misspelled in either the resx file or the localizer request.
  • O recurso está ausente do resx para alguns idiomas, mas presente em outros.The resource is missing from the resx for some languages, but exists in others.
  • 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.If you're still having trouble, check the localization log messages (which are at Debug log level) for more details about the missing resources.

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 de cookie inválido, enquanto c=en-UK|uic=en-US é válido.Hint: When using CookieRequestCultureProvider, verify single quotes are not used with the cultures inside the localization cookie value. For example, c='en-UK'|uic='en-US' is an invalid cookie value, while c=en-UK|uic=en-US is a valid.

Problemas de bibliotecas de recursos e classesResources & Class Libraries issues

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.ASP.NET Core by default provides a way to allow the class libraries to find their resource files via ResourceLocationAttribute.

Problemas comuns com bibliotecas de classes incluem:Common issues with class libraries include:

  • Ausência do ResourceLocationAttribute em uma biblioteca de classes evitará que ResourceManagerStringLocalizerFactory descubra os recursos.Missing the ResourceLocationAttribute in a class library will prevent ResourceManagerStringLocalizerFactory from discovering the resources.
  • Nomenclatura do arquivo de recurso.Resource file naming. Para saber mais, confira a seção Problemas de nomenclatura do arquivo de recurso.For more information, see Resource file naming issues section.
  • Altere o namespace raiz da biblioteca de classes.Changing the root namespace of the class library. Para saber mais, confira a seção Problemas do namespace raiz.For more information, see Root Namespace issues section.

CustomRequestCultureProvider não funciona conforme o esperadoCustomRequestCultureProvider doesn't work as expected

A classe RequestLocalizationOptions tem três provedores padrão:The RequestLocalizationOptions class has three default providers:

  1. QueryStringRequestCultureProvider
  2. CookieRequestCultureProvider
  3. AcceptLanguageHeaderRequestCultureProvider

O CustomRequestCultureProvider permite personalizar como a cultura de localização é fornecida no aplicativo.The CustomRequestCultureProvider allows you to customize how the localization culture is provided in your app. O CustomRequestCultureProvider é usado quando os provedores padrão não atendem aos seus requisitos.The CustomRequestCultureProvider is used when the default providers don't meet your requirements.

  • Um motivo comum para o provedor personalizado não funcionar corretamente é não ser o primeiro provedor na lista RequestCultureProviders.A common reason custom provider don't work properly is that it isn't the first provider in the RequestCultureProviders list. Para resolver esse problema:To resolve this issue:

  • Insira o provedor personalizado na posição 0 da lista RequestCultureProviders, desta maneira:Insert the custom provider at the position 0 in the RequestCultureProviders list as the following:

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.Use AddInitialRequestCultureProvider extension method to set the custom provider as initial provider.

Problemas do namespace raizRoot Namespace issues

Quando o namespace raiz de um assembly for diferente do nome do assembly, a localização não funcionará por padrão.When the root namespace of an assembly is different than the assembly name, localization doesn't work by default. Para evitar esse problema, use RootNamespace, que é descrito em detalhes aquiTo avoid this issue use RootNamespace, which is described in detail here

Aviso

Isso pode ocorrer quando o nome de um projeto não é um identificador .NET válido.This can occur when a project's name is not a valid .NET identifier. Por exemplo, my-project-name.csproj usará o namespace raiz my_project_name e o nome do assembly my-project-name levando a esse erro.For instance my-project-name.csproj will use the root namespace my_project_name and the assembly name my-project-name leading to this error.

Recursos e ação de buildResources & Build Action

Se você usa arquivos de recurso para localização, é importante que eles tenham uma ação de build correta.If you use resource files for localization, it's important that they have an appropriate build action. Eles precisam ser um Recurso inserido; caso contrário, o ResourceStringLocalizer não conseguirá localizar os recursos.They should be Embedded Resource, otherwise the ResourceStringLocalizer is not able to find these resources.