【问题标题】:How to handle single quotes in internationalization constants?如何处理国际化常量中的单引号?
【发布时间】:2011-09-26 03:12:39
【问题描述】:

我们在位于google.gwt.i18n.client 的单个属性文件LocalizableResource_xx.properties(每种语言一个)中定义所有国际化常量字符串。

这样可以通过常量接口访问Java代码中的常量

Window.alert(myConstants.helloWorld());

以及在 UiBinder 中使用它们.ui.xml

<ui:attribute key="some.key" name="text" description="useful info" />

如果字符串包含单引号 ('),则此方法效果不佳。这是因为 GWT 编译器在处理 .ui.xml 文件时会抛出 java.text.ParseException: Unterminated single quote:。如果我们对引号进行转义,即双引号(''),编译器会通过,但通过常量接口访问的字符串包含两个单引号(如You can''t do that)。

用 utf-8 编码 \u0027 替换单引号没有帮助(与上述相同的例外)。

是否有可能在 UiBinder 模板和 Java 代码中使用相同的属性文件而不会遇到烦人的单引号问题?

【问题讨论】:

  • 你试过这样转义吗:\'?
  • (仅供参考:java.util.Properties.load(Reader) 的 Javadoc 说:“单引号和双引号不需要转义;但是,根据上面的规则,前面有反斜杠的单引号和双引号字符仍然产生分别是单引号和双引号字符。")
  • @Paweł Dyda:是的,我试过了,但java.text.ParseException 仍然出现。
  • @Chris Lercher:感谢您的参考,但在我看来,这更有可能是与 GWT 相关的问题,与属性文件格式无关。

标签: gwt internationalization uibinder


【解决方案1】:

此问题似乎已在当前版本中得到修复。

''(即两个单引号)对我们来说很好用!

【讨论】:

    【解决方案2】:

    转义字符是单引号'(而不是通常的反斜杠\

    例子:

    register.form.success=Un courriel a 'ét'é envoy'é a l''adresse suivante ': {0}
    

    【讨论】:

      【解决方案3】:

      在 gwt 问题跟踪器上为此创建了一个错误报告 - 请投票: http://code.google.com/p/google-web-toolkit/issues/detail?id=6647

      【讨论】:

        【解决方案4】:

        在将字符存储到本地化文件之前,您必须使用 HTML 转义字符(例如 ' 来表示单引号 ' )对字符进行转义:

        您将在以下位置找到 HTML 转义字符列表 http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php (或者你可以在google上搜索“html转义列表”)。

        在你的情况下,你必须写 '而不是“'”

        希望这能解决您的问题。

        【讨论】:

        • 感谢您的回复。我不明白你的两种符号之间的区别。但是当我写 "'" 时,所有三个字符都会得到输出。
        【解决方案5】:

        由于似乎没有其他解决方案,我将针对上述问题发布我们的解决方法:

        我们创建了一个实现常量接口的包装类,它在将 i18n 常量传递给调用者之前将它们简单地传递给 String modify(String)

        public class ConstantsWrapper implements MyConstants {
        
            private static MyConstants sConstants = GWT.create(MyConstants.class);
        
            public static String transform(String text) {
                return text.replaceAll("''", "'");
            }
        
            @Override
            public String someText() {
                return transform(sConstants.someText());
            }
        
            ...
        }
        

        我仍然期待真正的解决方案。

        【讨论】:

          猜你喜欢
          • 2011-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-03
          • 2012-03-25
          • 2011-04-07
          • 1970-01-01
          相关资源
          最近更新 更多