`
黑夜星空哈
  • 浏览: 7130 次
社区版块
存档分类
最新评论

struts2 i18n学习记录

阅读更多

Strurs2 国际化I18N

一:基础配置

1. 要使用Struts2来实现国际化的支持,同样先来准备国际化信息资源文件

message.properties

message_zh_CN.properties

message_en_US.properties

2.设置Struts2引用国际化信息资源文件,

(方法1)struts.xml中设置一个常量:

<constant name="struts.custom.i18n.resources" value="message"/>

(方法二):在struts.properties中配置如下参数

struts.custom.i18n.resources= message

3.jsp中访问国际化资源

可以直接选用Struts2text标签来访问国际化信息,其中text标签的name属性就是要引用哪个key

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

2. <s:text name="labela"/>

 

二:指定语言信息的不同方式

方法一:指定浏览器使用的语种

首先要去掉struts.xmlstruts.properties文件中配置的如下参数

1. <constant name="struts.locale" value="zh_CN"/>   

2. <constant name="struts.i18n.encoding" value="gb2312"/>

设置浏览器语言:工具==Internet选项==》语言,通过添加、上、下移操作,将预使用的语言放在最上边

 

 

 
 

则重新访问网页,则会使用当前浏览器设置的语言对应的国际化配置信息。

 

方法二:struts2常量设置

struts.xml中加上struts.locale这个常量

<constant name="struts.locale" value="zh_CN"/>

这时候,会发现无论怎么修改浏览器的语言设置,Struts2都会去访问中文信息了

方法三:请求加上request_locale=zh_CN参数

注意:该请求必须要经过strutsi18n拦截器,否则无效

也可以直接设置session

Locale local = new Locale("zh""CN");

session.setAttribute("WW_TRANS_I18N_LOCALE", local);

i18n拦截器在Action运行之前会检查请求中是否包含了一个叫做“request_locale”的参数,如果存在此参数,则会用它的值建立一个Locale对象,并用这个Locale对象去覆盖Struts2的常量设置和浏览器的语言设置。除此之外,i18n拦截器还会把这个Locale对象放到名为WW_TRANS_I18N_LOCALESession属性中去,而这个属性也会覆盖Struts2的常量设置和浏览器的语言设置。因此,只需要传入一次request_locale参数,session就会记住用户的选择,整个网站就会都变成用户选择的语言了。

 

三种方式的覆盖方式

优先级如下:

用户指定参数>struts.xml中配置的常量>浏览器设置。

并且用户参数指定的方式,只需要设置一次,在整个session生命周期内都使用同样的语言。

 

S2SH项目中ActionServiceDao各层如何获得struts2的国际化资源

S2SH项目中ActionServiceDao各层如何获得struts2的国际化资源

Actionaction可以继承ActionSupport,可以直接调用getText()方法获得

ServiceDao 层:无法通过Action的方法获得Struts2i18n资源文件中的内容

思考:因为同一个session的国际化相同,可以借助java.util. ResourceBundle资源包,在session创建时,根据语言信息创建ResourceBundle对象,然后将其存放到session中,以后就可以通过session获得国际化资源信息。

主要代码如下

 

1.创建放入session中的对象

 

public class SessionData {

  private String language;

  //国际化资源包

  private ResourceBundle rb;

 

  public void setLanguage(String language) {

 

    Locale locale = null;

    if ("zh".equals(language)) {

      locale = new Locale("zh""CN");

    } else {

      locale = new Locale("en""US");

    }

 

    ResourceBundle rb = ResourceBundle.getBundle("sourceName", locale);

    this.rb = rb; 

     this.language = language;

  }

 

   //getter方法略......

}

 

2.将国际化资源信息通过ResourceBundle资源包放入当前session

public String login (){

  //......

  String language = request.getParameter("local"); 

  //可以获得语言信息或者可以获得Local信  息(假如用local对象,则上边setLanguage()方法适当调整下即可)

 

  SessionData sessionData = 

  (SessionData)request.getSession ().getAttribute (“SessionData”);

 

 

  if (sessionData == null) {

    sessionData = new SessionData();

    request.getSession().setAttribute(“SessionData”, sessionData);

   }

    //这句代码将资源文件信息放入到session

   sessionData.setLanguage(loc.getLanguage());

    //......

}

 

3.编写公用方法,获得国际化资源文件的指定键的内容

public class I18nUtil {

 

  //根据键key获得国际化资源文件sourceName中的值

  public static String getText (String key) {

    String value = "";

    SessionData sd = (SessionData) ServletActionContext.getRequest()

    .getSession().getAttribute(SessionData”);

 

    value = sd.getRb().getString(key);

 

    return value;

  }

}

 

4.serviceDao层使用

I18nUtil.getExceptionText(key)

 

<!--EndFragment-->
  • 大小: 50.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics