2009-02-02
■[springframework][java]ResourceBundle, MessageSourceでproperties内に日本語でメッセージを書く
<移行分>
ResourceBundle, MessageSourceでproperties内に日本語でメッセージを書く
Java6のJavaDocを眺めていると、ResourceBundle を拡張する ResourceBundle.Control というものがあるらしいことに気づいた。
つまりUTF-8指定した Properties を使う ResourceBundle.Control を書けば、UTF-8で書いたメッセージ定義プロパティファイルを ResourceBundle で扱える。
さようなら、native2ascii !!
文字コード指定できる ResourceBundle.Control
public class PropertyResourceBundleControl extends ResourceBundle.Control { private String charsetName; // ... public PropertyResourceBundleControl(String charsetName) { this.charsetName = charsetName; } // ... @Override public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException { // ... if (stream != null) { BufferedReader br = new BufferedReader( new InputStreamReader(stream, charsetName)); bundle = new PropertyResourceBundle(br); br.close(); } } return bundle; } }
つまり、Springの MessageResource でも日本語が使える。
UTF-8を読める ResourceBundle でメッセージ定義を読む MessageResource
public class PropertyResourceBundleMessageSource extends ResourceBundleMessageSource { @Override protected ResourceBundle doGetBundle(String basename, Locale locale) throws MissingResourceException { return ResourceBundle.getBundle(basename, locale, getBundleClassLoader(), new PropertyResourceBundleControl()); } }
bean定義(ここではcontext.xml)で PropertyResourceBundleMessageSource を messageSource に指定。
<bean id="messageSource"
class="examples.applicationcontext.PropertyResourceBundleMessageSource">
<property name="basenames">
<list>
<value>messages/format</value>
<value>messages/exceptions</value>
<value>messages/nihongo</value>
</list>
</property>
</bean>
<bean id="foo" class="examples.applicationcontext.Foo">
<property name="messageSource" ref="messageSource" />
</bean>
メッセージはUTF-8で記述。message/nihongo.properties
キー=キーに対する値
key1=value for the key
引数.必須=引数 ''{0}'' は必須です。
テストコード
private ApplicationContext context;
@Before
public void before() {
context = new ClassPathXmlApplicationContext("context.xml");
}
@Test
public void testMessageSourceInjection() {
Foo foo = (Foo)context.getBean("foo");
assertEquals("the argument 'foo' is required", foo.getMessage("argument.required", "foo"));
assertEquals("引数 'var' は必須です。", foo.getMessage("引数.必須", "var"));
}
トラックバック - http://d.hatena.ne.jp/ihiroky/20090202/1233554029
リンク元
- 4 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&q=java+enum+??????&start=20&sa=N
- 2 http://hirashi.mydns.jp/metablogsearch/m/what/??????/
- 2 http://k.hatena.ne.jp/keywordblog/xlsx
- 2 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=ResourceBundle+bundle+=+ResourceBundle.getBundle&num=50
- 2 http://www.google.com/search?num=50&hl=ja&q=heap+java+&lr=lang_ja
- 2 https://www.google.com/reader/view/?tab=cy
- 1 http://ask.jp/blog.asp?o=0&qsrc=96&q=ubiquity&hq=
- 1 http://d.hatena.ne.jp/diarylist?of=0&mode=rss&type=public
- 1 http://d.hatena.ne.jp/diarylist?of=150&mode=rss&type=public
- 1 http://d.hatena.ne.jp/keyword/以下略
