none
Azure「Webアプリ」でMVCプロジェクトを起動してもユーザー登録エラーメッセージが日本語にならない RRS feed

  • 質問

  • ちはー。

    メリットの高まりかまびすしいASP.NET MVCプロジェクトをいじくり始めております。

    さて、割といろんなことが分かってきたんですが、環境構築方面で割と単純な情報はあまりWeb上に現れないんですね。テンプレートプロジェクトのアカウント登録機能ですでに登録されているメアドを登録しようとした際にでるエラーメッセージが日本語になりません。すっごく簡単に解決できそうなんですけど。

    Web.Configでカルチャー指定してもダメ。ローカルでは日本語で出力されますがAzureではそうはいかないとSystem.Web.Mvc.resources(JP)を取り込んでみたけどNG、Global.asax.csからカルチャー指定しても変わらず。半ば「たまに英語で出力されるのは仕様」としてもいいかと投げやりになっております。メッセージの実体が、現環境に限ってはどこにあるかすら把握できておりません。

    でも日本語で表示したいですよ。

    同様の経験とその解決に大成功した方がいらっしゃればご教示いただけましたら助かります。

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


    • 編集済み kendji_t 2016年6月15日 5:50
    2016年6月15日 5:49

回答

  • と、解決方法を確定させていましたが、これを書いたのが出社すぐのこと。

    で、VS2015(開発環境を書かなかったのは、Azureのアプリケーションサーバーマターだと判断していたため)の仕掛りプロジェクトを起動してエラーメッセージの出る画面を確認すると、英語になっている。んー。これを日本語で出るように戻せばAzureでも大丈夫かと差分を取ったところ、Web.Configのglobalization uiCulture指定が英語にしている模様。jaのja-JP指定なのにといぶかりつつググると、そのフィールドは多言語化の可能性をそぎ落とすのでWebブラウザーのAccept-Languageに同期しようとするAutoにすべきという指摘を見つけ、そうしました。Localではこれまで通り日本語での出力に戻りました。

    そしてデプロイ後Azureでも英語で出る文言が日本語で出ました。

    こんな感じ。

    >  <system.web>
    >    <authentication mode="None" />
    >    <compilation debug="true" targetFramework="4.5" />
    >    <httpRuntime targetFramework="4.5" />
    >    <globalization uiCulture="auto" culture="auto" />
    >    <customErrors mode="On" />
    >  </system.web>

    ~.resourcesの参照は外していませんが、きっと外しても出るんでしょうね。日本語で。でも結果オーライ派かつ他にもやることがいっぱいあるのでこれで良しとしました。この設定が開発環境によって差分の出る領域なんですかねー。

    ありがとうございました。

    • 回答としてマーク kendji_t 2016年6月16日 0:18
    2016年6月16日 0:18

すべての返信

  • 開発環境等不明なので(ちゃんと書きましょうね)ハズレかもしれませんが、以下のスレッドの話と同じ問題かも?

    ASP.NET MVC5 でVaridateメッセージが英語
    https://social.msdn.microsoft.com/Forums/ja-JP/47342588-b7cd-4f0e-995f-4c1dc495e4e7/aspnet-mvc5-varidate?forum=aspnetja


    もしくは DataType 属性による検証を行っているとか? そうであればそこは見直すことをお勧めします。以下の記事が参考になるかもしれません。

    DataType 属性による検証
    http://surferonwww.info/BlogEngine/post/2016/03/08/validation-by-datatypeattribute-and-default-error-message.aspx

    2016年6月15日 6:22
  • 回答ありがとうございます。

    > ASP.NET MVC5 でVaridateメッセージが英語
    > https://social.msdn.microsoft.com/Forums/ja-JP/47342588-b7cd-4f0e-995f-4c1dc495e4e7/aspnet-mvc5-varidate?forum=aspnetja

    このページを確認後に~.resourcesを参照するようにしてうまくいかなかったんですが、だいぶ全体の理解も進んでいると思うので、これを機会にもう一度チェックリストよろしく読破したいと思います。ありがとうございました。

    #解決手順が周知されているものと異なるようであれば追記します。そうでもなければクローズします。

    2016年6月15日 6:38
  • > このページを確認後に~.resourcesを参照するようにしてうまくいかなかったんですが、

    自分の環境(VS2010 で MVC4 までしかない)では確認できていませんが、その記事の質問者さんや回答者の一人 kenjinote さんが日本語が表示されることを確認されてますので、間違いなくうまく行くと思います。

    ただし、その記事にあるような DataType 属性による検証や、DataType ではなくて RegularExpression を使ってもデフォルトのエラーメッセージでは期待した結果を得るのは難しい(「フィールド PassWord は正規表現 '^(?=.*\d)(?=.*[A-Z])[A-Z0-9]{4,8}$' と一致する必要があります。」とか言われても一般ユーザーには訳がわからない)ので、

    (1) DataType 属性による検証は利用せず Range, RegularExpression, Required, StringLength 属性などを組み合わせて使う。

    (2) DataType 属性を使用するのは、Password や MultilineText のように、レンダリングされる html ソースの input 要素の type 属性を "password" にしたいとか、input 要素でなく textarea 要素にしたい場合に限る。

    (3) エラーメッセージは自分で各データアノテーション属性の ErrorMessage プロパティに設定する。

    (4) Model のコード内にエラーメッセージをハードコーディングしたくない場合は自分でリソースファイル (.resx) を作って使う。

    (5) エラーメッセージを多言語化する場合は自分でリソースファイルを追加してサテライトアセンブリを作って使う。

    というようにするのが正解だと思います。

    そうすれば、その記事の回答にある「プロジェクトの参照に"System.Web.Mvc.resources.dll"を追加」とかはしなくて済むはずです。

    2016年6月15日 7:20
  • SurferOnWwwさんお付き合いいただきありがとうございます。

    この件に費やした時間は結構なコストに換算できる(Web上にないことも試してみた)んですが、自分の中での最後の砦である仮想PC環境で動かすというのは本当に負け犬な気がします。で、結論はこうなりました。

    AccountControllerクラス内に定義されるヘルパー関数、private void AddErrors(IdentityResult result)のList積み替え作業の中で、英語文言を日本語に置き換える。

    すべてが英語で出力されるわけではなく、モデルの中で定義されていない文言が英語になるわけですが、どのみち日本語で出たところで文脈のズレの調整は必要になり同じ手法で解決させるようにすることになるだろうと思うので、システム文言の調整要件についてはこの方法でも解決できますよということにしておきます。

    ありがとうございました。

    • 回答としてマーク kendji_t 2016年6月15日 23:28
    • 回答としてマークされていない kendji_t 2016年6月16日 0:07
    2016年6月15日 23:28
  • と、解決方法を確定させていましたが、これを書いたのが出社すぐのこと。

    で、VS2015(開発環境を書かなかったのは、Azureのアプリケーションサーバーマターだと判断していたため)の仕掛りプロジェクトを起動してエラーメッセージの出る画面を確認すると、英語になっている。んー。これを日本語で出るように戻せばAzureでも大丈夫かと差分を取ったところ、Web.Configのglobalization uiCulture指定が英語にしている模様。jaのja-JP指定なのにといぶかりつつググると、そのフィールドは多言語化の可能性をそぎ落とすのでWebブラウザーのAccept-Languageに同期しようとするAutoにすべきという指摘を見つけ、そうしました。Localではこれまで通り日本語での出力に戻りました。

    そしてデプロイ後Azureでも英語で出る文言が日本語で出ました。

    こんな感じ。

    >  <system.web>
    >    <authentication mode="None" />
    >    <compilation debug="true" targetFramework="4.5" />
    >    <httpRuntime targetFramework="4.5" />
    >    <globalization uiCulture="auto" culture="auto" />
    >    <customErrors mode="On" />
    >  </system.web>

    ~.resourcesの参照は外していませんが、きっと外しても出るんでしょうね。日本語で。でも結果オーライ派かつ他にもやることがいっぱいあるのでこれで良しとしました。この設定が開発環境によって差分の出る領域なんですかねー。

    ありがとうございました。

    • 回答としてマーク kendji_t 2016年6月16日 0:18
    2016年6月16日 0:18
  • > WebブラウザーのAccept-Languageに同期しようとするAutoにすべきという指摘を見つけ、そうしました。
    > Localではこれまで通り日本語での出力に戻りました。

    Local というのは質問者さんの開発マシンのことだと理解して・・・ 

    <globalization uiCulture="auto" culture="auto" /> の設定がない場合は、開発マシンのカルチャによって使用するリソースファイルを選択するようです。ブラウザの言語設定は無視されます。

    なので、開発マシンの OS が日本語版で、日本語のリソースファイルが開発マシンのアプリの Bin フォルダにあれば、<globalization uiCulture="auto" culture="auto" /> の設定なしでもエラーメッセージは日本語で表示されるはずです。

    <globalization uiCulture="auto" culture="auto" /> 有りの場合は、ブラウザの言語設定 (Accept-Language) で使用するリソースを選択するので(以下の記事の下の方を見てください)、

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

    上に紹介したアプリで Resources1.resx(デフォルト), Resources1.ja-JP.resx(日本語), Resources1.en-US.resx(英語)と 3 つのリソースファイルを作って検証していますが、

    <globalization uiCulture="auto" culture="auto" /> 有りの場合、ブラウザの言語設定が:
    (1) ja-JP では Resources1.ja-JP.resx のエラーメッセージ(日本語)、
    (2) en-US では Resources1.en-US.resx のエラーメッセージ(英語)、
    (3) fr-FR では該当するリソースファイルが無いので Resources1.resx のエラーメッセージ

    <globalization uiCulture="auto" culture="auto" /> 無しの場合:
    ブラウザの言語設定は無視され、常に Resources1.ja-JP.resx のエラーメッセージ(日本語)

    ・・・が表示されます。デフォルトエラーメッセージ用のリソースファイルでも同じことのはずです。

    と言うことで、質問者さんの開発マシンで <globalization uiCulture="auto" culture="auto" /> を設定しないと日本語のエラーメッセージが表示されない(英語になる)とすると、それはちょっと解せません。

    日本語のリソースファイル無しで試していたとか、日本語リソースファイルがあったとすると質問者さんの開発マシンの OS が英語版とかですか?


    > ~.resourcesの参照は外していませんが、きっと外しても出るんでしょうね。

    参照を外す / 外さないということより、その結果として日本語のリソースファイルが Bin フォルダに含まれるか否かで決まるはずです。

    日本語のリソースファイルがなければ当然日本語にはならず、デフォルトの英語になると思います。


    > そしてデプロイ後Azureでも英語で出る文言が日本語で出ました。

    運用環境のサーバーのカルチャは何だか分かりませんので、結局 <globalization uiCulture="auto" culture="auto" /> は必ず設定しておくというのが正解だと思います。ただ、そうしておいても日本語のリソースファイルがないと何ともなりませんが。


    > でも結果オーライ派かつ他にもやることがいっぱいあるのでこれで良しとしました。

    上記のようなことに悩まなくて済むよう、先のレスでもお勧めしましたが、以下のようにするのが正解だと思います。検討してみてください。

    (1) DataType 属性による検証は利用せず Range, RegularExpression, Required, StringLength 属性などを組み合わせて使う。
     
    (2) DataType 属性を使用するのは、Password や MultilineText のように、レンダリングされる html ソースの input 要素の type 属性を "password" にしたいとか、input 要素でなく textarea 要素にしたい場合に限る。
     
    (3) エラーメッセージは自分で各データアノテーション属性の ErrorMessage プロパティに設定する。
     
    (4) Model のコード内にエラーメッセージをハードコーディングしたくない場合は自分でリソースファイル (.resx) を作って使う。
     
    (5) エラーメッセージを多言語化する場合は自分でリソースファイルを追加してサテライトアセンブリを作って使う。

    上記 (3) が特に重要で、ErrorMessage に日本語のエラーメッセージを設定しておけば、必ず日本語になります。
    • 編集済み SurferOnWww 2016年6月16日 3:21 最後の行を追記
    2016年6月16日 3:16
  • SurferOnWwwさん、重ね重ねありがとうございました。

    失礼ながら頭の中はもう次に行っているため、次回のASP.NET MVCプロジェクト立ち上げ時に活用させていただこうと思います。

    日本語の秘伝の書的ナレッジがどんどん増えることを願っています。

    2016年6月16日 4:11