【Java】多言語対応でResourceBundleを使ったら思っていたのと違う動作をした。

PP gyoumuyoutokei 1024x682 【Java】多言語対応でResourceBundleを使ったら思っていたのと違う動作をした。
多言語対応のWebサービスを作成している最中にResouceBundleが思っていたのとは違う動きをしていたのでその覚書です。

Java 1.7.0_17を使用しています。

Locale objLcl=req.getLocale();

log.debug(objLcl.getLanguage());
log.debug(objLcl.getCountry());

ResourceBundle objRb=ResourceBundle.getBundle("rs",objLcl);
log.debug("sample.title:" + objRb.getString("sample.title"));

上記のようなコードをかき

rs_ja.properties
rs.properties

の二つのプロパティファイルがあり

en
US

言語がEnglishで地域がUSの場合、rs.propertiesを取得してくれると思っていました。
ところが結果はrs_java.propertiesの値をとってしまいました。

一度話を整理するとこういう話です。

JavaのResourceBundleというクラスは多言語対応等に対応するためにあるクラスでこれを利用するとプロパティファイルに以下のように設定し

rs_ja.properties

sample.title=タイトル

rs_en.properties

sample.title=title

Javaのコードで先ほどのように

ResourceBundle objRb=ResourceBundle.getBundle(“rs”,objLcl);
log.debug(“sample.title:” + objRb.getString(“sample.title”));

とやると

言語が日本の場合
タイトル

とでて

言語が英語の場合
title

とでるようになっていてこの仕組みを利用して多言語対応するサイトを作ります。

何が問題かというと上記にはない

「言語が日本以外の場合」

という場合の扱いを考えたときにおかしいなと。。

ちょっと戻りますが以下のような設定をしていました。

rs_ja.properties

sample.title=タイトル

rs.properties

sample.title=title

そして言語がen地域がUSの設定をしたのですができてきたのが

タイトル

でした。

以下のようなコードを書いたらなんとなく理由が判明しました。

Locale objLcl=req.getLocale();

log.debug(objLcl.getDefault().getLanguage());
log.debug(objLcl.getDefault().getCountry());
log.debug(objLcl.getLanguage());
log.debug(objLcl.getCountry());

ResourceBundle objRb=ResourceBundle.getBundle("rs",objLcl);
log.debug("sample.title:" + objRb.getString("sample.title"));

これのデバック文を見ると

ja
JP
en
US

となっていてつまりデフォルトの値、JavaVMで設定されている値を見てプロパティファイルの言語設定を変更しているようでした。

不明な言語の場合サーバーで設定している言語設定を利用するということです。

当然といえば当然の話なのですが不明な場合には無条件で言語設定なしのものを見ると思っていたので驚きました。

つまり言語が日本語、地域が日本の場合には日本語でそれ以外は英語としたい場合にはJavaVMの言語設定を「英語」にしておく必要があるということです。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">