我的国际化问题。我正在尝试在我的GWT应用程序中实现支持两种语言。不幸的是,在UiBinder的帮助下,我从来没有找到一个完整的例子。这就是我所做的:
我的模块 I18nexample.gwt.xml :
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='i18nexample'>
<inherits name="com.google.gwt.user.User" />
<inherits name='com.google.gwt.user.theme.clean.Clean' />
<inherits name="com.google.gwt.i18n.I18N" />
<inherits name="com.google.gwt.i18n.CldrLocales" />
<entry-point class='com.myexample.i18nexample.client.ExampleI18N' />
<servlet path="/start" class="com.myexample.i18nexample.server.StartServiceImpl" />
<extend-property name="locale" values="en, fr" />
<set-property-fallback name="locale" value="en" />
</module>
我的界面 Message.java :
package com.myexample.i18nexample.client;
import com.google.gwt.i18n.client.Constants;
public interface Message extends Constants {
String greeting();
}
相同的包com.myexample.i18nexample.client
有三个属性文件:
Message.properties :
greeting = hello
Message_en.properties :
greeting = hello
Message_fr.properties :
greeting = bonjour
我的UiBinder文件 Greeting.ui.xml :
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder
xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
ui:generateFormat="com.google.gwt.i18n.rebind.format.PropertiesFormat"
ui:generateKeys="com.google.gwt.i18n.rebind.keygen.MD5KeyGenerator"
ui:generateLocales="default" >
<ui:with type="com.myexample.i18nexample.client.Message" field="string" />
<g:HTMLPanel>
<ui:msg key="greeting" description="greeting">Default greeting</ui:msg>
</g:HTMLPanel>
</ui:UiBinder>
当应用程序启动时,我总是在浏览器中获得输出:
Default greeting
为什么呢?我究竟做错了什么?
我尝试从不同的网址运行该应用程序:
http://127.0.0.1:8888/i18nexample.html?gwt.codesvr=127.0.0.1:9997
http://127.0.0.1:8888/i18nexample.html?locale=en&gwt.codesvr=127.0.0.1:9997
http://127.0.0.1:8888/i18nexample.html?locale=fr&gwt.codesvr=127.0.0.1:9997
结果不会改变。虽然我在最后一种情况下预期会有一条消息bonjour
。
例如,如果我使用g:Buttton
而不是消息ui:msg
:
<g:HTMLPanel>
<g:Button text="{string.greeting}" />
</g:HTMLPanel>
然后我得到了带有文字"hello"
如果我输入网址:
http://127.0.0.1:8888/i18nexample.html?locale=fr&gwt.codesvr=127.0.0.1:9997
按钮上的文字更改为"bonjour"
。这里的一切都按预期工作。但为什么国际化在我的第一个案例中不起作用?
以下是否存在差异:
<ui:msg description="greeting">Default greeting</ui:msg>
<ui:msg description="greeting">hello</ui:msg>
<ui:msg description="greeting"></ui:msg>
在这些情况下应该有不同的结果吗?怎么写得好?
请向我解释GWT的国际化原则以及为什么我的例子不起作用。 任何建议都将不胜感激。
答案 0 :(得分:6)
首先,文件应命名为Message_fr.properties
(分别为Message_en.properties
),而不是Message.properties_fr
(分别为Message.properties_en
)。
然后ui:msg
等。在UiBinder中生成一个接口(扩展com.google.gwt.i18n.client.Messages
)),而不是使用您定义的接口。为此,您必须使用{string.greeting}
(string
是您ui:field
提供的ui:with
。 UiBinder生成器将在GWT.create()
的{{1}}类上执行type
,这是您在Java代码中所做的:
ui:with
在隐式消息接口(由UiBinder生成)中,Message string = GWT.create(Message.class);
String localizedGreeting = string.greeting();
上的各种ui:generateXxx
属性将转换为接口上的注释(@Generate
注释的属性,或者@GenerateKeys
注释的值。
然后,将为每个ui:UiBinder
生成一个方法,其中属性生成等效注释(ui:msg
,@Key
),@Description
元素的内容是ui:msg
注释。当你在内容中有小部件或小部件时,它们将变成@DefaultMessage
文本中方法和占位符的参数(这些值将由UiBinder填充)。
我建议你先做一些没有UiBinder的工作,并理解 的工作原理;然后使用DevMode中的@DefaultMessage
或编译器在UiBinder中尝试ui:msg
,这样你就可以准确地看到UiBinder生成的代码(是的,它实际上只生成了你自己手写的代码)。
此外,您应该添加-gen
,否则您仍会拥有<set-property name="locale" value="en, fr" />
语言环境,尽管default
(它永远不会被使用))。