想想,当您感觉到自己的已经非常牛X的时候,肯定想着自己写一个wordpress,或是discuz了.现在您开始考虑,如何架构一个国际化的(多语言)的程序了。 学会用不同的语言与不同的对手打交道,是纵横天下第一重要的事. 如何开始呢? 我所了解的有三种方案: 方案一:利用模板引擎,每一种语言,制做一套模板.选中不同的模板,就等于选用了不同的语言.模板引擎这玩意儿是已经被我批得不成样子了,因为php本身就是相当不错的模板.不过还是很多人用。您可以尝试smarty,phplib,fast template等。另外国内也有不少人自行开发模板引擎。一年以前,我也是他们中的一员。 方案二:不同的语言包含不同的文件。把要翻译的语句放在单独的文件中,选用不同语言时,require或是include不同的文件。例如: $lang=”en_US”; require(“lang/$lang/lang.php”); echo $msg[“WELCOME”]; ?> 而lang/en_US/lang.php中可能是: $msg[“WELCOME”]=”Welcome to …”; ?> 要改成中文,需要添加lang/zh_CN/lang.php文件: $msg[“WELCOME”]=”欢迎来到…”; ?> 对应的把文件中的代码改为下面的就行了: $lang=”zh_CN”; require(“lang/$lang/lang.php”); echo $msg[“WELCOME”]; ?> 目前大部分的程序,使用这种方法来达到国际化,多语种.比如Xoops.不过xoops在语言包文件中不是用数组来存储翻译的词语的,而是用Define(“MSG_WELCOME”,”欢迎来到…”)来存储的。这个是为了速度能更快.数组和常量存储的方式不一样. 但这样做的缺点也不言而喻。因为,您至少需要做一个语言包(一般而言是英文)而且需要记住那些词条名,比如MSG_WELCOME,MSG_REGISTER_SUCCESS等等.在程序中出现在就是MSG_WELCOME,MSG_REGISTER_SUCCESS这些不易看懂的内容,一旦您的语言包中缺少这一条,显示的就是空的,啥也没有. 方案三:使用Gnu GetText方案.Gnu程序中推荐的是使用GetText函数.这个最初是在C语言中出现的。但是现在php中也有了gettext函数了.Wordpress中就是使用的这种方案. 看看其步骤. 第一步: 使用一个函数将您的字串包起来.您的程序应该写成这样子: //file:test.php echo __(“I am Mr Wung”); function __($msgid) { return $msgid; } ?> 您目前可以加上__($msg)函数的定义,函数可以直接返回msg本身. 第二步:生成语言文件: (在linux中)运行 xgettext –keyword=__ test.php,完成后将会生成一个messages.po文件。内容如下: # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE’S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid “” msgstr “” “Project-Id-Version: PACKAGE VERSIONn” “Report-Msgid-Bugs-To: n” “POT-Creation-Date: 2007-03-20 11:44+0800n” “PO-Revision-Date: YEAR-MO-DA HO:MI+ZONEn” “Last-Translator: FULL NAME n” “Language-Team: LANGUAGE n” “MIME-Version: 1.0n” “Content-Type: text/plain; charset=CHARSETn” “Content-Transfer-Encoding: 8bitn” #: test.php:3 msgid “I am Mr Wung” msgstr “” 您看到了,messages.po中已经把程序中所有用__函数包起来的字符串找出来了。现在您编辑它,将最后一行中的msgstr “”改为msgstr “我是王先生”;将倒数第六行中的charset=CHARSET改为charset=UTF-8; 现在再运行msgfmt messages.po,将会在当前路径生成一个messages.mo文件.这个文件是编译以后的二进制文件,因为messages.po文件用来搜索字符串太慢了. 有了这个文件以后,__()函数就可以在messages.mo文件中进行查找,如果找到了对应的字符串,则可以给出翻译,如果找不到,就会直接返回它本身.而且,您用vim,editplus或是其他文件打开test.php文件,也能从echo __(“I am Mr Wung”)看出这一句是什么用途.相比之下,Xoops方式的echo MSG_I_AM_MR_WUNG;就晦涩多了. 至于__()函数,其实是一个别名,它实际调用了gettext函数.这个函数,在Wordpress中已经给出,是一个open项目.