Extensibilidad de la localización

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:

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: