PHP Conference Japan 2024

bind_textdomain_codeset

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

bind_textdomain_codeset指定或取得 DOMAIN 訊息目錄中訊息將返回的字元編碼

說明

bind_textdomain_codeset(字串 $domain, ?字串 $codeset = null): 字串|false

bind_textdomain_codeset() 允許設定或取得 domain 訊息將由 gettext() 和類似函數返回的編碼。

參數

domain

網域。

codeset

字碼集。如果為 null,則返回目前設定的編碼。

傳回值

成功時傳回 字串

錯誤/例外

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

變更記錄

版本 說明
8.4.0 現在,如果 domain 是空 字串,則拋出 ValueError
8.4.0 codeset 現在是可選的。先前,參數必須始終指定。
8.0.3 codeset 現在可以為 null。先前,無法檢索目前設定的編碼。

注意事項

注意:

bind_textdomain_codeset() 資訊是每個進程維護的,而不是每個執行緒。

新增註解

使用者貢獻的註解 3 則註解

9
duckx at mezimail dot com
20 年前
首先,gettext 手冊的網址已變更
https://gnu.dev.org.tw/software/gettext/manual/

其次,讓我們稍微解釋一下此函數的作用。
依預設,gettext 會使用您選擇的語言的 LC_CTYPE(例如 fr_FR)。
此 LC_CTYPE 是從您組態目錄中的 locales.alias 檔案擷取的(應該是 /etc/locales.alias)。
依預設,編碼通常為 iso-8859-1。

因此,如果您想讓您的網站支援 utf-8,您需要將您的網域與正確的編碼繫結。
以下是一個範例
<?php
$locale
="fr_FR.UTF-8"
setlocale(LC_MESSAGES, $locale);
$domain = 'your_text_domain';
bindtextdomain($domain, './translations_path');
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');

?>

如其他註解中所引述,翻譯路徑應如下所示
/translations_path
/de_DE/
/LC_MESSAGES
/fr_FR/
/LC_MESSAGES
...

您的翻譯會放在 LC_MESSAGES 目錄中...希望這有幫助:)
3
jon at rejon dot org
18 年前
因此,透過使用此函數並設定 LANGUAGE 變數,您應該能夠擁有一個正常運作的 i18n 系統,該系統不依賴於系統的語言環境安裝。以下是我為語言類別建立的方法範例。請在 http://wiki.creativecommons.org/Developer 上搜尋

function Init ()
{
// 設定 LANGUAGE 環境變數
// 這個不知何故會有差異 FU@#$%^&*!CK
// 並且與 bind_textdomain_codeset 結合使用時,允許一個
// 設定獨立於伺服器語言環境設定的語言環境!!!
if ( false == putenv("LANGUAGE=" . $this->_language ) )
CCDebug::Log(sprintf("無法設定環境變數 LANGUAGE = %s",
$this->_language));

// 設定 LANG 環境變數
if ( false == putenv("LANG=" . $this->_language ) )
CCDebug::Log(sprintf("無法設定環境變數 LANG = %s",
$this->_language));

// 如果語言環境未安裝在語言環境資料夾中,它們將不會
// 設定!這通常在 /usr/lib/locale 中
// 此外,由於這個原因,備份語言應始終為預設語言
// ...請參閱類別描述中的「注意」

// 先嘗試我們想要的,但使用 .utf8,這是大多數系統上的語言環境
// 設定所要的(且最相容)
// 然後只嘗試要求的標準語言編碼,然後如果
// 其他都失敗,只需嘗試預設語言
// 據說會使用 LC_ALL,但在某些語言中會有不好的用法
// 在交換逗號和句號!因此,如果是在其中一個
// 系統上,請嘗試 LC_MESSAGE。
// 據說它在 WINDOWS 上未定義,因此在此處包含它
// 如果出現問題,可取消註解
//
// if (!defined('LC_MESSAGES')) define('LC_MESSAGES', 6);
// 是的,setlocale 區分大小寫...arg
$locale_set = setlocale(LC_ALL, $this->_language . ".utf8",
$this->_language . ".UTF8",
$this->_language . ".utf-8",
$this->_language . ".UTF-8",
$this->_language,
CC_LANG);
// 如果我們沒有獲得我們想要的設定,請務必抱怨!
if ( ( $locale_set != $this->_language && CC_LANG == $locale_set) ||
empty($locale_set) )
{
CCDebug::Log(
sprintf("已嘗試:將語言環境設定為 '%s',但只能設定為 '%s'。", $this->_language, $locale_set) );
}

$bindtextdomain_set = bindtextdomain($this->_domain,
CC_LANG_LOCALE . "/" . $this->_locale_pref );
if ( empty($bindtextdomain_set) )
CCDebug::Log(
sprintf("已嘗試:將 bindtextdomain,'%s',繫結至目錄,'%s'," .
"但收到 '%s'",
$this->_domain, CC_LANG_LOCALE . "/" . $this->_locale_pref,
$bindtextdomain_set) );

bind_textdomain_codeset($this->_domain, "UTF-8");
$textdomain_set = textdomain($this->_domain);
if ( empty($textdomain_set) )
CCDebug::Log(sprintf("已嘗試:將 textdomain 設定為 '%s',但收到 '%s'",
$this->_domain, $textdomain_set));

} // 方法 Init () 的結尾
2
przemekkus at interia dot pl
18 年前
在使用 gettext 時,我遇到德文「變音」的問題。因此,這是可以解決的方法

我已將這些行放入我的 PHP 程式碼中

$domain = "messages";
bindtextdomain($domain, "path_to_messages_dir");
bind_textdomain_codeset($domain, 'ISO-8859-15');
textdomain($domain);

它起作用了!
To Top