i18n 常量
常量
本示例将逐步介绍在您的 GWT 应用程序中创建一组国际化常量字符串“hello, world”和“goodbye, world”的过程。该示例将创建一个名为MyConstants的 Java 接口,用于抽象化这些字符串。您可以在 GWT 代码中引用MyConstants方法,当您想要向用户显示这些字符串之一时,这些字符串将针对所有具有匹配.properties文件的语言环境进行适当的翻译。
首先,在您的 GWT 项目中创建一个名为MyConstants.properties的默认属性文件。您可以将该文件放置在模块源路径中的任何位置,但.properties文件和相应的接口必须在同一个包中。将该文件放置在与模块入口点类相同的包中是可以的。
helloWorld = hello, world
goodbyeWorld = goodbye, world
您还可以为每个支持的语言环境创建本地化翻译,并将它们存储在单独的属性文件中。属性文件的命名必须与我们的接口名称相同(在本例中为MyConstants),并添加适当的后缀以指示语言环境设置。在本例中,我们使用文件名MyConstants_es.properties对西班牙语进行本地化。
helloWorld = hola, mundo
goodbyeWorld = adi?s, mundo
现在,定义一个接口,通过扩展内置的Constants接口来抽象化这些字符串。在创建.properties文件的同一个包中创建一个新的 Java 接口。方法名称必须与.properties文件中使用的标签名称匹配。
public interface MyConstants extends Constants {
String helloWorld();
String goodbyeWorld();
}
提示:i18nCreator 工具可自动生成 Constants 接口的子接口(如上所示)。该工具会生成 Java 代码,这样您只需维护.properties文件即可。它也适用于ConstantsWithLookup和Messages类。
请注意,MyConstants声明为接口,因此您无法使用new直接实例化它。要使用国际化常量,您可以使用GWT.create(Class)功能创建MyConstants的 Java 实例。
public void useMyConstants() {
MyConstants myConstants = GWT.create(MyConstants.class);
Window.alert(myConstants.helloWorld());
}
您无需担心静态字符串类的 Java 实现。静态字符串初始化使用延迟绑定生成器,该生成器允许 GWT 编译器根据语言环境自动生成实现Constants子接口所需的 Java 代码。
ConstantsWithLookup
ConstantsWithLookup接口与Constants相同,只是它还包含一个方法,用于按属性名称查找字符串,这便于在运行时按名称动态绑定到常量。ConstantsWithLookup在高度数据驱动的应用程序中可能会有用。但需要注意的是,ConstantsWithLookup的效率低于Constants,因为编译器无法丢弃未使用的常量方法,从而导致应用程序变大。
使用注解
此处讨论的注解是特定于Constants和ConstantsWithLookup的 - 有关共享注解,请参阅主要国际化页面。
方法注解
以下注解适用于Constants子类型的中的方法,并且必须与方法的返回类型相对应。它们提供了一种类型安全的引用常量的方式,并且可以包含 Java 编译时常量引用。
@DefaultBooleanValue(boolean val)设置返回boolean的方法的默认值。@DefaultDoubleValue(double val)设置返回double的方法的默认值。@DefaultFloatValue(float val)设置返回float的方法的默认值。@DefaultIntValue(int val)设置返回int的方法的默认值。@DefaultStringArrayValue({String str, ...})设置返回String数组的方法的默认值。@DefaultStringMapValue({String key, String value, ...})设置返回Map<String,String>或原始映射(它仍然是String=>String映射)的方法的默认值。提供的值的个数必须是偶数,每对中的第一个条目是键,第二个条目是值。@DefaultStringValue(String str)设置返回String的方法的默认值。
使用属性文件
Constants和ConstantsWithLookup的属性文件格式很简单,就是key=value,但有一些需要注意的地方。
#必须转义,因为它是一个注释字符。- 当方法的类型为
String[]时,使用 ASCII 逗号来分隔值,这意味着值中包含的任何逗号都必须用反斜杠转义。另外,要注意翻译人员是否使用其他字符来分隔翻译后的值。 - 对于
Map值方法,该方法在属性文件中的条目将是一组用逗号分隔的键,然后这些键将有自己的条目以及它们关联的值。例如
Map<String,String> colorMap();
colors=header, body, footer
header=red
body=white
footer=blue
将生成一个映射{ header=>red, body=>white, footer=>blue }。