详解Java中⽤于国际化的locale类
1. Locale 介绍
Locale 表⽰地区。每⼀个Locale对象都代表了⼀个特定的地理、政治和⽂化地区。
在操作 Date, Calendar等表⽰⽇期/时间的对象时,经常会⽤到;因为不同的区域,时间表⽰⽅式都不同。
下⾯说说Locale对象的3种常⽤创建⽅式。
(1)获取默认的Locale
使⽤⽅法:
Locale locale = Default()
(2)直接使⽤Locale的静态对象
Locale.java中提供了以下静态对象
public static final Locale CANADA
public static final Locale CANADA_FRENCH
public static final Locale CHINA
public static final Locale CHINESE
public static final Locale ENGLISH
public static final Locale FRANCE
public static final Locale FRENCH
public static final Locale GERMAN
public static final Locale GERMANY
public static final Locale ITALIAN
public static final Locale ITALY
public static final Locale JAPAN
public static final Locale JAPANESE
public static final Locale KOREA
public static final Locale KOREAN
public static final Locale PRC
public static final Locale ROOT
public static final Locale SIMPLIFIED_CHINESE
public static final Locale TAIWAN
public static final Locale TRADITIONAL_CHINESE
public static final Locale UK
public static final Locale US
使⽤⽅法:下⾯的Locale对象是对应 “中国(⼤陆)”的
Locale locale = Locale.SIMPLIFIED_CHINESE
(3)通过Locale的构造函数创建Locale对象
Locale的构造函数共有3个。如下:
Locale(String language)
Locale(String language, String country)
Locale(String language, String country, String variant)
使⽤⽅法:
Locale local = new Locale("zh", "CN");
Locale类⽀持⾮常多的国家和地区。我们可以通过以下⽅法,查看Locale⽀持的全部区域:
Locale[] ls = AvailableLocales();
for (Locale locale:ls) {
System.out.println("locale :"+locale);
}
输⼊结果如下:
All Locales: ja_JP, es_PE, en, ja_JP_JP, es_PA, sr_BA, mk, es_GT, ar_AE, no_NO, sq_AL, bg, ar_IQ, ar_YE, hu, pt_PT, el_CY, ar_QA, mk_MK, sv, de_CH, en_US, fi_FI, is, cs, en_MT, sl_SI, sk_SK, it, tr_TR, zh, th, ar_SA, no, en_GB, sr_CS, lt, ro, en_NZ
下⾯选择其中的两个进⾏说明,如何利⽤它们来创建Locale对象:
例如,第⼀个输出是“ja_JP”。
其中,ja代表“语⾔”,这⾥指⽇语;“JP”代表国家,这⾥指⽇本。
我们可以通过如下⽅法,创建“语⾔是⽇语,国家是⽇本的Locale对象”。
Locale locale = new Locale("ja", "JP");
例如,第三个输出是“en”。
其中,en代表“语⾔”,这⾥指英语。
我们可以通过如下⽅法,创建“语⾔是英⽂的Locale对象”。
Locale locale = new Locale("en");
Locale 函数列表
// Locale的构造函数
Locale(String language)
Locale(String language, String country)
Locale(String language, String country, String variant)
Object            clone()
boolean          equals(Object object)
static Locale[]      getAvailableLocales()
String            getCountry()
static Locale        getDefault()
String            getDisplayCountry(Locale locale)
final String        getDisplayCountry()
final String        getDisplayLanguage()
String            getDisplayLanguage(Locale locale)
String            getDisplayName(Locale locale)
final String        getDisplayName()
final String        getDisplayVariant()
String            getDisplayVariant(Locale locale)
String            getISO3Country()
String            getISO3Language()
static String[]      getISOCountries()
static String[]      getISOLanguages()
String            getLanguage()
String            getVariant()
synchronized int      hashCode()
synchronized static void  setDefault(Locale locale)
final String        toString()
2. Locale⽰例
下⾯通过⽰例演⽰在Date中使⽤Locale的。
参考代码如下(LocaleTest.java):
import java.util.Locale;
import java.util.Date;
import java.util.Calendar;
SimpleDateFormat;
DateFormat;
/**
* Locale 的测试程序
*/
public class LocaleTest {
public static void main(String[] args) {
// 2种不同的Locale的创建⽅法
testDiffDateLocales();
// 显⽰所有的Locales
testAllLocales();
}
/**
* 2种不同的Locale的创建⽅法
*/
private static void testDiffDateLocales() {
// date为2013-09-19 14:22:30
Date date = new Date(113, 8, 19, 14, 22, 30);
// 创建“简体中⽂”的Locale
Locale localeCN = Locale.SIMPLIFIED_CHINESE;
// 创建“英⽂/美国”的Locale
Locale localeUS = new Locale("en", "US");
java环境变量自动配置// 获取“简体中⽂”对应的date字符串
String cn = DateInstance(DateFormat.MEDIUM, localeCN).format(date);
// 获取“英⽂/美国”对应的date字符串
String us = DateInstance(DateFormat.MEDIUM, localeUS).format(date);
System.out.printf("cn=%s\nus=%s\n", cn, us);
}
/**
* 显⽰所有的Locales
*/
private static void testAllLocales() {
Locale[] ls = AvailableLocales();
System.out.print("All Locales: ");
for (Locale locale:ls) {
System.out.printf(locale+", ");
}
System.out.println();
}
}
3.使⽤ResouceBundle读取国际化资源⽂件
ResourceBundle资源包包含特定语⾔环境的对象。使⽤其可以加载并读取语⾔环境资源。
1.轻松的本地化或者翻译成不同的语⾔
2.⼀次处理多个语⾔环境
3.以后可以轻松的进⾏修改,⼀遍⽀持更多的语⾔环境。
当程序需要特定于语⾔环境的对象时,它使⽤getBundle()⽅法加载ResourceBundle类
ResourceBundle rb = Bundle(“res.MessageBundle”, currentLocale);
其中,res.MessageBundle代表的是我们在src下建⽴了⼀个res⽂件夹,⽽res⽂件夹下有⼀个名为MessageBundle.properteis的资源⽂件。我们允许在此建⽴多个国际化资源⽂件:MessageBundle_zh_CN.properties;MessageBundle_en_US.properteis;
其中MessageBundle就是要在构造ResourceBundle时使⽤的字符串,这个名字合法即可,不需要特定约束。后边的名字⼀定要遵循规则,
resourceName_language_country.properteis;
然后我们使⽤rb.getString(key);就可以获取资源⽂件中的Key对应的value.
使⽤Struts1.x实现国际化⾃动切换
查看Struts源码就可以发现,语⾔环境信息就存放在session中,通过this.setLocale(request, locale);
所以要实现国际化就要在页⾯上点击超链接经过Action的时候改变会话中Locale(语⾔环境)的值。在Action中:
//接受客户端传过来的语⾔请求信息
String language = Parameter(“myLanguage”);
//定义语⾔地区信息
Locale currentLocale = null;
//根据不同的请求创建不同的语⾔环境信息
if (“zh”.equals(language)) {
currentLocale = new Locale(“zh”, “CN”);
} else if (“en”.equals(language)) {
currentLocale = new Locale(“en”, “US”);
}
//……
//将session中的信息更改掉
this.setLocale(request, currentLocale);
//当然,在页⾯显⽰资源⽂件信息的时候采⽤如下这种⽅式:
//<bean:message key=”key” />

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。