v Base-Jsp-10-国际化
要开发一个能够迎合来自于世界不同地区的用户的需求的应用程序,需要包括两个阶段:
i) 国际化(internationalization):将应用程序中那些随地理区域的不同而不同的东西确定下来,并提供一些方法,使得应用程序可以根据使用情况的不同使用这些东西的不同版本, 而不是使用硬编码的值。这些信息包括时间、数字的格式、货币、度量衡等。
我们通常使用I18N来代替internationalization的书写,代表一个I,后跟18个字符和一个N。
ii) 本地化(localization):为一个或多个区域提供国际hua应用程序需要使用的消息、文本、图像等。
Localization有时也缩写为L10N。
v Java提供的国际化和本地化的支持
用Java进行程序设计时,已经加入了国际化的概念。Java包括一些类,可以使国际化过程尽可能的简单。
用于国际化的基本类是Local类,它表示一个特定的地理区域。
而其他类则使用这个类的实例来格式化日期、数字、本地化字符串和应用程序中的其他对象。
Ø Local类
ª 所有提供本地化支持的Java类都使用一个叫做java.util.Locale的类。
该类的一个实例表示一个特定的地理、政治或文化上的区域。
该区域是由一个国家代码和一个语言代码的组合指定的。
ª 国家代码是由两个大写字母组合,它由ISO 3166标准定义
ª 语言代码是两个小写字母的组合,它由ISO 639标准定义
ª 根据用户的语言和当地风俗的不同由Locale实例来决定执行不同任务。
ª 构造Locale实例的构造函数一国际代码和语言代码作为参数
ª HTTP也使用这两个标准来定义语言和国家代码。
如:java.util.Locale useLocale = new Locale(“en”,”US
”);
ª 浏览器的请求中包括一个Accept-Language首部,该首部包含了一个用户或几个用户
想要使用的语言。选择语言的方式由浏览器的配置决定。
如果你指定了多种语言,可以以逗号分隔的列表加入首部
每种语言要么仅用语言代码表示,要么用短划线(-)连接语言代码和国家代码。
例:Accept-Language:en-US,en,sv
该例表示第一选择是美国英语,然后是任何类型的英语,最后是瑞典语。
ª 通过一下方式可以获得请求中的Locale实例
${pageContext.request.locale}:包括最高优先级的Locale
${pageContext.request.locales}:包括一个按优先级顺序排列的所有场所的集合。
注:肖伯纳曾经评论过:“英国和美国是由一个语言分隔开的两个国家”。所以有必要使用语言代码和国家代码的组合才能完整地描述某些场所。
Ø 格式化数字和日期
Java提供了两个类,用以为特定的场所进行日期和数字的格式化
i) java.text.NumberFormat
ii) java.text.DateFormat
默认这两个类根据操作系统的场所信息进行格式化,但你也可以显式的指定格式化的场所
Ø 使用本地化文本
ª 处理本地化资源的Java主类是java.utilResourceBundel。它可以帮助你为特定的场所
挑选出文本的正确版本。这个类实际上是个抽象类,真正进行实质性工作的是它的
两个子类:
i) ListResourceBoundle
ii) PropertyResourceBondle
JSTL行为可以使用通过这两个子类而提供的资源。
对于大多数web应用程序,都使用PropertyResourceBondle
© PropertyResourceBondle实例是与一组本地化本文资源关联在一起的。在这组资源中每一个资源都用一个键来标示,键与键相对应的文本资字符串被保存在一个普通的文本文件中,叫做资源捆绑文件(resource bundle file)
资源捆绑文件:
© 键:是一个字符串,不能含有空格或其他特殊字符
© 值:可以是任何文本,如果值占用了多行,必须用反斜线(\)对换行符进行转
义。如:multi_line_msg=This text value Continues on the next line.
© 资源捆绑文件的扩展名必须是.properties,而且必须放在JVM所使用的类路径
中。对于web应用程序,你可以把这个文件保存在WEB-INF/classes目录下。
因为这个目录是包括在类路径中的。
© 为了对应用程序进行本地化,要为每个场所都创建一个单独的资源捆绑文件,
而且所有的资源捆绑文件豆油相同的文件主名称,但每个文件都要有一唯一的
后缀来标示场所。
如:ApplicationResources_zh_CN.properties
zh是中国的语言代码,CN是中国的国家代码。该文件肯包含拥有中国汉语的
文本。
© 拥有处理已经本地化的文本的JSTL行为会找出与选择的场所最相近的资源捆
绑文件,如果没有找到相匹配的文件,该方法将寻找默认的资源捆绑文件。
© 除了Resourcebundle类外,还有一个叫做java.text.MessageFormate的类,你可
以使用这个类生成固定的文本和变量值共同组成的消息。
如:1994年1月17日,一场地震袭击了加拿大的Northridge 这里每一个带下
划线的单词都表示一个变量值。
ª 产生本地化的输出
例:
<c:if test="${param.language=='sv'}">
<frm:setLocale value="${sv}" scope="session">
</c:if>
<c:if test="${param.language=='de'}">
<frm:setLocale value="${de}" scope="session">
</c:if>
<c:out value="${pagesBundle.locale.language}"/>
<c:if test="${currlang=='sv'}">
<c:set var="currLanng" value="${pagesBundle.locale.language}"/>
<fmt:message key='english'/>
<fmt:setBundle basename="page" var="pageBundle"/>
<fmt:setBundle basename="labels" scope="session"/>
</c:if>
ª<fmt:setLocale>
显式设置相应的场所,创建一个与value和variant属性向对应的Locale类的实例,并将其保存在指定的作用域内。
使用 <fmt:setLocale> 进行地区设置,那么就可以假设该应用程序确实支持此地区设置。 另一方面,如果没有使用 <fmt:setLocale> 并且 JSTL 必须从 Accept-Language 报头中的地区设置列表中找到一个支持的地区设置,那么情况会变得更复杂。
属性名 描述
Value 小写的ISO-639语言代码,可能跟有大写的ISO-3166国家代码,用短划线(-)分
隔,必须属性。
Variant 厂商或浏览器的特定变量,可选
Scope 场所设置的作用域,可选
ª<fmt:setBundle>
设置资源捆绑文件,设置语言的优先顺序,挑选可用的场所
属性名 描述
Basename 资源捆绑文件的进步名称,文件模式为:basename_locale.properties,必须
Var 保存Localizationcontext实例的变量,可选
Scope 本地化环境设置的作用域,可选
© 如果已经使用<c:setLocale>行为或场所配置建立了默认的场所,那么<fmt:setBunndle>行为只加载与所选场所的基本名相对应的资源捆绑文件。
ª <fmt:messsage>
从资源捆绑文件中提取出经过本地化处理的文本并将其添加到应答中。
属性名 描述
Key 指定行为体,消息键。必须
Bundle 指定资源捆绑文件
Var 保存消息变量的名称
Scope 消息变量的名称
ª <fmt:formatDate>
属性名 描述
Value 根据选定的场所而被格式化的日期,必须
Pattern 日期和时间的自定义模式,可选
Type 要进行格式化的部分。Time、date ,可选
dateStyle 日期部分预定于格式,有default、short、 medium、 long 、full,可选
timeStyle 时间部分预定于格式,有default、short、 medium、 long 、full,可选
timeZone日期/时间的时区,可选
var 保存格式化值的变量,可选
scope 作用域,可选
ª <fmt:setTimeZone>
设置时区
属性名 描述
Value 时区。必须
Var 保存消息变量的名称
Scope 消息变量的名称
ª <fmt:TimeZone>
在行为体中为所有行为建立时区
属性名 描述
Value 时区。必须