7

我有国际化的问题。我正在尝试在我的 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有三个属性文件:

消息属性

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

为什么?我究竟做错了什么?

我尝试从不同的 URL 运行应用程序:

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

例如,如果我使用 ag: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 中的国际化原则以及为什么我的示例不起作用。任何建议将不胜感激。

4

1 回答 1

6

首先,文件应该命名为Message_fr.properties(resp. Message_en.properties),而不是Message.properties_fr(resp. Message.properties_en)。

然后ui:msg等人。在 UiBinder 中将生成一个接口(扩展com.google.gwt.i18n.client.Messages)),而不是使用您定义的接口。为此,您必须使用{string.greeting}(您在哪里stringui:field您的ui:with)。UiBinder 生成器将对你GWT.create()type类做一个ui:with,这就是你在 Java 代码中所做的:

Message string = GWT.create(Message.class);
String localizedGreeting = string.greeting();

在隐式Messages接口中(由UiBinder生成),其ui:generateXxx上的各种属性ui:UiBinder都会转化为接口上的@Generate注解(注解的属性,或者注解的值@GenerateKeys)。
然后,将为每个 生成一个方法ui:msg,其中属性生成等效注释(@Key@Description),ui:msg元素的内容是@DefaultMessage注释的值。当您在内容中拥有或小部件时,它们将被转换为@DefaultMessage文本中的方法和占位符的参数(值将由 UiBinder 填充)。

我建议你先在没有 UiBinder 的情况下制作一些东西,然后了解它是如何工作的;然后尝试ui:msg在 UiBinder 中,-gen在 DevMode 或编译器中使用,这样您就可以确切地看到 UiBinder 生成了哪些代码(是的,它实际上只生成您可以自己手动编写的代码)。

此外,您应该添加一个,<set-property name="locale" value="en, fr" />否则您仍然可以使用default语言环境,尽管set-property-fallback(它永远不会被使用))。

于 2012-05-11T09:16:34.293 回答