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(string $domain, ?string $codeset = null): string|false

bind_textdomain_codeset() 允许设置或获取 gettext() 和类似函数将从 domain 返回的消息的编码。

参数

domain

域。

codeset

代码集。如果为 null,则返回当前设置的编码。

返回值

成功时返回 string

错误/异常

如果 domain 为空 string,则抛出 ValueError 异常。

变更日志

版本 描述
8.4.0 现在如果 domain 为空 string,则抛出 ValueError 异常。
8.4.0 codeset 现在是可选的。以前,此参数必须始终指定。
8.0.3 codeset 现在可以为 null。以前无法检索当前设置的编码。

备注

注意:

bind_textdomain_codeset() 信息按进程维护,而不是按线程维护。

添加备注

用户贡献的笔记 3 条笔记

duckx at mezimail dot com
20 年前
首先,gettext 手册的网址已更改
http://www.gnu.org/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 目录中……希望这有帮助 :)
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("无法设置 ENV 变量 LANGUAGE = %s",
$this->_language));

// 设置 LANG 环境变量
if ( false == putenv("LANG=" . $this->_language ) )
CCDebug::Log(sprintf("无法设置 ENV 变量 LANG = %s",
$this->_language));

// 如果区域设置未安装在区域设置文件夹中,则不会
// 设置!这通常位于 /usr/lib/locale
// 此外,备份语言应始终为默认语言
// 因为这个……参见类描述中的注释

// 首先尝试我们想要的内容,但使用 .utf8,这是大多数系统上的区域设置
// 设置想要的(并且最兼容
// 然后只需尝试请求的标准语言编码,然后如果
// 所有其他方法都失败了,只需尝试默认语言
//据说使用 LC_ALL,但在某些语言中,它的用法很糟糕
// 在交换逗号和句点!因此,如果在其中一个
// 系统上。
//据说是未在 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("尝试:将 setlocale 设置为 '%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));

} // end of method Init ()
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