听说JFinal更新到2.2后,功能更强大了,所以马上拿来试试。之前一直对国际化挺好奇的,但是项目中缺很少机会用到,所以就打算试试。结果遇到了以下问题:
在 的指导下,自己重新实现了一个I81n的拦截器:
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文件来实现变更页面的语言,但是原来的实现存在以下问题:
if (isSwitchView) { switchView(locale, c);}else { Res res = I18n.use(getBaseName(), locale); c.setAttr(getResName(), res);}inv.invoke();
由于没有执行inv.invoke(),Controller中的render的值仍然为空,所以执行switchView时没有效果;
我的实现,有一个好处就是,如果有些值需要在执行完action之后格式化输出,那就在inv.invoke( )后获取相应的值,然后进行格式化后再配置到Controller的Attrs中,这样在Controller中的action中,代码就更加简洁了。
希望对大家有所帮助~