html multi language switch

HTML页面多语言切换

4765人阅读 评论(1) 收藏 举报
分类:
部门有个Web UI产品,里面有项功能是语言切换。之前同事的做法是把每个页面都做另做一份,语言切换时改变URL即可。简单的页面还好,如果遇到更多语言和复杂页面难免会增加维护难度。后来另一个同事用jQuery+AJAX+json+cookie的方式加以改进,我学习了一下代码,做了个自己的版本。

首先,页面不需要复制多个语言版本了,我们为每个需要翻译的文本标签加上一个自定义的lang属性,如<div lang>login</div>、<input type=”button” value=”apply” lang>,不用为它赋值。一个HTML页面示例如下:
  1. <!doctype html>  
  2. <head>  
  3. <meta charset="utf-8">  
  4. <title>translation test</title>  
  5. <script src="js/jquery.js"></script>  
  6. <script src="js/script.js"></script>  
  7. </head>  
  8.   
  9. <body>  
  10.     <div>  
  11.         <a href="#" id="enBtn">English</a>  
  12.         <a href="#" id="zhBtn">简体中文</a>  
  13.     </div>  
  14.     <div><a lang>click here:</a></div>  
  15.     <div><input type="button" value="apply" lang id="applyBtn"></div>  
  16. </body>  
  17.   
  18. </html>  

假如要实现英文和中文两种版本,可以在网页文件的同级目录下分别添加一个en.json和zh.json文件:

en.json

  1. {  
  2.     "click here:" : "Please click here:",  
  3.     "apply" : "Apply!",  
  4.     "a translation test!" : "A Translation test!!"  
  5. }  
zh.json
  1. {  
  2.     "click here:" : "点击这里",  
  3.     "apply" : "应用",  
  4.     "a translation test!" : "翻译示例!"  
  5. }  

接着,为这个页面添加以下js脚本:
[javascript] view plain copy
  1. var dict = {};  
  2.   
  3. $(function() {  
  4.     registerWords();  
  5.     setLanguage("en");  
  6.       
  7.     $("#enBtn").bind("click"function() {  
  8.         setLanguage("en");  
  9.     });  
  10.       
  11.     $("#zhBtn").bind("click"function() {  
  12.         setLanguage("zh");  
  13.     });  
  14.       
  15.     $("#applyBtn").bind("click"function() {  
  16.         alert(__tr("a translation test!"));  
  17.     });  
  18. });  
  19.   
  20. function setLanguage(lang) {  
  21.     setCookie("lang=" + lang + "; path=/;");  
  22.     translate();  
  23. }  
  24.   
  25. function getCookieVal(name) {  
  26.     var items = document.cookie.split(";");  
  27.     for (var i in items) {  
  28.         var cookie = $.trim(items[i]);  
  29.         var eqIdx = cookie.indexOf("=");  
  30.         var key = cookie.substring(0, eqIdx);  
  31.         if (name == $.trim(key)) {  
  32.             return $.trim(cookie.substring(eqIdx+1));  
  33.         }  
  34.     }  
  35.     return null;  
  36. }  
  37.   
  38. function setCookie(cookie) {  
  39.     document.cookie = cookie;  
  40. }  
  41.   
  42. function translate() {  
  43.     loadDict();  
  44.       
  45.     $("[lang]").each(function() {  
  46.         switch (this.tagName.toLowerCase()) {  
  47.             case "input":  
  48.                 $(this).val( __tr($(this).attr("lang")) );  
  49.                 break;  
  50.             default:  
  51.                 $(this).text( __tr($(this).attr("lang")) );  
  52.         }  
  53.     });  
  54. }  
  55.   
  56. function __tr(src) {  
  57.     return (dict[src] || src);  
  58. }  
  59.   
  60. function loadDict() {  
  61.     var lang = (getCookieVal("lang") || "en");  
  62.   
  63.     $.ajax({  
  64.         async: false,  
  65.         type: "GET",  
  66.         url: lang + ".json",  
  67.         success: function(msg) {  
  68.             dict = eval("(" + msg + ")");  
  69.         }  
  70.     });  
  71. }  
  72.   
  73. function registerWords() {  
  74.     $("[lang]").each(function() {  
  75.         switch (this.tagName.toLowerCase()) {  
  76.             case "input":  
  77.                 $(this).attr("lang", $(this).val());  
  78.                 break;  
  79.             default:  
  80.                 $(this).attr("lang", $(this).text());  
  81.         }  
  82.     });  
  83. }  
可以看到,js代码中的语言翻译用__tr()解决。若要动态切换语言,调用setLanguage()方法。

注意,页面加载完成后首先要统计翻译词条registerWords(),它会把每个待翻译标签里的文本记录到lang属性中,这个方法调用一次即可。

如果学过Qt,就会知道里面的语言包机制:每个词条可以指定一个context,这个单词一直被人蹩脚地翻译成“上下文”,我觉得这里解释为“名空间”更好,为解决一个单词或句子在不同地方产生不同翻译的问题。我还没有做到这一点,考虑到这种情况比较少见,并可加以避免,就偷个懒啦。

这就是我实现的思路,当然改进的地方还有不少,比如cookie的读写,语言包和页面文件的如何对应等等。在HTML上我只是个新手,就当抛块引玉了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值