`
162cm
  • 浏览: 51959 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

php高手之路之—纵横天下

    博客分类:
  • php
阅读更多
想想,当您感觉到自己的已经非常牛X的时候,肯定想着自己写一个wordpress,或是discuz了.现在您开始考虑,如何架构一个国际化的(多语言)的程序了。
学会用不同的语言与不同的对手打交道,是纵横天下第一重要的事.
如何开始呢?
我所了解的有三种方案:
方案一:利用模板引擎,每一种语言,制做一套模板.选中不同的模板,就等于选用了不同的语言.模板引擎这玩意儿是已经被我批得不成样子了,因为php本身就是相当不错的模板.不过还是很多人用。您可以尝试smarty,phplib,fast template等。另外国内也有不少人自行开发模板引擎。一年以前,我也是他们中的一员。
方案二:不同的语言包含不同的文件。把要翻译的语句放在单独的文件中,选用不同语言时,require或是include不同的文件。例如:

1.

$lang=”en_US”;
require(”lang/$lang/lang.php”);
echo $msg["WELCOME"];
?>

而lang/en_US/lang.php中可能是:

1.

$msg["WELCOME"]=”Welcome to …”;
?>

要改成中文,需要添加lang/zh_CN/lang.php文件:

1.

$msg["WELCOME"]=”欢迎来到…”;
?>

对应的把文件中的代码改为下面的就行了:

1.

$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中就是使用的这种方案.
看看其步骤.
第一步:
使用一个函数将您的字串包起来.您的程序应该写成这样子:

1.

//file:test.php
echo __(”I am Mr Wung”);
function __($msgid)
{
return $msgid;
}
?>

您目前可以加上__($msg)函数的定义,函数可以直接返回msg本身.
第二步:生成语言文件:
(在linux中)运行 xgettext –keyword=__
test.php,完成后将会生成一个messages.po文件。内容如下:

1.

# 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 VERSION\n”
“Report-Msgid-Bugs-To: \n”
“POT-Creation-Date: 2007-03-20 11:44+0800\n”
“PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n”
“Last-Translator: FULL NAME \n”
“Language-Team: LANGUAGE \n”
“MIME-Version: 1.0\n”
“Content-Type: text/plain; charset=CHARSET\n”
“Content-Transfer-Encoding: 8bit\n”

#: 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项目.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics