国际化又叫118N是一种处理引擎,通过它们一个应用程序能够适应各种语言和地区而不用修改应用逻辑。为了支持国际化,一个应用必须考虑下列问题。
1.文本,错误提示,异常提示,GUI组件标签必须放到资源文件中。这些资源文件容纳下面介绍的特定的信息。
2.日期,时间,货币,数字,计量单位和电话号码必须基于本地参数和文化格式化显示。
在今天的全球化市场一个带国际化支持的应用是很重要的。实现国际化功能比在程序开发完后合并多语言要方便得多。国际化类通过JDK提供的本地类处理本地显示。一个本地对象表现了一个特定地区的地理,政治,文化。下面讨论struts怎么实现国际化。
本地对象
struts类提供了118N支持,用getAttribute(Action.LOCALE_KEY)从HttpSession中获得本地特定信息。本地对象使用下面介绍的几种方式保存在session中。
使用HtmlTag:定制的标签org.apache.struts.taglib.html.HtmlTag插入到jsp中.这是也声明的方式保存。当locale为true时,标签逻辑会使用HttpServletRequest.getLocale()方法获得本地对象。getLocale方法返回客户端浏览器基于Accept-Language header接受的内容的首选本地对象。当客户端没有提供一个Accept-Language header一个默认的本地对象将返回。如果session不存在就会创建,然后本地对象将用Action.LOCALE_KEY存到session对象中。HTML标签接着使用本地对象的语言属性设置特定语言到输出流中。这种方式本地对象存储一次;以后的locale=true的操作将不能替换session中的本地对象。这种方式最好用在用户更改浏览器本地设置时。
使用action对象
如果要变成改变本地对象,action类提供了setLocale方法使用Action.LOCALE_KEY保存本地对象到session中。这种设置本地对象的方式最好用在用户通过点击UI组件选择HTML表单的本地化方式时。但是,如果本地化资源正在加载,而用户正在改变本地化方式时会引起错误。当一个本地化改变时最好在重置所有本地资源且可控的方式下进行。
使用元素
在struts-config.xml文件中通过controller标签,标记RequestProcessor从
HttpServletRequest对象获得本地对象,用Action.LOCALE_KEY把本地对象放到session中。如果value=true,本地对象将通过request. getLocale()获得然后保存到session中(如果以前没有保存)
国际化提示和标签
因为要支持国际化,所以所有的错误提示,指导性的提示,信息,标题,GUI组件的标签,输入标签必须必须单独保存,通过本地特定方式处理。struts框架提供了MessageResources类用来模拟JDK提供的ResourceBundle类。本地特定的资源包提供一个分离本地特定信息的方式。资源包的成员都使用一个共同的基本名字,但是名字的额外部分标识不同的本地性。默认的资源包也有同样的基本名字,没有找到匹配的本地信息时就用默认包。例如:
如果资源包名为MyApplicationResources,这这个包家族的成员名字会是。
MyApplicationResources_en 英文包
MyApplicationResources_fr 法语包
MyApplicationResources_fr_FR 法国的法语包
MyApplicationResources_fr_CA 加拿大的法语包
资源包搜索顺序如下:
1. MyApplicationResources_fr_FR 预期的包
2. MyApplicationResources_fr 预期包没有时找它
3. MyApplicationResources_en_US 没有匹配包时用默认包
4. MyApplicationResources_en 没有默认包时用它
5. MyApplicationResources 最基本的包
struts使用MessageResources对象提供相对容易的方式实现上述的机制。MessageResources对象通过下面的属性文件定义的名/值对初始化。你只需要在struts-config.xml定义MessageResources的基本名字,就可以按一致的搜索方式处理本地资源文件。
配置文件中的parameter属性值声明了基本的不带本地信息的属性文件。这个基本的资源文件名为MyApplicationResources.properties,本地文件可能取名为MyApplicationResoures_localeSpecificExtension.properties.对每一个程序,我们可以定义一个或多个基本包名字。消息资源对象由控制器中的ActionServlet根据Globals.MESSAGES_KEY(和Action.MESSAGES_KEY相同)保存到ServletContext中,或者是多个消息资源时,所有消息资源对象使用元素保存。为了能访问request handlers中的消息资源对象,action类提供了方便的方法Action.getResources通过消息对象特定的标识Key从ServletContext中获得消息资源。每个消息资源对象通过处理下列的本地属性文件来获得本地消息。属性文件通过配载文件参数标签标识基本的消息资源名。
要获得本地消息,传递本地消息key参数给MessageResources.getMessage即可。使用Action.LOCALE_KEY可以从session中获得本地对象。当给MessageResources.getMessage提供一个对象参数,获得的消息将作为一个消息格式模式并转换为消息格式对象。消息格式对象然后调用MessageFormat.format方法同时传递被适当格式化的对象。消息格式化类不是本地特定的,因此相关消息格式模式和对象必须获得本地化信息到帐号中。消息资源API提供了许多方法处理消息;相关JavaDoc可以在http://jakarta.apache.org/struts/api/index.html查到。