在程序设计领域, 把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化.
与国际化对应的是本地化, 指让一个具备国际化支持的应用程序支持某个特定的地区
Struts2 国际化是建立在 Java 国际化基础上的:
1.为不同国家/语言提供对应的消息资源文件
2.Struts2 框架会根据请求中包含的 Locale 加载对应的资源文件
3.通过程序代码取得该资源文件中 指定 key 对应的消息
如何配置国际化资源文件
I.Action 范围资源文件:在Action类文件所在的路径建立名为ActionName_language_country.properties 的文件
II.包范围资源文件:在包的根路径下建立文件名为package_language_country.properties 的属性文件, 一旦建立,处于该包下的所有 Action 都可以访问该资源文件。注意:包范围资源文件的 baseName 就是package,不是Action所在的包名。
II.全局资源文件:命名方式: basename_language_country.properties
struts.xml
https://blog.csdn.net/courage0316/article/details/81255479
IV.国际化资源文件加载的顺序如何呢?离当前Action较近的将优先加载
2).如何在页面上和Action类中访问国际化资源文件的value值
I.在Action类中,若Action 实现了 TextProvider 接口,则可以调用getText()方法获取value值
>通过继承ActionSupport的方式
II. 页面上可以使用 s:text 标签; 对于表单标签可以使用表单标签的 key 属性值
> 若有占位符, 则可以使用 s:text 标签的 s:param 子标签来填充占位符
> 可以利用标签和 OGNL 表达式直接访问值栈中的属性值(对象栈 和 Map 栈)
time1=Time:{0}
------------------------------------
time2=Time:${date}
3).实现通过超链接切换语言
I. 关键之处在于知道 Struts2 框架是如何确定 Local 对象的 !
II. 可以通过阅读 I18N 拦截器知道.
III. 具体确定 Locale 对象的过程:
> Struts2 使用 i18n 拦截器 处理国际化,并且将其注册在默认的拦截器栈中
> i18n拦截器在执行Action方法前,自动查找请求中一个名为 request_locale 的参数。
如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。并把其设置为 session 的 WW_TRANS_I18N_LOCALE 属性
> 若 request 没有名为request_locale 的参数,则 i18n 拦截器会从 Session 中获取 WW_TRANS_I18N_LOCALE 的属性值,
若该值不为空,则将该属性值设置为浏览者的默认Locale
> 若 session 中的 WW_TRANS_I18N_LOCALE 的属性值为空,则从 ActionContext 中获取 Locale 对象。
IV. 具体实现: 只需要在超连接的后面附着 request_locale 的请求参数, 值是 语言国家 代码.
href="testI18n.action?request_locale=en_US">English
href="testI18n.action?request_locale=zh_CN">中文
超链接必须是一个 Struts2 的请求, 否则 i18n 拦截器不起作用!