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 aquí.
Recursos no disponibles
Estas son algunas de las causas que suelen provocar que no se encuentren los archivos:
- Los nombres de los recursos están mal escritos, bien en el archivo
resx
, bien en la solicitud del localizador. - Falta el recurso en
resx
para algunos idiomas, pero existe para otros. - Si sigue teniendo problemas, compruebe los mensajes del registro de localización (que están en el nivel de registro
Debug
) para obtener información detallada sobre los recursos que faltan.
Consejo: 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 las bibliotecas de clases y recursos
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 queResourceManagerStringLocalizerFactory
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, vea 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
CustomRequestCultureProvider permite personalizar el modo en el que se proporciona la referencia cultural de localización en la aplicación. Si los proveedores predeterminados no cumplen con los requisitos, se usa CustomRequestCultureProvider
.
Un motivo habitual por el que un proveedor personalizado no funciona adecuadamente es que no es el primero en la lista
RequestCultureProviders
. Para resolver este problema, haga lo siguiente:Inserte el proveedor personalizado en la posición 0 de la lista
RequestCultureProviders
, como en el ejemplo siguiente:
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 el método de extensión
AddInitialRequestCultureProvider
para establecer el proveedor personalizado como el inicial.
Problemas con el 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 RootNamespace, procedimiento que se describe detalladamente aquí.
Advertencia
Esto puede ocurrir cuando el nombre de un proyecto no es un identificador de .NET válido. Por ejemplo my-project-name.csproj
usará el espacio de nombres raíz my_project_name
y el nombre de ensamblado my-project-name
, lo que lleva a este error.
Acción de compilación y recursos
Si usa archivos de recursos para la localización, es importante que estos tengan una acción de compilación adecuada. Deben ser recursos insertados, puesto que, de lo contrario, ResourceStringLocalizer
no podrá encontrarlos.
Incidencias de GitHub con sugerencias útiles para resolver problemas
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de