覆盖JSF的默认I18N处理

时间:2012-07-09 15:17:56

标签: jsf-2 internationalization resourcebundle

就像这个问题的提问者一样

Variable substitution JSF Resource Bundle property file

我对无法引用消息包中其他属性键的值感到有些恼怒。

虽然我看到编写自己的垃圾处理程序[0]是多么容易,它可以在自定义组件中执行我想要的操作,这样就可以在模板中使用默认的JSF实现来调用消息包。

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

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

2 个答案:

答案 0 :(得分:1)

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

E.g。

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" />

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

答案 1 :(得分:0)

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

在消息包中引用其他消息意味着您要构建复合消息。因此,您可以多次重复使用部分消息,以节省一小部分磁盘空间或一小部分开发时间 如果是这样的话,我会给你留言。您打算做什么称为连接,这是第二个最常见的I18n缺陷。它的含义与硬编码字符串的含义一样糟糕。

为什么呢?因为目标语言不遵循英语语法规则。首先,通常需要在翻译时重新排序句子。使用(编号或命名)占位符可能很容易解决这个问题。另一方面,根据上下文,翻译可能会有所不同。也就是说,它可能需要以完全不同的方式进行翻译,或者根据语法案例,情绪或性别,单词结尾可能需要不同。

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