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); } } } }
根据地区不同得到 local 是不同的(比如中国大陆是 zh_CN,香港是 zh_HK,美国是 en-US),而 getBaseName() 是不变的即 i18n,将 local 和 baseName 进行拼接就能得到资源文件的名字,并对 Res 进行实例化。
controller.setAttr("_res" , res);
国际化资源文件
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!}
JFinal 国际化的更多相关文章
- layui模板和jfinal混合使用注意
<!-- 列表信息展示 --> <div class="layui-row"> <table class="layui-table" ...
- JFinal笔记
目录 JFinalConfig 1. configConstant() 2. configRoute() 3. configEngine 4. configPlugin 5. configInterc ...
- Hello Web API系列教程——Web API与国际化
软件国际化是在软件设计和文档开发过程中,使得功能和代码设计能处理多种语言和文化习俗,在创建不同语言版本时,不需要重新设计源程序代码的软件工程方法.这在很多成熟的软件开发平台中非常常见.对于.net开发 ...
- JS魔法堂:不完全国际化&本地化手册 之 理論篇
前言 最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...
- Struts2入门(六)——国际化
一.前言 1.1.国际化简介 国际化是指应用程序在运行的时候,根据客户端请求来自的国家地区.语言的不同而显示不同的界面(简单说就是根据你的地区显示相关地区的语言,如果你现在在英国,那么显示的语言就是英 ...
- JavaWeb的国际化
国际化 1.国际化开发概述 1.1.软件的国际化 软件开发时,要使它能同时应对世界不同地区和国家的方法,并针对不同地区和国家的方法,提供相应的,符合来访者阅读习惯的页面或数据 国际化简称:i18n : ...
- struts2国际化
struts2国际化 1:什么是国际化? 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素 ...
- 学习SpringMVC——国际化+上传+下载
每个星期一道菜,这个星期也不例外~~~ 一个软件,一个产品,都是一点点开发并完善起来的,功能越来越多,性能越来越强,用户体验越来越好……这每个指标的提高都需要切切实实的做点东西出来,好比,你的这个产品 ...
- JS魔法堂:不完全国际化&本地化手册 之 实战篇
前言 最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...
随机推荐
- C/C++ 结构体 数组 简单输入输出
#include <stdio.h> #include <stdlib.h> struct student{ int num; ]; double dec; }; int ma ...
- 编辑word文档过程中输入法无法正常使用
编辑word文档过程中输入法无法正常使用怎么办??有的朋友在使用Word 2010过程中,遇到了这样的问题.每次打开word文档,程序就自动变成英文输入法,中文输入法就退出了,特别是搜狗输入法.即使在 ...
- [tmp] hu60@所有人插件
<div style="padding:3px;text-align:right;"> <a style="background:green;color ...
- mysql 增删改查最基本用法小结
目录: 1.新建数据库 2.新建数据表 3.查看表结构 4.增删改查 建立一个数据库students 建立一块数据表class1 内容包括: id 主键 自动编号 无符号位 SMALLINT类型 na ...
- Matlab基本函数-conj函数
Matlab基本函数-conj函数 1.conj函数:用于计算复数的共轭值 2.用法说明:y=conj(x)函数计算复数x的共轭值.输出结果y的维数跟输入x的维数一致,返回值为:real(y)-i*i ...
- Entity Framework7 有哪些不同?之具体功能
Entity Framework7 有哪些不同?之具体功能 前面我们介绍了关于EF7的新特性.开发计划和入门介绍.今天,我们来看看EF7的具体新功能及用法.本文中的环境,为EF7入门里介绍的环境. 1 ...
- Wireshark工控协议
Wireshark是一个强大开源流量与协议分析工具,除了传统网络协议解码外,还支持众多主流和标准工控协议的分析与解码. 序号 协议类型 源码下载 简介 1 Siemens S7 https://git ...
- Django Nginx+uwsgi 安装配置
使用 python manage.py runserver 来运行服务器.这只适用测试环境中使用. 正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, Nginx, lighttp ...
- nes 红白机模拟器 第3篇 游戏手柄测试 51 STM32
手柄使用的是 CD4021 ,datasheet 上说支持 3V - 15V . 因为手柄是 5V 供电,2440 开发板上是GPIO 3.3V 电平,STM32 GPIO 也是 3.3V (也兼容5 ...
- hadoop 安装教程 转载
hadoop2.2安装教程:http://www.aboutyun.com/thread-7684-1-1.html hadoop2.X使用手册1:通过web端口查看主节点.slave1节点及集群运行 ...