<fmt:bundle>
説 明
basename 属性で指定したリソースバンドルをロードして、このタグ内の
<fmt:message> に対する「デフォルト」に設定します。
リソースバンドルとは、各ロケール (言語/国) ごとに用意した、プロパティファイルのような Key = Value 形式のマップです。実際には Key
に対してロケールに適した値を返す
ResourceBundle
のサブクラスか、またはプロパティファイルとなります。これらはクラスあるいはリソースとして参照可能な場所に保存されている必要があります。
ブラウザの言語設定で優先されている言語で JSP を表示したい場合は以下のようにページ全体をこのタグで囲います。
<%@ page ... %> ... <fmt:setLocale value="${pageContext.request.locale}" /> <fmt:bundle basename="com.your.resource"> <html> <head> <title><fmt:message key="title" /></title> </head> ... </html> </fmt:bundle>
読み込んだリソースバンドルは設定変数 javax.servlet.jsp.jstl.fmt.localizationContext
に格納されます。従って、prefix 属性やネストを使用しないでこのタグを使用する場合は var 属性を省略した <fmt:setBundle>
で代用することができます。
属 性
このタグ内で使用するリソースバンドルの名前。これは
FQN でクラス名を記述するのと同様に、パッケージ部分を . で区切った拡張子 (.class または .properties) を省略した形式の文字列です。例えば biz/moyo/lab/resource/recipe.properties というファイルを指定する場合は "biz.moyo.lab.resource.recipe" となります。
内 容
使用例
gourmet.properties を作成します。これはロケールに対する適切なリソースが存在しない場合に使用するリソースバンドルであり、一般的には英語版リソースとして作成します。
food.japanese.susi.tuna = Tuna food.japanese.susi.fattytuna = Fatty Tuna food.japanese.susi.abalone = Abalone food.japanese.susi.turbot = Turbot food.japanese.susi.congereel = Conger Eel food.japanese.susi.flatfish = Flatfish food.japanese.susi.seaurchin = Sea Urchin food.japanese.susi.calamari = Calamari food.japanese.susi.herringroe = Herring Roe food.japanese.susi.octopus = Octpus food.japanese.susi.californiaroll = California Roll
gourmet_ja.properties を作成しますが、プロパティファイルは us-ascii 以外の文字を入れられません。このためまず
gourmet_ja.txt というファイル (名前は何でも良い) に日本語版のリソースを記述します。
food.japanese.susi.tuna = まぐろ food.japanese.susi.fattytuna = トロ food.japanese.susi.abalone = あわび food.japanese.susi.turbot = ひらめ food.japanese.susi.congereel = あなご food.japanese.susi.flatfish = かれい food.japanese.susi.seaurchin = うに food.japanese.susi.calamari = いか food.japanese.susi.herringroe = 数の子 food.japanese.susi.octopus = たこ
native2ascii でエスケープして
gourmet_ja.properties を作成します。
C:\foo> native2ascii gourmet_ja.txt > gourmet_ja.properties
native2ascii を施した日本語用プロパティリソースは以下の通りです。
food.japanese.susi.tuna = \u307e\u3050\u308d food.japanese.susi.fattytuna = \u30c8\u30ed food.japanese.susi.abalone = \u3042\u308f\u3073 food.japanese.susi.turbot = \u3072\u3089\u3081 food.japanese.susi.congereel = \u3042\u306a\u3054 food.japanese.susi.flatfish = \u304b\u308c\u3044 food.japanese.susi.seaurchin = \u3046\u306b food.japanese.susi.calamari = \u3044\u304b food.japanese.susi.herringroe = \u6570\u306e\u5b50 food.japanese.susi.octopus = \u305f\u3053
gourmet.properties、groumet_ja.properties の 2 ファイルはクラスパスの通った場所に保存します。一般的な Web アプリケーションでは /WEB-INF/classes
の下か、あるいは JAR にまとめて /WEB-INF/lib か、またはそれ以外のクラスパスの通った場所に保存します。
この例では /WEB-INF/classes/biz/moyo/lab/resource/sample の下に保存したものとします。
続いてこのリソースファイルを参照する JSP を作成します。
<fmt:bundle basename="biz.moyo.lab.resource.sample.gourmet">
<fmt:message key="food.japanese.susi.turbot" /><br>
<fmt:message key="food.japanese.susi.californiaroll" /><br>
<fmt:message key="food.japanese.susi.bonito" /><br>
</fmt:bundle>
実行結果は以下の通り。
ひらめ California Roll ???food.japanese.susi.bonito???
この JSP ではロケールを指定していなかったため、サーブレットコンテナのデフォルトロケールである日本語が適用されています。
ただし日本語版リソースバンドルで定義されていない food.japanese.susi.californiaroll
というキーに対しては、デフォルトのバンドルである California Roll を出力します。
リソースバンドル内に定義されていない food.japanese.susi.bonito (かつお)
というキーに対しては ???food.japanese.susi.bonito??? という出力になっています
(この ??? は Java の文字化けと紛らわしいので注意してください)。
続いてタイ語 (th) を指定してリソースを参照していますが、システムにタイ語のリソースバンドル
(gourmet_th.properties) が存在しないためデフォルトのリソースが使用されています。
<fmt:setLocale value="th" />
<fmt:bundle basename="biz.moyo.lab.resource.sample.gourmet">
<fmt:message key="food.japanese.susi.turbot" /><br>
</fmt:bundle>
Turbot
ここまでの例では固定的なロケール選択しか行えませんでしたが、ブラウザの「言語設定」で選択されている言語のリソースを優先的に表示するには JSP で以下のように記述します。
<fmt:setLocale value="${pageContext.request.locale}" />
<fmt:bundle basename="biz.moyo.lab.resource.sample.gourmet">
<fmt:message key="food.japanese.susi.turbot" /><br>
</fmt:bundle>
ひらめ
Turbot
prefix 属性にその接頭辞を指定しておくことで冗長な記述を省略することができます。
<fmt:setLocale value="${pageContext.request.locale}" />
<fmt:bundle
basename="biz.moyo.lab.resource.sample.gourmet" prefix="food.japanese.susi.">
<fmt:message key="turbot" /><br>
</fmt:bundle>
ひらめ