ローカライズメッセージを java のプロパティファイルを使って表示する場合、apostrophe の取り扱いで、問題が起こる事があります。前からある注意点なのですが、最近もまた同じもので引っかかってしまいました。

MessageFormat クラス の String 中での単一引用符(') のエスケープの仕方がちょっと変わっていて、単一引用符(') を2つ重ねて('')エスケープします。ResourceBundle を使って property ファイルから翻訳メッセージを拾い、MessageFormat を使って表示する場合に、このエスケープ処理を property ファイル中でしておく必要があります。Unicode を指定して他の似た文字(\u2032 や \u2018, \u2019)を使う方法もありますが、UTF-8 以外の ISO-8859-1 等で表示する場合がある時は、該当する文字が 8859-1 のキャラクターセットにないので使えません。
逆に MessageFormat クラスを使わずに、ResourceBundle で得たメッセージを表示する場合は、単一引用符はそのまま表示されますので、どの単一引用符でも2つ重ねておけばいいということでもありません。 MessageFormat クラス の「警告」の所には、ローカライズ対象メッセージにコメントを書いておいて翻訳者に知らせるように書いてありますね。

中括弧({}) を使ったメッセージの場合は、MessageFormat を使っている場合が多いでしょうから、これを目安にしてエラーを検出する手もあります。

あと、Java Script の中で ResourceBundle を使って property ファイルから翻訳された文字を使う場合も翻訳には気をつける必要があります。単一引用符(') などの特殊文字が翻訳された文字列の中だけに現れると、そこで Java Script が hang することがあります。単一引用符だけでなく、改行文字(\n)なども、適切にエスケープしてあげないと、望みの表示が得られなくなります。

投稿されたコメント:

こんにちは。
実はこういうRFEがあるのですが、Evaluationの"Another solution would be ..."に書かれているバックスラッシュを使ったやり方は、翻訳者の方々にとって多少は便利なものとなりますでしょうか? ご意見ご感想をお待ちしています。過去のJREに非互換の修正はできませんが、互換であればJDK7(以降)での対応は可能だと思います。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4862106

Posted by Yuka Kamiya on 1月月 10日, 2008年 at 05:19 午後 JST #

お疲れ様です。

RFE の情報、ありがとうございます。
バックスラッシュを使用したエスケープは、翻訳者に理解しやすいと思います。
この RFE は、クラスやパッケージの名前を変更せずに MessageFormat クラスの仕様を変更するものなのでしょうか。すでに今の仕様に沿っている翻訳を考えると、新しいものにするのかもしれませんが...。
新しいクラスを策定する場合、個人的には、より単純なものが望ましいと思っています。

Posted by Kazuhiko Maekawa on 1月月 24日, 2008年 at 01:47 午後 JST #

コメント
  • HTML文法 不許可

This blog copyright 2008 by kazuhiko