struts2的国际化

在struts2中需要做国际化的有:

jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化,校验错误信息的国际化

在之前的例子中已经做过和国际化相关的例子了,在struts.xml中配置过


view plaincopy to clipboardprint?
<constant name="struts.custom.i18n.resources" value="message"></constant>   

其中的message就是国际化资源文件的baseNmae。

我们先看看简单的在jsp中进行国际化

在src目录下新建message_en_US.properties,内容为

hello=add user

新建message_zh_CN.properties文件,内容为

hello=/u589e/u52a0/u7528/u6237

然后修改register2.jsp

要想使用国际化显示,可以将信息添加到<s:text></s:text> 标签中,也可以放在<s:i18n></s:i18n> 中,

在这里,先使用标签 <s:text></s:text>

增加以下内容:


view plaincopy to clipboardprint?
<s:text name="hello"></s:text>   

重启服务器后,浏览该页,默认会显示出“增加用户”,可以在IE中打开Internet选项,在常规中选择语言,增加英语(美国)[en-US],然后设置为第一项,刷新就可以看到输出“add user”。


action错误的国际化

在message_en_US.properties中增加以下内容

username.invalid=username invalid...

在message_zh_CN.properties中增加以下内容

username.invalid=/u7528/u6237/u540d/u4e0d/u5408/u6cd5...

修改RegisterAction中的validate方法,将错误加到ActionError中,在这里将使用到ActionSupport中的getText方法获得和国际化资源文件相关的信息。

以username验证为例:


view plaincopy to clipboardprint?
if (null == username || username.length() < 5 || username.length() > 10) {   
  
     this.addActionError(this.getText("username.invalid"));   
  
}   


这样就从资源文件中读取username.invalid的值,增加到ActionError中。


查看该页面不输入任何数据,提交后就可以看到显示效果了。


验证框架的国际化(field级别错误)

在message_en_US.properties文件中增加以下内容

username.xml.invalid=validate information

在message_zh_CN.properties文件中增加以下内容

username.xml.invalid=/u9a8c/u8bc1/u6846/u67b6/u4fe1/u606f

然后修改验证框架,需要将在properties文件中的内容增加到框架中。

以username为例

view plaincopy to clipboardprint?
<field name="username">   
     <field-validator type="requiredstring">   
         <param name="trim">true</param>   
         <message key="username.xml.invalid"></message>   
     </field-validator>   
</field>   


在message标签中增加属性key,值为properties文件中的key
标签中key大多是和国际化相关的


国际化资源文件的分类

当应用程序很大时,需要国际化的东西会很多,因此需要将国际化资源文件进行分类。

需要知道的是在src中的properties文件是全局资源文件,另外还可以分为包级别的和类级别的

首先看看包级别的

命名规则为package_language_country.properties

新建package_en_US.properties,内容为

username.xml.invalid=package validate information

新建package_zh_CN.properties,内容为

username.xml.invalid=/u5305/u9a8c/u8bc1/u4fe1/u606f

可以看到输出的信息为“包验证信息”,由此可见包级别的国际化资源文件的优先级高于全局国际化资源文件。


类级别

新建RegisterAction_en_US.properties,内容为

username.xml.invalid=class validate information

新建RegisterAction_zh_CN.properties,内容为

username.xml.invalid=/u7c7b/u9a8c/u8bc1/u4fe1/u606f

此时可以看到输出的信息为“类验证信息”。

由此可以得到国际化资源文件的优先级


全局<包级别<类级别

另外要进行表单的国际化时,要去掉theme="simple"

在RegisterAction_en_US.properties中增加

username.name=username

在RegisterAction_zh_CN.properties中增加

username.name=/u7528/u6237/u540d

修改表单标签


view plaincopy to clipboardprint?
<s:textfield name="username" key="username.name"></s:textfield>   

注意到key一般是和国际化相关的。

另外除了用

另外除了用<s:text>这个标签外,还可以使用<s:i18n>这个标签


view plaincopy to clipboardprint?
<s:i18n name="temp"></s:i18n>   

标签中包含name,代表着可以定义资源文件的baseName,如可以定义成temp,那么对应着

temp_en_US.properties和temp_zh_CN.properties这两个资源文件。

如定义:


view plaincopy to clipboardprint?
<s:i18n name="hello">   
     <s:text name="world">   
         <s:param>struts2</s:param>   
     </s:text>   
</s:i18n>   

注意到可以在<s:text>标签中增加<s:i18n> 标签。

在hello_en_US.properties文件中增加

world=hello {0}

hello_zh_CN.properties中增加

world=/u4f60/u597d,struts2

在struts2的默认拦截器栈中已经定义了i18n拦截器,所以struts2已经是一个国际化的框架了。

struts2会查找从客户端提交的request_locale属性,并存到session中的WW_TRANS_I18N_LOCALE字段

中。

这个<s:text> 标签外,还可以使用<s:i18n> 这个标签 


view plaincopy to clipboardprint?
<s:i18n name="temp"></s:i18n>   

总结一下显示方法:

<s:textname="hello"></s:text>

getText("username.invalid")

<message key="username.xml.invalid"></message> 

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

<s:i18n name="temp"></s:i18n>

关于转码

native2ascii.exe 用法

如你的原始文件是

1.properties(这个文件是中文编码),你想转换成unicode的
则在cmd下进入到你这个文件所在的目录键入:native2ascii -encoding gb2312 1.properties

2.properties,执行命令后你会在当前目录下看到一个2.properties的文件,内容就是1.properties的

unicode编码内容。如果你再想转换回来,同样在cmd下进入文件所在的目录键入:native2ascii -

reverse -encoding gb2312 2.properties 3.properties,执行命令后在当前的目录会产生一个

3.properties文件,内容就是2.properties内容的中文编码内容,这个时候如果你的1.properties文件还

在,你可以比较1.properties和3.properties内容,发现两个文件内容应该是一样的,一样的前提是中间

你没改变2.properties文件的内容,嘿嘿。

native2ascii.exe 用法
native2ascii是sun java sdk提供的一个工具,和java.exe在一个文件夹下.
用来将别的文本类文件(比如*.txt,*.ini,*.properties,*.java等等)编码转为Unicode编码。为什么要

进行转码,原因在于程序的国际化。
用法:native2ascii [-reverse] [-encoding 编码] [输入文件 [输出文件]]
-[options]:表示命令开关,有两个选项可供选择
-reverse:将Unicode编码转为本地或者指定编码,不指定编码情况下,将转为本地编码。
-encoding encoding_name:转换为指定编码,encoding_name为编码名称。
[inputfile [outputfile]]
inputfile:表示输入文件全名。
outputfile:输出文件名。如果缺少此参数,将输出到控制台

试了一下,很好玩.用的是公司工程里的properties文件.
将java的bin目录放到 环境变量 PATH 里.
然后直接在command 里输入下面的语句即可<注意文件的路径>
native2ascii -reverse Q.txt QQ.txt
native2ascii    QQ.properties QQQ.txt

常见编码列表:
8859_1           ISO 8859-1
8859_2           ISO 8859-2
8859_3           ISO 8859-3
8859_4           ISO 8859-4
8859_5           ISO 8859-5
8859_6           ISO 8859-6
8859_7           ISO 8859-7
8859_8           ISO 8859-8
8859_9           ISO 8859-9
Big5             Big5 码,繁体中文
CNS11643         CNS 11643,繁体中文
Cp037            美国、加拿大(两种语言,法语)、荷兰、葡萄牙、巴西、澳大利亚
Cp1006           IBM AIX 巴基斯坦(乌尔都语)
Cp1025           IBM 多语种西里尔语:保加利亚、波斯尼亚 、黑塞哥维那、马其顿 (FYR)
Cp1026           IBM Latin-5,土耳其
Cp1046           IBM Open Edition US EBCDIC
Cp1097           IBM 伊朗(波斯语)/波斯
Cp1098           IBM 伊朗(波斯语)/波斯 (PC)
Cp1112           IBM 拉脱维亚,立陶宛
Cp1122           IBM 爱沙尼亚
Cp1123           IBM 乌克兰
Cp1124           IBM AIX 乌克兰
Cp1125           IBM 乌克兰 (PC)
Cp1250           Windows 东欧
Cp1251           Windows 斯拉夫语
Cp1252           Windows Latin-1
Cp1253           Windows 希腊
Cp1254           Windows 土耳其
Cp1255           Windows 希伯莱
Cp1256           Windows 阿拉伯
Cp1257           Windows 波罗的语
Cp1258           Windows 越南语
Cp1381           IBM OS/2, DOS 中华人民共和国 (PRC)
Cp1383           IBM AIX 中华人民共和国 (PRC)
Cp273            IBM 奥地利、德国
Cp277            IBM 丹麦、挪威
Cp278            IBM 芬兰、瑞典
Cp280            IBM 意大利
Cp284            IBM 加泰罗尼亚语/西班牙、拉丁美洲西班牙语
Cp285            IBM 英国、爱尔兰
Cp297            IBM 法国
Cp33722          IBM-eucJP - 日语 (5050 的超集)
Cp420            IBM 阿拉伯
Cp424            IBM 希伯莱
Cp437            MS-DOS 美国、澳大利亚、新西兰、南非
Cp500            EBCDIC 500V1
Cp737            PC 希腊
Cp775            PC 波罗的语
Cp838            IBM 泰国扩展 SBCS
Cp850            MS-DOS Latin-1
Cp852            MS-DOS Latin-2
Cp855            IBM 斯拉夫语
Cp857            IBM 土耳其语
Cp860            MS-DOS 葡萄牙语
Cp861            MS-DOS 冰岛语
Cp862            PC 希伯莱
Cp863            MS-DOS 加拿大法语
Cp864            PC 阿拉伯语
Cp865            MS-DOS 日尔曼语
Cp866            MS-DOS 俄语
Cp868            MS-DOS 巴基斯坦语
Cp869            IBM 现代希腊语
Cp870            IBM 多语种 Latin-2
Cp871            IBM 冰岛语
Cp874            IBM 泰国语
Cp875            IBM 希腊语
Cp918            IBM 巴基斯坦(乌尔都语)
Cp921            IBM 拉脱维亚、立陶宛(AIX, DOS)
Cp922            IBM 爱沙尼亚 (AIX, DOS)
Cp930            与 4370 UDC 混合的日语,5026 的超集
Cp933            与 1880 UDC 混合的韩文,5029 的超集
Cp935            与 1880 UDC 混合的简体中文主机,5031 的超集
Cp937            与 6204 UDC 混合的繁体中文,5033 的超集
Cp939            与 4370 UDC 混合的日语拉丁字母,5035 的超集
Cp942            日语 (OS/2),932 的超集
Cp948            OS/2 中文(台湾),938 超集
Cp949            PC 韩文
Cp950            PC 中文(香港、台湾)
Cp964            AIX 中文(台湾)
Cp970            AIX 韩文
EUCJIS           JIS, EUC 编码、日语
GB2312           GB2312, EUC 编码、简体中文
GBK              GBK, 简体中文
ISO2022CN        ISO 2022 CN, 中文
ISO2022CN_CNS    ISO-2022-CN 形式的 CNS 11643,繁体中文
ISO2022CN_GB     ISO-2022-CN 形式的 GB 2312,简体中文
ISO2022KR        ISO 2022 KR, 韩文
JIS              JIS, 日语
JIS0208          JIS 0208, 日语
KOI8_R           KOI8-R, 俄语
KSC5601          KS C 5601, 韩文
MS874            Windows 泰国语
MacArabic        Macintosh 阿拉伯语
MacCentralEurope Macintosh Latin-2
MacCroatian      Macintosh 克罗地亚语
MacCyrillic      Macintosh 斯拉夫语
MacDingbat       Macintosh Dingbat
MacGreek         Macintosh 希腊语
MacHebrew        Macintosh 希伯莱语
MacIceland       Macintosh 冰岛语
MacRoman         Macintosh 罗马语
MacRomania       Macintosh 罗马尼亚语
MacSymbol        Macintosh 符号
MacThai          Macintosh 泰国语
MacTurkish       Macintosh 土耳其语
MacUkraine       Macintosh 乌克兰语
SJIS             Shift-JIS, 日语
UTF8             UTF-8

你可能感兴趣的:(struts2的国际化)