textdomain

(PHP 4、PHP 5、PHP 7、PHP 8)

textdomain设置默认域

说明

textdomain(?string $domain): string

此函数设置在调用 gettext() 时要搜索的域,通常以应用程序命名。

参数

domain

新的消息域,或 null 以获取当前设置而不进行更改

返回值

如果成功,此函数将返回当前消息域,可能已更改。

注释

注意:

textdomain() 信息在每个进程中维护,而不是每个线程中维护。

添加笔记

用户贡献笔记 2 笔记

ninja (without a) at informance dot dot dot info
13 年前
当您设置文本域时,它(显然)会擦除之前的文本域。

当您使用嵌套包含,其中可能存在具有不同文本域的 textdomain() 调用时,这会成为问题。从包含返回后,您的文本域将发生更改,并且父脚本的其余部分将无法翻译剩余的句子。

我编写了这两个小函数来避免这种情况。您应该将整个代码放入一个文件中,您需要在每个需要 gettext 功能的脚本中包含该文件。然后,仅在设置文本域的每个脚本/函数的开头和结尾使用 set_textdomain() 和 restore_textdomain()。

对 set_textdomain() 的调用必须对应对 restore_textdomain() 的调用,并且对嵌套调用的次数没有限制。

这里进行了一项优化:当新的文本域与当前文本域相同时,不会进行任何更改,并且 restore_textdomain() 会意识到这一点,因此您可以安全地调用它。

<?php
$_td_stack
= array(); // 文本域堆栈

/**
* 在记录当前文本域后设置新的文本域,
* 因此它可以在以后使用 restore_textdomain() 恢复。
*
* 可以嵌套对这两个函数的调用。
* @param string 要设置的新文本域
*/
function set_textdomain($td)
{
global
$_td_stack;

$old_td = textdomain(NULL);

if (
$old_td)
{
if (!
strcmp($old_td, $td))
{
array_push($_td_stack, false);
}
else
{
array_push($_td_stack, $old_td);
}
}

textdomain($td);
}

/**
* 恢复上次调用 set_textdomain() 之前激活的文本域。
*/
function restore_textdomain()
{
global
$_td_stack;

$old_td = array_pop($_td_stack);

if (
$old_td)
{
textdomain($old_td);
}
}
?>
ipso at snappymail dot ca
17 年前
我在使用 gettext 时遇到了一些非常奇怪的问题,它只为每个 Apache 进程(非线程)设置一次区域设置,直到我找到了这个错误报告

http://bugs.php.net/bug.php?id=21965

它几乎看起来像 gettext 每次进程缓存一次数据,但实际上调用 textdomain() 为我解决了这个问题。
To Top