2

我正在使用 GWT 国际化消息。复数形式的文档说这应该有效:

@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 { ...

  • 通过附加到 URL 显式加载“en”语言环境

    &locale=en

请参阅http://groups.google.com/group/google-web-toolkit/browse_thread/thread/80ae300213cc6adb我已经交叉发布了这个问题。

编辑 2:我进入这个 GWT 复数领域的原因是我正在创建一个“GWT 人类可读的相对时间戳”模块。在 GitHub 上开源:http: //github.com/PEZ/GWT-Relative-Time请查看。它很快就会有正确的单数形式并支持某些语言。=)

4

4 回答 4

4

另外我认为知道默认的英文复数规则只支持"other"and可以节省人们的时间"one"

DefaultRule_en.java使用DefaultRule_1_0n.java

所以你必须重新定义DefaultRule_en.java如果你想使用"none", "two", ... 你可以在包com.google.gwt.i18n.client.impl.pluralsfew"中看到可用的规则。

于 2011-01-26T00:04:17.610 回答
2

习惯于回答我自己的问题 =) 这是我在 GWT Google 群组上的“答案”的交叉帖子:

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

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

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

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

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

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

关于那个@Generate。这对我有用。就在我扩展消息接口之前:

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

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

于 2010-06-11T12:53:42.163 回答
2

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

您必须在 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
于 2014-01-27T13:16:12.803 回答
1

我发现的另一件事是您可以像这样定义后备语言环境: <set-property-fallback name="locale" value="en"/> 在您的模块 XML 文件中

于 2010-09-08T15:04:07.503 回答