Fix handling of edge cases with i18n property files. Patch by: jat Review by: ecc git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1525 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/i18n/rebind/util/MessagesInterfaceCreator.java b/user/src/com/google/gwt/i18n/rebind/util/MessagesInterfaceCreator.java index 03a9299..bef8b5d 100644 --- a/user/src/com/google/gwt/i18n/rebind/util/MessagesInterfaceCreator.java +++ b/user/src/com/google/gwt/i18n/rebind/util/MessagesInterfaceCreator.java
@@ -37,11 +37,25 @@ * @throws ParseException */ public static int numberOfMessageArgs(String template) throws ParseException { - // As parse, unlike format, cannot deal with single quotes, we can escape - // them instead. If sub-formats are supported in the future, this code will - // have to change. - String escapedDefault = template.replaceAll("'", "x"); - int numArgs = new MessageFormat(escapedDefault).parse(escapedDefault).length; + /* + * As parse, unlike format, cannot deal with single quotes, we have to remove + * them. First, we remove doubled quotes (which go into the output as single + * quotes. Then, we remove any quoted strings. + * + * If sub-formats are supported in the future, this code will + * have to change. + */ + // strip doubled single-quotes + template = template.replace("''", ""); + + // delete quoted sections + template = template.replaceAll("'[^']+'", ""); + + if (template.length() == 0) { + // special case empty strings since MessageFormat.parse chokes on them. + return 0; + } + int numArgs = new MessageFormat(template).parse(template).length; return numArgs; }
diff --git a/user/test/com/google/gwt/i18n/client/I18NTest.java b/user/test/com/google/gwt/i18n/client/I18NTest.java index bf20925..1dbf88d 100644 --- a/user/test/com/google/gwt/i18n/client/I18NTest.java +++ b/user/test/com/google/gwt/i18n/client/I18NTest.java
@@ -464,6 +464,8 @@ s.testLotsOfUsageOfArgs("a", "b")); assertEquals("\"~\" ~~ \"~~~~ \"\"", s.testWithXs()); assertEquals("お好你好好", s.unicode("好", "好")); + assertEquals("", s.empty()); + assertEquals("{quoted}", s.quotedBraces()); } public void testTypedMessages() {
diff --git a/user/test/com/google/gwt/i18n/client/gen/TestMessages.java b/user/test/com/google/gwt/i18n/client/gen/TestMessages.java index 204b45b..136c8cd 100644 --- a/user/test/com/google/gwt/i18n/client/gen/TestMessages.java +++ b/user/test/com/google/gwt/i18n/client/gen/TestMessages.java
@@ -103,4 +103,20 @@ * @gwt.key args1 */ String args1(String arg0); + + /** + * Translated "{quoted}". + * + * @return translated "{quoted}" + * @gwt.key quotedBraces + */ + String quotedBraces(); + + /** + * Translated "". + * + * @return translated "" + * @gwt.key empty + */ + String empty(); }
diff --git a/user/test/com/google/gwt/i18n/client/gen/TestMessages.properties b/user/test/com/google/gwt/i18n/client/gen/TestMessages.properties index ca574bb..cc0dfe2 100644 --- a/user/test/com/google/gwt/i18n/client/gen/TestMessages.properties +++ b/user/test/com/google/gwt/i18n/client/gen/TestMessages.properties
@@ -8,4 +8,5 @@ unicode= お{0}你{1}好 argsTest = arg0arg1 arg0,arg1 {0}arg4 simpleMessageTest={0} - +quotedBraces='{'quoted'}' +empty=