Struts2之-国际化详解

什么是国际化

  国际化是在软件设计和文档开发过程中,使得功能和代码设计能处理多种语言和文化习俗,在创建不同语言版本时,不需要重新设计源程序代码的软件工程方法。

  通俗而言就是我写一个欢迎登陆的页面,中国人来看就是欢迎登陆,美国人看就是welcome,这是不同的信息保存在不同的资源文件(properties文件)中,以键值对的形式保存,代码是固定的不需要修改,当你访问登陆页的环境不同(在美国?在中国?),程序自动读取相应资源文件的信息,反馈给用户不同的信息,这就是国际化。当然,我们也可以设置切换语言的选项来手动更改读取的资源文件。

java国际化的思想

Java国际化的思想是将程序中的信息放在资源文件中,程序根据支持的国家以及语言环境,读取相应的资源文件。资源文件是key-value对,每个资源文件中的key是不变的,但是value则随不同的国家/语言变化。

Java程序国际化主要通过两个类来完成:

  • java.util.Locale:用于提供本地信息,通常称它为语言环境。不同的语言,不同的国家和地区采用不同的Locale对象来表示;
  • java.util.ResourceBundle:该类称为资源包,包含特定的语言环境的资源对象。

为了实现java程序国际化,必须事先提供程序所需要的资源文件。其中key是程序使用的部分,而value是程序界面的显示。

全局资源文件的命名可以有以下3种方式:

  • baseName.properties;
  • baseName_language.properties;
  • baseName_language_country.properties(一般用这种);

baseName是资源文件的基本名称,有用户自由定义。但是language和country就必须为java语言所支持的语言和国家/地区代码。例如:中国大陆为:baseName_zh_CN.properties,美国为baseName_en_US.properties。

包资源文件的命名方式

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

国际化信息输出方法

国际化信息输出主要有以下几种方式:

1、在JSP页面中输出

  在JSP页面中为了输出国际化信息,可以使用Struts2的<s:text…/>标签,该标签可以指定一个name属性,用以指定国际化资源文件中的key。如:

<s:text name="welcome">
<s:param>你</s:param>
<s:param>杭州</s:param>
</s:text>

2、在表单标签中输出

  通过key属性指定资源文件中的key,如:

<s:textfield name="realname" key="username"/>

<!--或者如下方法-->
<s:textfield name="realname" label="%{getText('username')}"/>

3、在Action类中输出

  Action类可以继承ActionSupport,使用getText()方法取得国际化信息,该方法的第一个参数用于指定资源文件中的key。

4、在校验文件中输出

  在校验文件中,可以通过message的key属性指定资源文件中的key,如:

<message key="login.error.username"/>

国际化实例

1、struts2.xml

<!-- 请求参数的编码方式 -->
    <constant name="struts.i18n.encoding" value="utf-8" />
    <!-- 每次HTTP请求系统都重新加载资源文件,有助于开发 -->
    <constant name="struts.i18n.reload" value="true" />
    <!-- 设置资源文件名前缀 -->
    <constant name="struts.custom.i18n.resources" value="shadow"></constant>

<package name="myPackage" extends="struts-default" namespace="/">
          <action name="chlang" class="action.ChangeLanAction">
           <result>/i18n.jsp</result>
         </action>
    </package>

2、shadow_en_US.properties

welcome=welcom{0} to {1}\!
username=shadow

3、shadow_zh_CN.properties

welcome=\u6B22\u8FCE{0}\u6765\u5230{1}\u65C5\u6E38\!
username=\u5F71\u68A7

4、i18n.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>i18n测试</title>
</head>
<body>
<form action="">

表单中通过key属性指定资源文件中的key <br>
<s:textfield name="realname" key="username"/><br><br>

<!--或者如下方法-->
表单中通过%{getText('username')}来获取 <br>
<s:textfield name="realname" label="%{getText('username')}"/>


  </form>
<br><br>
<s:text name="welcome">
<s:param>你</s:param>
<s:param>杭州</s:param>
</s:text>
<br/>
<s:a href="chlang.action?lang=zh">简体中文</s:a>
<br/>
<s:a href="chlang.action?lang=en">English</s:a>
</body>
</html> 

5、ChangeLanAction.java

/**
 * 
 */
package action;

import java.util.Locale;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import lombok.Getter;
import lombok.Setter;

/**
 * @author Administrator
 *
 */
public class ChangeLanAction extends ActionSupport{

    @Getter @Setter private String lang;
    private static final long serialVersionUID = 8316277698647325268L;

    @Override
    public String execute() throws Exception {

    Locale locale = null;

        if (lang.equals("zh")) {
            // 显示中文
            locale = Locale.CHINA;

        } else {
            // 显示英文
            locale = Locale.US;
        }
        ActionContext.getContext().setLocale(locale);   
        System.out.println(getText("username"));
        return SUCCESS;
    }

}

6、测试效果

中文模式:
《Struts2之-国际化详解》

英文模式:
《Struts2之-国际化详解》

控制台输出:

影梧
shadow

参考

Struts2的国际化简单介绍使用
细谈struts2(十二)struts2国际化底层大揭秘
Struts2国际化介绍及使用详细说明
i18n切换

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注