none
ASP.NET MVCでの多言語対応について RRS feed

  • 質問

  • ASP.NET(MVC)で多言語対応をとるのために、それぞれの言語用にリソースファイルを

    用意しています。

    Modelクラスでは、Dislpay属性で言語に対応した表示名を取得しようとしています。

    今、ブラウザーの言語設定を変更すると、自動的にリソースファイルを識別してそれぞれ

    の言語に対応した表示名を取得してくれるのですが、ブラウザの言語切替はおこなわない

    で画面のボタン(またはリンク)クリックでおこなおうとした場合、どういったやり方が

    あるのでしょうか?

    (URLを分けることは考えていません)

    以上、よろしくお願いいたします。

    2017年1月24日 2:44

回答

  • ご存知かもしれませんが・・・

    web.config で globalization 要素の uiCulture, culture 属性を auto に設定すると、ASP.NET は、ブラウザから送信されてくる要求ヘッダに含まれる Accept-Language の設定を調べて、その要求を処理するスレッドのカルチャを Accept-Language に設定されているカルチャに書き換えるようです。

    そして、リソースマネージャが実行時に、Thread.CurrentUICulture などで得られる CultureInfo(現在の要求を処理しているスレッドのカルチャ情報)を参照してローカライズされたリソースを検索し、UI に表示されるテキストを取得するという仕組みになっています。

    ・・・という訳で、例えば、.ja-JP.resx というリソースファイルがあるとして、それに設定してあるテキストを表示したい場合は、コントローラーのアクションメソッドで以下のようなコードで CurrentUICulture を書き換えてやればよいはずです。

    System.Threading.Thread.CurrentThread.CurrentUICulture =
         new System.Globalization.CultureInfo("ja-JP");

    一応以下の記事のサンプルで検証してみました。

    データアノテーション検証の多言語対応
    http://surferonwww.info/BlogEngine/post/2014/09/11/multi-languages-message-for-data-annotation.aspx

    web.config で globalization 要素の uiCulture, culture 属性を auto に設定して、ブラウザの言語設定を en-US にしても、上記のコードがあると .ja-JP.resx からテキストを取得して表示することは確認しました。

    だたし、

    > 画面のボタン(またはリンク)クリックでおこなおうとした場合、どういったやり方が
    > あるのでしょうか?

    ・・・とのことですが、ボタンクリック等で CurrentUICulture の設定を変えるということが、質問者さんのケースで現実的なのかどうかは分かりません。

    そのあたりは質問者さんの方で検討してみてください。



    2017年1月24日 3:52

すべての返信

  • ご存知かもしれませんが・・・

    web.config で globalization 要素の uiCulture, culture 属性を auto に設定すると、ASP.NET は、ブラウザから送信されてくる要求ヘッダに含まれる Accept-Language の設定を調べて、その要求を処理するスレッドのカルチャを Accept-Language に設定されているカルチャに書き換えるようです。

    そして、リソースマネージャが実行時に、Thread.CurrentUICulture などで得られる CultureInfo(現在の要求を処理しているスレッドのカルチャ情報)を参照してローカライズされたリソースを検索し、UI に表示されるテキストを取得するという仕組みになっています。

    ・・・という訳で、例えば、.ja-JP.resx というリソースファイルがあるとして、それに設定してあるテキストを表示したい場合は、コントローラーのアクションメソッドで以下のようなコードで CurrentUICulture を書き換えてやればよいはずです。

    System.Threading.Thread.CurrentThread.CurrentUICulture =
         new System.Globalization.CultureInfo("ja-JP");

    一応以下の記事のサンプルで検証してみました。

    データアノテーション検証の多言語対応
    http://surferonwww.info/BlogEngine/post/2014/09/11/multi-languages-message-for-data-annotation.aspx

    web.config で globalization 要素の uiCulture, culture 属性を auto に設定して、ブラウザの言語設定を en-US にしても、上記のコードがあると .ja-JP.resx からテキストを取得して表示することは確認しました。

    だたし、

    > 画面のボタン(またはリンク)クリックでおこなおうとした場合、どういったやり方が
    > あるのでしょうか?

    ・・・とのことですが、ボタンクリック等で CurrentUICulture の設定を変えるということが、質問者さんのケースで現実的なのかどうかは分かりません。

    そのあたりは質問者さんの方で検討してみてください。



    2017年1月24日 3:52
  • 情報ありがとうございます。

    教えていただいたURLのページは私も見つけていました。

    コントローラー側でご指摘いただいているようなロジックは入れたつもりでしたが、掲示していただいているコーディングと

    若干異なるので、試してみます。

    助かります。

    2017年1月24日 22:13