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 OrchardCore má POStringLocalizer . 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:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
- CustomRequestCultureProvider
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 :