ASP.NET Core の言語別のViewを用意した国際化の方法

目次

概要

ASP.NET Core で、国際化、多言語化の方法として、言語別の表示したい情報を書いたViewのファイルを用意して、それを表示させる方法を紹介します。

環境

  • ASP.NET Core 2.0
  • NET Core 2.0

仕組み

国際化の仕組みと方法はいくつかあるのですが、ここではサフィックスを使ったViewの国際化の方法を紹介します。

プレフィックスを使ったViewの国際化の仕組みは、言語別の情報を書いたViewを用意するときに、一工夫します。

この用意したViewは、いつもと同じ場所に保存するのですが、名前を「*\*.cshtml」のように保存するのではなく、言語の情報を加えて「**.en.cshtml」のようにサフィックスをつけて保存します。

この場合、en なので、英語ということになります。

そして、デフォルトで表示したいViewはいつも通り、「***.cshtml」で保存します。

このように、Viewのファイルを用意していて、それを実行時に送られてくる言語の情報とファイルのサフィックスを元に適切なViewを返しているという仕組みです。

方法

しかし、ファイルを用意して適切な名前をつけてすぐに使えるというわけではなく、国際化をするということを実行時に設定して置く必要があります。

そこで、その設定方法を書いておきます。

いくつかの設定をするのですが、まずは、Startup.cs の ConfigureServices メソッドを書き換えます。

ConfigureServices メソッドには、「services.AddMvc()」 というコードがあり、そこを下記のように書き換えます。

services.AddMvc()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);

a メソッドチェーンを利用して、AddViewLocalization メソッドを実行します。

これで、サフィックスを使ったViewの国際化をするということを設定できました。

さらに、どの言語や国で国際化するのかを設定します。

これは、Startup.cs の Configure メソッドで設定します。

var supportedCultures = new[]
{
    new CultureInfo("ja-JP"),
    new CultureInfo("en-US"),
    new CultureInfo("ja"),
    new CultureInfo("en")
};

app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("ja-JP"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
});

UseRequestLocalization メソッドで、どの言語で国際化するのかを指定します。

ここでは、日本語と英語の二つに対応し、DefaultRequestCulture で、デフォルトの言語を日本語として指定します。

SupportedCultures と SupportedUICultures に指定したものが国際化の対象となります。

国際化の対象は、CultureInfoクラスで表現します。

配列として SupportedCultures や SupportedUICultures に設定する場合は、配列の添え字が小さい順から比較して最初にマッチしたものがViewが表示されます。

ちなみに、ここで設定した文字列を、Viewのサフィックスとして、.cshml の前につけます。

実は、SupportedCultures に言語を設定しておくと、プログラム中で扱っている数字や日付などの情報も国際化されます。

少し話が脱線しますが、「en-US」と「en」のように英語を表すものを二つ指定します。

これは、英語などの世界中で使われているような言語の場合、同じ英語でもイギリス英語やアメリカ英語のように、国や地域によって、言葉遣いが異なることがあり、en-US の場合、言語が英語でもアメリカにマッチし、enの場合、全ての英語にマッチします。

最後に

これで、ひとまず国際化に対応できました。

しかし、このままでは、データの保存時にするValidationなどのエラーメッセージを国際化できていません。

それらの国際化については、別の記事で説明したいと思います。