ASP.NET Coreのローカリゼーション周りのメモ
ASP.NET Core のローカリゼーション回りのソースを読んだのでメモ
調べたバージョンはASP.NET Core 3.1
IStringLocalizer
, IStringLocalizerFactory
あたりは今回は触れません。
ここではミドルウェア周りについて触れます
使い方
詳細はこちら に書いているので
ここではさらっと触れるのみとします。
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
にセットしています。
カルチャーに関する情報はデフォルトでは
- クエリストリング
- Cookie
-
Accept-Language
リクエストヘッダー
の順序で解決が行われます。
これらの内容は RequestLocalizationOptions
で設定を行います。
RequestLocalizationOptions
クラス
ソースはこちら
上記の RequestLocalizationMiddleware
でカルチャの解決に使用するオプションを定義しています。
これらのプロパティについて紹介します。
RequestCultureProviders
プロパティ
HttpContext
からカルチャの解決を行っているものの正体です。
デフォルトでは
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- 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
プロパティ
カルチャが見つからなかったときにフォールバックするか?の設定のようです。
例えば
-
SupportedCultures
がja
- リクエストから解決したカルチャが
ja-JP
のときにja
を使うといったことが可能なようです。
RequestLocalizationMiddleware
クラスのGetCultureInfo
メソッドあたりで使われています。
終わりに
今回はカルチャの解決方法について注目してソースを確認しました。
次は利用する側(IStringLocalizer
, IStringLocalizerFactory
) について見てみようと思います。