2024 年 PHP 日本大会

Gettext 函数

目录

添加笔记

用户贡献笔记 37 条笔记

jeremy at jeremy dot se dot nospam
17 年前
正如一些人提到的,你必须首先在你的系统上编译语言环境。如何操作取决于你的系统/发行版(叹息)

在任何情况下,你都需要在你的系统上安装 gettext。运行带有最新 libc 版本的 Linux 用户已经在 libc 中拥有 gettext。

以下是用 Ubuntu Edgy 的用户的示例。

首先,查看 /usr/share/i18n/SUPPORTED,这里列出了你的系统上支持的语言环境。要编译语言环境,我们将使用命令“locale-gen”。(“man 8 locale-gen”是不错的阅读资料)

此命令读取 /var/lib/locales/supported.d/ 文件夹中文件的配置。在这些文件中定义了语言环境和字符集。

如果我们以瑞典语为例,首先在 /var/lib/locales/supported.d/ 中创建一个名为“sv”的文件,然后输入类似“sv_SE.UTF8 UTF8”(不含空格)的内容。这意味着我们希望使用字符集 UTF-8 构建语言环境 sv_SE。查看文件 /usr/share/i18n/SUPPORTED 以了解其他替代方案。

现在我们运行“locale-gen”,它将编译 /var/lib/locales/supported.d/ 中定义的所有语言环境并将它们放在 /usr/lib/locales 中(是的,有很多位置……)

现在你可以开始了……

创建一个 php 文件(例如 hello.php),其中所有要翻译的字符串都用 _("string here"); 括起来。

接下来运行“xgettext hello.php”,这将创建一个名为 messages.po 的文件,它是你的翻译文件(pot)。更改此文件中的“Content-Type: text/plain; charset=CHARSET\n”,并将 CHARSET 替换为 UTF-8。

#: hello.php:3
msgid "hello!"
msgstr "hej!"

保存并使用命令“msgfmt -o hello.mo messages.po”,这将创建一个名为 hello.mo 的编译后的 .mo 文件。

然后将此文件放在 Apache 可以读取的某个目录结构中。该结构如下所示

"locale/sv/LC_MESSAGES/hello.mo"

接下来,让 php 知道我们在做什么。我们指向我们存放翻译的地方。在 hello.php 的顶部添加以下内容

bindtextdomain('hello','/somepath/locale');

这将 hello.mo 文件绑定到你创建的 locale/ 目录。
然后设置语言环境。LC_ALL 表示我们希望所有内容都被翻译。正如这里其他人建议的那样,这可能并不总是好的。

setlocale(LC_ALL, "sv_SE.UTF-8");

最后选择我们想要使用的 hello.mo

textdomain('hello');

就是这样!试试看…

如果遇到任何问题,请尝试重新启动 Apache,因为它似乎会缓存语言环境。

如果运行命令行,你可能还需要将环境变量 LANGUAGE 设置为你的语言环境。不过,我没有必须这样做才能在 apache 中运行它,但是你可能需要…

putenv("LANGUAGE=sv_SE.UTF-8");
C Snover
18 年前
我认为值得一提的是,你将找到的大多数文档和教程都说你应该设置 setenv(LC_ALL, $locale),但这只有在本地机器上的语言环境有效时才有效。如果你使用的是系统上不存在或无效的语言环境(例如从 HTTP Accept-Language 标头返回的语言环境,例如“ja”,它永远不是有效的语言环境,因为它不包含国家代码 JP),你可能会花几个小时来尝试找出为什么该死的程序无法工作。

我发现设置 LANGUAGE 变量(例如 setenv("LANGUAGE=$locale"))将允许 gettext 在你的语言环境目录中搜索,即使语言环境在本地系统上实际上无效。

因此,总结一下

这将有效
<?php
$locale
= 'ja'; // 假设这是从 Accept-Language 标头获取的
$locale_dir = './locale'; // 你的 .po 和 .mo 文件应该位于 $locale_dir/$locale/LC_MESSAGES/messages.{po,mo}

putenv("LANGUAGE=$locale");
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>

这将无效
<?php
$locale
= 'ja';
$locale_dir = './locale';

putenv("LC_ALL=$locale");
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>

这将也无效
<?php
$locale
= 'ja';
$locale_dir = './locale';

setlocale(LC_ALL, $locale);
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>

这将也无效
<?php
$locale
= 'ja';
$locale_dir = './locale';

setlocale(LC_MESSAGES, $locale);
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>

参考信息:此代码已在运行 Ubuntu Dapper 6.06 系统的 PHP 5.1.2 + LigHTTPd 1.4.11 + gettext 0.14.5 环境下测试通过。理论上,它也适用于任何 Linux 变体以及这些软件包的旧版本。
analpaper{gmail}
16年前
回复 richard
我之前一段时间一直使用通配符 * ,没有问题,直到今天。

我使用了
<?php bindtextdomain( '*', './locale' ); ?>
但在某些环境下似乎会失败(我不知道为什么,但在具有相同软件的不同机器上,结果并不总是预期的)..

然后,使用
<?php bindtextdomain( "*", './locale' ); ?>
所有内容都再次被正确翻译。

我尽可能总是使用单引号,现在又多了一件需要注意的事情。
---
live2code
djogopatrao at gmail dot com
18 年前
Juan Liska,我找到了一个替代方案。我没有重命名或添加语言环境的别名,而是简单地将

$language = 'pt_BR';

更改为

$language = 'pt_BR.UTF-8';
putenv("LANG=$language");
setlocale(LC_ALL, $language)

它运行良好!
konrads/smelkovs/gmail/com
18 年前
关于 Windows 用户的 LC_MESSAGES,LC_MESSAGES 应定义为 5
Maxwel Leite -maxwelleite at gmail com-
19年前
PHP-gettext 被开发成可以直接读取 gettext MO 文件,而不需要除 PHP 之外的任何其他东西。
https://savannah.nongnu.org/projects/php-gettext/
kocio at irc dot pl
20年前
以下三行代码大约需要 0.5 秒才能执行(Debian,赛扬 2GHz,256MB RAM)

setlocale(LC_ALL, 'pl_PL');
bindtextdomain('my_domain', '../dir/' . 'locale');
textdomain('my_domain');

我认为这样的延迟足以在文档中提及。在我的特定情况下,这意味着整个脚本的执行时间增加了一倍多。
dev.php at tfelber.net
21年前
检查你的

/etc/locales.aliases 文件中是否有 "english en_GB.ISO-8859-1"(之前提到过)

以及你的

/etc/locales.gen 文件中是否有 en_GB.ISO-8859-15 ISO-8859-15

我不确定是否只有此条目解决了问题。在我的情况下,此条目是由 dpkg-reconfigure locales(debian)创建的,我在其中创建了语言环境。

翻译仅适用于 de_GE@euro 和 en_GB.ISO-8859-15(locales.gen 中的第一列)。
anim8
21年前
即使在某些情况下 setlocale() 可能需要国家代码以及语言代码,但这并不意味着 gettext 也需要。

如果 setlocale() 设置为 es_ES 或 es_MX,gettext() 仍然可以从 'es' 文件夹中的 po 文件中获取文本。

为了避免 ISO 标准的冗长性而更改系统的别名文件可能不是一个好主意,因为
a) 你可能会破坏某些东西
b) 你的代码失去了可移植性

.
richard at hirner dot at
18 年前
通配符 * 对我不起作用 (php 5)... 我必须为每个 textdomain 使用 bindtextdomain
webmaster [at] ttw [dash] tool [dot] de
18 年前
如果你想使用来自多个域的消息,并且 .mo 文件位于非标准位置,请记住为每个域放置一个 bindtextdomain() 调用,因为“未绑定”的域将在标准位置(通常是 *nix 系统上的“/usr/share/locale”)中查找。

<?php

bindtextdomain
('foo','/some/dir/with/mo_files');
bindtextdomain('bar','/another/mo_file/dir');

echo
dgettext('foo','Text to be translated using the foo-catalog.');
echo
dgettext('bar','Text from a different catalog named bar.');

?>

如果所有使用的 .mo 文件都位于同一个目录中,你可以使用 "*" 通配符,如下所示:

<?php

bindtextdomain
('*','/directory/with/all/mo_files');

?>

此代码已在 PHP 5.1.4 上测试通过。
info at adaniels dot nl
18 年前
正如 robert at klugher dot com 所述
环境设置“LANGUAGE”优先于任何本地设置。这意味着更改 LC_ALL/LC_MESSAGES 和 LANG(如几乎所有示例中所做的那样)不会有任何作用。

因此,如果你已经执行了
<?php
$language
= "nl_NL";
putenv("LANG=$language");
setlocale(LC_ALL, $language);
...
?>
但文本仍然显示为英文。尝试设置 LANGUAGE 变量。
<?php
$language
= "nl_NL";
putenv("LANGUAGE=$language");
putenv("LANG=$language");
setlocale(LC_ALL, $language);
...
?>
birkholz at web dot de
18 年前
> stefan+usenet at froehlich dot priv dot at 于 2004年5月5日01:30写道
> 一遍遍阅读以下代码行
>
> <? php setlocale(LC_ALL, 'de_DE'); ?>
>
> 我必须警告不要使用它,因为它存在严重的缺陷。
> 对于某些语言环境,LC_NUMERIC 会交换句点和逗号,这可能会导致
> 在将行插入 SQL 数据库时,小数点后的数字会被静默删除。
> 所以不要这样做,而是使用
>
> <? php setlocale(LC_MESSAGES, 'de_DE'); ?>
>
> 它可以准确地做到你想要的事情,没有任何不良副作用。

对于所有 Windows 用户
请注意,在使用 PHP 5.1.2 的 Windows 系统上,LC_MESSAGES 似乎没有设置,因此,如果你为 Linux 系统开发应用程序并希望使用 gettext 实现多语言支持,那么在 Windows 开发环境中使用 LC_MESSAGES 将会遇到问题。
你可以尝试通过添加以下代码来解决此问题:

<?php if (!defined('LC_MESSAGES')) define('LC_MESSAGES', 6); ?>

添加到你的脚本中,以便在将 LC_MESSAGES 传递给 setlocale() 函数时不会出现警告。
Juan Liska
19年前
如果你在 Ubuntu 或 Debian 上遇到 setlocale 问题(如果它返回 false)

nano /etc/locale.gen

确保你想要的语言环境在列表中,如果不是,请添加它们。例如,我想要 es_GT(因为我有一个必须在 Red Hat 和 Debian 上运行的应用程序,我无法更改为 es_GT.UTF-8),因此,添加

es_GT UTF-8

然后运行

locale-gen

你现在拥有了想要的语言环境,而不仅仅是系统神奇自带的那些。
milky#users:sf/net
19年前
存在 gettext 函数的模拟版本——显然比原生绑定慢,但可以在缺少扩展的共享服务器上使用。它被认为是一个非常有用的回退(已经用 if-function_exists 检查封装)。
请参阅 [ http://freshmeat.net/p/upgradephp ] tarball 中的 ext/ 目录。它不支持复数翻译,因为可靠地重新实现这一点太难了。
zixia at zixia dot net
20年前
如果 gettext 不支持你的语言环境,例如 'zh_CN',只需查看命令“localedef --list-archive”的输出是否包含你的语言环境(此示例中的 'zh_CN')。
如果不是,请尝试使用现有的语言环境或使用“localedef”创建一个:在我的例子中是“localedef -f GBK -i zh_CN zh_CN”。
wouter at grep dot be
21年前
当然,只有在您为用户提供其请求的语言和编码时,翻译才有意义。由于HTTP协议的一部分允许您指定语言和编码,因此如果可以使用该信息从可用的翻译中选择“正确的”翻译,那就很好了。

我编写了一些可以做到这一点的代码——它解析'Accept-Language'和'Accept-Charset' HTTP/1.1 头部,并告诉您用户从您提供的列表中偏好哪个。您可以从http://www.grep.be/articles/php-accept.php下载它。

请注意,即使用户的浏览器可能支持这一点,用户也可能不知道;因此,最好不要删除指向其他语言版本的链接,以便人们仍然可以根据自己的喜好获得您网站的其他语言版本。
jc
21年前
我在使gettext工作时遇到很多问题(RedHat 7.3)。在阅读了本手册中的所有注释后,我成功地使其工作了。

总而言之,请注意:

1) 您在setlocale()中使用了完整的语言环境
2) 您的language_country存在于/usr/share/locale/locale.alias中
3) Apache似乎需要重启(对我来说,“优雅”重启就足够了)
4) 您的.mo文件必须以域名命名

我的代码

$language = "es_ES";
$locale = setlocale(LC_ALL, $language);

$gettext_domain = 'messages';
bindtextdomain($gettext_domain, "/full/path/to/locale");
textdomain($gettext_domain);
Anonymous
21年前
我使用标准的“de”或“fr”(而不是“de_DE”)使gettext工作的方法是,我用/usr/lib/X11/locale/locale.alias文件覆盖了我的/usr/share/locale/locale.alias文件。然后我重启了Apache。我这样做是因为X11文件似乎更新且更现代化!
Picco
21年前
给中国程序员的提示……

我花了几个小时才弄明白,不能使用

LANG=zh
而必须使用
LANG=zh_TW
在某些机器上……

一个好的测试方法是检查setlocale()的返回值
robert at klugher dot com
21年前
在我尝试了几个小时后发现的一个技巧

当您使用setlocale()时,PHP将使用它在例如/usr/share/locale中找到的语言环境信息来设置LC_ALL、LC_MESSAGES等的语言信息。

您可以通过使用putenv()设置LANG=…并查看setlocale(LC_ALL, "")的返回值来检查它将使用的确切信息。gettext函数将用来查找翻译文件的语言值是为LC_MESSAGES设置的值。

例如

我将LANG设置为fr_BE,并将翻译文件放在dirxxx/locale/fr_BE/LC_MESSAGES/…
由于我的系统中fr_BE的语言环境信息但不是LC_MESSAGES,PHP选择使用fr_FR的LC_MESSAGES设置,然后查找dirxxx/locale/fr_FR/LC_MESSAGES/…中的翻译文件,当然,这个文件没有找到。

因此,请务必查看setlocale的返回值,以查看与LC_MESSAGES关联的语言值,然后知道gettext将在哪个子目录中查找翻译文件。

Robert
php at zpod dot ca
21年前
对于那些只想让脚本工作并且您的提供商不支持gettext的人,您可以通过添加以下内容来绕过国际化内容

function _($str) {
return $str;
}
Eneko Lacunza enlar at enlar dot net
21年前
来自我的Red Hat Linux 7.3系统的一些提示。

在我使用setlocale设置完整的语言环境(例如es_ES)之前,它对我不起作用。

我尝试了Michele Manzato的示例(谢谢!),但由于它设置语言时没有国家/地区,所以对我来说失败了。以下是使用完整语言环境“修复”的示例

// 更改为脚本目录
// (在RH 7.3中不需要)
$path = dirname(getenv(PATH_TRANSLATED));
chdir($path);

// 将语言设置为完整的语言环境'es_ES'
$language = 'es_ES';
putenv("LANG=$language");
setlocale(LC_ALL, $language);

// 将文本域设置为'mydomain'
$domain = 'mydomain';
bindtextdomain("$domain", "./locale");
textdomain("$domain");

// 搜索的.mo文件是
// ./locale/es_ES/LC_MESSAGES/mydomain.mo
// 或如果前一个不存在
// ./locale/es/LC_MESSAGES/mydomain.mo

echo gettext("Hello world!");

希望这有帮助!
Eneko。
mgvNOSPAM at fx dot ro
22年前
如果您和我一样茫然无措,请注意以下几点:
1. 虽然大多数评论在代码中列出了setlocal(),但这实际上并不是翻译所必需的——阅读“字符串函数”下的文档以了解详细信息(此外,官方gettext()示例也不包含它);
2. hace_x的示例非常酷,除了您需要知道他字符串末尾的所有“n”前面都应该有一个反斜杠——它们实际上是EOL字符,但它们不知何故被弄乱了,我花了两个小时才找到原因……
richardbrinkman at hotmail dot com
8年前
Gettext缓存机器可读的*.mo文件。这使其非常快,但也无法在运行应用程序时更改.mo文件。由于PHP作为服务器运行,因此您无法更新.mo文件并立即查看新的翻译。克服此缓存问题有两种方法:

1. 重启您的Web服务器。例如,通过`systemctl restart apache2`。这将终止正在运行的php进程并随后重新加载它们。

2. 如果您没有重启Web服务器的权限(例如,您使用的是共享主机),您可以更改域名。例如,使用以下PHP代码将新域名硬链接到已更改的.mo文件:

$locale = "nl_NL.utf8"; // 将其设置为您的语言
setlocale(LC_ALL, $locale);
putenv('LANG=' . $locale);
$mtime = 0;
$translationDir = "locale"; // 或您存储翻译的位置
$originals = glob("$translationDir/*/LC_MESSAGES/messages.mo");
foreach ($originals as $file)
$mtime = max($mtime, filemtime($file));
$domain = "messages_$mtime";
$current = glob("$translationDir/*/LC_MESSAGES/$domain.mo");
if (count($originals) != count($current)) {
foreach (glob("$translationDir/*/LC_MESSAGES/messages_*.mo") as $file)
unlink($file);
foreach ($originals as $file)
link($file, substr($file, 0, -3)."_$mtime.mo");
}
bindtextdomain($domain, $translationDir);
textdomain($domain);

此脚本的作用是检查是否至少更新了一个翻译,如果是,则删除所有messages_*.so并硬链接所有messages.po到相应的messages_$mtime.po,其中$mtime设置为最新的修改翻译文件。由于它使用了一个新的域名(“messages_$mtime”),因此不会被缓存。
Sbastien Ballest-Antich
16年前
使用heredoc和gettext字符串以及sprintf的解决方法
<?php
$hd
= <<<EOD
<p>%s</p>
<p>%s</p>
EOD;
$hdgt = sprintf($hd, _('Heredoc'), _('gettext'));
var_dump($hdgt);
?>
titan at phpdevshell dot org
16年前
如果您想创建一个.po文件,其中包含花括号{}内的heredoc脚本,解决方案如下:

我想翻译这里的内容(test.php)
<code>
<?php
$EOF
= <<<EOF
{
$t->__('I want to translate this string.')}
EOF;
?>
</code>

您必须使用xgettext(gnu实用程序)和Python解析器,如下所示:
<code>
$ xgettext --default-domain=test --keyword=__ --keyword --language=Python test.php
</code>

上面的终端命令使用两次`--keyword`看起来可能不对,但这实际上是正确的。
SEWilco
17 年前
人们建议了几种配置选项组合。考虑尝试使用嵌套循环,其中包含各种语言名称组合(带和不带字符集后缀)和路径名。循环中间的gettext()调用可以测试是否成功(一个字符串被翻译)。

“在测试的4374个本地化设置变体中,有0个成功。”

有时只需要修复系统和PHP配置。
jon at nospam dot foo
17 年前
我相信我会进一步混淆,但我感到有必要插一句。我对此有点卡住了……

您的gettext安装绝对必须支持您在setlocale(LC_MESSAGES,$locale)调用中尝试使用的语言环境。

这不起作用

setlocale(LC_MESSAGES,"en");

在OpenSUSE 10.2中,因为/usr/lib/locale不包含目录“en”(开箱即用),即使您的自定义LC_MESSAGES域位置可能包含。

至少在OpenSUSE 10.2中,/usr/lib/locale包含美国英语

en_US
en_US.iso885915
en_US.utf8

(再次,不是“en”)。

可能可以设置别名,我不确定(有人对此有想法吗)。

我的目标是使用HTTP_ACCEPT_LANGUAGE设置语言环境(我意识到语言环境!=语言,但gettext似乎使用语言环境来分配语言(挠头))。OS X中的Opera不发送“en_US”。但是,Firefox开箱即用。我不确定它是否应该这样工作,但看起来它应该这样工作,因此Opera处理此问题的方式似乎是一个问题。顺便说一句,Safari只是在HTTP_ACCEPT_LANGUAGE中发送“en”,也不会工作。

这促使我在我的 PHP 应用程序中设置一个可配置的默认语言环境(例如,“en_US”),无论如何都应该这样做,因为 HTTP_ACCEPT_LANGUAGE 可能为空。
tucsi at c2 dot hu
19年前
如果你的 gettext 翻译在安全模式下不起作用,请尝试在 php.ini 中设置这个:
safe_mode_allowed_env_vars = PHP_,LANG
php at dynaperl dot com
22年前
如果你是从 SuSE 发行版安装的,你需要 glibc-locale.rpm 来让 gettext 工作。

mfg ralph。
Michele dot Manzato at verona dot miz dot it
23年前
Gettext 很好,但是要使其工作,你必须考虑一些注意事项。不幸的是,gettext 文档并不那么简洁明了……

使用 gettext 工具创建的 .mo 文件必须位于:

[bindtextdomain 的目录]/[语言]/LC_MESSAGES/[域].mo

否则 gettext() 函数将无法找到它(这在 win32 中是正确的,不知道 Un*ces 是否如此)。顺便说一句,你不会收到任何错误消息,字符串将 simply remain untranslated(保持未翻译)。

其次,如果你在 bindtextdomain 中使用相对路径,你必须确保当前目录是什么。在某些系统上,脚本目录不是当前目录,因此你必须使用 chdir() 切换到该目录。

然后,当然,通过查看 php 配置文件来确保 PHP 加载了相应的 gettext 扩展。

这里有一些示例代码:

// 切换到脚本目录
$path = dirname(getenv(PATH_TRANSLATED));
chdir($path);

// 设置语言为 'it'
$language = 'it';
putenv("LANG=$language");
setlocale(LC_ALL, $language);

// 将文本域设置为'mydomain'
$domain = 'mydomain';
bindtextdomain("$domain", "./locale");
textdomain("$domain");

// 搜索的.mo文件是
// ./locale/it/LC_MESSAGES/mydomain.mo

echo gettext("Hello world!");

玩得开心!
Michele
elonen at iki dot fi
19年前
要创建 PHP 文件的本地化副本(静态 l10n),这里有一个 GPL 许可的命令行工具:http://iki.fi/elonen/code/pophorator/
dpatton at confluence dot org
19年前
在决定使用 gettext 之前,请确保检查你的 web 服务器配置,因为如果你在多线程环境中运行,则不应使用 gettext,因为它不是线程安全的。

gettext 的未来版本(可能是 0.15)可能是线程安全的。
任何 gettext 依赖项(例如 glibc)也需要是线程安全的。

Unix 上的 Apache 1.3 通常是非线程的,但在 Windows 上它是多线程的。
Apache 2.0 支持 MPM(多处理模块),其中一些支持多个线程。
https://httpd.apache.org/docs-2.0/mpm.html
mikolaj at webgate dot bg
20年前
winXP,PHP 4.3.5 作为 Apache1.3.29 模块

给 Windows 用户的两个提示。

我发现设置语言环境既不充分也不必要。为了使其工作,我需要将 LC_ALL 或 LANG 环境变量设置为我的语言环境。无论如何,此值必须适合 setlocale,因此最好用它进行测试。在我的情况下,根据 http://www.unicode.org/onlinedat/countries.html,保加利亚语为 bgr_BGR。

gettext 会检查一次文件并将它们保存在缓存中。尤其意味着如果它找不到你的文件,它就不会再次搜索,所以在任何目录更改后重新启动 Apache!!

我的最小工作脚本:
<?php
// 翻译文件:D:\Apache\htdocs\mypage\locale\bgr_BGR\LC_MESSAGES\messages.mo
putenv("LC_ALL=bgr_BGR");
bindtextdomain('messages', 'D:\Apache\htdocs\mypage\locale\\');
echo
gettext("Hello");
?>
stefan+usenet at froehlich dot priv dot at
20年前
反复阅读以下行:

<? php setlocale(LC_ALL, 'de_DE'); ?>

我必须警告你使用它,因为它有一些严重的缺点。对于某些语言环境,LC_NUMERIC 会交换句点和逗号,例如,这可能会导致在将行插入 SQL 数据库时,小数部分的数字被静默删除。所以不要这样做,而是使用:

<? php setlocale(LC_MESSAGES, 'de_DE'); ?>

它只做你想要的事情,没有任何不良副作用。
匿名用户
23年前
对你们许多人来说,这可能是显而易见的,但我认为值得一提的是,域是包含字符串目录的 .mo 文件的名称(不包括扩展名)。

因此,如果你的每个页面在 './locale/lg/LC_MESSAGE' 中都有一个 myPage.mo 目录,而一些通用目录(例如 errorMsg.mo)在 '/global/locale/lg/LC_MESSAGE' 中,你可以执行以下操作:

bindTextDomain("$myPage", './locale');
bindTextDomain('errorMsg','/global/locale' );
textDomain('myPage');
print(getText('Welcome'));
/.../
if($err)printf(dGetText('errorMsg','你这里有一个错误'));

Ivan
To Top