为了了解 JSTL 如何确定应用程序被哪些地区设置支持,我们来看看在基础的 Java 2 Standard Edition 平台中是如何进行本地化的。 java.util
软件包的核心主要有两种类:Locale
和 ResourceBundle
。
Locale 对象只是用来确定地区设置的:它们结合了 ISO 639 语言代码(例如,ja
代表日文)和 ISO 3166 国家代码(例如,IT
代表意大利),还可能包含一个(非标准化的)变量字符串。ResourceBundle 对象是本地化对象的容器,形成成键/值对。 一个基础资源束定义了一个基础束的名称、一套键以及默认值(通常是英文值,但不是必须的)。
<fmt:bundle> 、 <fmt:setBundle> 标签
这两组标签用于资源配置文件的绑定,唯一不同的是 <fmt:bundle> 标签将资源配置文件绑定于它标签体中的显示, <fmt:setBundle> 标签则允许将资源配置文件保存为一个变量,在之后的 工作 可以根据该变量来进行。
根据 Locale 环境的不同将查找不同后缀的资源配置文件,这点在国际化的任何技术上都是一致的,通常来说,这两种标签单独使用是没有意义的,它们都会与 I18N formatting 标签库中的其他标签配合使用。它们的属性和描述如表 9.18 所示:
表 9.18 <fmt:bundle> 、 <fmt:setBundle> 标签属性和说明
属性 | 描述 |
basename | 资源配置文件的指定,只需要指定文件名而无须扩展名,二组标签共有的属性 |
var | <fmt:setBundle> 独有的属性,用于保存资源配置文件为一个变量(保存Localizationcontext实例的变量) |
scope | 变量的作用范围 |
如果已经使用<c:setLocale>行为或场所配置建立了默认的场所,那么<fmt:setBunndle>行为只加载与所选场所的基本名相对应的资源捆绑文件。
下面看一个示例
<fmt:setLocale value="zh_CN"/>
<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>
该示例将会查找一个名为 applicationMessage_zh_CN.properties 的资源配置文件,来作为显示的 Resource 绑定。
可选的 scope
属性指明缺省资源束设置所应用的 JSP 作用域。如果没有显式地指定该属性,就假定为 page
作用域。
如果指定了可选的 var
属性,那么将把由 basename
属性所标识的资源束赋给该属性值所命名的变量。在这种情况下, scope
属性指定变量的作用域;没有将缺省资源束赋给相应的 JSP 作用域。
如果有两个serbundle,而且这两个都没有使用var属性,那么message标签则会判断从最为合适的属性文件中提取信息。
<fmt:message> 标签
用于信息显示的标签,将显示资源配置文件中定义的信息。它的属性和描述如表 9.19 所示:
表 9.19 <fmt:message> 标签属性和说明
属性 | 描述 |
key | 资源配置文件的“键”指定 |
bundle | 若使用 <fmt:setBundle> 保存了资源配置文件,该属性就可以从保存的资源配置文件中进行查找 |
var | 将显示信息保存为一个变量 |
scope | 变量的作用范围 |
如果指定了 <fmt:message>
的 var
属性,那么将由该标记所生成的文本消息赋给指定的变量,而不是写到 JSP 页面。通常,可选的 scope
属性用来指定由 var
属性指定的变量的作用域。
如果 <fmt:message>查询到一致的KEY,则网页中会显示用问号包围的key(比如,???key???)
本地化环境
|
描 述
|
en_US
|
英语,针对美国本地化
|
en_GB
|
英语,针对英国本地化
|
es_MX
|
西班牙语,针对墨西哥本地化
|
es_ES
|
西班牙语,针对西班牙本地化
|
fr_FR
|
法语,针对法国本地化
|
zh_CN
|
中文,针对中国内地本地化
|
zh_TW
|
中文,针对中国台湾本地化
|
由于Java 2 只能处理基于ASCII的属性文件,所以所有Unicode编码文件都要转换一下,使用ASCII转义代码。
如果你使用了IDE或专用的资源编辑器,可以直接使用这些工具生成属性文件。
如果没有能直接生成ASCII属性的资源编辑器,可以使用Unicode编辑器结合一个名为native2ascii的工具来达到目的,这个工具可以在Java 2 SDK的bin目录中找到。
例如,考虑Unicode 属性文件app_zh.ucd,下面列出这个文件的内容:
newTitle=申請表格
lastName=姓
firstName=名字
postalCode=郵政編號
password=密碼
submitForm=提交表格
appInfo=申請人資料
可以用Windows XP或Windows 2000上的记事本编辑器(或者UNIX/Linux上的任何Unicode编辑器)来编辑创建和修改这个文件,然后将其保存为“Unicode Big Endian”类型。
接下来使用JDK 1.4 SDK的native2ascii工具,使用以下命令把它转换为一个ASCII文件:
native2ascii -encoding UnicodeBig app_zh.ucd app_zh.properties
得到的输出将包含所需的转义代码:
newTitle=/u7533/u8acb/u8868/u683c
lastName=/u59d3
firstName=/u540d/u5b57
postalCode=/u90f5/u653f/u7de8/u865f
password=/u5bc6/u78bc
submitForm=/u63d0/u4ea4/u8868/u683c
appInfo=/u7533/u8acb/u4eba/u8cc7/u6599