【问题标题】:Overriding JSF's default I18N handling覆盖 JSF 的默认 I18N 处理
【发布时间】:2012-07-09 00:39:31
【问题描述】:

喜欢这里的提问者

Variable substitution JSF Resource Bundle property file

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

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

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

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

【问题讨论】:

    标签: jsf-2 internationalization resourcebundle


    【解决方案1】:

    您可以提供具体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" />
    

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

    【讨论】:

    • 感谢 Balus 的回答和有用的后续链接
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢您的回答 - 我了解别名的缺点,但我从未发现它在现实世界中使用 gettext 或更多自制解决方案是一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2016-04-13
    • 1970-01-01
    • 2015-12-29
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多