什么是国际化
国际化是在软件设计和文档开发过程中,使得功能和代码设计能处理多种语言和文化习俗,在创建不同语言版本时,不需要重新设计源程序代码的软件工程方法。
通俗而言就是我写一个欢迎登陆的页面,中国人来看就是欢迎登陆,美国人看就是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、测试效果
中文模式:
英文模式:
控制台输出:
影梧
shadow
参考
Struts2的国际化简单介绍使用
细谈struts2(十二)struts2国际化底层大揭秘
Struts2国际化介绍及使用详细说明
i18n切换