11

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.

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

help.url = The web page's URL

質問:一貫性のある構文のために、すべてのメッセージにMessageFormatを使用する必要がありますか、それとも可能な限りMessageFormatを避けて、ほとんどのメッセージをエスケープする必要がないようにする必要がありますか?

どちらの方法でも明らかに長所と短所があります。

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

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

4

5 に答える 5

2

この煩わしい機能を使わずに、MessageFormatの独自の実装を作成するだけです。あなたはSLF4Jロガーのコードを見るかもしれません。

それらには、次のように使用できる独自のバージョンのメッセージフォーマッタがあります。

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

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

于 2009-01-30T15:07:40.593 に答える
2

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

warning.item = This item\u2019s {0} is not valid.
于 2009-04-03T10:11:04.850 に答える
0

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

于 2009-01-30T16:54:00.723 に答える