当前位置: 首页 > 面试题库 >

正确的java.util.ResourceBundle组织

凌朗
2023-03-14
问题内容

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

- 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继承的有用说明,但是似乎(不?)共同祖先不会被适当地国际化,原因是:

- 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”

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

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



 类似资料:
  • 问题内容: 使用最新的稳定的node.js和npm的express,我创建了我的第一个express项目。 默认生成的应用定义了route / index.js,其中包含一个呈现默认索引视图的路由。 我立即假定我可以将其他.js文件添加到route /文件夹中,并且将它们包括在内。这没有成功。仅包含路由/index.js。向route / index.js添加其他路由可以正常工作。 按照快递项目生

  • 我遇到了像失败1这样的错误 必须正确提供名为“userName/contactNumber/emailId/confirmEmailId/status/submit”的正确HTML组件 失败2 名称为“userName”的正确HTML组件必须使用适当的约束 如何解决这个问题?

  • 我有一个通过数组工作的代码,实际上我希望传入ArrayList。 下面是示例: 这是我现在的改编... 我不明白我的错误??我不知道正确的语法... 有关信息,这里的代码 大体上 非常感谢你的帮助。

  • 问题内容: 我有此数据: 当我运行此代码时: 因为我得到: 这就是我想要的。 但是如果我用1而不是0 按元组中的第二个数字分组,我只会得到: 即使还有其他元组在该1(第二个)位置具有“ 1”。 问题答案: itertools.groupby使用相同的密钥将 连续的 项目收集在一起。如果希望所有项目都使用相同的键,则必须先进行排序。

  • 问题内容: 只要我有键值对,解组就非常简单了,但是我将如何以不同的顺序解组不同类型的数组呢?单个元素定义明确且已知,但顺序不明确。 我无法提出一个漂亮的解决方案。 我会尝试对所有元素进行错误处理吗?是否有某种工会类型可以为我做到这一点? 游乐场版 问题答案: Go官方博客上有一篇不错的文章:JSON和GO。可以将“任意数据解码”到接口{}中,并使用类型断言来动态确定类型。 您的代码可能可以修改为:

  • 问题内容: 我是新手,不胜感激。 在这段代码中,我要把一张卡片面朝上,如果发现它们不匹配,我希望它们再次面朝下。 此刻正在发生的事情:1.单击第一张卡片时翻转2.单击第二张卡片时,发生以下两种情况中的任何一种(a)如果它们相同,它们都停留在我想要的状态(b)如果它们并不相同,我根本看不到第二张卡,因为第二张卡会立即重新显示卡的背面(以及我的方法中定义的上一张卡的背面)。 我以为放入睡眠计时器可能会