3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ASP.NET Coreのローカリゼーション周りのメモ

Posted at

ASP.NET Coreのローカリゼーション周りのメモ

ASP.NET Core のローカリゼーション回りのソースを読んだのでメモ

調べたバージョンはASP.NET Core 3.1

IStringLocalizer, IStringLocalizerFactory あたりは今回は触れません。
ここではミドルウェア周りについて触れます

使い方

詳細はこちら に書いているので
ここではさらっと触れるのみとします。

startup.cs
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        //省略...

        //ローカリゼーション周りのクラスをDIコンテナに登録する。
        //.resxファイルはResourcesフォルダに配置するのでResourcesPathを変更
        services.AddLocalization(options => options.ResourcesPath = "Resources");
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        //省略...

        //ミドルウェアの登録及び、オプションの設定
        app.UseRequestLocalization(options =>
        {
            //サポートするカルチャの設定
            string[] supportedCultures = new string[] {"ja", "en"};

            options
                .AddSupportedCultures(supportedCultures)
                .AddSupportedUICultures(supportedCultures)
                .SetDefaultCulture(supportedCultures[0])
                ;
        });
        //省略...
    }
}

あとは利用側でIStringLocalizer<T> をインジェクションし、T に相当するクラス及びResources/T.ja.resx, Resources/T.en.resx を用意すればよいです。

RequestLocalizationMiddleware クラス

ApplicationBuilderExtensionsクラスのUseRequestLocalization メソッドを実行する事で登録されます。

RequestLocalizationMiddleware クラスのソースはこちら

HttpContextから カルチャーに関する情報を取得し SetCurrentThreadCultureメソッドで CultureInfo.CurrentCulture, CultureInfo.CurrentUICultureにセットしています。

カルチャーに関する情報はデフォルトでは

  1. クエリストリング
  2. Cookie
  3. Accept-Language リクエストヘッダー

の順序で解決が行われます。
これらの内容は RequestLocalizationOptions で設定を行います。

RequestLocalizationOptions クラス

ソースはこちら

上記の RequestLocalizationMiddleware でカルチャの解決に使用するオプションを定義しています。

これらのプロパティについて紹介します。

RequestCultureProviders プロパティ

HttpContext からカルチャの解決を行っているものの正体です。

デフォルトでは

  1. QueryStringRequestCultureProvider
  2. CookieRequestCultureProvider
  3. AcceptLanguageHeaderRequestCultureProvider

の3つがListの要素に設定されています。

解決に用いるキーの名前はインスタンスプロパティとして定義されているので変更することができます。
(例 CookieRequestCultureProviderのCookie名が .AspNetCore.Culture という値であり ASP.NET Core を使用している事を外部に公開していることになるので、この名前を変更したい という要望に対応することができます。 )

このRequestCultureProvidersプロパティを変更することで、解決の順序を変更することや、新しいカルチャ解決の方法を追加することも可能です
(例. HttpContext が渡されているので Claim から解決することもおそらく可能ではないかと思います。)

新しいカルチャ解決の方法を実装する際はRequestCultureProviderを継承
もしくはCustomRequestCultureProvider
に直接ラムダ式を記述すれば可能です。

AddInitialRequestCultureProvider拡張メソッドを呼ぶことで、先頭に追加することも可能です。

SupportedCultures, SupportedUICultures, DefaultRequestCulture プロパティ

サポートしているカルチャの一覧です。

DefaultRequestCulture はカルチャが解決できなかった時に使用されるデフォルトのカルチャです。

プロパティに直接セットすることも可能ですが
AddSupportedCultures, AddSupportedUICultures, SetDefaultCultureメソッドを呼ぶことでもセット可能です。
(Addという名前で始まっていますがソースを見た感じ総入れ替えが行われているように見える..🤔)

FallBackToParentCultures, FallBackToParentUICultures プロパティ

カルチャが見つからなかったときにフォールバックするか?の設定のようです。

例えば

  • SupportedCulturesja
  • リクエストから解決したカルチャがja-JP

のときにja を使うといったことが可能なようです。

RequestLocalizationMiddlewareクラスのGetCultureInfo
メソッドあたりで使われています。

終わりに

今回はカルチャの解決方法について注目してソースを確認しました。

次は利用する側(IStringLocalizer, IStringLocalizerFactory) について見てみようと思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?