struts2学习笔记之九(国际化)

国际化

java国际化

  • 程序国际化:

    程序可以根据机器所在国家、语言环境,自动翻译内容
    国际化的本质就是:查找、替换,从资源包里找到相应国家下的关键字对应的语言文字

  • 国际化的步骤:
    (1)提供国际化资源文件

    如果国家化资源包中有非西欧字符,需要使用`native2ascii`处理文件,  
    `native2ascii sourcefile destfile`
    生成一个是Unicode字符的文件爱你
    
    资源文件的写法:文件名_语言代码_国家代码
    
    xiyang_en_US.properties
        hi="hello"
    xiyang_zh_CN.properties
        hi="你好"
    注意:不能直接写"你好",要使用Unicode编码,转换之后hi="\u4f60\u597d"
    

    (2)在程序中输出的是国际化消息的key值,这样程序就会从资源包中搜索key的value

  • 提供国际化资源文件

    mess_zh_CN.properties

  • java国际化
public class LocaleTest{
    public static class main(String[] args){
        //查看系统支持的语言和国家代码
        System.out.println("查看语言、国家代码");
        Locale[] locales = Locale.getAvailableLocales();
        for(Locale locale: locales){
            System.out.println(locale.getDisaplayLanguage()
                +"---->"+locale.getLanguage());
            System.out.println(locale.getDispalayCountry()
                +"---->"+locale.getCountry())
        }
        //已经提供了两个资源包hi_en_US.properties,hi_zh_CN.properties
        //获取本机的环境
        Locale locale = Locale.getDefault(Locale.Ctegory.FORMAT); 
        //绑定资源文件
        ResourceBundle bundle=ResourceBundle.getBundle("hi",locale);
        System.out.println(bundle.getString("hi"));
    }
}

struts2的国际化

1、支持模块化加载
2、struts2支持自动加载国家化资源

  • jsp页面的国际化

    i18n—– internationalization 取i和末尾n,中间省略18个字母,故有i18n

    • 需要手工加载国际化消息
      使用<s:i18n .../>
    • 在页面上使用<s:text ../>根据key来输出国际化消息
      如果是表单标签,可以直接使用key来指定国际化消息的key
      每一个页面都使用一个国际化模块
  • Action国际化

        1、自动加载国际化消息
                ActionSupport类实现了action接口,而且它还增加了输入校验支持,国际化支持等功能
                因此推荐继承ActionSupport
                让国际化消息的basename与action类名相同,而且放在同一个目录下
                getText是ActionSupport的方法,专门用来加载国际化消息
    
        2、在action类中调用getText()方法
                getText(key,String[])
                getText(key)
    
  • 包范围的国际化

    1、自动加载国际化消息
        ActionSupport类实现了action接口,而且它还增加了输入校验支持,国际化支持等功能
        因此推荐继承ActionSupport
        让国际化消息的basename为package(不是与包名相同),而且放在该包下面
        可以让该包下面的action共享同一个国际化资源文件
    2、在action类中调用getText()方法
        getText(key,String[])
        getText(key)
    
  • 全局国际化资源文件

    1、通过一个struts.custom.i18n.resource常量来加载国际化资源
    2、全局国际化资源文件,即可被action访问,也可以被jsp页面访问
    3、尽量少用,这样不利于项目后期的升级和维护
    

实例

JSP国际化
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<s:i18n name="resource/I18nJSP">
<html>
  <head>   
    <title>
    <!--注意这里是name,而不是key,这个命名并不是很好,因为实际上name在这里就是key的意思-->
        <s:text name="LoginPage"/>
    </title>
  </head>

  <body>
        <!--
            下面的表单的好处
            1、更简单
            2、自动支持2列布局
            3、自动输出类型转换失败,输入校验失败的错误信息
        -->
        <s:form action="loginAction">
            <s:textfield name="name" key="username" />
            <s:textfield name="pass" key="password" />
            <s:submit key="login"/>
        </s:form>
  </body>
</html>
</s:i18n>
Action国际化
  • 登陆页面

    使用上面的JSP页面

  • Action处理类

package org.struts2.action;

import com.opensymphony.xwork2.ActionSupport;

public class Login extends ActionSupport {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String name;
    private String pass;
    private String tip;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
    public String getTip() {
        return tip;
    }
    public void setTip(String tip) {
        this.tip = tip;
    }
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        if(name.equals("me")
                && pass.equals("12345")){
            //注意这里怎么读取国际化关键字,第二个参数是数组
            setTip(getText("login", new String[]{name}));
            return SUCCESS;
        }
        return ERROR;
    }
}
  • struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!-- 开发模式为true,出错的时候信息很多,或者配置文件修改会自动备份,减少重启服务器 -->
    <constant name="struts.devMode" value="true"></constant>
    <!-- 编码字符集,应于页面的字符集一样 -->
    <constant name="struts.i18n.encoding" value="gb2312"></constant>    
    <package name="org.struts2.action" extends="struts-default">
        <action name="loginAction" class="org.struts2.action.Login">
            <result>
                /WEB-INF/content/welcome.jsp
            </result>
        </action>
    </package>
    <package name="general" extends="struts-default">

            <!-- 万能的action,可以匹配任何action -->
            <action name="*">
                <!-- 这样的处理可以访问WEB-INF下面的内容,一般来说,用户是不可以访问WEB-INF的内容,有利于安全 -->
                <!-- 这个思想也就是用户的一切请求都是action请求-->
                <result>/WEB-INF/content/{1}.jsp</result>
            </action>

    </package>
</struts>
  • 资源包
    • 中文
      login=\u5F88\u9AD8\u5174\u89C1\u5230\u4F60\uFF0C{0}\uFF01
    • 英文
      login=Nice to meet you,{0}\!
  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts Blank</display-name>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

由前两个例子可知:
1、JSP页面的资源是在JSP页面中由<s:i18n name="">来指定
2、Action类的资源是自动加载的

包国际化

Global国际化

将所有的国际化的key集中到一个文件中,然后直接由系统自动调用
重点是struts.xml中配置常量struts.custom.i18n.resoures
注意:不要写错了,由于我将resources写成了resource,然后就一直怀疑是程序哪里出问题了。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!-- 开发模式为true,出错的时候信息很多,或者配置文件修改会自动备份,减少重启服务器 -->
    <constant name="struts.devMode" value="true"></constant>
    <!-- 编码字符集,应于页面的字符集一样 -->
    <constant name="struts.i18n.encoding" value="gb2312"></constant>    
    <constant name="struts.custom.i18n.resources" value="/resource/globalI18n"></constant>
    <package name="org.struts2.action" extends="struts-default">
        <action name="loginAction" class="org.struts2.action.Login">
            <result>
                /WEB-INF/content/welcome.jsp
            </result>
        </action>
    </package>
    <package name="general" extends="struts-default">

            <!-- 万能的action,可以匹配任何action -->
            <action name="*">
                <!-- 这样的处理可以访问WEB-INF下面的内容,一般来说,用户是不可以访问WEB-INF的内容,有利于安全 -->
                <!-- 这个思想也就是用户的一切请求都是action请求-->
                <result>/WEB-INF/content/{1}.jsp</result>
            </action>

    </package>
</struts>

其他的页面就可以直接使用了,JSP页面要把<s:i18n name="path/file">这种方式很方便,就是对后期维护升级来说有点麻烦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值