一、struts2的国际化实现
问题一:如何配置国际化资源文件?有多少种方式去配置呢?
方式一:Action范围资源文件:在Action类文件所在的路径建立名为ActionName_language_country.properties的文件。例如:
TestI18nAction类在com.lizhenhua.struts2.i18n这个包下,我们配置的Action范围资源文件就必须是在com.lizhenhua.struts2.i18n包下建立TestI18nAction_zh_CN.properties的文件。
方式二:包范围资源文件:在包的根路径下建立文件名为package_language_country.properties的属性文件,一旦建立,处于该包下的所有Action都可以访问该资源文件。注意:包范围资源文件的baseName就是package,不是Action所在的包名。
方式三:全局资源文件:命名方式为basename_language_country.properties
必须在struts.xml配置文件中需要配置常量声明
struts.xml
<constant name="struts.custom.i18n.resources" value="baseName">
struts.properties
struts.custom.i18n.resources=baseName
方式四:临时指定资源文件:<s:i18n/>标签的name属性指定临时的国际化资源文件
问题二:国际化资源文件加载的顺序是怎么样的呢?
离当前Action较近的将被优先加载。
(1)加载和ChildAction的类文件在同一个包下的系列资源文件ChildAction.properties
(2)加载ChildAction实现的接口Ichild,且和IChildn在同一个包下IChild 。properties系列资源文件
问题三:如何在页面上和Action类中访问国际化资源文件的value值?
1.在Action类中,若Action实现了TextProvider接口,则可以调用其getText()方法获取value值。
实现步骤:通过继承ActionSupport的方式可以实现TextProvider接口。调用示例如下:
<s:textfield name="username" label="%{getText('username')}"></s:textfield>
2.可以在页面上使用s:text标签,对于表单标签可以使用表单标签的key属性值,示例如下:
<s:textfield name="username" key="username"></s:textfield>
若有占位符,则可以使用s:text标签的s:param子标签来填充占位符
<s:text name="time">
<s:param value="date"></s:param>
</s:text>
3.若当前页面来自于Action,则可以直接访问Action中的属性值
4.可以利用标签和OGNL表达式直接访问值栈中的属性值(对象栈和Map栈)
第一种方式
time=<Time\:{0}
<s:text name="time">
<s:param value="date"></s:param>
</s:text>
第二种方式
time2=Time\:${date}
<s:text name="time2"></s:text>
问题三:实现超链接切换语言
1.关键之处在于知道Struts2框架是如何确定Local对象的!
2.可以通过阅读I18能拦截器知道
3.具体确定Locale对象的过程
1)Struts2使用i18n拦截器处理国际化,并且将其注册在默认的拦截器栈中
2)i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设置为用户默认的Locale(代表国家/语言环境)。并把其设置为session的WW_TRANS_I18N_LOCALE属性
3)若request没有名为request_locale的参数,则i18n拦截器会从Session中获取WW_TRANS_I18N_LOCALE的属性值,若该值不为空,则将该属性值设置为浏览者的默认Locale
4)若session中的WW_TRANS_I18N_LOCALE的属性值为空,则从ActionContext中获取Locale对象
4.具体实现:只需要在超链接的后面附着request_locale的请求参数,值是语言国家代码
<a href="testI18n.action?request_locale=en_US">English</a> <br/>
<a href="testI18n.action?request_locale=zh_CN">中文</a> <br/>
超链接:必须经过拦截器的action,而不能直接是jsp页面。