本文目錄一覽:
java中如何實現多語言切換
一、國際化開發概述
軟件的國際化:軟件開發時,要使它能同時應對世界不同地區和國家的訪問,並針對不同地區和國家的訪問,提供相應的、符合來訪者閱讀習慣的頁面或數據。
國際化(internationalization)又稱為 i18n(讀法為i 18 n,據說是因為internationalization(國際化)這個單詞從i到n之間有18個英文字母,i18n的名字由此而來)
二、合格的國際化軟件
軟件實現國際化,需具備以下兩個特徵:
1、對於程序中固定使用的文本元素,例如菜單欄、導航條等中使用的文本元素、或錯誤提示信息,狀態信息等,需要根據來訪者的地區和國家,選擇不同語言的文本為之服務。
2、對於程序動態產生的數據,例如(日期,貨幣等),軟件應能根據當前所在的國家或地區的文化習慣進行顯示。
三、固定文本元素的國際化
對於軟件中的菜單欄、導航條、錯誤提示信息,狀態信息等這些固定不變的文本信息,可以把它們寫在一個properties文件中,並根據不同的國家編寫不同的properties文件。這一組properties文件稱之為一個資源包。
3.1、創建資源包和資源文件
一個資源包中的每個資源文件都必須擁有共同的基名。除了基名,每個資源文件的名稱中還必須有標識其本地信息的附加部分。例如:一個資源包的基名是「myproperties」,則與中文、英文環境相對應的資源文件名則為: “myproperties_zh.properties” “myproperties_en.properties”
每個資源包都應有一個默認資源文件,這個文件不帶有標識本地信息的附加部分。若ResourceBundle對象在資源包中找不到與用戶匹配的資源文件,它將選擇該資源包中與用戶最相近的資源文件,如果再找不到,則使用默認資源文件。例如:myproperties.properties
3.2、資源文件的書寫格式
資源文件的內容通常採用”關鍵字=值”的形式,軟件根據關鍵字檢索值顯示在頁面上。一個資源包中的所有資源文件的關鍵字必須相同,值則為相應國家的文字。
並且資源文件中採用的是properties格式文件,所以文件中的所有字符都必須是ASCII字碼,屬性(properties)文件是不能保存中文的,對於像中文這樣的非ACSII字符,須先進行編碼。
例如:
國際化的中文環境的properties文件
國際化的英文環境的properties文件
java提供了一個native2ascII工具用於將中文字符進行編碼處理,native2ascII的用法如下所示:
3.3、編程實現固定文本的國際化
在JavaAPI中提供了一個ResourceBundle 類用於描述一個資源包,並且 ResourceBundle類提供了相應的方法getBundle,這個方法可以根據來訪者的國家地區自動獲取與之對應的資源文件予以顯示。
ResourceBundle類提供了一個靜態方法getBundle,該方法用於裝載資源文件,並創建ResourceBundle實例:
Locale currentLocale = Locale.getDefault();
ResourceBundle myResources =ResourceBundle.getBundle(basename, currentLocale);
basename為資源包基名(且必須為完整路徑)。
如果與該locale對象匹配的資源包子類找不到。一般情況下,則選用默認資源文件予以顯示。
加載資源文件後, 程序就可以調用ResourceBundle 實例對象的 getString 方法獲取指定的資源信息名稱所對應的值。
String value = myResources.getString(「key”);
範例:根據國家地區自動獲取與之對應的資源文件
package me.gacl.i18n;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* @ClassName: I18NTest
* @Description: 編程實現固定文本的國際化
* @author: 孤傲蒼狼
* @date: 2014-8-29 下午9:34:05
*
*/
public class I18NTest {
public static void main(String[] args) {
//資源包基名(包名+myproperties)
String basename = “me.gacl.i18n.resource.myproperties”;
//設置語言環境
Locale cn = Locale.CHINA;//中文
Locale us = Locale.US;//英文
//根據基名和語言環境加載對應的語言資源文件
ResourceBundle myResourcesCN = ResourceBundle.getBundle(basename,cn);//加載myproperties_zh.properties
ResourceBundle myResourcesUS = ResourceBundle.getBundle(basename,us);//加載myproperties_en.properties
//加載資源文件後, 程序就可以調用ResourceBundle實例對象的 getString方法獲取指定的資源信息名稱所對應的值。
//String value = myResources.getString(「key”);
String usernameCN = myResourcesCN.getString(“username”);
String passwordCN = myResourcesCN.getString(“password”);
String usernameUS = myResourcesUS.getString(“username”);
String passwordUS = myResourcesUS.getString(“password”);
System.out.println(usernameCN+”–“+passwordCN);
System.out.println(usernameUS+”–“+passwordUS);
}
}
運行結果:
3.4、在WEB應用中實現固定文本的國際化
如下所示:
%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8″%
!DOCTYPE HTML
html
head
title國際化(i18n)測試/title
/head
%
//加載i18n資源文件,request.getLocale()獲取訪問用戶所在的國家地區
ResourceBundle myResourcesBundle = ResourceBundle.getBundle(“me.gacl.i18n.resource.myproperties”,request.getLocale());
%
body
form action=”” method=”post”
%=myResourcesBundle.getString(“username”)%:input type=”text” name=”username”/br/
%=myResourcesBundle.getString(“password”)%:input type=”password” name=”password”/br/
input type=”submit” value=”%=myResourcesBundle.getString(“submit”)%”
/form
/body
/html
運行結果:
瀏覽器語言是中文環境下的顯示效果:
瀏覽器語言是英文環境下的顯示效果:
同樣一個頁面,在不同語言環境的瀏覽器下顯示出了不同的語言文字效果,這樣就實現了固定文本的國際化。
IE瀏覽器切換使用語言:工具→Internet選項
四、動態數據的國際化
數值,貨幣,時間,日期等數據由於可能在程序運行時動態產生,所以無法像文字一樣簡單地將它們從應用程序中分離出來,而是需要特殊處理。Java 中提供了解決這些問題的 API 類(位於 java.util 包和 java.text 包中)
4.1、Locale 類
Locale 實例對象代表一個特定的地理,政治、文化區域。
一個 Locale 對象本身不會驗證它代表的語言和國家地區信息是否正確,只是向本地敏感的類提供國家地區信息,與國際化相關的格式化和解析任務由本地敏感的類去完成。(若JDK中的某個類在運行時需要根據 Locale 對象來調整其功能,這個類就稱為本地敏感類)
4.2、DateFormat類(日期格式化)
DateFormat 類可以將一個日期/時間對象格式化為表示某個國家地區的日期/時間字符串。
DateFormat 類除了可按國家地區格式化輸出日期外,它還定義了一些用於描述日期/時間的顯示模式的 int 型的常量,包括FULL, LONG, MEDIUM, DEFAULT, SHORT,實例化DateFormat對象時,可以使用這些常量,控制日期/時間的顯示長度。
4.2.1、實例化DateFormat類
實例化DateFormat類有九種方式,以下三種為帶參形式,下面列出的三種方式也可以分別不帶參,或只帶顯示樣式的參數。
getDateInstance(int style, Locale aLocale):以指定的日期顯示模式和本地信息來獲得DateFormat實例對象,該實例對象不處理時間值部分。
getTimeInstance(int style, Locale aLocale):以指定的時間顯示模式和本地信息來獲得DateFormat實例對象,該實例對象不處理日期值部分。
getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):以單獨指定的日期顯示模式、時間顯示模式和本地信息來獲得DateFormat實例對象。
4.2.2、DateFormat 對象的方法
format:將date對象格式化為符合某個本地環境習慣的字符串。
parse:將字符串解析為日期/時間對象
注意:parse和format完全相反,一個是把date時間轉化為相應地區和國家的顯示樣式,一個是把相應地區的時間日期轉化成date對象,該方法在使用時,解析的時間或日期要符合指定的國家、地區格式,否則會拋異常。
DateFormat 對象通常不是線程安全的,每個線程都應該創建自己的 DateFormat 實例對象
4.2.3、DateFormat使用範例
package me.gacl.i18n;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;
/**
* @ClassName: DateFormatTest
* @Description: DateFormat類測試
* DateFormat類可以將一個日期/時間對象格式化為表示某個國家地區的日期/時間字符串
* @author: 孤傲蒼狼
* @date: 2014-8-29 下午10:03:26
*
*/
public class DateFormatTest {
public static void main(String[] args) throws ParseException {
Date date = new Date(); // 當前這一刻的時間(日期、時間)
// 輸出日期部分
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,Locale.GERMAN);
String result = df.format(date);
System.out.println(result);
// 輸出時間部分
df = DateFormat.getTimeInstance(DateFormat.FULL, Locale.CHINA);
result = df.format(date);
System.out.println(result);
// 輸出日期和時間
df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG,Locale.CHINA);
result = df.format(date);
System.out.println(result);
// 把字符串反向解析成一個date對象
String s = “10-9-26 下午02時49分53秒”;
df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG,Locale.CHINA);
Date d = df.parse(s);
System.out.println(d);
}
}
4.3、NumberFormat類(數字格式化)
NumberFormat類可以將一個數值格式化為符合某個國家地區習慣的數值字符串,也可以將符合某個國家地區習慣的數值字符串解析為對應的數值
NumberFormat類的方法:
format 方法:將一個數值格式化為符合某個國家地區習慣的數值字符串
parse 方法:將符合某個國家地區習慣的數值字符串解析為對應的數值。
實例化NumberFormat類時,可以使用locale對象作為參數,也可以不使用,下面列出的是使用參數的。
getNumberInstance(Locale locale):以參數locale對象所標識的本地信息來獲得具有多種用途的NumberFormat實例對象
getIntegerInstance(Locale locale):以參數locale對象所標識的本地信息來獲得處理整數的NumberFormat實例對象
getCurrencyInstance(Locale locale):以參數locale對象所標識的本地信息來獲得處理貨幣的NumberFormat實例對象
getPercentInstance(Locale locale):以參數locale對象所標識的本地信息來獲得處理百分比數值的NumberFormat實例對象
範例:
package me.gacl.i18n;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
/**
* @ClassName: NumberFormatTest
* @Description: NumberFormat類測試
* @author: 孤傲蒼狼
* @date: 2014-8-29 下午10:25:29
*
*/
public class NumberFormatTest {
public static void main(String[] args) throws ParseException {
int price = 89;
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);
String result = nf.format(price);
System.out.println(result);
String s = “¥89.00”;
nf = NumberFormat.getCurrencyInstance(Locale.CHINA);
Number n = nf.parse(s);
System.out.println(n.doubleValue() + 1);
double num = 0.5;
nf = NumberFormat.getPercentInstance();
System.out.println(nf.format(num));
}
}
運行結果:
4.4、MessageFormat(文本格式化)
如果一個字符串中包含了多個與國際化相關的數據,可以使用MessageFormat類對這些數據進行批量處理。
例如:At 12:30 pm on jul 3,1998, a hurricance destroyed 99 houses and caused $1000000 of damage
以上字符串中包含了時間、數字、貨幣等多個與國際化相關的數據,對於這種字符串,可以使用MessageFormat類對其國際化相關的數據進行批量處理。
MessageFormat 類如何進行批量處理呢?
1.MessageFormat類允許開發人員用佔位符替換掉字符串中的敏感數據(即國際化相關的數據)。
2.MessageFormat類在格式化輸出包含佔位符的文本時,messageFormat類可以接收一個參數數組,以替換文本中的每一個佔位符。
4.4.1、模式字符串與佔位符
模式字符串:
At {0} on {1},a destroyed {2} houses and caused {3} of damage
字符串中的{0}、{1}、{2}、{3}就是佔位符
4.4.2、格式化模式字符串
1、實例化MessageFormat對象,並裝載相應的模式字符串。
2、使用format(object obj[])格式化輸出模式字符串,參數數組中指定佔位符相應的替換對象。
範例:
package me.gacl.i18n;
import java.text.MessageFormat;
import java.util.Date;
import java.util.Locale;
/**
* @ClassName: MessageFormatTest
* @Description: MessageFormat類測試
* @author: 孤傲蒼狼
* @date: 2014-8-29 下午10:29:19
*
*/
public class MessageFormatTest {
public static void main(String[] args) {
//模式字符串
String pattern = “On {0}, a hurricance destroyed {1} houses and caused {2} of damage.”;
//實例化MessageFormat對象,並裝載相應的模式字符串
MessageFormat format = new MessageFormat(pattern, Locale.CHINA);
Object arr[] = {new Date(), 99, 100000000};
//格式化模式字符串,參數數組中指定佔位符相應的替換對象
String result = format.format(arr);
System.out.println(result);
}
}
運行結果:
4.4.3、佔位符的三種書寫方式
{argumentIndex}: 0-9 之間的數字,表示要格式化對象數據在參數數組中的索引號
{argumentIndex,formatType}: 參數的格式化類型
{argumentIndex,formatType,FormatStyle}: 格式化的樣式,它的值必須是與格式化類型相匹配的合法模式、或表示合法模式的字符串。
範例:
package me.gacl.i18n;
import java.text.MessageFormat;
import java.util.Date;
import java.util.Locale;
/**
* @ClassName: MessageFormatTest
* @Description: MessageFormat類測試
*
*/
public class MessageFormatTest {
public static void main(String[] args) {
//模式字符串
String pattern = “At {0, time, short} on {0, date}, a destroyed {1} houses and caused {2, number, currency} of damage.”;
//實例化MessageFormat對象,並裝載相應的模式字符串
MessageFormat format = new MessageFormat(pattern, Locale.US);
Object arr[] = {new Date(), 99, 100000000};
//格式化模式字符串,參數數組中指定佔位符相應的替換對象
String result = format.format(arr);
System.out.println(result);
}
}
運行結果:
java 怎麼判斷當前時間 是否在 給定時間之間 用Calendar 行嗎
可以用Calendar類
Date now = new Date();
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
Calendar cal3 = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(“yyyyMMddHHmmss”);
String time1 = “20121225080000”;
String time2 = “20121227080000”;
cal1.setTime(now);
cal2.setTime(sdf.parse(time1));
cal3.setTime(sdf.parse(time2));
if(cal2.before(cal1) cal3.after(cal1)){
//在時間段內
}
java中 locale類 及相關方法
在項目中經常要用到將字符串解析成Locale,但是沒有一個比較好用的類。
java本身提供了3個構造函數
Locale(langugae)
locale(language,country)
Locale(String language, String country, String variant)
Apache 有個 LocaleUtils.toLocale(String language)但是不支持最後2個字符為小寫的,如:zh_CN支持, zh_cn就不支持。
[java] view plaincopyprint?
import java.util.Locale;
public class LocaleUtil
{
private final static Locale DEFAULT_LOCALE = Locale.ENGLISH;
public final static String IETF_SEPARATOR = “-“;
public final static String SEPARATOR = “_”;
public final static String EMPTY_STRING = “”;
public static Locale toLocale( String language )
{
if( !StringUtil.isNullOrEmpty( language ) )
{
return langToLocale( language, SEPARATOR );
}
return DEFAULT_LOCALE;
}
public static Locale langToLocale( String lang , String separator )
{
if( StringUtil.isNullOrEmpty( lang ) )
{
return DEFAULT_LOCALE;
}
String language = EMPTY_STRING;
String country = EMPTY_STRING;
String variant = EMPTY_STRING;
int i1 = lang.indexOf( separator );
if ( i1 0 )
{
language = lang;
} else
{
language = lang.substring(0, i1);
++i1;
int i2 = lang.indexOf( separator, i1);
if (i2 0)
{
country = lang.substring(i1);
} else
{
country = lang.substring(i1, i2);
variant = lang.substring(i2+1);
}
}
if(language.length() == 2)
{
language = language.toLowerCase();
}else
{
language = EMPTY_STRING;
}
if(country.length() == 2)
{
country = country.toUpperCase();
}else
{
country = EMPTY_STRING;
}
if( (variant.length() 0)
((language.length() == 2) ||(country.length() == 2)) )
{
variant = variant.toUpperCase();
}else
{
variant = EMPTY_STRING;
}
return new Locale(language, country, variant );
}
}
import java.util.Locale;
public class LocaleUtil
{
private final static Locale DEFAULT_LOCALE = Locale.ENGLISH;
public final static String IETF_SEPARATOR = “-“;
public final static String SEPARATOR = “_”;
public final static String EMPTY_STRING = “”;
public static Locale toLocale( String language )
{
if( !StringUtil.isNullOrEmpty( language ) )
{
return langToLocale( language, SEPARATOR );
}
return DEFAULT_LOCALE;
}
public static Locale langToLocale( String lang , String separator )
{
if( StringUtil.isNullOrEmpty( lang ) )
{
return DEFAULT_LOCALE;
}
String language = EMPTY_STRING;
String country = EMPTY_STRING;
String variant = EMPTY_STRING;
int i1 = lang.indexOf( separator );
if ( i1 0 )
{
language = lang;
} else
{
language = lang.substring(0, i1);
++i1;
int i2 = lang.indexOf( separator, i1);
if (i2 0)
{
country = lang.substring(i1);
} else
{
country = lang.substring(i1, i2);
variant = lang.substring(i2+1);
}
}
if(language.length() == 2)
{
language = language.toLowerCase();
}else
{
language = EMPTY_STRING;
}
if(country.length() == 2)
{
country = country.toUpperCase();
}else
{
country = EMPTY_STRING;
}
if( (variant.length() 0)
((language.length() == 2) ||(country.length() == 2)) )
{
variant = variant.toUpperCase();
}else
{
variant = EMPTY_STRING;
}
return new Locale(language, country, variant );
}
}
注意:
public class StringUtil
{
public static boolean isNullOrEmpty(String target) {
return target == null || “”.equals(target);
}
}
java locale
java locale是什麼,讓我們一起了解一下?
locale命令是將有關當前語言環境或全部公共語言環境的信息寫到標準輸出上,如果使用了語言環境類別名而沒有使用標誌來指定locale命令,那麼 locale命令會寫出由Name參數指定的語言環境類別中的所有關鍵字的值。
Java為什麼要設定locale?
雖然設定locale與你能否瀏覽中文的網頁沒有直接的關係,即便你把locale設置成en_US.ISO-8859-1這樣一個標準的英文locale你照樣可以瀏覽中文的網頁,只要你的系統裏面有相應的字符集(這個都不一定需要)和合適的字體(如simsun),瀏覽器就可以把網頁翻譯成中文給你看。具體的過程是網絡把網頁傳送到你的機器上之後,瀏覽器會判斷相應的編碼的字符集,根據網頁採用的字符集,去字體庫裏面找合適的字體,然後由文字渲染工具把相應的文字在屏幕上顯示出來。
但是為了讓你的Linux能夠輸入中文,就需要把系統的locale設定成中文的(嚴格說來是locale中的語言類別LC_CTYPE ),例如zh_CN.GB2312、zh_CN.GB18030或者zh_CN.UTF-8。很多人都不明白這些古里古怪的表達方式。但是只需要知道,這是locale的表達方式就可以了。
實戰操作:
下面通過示例演示在Date中使用Locale的,參考代碼如下(LocaleTest.java): import java.util.Locale; import java.util.Date; import java.util.Calendar; import java.text.SimpleDateFormat; import java.text.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”); // 獲取「簡體中文」對應的date字符串 String cn = DateFormat.getDateInstance(DateFormat.MEDIUM, localeCN).format(date); // 獲取「英文/美國」對應的date字符串 String us = DateFormat.getDateInstance(DateFormat.MEDIUM, localeUS).format(date); System.out.printf(“cn=%s\nus=%s\n”, cn, us); } /** * 顯示所有的Locales */ private static void testAllLocales() { Locale[] ls = Locale.getAvailableLocales(); System.out.print(“All Locales: “); for (Locale locale:ls) { System.out.printf(locale+”, “); } System.out.println(); } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/160516.html