JAVA實現程式多語言(程式國際化)
程式多語言實際就是在不同的地區根據主機不同的設定去匹配與之對應的語言環境。
要實現多語言環境首先可以通過Locale類建立一個本地語言環境物件,如下有三種方式:
Locale locale = new Locale("zh", "CN");
Locale locale1 = Locale.US;
Locale locale2 = Locale.getDefault();
第一個是通過指定語言和地區指定;
第二個是通過語言程式碼構造語言環境
第三個是獲取此JAVA虛擬機器例項的當前預設語言環境
然後就是語言的自定義了
實際上這裡就是通過讀取不同的配置檔案獲取不同的語言對應的字元,因此這裡就用到了ResourceBundle工具類繫結資原始檔。
資原始檔的命名包含了語言環境的程式碼,我建立了下面兩個中文和英文的語言檔案:
IDEA直接識別不同語言環境的檔案並將他們放在一起(因為它們的基本名稱相同)
這裡的資原始檔是通過鍵值對的方式儲存的,如下info_zh_CN.properties:
username=\u7528\u6237\u540d
passwd=\u5BC6\u7801
input=\u8BF7\u8F93\u5165
info.success=\u6B22\u8FCE\uff0c{0}
info.error=\u767B\u5f55
這裡定義的是漢語的資原始檔,通過key=value的方式儲存值,直接通過key去獲取就可以了,其中info.success=\u6B22\u8FCE\uff0c{0}這一行的最後一個{0}代表的是萬用字元,用於後續動態文字處理在下面會用得到。
在通過ResourceBundle工具類繫結資原始檔名如下:
ResourceBundle res = ResourceBundle.getBundle("MultiLanguage.info", locale1);
通過第一個引數指定資原始檔,資原始檔是包名.檔案基本名(基本名不包括語言部分(_en_US)和資源字尾部分(.properties)),然後通過第二個引數指定當前的語言環境,然後就可以根據不同的語言環境尋找不同的資原始檔,從中讀取不同的語言字元,從屬性檔案中通過key獲取value值如下:
String input = res.getString("input");
直接通過之前new的ResourceBundle類的getString方法通過在引數中傳入key的值就可返回要取到的value的值。其中之前說到的動態文字處理使用到java.text.MessageFormat類,用來處理動態文字,這裡簡單使用如下:
String success = MessageFormat.format(infoSuccess, userName);
其中format是MessgeFormat的一個靜態方法,該方法的第一個引數就是要進行動態處理的字串,infoSuccess就是之前獲取到的包含萬用字元{0}的一個字串,後續的引數個數可變,分別對應前面字串中的萬用字元,這樣修改之後就可以達到動態處理文字了。
下面例子是一個模擬使用者登陸的例子,可以通過分別指定不同的locale進而顯示不同的語言,下面分別是各個檔案的原始碼,如下:
LocaleDemo.java
package MultiLanguage;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Scanner;
/**
* Created by zhuxinquan on 16-5-30.
* MultiLanguage
*/
public class LocaleDemo {
public static void main(String[] args) {
//建立一個本地語言環境物件(中文)
Locale locale = new Locale("zh", "CN");
Locale locale1 = Locale.US;
Locale locale2 = Locale.getDefault();
//通過ResourceBundle工具類繫結資原始檔(包名.檔名(基本名稱不包括語言部分和字尾部分))
ResourceBundle res = ResourceBundle.getBundle("MultiLanguage.info", locale);
//模擬使用者登陸
Scanner in = new Scanner(System.in);
//從屬性檔案中根據key獲取value值
String input = res.getString("input");
String username = res.getString("username");
String passwd = res.getString("passwd");
String infoSuccess = res.getString("info.success");
String infoError = res.getString("info.error");
System.out.println(input + username);
String userName = in.next();
System.out.println(input + passwd) ;
String password = in.next();
if("admin".equals(userName) && "123".equals(password)){
//處理動態文字(模式, 要替換的值……)
String success = MessageFormat.format(infoSuccess, userName);
System.out.println(success);
}else {
System.out.println(infoError);
}
}
}
info_zh_CN.properties
username=\u7528\u6237\u540d
passwd=\u5BC6\u7801
input=\u8BF7\u8F93\u5165
info.success=\u6B22\u8FCE\uff0c{0}
info.error=\u767B\u5f55
在上面的檔案當中實際分別為中文的unicode編碼。
info_en_US.properties
username=username
passwd=passwd
input=input
info.success=welcome,{0}
info.error=error
當語言環境使用locale時執行如下:
當語言環境使用locale1時執行如下: