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:
- Falta ResourceLocationAttribute en la biblioteca de clases, lo que impide que ResourceManagerStringLocalizerFactory detecte los recursos.
- Nomenclatura de los archivos de recursos. Para obtener más información, consulte la sección Problemas con la nomenclatura de los archivos de recursos.
- Cambio del espacio de nombres raíz de la biblioteca de clases. Para obtener más información, consulte la sección Problemas con el espacio de nombres raíz.
CustomRequestCultureProvider
no funciona según lo previsto
La clase RequestLocalizationOptions tiene tres proveedores predeterminados:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
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"); }));
- Use el método de la extensión AddInitialRequestCultureProvider para establecer el proveedor personalizado como el inicial.
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).