今天关于一些学习了国际化的知识

  今天上课,我们学习关于框架中国际化的一些知识,这里想把他们总结出来,以方便我日后的学习,先是介绍一下,在java当中的国际化,在java当中的国际化比较简单,先是做好准备工作,就是提供一个国际化资源文件,其中的命名规则为,baseName_语言代码_国家代码.properties 我这里就写两个例子吧,MessageResource_en_US.properties

login.username=username
login.password=password
login.success=user {0} login success
login.submit=submit
login.username.error=user {0} not found
login.password.error=password error

MessageResource_zh_CN.properties

login.username=\u7528\u6237\u540D
login.password=\u5BC6\u7801
login.success=\u7528\u6237\u540D {0} \u767B\u5F55\u6210\u529F
login.submit=\u63D0\u4EA4
login.username.error=\u7528\u6237\u540D {0} \u6CA1\u6709\u627E\u5230
login.password.error=\u5BC6\u7801\u9519\u8BEF

上面的第二个properties是中文的文件名,这里我就不多做解释,其中的{0}这是以后要用到的栈位符的填充,后面会做解释!
  那配置文件提供好了以后,接下来可以尝试的写入java代码,这里也写了一个例子,代码如下!

import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;


public class Test {
    public static void main(String args[]){
        
        //Locale locale = Locale.getDefault();这里是取得当前的java虚拟机的默认的语言环境
        Locale locale = new Locale("zh", "EN");//可以把这个locale配置成别的信息,就比如放成英文的
        String username = "arron";
        //获取当前国际化资源当中的信息,记住加上baseName 和 locale
        ResourceBundle rb = ResourceBundle.getBundle("MessageResource", locale);
        
        String msg = rb.getString("k3");
        //这是栈位填充符的例子
        MessageFormat ms = new MessageFormat(msg);
        //记住这里是一定要弄成数组的形式,因为存储的方式的是按照数组的形式来存储的
        String str = ms.format(new Object[]{username,"abc"});
        
        System.out.println(str);
    }
}

通过打印出来的信息,就可以得出,在不同的配置文件当中,可以打印出不同的信息,了解到了,java当中的信息,怎么通过了解java当中的信息,我们要了解到在web前端当中国际化的实际例子
  利用到web前端的例子,这里我也写两个,因为我最近学习struts的一些东西,我就写出来在struts当中的利用,和不在struts利用,国际化的东西,先从简单的开始,不在struts利用的,我先写上一个首页,

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 先是提供一个要跳转的URL再去带上参数locale里面的值附上 -->
    <c:url value="login.jsp" var="chineseURL">
       <c:param name="locale" value="zh_CN"/>
     </c:url>
    <a href="${chineseURL}">中文</a><br>
<!-- 下面的也是一样 -->    
    <c:url value="login.jsp" var="engURL">
    <c:param name="locale" value="en_US"/>
    </c:url>
     
    <a href="${engURL}">English</a>
</body>
</html>

首页的目的就是提供两个超链接,一个中文登录的,还有一个英文登录的,以实现两种不同的登录页面的显示,
接下来就是在登录的页面要处理的信息了,这里我也附上代码。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <c:set var="loc" value="en_US"/>
    <c:if test="${!(empty param.locale)}">
      <c:set var="loc" value="${param.locale}"/>
    </c:if>
    <!-- 先是默认的写上其中的编码形式为英文的编码 -->
    <fmt:setLocale value="${loc}" />
    
    <fmt:bundle basename="MessageResource"><!--要告诉其中的国际化文件是什么 -->
    <form action="user.do?command=login" method="post">
        <fmt:message key="login.username"></fmt:message>:<input type="text" name="username"><br><!--要实现国际化的内容 -->
        <fmt:message key="login.password"></fmt:message>:<input type="text" name="password"><br>
        <input type="submit" value="<fmt:message key="login.submit"></fmt:message>" >
    </form>
    </fmt:bundle>
</body>
</html>

这样就简单的实现了,一个国际化登录的形式,通过你点击不同的链接,来看到不同的登录页面,就可以实现其中的效果!
   接下来,我就来写写在struts当中的国际化的例子,同样也在工程当中需要提供两个配置文件的信息和上面的一样,但是在首页的信息,就不一样了,我也贴上代码,

<a href="changelan.do?lan=en">中文</a><br>
<a href="changelan.do?lan=zh">English</a>

这里要注意了,我这里是提交到了一个action里面去了,而这里的action只要简单的继承一个action就可以了。主要的实现代码我也贴上代码

package com.daijianwei.action;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class LoginAction extends Action {
    
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        String language = request.getParameter("lan");//接收参数
        Locale locale = null;//给一个locale附上初始的值
        if("zh".equals(language)){//进行判断如果是中文的就附上中文的locale
            locale = new Locale("zh","CN");
        }else if("en".equals(language)){
            locale = new Locale("en","US");
        }
        //把相应的值放到session里面中
        this.setLocale(request, locale);
        return mapping.findForward("success");
    }
}

被放到这个页面进行处理了以后,你还要在前台的页面进行相应的变化,不过和上面的页面一定要注意的地方就是你要在你的配置页面一定要给上相应的国际化文件的信息,也就是国际化文件的名称,配置文件当中主要的一句话就是,

<message-resources parameter="MessageResource"></message-resources>

前台页面的代码是,这里可以和前面的页面可以进行很好的比较。

代码附上

<form action="user.do?command=login" method="post">
        <bean:message key="login.username"/>:<input type="text" name="username"><br><!--要实现国际化的内容 -->
        <bean:message key="login.password"/>:<input type="text" name="password"><br>
        <input type="submit" value="<bean:message key="login.submit"/>" >
    </form>

这样就可以实现其中的功能了,

上面的例子是我举得两个在不同情况下的例子,接下来,我再说一下在栈位填充在struts当中的例子

可以看到我上面得信息都是配置好了的,其中的登录页面我也写好了请求头

接下来,我再把提交的到的action的代码也附上,

package com.daijianwei.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.actions.DispatchAction;

import com.daijianwei.exception.PasswordErrorException;
import com.daijianwei.exception.UserNotFindException;
import com.daijianweri.service.UserService;

public class UserAction extends DispatchAction {

    
    public ActionForward login(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        DynaActionForm laf = (DynaActionForm)form;
        String username = laf.getString("username");
        String password = laf.getString("password");
        
        ActionMessages msgs = new ActionMessages();//动态的国际化消息文本,这里相当于一个容器List<ActionMessage>
        ActionMessage msg = null;//一条国际化的消息文本
        
        msg = new ActionMessage("login.success", new Object[]{username});//通过构造方法来来拿出不同的消息文本信息
        
        String forwardName = "ok";
        try {
            new UserService().loginUser(username, password);
        } catch (UserNotFindException e) {
            msg = new ActionMessage("login.username.error", new Object[]{username});//记住这里一定要是数组的形式放进去
            forwardName = "error";
        }catch(PasswordErrorException e){
            msg = new ActionMessage("login.password.error");
            forwardName = "error";
        }
        
        msgs.add("abc", msg);//取的前面的名字可以随便,但是后面要是消息文本的
        msgs.add("abc", msg);
        msgs.add("aaa", msg);
        msgs.add("bbb", msg);
        msgs.add("ccc", msg);
        this.addMessages(request, msgs);//把获取的文本信息全部都加到message里面去,记住是request
        return mapping.findForward(forwardName);
    }
    
}

这是主要的处理文件信息,另外的配置文件的信息 我也贴出来,也可以方便以后的复习,

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
    <form-beans>
        <form-bean name="LoginForm" type="org.apache.struts.action.DynaActionForm">
            <form-property name="username" type="java.lang.String"></form-property>
            <form-property name="password" type="java.lang.String"></form-property>
        </form-bean>
    </form-beans>
    
    <action-mappings>
        <action path="/user"
                name="LoginForm"
                
                parameter="command"
                type="com.daijianwei.action.UserAction">
        
        <forward name="ok" path="/login_ok.jsp"></forward>
        <forward name="error" path="/login_error.jsp"></forward>
        </action>
        
        <action path="/changelan"
                type="com.daijianwei.action.LoginAction">
        <forward name="success" path="/login.jsp"></forward>
        </action>
    </action-mappings>
    
    <message-resources parameter="MessageResource"></message-resources>
</struts-config>

我相信,学习过框架的同学肯定对这个不陌生,就是其中的一些配置文件的信息,另外还有最后一个就是显示信息了,我也附上代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <bean:message key="login.success" arg0="${LoginForm.map.username}"     />

    
    <%-- <html:messages id="a" message="true" property="abc">
        ${a}
    </html:messages> --%>
</body>
</html>

同样的这里也是有两种形式,如果是我上面写的第一种形式,其中的UserAction这个处理文件是不需要写上那么多的信息的,只要简单的写上struts里面简单的处理信息就可以了,如果不利用第一种形式,使用上第二种形式,就要在UserAction加上额外的处理信息,这里做一下特殊的说明。

  好了,上面就是我今天学习到的一些关于国际化的知识,总结起来方法很多,也很好用,老师说,我们以后可能做不了这方面的时候事情,但是学到了的东西还是很好,也是为了以后可以很好的复习!就总结这么多吧!

 

 

 

 

 

 

  

 

posted @ 2013-06-04 20:35  bod08daijianwei  阅读(208)  评论(0编辑  收藏  举报