`
alienj
  • 浏览: 77410 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

第16章. 国际化、本地化和主题

阅读更多

第16章. 国际化、本地化和主题

Seam使构建国际化应用程序变得十分容易。首先,让我们初排一下需要国际化和本地化你的应用程序的所有场景。然后,我们看一看组件Seam bundles.Seam

 

16.1. 国际化你的应用程序

一个JEE应用程序由许多组件组成,并且对你的应用程序本地化,它们都必须适当地被配置。

第一步是从底部开始,确保你的数据库服务器和客户机对你的区域设置使用了正确的字符编码。通常情况下你希望使用UTF-8,这个怎样做已超出本教程的范围。

16.1.1. 应用程序服务器配置

 

为确保应用程序服务器根据客户机请求的正确编码收到请求参数,你必须配置tomcat连接器。如果你使用了Tomcat 或 JBoss AS,增加URIEncoding="UTF-8"属性到连接器配置。对JBoss AS 4.2,改变${JBOSS_HOME}/server/(default)/deploy/jboss-web.deployer/server.xml:

 <Connector port="8080" URIEncoding="UTF-8"/>

有一个更好的替代方法。你可以告诉JBoss AS,请求参数的编码将从请求获取:
 <Connector port="8080" useBodyEncodingForURI="true"/>


16.1.2. 转换应用程序字符串

 

你也需要本地化在你的应用程序中的所有消息字符串(如在你视窗上的标签字段)。首先你需要确定你的资源包使用了想得到的字符编码进行编码。默认使用ASCII。尽管ASCII对大部分语言足够了,但它并不为所有语言提供字符。

资源包必须用ASCII 创建,或者使用代表Unicode字符的Unicode转义码。因为你没有编译属性文件成字节码,就没有办法告诉JVM使用了那种字符集。所以,你必须使用ASCII字符或没有在ASCII字符集中的转义字符。你能在任何Java文件中使用\uXXXX表示Unicode字符,这里的XXXX是十进制字符表示。

你能使用本地编码为你的资源包编写转化的标签(<xlink>Labels</xlink>),并且然后使用JDK 提供的工具native2ascii 转换文件的内容为转义格式。这个工具会转换你用本地编码编写的文件成为一个非ASCII字符表示,作为Unicode转义序列。

这个工具的用法被描述在http://java.sun.com/j2se/1.5.0/docs/tooldocs/index.html#intlhttp://java.sun.com/javase/6/docs/technotes/tools/#intl。例如,根据UTF-8转换一个文件。

$ native2ascii -encoding UTF-8 messages_cs.properties > messages_cs_escaped.properties

 

16.1.3. 其它的编码设置

 

我们需要确保视窗显示你的本地化数据、使用正确的字符集的消息以及任何使用正确的编码提交的数据。

为设置显示字符编码,你需要使用<f:view locale="cs_CZ"/>标签(这里我们告诉JSF使用捷克地区)。你可能希望改变xml文档本身的编码,如果你想嵌入本地化字符在xml中。为做这个,视需要而定改变在xml中声明的编码属性<?xml version="1.0" encoding="UTF-8"?>。

JSF/Facelets不仅应当提交使用了指定字符编码的任何请求,而且还应确保没有指定编码的任何请求,你可以使用servlet过滤器强迫请求编码:

 <web:character-encoding-filter encoding="UTF-8" 
   override-client="true" 
   url-pattern="*.seam" />

16.2. 区域

每个用户的login会话有一个关联的java.util.Locale(可用到应用程序作为一个命名区域的组件)实例。在一般情况下,为设置区域你不需要做任何特殊配置。Seam只是委派JSF决定活动的区域:

·         如果有一个与HTTP 请求关联的区域(浏览器区域),并且这个区域是在来自faces-config.xml支持的区域的列表内,对会话的其余部分会使用这个区域。

·         否则,如果在faces-config.xml 中指定了默认区域,对会话的其余部分会使用这个区域。

·         否则, 使用服务器的默认区域。

通过Seam配置属性org.jboss.seam.international.localeSelector.language, org.jboss.seam.international.localeSelector.countryorg.jboss.seam.international.localeSelector.variant可以手动地配置区域,但我们想不出任何充分的理由一直这样做。

然而,允许用户通过应用程序接口手动设置区域是有用的,Seam提供内建功能用,用上面的算法重载确定的区域。你不得不增加下面全部片段到一个JSP 或Facelets页面的表单:

<h:selectOneMenu value="#{localeSelector.language}">
    <f:selectItem itemLabel="English" itemValue="en"/>
    <f:selectItem itemLabel="Deutsch" itemValue="de"/>
    <f:selectItem itemLabel="Francais" itemValue="fr"/>
</h:selectOneMenu>
<h:commandButton action="#{localeSelector.select}"
    value="#{messages['ChangeLanguage']}"/>


或者,如果你想要一个来自faces-config.xml 支持的所有区域的列表,只需使用:

<h:selectOneMenu value="#{localeSelector.localeString}">
    <f:selectItems value="#{localeSelector.supportedLocales}"/>
</h:selectOneMenu>
<h:commandButton action="#{localeSelector.select}"
    value="#{messages['ChangeLanguage']}"/>


当用户从下接列表中选一个项目时,那么点命令按钮,Seam 和JSF区域会覆盖会话的其余部分。

对支持区域带给我们的问题是定义。 通常情况下,你提供一个区域列表,用于你拥有的在JSF配置文件(/META-INF/faces-config.xml) 中的<locale-config>元素相匹配的资源包。然而,你已经意识到Seam的组件配置机制比Java EE提供的更强大。出于这一原因,使用内建的名为org.jboss.seam.international.localeConfig 的组件,你能配置支持的区域,和默认服务器的区域。为使用它,你首先用Seam组件描述符声明一个Seam的国际化包的XML命名空间。然后,你定义默认区域和支持的区域,象下面:

<international:locale-config default-locale="fr_CA" supported-locales="en fr_CA fr_FR"/>



当然,如果你声明了你支持的一个区域,就你较好地提供了一个资源包匹配它!下次,你会学习如何定义特定语言的标签。

16.3. 标签

JSF支持用户接口标签和描述文本的国际化,通过<f:loadBundle />的使用。你在Seam 应用程序中可以使用这个方法。另外,你能利用Seam messages 组件显示具有嵌入式EL表达式的模板标签。

 

16.3.1. 定义标签

 

Seam提供一个java.util.ResourceBundle (供应用程序作为org.jboss.seam.core.resourceBundle使用)。通过这个特殊资料包你必会让你的国际化标签可用。默认时, Seam使用的资料包被命名为messages,并且因此你需要在名为messages.properties、messages_en.propertiesmessages_en_AU.properties等等文件中定义你的标签。这些文件通常应归入WEB-INF/classes目录。

所以, 在 messages_en.properties中:

Hello=Hello

messages_en_AU.properties中:

Hello=G'day

通过设置名为org.jboss.seam.core.resourceLoader.bundleNames 的Seam配置属性,你也能给资源包选一个不同的名字。你甚至能指定一个搜索(深度优先)消息的资源包列表名。 

<core:resource-loader>
    <core:bundle-names>
        <value>mycompany_messages</value>
        <value>standard_messages</value>   
    </core:bundle-names>
</core:resource-loader>


如果你只想为一个特殊页面定义一个消息,你能在一个删除头/和尾的文件扩展名就与JSF视窗id同样名的资源包中指定它。所以,如果我们只想在/welcome/hello.jsp中显示消息,我们能放我们的消息在welcome/hello_en.properties中。

你甚至能在pages.xml中指定一个明确的名字:

<page view-id="/welcome/hello.jsp" bundle="HelloMessages"/>


然后,我们能在/welcome/hello.jsp上使用定义在HelloMessages.properties 中的消息。

16.3.2. 显示标签

 

如果你使用Seam资料包定义了你的标签,你可以使用他们,不必在每一页上输入<f:loadBundle ... /> 。 实事上,你简单地输入:

<h:outputText value="#{messages['Hello']}"/>
或者:
<h:outputText value="#{messages.Hello}"/>


甚至更好, 消息自身或以包含EL表达式:

Hello=Hello, #{user.firstName} #{user.lastName}
Hello=G'day, #{user.firstName}

你甚至能在你的代码中使用消息:

@In private Map<String, String> messages;
@In("#{messages['Hello']}") private String helloMessage;

 

16.3.3. Faces消息

 

facesMessages组件是显示成功或失败信息给用户的一个超级方便的方法。我们刚描述的功能也为faces 消息工作:

@Name("hello")

@Stateless
public class HelloBean implements Hello {
    @In FacesMessages facesMessages;

    public String sayIt() {
        facesMessages.addFromResourceBundle("Hello");
    }
}

这会显示Hello、 Gavin KingG'day或Gavin, 依赖于用户的区域。

16.4. 时区

也有一个会话范围的java.util.Timezone实例, 名为org.jboss.seam.international.timezone, 和一个改变时区的Seam组件名为org.jboss.seam.international.timezoneSelector. 默认时,时区是缺省的服务器时区。不幸的是,JSF的规范说所有的日期和时间应假定为UTC(Universal Time Coordinated),并显示为UTC ,除非明确地用<f:convertDateTime>指定时区。这是一个极其不便的默认行为

Seam 覆盖这种行为,并且默认所有日期和时间是Seam时区。 另外,Seam提供了<s:convertDateTime> 标签,其始终用Seam时区执行转换。

16.5. 主题

Seam应用程序也非常容易换肤的。 主题API与本地化API是非常相似的,但是,当然这两个问题是正交,一些应用程序支持本地化和主题两者。

首先,配置支持的主题集:

<theme:theme-selector cookie-enabled="true">
    <theme:available-themes>
        <value>default</value>
        <value>accessible</value>
        <value>printable</value>
    </theme:available-themes>
</theme:theme-selector>


注意:第一个列的主题是默认主题。

主题被定义在一个与主题同名的属性文件中。例如,default 主题定义一组条目在default.properties文件中。例如default.properties可以定义:

css ../screen.css
template /template.xhtml

通常在一个主题资料包的条目将指出CSS样式、图像或facelets模板名的路径(不像本地化资料包,它们通常是文本)。

现在在JSP或facelets页面我们能使用这些条目。例如,在facelets页面中主题化样式表。

<link href="#{theme.css}" rel="stylesheet" type="text/css" />
或者,当页面定义在一个子目录中: 
<link href="#{facesContext.externalContext.requestContextPath}#{theme.css}" 
    rel="stylesheet" type="text/css" />


facelets通过一个 <ui:composition>让我们主题化模板最有力:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"

    xmlns:ui="http://java.sun.com/jsf/facelets"

    xmlns:h="http://java.sun.com/jsf/html"

    xmlns:f="http://java.sun.com/jsf/core"

    template="#{theme.template}">

 

 

就象区域选择器,有一个内建的主题选择器,允许用户自由切换主题:

<h:selectOneMenu value="#{themeSelector.theme}">

    <f:selectItems value="#{themeSelector.themes}"/>

</h:selectOneMenu>

<h:commandButton action="#{themeSelector.select}" value="Select Theme"/>

 

16.6. 通过cookies 持久化区域设置和主题参数

 

区域选择器、主题选择器和时区选择器全部支持区域和优化主题持久化到cookie。在components.xml中仅设置cookie-enabled属性:

<theme:theme-selector cookie-enabled="true">
    <theme:available-themes>
        <value>default</value>
        <value>accessible</value>
        <value>printable</value>
    </theme:available-themes>
</theme:theme-selector> 
<international:locale-selector cookie-enabled="true"/>
分享到:
评论

相关推荐

    Openoffice藏文本地化及其实现.pdf

    摘要4-5Abstract5-8第一章 序论8-91.1 引言8-91.2 本论文的研究主题91.2.1 主要内容91.2.2 论文的组织结构9第二章 本地化概念9-142.1 软件本地化9-102.2 藏文化102.3 国际化10-112.4 本地化的意义11-142.4.1 软件...

    flex3的cookbook书籍完整版dpf(包含目录)

    第十六章. 图表(521) 16.1.节创建一个图表 16.2.节. 为图表添加效果 16.3.节在图表中选择一个区域 16.4.节设计图表的刻度线 16.5.节为图表创建自定义标签 16.6.节创建列状图的明细项目效果 16.7节为图表的元素更换...

    Spring.3.x企业应用开发实战(完整版).part2

    第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 JUnit 4生命周期 ...

    Oracle_Database_11g完全参考手册.part3/3

    第16章 DECODE和CASE.SQL中的if-fhen-else 第17章 创建和管理表、视图、索引、群集和序列 第18章 分区 第19章 Oracle基本安全 第Ⅲ部分 高级主题 第20章 高级安全性-虚拟专用数据库 第21章 高级安全性:透明数据加密...

    Oracle_Database_11g完全参考手册.part2/3

    第16章 DECODE和CASE.SQL中的if-fhen-else 第17章 创建和管理表、视图、索引、群集和序列 第18章 分区 第19章 Oracle基本安全 第Ⅲ部分 高级主题 第20章 高级安全性-虚拟专用数据库 第21章 高级安全性:透明数据加密...

    Spring3.x企业应用开发实战(完整版) part1

    第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 JUnit 4生命周期 ...

    疯狂Android讲义.part2

    第16章 GPS应用开发 565 16.1 支持GPS的核心API 566 16.2 获取LocationProvider 568 16.2.1 获取所有可用的 LocationProvider 568 16.2.2 通过名称获得指定 LocationProvider 569 16.2.3 根据Criteria获得 Location...

    疯狂Android讲义.part1

    第16章 GPS应用开发 565 16.1 支持GPS的核心API 566 16.2 获取LocationProvider 568 16.2.1 获取所有可用的 LocationProvider 568 16.2.2 通过名称获得指定 LocationProvider 569 16.2.3 根据Criteria获得 Location...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

    JAVA2核心技术(中文的PDF).part3.rar

    全面覆盖Java 2技术的高级主题,包括:多线程、集合框架、网络API、数据库编程、分布式对象等,深入探究了Swing、Java 2D API、JavaBean、Java安全模式、XML、注释、元数据等主题,同时涉及本地方法、国际化以及JDK ...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版).part1

    管理安全、可访问性、国际化和本地化。学会使用Liferay的JSF团队领导开发的JSF和Portlet,Liferay是处于领导地位的JavaPortal开发商。 全面介绍JSF2.0、详述如何使用Ajax,以及按照JSF2.0、的方式构建组件、快速理解...

    疯狂Android讲义源码

    目 录  第1章 Android应用与开发环境 1  1.1 Android的发展和历史 2  1.1.1 Android的发展和简介 2 ... 第16章 GPS应用开发 565  16.1 支持GPS的核心API 566  16.2 获取LocationProvider 568 ...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版) 1/2

    管理安全、可访问性、国际化和本地化。学会使用Liferay的JSF团队领导开发的JSF和Portlet,Liferay是处于领导地位的JavaPortal开发商。 全面介绍JSF2.0、详述如何使用Ajax,以及按照JSF2.0、的方式构建组件、快速理解...

    Struts2 in action中文版

    第11章 理解国际化 240 11.1 Struts 2框架和Java i18n 241 11.1.1 使用ResourceBundle和Locale取得本地化文本 241 11.1.2 Struts 2如何解决本地Java对i18n支持的问题 243 11.2 Struts 2 i18n示例 244 11.2.1 Struts ...

    Oracle Database 11g初学者指南--详细书签版

    在过去的14年中,他与IanAbramson和MichaelCorey为OraclePress合著了一系列图书.Abbey在国际Oracle用户团体非常活跃,经常出席COLLABORATE、OraclecOpenWorld和区域性用户组会议.  Michael J.Corey是Ntirety...

    计算机应用技术(实用手册)

    第六章GHOST的备份与恢复 34 第七章 综合应用 44 一.文件的后缀名, *号任意的文件名 44 二.内存出错或是系统出错引起蓝屏 48 三.本机病毒删除不了,解决方法是把硬盘拆下来换到别台主机上进行杀毒,要求挂上去的...

Global site tag (gtag.js) - Google Analytics