検索
リンク
タグ
ASP.NET
.NET
ASP.NET MVC
F#
Azure
Visual Studio
ASP.NET Core
ライトニングトーク
Plone
Selenium
AJAX
C#
jQuery
ADO.NET Entity Framework
JavaScript
SQL Server
EFCore
LINQ
WebMatrix
Fizz-Buzz
カテゴリ
最新の記事
最新のコメント
記事ランキング
最新のトラックバック
以前の記事
2024年 02月 2024年 01月 2023年 12月 2023年 11月 2023年 10月 2023年 09月 2023年 08月 2023年 07月 2023年 06月 2023年 05月 2023年 04月 2023年 03月 2023年 02月 2023年 01月 2022年 12月 2022年 11月 2022年 10月 2022年 09月 2022年 08月 2022年 07月 2022年 06月 2022年 05月 2022年 04月 2022年 03月 2022年 02月 2022年 01月 2021年 12月 2021年 11月 2021年 10月 2021年 09月 2021年 08月 2021年 07月 2021年 06月 2021年 05月 2021年 04月 2021年 03月 2021年 02月 2021年 01月 2020年 12月 2020年 11月 2020年 10月 2020年 09月 2020年 08月 2020年 07月 2020年 06月 2020年 05月 2020年 04月 2020年 03月 2020年 02月 2020年 01月 2019年 12月 2019年 11月 2019年 10月 2019年 09月 2019年 08月 2019年 07月 2019年 06月 2019年 05月 2019年 04月 2019年 03月 2019年 02月 2019年 01月 2018年 12月 2018年 11月 2018年 10月 2018年 09月 2018年 08月 2018年 07月 2018年 06月 2018年 05月 2018年 04月 2018年 03月 2018年 02月 2018年 01月 2017年 12月 2017年 11月 2017年 10月 2017年 09月 2017年 08月 2017年 07月 2017年 06月 2017年 05月 2017年 04月 2017年 02月 2017年 01月 2016年 12月 2016年 11月 2016年 10月 2016年 09月 2016年 08月 2016年 07月 2016年 06月 2016年 05月 2016年 04月 2016年 03月 2016年 02月 2016年 01月 2015年 12月 2015年 11月 2015年 10月 2015年 09月 2015年 08月 2015年 07月 2015年 05月 2015年 04月 2015年 03月 2015年 02月 2015年 01月 2014年 12月 2014年 11月 2014年 10月 2014年 09月 2014年 08月 2014年 06月 2014年 04月 2014年 03月 2014年 02月 2014年 01月 2013年 12月 2013年 10月 2013年 09月 2013年 08月 2013年 07月 2013年 06月 2013年 05月 2013年 04月 2013年 03月 2013年 02月 2013年 01月 2012年 12月 2012年 11月 2012年 10月 2012年 09月 2012年 08月 2012年 07月 2012年 06月 2012年 05月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 04月 2011年 03月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 10月 2009年 09月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 |
2015年 01月 29日
ASP.NET MVC による Web アプリ開発における、表示文言の多国語対応の話。
例えば英語のテキストと日本語のテキストを用意しておいて、ブラウザからの要求に含まれる Accept-Language 要求ヘッダに指定されている言語情報に基づいて、英語/日本語のいずれのテキストを表示するかを切り替える、という話である。 App_GlobalResources フォルダに .resx を作成する、という話だが...ASP.NET においては、まず英語/日本語の各言語のテキストを用意するには、まず「App_GlobalResources」という名前のフォルダを作成する。そしてこの App_GlobalResources フォルダに拡張子 .resx である "リソースファイル" を好みのファイル名で、但し各言語のカルチャ名 (en とか ja とか) をファイル名の末尾に付加して、言語ごとにファイルを分けて作成する。 このリソースファイルを Visual Studio の GUI エディタ画面開けば、キー・バリュー形式でテキストを記述する画面になるので、ここで各言語のテキストを引き出すキーと、対応する訳語を記述していく。 あとはビュー (例えば .cshtml Razor ビュー) において、下記のとおり記述すれば、このテキストを取得できる。 @HttpContext.GetGlobalResourceObject("リソースファイル名", "キー")※但しリソースファイル名は、カルチャ名・拡張子を除いた部分を記述。 ちなみに、ブラウザの Accept-Language 要求ヘッダに従って、読み取るリソースを切り替えるよう、web.config に明示的に設定が必要なので忘れないように。 <configuration> ...という話なのだが、個人的にはこの方式は好ましくない。 というのも、後述する別の方式があるからだ。 App_GlobalResources フォルダは使わない!自分は、次の方法で、各言語のテキストを用意している。まず、App_GlobalResources フォルダは使わず、好みのフォルダに .resx ファイルを作成する。 同じリソースファイル名なら、既定で使われるテキストということでカルチャ名を含まないファイル名を必ず1つは作成する。 そして、(ファイル名にカルチャ名を含まない) 既定のリソースファイルを Visual Studio で開き、アクセス指定を「Public」に変更する。 続けて他の言語のリソースファイルを、ファイル名末尾にカルチャ名を付けて作成する。 例えば自分の場合は、アプリのルートフォルダに Localize.resx で英語のテキスト、Localize.ja.resx で日本語のテキストを置いたりする。 この静的プロパティを参照すれば、適切な言語のテキストが返却されるという寸法である。 そしてこれは public なクラスなので、 Visual Studio 上の Razor ビューの編集画面で、インテリセンスが効く のだ。 @HttpContext.GetGlobalResourceObject("リソースファイル名", "キー") みたいに文字列で指定するのとくらべ、キー名の打ち間違いとかないのである。 さらにこのインテリセンスにて、そのキーが返すテキストもツールヒントで表示されるのである。 まとめということで個人的には、文字列による実行時指定ではなく、事前コンパイルによる静的な名前解決とインテリセンス支援が受けられる、App_GlobalResources フォルダを使わない方法がオススメであると思う。もしかしたら「今更なに言ってるの、そんなの今となっては当たり前じゃん」という時代なのかもしれないが、ネットで検索して軽く眺めてみた程度だと、App_GlobalResources フォルダを使う例しか見当たらない印象だったので、本記事を投稿した次第。 参考までに、この方式で多言語対応を実装したサンプルコードを GitHub に上げておく。 https://github.com/sample-by-jsakamoto/aspnetmvc-localize-text-sample 多言語対応の前後でコミットを分けたので、多言語対応するにあたりどこを書き換える必要があるのかが、履歴からわかるかと思う。 なおこの方式は、ASP.NET WebForms による実装でも概ね利用可能なのだが、runat=server なサーバーコントロールのプロパティ(Text とか ErrorMessage とか) にバインドできないようである。 ※ WebForms の場合は Text="<%$ Resources:リソースファイル名, キー名 %>" という専用構文で App_GlobalResouces に配置したリソースファイルとバインドするため。 ということで ASP.NET MVC ではなく ASP.NET WebForms の場合は、残念ながらこのインテリセンス支援が受けられる本方式は実質使えなさそうだ。
by developer-adjust
| 2015-01-29 11:17
| .NET
|
Comments(0)
|
ファン申請 |
||