PHP 8.4.2 Released!

bind_textdomain_codeset

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

bind_textdomain_codesetУстанавливает или получает кодировку, в которой будут возвращаться сообщения из каталога сообщений домена

Описание

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

Функция bind_textdomain_codeset() устанавливает или получает кодировку, в которой функции наподобие gettext() будут возвращать сообщения из домена domain.

Список параметров

domain

Домен.

codeset

Кодировка. Функция вернёт текущую установленную кодировку, если для параметра установили значение null.

Возвращаемые значения

Функция возвращает строку, если выполнилась успешно.

Ошибки

Функция выбрасывает ошибку ValueError, если в аргументе domain передали пустую строку (string).

Список изменений

Версия Описание
8.4.0 Функция теперь выбрасывает ошибку ValueError, если значение параметра domain является пустой строкой (string).
8.4.0 Параметр codeset стал необязательным. Раньше параметр требовалось указывать при каждом вызове.
8.0.3 Параметр codeset теперь принимает значение null. Раньше было невозможно получить текущую установленную кодировку.

Примечания

Замечание:

Информация, которую устанавливает функция bind_textdomain_codeset(), сохраняется для каждого процесса, а не для потока.

Добавить

Примечания пользователей 3 notes

up
9
duckx at mezimail dot com
20 years ago
First the the url of the gettext manual changed:
http://www.gnu.org/software/gettext/manual/

Secondly, lets explain a little bit what this fonction does.
By default, gettext will use the LC_CTYPE of the language you choose (for example fr_FR).
This LC_CTYPE is extracted from your locales.alias file in your configuration dir (Should be /etc/locales.alias).
By default, the encoding is frequently iso-8859-1.

So if you want to make your site utf-8 aware, you need to bind your domain with the right encoding.
Here is a sample:
<?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');

?>

As quoted in other notes, the translations path should be like
/translations_path
/de_DE/
/LC_MESSAGES
/fr_FR/
/LC_MESSAGES
...

Your translation goes in the LC_MESSAGES dirs ... Hopes this helps :)
up
3
jon at rejon dot org
18 years ago
So, by using this function and by setting the LANGUAGE variable, you should be able to have a functioning i18n system that is not dependent upon a system's locale installation. Here is a sample from a method I created for a language class. Look for it on http://wiki.creativecommons.org/Developer soon:

function Init ()
{
// set the LANGUAGE environmental variable
// This one for some reason makes a difference FU@#$%^&*!CK
// and when combined with bind_textdomain_codeset allows one
// to set locale independent of server locale setup!!!
if ( false == putenv("LANGUAGE=" . $this->_language ) )
CCDebug::Log(sprintf("Could not set the ENV variable LANGUAGE = %s",
$this->_language));

// set the LANG environmental variable
if ( false == putenv("LANG=" . $this->_language ) )
CCDebug::Log(sprintf("Could not set the ENV variable LANG = %s",
$this->_language));

// if locales are not installed in locale folder, they will not
// get set! This is usually in /usr/lib/locale
// Also, the backup language should always be the default language
// because of this...see the NOTE in the class description

// Try first what we want but with the .utf8, which is what the locale
// setting on most systems want (and is most compatible
// Then just try the standard lang encoding asked for, and then if
// all else fails, just try the default language
// LC_ALL is said to be used, but it has nasty usage in some languages
// in swapping commas and periods! Thus try LC_MESSAGE if on one of
// those systems.
// It is supposedly not defined on WINDOWS, so am including it here
// for possible uncommenting if a problem is shown
//
// if (!defined('LC_MESSAGES')) define('LC_MESSAGES', 6);
// yes, setlocale is case-sensitive...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 we don't get the setting we want, make sure to complain!
if ( ( $locale_set != $this->_language && CC_LANG == $locale_set) ||
empty($locale_set) )
{
CCDebug::Log(
sprintf("Tried: setlocale to '%s', but could only set to '%s'.", $this->_language, $locale_set) );
}

$bindtextdomain_set = bindtextdomain($this->_domain,
CC_LANG_LOCALE . "/" . $this->_locale_pref );
if ( empty($bindtextdomain_set) )
CCDebug::Log(
sprintf("Tried: bindtextdomain, '%s', to directory, '%s', " .
"but received '%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("Tried: set textdomain to '%s', but got '%s'",
$this->_domain, $textdomain_set));

} // end of method Init ()
up
2
przemekkus at interia dot pl
18 years ago
I had problems with German "umlauts" when using gettext. So, this is how it can be resolved:

I've put these lines itom my PHP code:

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

It works!
To Top