Extensibilidad de la localización
Nota:
Esta no es la versión más reciente de este artículo. Para la versión actual, consulte la versión .NET 8 de este artículo.
Advertencia
Esta versión de ASP.NET Core ya no se admite. Para obtener más información, consulte la Directiva de soporte técnico de .NET y .NET Core. Para la versión actual, consulte la versión .NET 8 de este artículo.
Importante
Esta información hace referencia a un producto en versión preliminar, el cual puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.
Para la versión actual, consulte la versión .NET 8 de este artículo.
Por Hisham Bin Ateya
Este artículo:
- Enumera los puntos de extensibilidad en las API de localización.
- Proporciona instrucciones sobre cómo extender la localización en aplicaciones ASP.NET Core.
Puntos extensibles en las API de localización
Las API de localización de ASP.NET Core están diseñadas para ser extensibles. La extensibilidad permite a los desarrolladores personalizar la localización según sus necesidades. Por ejemplo, OrchardCore tiene un elemento POStringLocalizer
. POStringLocalizer
describe en detalle el uso de Localización de un objeto portátil para usar archivos PO
con el fin de almacenar los recursos de localización.
En este artículo se enumeran los dos puntos de extensibilidad principales que proporcionan las API de localización:
Proveedores de referencias culturales de localización
Las API de localización de ASP.NET Core tienen cuatro proveedores por defecto que pueden determinar la referencia cultural actual de una solicitud en ejecución:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
- CustomRequestCultureProvider
Los proveedores anteriores se describen de forma detallada en la documentación del middleware de localización. Si los proveedores predeterminados no satisfacen sus necesidades, cree un proveedor personalizado mediante uno de los métodos siguientes:
Uso de CustomRequestCultureProvider
CustomRequestCultureProvider proporciona un elemento RequestCultureProvider personalizado que utiliza un delegado simple para determinar la referencia cultural de localización actual:
options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
var currentCulture = "en";
var segments = context.Request.Path.Value.Split(new char[] { '/' },
StringSplitOptions.RemoveEmptyEntries);
if (segments.Length > 1 && segments[0].Length == 2)
{
currentCulture = segments[0];
}
var requestCulture = new ProviderCultureResult(currentCulture);
return Task.FromResult(requestCulture);
}));
options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
{
var currentCulture = "en";
var segments = context.Request.Path.Value.Split(new char[] { '/' },
StringSplitOptions.RemoveEmptyEntries);
if (segments.Length > 1 && segments[0].Length == 2)
{
currentCulture = segments[0];
}
var requestCulture = new ProviderCultureResult(currentCulture);
return Task.FromResult(requestCulture);
}));
Uso de una nueva implementación de RequestCultureProvider
Se puede crear una nueva implementación de RequestCultureProvider que determine la información de referencia cultural de la solicitud de un origen personalizado. Por ejemplo, el origen personalizado puede ser una base de datos o un archivo de configuración.
En el ejemplo siguiente se muestra el elemento AppSettingsRequestCultureProvider
, que extiende el elemento RequestCultureProvider para determinar la información de referencia cultural de la solicitud de appsettings.json
:
public class AppSettingsRequestCultureProvider : RequestCultureProvider
{
public string CultureKey { get; set; } = "culture";
public string UICultureKey { get; set; } = "ui-culture";
public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException();
}
var configuration = httpContext.RequestServices.GetService<IConfigurationRoot>();
var culture = configuration[CultureKey];
var uiCulture = configuration[UICultureKey];
if (culture == null && uiCulture == null)
{
return Task.FromResult((ProviderCultureResult)null);
}
if (culture != null && uiCulture == null)
{
uiCulture = culture;
}
if (culture == null && uiCulture != null)
{
culture = uiCulture;
}
var providerResultCulture = new ProviderCultureResult(culture, uiCulture);
return Task.FromResult(providerResultCulture);
}
}
Recursos de localización
La localización de ASP.NET Core proporciona ResourceManagerStringLocalizer. ResourceManagerStringLocalizer es una implementación de IStringLocalizer que usa resx
para almacenar los recursos de localización.
No es necesario limitarse a los archivos resx
. Al implementar IStringLocalizer
, se puede usar cualquier origen de datos.
En los proyectos de ejemplo siguientes, se implementa IStringLocalizer: