Rozšiřitelnost lokalizace

Podle Hisham Bin Ateya

Tento článek:

  • Vypíše body rozšiřitelnosti na lokalizačních rozhraních API.
  • Obsahuje pokyny k rozšíření lokalizace aplikace ASP.NET Core.

Rozšiřitelné body v lokalizačních rozhraních API

ASP.NET rozhraní API pro lokalizaci jádra jsou sestavená tak, aby byla rozšiřitelná. Rozšiřitelnost umožňuje vývojářům přizpůsobit lokalizaci podle svých potřeb. Například OrchardCore má .POStringLocalizer POStringLocalizer podrobně popisuje použití lokalizace Portable Object k použití PO souborů k ukládání lokalizačních prostředků.

Tento článek uvádí dva hlavní body rozšiřitelnosti, které poskytují lokalizační rozhraní API:

Poskytovatelé lokalizační jazykové verze

ASP.NET rozhraní API pro lokalizaci jádra mají čtyři výchozí zprostředkovatele, kteří můžou určit aktuální jazykovou verzi spuštěné žádosti:

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

Použití CustomRequestCultureProvider

CustomRequestCultureProvider poskytuje vlastní, RequestCultureProvider který pomocí jednoduchého delegáta určí aktuální jazykovou verzi 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žití nové implementace RequestCultureProvider

Můžete vytvořit novou implementaci RequestCultureProvider , která určuje informace o jazykové verzi požadavku 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 RequestCultureProvider o určení informací o jazykové verzi požadavku 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);
    }
}

Zdroje informací o lokalizaci

ASP.NET Core lokalizace poskytuje ResourceManagerStringLocalizer. ResourceManagerStringLocalizerje implementace, která se používá resx k ukládání lokalizačních IStringLocalizer prostředků.

Nejste omezeni na používání resx souborů. Implementací IStringLocalizerlze použít jakýkoli zdroj dat.

Následující ukázkové projekty implementují IStringLocalizer: