i18n 常量

  1. 常量
  2. ConstantsWithLookup
  3. 使用注解
  4. 使用属性文件

常量

本示例将逐步介绍在您的 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文件即可。它也适用于ConstantsWithLookupMessages类。

请注意,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,因为编译器无法丢弃未使用的常量方法,从而导致应用程序变大。

使用注解

此处讨论的注解是特定于ConstantsConstantsWithLookup的 - 有关共享注解,请参阅主要国际化页面

方法注解

以下注解适用于Constants子类型的中的方法,并且必须与方法的返回类型相对应。它们提供了一种类型安全的引用常量的方式,并且可以包含 Java 编译时常量引用。

使用属性文件

ConstantsConstantsWithLookup的属性文件格式很简单,就是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 }