项目上很好的东西一直没有总结,今天抽空整理一下,以便不时之需。
web项目要实现多语言,这个功能需求很常见,一般的都会有中英文两种版本。
先说一下本项目的情况:本项目是基于zend framework的一个项目,在本项目中用到了两种国际化方案:
1.在js中实现国际化(主要针对ajax异步请求获取的数据,需要翻译的时候使用).
2.在PHP中实现国际化(主要针对项目的模板页面上的翻译数据).
下面我们先看一看js实现的部分:
思路:新建一个js文件,在文件中添加键名和对应的键值,然后定义一个公用方法,来用键名获取键值。
实现:项目中两种语言则丁一两个文件zh_CN.js和en_US.js分别存放中英文的键名与键值的对应。不多说了直接上一点代码:(这里以英文为例)
var langs={ 'OK':'OK', 'cancel':'Cancel', 'login':'Login', 'Please wait {n} minutes':'Please wait {n} minutes' //{n}代表可变参数 }; function __(key,params) { if(langs[key]&¶ms){ if($.isArray(params)){ var arr =new Array(); var str = new string(params); var result = ''; arr = str.split(','); for(var i=0;i<arr.length;i++){ result = langs[key].replace('{n}',arr[i]); } if(typeof(result)!=='undefined'){ return result; }else{ return key; } }else{ return langs[key]; } } else if(langs[key]&&!params){ return langs[key]; }else{ return key; } }
用的时候在js代码中这样写:__('Please wait {n} minutes',3);即可。注意:函数的第二个参数是这种格式的:'2,3,4,5'用逗号隔开的。
其他要说明的:如何实现语言切换,大概思路如下:切换语言的时候加上?locale=en_US,然后在从url中获取到,存储在cookie的一个变量lang中,供取用。
在程序中根据cookie中lang的值不同来判断加载不同的js,这样就可以对项目中的js部分的翻译做处理了。
2.下面看一下php部分如何实现翻译:
php部分因为用到的是zend框架所以会用到里面的zend_Translate适配器。该适配器功能强大。
先理一下思路:在根目录中新建languages文件夹,下面新建zh和en文件夹分别存放中英文翻译文件,这里面用csv文件保存,具体格式是:
ok,'OK',
wait me {n} minutes,'Please wait me {n} minutes!'
....
关于zend_Translate 的配置就不多讲了,可以参考网上的资料。
可以参考这一份配置方法:http://my.oschina.net/netljx/blog/32485
最终我们要顶一个公共的方法来攻供模板页面使用:代码如下:
<?php class Commenfunc{ public function translate($key,$params) { $translate = Zend_Registry::get('Zend_Translate');
$message = $translate->translate($key); if (isset($params[0])){ if(!isset($params['{n}'])){ $params['{n}'] = $params[0]; $res = strstr($message,$params['{n}']); unset($params[0]); return $res; } }else{ return $message; } } } ?>
用的时候这样使用:
Commenfunc::translate('ok');
Commenfunc::translate('wait me {n} minutes',$n);
大概的思路就是这样了,实现的过程中还有很多小问题需要不断的去做修改,不嫌烦就能搞定。