【问题标题】:Internationalization in JSF 2.0JSF 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;

【问题讨论】:

    标签: internationalization jsf-2


    【解决方案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 页面执行此操作。
    猜你喜欢
    • 2012-05-13
    • 2011-06-02
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多