Gettext 函数

目录

添加注释

用户贡献的注释 37 个注释

11
jeremy at jeremy dot se dot nospam
17 年前
正如你们中有些人提到的,您必须首先在系统上编译区域设置。如何完成取决于您的系统/发行版 *sigh*

在所有情况下,您都需要在系统上安装 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),其中所有要翻译的字符串都用“_(“这里的字符串”)” 括起来;

接下来运行“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");
8
C Snover
18 年前
我认为有必要提及,您会发现大多数文档和教程都说您应该设置 env(LC_ALL, $locale),但这只有在本地机器上的区域设置有效的情况下才有效。如果您使用的是系统上不存在或无效的区域设置(例如从 HTTP Accept-Language 标头返回的内容,例如“ja”,这永远不是有效的区域设置,因为它不包含国家代码 JP),那么您可能会拔掉头发几个小时试图弄清楚为什么这个东西不工作。

我发现设置 LANGUAGE 变量(例如 putenv("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 以及这些软件包的旧版本,这应该是正确的。
2
analpaper{gmail}
15 年前
作为对 richard 的回复
我之前一直在使用通配符 *,并且没有问题,直到今天。

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

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

如果可能,我总是使用单引号,现在又有一件事要记住。
---
live2code
2
djogopatrao at gmail dot com
17 年前
Juan Liska,我找到了一种替代方法。无需重命名或为区域设置添加别名,我只需将

$language = 'pt_BR';

改为

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

它就可以正常工作了!
2
konrads/smelkovs/gmail/com
17 年前
关于Windows用户使用LC_MESSAGES,LC_MESSAGES应该被定义为5
2
Maxwel Leite -maxwelleite at gmail com-
19年前
PHP-gettext被开发出来可以直接读取gettext MO文件,而无需依赖PHP之外的其他任何东西
https://savannah.nongnu.org/projects/php-gettext/
2
kocio at irc dot pl
20年前
以下三行代码大约需要0.5秒执行(Debian,Celeron 2GHz,256MB内存)

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

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

/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中的第一列)
2
anim8
21年前
即使在某些情况下setlocale()可能需要除语言代码之外的国家/地区代码,但这并不意味着gettext也需要。

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

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

.
1
richard at hirner dot at
18 年前
*通配符对我(php 5)不起作用...我必须为每个文本域使用bindtextdomain
1
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上测试过
1
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);
...
?>
1
birkholz at web dot de
18 年前
> stefan+usenet at froehlich dot priv dot at wrote at 5-May-2004 01:30
> 阅读以下行
>
> <? php setlocale(LC_ALL, 'de_DE'); ?>
>
> 我必须警告使用它,因为它存在严重的注意事项。
> 对于某些区域设置,LC_NUMERIC会交换句点和逗号,这可能会导致
> 将行插入SQL数据库时,数字中的小数点会被静默删除。
> 所以不要这样做,而是使用
>
> <? php setlocale(LC_MESSAGES, 'de_DE'); ?>
>
> 它只做你想要做的,没有任何负面影响。

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

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

到你的脚本中,这样你就可以在将LC_MESSAGES传递给setlocale()函数时不再收到警告。
1
Juan Liska
18 年前
如果你在ubuntu或debian上使用setlocale遇到问题(如果它返回false)

nano /etc/locale.gen

确保你想要的区域设置都在列表中,如果没有,请添加它们。例如,我想要es_GT(因为我有一个必须在redhat和debian上运行的应用程序,我不能更改为es_GT.UTF-8),所以添加

es_GT UTF-8

然后运行

locale-gen

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

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

请注意,即使用户的浏览器可能支持这一点,用户可能并不知道;因此,最好不要删除指向其他语言版本的链接,以便人们仍然可以在需要时获取你的网站的另一种语言版本。
1
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);
1
Anonymous
21年前
我让gettext仅使用标准的"de"或"fr"(而不是"de_DE")工作的方法是,我用/usr/lib/X11/locale/locale.alias文件覆盖了我的/usr/share/locale/locale.alias文件。然后我重启了Apache。我之所以这样做,是因为X11文件似乎更新且更现代化!
1
Picco
21年前
注意中国程序员...

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

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

一个好的测试方法是检查setlocale()的返回值
1
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 函数将从哪个子目录中查找翻译文件。

罗伯特
1
php at zpod dot ca
21年前
对于那些只是尝试运行脚本并且您的服务提供商不支持 gettext 的用户,您可以通过添加以下代码来绕过国际化部分。

function _($str) {
return $str;
}
1
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。
1
mgvNOSPAM at fx dot ro
22 年前
如果您像我一样一头雾水,请注意以下几点。
1. 虽然大多数评论在代码中列出了 setlocal() 函数,但实际上它对于翻译来说并不是必需的——请阅读“字符串函数”下的文档以了解详细信息(另外,官方的 gettext() 示例也不包含它);
2. hace_x 的示例非常酷,但您需要知道他字符串末尾的所有“n”都应该在前面加上反斜杠——它们实际上是 EOL 字符,但不知何故它们被搞乱了,我花了两小时才找到原因…
0
richardbrinkman at hotmail dot com
7 年前
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”),因此不会被缓存。
0
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);
?>
0
titan at phpdevshell dot org
16 年前
如果您想使用包含在花括号 {} 中的 heredoc 脚本创建一个 .po 文件,那么解决方案如下:

我想翻译这里的内容(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 被使用了两次,但这确实是正确的。
0
SEWilco
17 年前
人们建议了多种配置选项组合。可以尝试使用各种语言名称(带和不带字符集后缀)和路径名组合的嵌套循环。在循环中间调用 gettext() 函数可以测试是否成功(字符串被翻译)。

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

有时,人们只需要修复系统和 PHP 配置。
0
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 可能为空。
0
tucsi at c2 dot hu
19年前
如果您的 gettext 翻译在安全模式下不起作用,那么尝试在 php.ini 中设置以下内容。
safe_mode_allowed_env_vars = PHP_,LANG
0
php at dynaperl dot com
22 年前
如果您从 SuSE Dist. 安装,则需要 glibc-locale.rpm 才能让 gettext 正常工作。

mfg ralph。
0
Michele dot Manzato at verona dot miz dot it
22 年前
Gettext 非常棒,但要使其正常工作,您必须考虑一些注意事项。不幸的是,gettext 文档并不那么简单明了…

使用 gettext 工具创建的 .mo 文件必须位于以下位置。

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

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

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

然后,当然,请确保通过查看 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
-1
elonen at iki dot fi
19年前
要创建 PHP 文件的本地化副本(静态 l10n),以下是一个 GPL 许可的命令行工具:http://iki.fi/elonen/code/pophorator/
-1
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
-1
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");
?>
-1
stefan+usenet at froehlich dot priv dot at
20年前
一遍又一遍地阅读以下代码行。

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

我必须警告您使用它,因为存在严重的注意事项。对于某些区域设置,LC_NUMERIC 会交换句号和逗号,这可能会导致将行插入 SQL 数据库时,小数点部分的数字被静默地删除。因此,请勿这样做,而是使用以下代码。

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

它可以准确地完成您想要的操作,而不会产生任何副作用。
-1
Anonymous
23 年前
对于你们中的许多人来说,这可能是显而易见的,但我认为值得一提的是,域是包含字符串目录的 .mo 文件的名称(不包括扩展名)。

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

bindTextDomain("$myPage", './locale');
bindTextDomain('errorMsg','/global/locale' );
textDomain('myPage');
print(getText('Welcome'));
/.../
if($err)printf(dGetText('errorMsg','you have an error here'));

伊万
To Top