1、为什么要做国际化
没有国际化的框架是一个不完整的框架,特别在全球信息化的今天,国际化不再是鸡肋,而是在选择开发平台时必须首要的考试因素,特别在有些公司平台是否国际化具有一票否决要素,所以我们要搞国际化,而不是仅仅是简单的高大尚。
2、国际化的实现原理
国际化听起来简单,但要框架中要做到与框架的无缝衔接,松耦合还是有一定难度的。有些系统有时不需要做国际化,在做国际化如果快速发现哪些没有被国际化的字段等,这些问题都开发者在开发过程中实际需要解决的问题,而这一切我们都已经帮你想到了。
用户在登录页面选择语言后点击登录后在LoginControler.java中checkuser方法中可以看到下面代码,当前语言会被放到session中。
if (req.getParameter("langCode")!=null) { req.getSession().setAttribute("lang", req.getParameter("langCode")); }MutiLangServiceImpl.java 中有三个方法,分别介绍下作用:
1)initAllMutiLang()——TOMCAT启动时会被自动加载,把国际化的表内容加载到内存中,方便以后快速调用,即加载表t_s_muti_lang中所有记录并放在Cache中。
2)getLang(String lang_key)——传入需要国际化的Lang Key自动根据用户当前语言来得到国际化后的值,如在某处调用如: String value = getLang(“common.status”),如果当前语言为中文则value为状态,英文为Status
3)refleshMutiLangCach()——刷新Cache,在对语言进行维护的时候,比如添加一个语言可以自动把新加的自动加入到Cache里,保证实时生效。
3、国际化应用的各种场合举例
我们以国际化维护页面国际化为例
List及Tag国际化
langKey 可以接受输入多个参数,举例如:
lang. congratulation.edit.success 对应中文是:恭喜你,{0}修改{1}。
则在页面上我们可以传入的langArg的参数样式为:
langArg=” lang.function.name, common.success”
lang.function.name会替代{0}, common.success会替代{1}
客户端label的国际化
Java后台国际化
后台树的国际化
如果你需要对树做国际化,只要在表里把树的名称换成lang_key的值并且在树返回的最后一步加代码:MutiLangUtil.setMutiTree(treeGrids, mutiLangService);就可以实现,具体可以参考菜单管理:
Js国际化
由于Js文件中无法用国际化标签,所以只能在src\main\webapp\plug-in\mutiLang目录中添加us.js及zh-cn.js,这个文件已经在BaseTag中第一个默认引入了。
4、语言的维护
系统管理菜单中语言管理就可以对语言进行维护管理,注意不要添加已经存在的语言内容。若是有重复的内容,系统在添加的时候会自动提示。
5、lang_key的命名规范
1)系统已经有的国际化的就不用重复添加了,如: common.status,对应 状态,如果有状态直接使用即要,不要再添加相同名称不同lang_key的进去。
2)如果碰到国际化表中没有的,则需要自己添加。
lang_key在t_s_mutilang表中命名的格式一定是 xxx.xxx(或者有更多的点)
3)如果是不常用的,如某个模块中有个标签叫“学生”,则命名时可以叫:lang.student
4)如果是一些公共的,则命名时用common开头,如“操作”可能在系统各处都有可能用到,则命名可以叫:common.operation
5)不用要一个单词来命名作为lang_key,如student.
6)如果是一个句子lang_key就写下这个句子,单词间用点来分开,如:common.please.select.one.record.to.edit 对应Please select one record to edit
7)如果是一个句子lang_context首字母需要大写,其他小写,按正常英文句子的来拼写,如:
Please select one record to edit, 而不是 Please Select One Record To Edit.
8)如果不是句子,如表头上显示,则lang_context可以全部首字母大写,如: User Name, Role Name
9)前后命名要一致,比如部门有的人喜欢用简写如:depart,哪后面注意就全部用简写,不要一会出现depart,一会出现department很不协调。也不要一会出现desc,一会出现description.
10)单词不要出现拼写错误。
11) 翻译要准确,不要出现无关内容。比如有某个网页上的标题上中文是:学生添加,你可以用lang.student.add,有的人发现这是个标题就可能会写成 lang.title.student.add,title这是这个出现的位置,请不要加这样的位置信息。
12)所有List页面(特例除外)的添加,修改都是用以下风格,对应模块修改langArg的值
<t:dgToolBar title="common.add.param" langArg="common.language"
<t:dgToolBar title="common.edit.param" langArg="common.language"
翻译过来就是 模块名+录入(编辑),比如:语言录入,用户录入等,不要只放“录入”以保证所有页面的页格一致。
6、我只是在国内做项目,不想看到lang_key可以么?
当然可以,你还是可以按原来一样写代码,比如:
<t:datagrid name="departList" title="common.department.list" 改成
<t:datagrid name="departList" title="部门列表"
再把common.notfind.langkey 对应的 lang_context 会值由 ?改成空就可以了。
7、为什么我用了国际化后前面多了个问号?
那是在提醒你该lang_key没有做国际化,你只要在语言维护中添加即可,问号的目的就是个提醒,可以让你一眼就看出哪些没有做国际化。如果你讨厌看到问号同样把common.notfind.langkey 对应的 lang_context 会值由 ?改成空