The branch, gettext has been updated via 237c009be876bb2e7563f76cdae30a6ffa610ef8 (commit) from 2b0cc1d9fc7a344ac2a009549a3eb5e1baed8d0b (commit)
- Log ----------------------------------------------------------------- commit 237c009be876bb2e7563f76cdae30a6ffa610ef8 Author: Michal Čihař michal@cihar.com Date: Tue Mar 23 15:31:55 2010 +0100
Update php-gettext to 1.0.10.
We're now using upstream version with no changes.
-----------------------------------------------------------------------
Summary of changes: libraries/php-gettext/gettext.inc | 292 ++++++++++++++++++++++++++---------- libraries/php-gettext/gettext.php | 45 +++++-- 2 files changed, 245 insertions(+), 92 deletions(-) mode change 100755 => 100644 libraries/php-gettext/gettext.php mode change 100755 => 100644 libraries/php-gettext/streams.php
diff --git a/libraries/php-gettext/gettext.inc b/libraries/php-gettext/gettext.inc index 3edd42e..399a0f2 100644 --- a/libraries/php-gettext/gettext.inc +++ b/libraries/php-gettext/gettext.inc @@ -62,6 +62,56 @@ class domain { // Utility functions
/** + * Return a list of locales to try for any POSIX-style locale specification. + */ +function get_list_of_locales($locale) { + /* Figure out all possible locale names and start with the most + * specific ones. I.e. for sr_CS.UTF-8@latin, look through all of + * sr_CS.UTF-8@latin, sr_CS@latin, sr@latin, sr_CS.UTF-8, sr_CS, sr. + */ + $locale_names = array(); + $lang = NULL; + $country = NULL; + $charset = NULL; + $modifier = NULL; + if ($locale) { + if (preg_match("/^(?P<lang>[a-z]{2,3})" // language code + ."(?:_(?P<country>[A-Z]{2}))?" // country code + ."(?:.(?P<charset>[-A-Za-z0-9_]+))?" // charset + ."(?:@(?P<modifier>[-A-Za-z0-9_]+))?$/", // @ modifier + $locale, $matches)) { + + if (isset($matches["lang"])) $lang = $matches["lang"]; + if (isset($matches["country"])) $country = $matches["country"]; + if (isset($matches["charset"])) $charset = $matches["charset"]; + if (isset($matches["modifier"])) $modifier = $matches["modifier"]; + + if ($modifier) { + if ($country) { + if ($charset) + array_push($locale_names, "${lang}_$country.$charset@$modifier"); + array_push($locale_names, "${lang}_$country@$modifier"); + } elseif ($charset) + array_push($locale_names, "${lang}.$charset@$modifier"); + array_push($locale_names, "$lang@$modifier"); + } + if ($country) { + if ($charset) + array_push($locale_names, "${lang}_$country.$charset"); + array_push($locale_names, "${lang}_$country"); + } elseif ($charset) + array_push($locale_names, "${lang}.$charset"); + array_push($locale_names, $lang); + } + + // If the locale name doesn't match POSIX style, just include it as-is. + if (!in_array($locale, $locale_names)) + array_push($locale_names, $locale); + } + return $locale_names; +} + +/** * Utility function to get a StreamReader for the given text domain. */ function _get_reader($domain=null, $category=5, $enable_cache=true) { @@ -73,46 +123,8 @@ function _get_reader($domain=null, $category=5, $enable_cache=true) { $bound_path = isset($text_domains[$domain]->path) ? $text_domains[$domain]->path : './'; $subpath = $LC_CATEGORIES[$category] ."/$domain.mo"; - /* Figure out all possible locale names and start with the most - specific ones. I.e. for sr_CS.UTF-8@latin, look through all of - sr_CS.UTF-8@latin, sr_CS@latin, sr@latin, sr_CS.UTF-8, sr_CS, sr. - */ - $locale_names = array(); - if (preg_match("/([a-z]{2,3})" // language code - ."(_([A-Z]{2}))?" // country code - ."(.([-A-Za-z0-9_]))?" // charset - ."(@([-A-Za-z0-9_]+))?/", // @ modifier - $locale, $matches)) { - if (isset($matches[1])) { - $lang = $matches[1]; - } else { - $lang = NULL; - } - if (isset($matches[3])) { - $country = $matches[3]; - } else { - $country = NULL; - } - if (isset($matches[5])) { - $charset = $matches[5]; - } else { - $charset = NULL; - } - if (isset($matches[7])) { - $modifier = $matches[7]; - } else { - $modifier = NULL; - } - if ($modifier) { - $locale_names = array("${lang}_$country.$charset@$modifier", - "${lang}_$country@$modifier", - "$lang@$modifier"); - } - array_push($locale_names, - "${lang}_$country.$charset", "${lang}_$country", "$lang"); - } - array_push($locale_names, $locale);
+ $locale_names = get_list_of_locales($locale); $input = null; foreach ($locale_names as $locale) { $full_path = $bound_path . $locale . "/" . $subpath; @@ -143,8 +155,10 @@ function locale_emulation() { /** * Checks if the current locale is supported on this system. */ -function _check_locale() { +function _check_locale_and_function($function=false) { global $EMULATEGETTEXT; + if ($function and !function_exists($function)) + return false; return !$EMULATEGETTEXT; }
@@ -172,11 +186,19 @@ function _encode($text) { }
- - // Custom implementation of the standard gettext related functions
/** + * Returns passed in $locale, or environment variable $LANG if $locale == ''. + */ +function _get_default_locale($locale) { + if ($locale == '') // emulate variable support + return getenv('LANG'); + else + return $locale; +} + +/** * Sets a requested locale, if needed emulates it. */ function _setlocale($category, $locale) { @@ -189,18 +211,21 @@ function _setlocale($category, $locale) { // even if we tried to read locale without setting it first return _setlocale($category, $CURRENTLOCALE); } else { - $ret = 0; - if (function_exists('setlocale')) // I don't know if this ever happens ;) - $ret = setlocale($category, $locale); - if (($ret and $locale == '') or ($ret == $locale)) { - $EMULATEGETTEXT = 0; + if (function_exists('setlocale')) { + $ret = setlocale($category, $locale); + if (($locale == '' and !$ret) or // failed setting it by env + ($locale != '' and $ret != $locale)) { // failed setting it + // Failed setting it according to environment. + $CURRENTLOCALE = _get_default_locale($locale); + $EMULATEGETTEXT = 1; + } else { $CURRENTLOCALE = $ret; + $EMULATEGETTEXT = 0; + } } else { - if ($locale == '') // emulate variable support - $CURRENTLOCALE = getenv('LANG'); - else - $CURRENTLOCALE = $locale; - $EMULATEGETTEXT = 1; + // No function setlocale(), emulate it all. + $CURRENTLOCALE = _get_default_locale($locale); + $EMULATEGETTEXT = 1; } // Allow locale to be changed on the go for one translation domain. global $text_domains, $default_domain; @@ -250,32 +275,21 @@ function _textdomain($domain) { */ function _gettext($msgid) { $l10n = _get_reader(); - //return $l10n->translate($msgid); return _encode($l10n->translate($msgid)); } + /** * Alias for gettext. */ function __($msgid) { return _gettext($msgid); } -/** - * Gettext with context. - */ -function _pgettext($msgctx, $msgid) { - $ret = _gettext($msgctx . "\004" . $msgid); - if (strpos($ret, "\004") !== FALSE) { - return $msgid; - } else { - return $ret; - } -} + /** * Plural version of gettext. */ function _ngettext($single, $plural, $number) { $l10n = _get_reader(); - //return $l10n->ngettext($single, $plural, $number); return _encode($l10n->ngettext($single, $plural, $number)); }
@@ -284,15 +298,14 @@ function _ngettext($single, $plural, $number) { */ function _dgettext($domain, $msgid) { $l10n = _get_reader($domain); - //return $l10n->translate($msgid); return _encode($l10n->translate($msgid)); } + /** * Plural version of dgettext. */ function _dngettext($domain, $single, $plural, $number) { $l10n = _get_reader($domain); - //return $l10n->ngettext($single, $plural, $number); return _encode($l10n->ngettext($single, $plural, $number)); }
@@ -301,7 +314,6 @@ function _dngettext($domain, $single, $plural, $number) { */ function _dcgettext($domain, $msgid, $category) { $l10n = _get_reader($domain, $category); - //return $l10n->translate($msgid); return _encode($l10n->translate($msgid)); } /** @@ -309,61 +321,159 @@ function _dcgettext($domain, $msgid, $category) { */ function _dcngettext($domain, $single, $plural, $number, $category) { $l10n = _get_reader($domain, $category); - //return $l10n->ngettext($single, $plural, $number); return _encode($l10n->ngettext($single, $plural, $number)); }
+/** + * Context version of gettext. + */ +function _pgettext($context, $msgid) { + $l10n = _get_reader(); + return _encode($l10n->pgettext($context, $msgid)); +} + +/** + * Override the current domain in a context gettext call. + */ +function _dpgettext($domain, $context, $msgid) { + $l10n = _get_reader($domain); + return _encode($l10n->pgettext($context, $msgid)); +} + +/** + * Overrides the domain and category for a single context-based lookup. + */ +function _dcpgettext($domain, $context, $msgid, $category) { + $l10n = _get_reader($domain, $category); + return _encode($l10n->pgettext($context, $msgid)); +} + +/** + * Context version of ngettext. + */ +function _npgettext($context, $singular, $plural) { + $l10n = _get_reader(); + return _encode($l10n->npgettext($context, $singular, $plural)); +} + +/** + * Override the current domain in a context ngettext call. + */ +function _dnpgettext($domain, $context, $singular, $plural) { + $l10n = _get_reader($domain); + return _encode($l10n->npgettext($context, $singular, $plural)); +} + +/** + * Overrides the domain and category for a plural context-based lookup. + */ +function _dcnpgettext($domain, $context, $singular, $plural, $category) { + $l10n = _get_reader($domain, $category); + return _encode($l10n->npgettext($context, $singular, $plural)); +} +
-// Wrappers to use if the standard gettext functions are available, but the current locale is not supported by the system. -// Use the standard impl if the current locale is supported, use the custom impl otherwise. +// Wrappers to use if the standard gettext functions are available, +// but the current locale is not supported by the system. +// Use the standard impl if the current locale is supported, use the +// custom impl otherwise.
function T_setlocale($category, $locale) { return _setlocale($category, $locale); }
function T_bindtextdomain($domain, $path) { - if (_check_locale()) return bindtextdomain($domain, $path); + if (_check_locale_and_function()) return bindtextdomain($domain, $path); else return _bindtextdomain($domain, $path); } function T_bind_textdomain_codeset($domain, $codeset) { // bind_textdomain_codeset is available only in PHP 4.2.0+ - if (_check_locale() and function_exists('bind_textdomain_codeset')) return bind_textdomain_codeset($domain, $codeset); + if (_check_locale_and_function('bind_textdomain_codeset')) + return bind_textdomain_codeset($domain, $codeset); else return _bind_textdomain_codeset($domain, $codeset); } function T_textdomain($domain) { - if (_check_locale()) return textdomain($domain); + if (_check_locale_and_function()) return textdomain($domain); else return _textdomain($domain); } function T_gettext($msgid) { - if (_check_locale()) return gettext($msgid); + if (_check_locale_and_function()) return gettext($msgid); else return _gettext($msgid); } function T_($msgid) { - if (_check_locale()) return _($msgid); + if (_check_locale_and_function()) return _($msgid); return __($msgid); } function T_ngettext($single, $plural, $number) { - if (_check_locale()) return ngettext($single, $plural, $number); + if (_check_locale_and_function()) + return ngettext($single, $plural, $number); else return _ngettext($single, $plural, $number); } function T_dgettext($domain, $msgid) { - if (_check_locale()) return dgettext($domain, $msgid); + if (_check_locale_and_function()) return dgettext($domain, $msgid); else return _dgettext($domain, $msgid); } function T_dngettext($domain, $single, $plural, $number) { - if (_check_locale()) return dngettext($domain, $single, $plural, $number); + if (_check_locale_and_function()) + return dngettext($domain, $single, $plural, $number); else return _dngettext($domain, $single, $plural, $number); } function T_dcgettext($domain, $msgid, $category) { - if (_check_locale()) return dcgettext($domain, $msgid, $category); + if (_check_locale_and_function()) + return dcgettext($domain, $msgid, $category); else return _dcgettext($domain, $msgid, $category); } function T_dcngettext($domain, $single, $plural, $number, $category) { - if (_check_locale()) return dcngettext($domain, $single, $plural, $number, $category); + if (_check_locale_and_function()) + return dcngettext($domain, $single, $plural, $number, $category); else return _dcngettext($domain, $single, $plural, $number, $category); }
+function T_pgettext($context, $msgid) { + if (_check_locale_and_function('pgettext')) + return pgettext($context, $msgid); + else + return _pgettext($context, $msgid); +} + +function T_dpgettext($domain, $context, $msgid) { + if (_check_locale_and_function('dpgettext')) + return dpgettext($domain, $context, $msgid); + else + return _dpgettext($domain, $context, $msgid); +} + +function T_dcpgettext($domain, $context, $msgid, $category) { + if (_check_locale_and_function('dcpgettext')) + return dcpgettext($domain, $context, $msgid, $category); + else + return _dcpgettext($domain, $context, $msgid, $category); +} + +function T_npgettext($context, $singular, $plural) { + if (_check_locale_and_function('npgettext')) + return npgettext($context, $single, $plural, $number); + else + return _npgettext($context, $single, $plural, $number); +} + +function T_dnpgettext($domain, $context, $singular, $plural) { + if (_check_locale_and_function('dnpgettext')) + return dnpgettext($domain, $context, $single, $plural, $number); + else + return _dnpgettext($domain, $context, $single, $plural, $number); +} + +function T_dcnpgettext($domain, $context, $singular, $plural, $category) { + if (_check_locale_and_function('dcnpgettext')) + return dcnpgettext($domain, $context, $single, + $plural, $number, $category); + else + return _dcnpgettext($domain, $context, $single, + $plural, $number, $category); +} +
// Wrappers used as a drop in replacement for the standard gettext functions @@ -399,6 +509,26 @@ if (!function_exists('gettext')) { function dcngettext($domain, $single, $plural, $number, $category) { return _dcngettext($domain, $single, $plural, $number, $category); } + function pgettext($context, $msgid) { + return _pgettext($context, $msgid); + } + function npgettext($context, $single, $plural, $number) { + return _npgettext($context, $single, $plural, $number); + } + function dpgettext($domain, $context, $msgid) { + return _dpgettext($domain, $context, $msgid); + } + function dnpgettext($domain, $context, $single, $plural, $number) { + return _dnpgettext($domain, $context, $single, $plural, $number); + } + function dcpgettext($domain, $context, $msgid, $category) { + return _dcpgettext($domain, $context, $msgid, $category); + } + function dcnpgettext($domain, $context, $single, $plural, + $number, $category) { + return _dcnpgettext($domain, $context, $single, $plural, + $number, $category); + } }
?> diff --git a/libraries/php-gettext/gettext.php b/libraries/php-gettext/gettext.php old mode 100755 new mode 100644 index 8865d78..a121f9c --- a/libraries/php-gettext/gettext.php +++ b/libraries/php-gettext/gettext.php @@ -134,7 +134,7 @@ class gettext_reader { * Loads the translation tables from the MO file into the cache * If caching is enabled, also loads all strings into a cache * to speed up translation lookups - * + * * @access private */ function load_tables() { @@ -144,10 +144,14 @@ class gettext_reader { return;
/* get original and translations tables */ - $this->STREAM->seekto($this->originals); - $this->table_originals = $this->readintarray($this->total * 2); - $this->STREAM->seekto($this->translations); - $this->table_translations = $this->readintarray($this->total * 2); + if (!is_array($this->table_originals)) { + $this->STREAM->seekto($this->originals); + $this->table_originals = $this->readintarray($this->total * 2); + } + if (!is_array($this->table_translations)) { + $this->STREAM->seekto($this->translations); + $this->table_translations = $this->readintarray($this->total * 2); + }
if ($this->enable_cache) { $this->cache_translations = array (); @@ -301,6 +305,20 @@ class gettext_reader { }
/** + * Parse full PO header and extract only plural forms line. + * + * @access private + * @return string verbatim plural form header field + */ + function extract_plural_forms_header_from_po_header($header) { + if (preg_match("/(^|\n)plural-forms: ([^\n]*)\n/i", $header, $regs)) + $expr = $regs[2]; + else + $expr = "nplurals=2; plural=n == 1 ? 0 : 1;"; + return $expr; + } + + /** * Get possible plural forms from MO header * * @access private @@ -318,11 +336,7 @@ class gettext_reader { } else { $header = $this->get_translation_string(0); } - if (eregi("plural-forms: ([^\n]*)\n", $header, $regs)) - $expr = $regs[1]; - else - $expr = "nplurals=2; plural=n == 1 ? 0 : 1;"; - + $expr = $this->extract_plural_forms_header_from_po_header($header); $this->pluralheader = $this->sanitize_plural_expression($expr); } return $this->pluralheader; @@ -370,7 +384,7 @@ class gettext_reader { $select = $this->select_string($number);
// this should contains all strings separated by NULLs - $key = $single.chr(0).$plural; + $key = $single . chr(0) . $plural;
if ($this->enable_cache) { @@ -393,6 +407,15 @@ class gettext_reader { } }
+ function pgettext($context, $msgid) { + $key = $context . chr(4) . $msgid; + return $this->translate($key); + } + + function npgettext($context, $singular, $plural, $number) { + $singular = $context . chr(4) . $singular; + return $this->ngettext($singular, $plural, $number); + } }
?> diff --git a/libraries/php-gettext/streams.php b/libraries/php-gettext/streams.php old mode 100755 new mode 100644
hooks/post-receive