Struts2国际化
国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式。它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素。换言之,应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产。开发这样的程序的过程,就称为国际化。
很多技术框架都提供国际化支持,struts2的国际化大致上分为页面的国际化,Action的国际化以及xml的国际化。
我们将使用Struts2国际化技术实现登录功能的国际化。实现根据客户端的浏览器区域进行语言的切换,我们以英文和中文为例子。
右键点击TestStruts2_001项目的“src”文件夹,选择“New”->“File”在里面新建一文件:
在File name处输入“struts.properties”。properties文件为资源文件。其内容格式为:“Key=Value”。点击“Finish”后即可看到打开了该文件,界面如下:
点击“Add”按钮,看到如下窗体:
在Name处输入“struts.custom.i18n.resources”。这个为键名。
在Value处输入“messageResource”。这个则为键值。
添加完后点击“Finish”可以看到列表中出现:
用同样的方法,先新建一个名字叫messageResource_en_US.properties的文件,分别添加键值:
Name |
Value |
netrobot.login.username |
username |
netrobot.login.password |
password |
netrobot.login.submitbutton |
submit |
netrobot.helloworld |
Hello World! |
得到下面列表:
使用同样方法再创建一个messageResource_zh_CN.properties的文件,并且在里面添加键值:
Name |
Value |
netrobot.login.username |
用户名 |
netrobot.login.password |
密码 |
netrobot.login.submitbutton |
登录 |
netrobot.helloworld |
你好! |
得到如图:
注意,查看messageResource_zh_CN.properties的代码视图“Source”可以看到:
netrobot.login.username=\u7528\u6237\u540D
netrobot.login.password=\u5BC6\u7801
netrobot.login.submitbutton=\u767B\u5F55
netrobot.helloworld=\u4F60\u597D\uFF01
中文不能直接写在properties文件中,必须使ascii码表示。
然后我们修改一下login.jsp页面:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="s" uri="/struts-tags"%> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head></head> 6 <body> 7 <s:form action="loginAction" > 8 <s:textfield name="username" key="netrobot.login.username"/> 9 <s:password name="password" key="netrobot.login.password"/> 10 <s:submit key="netrobot.login.submitbutton"/> 11 </s:form> 12 </body> 13 </html>
在各个控件后加上相应的key=””,即可实现页面的国际化。表单控件有很多,其他控件的用法请参考struts2相关文档。
我们再修改一下HelloWorld.java,在里面修改代码如下:
1 package hello; 2 import com.opensymphony.xwork2.ActionSupport; 3 public class HelloWorld extends ActionSupport{ 4 private String message; 5 public String getMessage() { 6 return message; 7 } 8 public void setMessage(String message) { 9 this.message = message; 10 } 11 public String execute(){ 12 setMessage(getText("netrobot.helloWorld")); 13 return "success"; 14 } 15 }
与之前的区别有两个地方:1. HelloWorld类继承了ActionSupport,要使用Struts2的国际化,必须继承该类。2. 通过getText("label.helloWorld")方法获得国际化后的HelloWorld值。通过getText方法可以实现Action中的国际化。
运行结果:
假如运行时,操作系统为英文操作系统,则显示英文界面如图:
在控制面板将系统的“区域与语言”设置为“中文(中国)”,则显示中文界面:
注意:
如需添加其他语言,只需增加messageResource_语言_国家.properties文档即可。语言和国家的代码请参考相关资料。
国际化资源文件分为三种级别
(1)全局资源文件,可以被整个应该程序引用,也就是struts.custom.i18n.resources = messageResource指定的文件。
(2) 包级资源文件,每个包的根目录下可以新建资源文件,仅被当前包中的类访问.文件名格式为:package_语言代码_国家代码.
(3) Action级资源文件,仅被当前Action引用,名称为action名_语言代码_国家代码
查找顺序为从小范围到大范围, Action级优先级最大