如何在GWT应用程序中实现i18n?

时间:2012-05-11 03:07:16

标签: gwt internationalization gwt2 uibinder

我的国际化问题。我正在尝试在我的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的国际化原则以及为什么我的例子不起作用。 任何建议都将不胜感激。

1 个答案:

答案 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(它永远不会被使用))。