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

Fra*_*ète 6 gwt internationalization uibinder gwt2

我有国际化的问题.我正在尝试在我的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>
Run Code Online (Sandbox Code Playgroud)

我的界面Message.java:

package com.myexample.i18nexample.client;

import com.google.gwt.i18n.client.Constants;

public interface Message extends Constants {

    String greeting();
}
Run Code Online (Sandbox Code Playgroud)

同一个包com.myexample.i18nexample.client有三个属性文件:

Message.properties:

greeting = hello
Run Code Online (Sandbox Code Playgroud)

Message_en.properties:

greeting = hello
Run Code Online (Sandbox Code Playgroud)

Message_fr.properties:

greeting = bonjour
Run Code Online (Sandbox Code Playgroud)

我的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> 
Run Code Online (Sandbox Code Playgroud)

当应用程序启动时,我总是在浏览器中获得输出:

Default greeting
Run Code Online (Sandbox Code Playgroud)

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

我试图从不同的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
Run Code Online (Sandbox Code Playgroud)

结果不会改变.虽然我在最后一例中预计会有消息bonjour.

例如,如果我使用a g:Buttton而不是消息ui:msg:

<g:HTMLPanel>   
     <g:Button text="{string.greeting}" />      
</g:HTMLPanel>
Run Code Online (Sandbox Code Playgroud)

然后我得到带有文本的按钮的结果 "hello"

如果我输入网址:

http://127.0.0.1:8888/i18nexample.html?locale=fr&gwt.codesvr=127.0.0.1:9997
Run Code Online (Sandbox Code Playgroud)

按钮上的文字变为"bonjour".这里的一切都按预期工作.但为什么国际化在我的第一个案例中不起作用?

以下是否有区别:

<ui:msg description="greeting">Default greeting</ui:msg>

<ui:msg description="greeting">hello</ui:msg>

<ui:msg description="greeting"></ui:msg>
Run Code Online (Sandbox Code Playgroud)

在这些情况下应该有不同的结果吗?怎么写得好?

请向我解释GWT国际化的原则以及为什么我的例子不起作用.任何建议将不胜感激.

Tho*_*yer 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();
Run Code Online (Sandbox Code Playgroud)

在隐式消息接口(由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(它永远不会被使用)).