正确的java.util.ResourceBundle组织

正确的java.util.ResourceBundle组织,java,inheritance,internationalization,module,resourcebundle,Java,Inheritance,Internationalization,Module,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.proper

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

- 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
-通用模块
+com_naugler_project.properties

+com_naugler_project_fr.properties您想要的似乎是资源的层次结构,也就是说,您可能希望从上派生一个类(或者由某些特定部分和某些公共部分组成)

基本上,ResourceBundle并不是为它而设计的,您只能靠自己

但我想你需要一些建议

  • 确保通用术语真正通用。也就是说,“确定”、“取消”、“下一步>”、“
  • 将所有.properties文件移到一个位置(例如,名为“resources”的目录)。当然,特定于模块的文件应该分离到不同的子目录

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

好像要做很多工作?嗯,但是之后的维护工作将是最小的


有两个构造函数可以让您加载所需的任何属性文件,这两个构造函数可能会派上用场,即:and。老实说,在大型项目中,标准ResourceBundle机制有太多的限制,所以您确实需要自己的资源访问层…

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

基本上,ResourceBundle并不是为它而设计的,您只能靠自己

但我想你需要一些建议

  • 确保通用术语真正通用。也就是说,“确定”、“取消”、“下一步>”、“
  • 将所有.properties文件移到一个位置(例如,名为“resources”的目录)。当然,特定于模块的文件应该分离到不同的子目录

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

好像要做很多工作?嗯,但是之后的维护工作将是最小的


有两个构造函数可以让您加载所需的任何属性文件,这两个构造函数可能会派上用场,即:and。老实说,在大型项目中,标准ResourceBundle机制有太多的限制,所以您确实需要自己的资源访问层…

正如PawełDyda指出的,资源束本身不支持类层次结构解析。然而,我的公司刚刚发布的这个项目应该做你想要做的事情——并且处理UTF-8
.properties
文件和XML属性文件。它甚至可以为您即时设置消息格式

如中所述,您只需实现
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在上提供了一个甚至是一个关于Java国际化的完整版本。有许多新功能即将推出,但最新版本应该已经适合您。让