當地語系化擴充性

作者為 Hisham Bin Ateya

本文:

  • 列出當地語系化 API 的擴充點。
  • 提供如何擴充 ASP.NET Core 應用程式當地語系化的指示。

當地語系化 API 中的擴充點

ASP.NET Core 當地語系化 API 已建置為可擴充的。 擴充性讓開發人員能夠根據自己的需求自訂當地語系化。 例如,OrchardCore 有一個 POStringLocalizerPOStringLocalizer 會詳細說明如何使用可攜式物件當地語系化,使用 PO 檔案來儲存當地語系化資源。

本文列出當地語系化 API 所提供的兩個主要擴充點:

當地語系化文化特性提供者

ASP.NET Core 當地語系化 API 具有四個預設提供者,可判斷執行中要求目前的文化特性:

當地語系化中介軟體文件中會詳細說明上述提供者。 如果預設提供者不符合您的需求,請使用下列其中一種方法來建立自訂提供者:

使用 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 當地語系化會提供 ResourceManagerStringLocalizerResourceManagerStringLocalizer 是一個使用 resx 來儲存當地語系化資源的 IStringLocalizer 實作。

您不一定要使用 resx 檔案。 藉由實作 IStringLocalizer,即可使用任何資料來源。

下列範例專案會實作 IStringLocalizer