java國際化
資源包
格式:<包名>_<語言代碼>_<國家/地區代碼>屬性文件
<包名>_<語言代碼>
純文本文件,保存字符串的鍵-值對信息,每行一條,
使用ResourceBundle加載獲取資源,這是一個抽象類,
提供了綁定資源的靜態方法。
資源綁定類
繼承抽象類ListResourceBundle
public class Text_ja_JP extends ListResourceBundle{
String[][] str = new String[][]{
{"name","小明"}
};
@Override
//重寫getContents方法返回一個二維數組
protected Object[][] getContents() {
return str;
}
}
查找規則
查找包含語言和地區的資源包,如果沒有找到就找包含語言的資源包,
再沒有找到就直接用默認資源包,如果默認資源包不存在就報錯,
默認是在類路徑下查找,如果包含在包裏,指定資源包名時要加包名。
消息格式化
使用MessageFormate進行消息格式化,指定一個消息模式,"{0}~{9}"進行標識作爲佔位符,佔位符出現的順序,和次數不限制,
public class TextI18N {
public static void main(String[] args) {
Locale defaultlocale = Locale.getDefault();
ResourceBundle bundle = ResourceBundle.getBundle("Text");
String format = bundle.getString("format");
//format="{0} is a {1}";
MessageFormat mf = new MessageFormat(format,defaultlocale);
Object[] obj = {"xiaoming","student"};
String str = mf.format(obj);
System.out.println(str);
//xiaoming is a student
}
}
佔位符樣式{index,type,style},
Struts2國際化
資源文件的加載
這裏和Java國際化不同的是sturts2會自動尋找國際化資源文件
Action範圍的資源文件,資源文件名是Action類名,當然資源包和類是在同一路徑下的。
這裏也是先查找 _語言_地區 後 _語言 最後 直接加載沒有地區和語言的資源包
然後是包範圍的,注意包範圍的資源文件,
資源包名就是package,是在包的根路徑下,就是包的.class文件路徑
沒有再是使用默認設置的資源包。
在紅色地方是sturts2配置的一些默認的常量,可以找到配置國際化資源的全局常量,
<constant name="struts.custom.i18n.resources" value=""></constant>
jsp中訪問國際化資源文件
<s:i18n/>標籤
用於指定是哪個資源文件
<s:text/>標籤
可以單獨使用,用param標籤指定資源文件中的佔位符,這裏單獨使用
訪問的資源文件和是否是直接訪問的jsp頁面還是通過action跳轉的有關
注意標籤裏面的value屬性會進行ognl解析,要傳String要用''括起來
<s:textfield key=""/>
這裏的key訪問的資源文件和是否是直接訪問的jsp頁面還是通過action跳轉的有關,
label屬性是將標籤寫死的,但可以進行強制Ognl解析,進行國際化
通過action跳轉到jsp頁面的<s:text/>標籤訪問的資源文件和Action一樣,
單獨訪問jsp頁面的<s:text>標籤訪問的是全局的資源文件
jsp中消息格式化
使用<s:param/>標籤傳入參數替換佔位符
Action中訪問國際化資源文件
使用getText()函數讀取,可以接參數
Action中消息格式化
getText()方法可以傳入一個數組類型的參數替換佔位符
在國際化資源文件中訪問本地化消息
age = 20
name = xiaoming
msg = ${getText("name")} is ${getText("age")} and ${msg}
後面的${msg}是從值棧中去值進行匹配
設置默認的資源文件包
配置常量struts.custom.i18n.resources