GWT笔记(5)
Internationalization 国际化 (I18N)
国际化(简写为i18n)是一个附加框架的过程,它让你的应用程序支持不同国家的语言。
Localization 本地化(L10N)
本地化(简写为l10n)为当使用框架定制应用程序的每一种语言时。
GWT提供了完整的和可伸缩的国际化支持工具。
还有拼写检查和语法错误检查等。
实现国际化的标准Java方法是通过资源绑定和配置文件来实现。GWT也是如此。
一、Constants,Messages and Dictionary
GWT为本地化文本提供了4种选择。
1)常量 Constants
这种类型只能用于文本中且不能替换。例如域标签或菜单名,还有数字、布尔值和映射等。
2)ConstantsWithLookup
者是同样的常量接口,且你可以用动态字符串来查找它。
3)Message
这是通常的字符串,可以包括占位符。
4)Dictionary
这是最灵活的,在所有选择中最低效的,字典接口支持动态指定现场(locale)。
前三者更高效一些,因为能提前决定现场,再编译到应用程序。GWT编译器为每一个现场产生一个不同的.cache.html文件,并在运行时加载适合的版本。
消息接口对大多数应用程序来说是最好的选择,下面将显示它的用法。
它们的API是相似的。在应用程序中使用多个风格是可能的。
二、建立属性配置文件(Property File)
下面用一个简单的程序开始,使用消息代替硬编码的(hard-coded)字符串来转换它,原始程序如下:
I18NProject/src/com/xyz/client/I18NOrig.java
--------------------------------------------------
public class I18NOrig implements EntryPoint{
privae Button m_clickMeButton;
public void onModuleLoad(){
RootPanel rootPanel=RootPanel.get();
{
m_clickMeButton=new Button();
rootPanel.add(m_clickMeButton);
m_clickMeButton.setText("Click me!");
m_clickMeButton.addClickListener(new ClickListener(){
public void onClick(Widget sender){
Window.alert("Hello, GWT World!");
}
});
}
}
}
--------------------------------------------------
第一步是查找所有的字符串并复制它们到属性配置文件。它使用标准的name = value 格式。注释用“#”开始,用于代替参数的占位符用{0},{1}等等来指定。下面是用于转换程序的属性配置文件:
I18NProject/src/com/xyz/client/AppMessages.properties
--------------------------------------------------
m_clickMeButton_text=Click me!
m_helloAlert_text=Hello,{0} World!
--------------------------------------------------
在客户端,这个文件是必须的。这是缺省的语言文件,英语或其它语言。要提供翻译成其它语言,使用ISO语言和国家代码后缀,如:“_fr”指法语,“_fr_CA”指加拿大法语。
I18NProject/src/com/xyz/client/AppMessages_fr.properties
--------------------------------------------------
m_clickMeButton_text=Cliquez-moi!
m_helloAlert_text=Bonjour, Monde de {0}!
三、创建存取器类(Accessor Class)
如果你熟悉标准Java消息,你就知道它们是靠字符串来访问的。
要得到已翻译的消息,调用方法getString("m_clickMeButton_text")。但这种方法有两个问题,一是消息键要和消息值一样长或比它长;二是如果消息中有错误,则只能在运行时才能发现。
GWT改进了消息工作方式。它通过Java方法来引用消息,而不是靠字符串。这需要建立一个新的Java类,对每一个消息有一个相一致的方法。
I18NProject/src/com/xyz/client/AppMessages.java
--------------------------------------------------
package com.xyz.client;
import com.google.gwt.i18n.client.Messages;
public interface AppMessages extends Messages{
String m_clickMeButton_text();
String m_helloAlert_text(String toolkit);
}
--------------------------------------------------
注意:不管你的应用程序要支持多少种语言,这里只能有一个存取器类。
四、引用消息
下一步就是在代码中用引用新消息来取代静态字符串。使用GWT.create来得到一个对存取器类的引用后,调用新方法来检索消息文本。例:
I18NProject/src/com/xyz/client/I18N.java
--------------------------------------------------
public class I18N implements EntryPoint{
private static final AppMessages MESSAGES=(AppMessages) Gwt.create(AppMessages.class);
private Button m_clickMeButton;
public void onModuleLoad(){
RootPanel rootpanel=RootPanel.get();
{
m_clickMeButton=new Button();
rootpanel.add(m_clickMeButton);
m_clickMeButton.setText(MESSAGES.m_clickMeButton_text());
m_clickMeButton.addClickListener(new ClickListener(){
public void onClick(Widget sender){
Window.alert(MESSAGES.m_helloAlert_text("GWT"));
}
});
}
}
}
--------------------------------------------------
五、改动模块
模块文件要完成转变,有两个小改动是必须的。首先,需要告诉GWT从I18N模块继承的功能性;其次,需要定义要翻译成的哪种语言。例:
I18NProject/src/com/xyz/I18N.gwt.xml
--------------------------------------------------
--------------------------------------------------
六、运行例子
首先在主机模式下运行例子。
要尝试法语版本,在浏览器中编辑URL并增加后缀?locale=fr。按回车键刷新页面,将显示用法语代替英语。点击按钮,也显示法语文本。
在HTML文件中选择现场的另一种方法是嵌入它作为元标记(meta tag)。如:
在服务器端动态产生HTML可能更方便,就像JSP文件一样。