您的位置:首页 > 编程语言 > Java开发

码农小汪-struts2学习6-国际化

2016-03-25 22:55 573 查看
国际化对于软件的意义重大,不同国家的不同的语言的形式更是不一样,国际化实在必行,但是真真的实行国际化还是有很多的不一样的地方,小汪呢,在大二的时候,专门发的给老师做苦力,国际化过一个网站,看上去不是挺简单的嘛,其实不然,有很多的地方值得思考的,一个简单的问题,中文和英文的长度不一样,我们配置属性的时候怎么做到恰倒好处,调试很久是必然的,对于不同的地方增加了,若干个if else的判断,到底是那种语言的呢,我们怎么处理呢。

在软件的处理过程中肯定会出现这些问题的,无法避免,在全局国际化的同时,还需要进行局部的判断,这样才会使得所有的都满足我们的定义。

Java 对于国际化的支持

国际化(internationalization,经常被称做”i18n”,因为18是字母”i”和字母”n”之间的字母个数)

Java程序的国际化思路是将程序中的标签、提示信息等放在资源文件中,程序需要支持国家/语言环境,则必须提供对应的资源文件。资源文件是key-value对,每个资源文件中的key不变,但value随不同的国家/语言变化。

如下是Java的支持包

java包用途
Java.util.ResourceBundle用于加载资源包
Java.util.Locale对应一个特定的国家/地区、语言环境
Java.text.MessageFormat用于将消息格式化
基本的属性文件的命名规则都是差不多的

规则
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名称,用户可以自由定义,而language和country都不可随意变化,必须是Java所支持的语言和国家。
可以通过Locale类的getAvailableLocale方法获取支持的,该方法返回一个Locale数组,该数组中包含了所有支持的国家和语言。

Locale [ ] locales = Locale.getAvailableLocales();
通过local的属性,获得一个locales[0].getCountry(),getLanguage()这两个属性


经常用的也就是中文英文啦。

resource_zh_CN.properties
title=标题  key=value
resource_en_US.properties
title=title


中文的可以使用jdk的native2ascii 命令进行转码Unicode编码。这样不会乱码。也可以采用在线的工具进行处理,这种也是比较方便的,看你心情了。

native2ascii resource_zh_CN..properties  teme.properties
然后在将转好的编码拷贝替换到resource_zh_CN.properties


package com.ascent.i18n.test;
import java.util.*;
public class ResourceBundleTest {
public static void main(String[] args) {
//设置本地区语言(默认),可以去查查javaAPi,很清楚的
Locale locale = Locale.getDefault();
//可以使用Local的常量设置具体的语言环境
//Locale locale = Locale.US;
//根据地区不同加载不同的资源文件
ResourceBundle rb = ResourceBundle.getBundle("resource", locale);
//根据key获得value值
String title = rb.getString("title");
System.out.println(title);
}
}


就是这么的简单我们就可以直接的使用啦啦,高兴?根据local加载文件,getString 调用特定的字符串的key值。

Java国际化包含占位符的消息

和上面的就感觉不太一样啦,是不是呢?

如何实现呢?例如下面消息:

英文:welcome={0}!Today {1}.

中文:welcome={0}!今天{1}.

就是在我们使用的过程中还会在里面填充东西的时候,刚刚我们不是讲解了两个函数?还有个格式化消息的还没有使用哦。是不是?

我们需要使用MessageFormat类,该类有个很有用的静态的方法
format(String pattern,Object… values) 返回后面多个参数值填充前面pattern字符串,其中pattern字符串就是一个带占位符的字符串。
String result = MessageFormat.format(welcome, "汪吉","天气不错");
这个样子我们就是替换掉了刚才的东西啦,是不是简单?


Struts 2的国际化

封装
Struts 2国际化是建立在Java国际化的基础之上,一样也是通过提供不同国家语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息—整个过程与Java程序的国际化完全相同,只是Struts2框架对Java程序国际化进行了进一步封装,从而简化了应用程序的国际化。
- Struts 2提供了很多加载国际化资源文件的方式,最简单.最常用的就是加载全局的国际化资源文件,加载全局的国际化资源文件的方式通过配置常量来实现。不管在struts..xml文件中配置常量,还是在在struts.properties文件中配置常量,只需要配置struts.custom.i18n.resources常量即可。我们在属性的配置中讲解过的哦,没有看的可以去看哈Structs属性的配置说明–小汪配置struts.custom.i18n.resources常量时,该常量值为全局国际化资源文件的baseName。

下面的两种方式都是可以得哦!
struts.properties
struts.custom.i18n.resources= properties.message

struts.xml
<constant name="struts.custom.i18n.resources" value="properties/message"/>

src下添加properties文件夹,下面添加资源文件 message_zh_CN.properties
message_en_US.properties


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

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<!—使用s:text 标签输出国际化消息-->
<title><s:text name="loginPage"/></title>
</head>
<body>
<h3><s:text name="loginTip"/></h3>
<!—在表单元素中使用key来指定国际化消息的key-->
<s:form action="Login" method="post">
<s:textfield name="username" key="login.name"/>
//这里就是在外面显示 姓名:——————,这种东西
<s:password name="password" key="login.password"/>
<s:submit name="submit" key="submit" />
</s:form>
</body>
</html>


public String execute() {
if ("xmh".equals(user.getName()) &&         "xmh".equals(user.getPassword())) {
message = getText("login.succmessage")+", " + user.getName();
} else {
message = getText("login.erromessage");
这里也是访问的key
}
return SUCCESS;
}

login.name=name
login.pass=pass
login.submit=submit
login.succmessage=welcome
login.erromessage=Invalid user or password


这个也支持,通配符…………………………………………..

手动转换,传递过来一个参数,然后判断,设置就行了
Locale l = Locale.getDefault();
l = new Locale("zh", "CN");
l = new Locale("zh", "CN");
l = new Locale("en", "US");     ActionContext.getContext().setLocale(l);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: