我正在使用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请查看。它很快就会有正确的单一形式和对某些语言的支持。 =)
答案 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
@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文件
中