Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9749

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

$
0
0

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

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

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

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

使い方

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

startup.cs
publicclassStartup{publicvoidConfigureServices(IServiceCollectionservices){//省略...//ローカリゼーション周りのクラスをDIコンテナに登録する。//.resxファイルはResourcesフォルダに配置するのでResourcesPathを変更services.AddLocalization(options=>options.ResourcesPath="Resources");}publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){//省略...//ミドルウェアの登録及び、オプションの設定app.UseRequestLocalization(options=>{//サポートするカルチャの設定string[]supportedCultures=newstring[]{"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) について見てみようと思います。


Viewing all articles
Browse latest Browse all 9749

Trending Articles