ローカライズの拡張性

作成者: Hisham Bin Ateya

この記事の内容は次のとおりです。

  • ローカライズ API の拡張性ポイントを挙げます。
  • ASP.NET Core アプリのローカライズを拡張する手順を紹介します。

ローカライズ API の拡張性ポイント

ASP.NET Core ローカライズ API は拡張性を持つように作られています。 拡張性により、開発者はそのニーズに合わせてローカライズをカスタマイズできます。 たとえば、OrchardCore には POStringLocalizer があります。 POStringLocalizer では、Portable Object ローカライズPO ファイルを使用し、ローカライズ リソースを格納することが詳しく説明されます。

この記事では、ローカライズ API によって与えられる 2 つの主要な拡張性ポイントを挙げます。

ローカライズ カルチャ プロバイダー

ASP.NET Core ローカライズ API には、実行中の要求の現在のカルチャを決定できる既定のプロバイダーが 4 つあります。

前のプロバイダーの詳しい説明は、ローカライズ ミドルウェア ドキュメントにあります。 既定のプロバイダーでニーズが満たされない場合、次のいずれかの手法でカスタム プロバイダーを構築します。

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 が実装されます。