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))。但是所有页面的语言环境都会更改(即使它们没有&lt;f:view locale="#bean.locale"&gt;

【问题讨论】:

【参考方案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 中的国际化的主要内容,如果未能解决你的问题,请参考以下文章

[小黄书管理平台]Angularjs 2.0应用的国际化

多语言字符串对象的 JSF 复合组件

为 JSF/ICEfaces 设置浮点格式化语言环境?

yii 国际化

Java EE开发技术课程第六周(jsffacelets)

JSF 2.0 中的参数传递