网站首页 > 技术文章 正文
话不多说,还是先看看效果图吧:
如图所示,通过改变地址栏 local 的值即可切换语言,下面我贴一下具体的代码:
html
<div> <span class="ch-i18n" data-i18nkey="today">今天</span> </div> <div> <input type="text" class="ch-i18n" data-i18nkey="emailLabel" placeholder="请输入邮箱"> </div> <div> <input type="submit" class="ch-i18n" data-i18nkey="submit" value="提交"> </div> <div> <label> <input type="radio"><span class="ch-i18n" data-i18nkey="man">男</span> </label> <label> <input type="radio"><span class="ch-i18n" data-i18nkey="woman">女</span> </label> </div> <div> <label> <input type="checkbox"><span class="ch-i18n" data-i18nkey="apple">苹果</span> </label> <label> <input type="checkbox"><span class="ch-i18n" data-i18nkey="banana">香蕉</span> </label> </div> <div id="insert"></div> <input type="button" id="btn1" class="ch-i18n" data-i18nkey="button" value="插入HTML"> <div id="placeholder"></div> <input type="button" id="btn2" value="替换文本中的占位符"> <script src="./js/jquery-1.8.1.js"></script> <script src="./js/i18n.js"></script> <script> $(function () { var chI18n = CHI18n("login"); // 动态插入数据 $("#btn1").click(function () { $("#warning").show(); $("#insert").html('<span>'+chI18n.get("insert")+'</span>'); }); $("#btn2").click(function () { $("#placeholder").html(chI18n.get("msg" , {name:'king',age:24,sex:'男'})); }); }) </script>
如代码所示,需要国际化的标签,需要注意下面这几点:
- 需要国际化的标签class中必须包含 ‘ch-i18n’ 类名, 必须有 data-i18nkey 属性
- 如果input有placeholder属性,则会对placeholder进行国际化显示
- 如果input有value属性,则会对value进行国际化显示
- 对于2,3这两种情况,一般 input 的type为 text,submit,button
zh-cn.json
{ "login":{ "today":"今天", "submit":"提交", "emailLabel":"请输入邮箱", "apple":"苹果", "banana":"香蕉", "woman":"女", "man":"男", "button":"按钮", "insert":"动态插入信息", "msg":"我叫{{name}},今年{{age}}岁,性别{{sex}}" } }
这是我们一个简单的国际化语言文件的格式(英文的跟这个一样,我就不贴出来了),我们通过 data-i18nkey 属性绑定这些 key ,然后 i18n.js 就能自动去解析,并显示每个标签所需要显示的文本。
i18n.js
(function () { var i18n = null ; var SELECTOR = ".ch-i18n"; var ATTR = "data-i18nkey"; var LANGUAGE_ARRAY = ['zh-cn','en-us']; var lang = LANGUAGE_ARRAY[0]; var LOCAL = "local"; var CHI18n = { get : function (key , obj) { var text = i18n[key] ; if(obj) { for(k in obj) { text = text.replace(new RegExp("\\{\\{" + k + "\\}\\}", "g"), obj[k]); } } return text ; } } // 我这里根据页面为单位,通过页面的唯一标识,去获取相应的国际化翻译 function CHI18nFactory (pageName) { if(!pageName || pageName == "") throw new Error("参数不能为空"); loadLanguage(pageName); return CHI18n ; } /** * 加载语言文件 */ function loadLanguage (pageName) { var search = window.location.search.replace("?",""); var param = search.split("&"); var index = param.findIndex(function (item) { return item.indexOf(LOCAL) != -1 ; }); if(index != -1) { var value = param[index].replace(LOCAL+"=",""); if(LANGUAGE_ARRAY.indexOf(value) != -1) { lang = value ; } } // 加载国际化文本 $.ajax({ url:'./i18n/'+lang+'.json', async:false, dataType:'json', success:function (data) { i18n = data[pageName] ; setLanguage(); } }); } /** * 替换带有 .ch-i18n[data-i18nkey] 类名和属性的标签内容 */ function setLanguage () { $(SELECTOR+'['+ATTR+']').each(function () { var value = $(this).attr(ATTR); if(value && value != "") { if(this.tagName.toLowerCase() === 'input') { if( $(this).attr("placeholder")) { $(this).attr("placeholder",i18n[value]); } else if($(this).attr("value")){ $(this).attr("value",i18n[value]); } } else { $(this).html(i18n[value]); } } }); } window.CHI18n = CHI18nFactory ; })();
对于i18n.js的实现其实很简单,就是通过 jquery 加载所有 class="ch-i18n" 的元素,然后获取该元素的 data-i18nkey 属性值,然后通过浏览器地址栏参数 local 的值去加载对应的国际化文件,通过 data-i18nkey 的值去获取对应的文本显示即可。
当然有时候国际化文本中的数据可能是动态的,存在占位符的情况,比如:
{
msg:"我叫{{name}},今年{{age}}岁,性别{{sex}}"
}
这里的name,age,sex 占位符的值需要我们在设置的时候手动传值进去,因此可以给 get 方法传递一个参数即可,如下:
chI18n.get("msg" , {name:'king',age:24,sex:'男'})
如上只是一种简单的国际化方案,如果你有其他更好的方式,欢迎留言交流。
猜你喜欢
- 2024-10-04 网页变画板,一个 Chrome 插件就能扮演高级前端工程师
- 2024-10-04 「开源」github上star超2万的Vue前端项目vue-element-admin
- 2024-10-04 Vue3 高颜值 中后台管理系统模板 vue后端管理框架
- 2024-10-04 项目复盘:通过动态脚本,实现按需加载语言包
- 2024-10-04 国际化04:转换为excel #前端八股文
- 2024-10-04 基于SpringCloud的enum枚举值国际化处理实践
- 2024-10-04 Springboot启动扩展点超详细总结,再也不怕面试官问了
- 2024-10-04 google前端开发中有哪些优秀实践 google前端开发中有哪些优秀实践方法
- 2024-10-04 一个国际化的前端项目,用vue-cli3从0开始搭建一个多入口
- 2024-10-04 全自动翻译国际化(支持一键翻译多国语言,不入侵业务代码)
你 发表评论:
欢迎- 539℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 535℃Oracle分析函数之Lag和Lead()使用
- 533℃几个Oracle空值处理函数 oracle处理null值的函数
- 532℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 525℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 508℃【数据统计分析】详解Oracle分组函数之CUBE
- 492℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 485℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端排序 (47)
- 前端密码加密 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)