ctrl+c vPHP的gettext用法 gettext程序在Linux/Unix世界中很常见,但一般人日常使用的机会不多。它用来为应用程序添加国际化支持。举个例子,如果一个程序中的字符串资源没有硬编码在程序源文件中,而是以一种语言包的文件存在的,那么就可以通过添加语言包文件来改变程序界面的语言。gettext就可以做这种事。Windows下的PHP5中已经带有了gettext扩展,Zend Server也以带有该扩展。在php.ini文件中将“extension=php_gettext.dll”前面的分号去掉,重启Apache,如果一切正常的话,在phpinfo()的输出中应该会有gettext一节。下面有一个简单的“Hello World”的例子来看看如何用gettext来达到支持多语言的目的。创建一个PHP文件test.php,内容如下:
<?php
putenv(“LANG=zh_CN”);
setlocale(LC_ALL, ‘zh_CN’);bindtextdomain(‘test’, ‘./locale’);
textdomain(‘test’);echo gettext(‘Hello World!’);
?>开头两行代码设置语言环境为’zh_CN’,也就是简体中文。bindtextdomain设置域test的目录为当前目录下的locale目录。textdomain(’text’)告诉PHP解释器,gettext函数要去test域中去寻找替代字符串。在浏览器中打开这个文件,可以看到结果为“Hello World”,只是原样输出而已,因为还没有制作中文语言包。要让浏览器输出中文而不改变源程序,需要准备两个文件,PO和MO文件。为了得到这两个文件,需要使用xgettext和msgfmt两个程序。Windows用户可以去GnuWin32下载GetText软件包,里面就有这两个程序。接着建立相应的目录结构。在test.php的目录下建立“locale\zh_CN\LC_MESSAGES”这样的目录。目录名zh_CN一定要和代码中的语言名称zh_CN相同。然后在命令提示符下执行:
xgettext -d test test.php
“-d test”表示domain为“test”,这会在当前目录下生成test.po这个文件。用文本编辑器打开它,做如下修改:…
“Content-Type: text/plain; charset=GB2312\n”
“Content-Transfer-Encoding: 8bit\n”#: test.php:11
msgid “Hello World!”
msgstr “你好,世界!”即将charset设置为中文编码“GB2312”,将相应的msgid中的英文字符串翻译成中文填入到下面的msgstr中。接下来用msgfmt生成MO文件。MO是一个二进制格式的文件,gettext从它里面提取字符串资源。在命令提示符中执行以下命令可以从刚刚修改的PO文件得到MO文件:
msgfmt -o test.mo test.po最后将test.po和test.mo放在locale\zh_CN\LC_MESSAGES目录下,刷新浏览器,即可看到显示的是中文。对于使用gettext的PHP程序来说,gettext函数往往用的非常多。因此在PHP中可以使用“_”来代替“gettext”,所以gettext(”Hello World!”)也可以写成“_(”Hello World!”)”。

解决方案 »

  1.   

    $lang=array('title'=>'hello'); 存放于lang/en $lang=array('title'=>'你好');  存放于lang/zh 文件名lang.php地址栏参数http://xxxx.com?l=zhinclude("lang/".$_GET['l']."/lang.php")
    echo $lang['title'];大功告成
      

  2.   


    我就想明白 CMS当中的语言包到底是怎么载入 HTML页面的 找了好多答案 哎
      

  3.   

    也就是 静态的html页面,如何实现文字和页面分离?
      

  4.   

    这其中要用到缓存技术  就是不想混编 php中也不想有汉字  都用 字符串代替
      

  5.   

    维护多个语言包PO 以及编译后的MO文件,查找一下PHP可以完成
      

  6.   

    http://code.google.com/a/apache-extras.org/p/phpmailer/downloads/list
    这是php发邮件的phpmailer,就两百多K,里面有多国语言包,可以下载了看下是怎么调用的。
      

  7.   

    php有个解析配置文件的函数 parse_ini_file() 可以据此写个类。
      

  8.   

    呵呵
    5楼的还没达到我要的效果没能实现 PHP  也和HTML 分离
      

  9.   

    5楼和其它楼的方法只是解决多语言的问题,
    php和html分离是另一个问题如果你有"你要的效果",你需要详细表述
      

  10.   

    那我给个,按5楼的再简单一点地址栏参数http://xxxx.com?l=zh$lang=array('en_title'=>'hello','zh_title'=>'你好');
    $lang=$GET['l'];
    echo $lang[$lang.'_title'];
      

  11.   

    看见你发了好几个帖子,最终都是为了这个方案.
    方案的主要想法应该就是把语言替换延迟到客户端用js完成.但是...
    不知道你有没有想过,这个似乎完全没有必要做这个延迟,
    在smarty做解析的那步,本身就是对变量做分析替换.
    只要按楼上的各种做法得到语言变量,将不同的语言包变量传进smarty或者
    写smarty插件在模板中调用gettext,
    就可以直接输出该语言的html页面,何必再用js做?用js做的后果一个是如楼上所说不利于seo
    另外也慢..
    尤其js错误的情况下更可能导致整个页面没有被翻译....输出一整页"代码"
      

  12.   


    主要 我看了一个cms这么写的 
    觉得很简洁
    所以想试试
      

  13.   

    把需要多语言的文字放在单独的变量中
    /language/cn.php
    /language/tw.php
    /language/en.php
    放文字的地方 写变量就行了,根据选择的语言包含不同的语言文件就可以了
    例如 cn.php  
    $lang = array('home'=>'首页',‘news'=>'新闻');
    用的时候  include('language/'.$_GET['lang'].'.php';
    <a href="#"><?php echo $lang['home'] ?></a>
    大概是这意思,复杂一些,可以多个语言文件放在单独的语言文件夹例如/language/cn/index.php
      

  14.   

    如果你是专来搞多语言的,建议你看一下zendframe的tranlsate类及mediawiki的多语实现。
      

  15.   

    以前没有系统总结,这回看了也有所温故。使用语言包是必须的,在这里讲的再详细也不如实际的看看,楼主可以去下个discuz来看一下,里面很详细的有语言包的使用
      

  16.   


    我个人觉得这样还不如PHPMYADMIN的处理方便。
      

  17.   


    我就想明白 CMS当中的语言包到底是怎么载入 HTML页面的 找了好多答案 哎模板引擎,解析!  首先把字库写好,然后根据需要进行匹配,通过模板输出!