JFinal 2.2 國際化功能的應用

據說JFinal更新到2.2後,功能更強大了,因此立刻拿來試試。以前一直對國際化挺好奇的,可是項目中缺不多機會用到,因此就打算試試。結果遇到了如下問題:關於JFinal2.2中I18nInterceptor的問題html

@JFinal 的指導下,本身從新實現了一個I81n的攔截器:java

public class MyI18nInterceptor extends I18nInterceptor{

	private static String defaultLocale = Locale.getDefault().getLanguage() + "_" + Locale.getDefault().getCountry();
	
	public void intercept(Invocation inv) {
		Controller c = inv.getController();
		String localeParaName = getLocaleParaName();
		String locale = c.getPara(localeParaName);
		
		if (StrKit.notBlank(locale)) {
			c.setCookie(localeParaName, locale, Const.DEFAULT_I18N_MAX_AGE_OF_COOKIE);
		}
		else {
			locale = c.getCookie(localeParaName);
			if (StrKit.isBlank(locale))
				locale = defaultLocale;
		}
		Res res = I18n.use(getBaseName(), locale);
		c.setAttr(getResName(), res);
		
		inv.invoke();//執行相應的action
		
		SearchService page = c.getAttr("resultPage");
		if(null != page)
		{
			String paginate = res.format("Pageinate",page.getPageNumber(),page.getTotalPage());
			c.setAttr("pageMsg",paginate);
		}
	}
}

這裏跟原來提供的區別就是,個人實現仍是經過選擇properties文件來變動頁面的語言,而原來是經過改變資源文件的路徑,即變動html文件來實現變動頁面的語言,可是原來的實現存在如下問題:spa

if (isSwitchView) {
	switchView(locale, c);
}
else {
	Res res = I18n.use(getBaseName(), locale);
	c.setAttr(getResName(), res);
}

inv.invoke();

因爲沒有執行inv.invoke(),Controller中的render的值仍然爲空,因此執行switchView時沒有效果;.net

個人實現,有一個好處就是,若是有些值須要在執行完action以後格式化輸出,那就在inv.invoke( )後獲取相應的值,而後進行格式化後再配置到Controller的Attrs中,這樣在Controller中的action中,代碼就更加簡潔了。code

但願對你們有所幫助~orm

相關文章
相關標籤/搜索