Extensibilité de la localisation

Par Hisham Bin Ateya

Cet article :

  • Répertorie les points d’extensibilité sur les API de localisation.
  • Fournit des instructions sur la façon d’étendre la localisation des applications ASP.NET Core.

Points extensibles dans les API de localisation

Les API de localisation ASP.NET Core sont conçues pour être extensibles. L’extensibilité permet aux développeurs de personnaliser la localisation en fonction de leurs besoins. Par exemple, OrchardCore a un POStringLocalizer. POStringLocalizer décrit en détail l’utilisation de la Localisation d’objet portable pour utiliser des fichiers PO afin de stocker des ressources de localisation.

Cet article répertorie les deux principaux points d’extensibilité fournis par les API de localisation :

Fournisseurs de culture de localisation

Les API de localisation ASP.NET Core incluent quatre fournisseurs par défaut qui peuvent déterminer la culture actuelle d’une requête d’exécution :

Les fournisseurs précédents sont décrits en détail dans la documentation de l’intergiciel de localisation. Si les fournisseurs par défaut ne répondent pas à vos besoins, créez un fournisseur personnalisé à l’aide de l’une des approches suivantes :

Utiliser CustomRequestCultureProvider

CustomRequestCultureProvider fournit un RequestCultureProvider personnalisé qui utilise un délégué simple pour déterminer la culture de localisation actuelle :

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);
}));

Utiliser une nouvelle implémentation de RequestCultureProvider

Une nouvelle implémentation de RequestCultureProvider peut être créée pour déterminer les informations de culture de requête à partir d’une source personnalisée. Par exemple, la source personnalisée peut être un fichier de configuration ou une base de données.

L’exemple suivant montre AppSettingsRequestCultureProvider, qui étend le RequestCultureProvider pour déterminer les informations de culture de requête à partir 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);
    }
}

Ressources de localisation

La localisation ASP.NET Core fournit ResourceManagerStringLocalizer. ResourceManagerStringLocalizer est une implémentation de IStringLocalizer qui utilise resx pour stocker des ressources de localisation.

Vous n’êtes pas limité à l’utilisation de fichiers resx. En implémentant IStringLocalizer, n’importe quelle source de données peut être utilisée.

Les exemples de projets suivants implémentent IStringLocalizer :