免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1932 | 回复: 0
打印 上一主题 下一主题

通过gettext方式实现国际化(i18n) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:54 |只看该作者 |倒序浏览
转载自:http://www.lfyzjck.com/2010-12-29/399.html

实现国际化的方式比较多,很多php framework都内置i18n支持,但大部分是基于PHP的数组实现的,这种方法并不推荐。目前最为流行也最通用的方法是gettext。

Gettext 用于系统的国际化(I18N)和本地化(L10N),可以在编译程序的时候使用本国语言支持(Native Language Support(NLS)),其可以使程序的输出使用用户设置的语言而不是英文.

关于gettext的更多资料请参见:http://oss.org.cn/man/linux/lfs/htmlbook/appendixa/gettext.html

下面说说如何利用gettext在你的PHP程序中实现国际化。

一、检查环境需求

首先查看phpinfo(),确保你的PHP启用了gettext扩展。如果启用了gettext,在phpinfo页面中应该能看到以下信息:

gettext

gettext

如果没有找到,请修改php.ini以启用该扩展

二、为你的项目新建locale文件夹

gettext涉及到两个文件,*.po是翻译源文件,里面储存了项目中所有待翻译的字符串和翻译后的结果;*.mo文件是po文件编译后二进制文件,真正读取翻译信息的时候是从mo文件中读取的,所以这个文件也是必不可少的。

gettext对目录要求比较死,你必须把国际化文件放在指定目录,大部分使用gettext不成功都是由于po文件和mo文件没有放对位置导致的,下面举例看一个典型项目目录树:

通常的做法是在项目根目录新建一个叫做locale的文件夹,接着以你要翻译的目标语言的language code为名的文件夹,比如简体中文的language code就是zh_CN,详细的i18n规定的language code可以参考:http://en.wikipedia.org/wiki/Language_localisation(这个真的找了我好久,实在找不到更好的了)

三、初始化i18n环境

这个主要是在程序端进行简单的设置,下面给个简单的例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php //定义要翻译的目标语言及po文件的编码 $locale = "zh_CN.utf8"; setlocale(LC_ALL, $locale);   //设置翻译文本域,下面的代码就会让程序去locale/zh_CN/LC_MESSAGES/default.mo去寻找翻译文件 bindtextdomain("default", dirname(__FILE__)."/locale"); textdomain("default"); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title><?php echo _('Title'); ?></title> </head> <body> <?php echo _("Hello\n");; ?> </body> </html>

更多关于PHP国际化的函数请参见:http://cn2.php.net/manual/en/book.gettext.php
四、建立po文件档

到这一步方法就比较多了,当然可以手动建立,不过这样子一个最大的缺点就是你不知道项目中哪些字符串需要翻译,这里推荐下一个软件——PoEdit,Windows平台和Linux都是适用的。

选择文件->新建消息目录文档,填好一些必要信息,注意如果目标语言是中文的话,由于中文是双字节字符,所以最好在“复数形式”填上 “nplurals=2; plural=(n!=1);”(没有引号),如下图

poedit然 后将项目所在文件夹加入到“路径”中,设置好翻译所用的关键字,PoEdit就会自动搜索项目中所有待翻译的字符串,生成po文件。翻译完成后选择“保 存”,PoEdit会自动生成mo文件。以后每次项目中待翻译字符串有更新,只要打开PoEdit选择类目->从源更新,就好了

这样的思路不仅适用于PHP,其他语言都大同小异,前段时间做django一个项目的翻译,也仅仅是建立po文件更加方便了,其他步骤十分类似。大家举一反三就好了,尤其注意下目录结构,这个是最容易出现问题的地方。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP