struts如何实现国际化(转)

Struts的国际化

 

1.配置struts-config.xml文件:

<message-resources parameter="res.MessageResources" />

以制定资源文件的路径

 

其中的"res.MessageResources"就是我们自己在src目录下面创建的国际化配置文件的路径

Res:目录名

MessageResourcesbasename

 

2.提供不同版本的国际化资源文件,中文需要采用native2ascii转换成unicode

 

3.jsp中采用<bean:message>标签来读取国际化消息文本

 

为了用这个标签,我们需要使用struts定义的标签

<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>

这样,我们使用<bean:message key="user.title"/>就可以从国家化文件中读取到对应当前文字的key的值

 

当一个http请求被发送过来的时候,struts默认会先从session中检查是否有对应的locale对象,如果有直接用,如果没有strutsprocess的方法中就会从这个请求的头文件中获得其Locale对象,并把这个对象放置到session

 

由于Locale信息是被保存在session中的,所以我们可以自己定义一个Locale对象,并把setsession中去,实现我们手动的语言切换。

 

 4、了解利用struts默认将locale放到session中的特性,完成采用编程的方式切换语言设置

 

具体的实现方式是:

 

1.自己写一个超连接,url指向我们自己定义的一个Action,后面带上语言参数,比如如果要中文就是“zh”。

 

2.在我们自己定义的Action中获得语言参数,根据这个语言参数创建对应的Locale对象,放置到session中就可以了。

 

 具体例子代码

 

比如超链接是这样的

 

<a href="changelang.do?lang=zh">中文</a>

 

自己创建changelangAction

 

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)            throws Exception {

 

获得页面传递下来的语言信息

 

        String lang = request.getParameter("lang");

 

       

        Locale currentLocale = Locale.getDefault();

 

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

 

            currentLocale = new Locale("zh", "CN");

 

        }else if("en".equals(lang)) {

 

            currentLocale = new Locale("en", "US");

 

        }

 

        //request.getSession().setAttribute(Globals.LOCALE_KEY, currentLocale);

 

这里调用的struts自己内部定义好的方法,把我们自己定义的 currentLocale对象放置到session中。上面注释掉的代码所做的功能和这个是一样的

 

        this.setLocale(request, currentLocale);

 

        return mapping.findForward("index");

    }

先根据session的locale加载属性文件,没有的话读取http头文件的loacle,那么当http头文件的loacle没有对应的属性文件与之匹配时,究竟会显示那种语言呢?答案是:根据服务器端得区域和语言的设置加载相关的属性文件,组后根据默认的属性文件。比如说,你有中文和英文的两个属性文件和一个默认的属性文件,区域设置为中文中国。浏览器传过来的是一个阿拉伯的locale,这时没有相应的阿拉伯属性文件存在,这时就会根据区域中的中文中国读取中文的属性文件,如果万一,区域是俄罗斯或别的,那么就会读取默认的属性文件。(测试时,当区域设置发生改变时要重启tomcat)

动态填充提示信息

 

1.在对应的国际化文件中配置对应信息

比如我们添加了如下信息:

user.login.success={0},登录成功

 

现在我们希望在程序中动态填充上这个信息,只要下面这样就可以了

1.创建国际化消息文本集合

ActionMessages messages = new ActionMessages();

2.创建国际化消息文本

ActionMessage message = new ActionMessage("user.login.success", new Object[]{username})

ActionMessage :一个ActionMessage对象对应国际化文件中的一条消息

User.login.success:对应消息key

new Object[]{username}:该数组通过下标与消息中的占位符一一对应

3.把这个消息文本加到前面创建的文本集合中

messages.add("loginSuccess2", message);

4.传递这个文本集合到页面的request对象中去

    this.saveMessages(request, messages);

注意:这个saveMessages方法Action对象自带的。其内部源码实际上就是把我们创建的这个文本集合放置到request的一个属性中去

 

其内部源码就是这样:

request.setAttribute(Globals.MESSAGE_KEY, messages);

我们可以使用struts提供的标签把它拿出来。

 

但是,如果上面的消息是一个错误消息的话,就需要这样

    this.saveErrors(request, messages);

 

这个时候,内部其实同样是把文本集合放置到一个request属性中去,只不过key值发生变化,源码是这样的

request.setAttribute(Globals.ERROR_KEY, errors);

 

Struts在页面区分普通信息和错误信息就是以不同的keyrequest中去查找就对了。

 

如果想在页面取出这些我们放入的错误信息,首先要加载对应的struts的标签库

 

<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>

 

<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %> 

 

 然后用下面方法可以读取我们放入到messages中的数据

 

<html:messages id="msg" message="true" property="loginSuccess1">

        <bean:write name="msg"/>

</html:messages>

 

这个标签会循环我们放在messages中的所有对象,默认情况下只读取其中标记为错误的部分。

这个标签中的message默认是“false”的,这个时候,这个标签只读我们saveErrors中的错误信息,如果希望他能读出普通的提示信息,就必须设置message="true"

 

如果我们不设置其中的property属性,它会循环出所有放在messages中的信息,但是如果我们设置了property="loginSuccess2",则我们就只能读出前面messages.add("loginSuccess2", message);中的那个message

 

也可以通过<html:errors>显示消息,但是这种方式只能显示错误消息。
posted @ 2009-09-09 09:51  Fskjb  阅读(1761)  评论(0编辑  收藏  举报
年年行好运