JFinal 国际化

要支持国际化,需要在容器初始化的时候配置一个处理国际化的全局拦截器。比如可以使用 com.jfinal.i18n.I18nInterceptor

配置拦截器:

public class MppConfig extends JFinalConfig {
    /**
     * 配置全局拦截器    GlobalInterceptor
     */
    public void configInterceptor(Interceptors me) {
          me.add(new I18nInterceptor());
    }
}

action 请求被拦截,进入 intercept 处理:

public class I18nInterceptor implements Interceptor {

    private String localeParaName = "_locale";
    private String resName = "_res";
    private boolean isSwitchView = false;

    public I18nInterceptor() {
    }

    public I18nInterceptor(String localeParaName, String resName) {
        if (StrKit.isBlank(localeParaName))
            throw new IllegalArgumentException("localeParaName can not be blank.");
        if (StrKit.isBlank(resName))
            throw new IllegalArgumentException("resName can not be blank.");

        this.localeParaName = localeParaName;
        this.resName = resName;
    }

    public I18nInterceptor(String localeParaName, String resName, boolean isSwitchView) {
        this(localeParaName, resName);
        this.isSwitchView = isSwitchView;
    }

    // ...

    /**
     * Return the baseName, which is used as base name of the i18n resource file.
     */
    protected String getBaseName() {
        return I18n.defaultBaseName;
    }

    /**
     * 1: use the locale from request para if exists. change the locale write to the cookie
     * 2: use the locale from cookie para if exists.
     * 3: use the default locale
     * 4: use setAttr(resName, resObject) pass Res object to the view.
     */
    public void intercept(Invocation inv) {
        Controller c = inv.getController();
        String localeParaName = getLocaleParaName();
        String locale = c.getPara(localeParaName);

        if (StrKit.notBlank(locale)) {    // change locale, write cookie
            c.setCookie(localeParaName, locale, Const.DEFAULT_I18N_MAX_AGE_OF_COOKIE);
        }
        else {                            // get locale from cookie and use the default locale if it is null
            locale = c.getCookie(localeParaName);
            if (StrKit.isBlank(locale))
                locale = I18n.defaultLocale;
        }

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

        inv.invoke();
    }

    /**
     * 在有些 web 系统中,页面需要国际化的文本过多,并且 css 以及 html 也因为际化而大不相同,
     * 对于这种应用场景先直接制做多套同名称的国际化视图,并将这些视图以 locale 为子目录分类存放,
     * 最后使用本拦截器根据 locale 动态切换视图,而不必对视图中的文本逐个进行国际化切换,省时省力。
     */
    public void switchView(String locale, Controller c) {
        Render render = c.getRender();
        if (render != null) {
            String view = render.getView();
            if (view != null) {
                if (view.startsWith("/"))
                    view = "/" + locale + view;
                else
                    view = locale + "/" + view;

                render.setView(view);
            }
        }
    }
}

国际化资源文件

i18n_zh_CN.properties

msg=\u4F60\u597D{0}, \u4ECA\u5929\u662F{1}

i18n_en_US.properties

msg=Hello {0}, today is{1}.

Freemarker 展现:

${_res.msg!}
时间: 2024-10-09 23:45:40

JFinal 国际化的相关文章

JFinal中使用JSP的自定义Tag解决I18N

1. 设计原由 由于JFinal的国际化(I18N)支持在JSP中支持不好,因此,萌生了解决这一短板的念头. 实现时也考虑了几种方式,最终决定采用JSP中最原始的标签.因为自定义标签在JSP中容易实现,内容灵活且功能比较强大,可扩展性好. 2. I18N标签 自定义的I18N标签需要针对I18N的各个接口做最好的支持,使用<jf:i18n />作为标签名,下面是JFinal中I18N类的几个接口: public static String getText(String key) public 

新书《Jfinal极速开发实战》正式发布

JfinalUIB学习交流QQ群 :309647612 书籍整个创作周期从2015年8月1日开始到2015年9月10日,时间仓促,难免有瑕疵,希望大家能够指出存在的问题,我会不断的更新纠正,谢谢大家! 前四章免费阅读,内容会持续定期更新,紧随Jfinal的发展,希望大家看看做出评价,谢谢!   百度阅读地址 :http://yuedu.baidu.com/ebook/3fc54b55d5bbfd0a7956739f 目录 Jfinal极速开发实战... 为什么要写这本书... 3 读者对象...

《Jfinal极速开发实战》正式发布

----------------------------------------------------------------------- 百度阅读地址 :http://yuedu.baidu.com/ebook/3fc54b55d5bbfd0a7956739f 定价55.55元,百度阅读抽取三成,剩下为作者所得,谢谢大家支持! 暂时没有出纸质版本是因为费用实在太高(3-5W),个人无法承受,望大家体谅. -------------------------------------------

layui模板和jfinal混合使用注意

<!-- 列表信息展示 --> <div class="layui-row"> <table class="layui-table" lay-data="{url:'/student/student/studentCurriculum?id=#(student.id)', page:true, id:'idTable', limit: 10}" lay-filter="mtable"> &l

iOS10权限声明国际化

1.xCode8权限 xCode8.0开始苹果对隐私权限的控制更加严格,并且在隐私权限对应的描述不能为空,否则提交时在活动里面并看不到你提交的二进制文件,并给开发者邮箱发送以下邮件 2.权限描述国际化 解决办法是在Info.plist中添加Privacy - Camera Usage Description和Privacy - Photo Library Usage Description. 如果直接写在Info.plist中,则不能多语言显示提示,想要多语言提示,可以选中Info.plist文

Django1.9开发博客(12)- i18n国际化

国际化与本地化的目的为了能为各个不同的用户以他们最熟悉的语言和格式来显示网页. Django能完美支持文本翻译.日期时间和数字的格式化.时区. 另外,Django还有两点优势: 允许开发者和模板作者指定他们哪些app应该被翻译或被格式化为本地形式. 允许用户根据自己的偏好来实现本地化显示.翻译依据语言,格式化依据国家, 这些信息由浏览器中的Accept-Language头来决定.不过目前为止时区还未能实现. 参考官方文档:https://docs.djangoproject.com/en/1.9

AngularJS 国际化——Angular-translate

对于一个用户群面向全球的的应用来说,不得不考虑国际化的问题.当然,即便是刚刚起步的小应用,如果有心搞大,也应该提前设计国际化的方案. 本篇讲述使用AngularJS构建的应用的简单国际化方案,准确的说,是国际化服务.... i18n与l10n i18n是Internationalization得缩写,取第一个字母和最后一个字母,以及中间省略的字母数目,即i18n,类似的l10n是Localization得意思. 通常i18n是国际化的意思,就是在不改变源码的情况下,通过某些简单的配置就能适应不同

实现了Zbus的JFinal插件,JFinal里用Zbus更方便了。

zbus https://git.oschina.net/rushmore/zbus 轻量级服务总线/消息队列 1)多种消息模式--支持生产者/消费者,发布订阅,RPC 2)丰富的API--C/C++/C#/JAVA/Python/Node.JS跨平台.多语言支持 3)开放协议标准--原生兼容HTTP协议(长连接),头部动态扩展 4)支持TrackServer与ZbusServer高可用横向动态扩容机制 jfinal https://git.oschina.net/jfinal/jfinal J

JFinal里得到表结构的方法总结

JFinal里得到表结构的方法总结: 1.得到已经配置的Model类的表结构.(推荐用法).如下,定义一个User的Model类,这样就可以得到Model类的表结构了.具体实现不明白,请高手指导. public void tableMappingTest(){  Table table = TableMapping.me().getTable(User.me.getClass());    renderText(table.getColumnTypeMap().toString());   }