0

我有一个包含许多模块的国际化项目。每个模块都有自己的一套软件包组成:正确的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 

然而,许多国际条款是多余的(如“OK”或“取消”),我想在一个地方这些条款,便于维护和发展。

我发现的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 

难道我的方式把我捆组织基地?提供共同国际化祖先的正确方法是什么?

+0

张贴后我发现这个:http://stackoverflow.com/q/2067336/779982,但我仍然喜欢一些反馈... – naugler 2012-07-10 15:27:58

+0

要模拟资源包继承,请参阅:https://stackoverflow.com/a/4615268/59087 – 2017-10-27 16:25:46

回答

3

你想要什么似乎是资源的层次结构,也就是说,你可能想要一个类从over(或由某个特定的部分和一些共同的部分组成)派生。

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

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

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

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

    • 创建资源工厂将返回ResourceBundle类的一个实例(或您自己的门面 - 这种做法实际上将让你有一些共同的包)。
  • 好做法对于大型应用程序是创建一些语言包,那就是语言资源分离到它们自己的目录(即/资源/ EN,/资源/ FR,/资源/ ZH-汉斯)。然而,这种方法的问题在于,您需要自己实施资源回退(借助您在问题中提到的文章,层次结构实际上是资源加载层次结构)。这意味着一些特殊情况,如从语言标记“nb”退回到“否”,但不会从“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机制有太多限制,所以你真的需要你自己的资源访问层...

+0

优秀但令人失望的答案,谢谢。 #1是非常好的一点,我没有充分考虑这一点。 #3可能非常接近我最终要做的事情(对资源包进行分类以改变确定候选包名称的方法)。 – naugler 2012-07-11 14:55:07

+0

@naugler:子类化ResourceBundle的问题是有些方法是最终的。这很愚蠢,但我无法帮助它。 – 2012-07-11 15:15:10

1

PawełDyda指出,资源包本身不支持类层次结构解析。然而,我公司刚刚发布的Rincl项目应该只是做你正在寻找的东西---并处理UTF-8 .properties文件和XML属性文件。它甚至可以为你提供消息格式。

正如在Rincl quick start中所述,您可以简单地实施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/intro和Java国际化甚至是完全lesson。有很多新功能出现,但最新版本应该已经为你工作。如果您有任何疑问或问题,请告知我。