几年前,程序开发者们只期望支持他们自己国家的国民,只使用一种(有时候是两种)语言,也只有一种表达日期,数字,钱币的格式。然而,基于Web技术的,在internet和其他一些可以被广泛访问的网络上的程序开发有了爆炸性的增长,让国界问题浮现在我们的眼中。这个问题被理解为对于支持国际化(经常被称为i18n,因为在"国际化"一词internationalization中i和n之间有18个字母)和本地化程序的需要。
Struts 在Java平台上编写,可以辅助支持编写国际化和本地化的程序。需要熟悉的概念有:
- Locale (国籍,地区) - 支持国际化的最基本的Java类是
java.util.Locale 。每一个Locale 表示一个特定的国家和语言(包括一种可选的不同语言),和一套对于数字,日期之类的字符串的格式化方案。
- ResourceBundle (资源包) -
java.util.ResourceBundle 类提供了支持不同语言的信息的基本支持。参阅ResourceBundle 的Javadoc和在你的JDK版本中的国际化支持的信息来得到进一步的帮助。
- PropertyResourceBundle (属性资源包) - 一个
ResourceBundle 的标准实现,它允许你用和properties文件一样的"name=value"的格式来定义资源。这对于在web程序中准备信息资源宝石很方便的,因为大部分的信息都是文本。
- MessageFormat (信息格式) -
java.text.MessageFormat 类允许你在运行时用参数的方式替代一个信息字符串(在这种情况下,是从reousece bundle中取出的)。有时候你要编写一个句子,但是在不同的语言中词语出现的顺序不一样,这就很有用了。字符串中的占位符{0} 会被第一个运行时参数取代,{1} 会被第二个取代,其它的也是这样。
- MessageResources (信息资源) - Struts类
org.apache.struts.util.MessageResources 让你把一套resource bundle当成数据库,允许你得到某种特定的Locale(一般是当前用户的Locale)中的特定信息字符串,而非服务器自己正在使用的Locale。
请注意在一个Struts之类的框架中i18n的支持只限于显示国际化的字符串和图像给用户。支持地区相关的输入法(在日语,中文,或者韩文之类的语言中使用)被留给客户端设备,一般是一个web浏览器。
对于一个国际化程序来说,请遵循JDK中附带的国际化文档中描述的步骤来为你的平台创建每一种语言的properties文件。下面的例子更深入的说明这一点:
假设你的源代码位于com.mycompany.mypackage 包,所以它保存在com/mycompany/mypackage 目录中(相对于你的源代码目录)。要创建一个名为com.mycompany.mypackage.MyResources 的资源包,你应该在com/mycompany/mypackage 下创建下列文件:
- MyResources.properties - 包含了使用你的服务器所在的语言的文本。如果你的默认语言是英语,你可能会有如下的条目:
prompt.hello=Hello
- MyResources_xx.properties - 包含了ISO代码为"xx"的语言的文本(参阅ResourceBundle的Javadoc得到最新的代码列表)。对于一个上面所示文本的法语版本,你可能会有如下的条目:
prompt.hello=Bonjour 你可以编写所以你愿意支持的语言的资源包。
当你配置你web程序中controller servlet的发布描述时,你需要定义的一个国际化参数是程序的基本资源包的名字。在我们上面举的例子中,它就是com.mycompany.mypackage.MyResources 。 <servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>application</param-name>
<param-value>com.mycompany.mypackage.MyResources</param-value>
</init-param>
<.../>
</servlet>
一件重要的事情是要让你的资源包在你程序可以访问的class path中。另一个方法是把MyResources.properties 放在你的程序的classes 目录下,你就可以简单的用“myResource”作为程序的值。但是要注意如果你的编译脚本为了保证一个“干净”的编译目标,会删除整个classes目录,这时要保证这个资源文件不被删除。
如果是这种情形,这儿有一段Ant任务可以包含在你的编译脚本中,它把src/conf 目录中的内容拷贝到classes 目录去。 <!-- Copy any configuration files -->
<copy todir="classes">
<fileset dir="src/conf"/>
</copy>
|