ASP.NET 2.0 の新機能 App_GlobalResources/App_LocalResources フォルダと自動ローカライズ
動的コンパイルにおいてサテライトアセンブリを生成する機能を提供する。当然、リソーススコンパイラも自動的に使用されるため .resources 形式だけでなく .resx 形式のリソースを配置することができる。
さらに、.aspx ファイルなどでそのリソースを手軽に UI 要素等に適用する手段も提供される。
ファイル名の名前付け規則はサテライトアセンブリのリソースと違いはないので、デフォルト言語のリソースを hoge.resx として作成し、ローカライズされたリソースを hoge.ja.resx や hoge.en.resx として用意する。
App_GlobalResources/App_LocalResources フォルダ
App_GlobalResources フォルダに対して配置したリソースは、.NET 2.0 の新機能である Strongly typed object が生成され、アプリケーション内のすべての .aspx から参照できるように参照設定される。
これに対して App_LocalResources フォルダに対して配置されたリソースは、拡張子以外が同じ名前のファイルに対してのみ、その Strongly typed object が公開される。*1
リソースの利用 〜 デザインから
これらのリソースファイルには、.aspx 上で手軽に利用できるローカライズ機能が提供されます。
まず、ローカルリソースですが、こちらはプロパティの自動ローカライズ機能を提供していて、これは WinForms の Localization プロパティを true にした時の動きに非常に似ています。
リソースのキー名を [key].[prop] という名称にすることで、そのプロパティの設定をリソースファイルに記述できるという機能になっていて、[key] の部分は、サーバサイド HTML において meta:resourcekey 属性を使用して設定し、[prop] の部分は対応するプロパティ名を指定する。たとえば、
<asp:Button runat="server" ID="button1" meta:resourcekey="b1" />
というサーバサイド HTML に対して、
<data name="b1.Text">ボタン1</data> <data name="b1.ForeColor">Black</data> <data name="b1.BackColor">White</data>
という .resx を指定すると、
<asp:Button runat="server" ID="button1" Text="ボタン1" ForeColor="Black" BackColor="White" />
というサーバサイド HTML に展開される。ただし、リソースはプロパティを元に検索されるので、
<data name="b1.MyOriginal">valval</data>
というエントリを追加しても、
<asp:Button runat="server" ID="button1" MyOriginal="valval" />
というような属性には展開されない。あくまで asp:Button に関連付けられた WebControl が公開しているプロパティのみが設定できる。
次に、グローバルリソースですが、こちらはファイル名とキーを指定しなければならないので、.aspx 上で、
<%$ Resource:filename, keyname %> <%$ Resource:xxx, aaa %>
と記述します。2行目は App_GlobalResources に格納された xxx.resx のキー aaa にアクセスすることになります。
リソースの利用 〜 コードから
さらに、これらをプログラムコードからアクセスする方法も提供されます。
WinForms では ResourceManager を利用しますが、ASP.NET では GetGlobalResourceObject() と GetLocalResourceObject() を利用します。また、前述したようにグローバルリソースに対しては、 Strongly typed object が提供されるので、前述の xxx.resx の aaa に対しては、
Resources.xxx.aaa
という名前でアクセスすることができます。これは Strongly typed object ですので、画像であれば System.Drawing.Image 型、フォントであれば System.Drawing.Font 型によってアクセスすることができます。
*1:たとえば、Default.aspx に対応するローカルリソースは Default.aspx.resx になる。