我目前正在設計一個應用程序,需要在許多不同的語言中使用,經過大量的研究後,我才恢復使用resouceBundles。我用jsf 1.2和glassfish 3.1使用java se 1.6和java ee 6 ..如何重新加載JSF ResourceBundle?
我從互聯網上得到了下面的代碼,並以一種合理的方式安排它。現在問題是,ResourceBundle加載好吧,但它沒有得到刷新..我嘗試了很多不同的ResourceBundle.clearCache()方法,但沒有一個似乎在工作...
請注意在Control類中,我正在檢查語言環境並加載數據以適應這一點。這將在稍後由數據庫支持的系統取代。這僅僅是測試代碼,以確保我有底層結構的工作...
CODE_SAMPLE:LocalTest.java - 資源包
public class LocalTester extends ResourceBundle {
protected static final String BUNDLE_NAME = "local.lantest.LocalTester";
protected static final Control UTF8_CONTROL = new LocalTesterControl();
public LocalTester() {
setParent(ResourceBundle.getBundle(BUNDLE_NAME, FacesContext.getCurrentInstance().getViewRoot().getLocale(), UTF8_CONTROL));
}
@Override
protected Object handleGetObject(String key) {
return parent.getObject(key);
}
@Override
public Enumeration<String> getKeys() {
return parent.getKeys();
}
public static Control getUTF8_CONTROL() {
return UTF8_CONTROL;
}
}
CODE_SAMPLE:LocalTestControl.java - 資源包控制
public class LocalTesterControl extends Control {
@Override
public boolean needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime) {
return true;
}
@Override
public long getTimeToLive(String baseName, Locale locale) {
return TTL_DONT_CACHE;
}
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
System.out.println("---------------------------LOADING LOCALE PACK-------------------------------------");
System.out.println("Printing baseName = " + baseName);
System.out.println("Printing locale.getLanguage() = " + locale.getLanguage());
System.out.println("Printing locale.getDisplayLanguage() = " + locale.getDisplayLanguage());
ResourceBundle rbdl;
if (locale.getLanguage().compareTo("fr") == 0) {
System.out.println("------- LOAD FRENCH language pack load");
rbdl = new ListResourceBundle() {
@Override
protected Object[][] getContents() {
Object[][] aa = {
{"welcome", "FR- Welcome" + (new Date().toString())},
{"message", "FR- message"},
{"signoff", "FR- Sign Off"},
{"parametWelcome", "FR-Para Meter Welcome... {0} is parameter..."},
{"numberParaFormat", "FR-NUMBER parameter = {0}...."}
};
return aa;
}
};
} else if (locale.getLanguage().compareTo("es") == 0) {
System.out.println("------- LOAD ESPANIOLA language pack load");
rbdl = new ListResourceBundle() {
@Override
protected Object[][] getContents() {
Object[][] aa = {
{"welcome", "ES- Welcome" + (new Date().toString())},
{"message", "ES- message"},
{"signoff", "ES- Sign Off"},
{"parametWelcome", "ES-Para Meter Welcome... {0} is parameter..."},
{"numberParaFormat", "ES-NUMBER parameter = {0}...."}
};
return aa;
}
};
} else {
System.out.println("------- LOAD DEFAULT language pack load");
rbdl = new ListResourceBundle() {
@Override
protected Object[][] getContents() {
Object[][] aa = {
{"welcome", "EN- Welcome" + (new Date().toString())},
{"message", "EN- message"},
{"signoff", "EN- Sign Off"},
{"parametWelcome", "EN-Para Meter Welcome... {0} is parameter..."},
{"numberParaFormat", "EN-NUMBER parameter = {0}...."},
{"notrans", "EN- No Language Translation"}
};
return aa;
}
};
}
return rbdl;
}
}
最後的面孔配置:
<faces-config version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<application>
<resource-bundle>
<base-name>local.lantest.LocalTester</base-name>
<var>bundi</var>
</resource-bundle>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>en</supported-locale>
<supported-locale>es</supported-locale>
<supported-locale>fr</supported-locale>
</locale-config>
</application>
</faces-config>
任何HEL p和建議是非常重要的。
可能重複[如何重新加載Web應用程序資源包?( http://stackoverflow.com/questions/4325164/how-to-reload-resource-bundle-in-web-application) – BalusC 2011-12-16 10:11:10