當地語系化擴充性
注意
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
作者為 Hisham Bin Ateya
本文:
- 列出當地語系化 API 的擴充點。
- 提供如何擴充 ASP.NET Core 應用程式當地語系化的指示。
當地語系化 API 中的擴充點
ASP.NET Core 當地語系化 API 已建置為可擴充的。 擴充性讓開發人員能夠根據自己的需求自訂當地語系化。 例如,OrchardCore 有一個 POStringLocalizer
。 POStringLocalizer
會詳細說明如何使用可攜式物件當地語系化,使用 PO
檔案來儲存當地語系化資源。
本文列出當地語系化 API 所提供的兩個主要擴充點:
當地語系化文化特性提供者
ASP.NET Core 當地語系化 API 具有四個預設提供者,可判斷執行中要求目前的文化特性:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
- CustomRequestCultureProvider
當地語系化中介軟體文件中會詳細說明上述提供者。 如果預設提供者不符合您的需求,請使用下列其中一種方法來建立自訂提供者:
使用 CustomRequestCultureProvider
CustomRequestCultureProvider 提供自訂的 RequestCultureProvider,使用簡單的委派來判斷目前的當地語系化文化特性:
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);
}));
使用 RequestCultureProvider 的新實作
RequestCultureProvider 的新實作可建立來從自訂來源判斷要求文化特性資訊。 例如,自訂來源可以是設定檔或資料庫。
下列範例顯示 AppSettingsRequestCultureProvider
,其會擴充 RequestCultureProvider 以判斷來自 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);
}
}
當地語系化資源
ASP.NET Core 當地語系化會提供 ResourceManagerStringLocalizer。 ResourceManagerStringLocalizer 是一個使用 resx
來儲存當地語系化資源的 IStringLocalizer 實作。
您不一定要使用 resx
檔案。 藉由實作 IStringLocalizer
,即可使用任何資料來源。
下列範例專案會實作 IStringLocalizer: