0

我有一个包含许多模块的国际化项目。每个模块都有自己的一组捆绑包:

- database-module
    + com_naugler_project_database.properties
    + com_naugler_project_database_fr.properties
- mapping-module
    + com_naugler_project_mapping.properties
    + com_naugler_project_mapping_fr.properties

但是,许多国际化术语是多余的(例如“OK”或“Cancel”),我希望将这些术语放在一个位置以便于维护和开发。

我发现这个对 ResourceBundle 继承很有帮助的解释,但看起来好像(不是?)共同祖先不会被正确国际化,因为:

- common-module
    + com_naugler_project.properties
    + com_naugler_project_fr.properties          <-- this is not an ancestor
- database-module
    + com_naugler_project_database.properties
    + com_naugler_project_database_fr.properties <-- of this

我的捆绑组织是否离我们很远?提供一个共同的国际化祖先的正确方法是什么?

4

2 回答 2

3

您想要的似乎是 Resources 的层次结构,也就是说,您可能希望一个类从 over 派生(或由一些特定部分和一些公共部分组成)。

基本上,ResourceBundle 不是为它设计的,你只能靠你自己。

但我想你需要一些建议。

  • 确保常用术语确实很常用。也就是说,“OK”、“Cancel”、“Next >”、“< Previous”、“Open”、“File”等内容在它们的上下文中会有共同的翻译。我的意思是这样的标准项目只翻译一次是相当安全的,但是如果你想在不同的上下文中使用它们,你仍然需要另一个条目。为什么?因为在很多语言中,“打开”按钮翻译与“打开”对话框标题翻译不同。

  • 将所有 .properties 文件移动到一个位置(例如名为“resources”的目录)。当然,特定于模块的文件应该分开到不同的子目录...

    • 创建一个资源工厂,它将返回 ResourceBundle 类的一个实例(或您自己的 Facade - 这种方法实际上可以让您共享一些公共包)。
  • 大型应用程序的良好做法是创建一些语言包,即将语言资源分离到它们自己的目录中(即/resources/en、/resources/fr、/resources/zh-Hans)。但是,这种方法的问题在于您需要自己实现资源回退(借助您在问题中提到的文章,层次结构实际上是资源加载层次结构)。这意味着一些特殊情况,例如从语言标签“nb”退回到“no”,但不会从“nn”退回;从“zh-CN”和“zh-SG”回落到“zh-Hans”,然后回落到“zh”,但从“zh-HK”和“zh-TW”和“zh-MO”回落到“zh” -Hant”,然后使用您的默认语言,而不是从“pt-BR”下降

好像工作量很大?好吧,但是之后的维护工作将是最小的。

一件事可能会派上用场PropertyResourceBundle有两个构造函数,可让您加载所需的任何属性文件,即:PropertyResourceBundle(InputStream stream)PropertyResourceBundle(Reader reader)。老实说,在大型项目中,标准的 ResourceBundle 机制有太多的限制,所以你真的需要自己的资源访问层......

于 2012-07-11T14:36:35.173 回答
1

正如 Paweł Dyda 所指出的,资源包本身不支持类层次结构解析。然而,我公司刚刚发布的Rincl项目应该可以满足您的需求——并且还可以处理 UTF-8.properties文件和 XML 属性文件。它甚至可以即时为您进行消息格式化。

Rincl 快速入门中所述,您可以简单地实现Rincled然后调用getResources();即使在父类或接口中声明,Rincl 也会加载您的资源包:

public class MyClass extends BaseClass implements Rincled {
  …

    final String userName = "Jane Doe";
    //Retrieve the formatted user label based upon the current locale.
    //en-US: "Settings for user Jane Doe."
    //pt-BR: "Definições para usuário Jane Doe."
    final String userLabel = getResources().getString("user-label", userName);
  …

Rincl 可在http://rincl.io/获得,其中包含有关 Java 国际化的介绍甚至完整课程。即将推出许多新功能,但最新版本应该已经适合您了。如果您有任何疑问或问题,请告诉我。

于 2016-07-14T18:25:15.803 回答