Monday Sep 28, 2009

MessageFormat の翻訳には気をつけましょう

Java アプリケーションのローカライズにはほとんどの場合 .properties ファイルを使うと思います。NetBeans も同様でほとんどが .properties ファイルで、残り数個 XML ファイルを使います。コミュニティーによる翻訳も盛んでいろいろな言語に訳されているのですが、けっこうな頻度でその翻訳が原因で NetBeans が動かなくなってしまうことがあります。そのほとんどの原因は MessageFormat で使われるメッセージで形式が間違っていることによるものです。NetBeans に限らず起こりえる問題なのでメモしておきます。 MessageFormat は引数を取るメッセージのローカライズよく使われますね。実際の NetBeans のメッセージを例に挙げてみます。
ERR_no_dep=Module {0} in {1} depends on an unknown module named {2}.
このようなメッセージがあったときに {} に引数が挿入されますが、{} の位置はそれぞれの言語に合わせて順番を変えることができます。日本語なら...こんな感じになるでしょうか。日本語では通常 {0} と {1} を入れ替えた言い方をしますよね。
ERR_no_dep=「{1}」のモジュール「{0}」は不明なモジュール名「{2}」に依存しています。
この翻訳では {} に気をつけないと例外が出てしまいます。例えば 1 と } の間にスペースを入れてみましょう。IllegalArgumentException が発生します。(実際は .properties で定義されていますがわかりやすいように書いています)

NetBeans

あるいは {1} の } を ) にしてみます。同じように例外が発生します。

NetBeans

日本語や中国語などの場合には {} に全角の{}や、, が全角の読点、になってしまうケースもあります。翻訳の段階でこのようなことは起きる事もしばしばあるので気をつけないといけません。

もう一つよく見かけるのは ChoiceFormat の choice や、number などのキーワードを翻訳してしまっているケースですね。
MSG_PassedTestsInfo={0} {0,choice,0#tests|1#test|1<tests} passed
引数に3を与えて実行してみます。tests がちゃんと使われています。

NetBeans

ここでは test, tests, passed を翻訳する必要がありますが、choice まで翻訳してしまうと同じように例外が発生します。以下は日本語で「選択」としてしまった場合です。

NetBeans

NetBeans ではこれらのエラーは翻訳後にチェックするようにしています。何度かここでも紹介したことがありますね。
About

NetBeans Globalization

Search

Archives
« April 2014
SunMonTueWedThuFriSat
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
Today