撇号放在资源包中时不能被正确翻译

撇号放在资源包中时不能被正确翻译。

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


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

如果我从 java.util.ResourceBundle格式化上面的键,会漏掉撇号,这里有什么问题?

39064 次浏览

You should escape the single quote as

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

I strongly belive that the problem is not the ressource bundle but the MessageFormater you use to print the message:

From MessageFormater java doc:

Within a String, '' (two single quotes ) represents a single quote. A QuotedString can contain arbitrary characters except single quotes; the surrounding single quotes are removed. An UnquotedString can contain arbitrary characters except single quotes and left curly brackets. Thus, a string that should result in the formatted message '{0}' can be written as '''{'0}'' or '''{0}'''.

So you need to write:

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

You need to double single quote i.e. {0}''s brush is {1} centimeters tall

Look at the javadoc here

Within a String, "''" represents a single quote. A QuotedString can contain arbitrary characters except single quotes; the surrounding single quotes are removed. An UnquotedString can contain arbitrary characters except single quotes and left curly brackets. Thus, a string that should result in the formatted message "'{0}'" can be written as "'''{'0}''" or "'''{0}'''".

Consider using Properties Editor plugin (for Eclipse)

http://propedit.sourceforge.jp/index_en.html

For everyone that has Android problems in the string.xml, use \'\' instead of single quote.

Adding to @Ralph's answer: You will realize that this is a MessageFormat thing when you have a text like

text1=It's too late

versus

text2={0}''s too late

text1 would probably not run through a MessageFormater (e.g. spring has different code paths if arguments are passed or not), whereas text2 would. So if you used two single quotes in text1, they may / will display as such. So you'll need to check if any arguments get formatted in or not and use one or two single quotes accordingly.

If you are completely stuck, as I was (none of the above worked), you can replace the apostrophe sign with its Unicode: \u0027. Remember you are always allowed to use UTF symbol in your properties file.