覆盖 JSF 的缺省 I18N 处理



就像这里的提问者

变量替换JSF资源捆绑属性文件

无法引用消息包中其他属性键的值,这让我有点震惊。

尽管我看到编写自己的垃圾处理程序[0]是多么容易,它可以在自定义组件中完成我想要的操作,但这将使调用消息包的模板中的表达式仍然使用默认的JSF实现。

是否可以覆盖消息包的默认JSF处理?

[0]或者更好的方法是,使用上面问题的某个答案中引用的代码https://code.google.com/p/reflectiveresourcebundle/

您可以提供具体ResourceBundle实现的完全限定名称作为"基本名称",而不是仅提供属性文件的路径和文件名。

例如

public class YourCustomResourceBundle extends ResourceBundle {
    // ...
}

可以按照以下进行注册

<application>
    <resource-bundle>
        <base-name>com.example.YourCustomResourceBundle</base-name>
        <var>text</var>
    </resource-bundle>
</application>

或在每个视图/模板的基础上声明如下

<f:loadBundle baseName="com.example.YourCustomResourceBundle" var="text" />

以下是几个相关的问题/答案,其中包含一些具体的代码,您可以将其用作启动示例:

  • 如何去除周围环境???在捆绑包中找不到消息时
  • JSF中从数据库加载ResourceBundle条目的国际化
  • 在JSF 2.0应用程序中使用UTF-8编码的属性文件的i18n

对于那些尝试的人来说,一切皆有可能。问题不在于这是否可能,而在于你是否应该这样做。这个问题的答案是:可能不会。

引用消息包中的其他消息意味着您希望构建一个复合消息。因此,您可以多次重复使用部分消息,只为节省一小部分磁盘空间或一小部分开发时间
如果是这样的话,我有话要告诉你。您计划执行的操作称为串联,它是第二常见的I18n缺陷。它的含义和硬编码字符串一样糟糕。

为什么?因为目标语言不遵循英语语法规则。首先,翻译时通常需要重新排列句子的顺序。这可能很容易通过使用(编号或命名)占位符来修复。但另一方面,翻译可能会因上下文而异。也就是说,它可能需要以完全不同的方式翻译,或者只是词尾可能需要根据语法情况、情绪或性别而有所不同。

我的建议是,不要使用这样的快捷方式,它会产生比解决更多的问题
现在你应该知道为什么"那些愚蠢的罗马人"没有这样实施它了:它违背了I18n的最佳实践。

最新更新