zoukankan      html  css  js  c++  java
  • php gettext方式实现UTF-8国际化多语言(i18n)

    php gettext方式实现UTF-8国际化多语言(i18n)

    一、总结

    一句话总结:

    二、php gettext方式实现UTF-8国际化多语言(i18n)

    近 来随着i18n(国际化)的逐渐标准化,我也来讲一讲在PHP中如何实现国际化支持。跟其他程序语言一样,在 PHP 也可以利用 gettext 套件写作 i18n 程序,实现 NLS(Native Language Support) 国际化支持,具体请参考官方文档( http://www.gnu.org/software/gettext/manual/gettext.html )

    这里我们主要介绍window平台下使用php的扩展gettext实现程序的国际化。

    gettext简介:
    GNU gettext是翻译项目的重要一步,它提供了一个工作框架,由一些集成的工具和文档组成,帮助程序员、翻译人员和最终用户实现程序的国际化和本地化。用 Gettext的方式实现多语言得到了广泛的支持,著名的BLOG程序wordpress的国际化就是用的GNU gettext。

    大致原理:
    GNU gettext使用PO或MO文件来实现国际化和本地化。PO的意思是Portable Object,是一种文本结构,可以方便的由人们阅读和修改。MO是Machine Object的简写,MO文件是PO文件的二进制形态。一般来说,一个PO或MO文件对应于一种语言,如果一个程序要支持多种语言,每一种语言都需要自己 的PO或MO文件。

    开始应用:

    步骤一:搭建环境(服务器已经完成,环境已经搭建好了)
    1、首先查看你的php扩展目录下是否有php_gettext.dll这个文件,如果没有,这就需要你下载一个或是从其他地方拷贝一个,然后放到php扩展目录。
    2、打开php.ini,查找”;extension=php_gettext.dll“ ,然后去除注释,重启apache。

    若一切顺利,就可以在 phpinfo() 中看到 gettext 字样,至此服务器环境配置完毕。

    步骤二:假如我们要翻译test.php页面里的hello word!这句话。

    编辑test.php,将要翻译 的文字用gettext函数包含,表示这些被包含的文字是需要用来翻译的。

    复制代码
    <?
    include_once ( 'inc/setLan.php' );
    $domain='test' ; //域名,可以任意取个有意义的名字,不过要跟相应的.mo文件的文件名相同(不包括扩展名)。
    bindtextdomain (
    $domain,"locale/" ); //设置某个域的mo文件路径
    bind_textdomain_codeset($domain,'UTF-8' ); //设置mo文件的编码为UTF-8
    textdomain($domain ); //设置gettext()函数从哪个域去找mo文件
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>title</title>
    </head>
    <body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966" alink="#FFCC99">
    <?= gettext ( 'hello world.' ) ?>
    </body>
    </html>
    复制代码
     

    这里的setLan.php组件是用来接收语言参数的,当调用test.php?lan=zh_CN的时候,则显示中文翻译后的页面,调用 test.php?lan=zh_TW,则显示繁体翻译后的页面,当没有参数的情况,则默认根据http头信息里的语言进行显示,如果头信息里的语言我们 没有提供语言包,则默认显示gettext函数里包含的文字。
    setLan.php代码:

    复制代码
    <?php
    $lan=$_REQUEST [ 'lan' ];
    if ( $lan=='zh_CN' ){
    putenv('LANG=zh_CN' );
    setlocale(LC_ALL,'zh_CN' ); //指定要用的语系,如:en_US、zh_CN、zh_TW
    }elseif ( $lan=='zh_TW' ){
    putenv('LANG=zh_TW' );
    setlocale(LC_ALL,'zh_TW' ); //指定要用的语系,如:en_US、zh_CN、zh_TW
    }elseif ( $lan=='en_US' ) {
    putenv('LANG=en_US' );
    setlocale(LC_ALL,'en_US' ); //指定要用的语系,如:en_US、zh_CN、zh_TW
    }
    ?>
    复制代码
     

    步骤三:编辑好了test.php后,我们就应该对这个页面生成对应的语言包(test.po和test.mo文件)

    要生成语言包,我们需要借助两款工具:

    1、gettext工具下载地址:http://nchc.dl.sourceforge.net/sourceforge/gnuwin32/gettext-0.14.4.exe

    (用来生成po文件,安装好了以后,需要把”安装路径/bin”添加到系统环境变量path里
    2、Poedit工具下载地址:http://www.poedit.net/download.php (用来编辑po文件,编辑需要翻译的语言,最后自动生成mo文件)

    假设我们都安装好了这些软件,现在我们开始对test.php进行翻译工作。打开命令提示符cmd,切换到test.php所在的目录。

    输入 xgettext -d test test.php --from-code=utf-8 (当你要翻译的页面为index.php,只需要将蓝色部分改为index即可),然后执行,这时候你可以在test.php所在目录看到新生成的文件test.po

    用poedit工具打开test.po,然后针对这些语言翻译成我们对应的语言,保存后poedit会自动生产mo文件(unicode二进制码)。

    将po文件和mo文件放入项目目录

    /locale/language/LC_MESSAGES/test.po
    /locale/language/LC_MESSAGES/test.mo


    如我们放入的是简体中文,则放入:

    /locale/zh_CN/LC_MESSAGES/test.po
    /locale/zh_CN/LC_MESSAGES/test.mo

    如我们放入的是繁体中文,则放入:

    /locale/zh_TW/LC_MESSAGES/test.po
    /locale/zh_TW/LC_MESSAGES/test.mo

    OK。一切都非常顺利,我们开始访问测试下多语言吧。访问test.php?lan=zh_CN则显示简体,访问test.php?lan=zh_TW显示繁体。有什么问题,留言共同讨论 :)

    php 通过include方式实现国际化多语言(i18n) :

     

     

    最后记得要 重启Apache,方可看到效果。

     

     

     

    ++++++++++++++++++++++++++++++++++++++++++

    ++++++++++++++++++++++++++++++++++++++++++

    ++++++++++++++++++++++++++++++++++++++++++

    如何将多个文件的语言翻译放到同一个.mo文件中???

     

     

     

    如下图,测试项目文件结构如下:

     

     

    现想把 前台文件 test.php,test2.php 等文件的语言包等放集中放在cn.mo文件中,操作如下:

    只需要把 test.php,test2.php 等文件的 语言包“域”都设置为“cn”,并且在对每个php文件生成.mo文件时,以追加的形式添加到“域cn” 即可。

     

    test.php 文件内容如下:

     

    复制代码
    <?
    putenv ('LANG=zh_CN' );
    setlocale ( LC_ALL,'zh_CN' );
    //定义要用的语言文件名称
    $domain='cn' ;
    bindtextdomain (
    $domain,dirname(__FILE__).'/locale' ); //设置某个域的mo文件路径
    bind_textdomain_codeset($domain,'UTF-8' ); //设置mo文件的编码为UTF-8
    textdomain($domain ); //设置gettext()函数从哪个域去找mo文件
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>title</title>
    </head>
    <body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966" alink="#FFCC99">
    <?=gettext ('hello world.') ?>
    </body>
    </html>
    复制代码

     

    生成.po文件命令如下:

    xgettext -d cn test.php --from-code=utf-8

     

     

     

    test2.php 文件内容如下:

     

     

    复制代码
    <?
    putenv ('LANG=zh_CN' );
    setlocale ( LC_ALL,'zh_CN' );
    //定义要用的语言文件名称
    $domain='cn' ;
    bindtextdomain (
    $domain,dirname(__FILE__).'/locale' ); //设置某个域的mo文件路径
    bind_textdomain_codeset($domain,'UTF-8' ); //设置mo文件的编码为UTF-8
    textdomain($domain ); //设置gettext()函数从哪个域去找mo文件
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>title</title>
    </head>
    <body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966" alink="#FFCC99">
    <?=gettext ('woshishui') ?>
    </body>
    </html>
    复制代码

     

    生成.po文件命令如下: (注意,此时多加了一个命令参数 -j ,表明是以追加的形式添加语言包的。)

    xgettext -d cn test.php -j --from-code=utf-8

     

    最终生成的 .po 文件效果如下:

     

     

     

    最后把 生成的 “cn.po”、“cn.mo” 文件拷贝到文件夹 “localezh_CNLC_MESSAGES” 中。

    最最后就是重启下Apache啦。

     

     

     

    附:wordpress之模板汉化(poedit的使用技巧 及 .po .mo 批量生成技术)

     

     

  • 相关阅读:
    I.MX6 Surfaceflinger 机制
    理解 Android Fragment
    RPi 2B DDNS 动态域名
    RPi 2B IPC webcam server
    理解 Android MVP 开发模式
    I.MX6 system.img unpack repack
    can't set android permissions
    VMware Ubuntu 共享文件夹
    解决oracle数据库连接不上的问题
    perfect-scrollbar示例
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9302451.html
Copyright © 2011-2022 走看看