jfinal 国际化

凯子张 发布于 2014/12/25 13:24
阅读 1K+
收藏 1

@JFinal 你好,想跟你请教个问题:    

    如何实习国际化?能否具体一点?对应i18n理解的不到位。

    麻烦您了!

   
    


加载中
1
JFinal
JFinal

   由于i18n的需求不太强烈,jfinal 的 i18n 设计很长时间没有变化了。最初的设计的用法主要步骤是:

1:在 YourJFinalConfig 中调用一下 I18N.init(...)初始化国际化用到的资源文件

2:在拦截器使用 I18N.me().getText(String key, Locale locale) 获取资源文件中 key 所对应的 value 值,Local 信息从 cookie 中获取,这个 locale 值是事先根据用户地域或者用户指定时存放好的,如果没有存放这个值就使用默认 locale。得到 key和locale 所对应的 value 以后,再通过 ai.getController().setAttr(key, value) 传到页面中使用

3:如果是 freemarker模板可以通过 FreeMarkerRender.getConfiguration().setSharedVariable("i18n", I18N.me()) 将 i18n 这个对象设置为共享变量,然后在页面中直接这样用: ${i18n.getText("key")}

   以上就是最初设计的用法。但是通常国际化的网站基本上整站的文本都是国际化的,而非国际化的地方极少,所以我自己公司的实践中,我们是为每一个国家的版本定制一套 html 视图,并将这些视图放在WebRoot 下的 china、english这样的目录之下,然后再添加一个全局拦截器统一切换 render 的路径,大致代码如下:

public class I18NInterceptor implements Interceptor {
 public void intercept(ActionInvocation ai) {
  ai.invoke(); // 必须先调用 action
  Render render = ai.getController().getRender();
  String locale = getLocalFromCookie(ai);
  if("china".equals(locale))
    render.setView("/china/" + render.getView());
  else if("english".equals(locale))
    render.setView("/english/" + render.getView());
  ....
 }
}
   以上方法极度简单,基本上与 I18N 这个类无关,国际化全在html文件中搞定
绝望的八皮
绝望的八皮
回复 @凯子张 : 补充一下.如果是做这样的国际化,可以参考 https://github.com/b1412/jfinal-ext/blob/master/doc/doc.org#i18ninterceptor-%E5%9B%BD%E9%99%85%E5%8C%96%E6%8B%A6%E6%88%AA%E5%99%A8 在实际项目中我们是这样用的
凯子张
凯子张
谢谢,谢谢
0
littleant
littleant
你可以参考下JfinalUIB中的实现 
凯子张
凯子张
为何登录不上去了?
返回顶部
顶部