リソースバンドルに配置すると、アポストロフィが適切に翻訳されない


90

リソースバンドルに配置すると、アポストロフィが正しく翻訳されません。

key = {0}'s brush is {1} centimeters tall

(e.g. Sam's brush is 4 centimeters tall)

上記のキーをjava.util.ResourceBundleここからフォーマットすると、アポストロフィが失われます。


4
+1私は自分でこの問題に遭遇し、それについて小さなブログ投稿を書きました。多分それは、この「機能」に実行している人々のための追加的な情報を提供することができます。mscharhag.com/2013/10/...
ミカ

回答:


120

あなたは一重引用符をエスケープする必要があります

key = {0}''s brush is {1} centimeters tall

素敵な答え。これにより、一重引用符に関する私の問題が解決しました。おかげで:) +1
アニッシュB.

35

問題はリソースバンドルではなく、メッセージの印刷に使用するMessageFormaterであることを強く信じています。

MessageFormater java docから

文字列内では、 ''(2つの単一引用符)は単一引用符を表します。QuotedStringには、単一引用符以外の任意の文字を含めることができます。周囲の単一引用符は削除されます。UnquotedStringには、単一引用符と左中括弧を除く任意の文字を含めることができます。したがって、フォーマットされたメッセージ '{0}'になる文字列は、 '' '{' 0} ''または '' '{0}' ''として記述できます。

だからあなたは書く必要があります:

{0}''s brush is {1} centimeters tall

6

ここjavadocを見てください

文字列内では、 "''"は単一引用符を表します。QuotedStringには、単一引用符以外の任意の文字を含めることができます。周囲の単一引用符は削除されます。UnquotedStringには、単一引用符と左中括弧を除く任意の文字を含めることができます。したがって、フォーマットされたメッセージ「 '{0}'」になる文字列は、「 '' '{' 0} ''」または「 '' '{0}' ''」と書くことができます。



5

@ラルフの答えに追加:あなたはこれがMessageFormat次のようなテキストを持っているときのものであることを理解するでしょう

text1=It's too late

text2={0}''s too late

text1おそらくMessageFormaterを介して実行されません(たとえば、引数が渡されたかどうかにかかわらず、springは異なるコードパスを持っています)text2。したがって、で2つの一重引用符を使用した場合text1、それらはそのように表示されます。したがって、引数がフォーマットされているかどうかを確認し、それに応じて1つまたは2つの一重引用符を使用する必要があります。


5

私がそうであったように(上記のどれも機能しなかった)完全に行き詰まっている場合は、アポストロフィ記号をそのUnicode:\ u0027に置き換えることができます。プロパティファイルでは常にUTFシンボルを使用できます。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.