Struts2的全局/包/Action范围国际化应用

本文介绍了Struts2中实现国际化的三种范围:全局、包和Action。详细讲解了如何配置资源文件,以及如何在Action和JSP中使用占位符获取国际化信息。还提到了Struts2的i18n拦截器在设定用户默认语言环境中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结!



准备资源文件,资源文件的命名格式如下:

baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如:
中国大陆: baseName_zh_CN.properties
美国: baseName_en_US.properties


国际化--全局(整个应用都能访问)

 (1)现在为应用添加两个资源文件:
  第一个存放中文:itcast_zh_CN.properties  内容为:welcome=欢迎来到传智播客
  第二个存放英语(美国): itcast_en_US.properties  内容为: welcome=welcome to itcast
对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。命令的使用方式如下:
native2ascii  源文件.properties  目标文件.properties

 (2)在struts.xml中配置常量

<!-- 全局资源文件基名subjob,在没有包/action范围的资源文件情况下, 则struts在sunjob_language_country.properties中寻找key值,以实现国际化 -->
  <constant name="struts.custom.i18n.resources" value="sunjob"></constant>  

国际化—包范围资源文件(package及其子package下)

     在一个大型应用中,整个应用有大量的内容需要实现国际化,如果我们把国际化的内容都放置在全局资源属性文件中,显然会导致资源文件变的过于庞大、臃肿,不便于维护,这个时候我们可以针对不同模块,使用包范围来组织国际化文件。

    方法如下:
在java的包下放置package_language_country.properties资源文件,package为固定写法,处于该包及子包下的action都可以访问该资源。当查找指定key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才会从常量struts.custom.i18n.resources指定的资源文件中寻找。

国际化—Action范围资源文件
(只有此Action才能访问)

   我们也可以为某个action单独指定资源文件,方法如下:
在Action类所在的路径,放置ActionClassName_language_country.properties资源文件,ActionClassName为action类的简单名称。

  当查找指定key的消息时,系统会先从ActionClassName_language_country.properties资源文件查找,如果没有找到对应的key,然后沿着当前包往上查找基本名为package 的资源文件,一直找到最顶层包。如果还没有找到对应的key,最后会从常量struts.custom.i18n.resources指定的资源文件中寻找。

如下:

国际化—输出带占位符的国际化信息

资源文件中的内容如下:
welcome= sunjob:{0},欢迎来到湖南{1}

在Action和jsp中取得器资源方法:
(1)在jsp页面中输出带占位符的国际化信息(默认是从全局资源文件寻找,不会从包级/Action级中资源文件寻找)
<s:text name="welcome">
     <s:param><s:property value="realname"/></s:param>
    <s:param>学习</s:param>
</s:text>

(2)在Action类中获取带占位符的国际化信息,可以使用getText(String key, String[] args)或getText(String aTextName, List args)方法。

  如:

System.out.println(this.getText("welcome",new String[]{"肖华","学习"}));


国际化—JSP中直接访问某个资源文件

struts2为我们提供了<s:i18n>标签,使用<s:i18n>标签我们可以在类路径下直接从某个资源文件中获取国际化数据,而无需任何配置:

<body>
   ------------------name=sunjob-----------------------<br/>
    <s:i18n name="sunjob">
     <s:text name="welcome">
       <s:param>肖华</s:param>
       <s:param>学习</s:param>
     </s:text><br/>
     </s:i18n>
     <!-- 默认访问全局资源文件 -->
      <s:text name="login">
      </s:text>
     <br/>
     ----------------name=edu/sunjob/action/package----------------------<br/>
     <s:i18n name="edu/sunjob/action/package">
       <s:text name="welcome">
         <s:param>肖华</s:param>
         <s:param>学习</s:param>
       </s:text><br/>
     </s:i18n><br/> 
     <s:i18n name="edu/sunjob/action/package">
       <s:text name="login"></s:text>
     </s:i18n><br/>
     --------------name=edu/sunjob/action/WordAction----------------------<br/>
     <s:i18n name="edu/sunjob/action/WordAction">
       <s:text name="welcome">
         <s:param>肖华</s:param>
         <s:param>学习</s:param>
       </s:text>
     </s:i18n>
  </body>

国际化--如何修改用户默认语言环境

 Action中:

 

package edu.sunjob.action;

import java.util.Locale;
import java.util.ResourceBundle;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class WordAction extends ActionSupport{
   //取得默认语言的资源
	public String getText(){
		System.out.println(this.getText("welcome",new String[]{"肖华","学习"}));
		return "success";
	}
	//Action中设置用户的默认语言。
	public String locale(){
		Locale locale = Locale.CHINESE;
		//得到默认的本地语言
		//Locale locale = Locale.getDefault();
		ActionContext.getContext().setLocale(locale);
		return "success";
	}
	//Action中取得指定语言的资源文件值
	public String i18n(){
		
		Locale locale = Locale.CHINESE;
		ResourceBundle rb = ResourceBundle.getBundle("sunjob",locale);
		String welcome = rb.getString("welcome");
		System.out.println(welcome);
		return "success";
	}
}

JSP中:

为了简化设置用户默认语言环境,Struts2提供了一个名为i18n的拦截器(Interceptor),并且将其注册在默认的拦截器中(defaultStack)。  i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。所以可以这样访问:http://localhost:8080/Struts2_06/i18n/word_getText.action?request_locale=zh_CN.注意只对同一个SESSION有效。

 除此之外,i18n拦截器还会将上面生成的Locale对象保存在用户Session的名为WW_TRANS_I18N_LOCALE的属性中。一旦用户Session中存在一个名为WWW.TRANS_I18N_LOCALE的属性,则该属性指定的Locale将会作为浏览者的默认Locale。      

<%@ page language="java" contentType="text/html; charset=GBK"%>

<%@taglib prefix="s" uri="/struts-tags"%>

<script. type="text/javascript">

function langSelecter_onChanged()

{

 document.getElementById("langForm").submit();

}

</script>

<%-- 设置SESSION_LOCALE为用户session中的WW_TRANS_I18N_LOCALE属性值 --%>

<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>

<%-- 使用lee.Locales创建locales实例 --%>

<s:bean id="locales" name="lee.Locales">

 <%-- 为locales实例传入current参数值,如果SESSION_LOCALE为空,则返回ValueStack中locale属性值(即用户浏览器设置的Locale) --%>

 <s:param name="current" value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"/>

</s:bean>

<%-- 让用户选择语言的表单 --%>

<form. action="<s:url/>" id="langForm"

    style="background-color:#bbbbbb; padding-top: 4px; padding-bottom: 4px;">

    <s:text name="languag"/>

 <s:select label="Language" list="#locales.locales" listKey="value" listValue="key"

        value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"

        name="request_locale" id="langSelecter"

        nchange="langSelecter_onChanged()" theme="simple"/>

</form>

在其他页面中包含该页面:

<s:include value="selectlanguage.jsp"/>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值