ASP.NET MVC ベリーシンプル多言語対応【2019 アドカレ】


概要

ASP.NET MVC で多言語対応をこころみてみます。多言語対応だけシンプルにこころみます。

(2020-03-07)アップグレード版を書きました。

ベリーシンプル多言語対応

  1. 各言語リソースファイル作成
  2. 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 というテキストを用意したなら……

こういうふうに呼び出します。

Views/Home/Index.cshtml
@MyApp.Resources.I18n.Foo.Localize.String1

実はこの時点で CurrentUICulture の値に応じた言語スイッチが可能になっています。 CurrentUICulture というのは System.Threading.Thread.CurrentThread.CurrentUICulture のことで、上述したカルチャの情報を設定する項目みたいですね。値を en-GB とかにすると Localize.en.resx の String1 が呼び出されます。

Controllers/HomeController.cs
// CurrentUICulture の変更。
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-GB");

プログラム内で言語を切り替えるだけでよいのならここでおしまいです。

Accept-Language に応じた言語切り替え

トップディレクトリの Web.config の system.web タグ内に <globalization culture="auto" uiCulture="auto" /> を記述します。

Web.config
<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: メニュー > オプション > 言語

毎回ブラウザの再起動が必要になってしまうので、ふたつ開いてそれぞれでアクセスして確認するとラクでした。