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

- 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


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

我发现ResourceBundle继承this helpful explanation,但是似乎(不?)共同祖先不会被适当地国际化,原因是:

- 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并不是为此而设计的,而您是一个人。

但是,我想您需要一些建议。


确保通用术语确实很通用。也就是说,“确定”,“取消”,“下一个>”,“ 将所有.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”改为“ pt”(改为使用默认语言)。


似乎需要很多工作?好吧,但是之后的维护工作将很少。

可能有一件方便的事情,PropertyResourceBundle有两个构造函数,可让您加载所需的任何属性文件,即:PropertyResourceBundle(InputStream stream)PropertyResourceBundle(Reader reader)。老实说,在大型项目中,标准的Res​​ourceBundle机制存在太多限制,因此您确实需要自己的资源访问层...

09-26 11:24