国际化(Internationalization,又称il8n),是越来越多的应用软件必须面临的问题,Java语言采用Unicode编码,并且提供了强大的类库支持国际化编程。采用Java语言编程,可以方便地实现应用软件界面语言的国际化。
国际化编程常用类:使用Java语言进行国际化编程,经常要用到Locale类及ResourceBundl e类,它们都在包java.util中.
1.Locale类
Locale类包含对主要地理区域的地域化特征的封装。通过设定Locale,我们可以为特定的国家或地区提供符合当地文化习惯的语言、表达格式等。一个Locale代码 可由语言代码和地区代码组合而成。常用的两种Locale代码如下:
语言代码 |
地区代码 |
Locale代码 |
说明 |
en |
US |
en_US |
美国英语 |
zh |
CN |
zh_CN |
简体中文 |
2.ResoureeBundle类
ResourceBundle类是一个抽象类,需要通过getBundle(String baseName,Locale locale)方法加载扩展名为properties的资源文件。资源文件的名称由一个基本名称和Locale代码组成,而基本名称则可以在Java程序中调用getBundle(StringbaseName,Locale locale)方法时传人参数指定。例如,我们在程序中指定基本名称为messages,Locale代码为zh_CN, 则对应的资源文件应为messages_zh_CN.properties
3、接下来我们可以用下面的代码来取得国际化配置:
Locale locale=new Locale("zh","CN");
ResourceBundle messages = ResourceBundle.getBundle("messages",locale);
String title = messages.getString("title");
上面的代码就是加载了messages_zh_CN.properties 的资源文件,读取了资源文件中的title的值。
I18N formatting 标签库就是用于在 JSP 页面中做国际化的动作。在该标签库中的标签一共有 12 个,被分为了两类,分别是:
国际化核心标签: <fmt:setLocale>、<fmt:bundle>、<fmt:setBundle>、<fmt:message>、<fmt:param>、<fmt:requestEncoding>
格式化标签: <fmt:timeZone>、<fmt:setTimeZone> 、<fmt:formatNumber> 、<fmt:parseNumber>、<fmt:formatDate>、<fmt:parseDate>
1、<fmt:setLocale>标签 :
<fmt:setLocale> 标签用于设置 Locale 环境。有两个属性:
属性
|
描述
|
value
|
Locale 环境的指定,可以是 java.util.Locale 或 String 类型的实例
|
scope
|
Locale 环境变量的作用范围(可选)
|
<fmt:setLocale value="zh_CN"/> 表示设置本地环境为简体中文。
2、<fmt:bundle> 、<fmt:setBundle> 标签 :
这两组标签用于资源配置文件的绑定,唯一不同的是 <fmt:bundle> 标签将资源配置文件绑定于它标签体中的显示, <fmt:setBundle> 标签则允许将资源配置文件保存为一个变量,在之后的工作
可以根据该变量来进行。有3个属性:
属性
|
描述
|
basename
|
资源配置文件的指定,只需要指定文件名而无须扩展名,二组标签共有的属性
|
var
|
<fmt:setBundle> 独有的属性,用于保存资源配置文件为一个变量
|
scope
|
变量的作用范围
|
<fmt:setLocale value="zh_CN"/>
<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>
该示例将会查找一个名为 applicationMessage_zh_CN.properties 的资源配置文件,来作为显示的 Resource 绑定。
3、<fmt:message> 标签 :
用于信息显示的标签,将显示资源配置文件中定义的信息。有四个属性:
属性
|
描述
|
key
|
资源配置文件的“键”指定
|
bundle
|
若使用 <fmt:setBundle> 保存了资源配置文件,该属性就可以从保存的资源配置文件中进行查找
|
var
|
将显示信息保存为一个变量
|
scope
|
变量的作用范围
|
<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>
<fmt:bundle basename="applicationAllMessage">
<fmt:message key="userName" />
<fmt:message key="passWord" bundle="${applicationBundle}"/>
</fmt:bundle>
该示例使用了两种资源配置文件的绑定的做法,“ applicationMessage ”资源配置文件利用 <fmt:setBundle> 标签被赋于了变量“ applicationBundle ”,而作为 <fmt:bundle> 标签定义的“
applicationAllMessage ”资源配置文件作用于其标签体内的显示。
第一个 <fmt:message> 标签将使用“ applicationAllMessage ”资源配置文件中“键”为“ userName ”的信息显示。
第二个 <fmt:message> 标签虽然被定义在 <fmt:bundle> 标签体内,但是它使用了 bundle 属性,因此将指定之前由 <fmt:setBundle> 标签保存的“ applicationMessage ”资源配置文件,该“键”为“ passWord ”的信息显示。
4、<fmt:param> 标签:
<fmt:param> 标签应该位于 <fmt:message> 标签内,将为该消息标签提供参数值。它只有一个属性 value 。
<fmt:param> 标签有两种使用版本,一种是直接将参数值写在 value 属性中,另一种是将参数值写在标签体内。
5、<fmt:requestEncoding> 标签:
用于为请求设置字符编码。它只有一个属性 value ,在该属性中可以定义字符编码。 <fmt:timeZone>、<fmt:setTimeZone> 标签 :
这两组标签都用于设定一个时区。唯一不同的是 <fmt:timeZone> 标签将使得在其标签体内的工作可以使用该时区设置, <fmt:setBundle> 标签则允许将时区设置保存为一个变量,在之后的工作可以根据该变量来进行。有3个属性:
属性
|
描述
|
value
|
时区的设置
|
var
|
<fmt:setTimeZone> 独有的属性,用于保存时区为一个变量
|
scope
|
变量的作用范围
|
6 、<fmt:formatNumber>标签 :用于格式化数字。
属性
|
描述
|
value
|
格式化的数字,该数值可以是 String 类型或 java.lang.Number 类型的实例
|
type
|
格式化的类型
|
pattern
|
格式化模式
|
var
|
结果保存变量
|
scope
|
变量的作用范围
|
maxIntegerDigits
|
指定格式化结果的最大值
|
minIntegerDigits
|
指定格式化结果的最小值
|
maxFractionDigits
|
指定格式化结果的最大值,带小数
|
minFractionDigits
|
指定格式化结果的最小值,带小数
|
<fmt:formatNumber>标签对应 java.util.NumberFormat 类, type 属性的可能值包括 currency (货币)、 number (数字)和 percent (百分比)。
<fmt:formatNumber value="1000.888" type="currency" var="money"/>
该结果将被保存在“ money ”变量中,将根据 Locale 环境显示当地的货币格式。
7、<fmt:parseNumber> 标签 :
用于解析一个数字,并将结果作为 java.lang.Number 类的实例返回。 <fmt:parseNumber> 标签看起来和 <fmt:formatNumber> 标签的作用正好相反。
属性
|
描述
|
value
|
将被解析的字符串
|
type
|
解析格式化的类型
|
pattern
|
解析格式化模式
|
var
|
结果保存变量,类型为 java.lang.Number
|
scope
|
变量的作用范围
|
parseLocale
|
以本地化的形式来解析字符串,该属性的内容应为 String 或 java.util.Locale 类型的实例
|
<fmt:parseNumber value="15%" type="percent" var="num"/> 解析之后的结果为“ 0.15 ”。
8 、<fmt:formatDate> 标签:用于格式化日期。
属性
|
描述
|
value
|
格式化的日期,该属性的内容应该是 java.util.Date 类型的实例
|
type
|
格式化的类型
|
pattern
|
格式化模式
|
var
|
结果保存变量
|
scope
|
变量的作用范围
|
timeZone
|
指定格式化日期的时区
|
<fmt:formatDate> 标签与 <fmt:timeZone> 、 <fmt:setTimeZone> 两组标签的关系密切。若没有定 timeZone属性, 也可以通过 <fmt:timeZone> 、 <fmt:setTimeZone> 两组标签设定的时区来格式化最后的结果。
9、 <fmt:parseDate> 标签
<fmt:parseDate> 标签用于解析一个日期,并将结果作为 java.lang.Date 类型的实例返回。 <fmt:parseDate> 标签看起来和<fmt:formatDate> 标签的作用正好相反。
属性
|
描述
|
value
|
将被解析的字符串
|
type
|
解析格式化的类型
|
pattern
|
解析格式化模式
|
var
|
结果保存变量,类型为 java.lang.Date
|
scope
|
变量的作用范围
|
parseLocale
|
以本地化的形式来解析字符串,该属性的内容为 String 或 java.util.Locale 类型的实例
|
timeZone
|
指定解析格式化日期的时区
|
<fmt:parseNumber> 和 <fmt:parseDate> 两组标签都实现解析字符串为一个具体对象实例的工作,因此,这两组解析标签对 var 属性的字符串参数要求非常严格。就 JSP 页面的表示层前段来说,处理这种解析本不属于份内之事,因此 <fmt:parseNumber> 和 <fmt:parseDate> 两组标签应该尽量少用,替代工作的地方应该在服务器端表示层的后段,比如在 Servlet 中。
如何在Spring 中配置国际化配置。
1、首先我们要准备资源文件,messages.properties ,作为默认的资源文件,另外准备了3个版本的资源文件:messages_en_US.properties messages_zh_CN.properties messages_zh_TW.properties。放在class-path也就是/WEB-INF/classes里 。
注意:中文的资源,需要将文字转化为下,可以使用native2ascii.exe 工具,在JDK的bin目录下,带有这个工具。
2、web.xml 加入代码用来定义messages文件
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>messages</param-value>
</context-param>
3、建立个新的JSP页面:
加入标签库:<%@ taglib uri="http://java.sun.com/jstl/fmt " prefix="fmt" %>
然后设置 国际化配置语言:<fmt:setLocale value="zh_CN"/> 这样就会加载 messages_zh_CN.properties 的资源文件。
在用引用的国际化的属性的时候 使用 <fmt:message key="title"/> 就可以了,其中的title 为资源文件中定义的属性
这样就完成了一个最基本的国际化配置。
实际项目的中国际化配置完整引用。
项目描述:默认根据客户的浏览系统,自动选择对应的国际化配置。提供国际化语言切换功能。
1、首先我们先要准备资源文件,以及在web.xml 中加入 资源文件的定义。
2、项目中国际化配置分为两个部分,一个是JSP页面,一个是后台代码中国际化。
新建类文件:ContextUtils.java 用来设置cookie 和加载国际化配置文件。代码如下:
// 根据cookie中取得的对应语言,来加载国际化资源文件中的属性值
public static String language(String key, int type)
{
Locale locale = null;
if (type == 0)
locale = new Locale("zh", "CN");
else if (type == 1)
locale = new Locale("zh", "TW");
else if (type == 2)
locale = new Locale("en", "US");
ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
String value = rb.getString(key);
return value;
}
// 取得当前Cookie中设置的语言。默认返回zh-cn
public static String getHl(HttpServletRequest request)
{
String hl = request.getParameter("hl");
if (hl == null)
{
Cookie[] cookies = request.getCookies();
if ((cookies == null) || (cookies.length == 0))
hl = null;
else
{
for (int i = 0; i < cookies.length; i++)
{
if ("hl".equals(cookies[i].getName()))
hl = cookies[i].getValue();
}
}
}
if (hl == null)
hl = request.getHeader("Accept-Language");
if (hl == null)
return "zh-cn";
hl = hl.toLowerCase();
if ("zh-cn".equals(hl))
return hl;
else if (hl.startsWith("en"))
return "en";
else if ("zh-tw".equals(hl) || "zh-hk".equals(hl) || "zh-sg".equals(hl)
|| "zh-mo".equals(hl))
return "zh-tw";
else
return "zh-cn";
}
3、准备好了ContextUtils类后,程序中调用就很简单了。
// 先判断语言:
int lang = 0;
String hl = ContextUtils.getHl(httprequest);
if ("zh-tw".equals(hl))
{
lang = 1;
} else if ("en".equals(hl))
{
lang = 2;
}
// 然后加载对应的资源文件中的属性
String title = ContextUtils.language("title", lang);
这样就完成了程序中多语言。
4、完成了程序中多语言设置,接下来我们来实现JSP中多语言切换。多语言切换,主要是JS实现Cookie的设置。
function setHl(hl)
{
var Days = 360;var exp = new Date();exp.setTime(exp.getTime() + Days*24*60*60*1000);
setCookie("hl",hl,exp);
window.location.href="index.jsp"; // 设置好cookie后自动加载该页面
}
function setCookie(name, value, expires, path, domain, secure)
{
document.cookie= name + "=" + escape(value) +
((expires) ? "; expires=" + expires.toGMTString() : "") +
((path) ? "; path=" + path : "") +
((domain) ? "; domain=" + domain : "") +
((secure) ? "; secure" : "");
}
5、最后一个步骤就是根据Cookie中的语言,加载对应的国际化配置资源文件。
JSP页面:
除了 fmt taglibs 外 ,还需要引用 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"% >
然后:取得cookie值, String hl =ContextUtils.getHl(request);
接下来对不同的cookie 设置Local 值,代码:
<c:choose>
<c:when test="<%=hl.equals("zh-cn")%>">
<fmt:setLocale value="zh_CN"/>
</c:when>
<c:when test="<%=hl.equals("en")%>">
<fmt:setLocale value="en_US"/>
</c:when>
<c:when test="<%=hl.equals("zh-tw")%>">
<fmt:setLocale value="zh_TW"/>
</c:when>
<c:otherwise>
<fmt:setLocale value="zh_CN"/>
</c:otherwise>
</c:choose>
最后就可以 在页面中引用:<fmt:message key="title"/> 来加载资源中的属性。
这样就完成了一个完整的项目中的多语言配置。
分享到:
相关推荐
用Java写的一个国际化语言配置模块,可实现简单的国际化配置。
本Demo使用配置文件实现java语言的国际化,没有过多的花哨,简易明了,稍微知道点java语言的同学都可以看得明白,有不明白的地方可随时留言,
java国际化示例,根据事先配置好的文件,进行相应的语言调用。
NULL 博文链接:https://yjshengshe.iteye.com/blog/1694742
java程序实现国际化,解决乱码问题!这是实现的程序代码,稍后会上传配置文件
对于想体验win8而又为win8 ie11兼容性担心的web程序猿有福啦,按照这个文档...win8下支持java国际化:在ie中显示”??Button.userslist???”乱码,解决方案。 ie企业模式:通过企业模式设置可以提高你web网页的兼容性。
基于i18n国际化微服务统一处理错误码的demo
springboot国际化配置,开发工具IDEA,导入我的这个项目,启动主程序类,直接localhost:8080,即可。
这个代码实现了一个简单的多语言应用。首先,我们定义了三种语言的问候语,并使用一个Map来存储每种语言对应...这个例子展示了如何使用Java的国际化和本地化功能来实现多语言应用,可以提高程序的可移植性和用户体验。
spring boot+JPA+easyUI 实现基于浏览器语言的国际化配置
struts2国际化,根据浏览器设置来显示不同语言,。
它介绍了JAVAspring的国际化的概念、原理和作用,以及如何使用JAVAspring的国际化来实现多语言支持,包括资源文件、区域设置、消息解析、日期格式、货币格式等内容,以及一些配置文件和注解的用法。
java国际化与反编译插件与配置,非常方便的反编译插件,内附详细说明
java 改变Properties文件中的键值 java 改变Properties文件中的键值
1、struts国际化的配置 * 在struts-config.xml文件中加入: 2、提供不同版本的国际化资源文件,中文需要采用native2ascii转换成unicode 3、在jsp中采用标签来读取国际化消息文本 4、了解利用struts默认将locale...
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...
Struct国际化 实现一个登录的例子,希望对大家有用!!!
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...