GWT i18n - 多种形式根本不起作用?

时间:2010-06-10 11:47:41

标签: gwt internationalization gwt2

我正在使用GWT国际化消息。 documentation for Plural Forms说这应该有效:

@DefaultMessage("{0} {1,number} hours {2}")
@PluralText({"one", "an hour"})
String hours(String prefix, @PluralCount int count, String suffix);

嗯,事实并非如此。无论count的价值如何,它仍会传递DefaultMessage(例如“1小时前”)。如果我使用.properties文件,则相同:

hours[one]=an hour
hours[few]=some hours
hours={0} {1,number} hours {2}

文档或GWT(我使用的是GWT 2.0.3)或我的文件中是否有错误?如果两个前任中的任何一个,任何人都知道一个解决方法?

编辑:更多关于这个谜团的线索。如果我不依赖于默认的语言环境处理,我可以使多个处理工作。也就是说,我需要:

  • 在我的模块的gwt.xml文件中:

    <extend-property name="locale" values="en"/>

  • 在我的消息范围:

    @DefaultLocale("en")

    public interface MyMessages extends Messages { ...

  • 通过附加到网址

    显式加载“en”语言环境

    &locale=en

请参阅我发布此问题的http://groups.google.com/group/google-web-toolkit/browse_thread/thread/80ae300213cc6adb

编辑2:我输入此GWT复数版本的原因是我正在创建“GWT HUman Readable Relative Timestamps”模块。在GitHub开源:http://github.com/PEZ/GWT-Relative-Time请查看。它很快就会有正确的单一形式和对某些语言的支持。 =)

4 个答案:

答案 0 :(得分:3)

此外,我认为这可以节省人们知道默认英语复数规则仅支持"other""one"的时间。

DefaultRule_en.java使用DefaultRule_1_0n.java

如果您想使用DefaultRule_en.java"none""two",则必须重新定义few" ... 您可以在包com.google.gwt.i18n.client.impl.plurals中查看可用规则。

答案 1 :(得分:2)

习惯回答我自己的问题=)以下是关于GWT Google小组的“回答”的交叉帖子:

默认语言环境处理似乎存在错误。以下是我得出这个结论的方法:

我想在我的模块中添加一些语言环境。如果我使用@Generate注释,我可以获得属性文件的样板。我注意到它创建了_en.properties文件和_default.properties。更重要的是; _ en文件完全缺少复数形式信息!但{_ default文件有它们。

然后我将_defaults文件移动到与TimeMessages.java文件相同的目录,并将其重命名为TimeMessages_default.properties

有了这个,我可以从我的模块的.gwt.xml文件中删除<extend-property name="locale" values="en"/>,更重要的是,在运行我的应用程序时从URL中删除&locale=en。我仍然需要@DefaultLocale("en")注释,即使文档明确指出这不是必需的。

总之,如果您遇到此问题,请尝试:

  • 使用@Generate
  • 生成属性文件
  • YourMessages_default.properties
  • 并排放置YourMessages.java
  • 在YourMessages界面前加上@DefaultLocale("en")注释。

关于@Generate。这对我有用。就在我扩展Message接口之前:

@Generate(format = {"com.google.gwt.i18n.rebind.format.PropertiesFormat"})

GWT日志说它创建了我的属性文件,但我找不到它。我通过添加编译器标志-extra extras来修复它,然后找到在extras目录中生成的属性文件。包括这些信息,因为我花了一个多小时搞清楚。

答案 2 :(得分:2)

gwt问题列表here的另一个解决方案:

您必须在MyMessages.java中定义@DefaultLocale:

@DefaultLocale("en")
public interface MyMessages extends Messages {
   public String items(@PluralCount @Optional int count);
}

并在MyMessages.properties中:

items={0} items
items[one]=one item

答案 3 :(得分:1)

我发现的另一件事是你可以像这样定义一个后备语言环境: &lt; set-property-fallback name =“locale”value =“en”/&gt;在您的模块XML文件