Rozšiřitelnost lokalizace

Podle Hisham bin Ateya

Tento článek:

  • Uvádí body rozšiřitelnosti na rozhraních API lokalizace.
  • poskytuje pokyny, jak roztáhnout lokalizaci aplikace ASP.NET Core.

Rozšiřitelné body v rozhraních API lokalizace

rozhraní api pro lokalizaci ASP.NET Core jsou sestavená tak, aby byla rozšiřitelná. Rozšiřitelnost umožňuje vývojářům přizpůsobit lokalizaci podle jejich potřeb. Například OrchardCorePOStringLocalizer . POStringLocalizer podrobně popisuje použití lokalizace přenosných objektů k používání PO souborů k ukládání prostředků lokalizace.

Tento článek obsahuje seznam dvou hlavních bodů rozšiřitelnosti, které poskytují rozhraní API pro lokalizaci:

Poskytovatelé jazykové verze lokalizace

rozhraní api pro ASP.NET Core lokalizace mají čtyři výchozí poskytovatele, kteří mohou určit aktuální jazykovou verzi zpracovávané žádosti:

Předchozí poskytovatelé jsou podrobněji popsáni v dokumentaci k lokalizačnímu middlewaru . Pokud výchozí zprostředkovatelé nevyhovují vašim potřebám, sestavte vlastního zprostředkovatele pomocí jednoho z následujících přístupů:

Použití CustomRequestCultureProvider

CustomRequestCultureProvider poskytuje vlastní RequestCultureProvider použití jednoduchého delegáta k určení aktuální jazykové verze lokalizace:

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

Použít nový implemetation z RequestCultureProvider

Je RequestCultureProvider možné vytvořit novou implementaci, která určuje informace o jazykové verzi žádosti z vlastního zdroje. Vlastní zdroj může být například konfigurační soubor nebo databáze.

Následující příklad ukazuje AppSettingsRequestCultureProvider , který rozšiřuje na RequestCultureProvider k určení informací o jazykové verzi žádosti z 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);
    }
}

Prostředky lokalizace

ASP.NET Core lokalizace ResourceManagerStringLocalizer . ResourceManagerStringLocalizer je implementací IStringLocalizer , která se používá resx k ukládání prostředků lokalizace.

Nejste omezeni používáním resx souborů. Implementací IStringLocalizer lze použít libovolný zdroj dat.

Následující příklady projektů implementují IStringLocalizer :