Solución de problemas de localización de ASP.NET Core

Por Hisham Bin Ateya

En este artículo se proporcionan instrucciones sobre cómo diagnosticar problemas de localización en aplicaciones de ASP.NET Core.

Problemas de configuración de localización

Orden del middleware de localización
Es posible que la aplicación no esté localizada porque el middleware de localización no esté en el orden esperado.

Para resolver este problema, asegúrese de que el middleware de localización esté registrado antes del middleware de MVC. En caso contrario, el middleware de localización no se aplicará.

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

    services.AddMvc();
}

Ruta de acceso a los recursos de localización no encontrada

Error de coincidencia entre las referencias culturales admitidas en RequestCultureProvider y las registradas

Problemas con la nomenclatura de los archivos de recursos

ASP.NET Core ha predefinido reglas y directrices para la nomenclatura de archivos de recursos de localización, que se describen detalladamente Globalización y localización en ASP.NET Core.

Recursos no disponibles

Estas son algunas de las causas que suelen provocar que no se encuentren los archivos:

  • Los nombres de recursos se han escrito mal en el archivo de recursos XML de .NET (.resx) o en la solicitud de localizador.
  • Falta el recurso del archivo de recursos para algunos idiomas, pero existe para otros.
  • Si sigue teniendo problemas, compruebe los mensajes del registro de localización (registrados en el nivel de registro Debug) para obtener más detalles sobre los recursos que faltan.

Sugerencia

Si usa CookieRequestCultureProvider, compruebe que no se usen comillas simples con las referencias culturales dentro del valor de la cookie de localización. Por ejemplo, c='en-UK'|uic='en-US' es un valor de cookie no válido, pero c=en-UK|uic=en-US es válido.

Problemas de recursos y bibliotecas de clases

De manera predeterminada, ASP.NET Core proporciona un método para permitir que las bibliotecas de clases encuentren los archivos de recursos mediante ResourceLocationAttribute.

Estos son algunos de los problemas habituales con las bibliotecas de clases:

CustomRequestCultureProvider no funciona según lo previsto

La clase RequestLocalizationOptions tiene tres proveedores predeterminados:

El CustomRequestCultureProvider le permite personalizar cómo se proporciona la referencia cultural de localización. Si los proveedores predeterminados no cumplen con los requisitos, se usa CustomRequestCultureProvider.

Un motivo común para que un proveedor personalizado no funcione correctamente es que no es el primer proveedor de la lista RequestCultureProviders. Para solucionar este problema:

  • Inserte el proveedor personalizado en la posición cero de la lista RequestCultureProviders:

    options.AddInitialRequestCultureProvider(
        new CustomRequestCultureProvider(async context =>
        {
            // My custom request culture logic
            return new ProviderCultureResult("en");
        }));
    
  • Inserte el proveedor personalizado en la posición cero de la lista RequestCultureProviders:

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

Problemas del espacio de nombres raíz

Si el espacio de nombres raíz de un ensamblado es distinto al nombre del ensamblado, la localización no funcionará de manera predeterminada. Para evitar este problema, use el atributo RootNamespace, que se describe en Globalización y localización en ASP.NET Core.

Advertencia

Se puede producir un problema de espacio de nombres raíz cuando el nombre de un proyecto no es un identificador de .NET válido. Por ejemplo, my-project-name.csproj usa el espacio de nombres raíz my_project_name y el nombre del ensamblado my-project-name, lo que produce este error.

Recursos y acción de compilación

Si usa archivos de recursos para la localización, es importante que estos tengan una acción de compilación adecuada. Use recursos insertados; de lo contrario, no podrá encontrar ResourceStringLocalizer.

Anulación de ubicación mediante el panel "Sensores" en las herramientas de desarrollo

Al usar la invalidación de ubicación mediante el panel Sensores en Google Chrome o las herramientas de desarrollo de Microsoft Edge, el idioma alternativo se restablece después de la representación previa. Evite establecer el idioma mediante el panel Sensores al realizar pruebas. Establezca el idioma mediante la configuración de idioma del explorador.

Para obtener más información, consulte Blazor Localización no funciona con InteractiveServer (dotnet/aspnetcore #53707).

Incidencias de GitHub con sugerencias útiles para resolver problemas