通过 gettext 扩展实现多语言

  • 由于准备做一个国际商城,因此避免不了要进行多语言的切换,目前第一版只做中英文的切换;在网上查找了很多资料,实现的方式基本大同小异;不同的语言生成不同的语言包文件,或者通过前端调用渲染页面,或者直接通过后端渲染;比较之后决定采取 php 的 gettext 来实现多语言;

第一步:确保本地启用 gettext 扩展,win 下,打开 php.ini 配置文件,去掉 extension=php_gettext.dll 前面的 “;”,保存重启服务;
第二步:现在语言包生成工具,gettext 工具(安装完成后将其添加进系统环境变量)和 Poedit工具(用来生成语言包二进制文件)
第三步:书写测试代码

  • 新建 setLan.php 文件,接收前台传入参数,决定使用那个语言包
$lan  =  isset($_GET [ 'lan' ]) ? $_GET [ 'lan' ] : 'en_US';  
if ( $lan  ==  'zh_CN' ) {  
    putenv('LANG=zh_CN');         //设置环境变量
} elseif ( $lan  ==  'en_US' ) {  
    putenv('LANG=en_US');
} else {
    putenv('LANG=zh_TW');
}
$domain  =  'index';     //域名,可以任意取个有意义的名字,不过要跟相应的.mo文件的文件名相同(不包括扩展名)。
                    
bindtextdomain($domain,  "../../locale/" ); //设置某个域的mo文件路径    
bind_textdomain_codeset($domain,  'UTF-8' );  //设置mo文件的编码为UTF-8    
textdomain($domain);
  • 新建 test.php 渲染 html 页面
<div style="margin-left:200px">
    <div><?php echo gettext('test1');?></div>
</div>
  • 进入 cmd 界面,cd 到 test.php 目录下,执行命令

xgettext -d index test.php --from-code=utf-8
index 为生成的 po 文件的名字

  • 通过 Poedit 打开 index.po 文价,编辑保存,生成 index.mo 二进制文件,此文件为语言包文件,通过该文件实现多语言切换

注意:
1、语言包的目录结构固定,必须按照下图书写

image.png

2、如果想要在老的 po 文件基础上添加新的字段,首先到开老的 po 文件,选择“编目->从 POT 文件更新”,在右下角选择 PO 翻译文件,找到新的 po 文件打开,两文件即能合并到一起;
3、重新编辑添加新的翻译字段后,可能翻译无法马上实现,修改语言包文件 mo 的名字即可生效。

推荐阅读更多精彩内容