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国际化的原则以及为什么我的例子不起作用.任何建议将不胜感激.
首先,文件应该命名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}(这里string是ui: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(它永远不会被使用)).
| 归档时间: |
|
| 查看次数: |
7835 次 |
| 最近记录: |