java - 正确的 java.util.ResourceBundle 组织

标签 java inheritance internationalization module resourcebundle

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

- 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

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

我找到了this helpful explanation 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

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

最佳答案

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

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

但我想你需要一些建议。

  • 确保常用术语确实常见。也就是说,“确定”、“取消”、“下一步 >”、“< 上一步”、“打开”、"file"等在其上下文中将有常见的翻译。我的意思是,仅翻译此类标准项目一次是相当安全的,但如果您想在不同的上下文中使用它们,您仍然需要另一个条目。为什么?因为在很多语言中,“打开”按钮翻译与“打开”对话框标题翻译不同。

  • 将所有 .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机制有太多限制,所以你确实需要自己的资源访问层......

关于java - 正确的 java.util.ResourceBundle 组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11416375/

相关文章:

具有多个参数的Android复数字符串

java - 动态创建Java Pojo

java - 根据操作类型调用特定的编写器?

java - Eclipse 中的 Tomcat 服务器 : Error 404 submitting to servlet

C++ 为什么我不能将基类分配给子类?

html - 表格中的字体颜色不继承自父 div

c++ - 为什么我不能从派生类中调用基类运算符?

android - 如何在 Android 应用程序中使用不支持的语言?

java - 是否有可能合理地模拟 yield-syntax,或许在 Java 8 的帮助下?

angular - ng extract-i18n 配置忽略重复消息