php多语言gettext实施步骤[原创]
广告投放★自助友情CMS落伍广告联盟晒乐广告联盟脉动广告联盟品味广告联盟
广告位可自定样式联系QQ:4285248个文字广告月20元广告联系QQ:428524广告位可自定样式
8个文字广告月20元黄金广告位每月20元广告位可自定样式联系QQ:428524广告位可自定样式
左旋肉碱、全国包邮
买二送一、无效退款

文章浏览→编程相关Php编程→php多语言gettext实施步骤[原创]

php多语言gettext实施步骤[原创]
php多语言gettext实施步骤[原创]

道德三皇五帝,功名夏侯商周,英雄五霸闹春秋,顷刻兴亡过手,青史几行名姓,北邙无数荒丘,前人田地后人收,说甚龙争虎斗。
各位压言稳坐,咱们书归正听。

话说web方面的多语言版本已经不是什么阳春白雪的东西了,但是实现方式无非那么几种,杂乱无章嵌在程序里面的,在程序里面使用专用语言文件的,使用模板引擎加载不同语言模板的,使用高级框架集依靠其中的多语言支持的。当然,上述方案一种比一种高级,不过,选方案和逛超市买东西时一样的,只选对的不选贵的,高级的东西不一定合适你,下里巴人的东西也不一定就需要遭到唾弃。不过,今天我们介绍一个新方法,gettext。

做过linux下编程的筒子都知道,gettext机制是linux下实现i18n的一种比较成熟的解决方案,他通过编译语言文件并加在这些东西实现了让应用程序挂接不同的语言资源达成多语言的事实。其实在php下我们也有一套多语言的gettext模块,他借助系统的gettext功能实现了我们熟知的模式。

在网络上搜集了一下相关资料,发现都比较零散,也没有现成的封装可以支持类似应用。于是重新整理了一下。具体方式如下:

第一步,系统准备:

1、查看一下你的系统当前的语言会是什么样子,你可是使用localedef--list-archive,这是一个安装后系统自带的语言定义的列表。其实所谓i18n他所代表的不光是语言,它还包括货币、时间等等多种与不同国家有关的定义。这个列表就是告诉你,你现在的系统中具备哪些已经存在的定义,比如中国大陆通常就会是zh_CN。由于linux系统是大小写敏感的,所以你的应用的语言描述必须与这里面定义的有关,否则你将来可能无法找到资源。

2、按照通常情况下,系统中对各种语言命名都是有自己的要求的,比如日文就是ja_JP,中文繁体就是zh_TW,每一种语言同时还会对应一种语言编码,用来解释其中的文字。刚才提到命名一定要严格按照系统规定来弄,否则你就找不到语言资源,也就无法给你达成翻译了。但是,事实上,由于各自应用系统由来已久,且系统设计之初对于语言的要求可能都有自己的命名规则,甚至是因为当时的一些错误导致了一些语言命名方面的小问题,比如我们的系统对于中文简体和英文则简单命名为cn和en,这样显然是不规范的。那么我们其实可以考虑给系统增加支持让系统适应我们的应用程序。我们可以使用下述方法:

localedef -i en_US -f UTF-8 en

第一个参数时配置信息,就是我刚才提到的包括时区、货币等等的一个信息包,第二个参数是字符集,按照我们系统的要求通常都是要求选用UTF-8,第三个就是你个性化的名字了。

这个命令通常是要在/usr/lib/locale目录下执行,因为这样你可以借用系统已经准备好的语言配置信息,当然,如果你用的语言比较特殊体统没给你准备,你也可以查一下locale相关信息,自己弄配置。

好,现在准备工作就绪,我们可以开始部署第二个部分了。

第二步,使用gettext

1、这里,我们用到的主要方法包括

setlocale,这个适用于设定系统语言项的,它实际上指导了运行你下面的应用的时候,gettext读取那样的系统配置信息。相信情况请了解linux中locale相关的知识。这里我们通常会直接设定LC_ALL对系统语言方面的配置进行全盘设定。

bind_textdomain_codeset,这个用于和gettext说好,我们将来时使用什么语言解释的。这里面有一个问题时机出现且很神奇,我至今都没弄明白。我们使用gettext最终编译好的语言文件按照我们的编译设定可以指定为UTF-8,我也是这么做的,但是,如果你在这里设定为使用big5(举个例子),他竟然可以按照big5的方式输出编码,也就是说,看起来不知道什么时候语言资源文件中的UTF-8就变成真正的big5了。我觉得这可能和linux的语言机制有关,鉴于本人才疏学浅,实在无法参透其中玄机,有知情的筒子还望不吝赐教,小的谢过了。

textdomain一个域标识,我通常都是理解为项目标识,其实她是制定了你需要获取那个名称的资源,这里面决定了他最终会去哪里找到xxx.mo。

bindtextdomain,结合上面的域标识,可以绑定一个初始目录上去。事实上,我们以下面的这个目录为例:

/home/potty/myprotest/zh/LC_MESSAGES/pottytest.mo

上面这个语言文件是这样指定的。

bindtextdomain设定了/home/potty/myprotest/

setlocale设定了zh/

gettext系统模块为我们设定了LC_MESSAGES/

textdomain设定了pottytest.mo

第三步,准备语言资源

1、系统中所有语言资源都是使用gettext()函数进行标注的,这样将来就可以自动提取供编译之用,我们也可以使用替代函数_(),这会使得程序看起来更拉风。

2、所有标注完成之后,我们需要尝试将语言文件提取出来,我们可以这样做

xgettext --from-code=UTF-8 --default-domain=potty../../*.php

这里面指定了需要提取的文件,还有域和编码。

3、编译成二进制文件。虽然说是一种二进制文件,但是看起来似乎尽是增加了二进制头信息,甚至一些人讲他似乎只是让文本变得更紧凑了。我们可以这样做

msgfmt --output-file=potty.mo potty.po

这里指定了输入输出文件。

好了,现在我们需要做的都好了,附代码一份,可以直接使用,里面也配备了自动编译和提取的方法。因为使用了系统功能调用,所以建议进行系统安全配置之后再行使用。能力有限,代码不规范之处敬请见谅。

 

 编辑失败,代码另附

 

我的更多文章:
所属分类:编程相关Php编程    作者:荡凯网络    时间:2010-7-25 5:12:00

文章导航