正确的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国际化的完整版本。有许多新功能即将推出,但最新版本应该已经适合您。让