浅析如何利用angular结合translate为项目实现国际化


Posted in Javascript onDecember 08, 2016

前言

利用H5项目第一版本已经上线,话说有了第一期就有了第二期,这不要为第二期做准备了,老大发话第一件事就要利用Angular JS实现项目的国际化以及后续要借助这个框架来实现其他功能,好吧我表示没怎么接触过,这一个礼拜自己也对Angular基本的用法已经有了初步的了解以及熟悉,于是乎就有了这篇文章的产生。其实没我什么事,我也是主动请缨说交给我,因为年底了嘛,也没什么事,不急不忙的,一天也乐得清闲,还不给自己找点事做,而且还能在做的过程中能学到东西,何乐而不为呢!Angular已盛行一时,但请恕我见识少,一直认为Angular是属于微软旗下,结果。。。。你懂的,不说了,回到话题。

话题

找到了官网有关Angular的APi,看其最新版本是1.3.9,貌似还有比此版本更高的,无所谓了,只要不影响实现就ok,下载的包里面有国际化文件夹却没有APi,此时第一想到的去github上瞧瞧,果不其然还真有,搜索【Angular translate】即可,幸好英语还算基本过关,关键时刻找点东西还是挺有帮助的。下面一步一步来看,别着急 ,由浅入深。

第一步

两个脚本文件必不可少,我喜欢用压缩的,看个人爱好,angular.min.js,angular-translate.min.js

第二步

我们开始利用开启angular装逼模式。

【第一次尝试】

<html ng-app="app">
<head>
 <meta name="viewport" content="width=device-width" />
 <title>Index</title>
 <script src="~/Scripts/angular.min.js"></script>
 <script src="~/Scripts/angular-translate.min.js"></script>
 <script type="text/javascript">
  var app = angular.module("app", ['pascalprecht.translate']);
  app.config(['$translateProvider', function ($translateProvider) {
   $translateProvider.translations('zh-cn', {
    'hello': '你好',
   });

   $translateProvider.preferredLanguage('zh-cn');
  }]);
 </script>
</head>
<body>
 <h1>{{hello | translate}}</h1>
</body>
</html>

上面我们要将hello翻译成中文你好,结果什么都没有,还没出错,是不是很神奇。

【注意】hello必须以字符串形式给出,要不然得不到你所预期。这么写就对了{{"hello" | translate}}

输出如下:

浅析如何利用angular结合translate为项目实现国际化

【第二次改进】

上面只是简单的开始,老大过来看,不错初步得到我想要的结果,我们项目就要实现这样的结果,但是这结果不太令人满意。

我们的场景是这样的:我们有存储各种语言的JSON文件,当页面加载时,获取用户的所使用的语言,加载该JSON文件,里面存储的是键值对,分别是对应的中文-》英文以及英文-》中文,若获取用户所使用的语言为英文你就将中文翻译成英文。反之亦然,好吧,原来是将翻译的键值对放在JSON文件,那就加载该文件不就得了,继续做呗。

在translate源码下载包里中找到loader-static-files脚本并引入该文件

 测试代码,如下:

<html ng-app="app">
<head>
 <meta name="viewport" content="width=device-width" />
 <title>Index</title>
 <script src="~/Scripts/angular.min.js"></script>
 <script src="~/Scripts/angular-translate.min.js"></script>
 <script src="~/Scripts/loader-static-files.js"></script>
 <script type="text/javascript">
  var app = angular.module("app", ['pascalprecht.translate']);
  app.config(['$translateProvider', function ($translateProvider) {
   $translateProvider.useStaticFilesLoader({
    prefix: '/il8n/',
    suffix: '.json'
   });
   $translateProvider.preferredLanguage('en-us');
  }]);
 </script>
</head>
<body>
 <h1>{{"Hello" | translate}}</h1>
 <h1>{{"xpy0928" | translate}}</h1>
</body>
</html>

上述中【prefix】为存储语言的JSON文件夹目录,【suffix】为我们需要请求的文件的扩展名即JSON。而【$translateProvider.preferredLanguage('en-us')】则是请求il8n文件夹下名为【en-us】的JSON文件。

接下来我们运行试试,擦,尼玛,给我原字符串输出,说好的翻译成中文呢?

浅析如何利用angular结合translate为项目实现国际化

再一看,擦,竟然没找到zh-cn的JSON文件,如下图!这个问题有点叼,开始我还以为是文件夹名【il8n】中的【l】写成【1】。

浅析如何利用angular结合translate为项目实现国际化

原来是无法请求JSON文件,必须添加映射,在VS 2013 express中添加对JSON的映射需进行如下操作:

(1)通过命令行到C:\Program Files(x86)\IIS Express文件夹

(2)继续命令行:appcmd set config /section:staticContent /+[fileExtension='.json',mimeType='application/json']

 当然如果是发布在本地IIS中只需在Mime中添加映射以及应用配置程序中进行配置即可。

 最终翻译成功如下:

浅析如何利用angular结合translate为项目实现国际化

【第三次升级终极版本】

做成这样老大应该满意了吧,赶紧欣喜的将老大叫过来大功告成啊,尼玛,终于完事了,好,要的就是这效果,非常不错,不过。。。心想难道这么做你还不满意还是不行,结果又被挑到刺了。

挑刺话题中:如上所示,{{"Hello" | translate}},这么绑定的话,如果页面加载快还行,若是加载慢的话,那就把模板给显示出来了,太丑了,你再想想有没有办法规避这种行为。哈哈,其实我早就想到了,这么绑定会出现他担心的那个问题,我就是卖个关子而已,装装逼也是可以的嘛。用【ng-bind】解决不就ok了吗。心里早就有数,来继续走你。

分析中:[ng-bind]只能绑定在元素的属性中,例如这样<span ng-bind="text"></span>,咦,貌似不对,要是显示html内容,那该怎么办,强大的IDE【vs】的智能提示,显示有[ng-bind-html],令人比较满意的分析。马上试试看。

更改为如下:

<h1 ng-bind-html="{{"Hello" | translate}}"></h1>
 <h1 ng-bind-html="{{"xpy0928" | translate}}"></h1>

结果出错,看错误很明显是语法用错了,试试下面的

<h1 ng-bind-html="'Hello' | translate"></h1>
<h1 ng-bind-html="'xpy0928' | translate"></h1>

这下也不行,不过不是语法的问题,如下图所示:

浅析如何利用angular结合translate为项目实现国际化

也可能出现如下错误:

[$sce:unsafe] Attempting to use an unsafe value in a safe context

结果一查资料却是要添加一个【angular-sanitize.min.js】脚本文件,并且依赖于它。继续添加此脚本文件看看。结果如我预期。

【注意】添加此脚本文件之后,要在模块中对此脚本文件进行依赖。如下:

var app = angular.module("app", ['pascalprecht.translate', 'ngSanitize']);

我们反过来将中文转换为因为试试看,进行如下修改

$translateProvider.preferredLanguage('en-us');
<h1 ng-bind-html="'你好' | translate"></h1>
<h1 ng-bind-html="'博客园' | translate"></h1>

结果显然是成功的,如下:

浅析如何利用angular结合translate为项目实现国际化

总结

利用angular进行国际化转换时利用【ng-bind-html】来进行语言的翻译是接近几乎比较完美的方案,不会像利用【{{}}】模式,当页面加载缓慢时导致页面太丑。但是利用【ng-bind-html】还是有点问题,,当刷新总有一个切换的过程,比如从中文【你好】切换到英文【hello】,这样过程你是可以看见的,暂时未想到更好的解决方案,期待你更好的解决方案。整个转换个过程必须要引用以下四个脚本文件。

<script src="~/Scripts/angular.min.js"></script>
 <script src="~/Scripts/angular-translate.min.js"></script>
 <script src="~/Scripts/loader-static-files.js"></script>
 <script src="~/Scripts/angular-sanitize.min.js"></script>

参考资料

【translate api】:translate api

【translate new letter】:translate new letter

【angular sanitize/ng-bind-html not working】:angular sanitize/ng-bind-html not working

【translate download】:translate github

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js继承 Base类的源码解析
Dec 30 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
Oct 03 Javascript
node.js中的fs.chownSync方法使用说明
Dec 16 Javascript
JS实现的表格行鼠标点击高亮效果代码
Nov 27 Javascript
angular学习之ngRoute路由机制
Apr 12 Javascript
jQuery+PHP+Mysql实现抽奖程序
Apr 12 jQuery
js随机生成一个验证码
Jun 01 Javascript
angular 用拦截器统一处理http请求和响应的方法
Jun 08 Javascript
JavaScript中document.referrer的用法详解
Jul 04 Javascript
基于require.js的使用(实例讲解)
Sep 07 Javascript
JS代码检查工具ESLint介绍与使用方法
Feb 04 Javascript
JS数组方法reduce的用法实例分析
Mar 03 Javascript
Jquery on绑定的事件 触发多次实例代码
Dec 08 #Javascript
Bootstrap基本组件学习笔记之进度条(15)
Dec 08 #Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
Dec 08 #Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
Dec 08 #Javascript
Bootstrap基本组件学习笔记之面板(14)
Dec 08 #Javascript
Bootstrap基本组件学习笔记之缩略图(13)
Dec 08 #Javascript
Bootstrap基本组件学习笔记之分页(12)
Dec 08 #Javascript
You might like
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
javascript实现数字时钟效果
2021/02/06 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
使用Python写CUDA程序的方法
2017/03/27 Python
Python中的默认参数实例分析
2018/01/29 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
Python小白垃圾回收机制入门
2020/06/09 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
Python使用openpyxl复制整张sheet
2021/03/24 Python
历史专业个人求职信分享
2013/12/20 职场文书
六月份红领巾广播稿
2014/02/03 职场文书
故宫导游词
2015/01/31 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python