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): string|false

bind_textdomain_codeset() 允许设置或获取 domain 中的消息将以何种编码方式由 gettext() 和类似函数返回。

参数

domain

域。

codeset

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

返回值

成功时返回一个 string

变更日志

版本 描述
8.0.3 codeset 现在可以为空。以前无法检索当前设置的编码。

注释

注意:

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
17 年前
因此,通过使用此函数并设置 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 被使用,但在某些语言中使用起来很麻烦
// 在逗号和句号之间切换!因此,如果在一个
// 这些系统上,请尝试 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("尝试:将 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