更正java.util.ResourceBundle组织

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

- 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 

但是,许多国际化术语都是多余的(例如“确定”或“取消”),我希望将这些术语放在一个地方,以便于维护和开发。

我发现了ResourceBundleinheritance的这个有用的解释 ,但似乎一个(不是?)共同的祖先不会被正确国际化,因为:

 - 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 

我的捆绑组织是否会离开基地? 提供共同的国际化祖先的正确方法是什么?

你想要的似乎是资源的层次结构,也就是说,你可能希望从一个类派生出来(或者由一些特定部分和一些常见部分组成)。

基本上,ResourceBundle不是为它而设计的,而且你是独立的。

但我想,你想要一些建议。

  • 确保常用术语非常常见。 这就是“OK”,“取消”,“下一步>”,“<上一页”,“打开”,“文件”等内容将在其上下文中具有共同的翻译。 我的意思是只翻译一次这样的标准项目是相当安全的,但是如果你想在不同的环境中使用它们,你仍然需要另一个条目。 为什么? 因为“打开”按钮翻译与不同语言的“打开”对话框标题翻译不同。

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

    • 创建一个资源工厂,它将返回ResourceBundle类的实例(或者你自己的Facade – 这种方法实际上会让你共享一些常见的bundle)。
  • 大型应用程序的良好实践是创建一些语言包,即将语言资源分离到它们自己的目录(即/ 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“降到”pt“(而是回到默认语言)。

好像很多工作? 好吧,但之后的维护工作很少。

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

正如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国际化的完整课程 。 有许多新function即将推出,但最新版本应该已经适合您。 如果您有任何问题或疑问,请告诉我。