PHP Conference Japan 2024

textdomain

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

textdomain设置默认域

描述

textdomain(?string $domain = null): string

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

参数

domain

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

返回值

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

错误/异常

如果 domain 为空 string,则抛出 ValueError

变更日志

版本 描述
8.4.0 现在如果 domain 为空 string,则抛出 ValueError
8.4.0 domain 现在是可选的。以前,必须始终指定此参数。

备注

注意:

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

添加注释

用户贡献的注释 2 个注释

ninja (without a) at informance dot dot dot info
14 年前
当您设置文本域时,它(显然)会擦除上一个文本域。

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

我编写了这两个小函数来避免这种情况。您应该将整个代码放入一个文件中,您在需要 gettext 功能的每个脚本中都 require_once 该文件。然后,仅在设置文本域的每个脚本/函数的开头和结尾使用 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