ローカライズされたメッセージにはプレースホルダーなしで java.text.MessageFormat を使用する必要がありますか?

StackOverflow https://stackoverflow.com/questions/495776

質問

私たちは Java 5 で実行される Web アプリケーションのユーザー インターフェイス テキストをローカライズしていますが、プロパティ ファイルで定義されているメッセージ (たとえば、 java.util.Properties.

一部のメッセージには、次を使用して入力されるプレースホルダーが含まれています。 java.text.MessageFormat. 。例えば:

search.summary = Your search for {0} found {1} items.

MessageFormat は、英語のテキストでは一般的であるにもかかわらず、一重引用符が特殊文字であるため厄介です。リテラルの一重引用符を指定するには、2 を入力する必要があります。

warning.item = This item''s {0} is not valid.

ただし、アプリケーションの約 1,000 メッセージの 4 分の 3 にはプレースホルダーが含まれていません。これは、MessageFormat を回避し、一重引用符をそのままにして直接出力できることを意味します。

help.url = The web page's URL

質問: 構文の一貫性を保つために、すべてのメッセージに MessageFormat を使用するべきでしょうか。それとも、ほとんどのメッセージをエスケープする必要がないように、できる限り MessageFormat を使用しないでください。

どちらの方法でも明らかにメリットとデメリットがあります。

MessageFormat の API ドキュメントでは問題を認識し、解決策以外の提案をしていることに注意してください。

残念ながら、メッセージ形式パターン内で引用符を使用するためのルールは、やや混乱していることが示されています。特に、ローカライザーにとって、単一の引用を2倍にする必要があるかどうかは必ずしも明白ではありません。ローカライザーにルールについて通知し、メッセージが処理される文字列が処理される文字列(リソースバンドルソースファイルのコメントを使用して)を伝えてください。

役に立ちましたか?

解決

この煩わしい機能を使用せずに、MessageFormat の独自の実装を作成するだけです。のコードを見るとよいでしょう SLF4Jロガー.

彼らは独自のバージョンのメッセージ フォーマッタを持っており、次のように使用できます。

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

空のプレースホルダーは、デフォルトの順序で使用され、異なる言語で単語や文の一部が並べ替えられるローカリゼーションの場合に番号を付けることができます。

他のヒント

最終的に、常に「中引用符」を使用することで単一引用符の問題を回避することにしました。

warning.item = This item\u2019s {0} is not valid.

引用には ' の代わりに ` 文字を使用します。いつも問題なく使用しております。

MessageFormat は必要な場合にのみ使用してください。そうでない場合はコードが肥大化するだけで、追加の価値はありません。

私の意見では、この種のことには一貫性が重要です。プロパティ ファイルと MessageFormat にはすでに多くの制限があります。これらが問題になる場合は、プロパティ ファイルを「コンパイル」して、適切な形式のプロパティ ファイルを生成することができます。ただし、どこでも MessageFormat を使用することをお勧めします。こうすることで、コードを保守するときに、どの文字列がフォーマットされているか、どの文字列がフォーマットされていないかを心配する必要がなくなります。メッセージ処理をライブラリに引き渡すことができ、高レベルの詳細を気にする必要がなくなるため、対処が簡単になります。

別の方法...プロパティ ファイルをロードするときは、単一​​引用符をすべて 2 つにする FilterInpuStream で入力ストリームをラップするだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top