- 由于準(zhǔn)備做一個國際商城角溃,因此避免不了要進(jìn)行多語言的切換,目前第一版只做中英文的切換篮撑;在網(wǎng)上查找了很多資料减细,實現(xiàn)的方式基本大同小異;不同的語言生成不同的語言包文件赢笨,或者通過前端調(diào)用渲染頁面未蝌,或者直接通過后端渲染;比較之后決定采取 php 的 gettext 來實現(xiàn)多語言茧妒;
第一步:確保本地啟用 gettext 擴(kuò)展萧吠,win 下,打開 php.ini 配置文件桐筏,去掉 extension=php_gettext.dll 前面的 “纸型;”,保存重啟服務(wù)梅忌;
第二步:現(xiàn)在語言包生成工具狰腌,gettext 工具(安裝完成后將其添加進(jìn)系統(tǒng)環(huán)境變量)和 Poedit工具(用來生成語言包二進(jìn)制文件)
第三步:書寫測試代碼
- 新建 setLan.php 文件,接收前臺傳入?yún)?shù)牧氮,決定使用那個語言包
$lan = isset($_GET [ 'lan' ]) ? $_GET [ 'lan' ] : 'en_US';
if ( $lan == 'zh_CN' ) {
putenv('LANG=zh_CN'); //設(shè)置環(huán)境變量
} elseif ( $lan == 'en_US' ) {
putenv('LANG=en_US');
} else {
putenv('LANG=zh_TW');
}
$domain = 'index'; //域名琼腔,可以任意取個有意義的名字,不過要跟相應(yīng)的.mo文件的文件名相同(不包括擴(kuò)展名)踱葛。
bindtextdomain($domain, "../../locale/" ); //設(shè)置某個域的mo文件路徑
bind_textdomain_codeset($domain, 'UTF-8' ); //設(shè)置mo文件的編碼為UTF-8
textdomain($domain);
- 新建 test.php 渲染 html 頁面
<div style="margin-left:200px">
<div><?php echo gettext('test1');?></div>
</div>
- 進(jìn)入 cmd 界面丹莲,cd 到 test.php 目錄下,執(zhí)行命令
xgettext -d index test.php --from-code=utf-8
index 為生成的 po 文件的名字
- 通過 Poedit 打開 index.po 文價尸诽,編輯保存圾笨,生成 index.mo 二進(jìn)制文件,此文件為語言包文件逊谋,通過該文件實現(xiàn)多語言切換
注意:
1擂达、語言包的目錄結(jié)構(gòu)固定,必須按照下圖書寫
2胶滋、如果想要在老的 po 文件基礎(chǔ)上添加新的字段板鬓,首先到開老的 po 文件,選擇“編目->從 POT 文件更新”究恤,在右下角選擇 PO 翻譯文件俭令,找到新的 po 文件打開,兩文件即能合并到一起部宿;
3抄腔、重新編輯添加新的翻譯字段后瓢湃,可能翻譯無法馬上實現(xiàn),修改語言包文件 mo 的名字即可生效赫蛇。