JSF语言环境:浏览器定义的语言好像被忽略了。

3
目前,我的团队正在开发一款基于Java的Web 2.0应用程序,并且我们正在使用JSF作为呈现层。我们从呈现层开始,因此尚未添加业务和数据层。
我们使用的技术包括:
- JSF(Mojarra 2.0.3) - Primefaces 2.1(JSF组件库) - Spring Security 3.0.5 - jBoss 5.1
我被要求为该应用程序添加本地化支持。因此,我按照以下方式配置了faces-config.xml文件:
<application>
    <locale-config>
        <default-locale>en</default-locale>
        <supported-locale>pt</supported-locale>
        <supported-locale>en</supported-locale>
        <supported-locale>es</supported-locale>
    </locale-config>
    <message-bundle>
        com.<company>.<product>.i18n.MessageBundle
    </message-bundle>
</application>

我创建了以MessageBundle为后缀的文件并部署了应用程序。我了解到JSF选择语言环境有三个标准: 1)请求的语言环境(Accept-Language请求头)与支持的语言环境匹配 2)在faces config文件中定义的应用程序默认语言环境 3)JVM默认语言环境
当我尝试在浏览器选项中更改语言时,应用程序没有更改语言环境。即使我只配置了一种不同于默认语言的语言。我是否遗漏了什么?这是预期的结果还是实际上当我更改浏览器语言时(如果它是支持的语言),内容应该会更改?
我非常感谢任何提示或至少指出我可以找到答案的地方,因为我已经搜索过了但没有找到答案。
提前致谢。
4个回答

2

当您更改浏览器定义的区域设置后,需要刷新浏览器中的页面。同时,您需要了解 <message-bundle> 仅用于本地化转换/验证消息,而非本地化内容。因此,在 faces-config.xml 中使用 <resource-bundle> 和/或在 XHTML 中使用 <f:loadBundle> 来完成本地化内容。


嗨,感谢您的帮助。我总是刷新页面并清除缓存,因为问题可能是由这两个原因之一引起的。然而,问题仍然存在。我正在使用<message-bundle>,但现在您指出了那个细节,我想知道是否应该使用<resource-bundle>。我不想提供本地化内容,只需要我的错误消息和菜单条目。这符合<message-bundle>的要求吗? - Aikanaro

1
除了其他答案外,我可以补充以下说明:您需要创建与定义的语言数量相同的语言文件。如果您有一个没有_xx扩展名的com.<company>.<product>.i18n.MessageBundle.properties,则其中的消息将是现有文件的默认值,但不适用于不存在的文件。 例如:
messages.properties (containing English)
messages_fr.properties (containing French)

如果您声明了“en”语言,将不会显示任何英文消息!您必须创建以下内容:
messages.properties (containing default values not found in other files)
messages_en.properties (containing English)
messages_fr.properties (containing French)

1

我最终找到了问题所在。代码中有一个区域设置声明,因此无论我在浏览器中选择哪种语言,显示的语言始终相同。一旦我删除了该声明,一切都开始按照预期工作。

很抱歉我没有更早地发布这个帖子。

同时,我想感谢大家提供的提示。尽管答案不在其中,但我在这个过程中学到了很多。


0

你确定你有单独的消息包命名为:

com.<company>.<product>.i18n.MessageBundle_es and  com.<company>.<product>.i18n.MessageBundle_pt?

嗨,谢谢你的提示,但事实上我确实拥有所有本地化版本。我有com.<company>.<product>.i18n.MessageBundle_en、com.<company>.<product>.i18n.MessageBundle_pt和com.<company>.<product>.i18n.MessageBundle_es。然而,如果我理解正确的话,如果其中一个缺失了,那么它会回退到默认的版本,是这样吗? - Aikanaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接