PHP Conference Japan 2024

textdomain

(PHP 4, PHP 5, PHP 7, PHP 8)

textdomain設定預設網域 (domain)

說明

textdomain(?string $domain = null): string

此函式設定在呼叫 gettext() 時搜尋的網域,通常以應用程式命名。

參數

domain

新的訊息網域,或者使用 null 取得目前的設定而不更改它。

傳回值

如果成功,此函式會傳回目前的訊息網域,可能會在更改後傳回。

錯誤/例外

如果 domain 是空字串,則會拋出 ValueError

更新日誌

版本 說明
8.4.0 現在,如果 domain 是空 字串,則會拋出 ValueError
8.4.0 domain 現在是可選的。以前,這個參數必須要指定。

注意事項

注意:

textdomain() 的資訊是依每個行程(process)維護,而不是依每個執行緒(thread)。

新增註解

使用者提供的註解 2 則註解

ninja (without a) at informance dot dot dot info
14 年前
當您設定一個文字網域時,它(顯然地)會清除前一個。

當您使用巢狀 include 時,這可能會產生問題,因為其中可能會有使用不同文字網域的 textdomain() 呼叫。從 include 返回後,您的文字網域會被更改,而父程式碼的其餘部分會無法翻譯剩餘的句子。

我寫了這兩個小函式來避免這種情況。您應該將整個程式碼放入一個檔案中,並在每個需要 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