知识库 : 利用Eclipse NLS来实现插件的多语

作者:王方舟

Edit Document

利用 Eclipse NLS 来实现插件的多语

 

NLS Eclipse 中负责实现多语的一个类,利用这个类来实现插件的多语只需要写一个 Message 类来继承 NLS 类,然后利用 NLS 的方法去配置文件中寻找参数对应的值进行绑定。

例如:

Message 类中指定一个 BUNDLE_NAME 作为 key-value 对所在文件的路径信息(注释中的 $NON-NLS-1$ 是告诉编译器该行代码的第一个 String 类型的变量是一个 tag 或者 keyword ,不需要被本地化)。

例如 BUNDLE_NAME = example.messages ,则 NLS initializeMessages 方法会将类 Message 中的 String 成员 key_1 key_2 BUNDLE_NAME 的文件中写的 key-value 对中的 key_1 key_2 进行绑定。

因此 message.properties 应保存 key_1 key_2 具体的值:

      NLS 中载入资源的基本思想是通过对资源文件的顺序载入,保证优先级高的资源优先被载入到 Message 类中。按当前语种(如 zh_CN 会尝试载入 _zh _zh_CN 资源)优先、默认资源(即不添加任何语种的资源文件)最后的原则,顺序载入资源文件。

            为了保证 Meesage 中的字段只被设一次值, NLS 构造了 Map< 属性名 , 字段 > 结构,初始化时置入所有 <FieldName, Field> ,当 Properties 载入时,将使用一个已赋值的约定标记,记为 Flag 与原值交换,若交换出的是字段(初始值),那么利用反射进行首次设值;若交换出的是 NULL 则表示 Messages 类中可能缺失了某多语资源的定义,不做处理;若交换出的是 Flag ,表示该字段已经赋值,不做处理。

            最后将所有非 Flag 的属性名进行一次补偿设置,将值设为 NLS 资源缺失的提示文本。

 

综上所述,利用 NLS 实现多语的步骤:

  1. 建立一个 Message.class ,将 message 文件的路径写到 BUNDLE_NAME (messages.properties or messages_CN.properties)
  2. 将需要多语的变量作为 public static String 写在 Message.class 中;
  3. 调用 NLS.initializeMessages 方法绑定该类与 messages.properties
  4. 将多语变量的值写到 message (message.properties or message_CN.properties)

    还可以使用 Eclipse 将写好的 Java 类文件进行字符串的提取,动态生成 Message 类及 .properties 文件,步骤如下所示:

            1. 在项目、包或者源代码文件上点击右键,使用 Source/Externalize Strings... 进行字符串的提取

2. 此时弹出一个可提取资源的列表,选择需要提取的类文件

            3. 其中 Enter common prefix for generated keys(optional) 中的内容是多语资源 Key 的前缀,不建议修改;下方列出的 key 值对应了资源文件的 key 值,请修改为更易读的名称; Acessor class 指定访问器类和资源文件,可以通过 configure... 按钮进行编辑

            4. 最后可以预览代码的变更,点击 Finish 完成

            5. 添加多语的 .properties 文件,并键入对应的 key

 

如果想要实现在值中插入数据:比如 key_1=Hi **, this is key1! ** 是程序中动态载入的某个数据,则需要在 .properties 文件中以 {index} 的形式写入。例如:

然后在 Message.class 文件中调用 NLS String bind(String message, Object binding) 方法:

该方法负责将 String.valueOf(binding) 插入到 message 中。

注:如果需要插入两个变量则调用 NLS.bind(String message, Object binding1, Object binding2) ;如果需要插入多个变量则调用 NLS.bind(String message, Object[] bindings)

Attachments: