xuanhan863 发表于 2011-12-22 08:54

通过gettext方式实现国际化(i18n)

转载自:http://www.lfyzjck.com/2010-12-29/399.html<br><br>实现国际化的方式比较多,很多php framework都内置i18n支持,但大部分是基于PHP的数组实现的,这种方法并不推荐。目前最为流行也最通用的方法是gettext。
<blockquote><p>Gettext 用于系统的国际化(I18N)和本地化(L10N),可以在编译程序的时候使用本国语言支持(Native Language Support(NLS)),其可以使程序的输出使用用户设置的语言而不是英文.</p></blockquote>
<p>关于gettext的更多资料请参见:<a href="http://oss.org.cn/man/linux/lfs/htmlbook/appendixa/gettext.html" target="_blank">http://oss.org.cn/man/linux/lfs/htmlbook/appendixa/gettext.html</a></p>
<p>下面说说如何利用gettext在你的PHP程序中实现国际化。<br>
<span id="more-399"></span><br>
一、检查环境需求</p>
<p>首先查看phpinfo(),确保你的PHP启用了gettext扩展。如果启用了gettext,在phpinfo页面中应该能看到以下信息:</p>
<div id="attachment_424" class="wp-caption aligncenter" style="width: 626px"><a href="http://www.lfyzjck.com/wp-content/uploads/2010/12/gettext_snapshot.png" target="_blank"><img class="size-full wp-image-424" title="gettext_snapshot" src="http://www.lfyzjck.com/wp-content/uploads/2010/12/gettext_snapshot.png" alt="gettext" width="616" height="95"></a><p class="wp-caption-text">gettext</p></div>
<p>如果没有找到,请修改php.ini以启用该扩展</p>
<p>二、为你的项目新建locale文件夹</p>
<p>gettext涉及到两个文件,*.po是翻译源文件,里面储存了项目中所有待翻译的字符串和翻译后的结果;*.mo文件是po文件编译后二进制文件,真正读取翻译信息的时候是从mo文件中读取的,所以这个文件也是必不可少的。</p>
<p>gettext对目录要求比较死,你必须把国际化文件放在指定目录,大部分使用gettext不成功都是由于po文件和mo文件没有放对位置导致的,下面举例看一个典型项目目录树:</p>
<p><a href="http://www.lfyzjck.com/wp-content/uploads/2010/12/dirtree.png" target="_blank"><img src="http://www.lfyzjck.com/wp-content/uploads/2010/12/dirtree.png" style="display: block;" class="aligncenter size-full wp-image-426" title="dirtree" alt="" width="234" height="249"></a>通常的做法是在项目根目录新建一个叫做locale的文件夹,接着以你要翻译的目标语言的language code为名的文件夹,比如简体中文的language code就是zh_CN,详细的i18n规定的language code可以参考:<a href="http://en.wikipedia.org/wiki/Language_localisation" target="_blank">http://en.wikipedia.org/wiki/Language_localisation</a>(这个真的找了我好久,实在找不到更好的了)</p>
<p>三、初始化i18n环境</p>
<p>这个主要是在程序端进行简单的设置,下面给个简单的例子:</p>

<div class="wp_codebox"><table><tbody><tr id="p3991"><td class="line_numbers">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</td><td class="code" id="p399code1"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">//定义要翻译的目标语言及po文件的编码</span>
<span style="color: #000088;">$locale</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">"zh_CN.utf8"</span><span style="color: #339933;">;</span>
<a href="http://www.php.net/setlocale" target="_blank"><span style="color: #990000;">setlocale</span></a><span style="color: #009900;">(</span>LC_ALL<span style="color: #339933;">,</span> <span style="color: #000088;">$locale</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//设置翻译文本域,下面的代码就会让程序去locale/zh_CN/LC_MESSAGES/default.mo去寻找翻译文件</span>
<a href="http://www.php.net/bindtextdomain" target="_blank"><span style="color: #990000;">bindtextdomain</span></a><span style="color: #009900;">(</span><span style="color: #0000ff;">"default"</span><span style="color: #339933;">,</span> <a href="http://www.php.net/dirname" target="_blank"><span style="color: #990000;">dirname</span></a><span style="color: #009900;">(</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">)</span><span style="color: #339933;">.</span><span style="color: #0000ff;">"/locale"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<a href="http://www.php.net/textdomain" target="_blank"><span style="color: #990000;">textdomain</span></a><span style="color: #009900;">(</span><span style="color: #0000ff;">"default"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;!</span>DOCTYPE html <span style="color: #000000; font-weight: bold;">PUBLIC</span> <span style="color: #0000ff;">"-//W3C//DTD XHTML 1.1//EN"</span> <span style="color: #0000ff;">"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>html xmlns<span style="color: #339933;">=</span><span style="color: #0000ff;">"http://www.w3.org/1999/xhtml"</span> xml<span style="color: #339933;">:</span>lang<span style="color: #339933;">=</span><span style="color: #0000ff;">"zh"</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span>
    <span style="color: #339933;">&lt;</span>meta http<span style="color: #339933;">-</span>equiv<span style="color: #339933;">=</span><span style="color: #0000ff;">"Content-Type"</span> content<span style="color: #339933;">=</span><span style="color: #0000ff;">"text/html;charset=UTF-8"</span> <span style="color: #339933;">/&gt;</span>
    <span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?</span>php <span style="color: #b1b100;">echo</span> _<span style="color: #009900;">(</span><span style="color: #0000ff;">'Title'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #339933;">&lt;/</span>title<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;</span>
        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> _<span style="color: #009900;">(</span><span style="color: #0000ff;">"Hello<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #009900;">)</span><span style="color: #339933;">;;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></td></tr></tbody></table></div>

<p>更多关于PHP国际化的函数请参见:<a href="http://cn2.php.net/manual/en/book.gettext.php" target="_blank">http://cn2.php.net/manual/en/book.gettext.php</a><br>
四、建立po文件档</p>
<p>到这一步方法就比较多了,当然可以手动建立,不过这样子一个最大的缺点就是你不知道项目中哪些字符串需要翻译,这里推荐下一个软件——PoEdit,Windows平台和Linux都是适用的。</p>
<p>选择文件-&gt;新建消息目录文档,填好一些必要信息,注意如果目标语言是中文的话,由于中文是双字节字符,所以最好在“复数形式”填上 “nplurals=2; plural=(n!=1);”(没有引号),如下图</p>
<p><a href="http://www.lfyzjck.com/wp-content/uploads/2010/12/poedit1.png" target="_blank"><img src="http://www.lfyzjck.com/wp-content/uploads/2010/12/poedit1.png" style="display: block;" class="aligncenter size-full wp-image-428" title="poedit" alt="poedit" width="500"></a>然
后将项目所在文件夹加入到“路径”中,设置好翻译所用的关键字,PoEdit就会自动搜索项目中所有待翻译的字符串,生成po文件。翻译完成后选择“保
存”,PoEdit会自动生成mo文件。以后每次项目中待翻译字符串有更新,只要打开PoEdit选择类目-&gt;从源更新,就好了</p>
<p>这样的思路不仅适用于PHP,其他语言都大同小异,前段时间做django一个项目的翻译,也仅仅是建立po文件更加方便了,其他步骤十分类似。大家举一反三就好了,尤其注意下目录结构,这个是最容易出现问题的地方。</p>
页: [1]
查看完整版本: 通过gettext方式实现国际化(i18n)