(全文转自: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页面中应该能看到以下信息:
如果没有找到,请修改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就会自动搜索项目中所有待翻译的字符串,生成po文件。翻译完成后选择“保 存”,PoEdit会自动生成mo文件。以后每次项目中待翻译字符串有更新,只要打开PoEdit选择类目->从源更新,就好了
这样的思路不仅适用于PHP,其他语言都大同小异,前段时间做django一个项目的翻译,也仅仅是建立po文件更加方便了,其他步骤十分类似。大家举一反三就好了,尤其注意下目录结构,这个是最容易出现问题的地方。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述