可能大家在使用 struts 框架的时候,偶尔会看到这个词: i18n.也就是 Internationalization??? i 开头,n 结尾. 总共 18 个字母,今天的主要内容就是环绕这 四个字母.
struts2 国际化是建立在 java 国际化的基础上的.通过提供不同国家,语言环境的消息资源.然后通过 ResourceBundle 载入指定 Locale 相应的资源文件,取得文件里指定的 key 相应的信息.
Locale 对象表示了特定的地理,政治和文化地区.须要 Locale 来运行其任务的操作称为语言环境敏感的 操作.它使用 Locale 为用户量身定制信息.比如,显示一个数值就是语言环境敏感的操作.应该依据用户的国家,地区或文化的风俗 / 传统来格式化该数值.
ResourceBundle : public abstract class ResourceBundle extends Object
资源包包括特定于语言环境的对象.当程序须要一个特定于语言环境的资源时(如 String).程序能够从适合当前用户语言环境的资源包中载入它.使用这样的方式,能够编写非常大程度上独立于用户语言环境的程序代码.它将资源包中大部分(即便不是所有)特定于语言环境的信息隔离开来.
可能大家对于 ResourceBundle 不太熟悉,但是它的子类,我们但是用的不能再熟悉的.
public class PropertyResourceBundle extends ResourceBundle
读取 xxx.properties 的内容??? 类载入器 以流的形式读取资源文件
PropertyResourceBundle.class.getClassLoader().getResourceAsStream(??"db.properties")
连接数据库,log4j 的配置,我们都用到了? xxx.properties 的配置文件? ,注意,这些配置文件要放在 类路径之下.
struts2 的国际化分为三类:类级别的,包级别的和全局的. 优先级从左至右依次减少.
1,全局的配置方式为: a,在 struts.xml 中的指定 baseName 国际化文件名称为: baseName_语言名_国家名. properties(如: message_zh_CN.properties)
b,全局的国际化资源文件放在 src 以下
2,包级别的: a,包级别的国际化资源文件放在该包以下
b,命名规则为: package_语言名_国名. properties(如: package_zh_CN.properties)??? 当中 package 不变, 不是指的是包名, 每一个包的国际化文件命名都这样
3,类级别的:? a,与该类放在同一文件夹中
b,命名规则为: 类名_语言名_国家名. properties(如: RegisterAction_zh_CN.properties)
訪问国际化消息的三种方式:
1,JSP 页面输出国际化消息:使用 struts 的标签 name 属性指定了国际化资源文件的 key
2,Action 类中訪问国际化消息,该 Action 继承 ActionSupport 实现 getText( ) ,接收一个 String 类型的參数.參数指定了国际化资源文件的 key
3,表单元素 Label 中输出国际化消息,为表单标签指定一个 key 属性.指定了国际化资源文件的 key
知道大家认为理论非常枯燥.以下来结合实例解说: 配置步骤(以全局配置 JSP 输出国际化消息为例)
1,在 src 文件夹下加入资源文件,命名方式:baseName_language_country.properties,资源文件的编写: 以键值对的形式,注意名称一定要匹配
2,在 struts.xml 文件里进行国际化配置,配置常量: 注意不要写错,要是你来质问我为什么没有效果...
..
Struts 2 提供了一个名 i18n 的拦截器(Interceptor),而且将其住注冊在默认的拦截器栈中(defaultStack)
所以我们不须要再次配置一次国际化的拦截器
3,jsp 页面表单元素记得加入一个 key 的属性 ,key 的值就是资源文件里配置好的 name
4,大家能够看到页面上有两个超链接.传递的參数为 request_locale ,參数值与我们写好的资源文件命名的 language_country 相匹配.
在这里起到的作用就是切换语言环境.
struts2 的 I18nInterceptor 拦截器会拦截所有的 Action.它主要做的事情为从 client 发送过来的请求參数中寻找是否存在名为 request_locale 的參数.
若有.则将 request_locale 的 value 转化为 locale 保存起来,该 locale 是保存在以 WW_TRANS_I18N_LOCALE 所命名的 session 里面的.
假设我们不做不论什么配置的话,client 是不会发送 request_locale 參数的.它默认会用 request 的 getLocale() 方法得到默认 locale,将其存放在 session 中.
以下我们来看一看效果
这个就是今天的内容了.
来源: http://www.bubuko.com/infodetail-2459502.html