PHP中使用gettext解决国际化问题的例子(i18n)

 更新时间:2014年06月13日 11:31:38   投稿:junjie  
这篇文章主要介绍了PHP中使用gettext解决国际化问题的例子,即实现i18n,需要的朋友可以参考下

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

Gettext 用于系统的国际化(I18N)和本地化(L10N),可以在编译程序的时候使用本国语言支持(Native Language Support(NLS)),其可以使程序的输出使用用户设置的语言而不是英文. 关于gettext的更多资料请参见: 下面说说如何利用gettext在你的PHP程序中实现国际化。


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

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

二、为你的项目新建locale文件夹 gettext涉及到两个文件,*.po是翻译源文件,里面储存了项目中所有待翻译的字符串和翻译后的结果;*.mo文件是po文件编译后二进制文件,真正读取翻译信息的时候是从mo文件中读取的,所以这个文件也是必不可少的。 gettext对目录要求比较死,你必须把国际化文件放在指定目录,大部分使用gettext不成功都是由于po文件和mo文件没有放对位置导致的,下面举例看一个典型项目目录树:



三、初始化i18n环境 这个主要是在程序端进行简单的设置,下面给个简单的例子:

复制代码 代码如下:

< ?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">
< ?php echo _("Hello\n");; ?>



四、建立po文件档

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

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



然后将项目所在文件夹加入到“路径”中,设置好翻译所用的关键字,PoEdit就会自动搜索项目中所有待翻译的字符串,生成po文件。翻译完成后选择“保存”,PoEdit会自动生成mo文件。以后每次项目中待翻译字符串有更新,只要打开PoEdit选择类目->从源更新,就好了 这样的思路不仅适用于PHP,其他语言都大同小异,前段时间做django一个项目的翻译,也仅仅是建立po文件更加方便了,其他步骤十分类似。大家举一反三就好了,尤其注意下目录结构,这个是最容易出现问题的地方。

相关文章

  • 使用PHP+Redis实现延迟任务,实现自动取消订单功能

    使用PHP+Redis实现延迟任务,实现自动取消订单功能

    这篇文章主要介绍了用PHP+Redis实现延迟任务,实现自动取消订单功能,通过业务场景给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • PHP中把stdClass Object转array的几个方法

    PHP中把stdClass Object转array的几个方法

    PHP和JS通讯通常都用json,但用 json 传过来的数组并不是标准的array,而是 stdClass 类型。那么我们可以参考下面的几个方法进行转换。
    2014-05-05
  • Laravel认证原理以及完全自定义认证详解

    Laravel认证原理以及完全自定义认证详解

    最近在学习laravel框架,所以下面这篇文章主要给大家介绍了关于Laravel认证原理以及完全自定义认证的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • 使用php方法curl抓取AJAX异步内容思路分析及代码分享

    使用php方法curl抓取AJAX异步内容思路分析及代码分享

    怎样抓取AJAX网站的内容?这是一个热门的问题,也是一个棘手的问题。但实际上呢,抓取ajax异步内容的页面和抓普通的页面区别不大。ajax只不过是做了一次异步的http请求,只要使用firebug类似的工具,找到请求的后端服务url和传值的参数,然后对该url传递参数进行抓取即可
    2014-08-08
  • php定界符<<<使用技巧和实例

    php定界符<<<使用技巧和实例

    这篇文章主要介绍了php定界符<<<使用技巧和实例,讲解了定界符的功能和使用注意事项等,需要的朋友可以参考下
    2014-06-06
  • PHP扩展框架之Yaf框架的安装与使用

    PHP扩展框架之Yaf框架的安装与使用

    这篇文章主要介绍了PHP扩展框架之Yaf框架的安装与使用的相关资料,具有参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • 详解PHP中curl_multi并发的实现

    详解PHP中curl_multi并发的实现

    这篇文章主要介绍了详解PHP中curl_multi并发的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 浅谈Laravel队列实现原理解决问题记录

    浅谈Laravel队列实现原理解决问题记录

    本篇文章主要介绍了浅谈Laravel队列实现原理解决问题记录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • CodeIgniter钩子用法实例详解

    CodeIgniter钩子用法实例详解

    这篇文章主要介绍了CodeIgniter钩子用法,分析说明了CodeIgniter中钩子的概念并结合实例形式演示了钩子的使用技巧,需要的朋友可以参考下
    2016-01-01
  • php 调用百度sms来发送短信的实现示例

    php 调用百度sms来发送短信的实现示例

    这篇文章主要介绍了php 调用百度sms来发送短信的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11

最新评论