概要
ASP.NET MVC で多言語対応をこころみてみます。多言語対応だけシンプルにこころみます。
(2020-03-07)アップグレード版を書きました。
ベリーシンプル多言語対応
- 各言語リソースファイル作成
- http リクエストの
Accept-Language
に応じて言語を切り替えるよう設定
これだけやります。
今回やることを図にして整理
図にするとこうですね。
解説していきます。
今回使うプロジェクト
今回使うプロジェクトは次のように New しました。
- ASP.NET Web Application (.NET Framework)
- .NET Framework 4.7.2
- MVC
- Authentication: No Authentication
各言語リソースファイル作成
リソースファイルは拡張子 resx のファイルですね。多言語対応のためのリソースファイルは xxxx.[culture name].resx という名称でつくります。デフォルトの言語リソースと、多言語のリソースは同じ階層に並べましょう。リソースファイルのアクセス修飾子は忘れず Public
にします。
- Localize.resx: デフォルトで使うもの
- Localize.ja.resx: ja カルチャで使うもの
- Localize.en.resx: en カルチャで使うもの
場所は?
場所はどこでもよさそうです。私は Resource/I18n/Foo/Localize.resx みたいなフォルダ階層をつくって置きます。 I18n は internationalization の略です。
カルチャ?
カルチャというのは、 http リクエストヘッダ Accept-Language
の値のことみたいです。サイトの閲覧者さんが、何語を求めているかということですね。
resx なくない?
ないですね。
ないときもあるみたいです。そういうときはリストにとらわれず resx の拡張子を手打ちしてファイルを作成すれば OK です。(えぇー?!
あるいはすでにある resx ファイルをどこかから見つけてきて、 Add Existing Item から追加することもできます。
リソースに書いたテキストを使うには?
String1
というテキストを用意したなら……
こういうふうに呼び出します。
@MyApp.Resources.I18n.Foo.Localize.String1
実はこの時点で CurrentUICulture
の値に応じた言語スイッチが可能になっています。 CurrentUICulture
というのは System.Threading.Thread.CurrentThread.CurrentUICulture
のことで、上述したカルチャの情報を設定する項目みたいですね。値を en-GB
とかにすると Localize.en.resx の String1
が呼び出されます。
// CurrentUICulture の変更。
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-GB");
プログラム内で言語を切り替えるだけでよいのならここでおしまいです。
Accept-Language に応じた言語切り替え
トップディレクトリの Web.config の system.web
タグ内に <globalization culture="auto" uiCulture="auto" />
を記述します。
<system.web>
<compilation debug="true" targetFramework="4.7.2" />
<httpRuntime targetFramework="4.7.2" />
<globalization culture="auto" uiCulture="auto" /> <!-- 追加 -->
</system.web>
リクエスト・ヘッダの Accept-Language
に応じて、自動で CurrentUICulture
が変わるようになります。ということはつまり、 Accept-Language
に応じて言語が切り替わるようになるってことですね。
Accept-Language はどう変更する?
- Chrome: メニュー > 設定 > 詳細設定 > 言語
- Firefox: メニュー > オプション > 言語
毎回ブラウザの再起動が必要になってしまうので、ふたつ開いてそれぞれでアクセスして確認するとラクでした。