The branch, gettext has been updated
via 237c009be876bb2e7563f76cdae30a6ffa610ef8 (commit)
from 2b0cc1d9fc7a344ac2a009549a3eb5e1baed8d0b (commit)
- Log -----------------------------------------------------------------
commit 237c009be876bb2e7563f76cdae30a6ffa610ef8
Author: Michal Čihař <michal(a)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
--
phpMyAdmin