Struts 2框架的国际化
前言
国际化是指应用软件不用做任何修改就可以在不同国家或地区使用,能够支持不同的语言和国家,并按照当地用户的习惯(语言和格式习惯)来显示内容,如日期时间、数字和货币等。当国际化的软件在本地机器上运行时,需要进行本地化,即根据本地机器的语言和地区设置显示相应的内容。
实现国际化的理想的方法就是将要显示的内容从程序代码中分离,而不是将其进行硬编码,这样,不用修改应用程序的源码就可以实现国际化,方便应用程序的维护和移植。为了做到这一点,可以将要显示的内容统一保存到一个资源文件中,当本地化是,再从资源文件中取出符合本地机器的语言和地区设置的内容进行显示。
内容
资源文件
在编写国际化程序时,要为不同国家(地区)和语言编写不同的资源文件,这些资源包同属一个资源序列,共享一个基名。
名称格式
在Struts2框架中,资源文件的命名格式遵循一定的规则,以确保国际化功能的正确实现。资源文件的命名通常遵循以下格式:
basename_language_country.properties
其中:
basename:这是资源文件的基本名称,你可以根据需要进行自定义。它代表了资源文件的主要标识,通常用于在配置文件中引用。
language:这部分代表语言的代码,必须是Java支持的语言代码。例如,英文的代码是"en",中文的代码是"zh"。它的取值由ISO-639定义官网链接: ISO-639官网
country:这部分代表国家的代码,也必须是Java支持的国家代码。例如,美国的代码是"US",中国的代码是"CN"。它的取值由ISO-3166定义官网链接: ISO-3166官网
除了上述的完整格式外,Struts2还支持以下两种简化格式:
basename_language.properties:当你不需要指定国家代码时,可以使用这种格式。它表示资源文件针对特定语言,但不特定于某个国家。
basename.properties:这是最基本的格式,表示资源文件是默认版本,没有特定的语言或国家设置。这通常用于提供应用程序的默认文本信息。
内容
在Struts2框架中,资源文件的内容主要是用于国际化的文本信息,这些信息以键值对的形式存储。每个键(key)对应一个值(value),这个值就是在特定语言环境下应该显示的文本。
key=value 格式
英文:welcome=Welcome to our application!
中文:welcome=欢迎来到我们的应用程序!
分类
在Struts2框架中,资源文件根据它们的用途和范围有多种分类方式:
1.包范围资源文件(Package Scope Resource Files)
2.全局范围资源文件(Global Scope Resource Files)
3.Action范围资源文件(Action Scope Resource Files)
4.JSP访问指定资源文件
包范围资源文件:
包范围资源文件通常具有这样的命名格式:package_name + 语言简称 + .properties。它们是与特定的包(通常是Java包)相关联的资源文件。当执行Action中的execute()方法时,Struts2会就近使用这些包范围资源文件。
全局范围资源文件:
全局范围资源文件采用以下命名格式:basename + 语言简称 + .properties。这些资源文件不是与特定的包相关联,而是对整个应用程序都是可用的。当项目中同时存在包范围资源文件与全局范围资源文件时,默认加载时会使用全局资源文件。
Action范围资源文件:
Action范围资源文件以Action的名称命名,格式通常为:ActionName + 语言简称 + .properties。这些资源文件与特定的Action类相关联,并提供了该Action所需的国际化文本。在优先级方面,Action范围资源文件的优先级是最高的。
JSP访问指定资源文件:
在JSP页面中,可以使用特定的Struts2标签(如<s:i18n name=“basename/package/ActionName”></s:i18n>)来指定和访问资源文件。这允许开发者在JSP视图中直接引用国际化文本。
需要注意的是,资源文件的优先级是从高到低排序的,依次是:Action范围资源文件 > 包范围资源文件 > 全局范围资源文件。这意味着当Struts2查找某个键的国际化文本时,它会首先检查Action范围资源文件,如果没有找到,则会检查包范围资源文件,最后检查全局范围资源文件。
访问资源文件中消息的方式
在Action中访问资源文件中的消息
在Action类中,你可以通过继承ActionSupport类或使用自己的Action类,并覆盖getText()方法来获取资源文件中的消息。getText()方法接受一个键作为参数,并返回对应的消息。
public class MyAction extends ActionSupport {
public String execute() {
String message = getText("messageKey");
// 使用message
return SUCCESS;
}
}
在JSP页面中访问资源文件中的消息
在JSP页面中,你可以使用<s:text> 标签来访问资源文件中的消息。这个标签的name属性指定了要访问的资源文件中的键(key)。通过在text标签中内嵌param标签可以向资源文件中的消息传递参数,最多可以内嵌10个param标签,这种传递参数的方式属于占位符参数方式。
使用text标签访问资源文件中消息的格式:
- 不传递参数
<s:text name=“messageKeyName”/>
- 传递参数
①使用Action类中的属性名称
<s:text name=“messKeyName”>
<s:param>
<s:property value=“actionPropertyName”/>
</s:param>
…
</s:text>
其中property标签的value的属性值是Action类中的属性名称。
②直接赋值
<s:text name=“messageKeyName”>
<s:param value=“tsc”/>
…
</s:text>
在表单标签中访问资源文件中的消息
可以通过表单标签的key或者label属性访问资源文件中的消息。使用格式如下:
①使用表单标签的key属性,属性的值是资源文件中消息的key,如下:
s:textfield name=“tagName” key=“messageKeyName”/>
②使用表单标签的label属性,属性的值通过getText()方法获取,如下:
<s:textfield name=“tagName” label=“%{getText(‘messageKeyNmae’)}”/>
在资源文件中访问资源文件中的内容
在资源文件中,一条消息的值可以通过使用OGNL表达式从另一条消息中获取。OGNL表达式的格式如下:
${getText(“messageKeyName”)}
其中messageKeyName是资源文件中消息的key。
实例应用
介绍:实现两种语言登录,当使用中文登录显示页面是“欢迎你:XX”当使用英文登录显示页面是“welcome:XX”。
LoginAction.java
package rjxy.struts2i18n;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
// 在Struts2中,表单字段的值为空(即用户没有输入任何内容)和字段的值为 null
// 是不同的。如果用户没有输入任何内容,那么Struts2通常会将这些字段的值绑定为空字符串(""),而不是
// null。因此,即使用户没有输入任何内容,username 和 password 字段也不太可能是 null。
if (username == null && password == null) {
return INPUT;
} else {
return SUCCESS;
}
}
}
LoginAction_en_US.properties
login.username=username
login.password=password
login.login=login
welcome.msg=welcome:{0}
welcome.msg.ognl=welcome:${username}
LoginAction_zh_CN.properties
login.username=\u7528\u6237\u540D
login.password=\u5BC6\u7801
login.login=\u767B\u5F55
welcome.msg=\u6B22\u8FCE\u4F60:{0}
welcome.msg.ognl=\u6B22\u8FCE\u4F60\uFF1A${username}
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>
<constant name="struts.devMode" value="true"/>
<constant name="struts.custom.i18n.resources" value="LoginAction"/>
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="rjxy.struts2i18n.LoginAction" >
<result name= "input">/login.jsp</result>
<result name= "success">/success.jsp</result>
</action>
</package>
</struts>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>
<a href="login?request_locale=en_US">英语</a>
<a href="login?request_locale=zh_CN">汉语</a>
<s:form action="login" method="post">
<s:textfield name="username" key="login.username"></s:textfield>
<s:password name="password" key="login.password" />
<s:submit name="login" key="login.login" />
</s:form>
<!-- <form method="post" action="login">
<s:property value="getText('login.username')"/><input type="text" name="username"/><br/>
<s:property value="getText('login.password')"/><input type="password" name="password"/><br/>
<input type="submit" value="<s:property value="getText('login.login')"/>"/>
</form>-->
</body>
</html>
success.jsp
```xml
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>
<!-- <s:text name="welcome.msg">
<s:param value="username"></s:param>
</s:text> -->
<br>
<s:text name="welcome.msg.ognl">
</s:text>
</body>
</html>
实验效果图展示
中文
博主用心写,读者点关注;互动传真情,知识不迷路