现在 Blessing Skin Server 的 HTML 模板是使用 Laravel 自带的本地化来实现多语言支持的,并且使用了 devitek/yaml-translation 这个包把 Laravel 语言文件从默认的 PHP 数组形式改为 YAML 格式的文件。

不得不说数组形式的语言文件简直反人类好吗,一大堆 => 看的眼晕。。YAML 大法好!(ゝ∀・)

回到正题。虽然 HTML 模板里的国际化是解决了,但是整个应用中需要国际化的地方可不止 HTML 模板,同时还有 JavaScript(一些验证的提示文本)。但是静态的脚本文件中总不能内嵌 PHP 吧,所以我们得搞个单独的解决方案。

虽然说网上现成的 JS 国际化的库很多,但我总觉得有些看不上眼(可能是我没找到好的),就准备自己实现一下。

首先我们需要一个全局变量来保存从语言文件里读出来的东西:

  1. // 保存所有加载的语言文件
  2. $.locales = {};
  3. // 当前选择的语言翻译文件
  4. var locale = {};

这里我们把 locales 这个字典绑到了 jQuery 定义的全局变量 $ 上,这也就意味着要依赖 jQuery 了。当然你不绑在 $ 上也是一点关系也没有的,因为我们下面并不需要用到 jQuery。

现在我们就可以在语言文件中这样写了:

  1. (function ($) {
  2. "use strict";
  3. $.locales['zh-CN'] = {
  4. auth: {
  5. login: '登录',
  6. validation: {
  7. emptyPassword: '密码要好好填哦'
  8. }
  9. },
  10. user: {
  11. changeNickName: '确定要将昵称设置为 :new_nickname 吗?'
  12. },
  13. general: {
  14. confirm: '确定',
  15. cancel: '取消'
  16. }
  17. };
  18. })(window.jQuery);

如果你不准备依赖于 $ 这个变量,就把闭包的作用域和里面的变量名改一下。总之就是保证它可以被全局地访问到就好。

因为我们可能会加载多个含有语言文件的 locale.js 文件,所以我们需要判断一下当前语言,然后把对应的语言字典加载到上面定义的 locale 变量中:

  1. function loadLocales() {
  2. for (lang in $.locales) {
  3. // 这里你可以进行进一步的加载判断
  4. if (!isEmpty($.locales[lang])) {
  5. locale = $.locales[lang] || {};
  6. }
  7. }
  8. }

上面用到的那个 isEmpty 函数可以看这里:@Gist。然后我们就可以定义用于把 key 翻译成具体语言的翻译函数啦:

  1. function trans(key, parameters) {
  2. if (isEmpty(locale)) {
  3. // 载入当前所选的语言至全局变量
  4. loadLocales();
  5. }
  6. parameters = parameters || {};
  7. var segments = key.split('.');
  8. var temp = locale || {};
  9. for (i in segments) {
  10. if (isEmpty(temp[segments[i]])) {
  11. // 如果该项不存在,则原样返回 key
  12. return key;
  13. } else {
  14. temp = temp[segments[i]];
  15. }
  16. }
  17. for (i in parameters) {
  18. if (!isEmpty(parameters[i])) {
  19. // 替换语言字符串中的占位符
  20. temp = temp.replace(':'+i, parameters[i]);
  21. }
  22. }
  23. return temp;
  24. }

这里可以看到这个函数接受两个参数,key 和 parameters。key 就是用于翻译的键值了,并且我们可以传一个 dict 作为参数来替换语言字符串中的占位符。

而且在 key 的处理中,我们解析了类似于 auth.login 这样的 key,并且是可以无限嵌套下去的。是不是感觉挺熟悉的?没错,就是 Laravel 翻译器也在使用的「点」语法 ( ゚ 3゚) 我是觉得蛮不错的就搬过来了(笑

现在我们在加载完语言文件后就可以使用这个函数来实现前端国际化啦:

  1. trans('auth.validation.emptyPassword');
  2. // 返回 "密码要好好填哦"
  3. trans('user.changeNickName', { new_nickname: 'FUCK' });
  4. // 返回 "确定要将昵称设置为 FUCK 吗?"

作者:printempw

来源:51CTO

又是一种用于JavaScript的前端国际化方案相关推荐

  1. 一个极端的前端国际化方法

    最近一直在做整个页面的国际化,相信很多小伙伴们都做过,前端主要采用的是Angularjs,后端使用的是Spring来做国际化,那么他们的优点,缺点现在一起来总结一下.其实无论用哪种语言做国际化,感觉都 ...

  2. 神策数据陈宁:前端国际化技术需求及模型实现

    本文根据神策数据资深前端研发工程师陈宁<前端国际化>的直播整理而成,主要包含以下内容: · 国际化概述 · 国际化技术需求 · 国际化技术模型 · 国际化技术模型实现 一.国际化概述 国际 ...

  3. 前端优化方案-JavaScript 优化方案 收藏 此文于2010-06-04被推荐到CSDN首页

    前端优化方案-JavaScript 优化方案 收藏 此文于2010-06-04被推荐到CSDN首页 如何被推荐? Author: 李丽媛 Date: 2010/6/2 Email: lly219#gm ...

  4. [JavaScript] 多数前端工程师都没注意到的一个关于console.log()的坑

    [JavaScript] 多数前端工程师都没注意到的一个关于console.log()的坑 请阅读以下代码并猜测结果: function test() {let obj = {}, arr=[]for ...

  5. cfar恒虚警matlab实现,一种用于距离副瓣抑制的自适应恒虚警方法与流程

    本发明涉及脉冲压缩雷达数字信号处理技术领域. 背景技术: 在传统的真空管体制雷达中,由于发射占空比受限,通过设计较低的雷达重复发射频率实现远距离的目标探测,但由于发射的是简单的脉冲调制波形,重复频率降 ...

  6. 论文阅读——R树:一种用于空间查找的动态索引结构(算是节译)

    原文地址:http://blog.sina.com.cn/s/blog_672446ba0100t5nx.html 正文之前先吐槽. 这篇文章很老了.最初发表于1984年,比我还大三岁.但它是很多种空 ...

  7. mysql的R树_GIS笔记——R树:一种用于空间查找的动态索引结构(算是节译)

    R树简介. R树是一种与B树类似的高度平衡树.这种索引是动态的,不需要定期重建.索引记录(Index Records)保存在叶节点中,索引记录包含指向数据对象的指针.注意原文中将索引的终端称为索引记录 ...

  8. Security ❀ JavaScript Attacks 前端攻击

    文章目录 JavaScript Attacks 前端攻击 1 Low Level 2 Medium Level 3 High Level 4 Impossible Level JavaScript A ...

  9. HTML静态页面国际化,如何优雅的实现前端国际化

    今天小编会使用boostrap框架搭建一个配有中英文切换功能的网页,还有就是使用nodejs搭建后台服务,从头实现一个完整的前端国际化开发项目,内容不算很复杂,很适合前端已入门的胖友们. 01 .前端 ...

最新文章

  1. Adobe Achemy入门指南(二)
  2. 调整图像- 自动对比度、自动色阶算法
  3. android 按下缩小效果松开恢复_iPhone XS/XS Max如何强制重启?如何进入恢复模式或DFU模式?...
  4. POJ - 2411 Mondriaan's Dream(状压dp)
  5. 专访京东副总裁翁志:全方位解读 CNCC 2018「数据开创商业新生态」技术论坛 | CNCC 2018...
  6. hadoop-集群安装
  7. python和r语言生物信息学_R语言和Python哪个适合生物信息学?
  8. Diffusion Models和GANs结合
  9. 黑色温敏性PNIPAM-AuNPs/CHOL-AuNPs纳米金粒修饰聚合物的制备过程
  10. (纪中)2431. 移动奶牛(herding)
  11. python 斗地主发牌_Python_斗地主发牌程序
  12. AEJoy —— 表达式之闪烁光标的打字机效果(二)【JS】
  13. java实现根号n路归并排序
  14. python的math库函数汇总
  15. 初学STM32,使用HAL库点灯全过程
  16. 图形界面介绍Violation Browser
  17. top-level object
  18. 备考通信复试过程中的一些知识点总结梳理——信道编码
  19. 跨专业保研上交计算机,新闻学到经济学,跨专业保研血泪史
  20. 魔百盒CM211-1 GZ-2+16g 广东移动增强版 官方备份+免拆线刷固件及教程

热门文章

  1. python中的translate_Python translate()方法
  2. PHP5.3, PHP5.4, PHP5.5新特性
  3. 清结算内部勾兑业务一个比较有意思的问题整理
  4. 装修时水电如何开槽?沟槽如何封堵?有哪些防止沟槽开裂的方法
  5. C++中的(unsigned int)代表的意思
  6. JUC:ConcurrentHashMap(并发容器)
  7. logstash-input-jdbc 同步mysql数据到es
  8. java数据结构之快速排序
  9. Android 初探Retrofit2.0.1(最新版)
  10. NEC描绘智慧城市蓝图