Struts框架支持国际化和本地化。前面我们已注意到国际化Web应用程序意味着Web应用程序显示的消息要用用户本地语言。在效果上这意味着用户在其机器上定义自己的现场。当Web应用程序需要输出消息时,它指向以相应的语言写的消息的资源文件。Web应用程序可能提供很多资源文件,每一个提供了以不同的语言编写的消息。
Struts用<bean:message>标签支持国际化,相伴的还有Java2平台内置的使用在java.util包中定义的Locale和ResourceBundle类,也支持这些功能。由java.textMessageFormat定义的技术也支持消息格式化。Struts的能力在于,应用程序开发者不必了解这些用于国际化和格式化消息的类的复杂性。本节我们将学习怎样用Struts来实现国际化和本地化。
第一步是定义应用程序资源文件的名字,它将包含应用程序中服务器上以默认语言编写的所有消息。消息以如下的键值对方式保存:
error.validation.location=The entered location is invalid
这里,error.validation.location是键,The entered location is invalid是值。
文件必须保存在CLASSPATH中,该文件的位置需要作为初始化参数application的值传递给ActionServlet。传递的值应该遵从完全合法的Java类的命名方案。例如,如果资源文件保存在目录/WEB=INF/classes并且文件叫Resources.properties,需要传递的值是Resources。如果文件保存在目录/WEB-INF/classes/com/examplae,那么就应该换成com.example.Resources。
要支持国际化,所有的资源文件都必须保存在与其基本资源文件(以本地语言编写的消息文件)相同的目录中。假如基本资源文件叫Resource.properties,那么以其他语言写的消息资源文件叫Resources_xx.properties,这里XX是特定语言的ISO代码,(如,英语是en,西班牙是es)。这些文件应该包含相同的消息键值,但是消息是以专门的语言书写的。
ActionServlet的现场初始化参数需要传递一个true值。这会使ActionServlet在用户会话的Action.LOCALE_KEY关键字中保存一个用户机器的特定的现场对象。现在运行一个真正的国际化的web站点的准备工作都完成了。在用户的客户机上会自动地以本地语言显示Web页面。
如果需要用特定字符串替换一部分消息,你可以与用java.text.MessageFormat相同的方法在消息中定义占位符。
Error.invalid.number=The number {0} is invalid
你可以用Struts<bean:message>标签来用任何数字代替上面消息中的字符串{0}。该标签允许你在JSP中编写国际化的消息、标签、提示等等。<bean:message>标签的属性解释如下表所示,所有的属性可以在运行时赋值。属性 描述
key 在资源文件中定义的消息的键
locale 在用户会话中保存在locale对象下的属性名字。如果没有指定,就用Action.LOCALE_KEY
bundle 在应用程序环境保存的,在resources对象下的属性名字,如果没有指定,就用Action.MESSAGES_KEY
arg0 第一个参数化的替换值
arg1 第二个参数化的替换值
arg2 第三个参数化的替换值
arg3 第四个参数化的替换值
arg4 第五个参数化的替换值
下面的例子展示了<bean:message>标签的用法。假设在资源文件中定义了一个下面这样的消息:
info.myKey=The numbers entered are {0},{1},{2},{3}
假如用下面的消息标签:
<bean:message key=”info.mykey” arg0=”5” arg1=”6” arg2=”7” arg3=”8”/>
Messge标签写到JSP的输出将会是:
The numbers entered are 5,6,7,8