JSTL リファレンス

<fmt:bundle>
xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"

SYNOPSIS

<fmt:bundle
basename*="リソースバンドル名"
prefix="接頭辞"
>
このリソースバンドルの有効範囲.
</fmt:bundle>

説 明

basename 属性で指定したリソースバンドルをロードして、このタグ内の <fmt:message> に対する「デフォルト」に設定します。

リソースバンドルとは、各ロケール (言語/国) ごとに用意した、プロパティ ファイルのような Key = Value 形式のマップです。実際には Key に対してロケールに適した値を返す ResourceBundleJava™ API リファレンス のサブクラスか、またはプロパティファイルとなります。これらはクラス あるいはリソースとして参照可能な場所に保存されている必要があります。

ブラウザの言語設定で優先されている言語で JSP を表示したい場合は 以下のようにページ全体をこのタグで囲います。

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> で代用することができます。

属 性

basename="リソースバンドル名"
required

このタグ内で使用するリソースバンドルの名前。これは FQN でクラス名を記述するのと同様に、パッケージ部分を . で区切った 拡張子 (.class または .properties) を省略した形式の文字列 です。例えば biz/moyo/lab/resource/recipe.properties というファイル を指定する場合は "biz.moyo.lab.resource.recipe" となります。

prefix="接頭辞"
optional

リソースバンドル内の特定の接頭辞から始まるキー名にのみ簡略的にアクセスする 場合に使用します。この属性が指定された場合、このタグ内で <fmt:message> タグの key 属性値には暗黙的にこの接頭辞が 付いているものとして扱われます。

内 容

このリソースバンドルの有効範囲。

使用例

まず最初にデフォルトのリソースバンドル gourmet.properties を作成します。 これはロケールに対する適切なリソースが存在しない場合に使用するリソースバンドルであり、 一般的には英語版リソースとして作成します。
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 というファイル (名前は何でも良い) に日本語版のリソースを記述します。
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 を施した日本語用プロパティリソースは以下の通りです。
gourmet_ja.properties
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.propertiesgroumet_ja.properties の 2 ファイルはクラスパスの 通った場所に保存します。一般的な Web アプリケーションでは /WEB-INF/classes の下か、あるいは JAR にまとめて /WEB-INF/lib か、またはそれ以外のクラスパスの 通った場所に保存します。

この例では /WEB-INF/classes/biz/moyo/lab/resource/sample の下に保存した ものとします。

続いてこのリソースファイルを参照する JSP を作成します。

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) が存在しないためデフォルトのリソースが使用されています。

JSP
<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 で以下のように 記述します。

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>
ブラウザの言語設定 (IE6 の場合 [ツール]-[インターネットオプション]-[言語]) で日本語 [ja] を優先した場合の出力は以下のように表示されます。
実行結果
ひらめ
また英語 [en] を優先した設定でアクセスすると以下のように表示されます。
実行結果
Turbot
このタグの中で使用するリソースのキー名が同じ接頭辞を使用している場合、prefix 属性に その接頭辞を指定しておくことで冗長な記述を省略することができます。
JSP
<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>
実行結果
ひらめ
CVS 2008/03/09