JSF 2.0 中的国际化
Posted
技术标签:
【中文标题】JSF 2.0 中的国际化【英文标题】:Internationalization in JSF 2.0 【发布时间】:2011-11-14 04:19:35 【问题描述】:我想知道国际化在 jsf 中是如何工作的?我已经阅读了关于 coreservlets.com 的教程,但就我而言,它的工作方式略有不同。在那个教程中说我必须使用
FacesContext.getCurrentInstance().getViewRoot().setLocale(newLocale);
在 actionListener(用于更改语言环境的侦听器)和支持 bean 必须具有属性 getCurrentLocale()
才能在 <f:view>
标记中使用它。
我有 2 个带有消息的属性文件(默认和指定的语言环境),它们在 faces-config.xml
中注册。 <f:view>
标签我只有一页(index.xhtml)
<f:view locale="#bean.locale">
...
</f:view>
我也为每个语言环境提供了 2 个按钮(带有 actionListener)。在支持 bean 中,我只需修改当前的语言环境变量(不要使用 getViewRoot().setLocale(newLocale)
)。但是所有页面的语言环境都会更改(即使它们没有<f:view locale="#bean.locale">
)
【问题讨论】:
【参考方案1】:假设您有以下两个消息文件
messages.properties
messages_de.properties
设置应用程序区域设置 设置应用程序区域设置的方法有三种,我认为您需要第一种。
1-您可以让浏览器选择区域设置。
在WEB-INF/faces-config.xml:
中设置默认和支持的语言环境
<faces-config>
<application>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>de</supported-locale>
</locale-config>
</application>
</faces-config>
当浏览器连接到您的应用程序时,它通常会在 HTTP 标头中包含一个 Accept-Language 值
2-您可以通过编程方式设置语言环境。
调用 UIViewRoot 对象的 setLocale 方法:
UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
viewRoot.setLocale(new Locale("de"));
3-您可以为单个页面设置区域设置
通过使用带有语言环境属性的f:view
元素——例如:
<f:view locale="de">
语言环境可以动态设置:
<f:view locale="#user.locale"/>
声明消息包 现在设置了 Locale,您可以使用以下两种方式之一来声明消息包
1-通过 faces-config 最简单的方法是在应用程序的 WEB-INF 目录中提供一个名为 faces-config.xml 的文件,其内容如下:
<?xml version="1.0"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<application>
<resource-bundle>
<base-name>com.corejsf.messages</base-name>
<var>msgs</var>
</resource-bundle>
</application>
</faces-config>
2-在每个需要访问它的 JSF 页面上。 您可以将 f:loadBundle 元素添加到需要访问该包的每个 JSF 页面,而不是使用全局资源包声明,如下所示:
<f:loadBundle basename="com.corejsf.messages" var="msgs"/>
在任何一种情况下,都可以通过名为 msgs 的映射变量访问包中的消息。
在按钮上显示适当的标签 现在让我们说默认属性文件,即英语有属性
next=Next
和德语有等价的即
next=Weiter
并且您已经设置了语言环境并声明了消息包,您可以访问它以将标签放在命令按钮上,例如
<h:commandButton value="#msgs.next"/>
上面的答案是从Hortsmen Core Java Server Faces book中提取和修改的。
【讨论】:
我想补充一点:在3.和2.点。您可以在 template.xhtml 中执行,而不是为每个 JSF 页面执行此操作。以上是关于JSF 2.0 中的国际化的主要内容,如果未能解决你的问题,请参考以下文章