項目上很好的東西一直沒有總結,今天抽空整理一下,以便不時之需。
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);
大概的思路就是這樣了,實現的過程中還有很多小問題需要不斷的去做修改,不嫌煩就能搞定。