From 0801dce99934d115610c81846d2d7e758f1e2056 Mon Sep 17 00:00:00 2001 From: phpnut Date: Wed, 14 Jun 2006 19:06:14 +0000 Subject: [PATCH] git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@3092 3807eeeb-6ff5-0310-8944-8be069107fe0 --- cake/basics.php | 160 ++- cake/libs/i18n.php | 627 +++++++++ cake/libs/l10n.php | 1202 +++++++++++++++++ .../model/{ => datasources}/dbo/dbo_adodb.php | 0 .../{ => datasources}/dbo/dbo_generic.php | 0 .../model/{ => datasources}/dbo/dbo_mssql.php | 0 .../model/{ => datasources}/dbo/dbo_mysql.php | 0 .../{ => datasources}/dbo/dbo_mysqli.php | 0 .../model/{ => datasources}/dbo/dbo_odbc.php | 0 .../model/{ => datasources}/dbo/dbo_pear.php | 0 .../{ => datasources}/dbo/dbo_postgres.php | 0 .../{ => datasources}/dbo/dbo_sqlite.php | 0 cake/libs/model/i18n/i18n.sql | 18 + cake/libs/model/i18n/translate.php | 688 ++++++++++ cake/libs/validation.php | 504 +++++++ 15 files changed, 3193 insertions(+), 6 deletions(-) create mode 100644 cake/libs/i18n.php create mode 100644 cake/libs/l10n.php rename cake/libs/model/{ => datasources}/dbo/dbo_adodb.php (100%) rename cake/libs/model/{ => datasources}/dbo/dbo_generic.php (100%) rename cake/libs/model/{ => datasources}/dbo/dbo_mssql.php (100%) rename cake/libs/model/{ => datasources}/dbo/dbo_mysql.php (100%) rename cake/libs/model/{ => datasources}/dbo/dbo_mysqli.php (100%) rename cake/libs/model/{ => datasources}/dbo/dbo_odbc.php (100%) rename cake/libs/model/{ => datasources}/dbo/dbo_pear.php (100%) rename cake/libs/model/{ => datasources}/dbo/dbo_postgres.php (100%) rename cake/libs/model/{ => datasources}/dbo/dbo_sqlite.php (100%) create mode 100644 cake/libs/model/i18n/i18n.sql create mode 100644 cake/libs/model/i18n/translate.php create mode 100644 cake/libs/validation.php diff --git a/cake/basics.php b/cake/basics.php index 0971f48b4..95ab141ce 100644 --- a/cake/basics.php +++ b/cake/basics.php @@ -910,21 +910,169 @@ } } /** + * * Returns a translated string if one is found, * or the submitted message if not found. * - * @param unknown_type $msg - * @param unknown_type $return + * @param unknown_type $msg + * @param unknown_type $return * @return unknown - * @todo Not implemented fully till 2.0 */ function __($msg, $return = null) { - if (is_null($return)) { - echo($msg); + if(!class_exists('I18n')) { + uses('i18n'); + } + $calledFrom = debug_backtrace(); + $dir = dirname($calledFrom[0]['file']); + if(is_null($return)) { + echo I18n::translate($msg, $msg2=NULL, $domain=NULL, $category=NULL, $count=NULL, $dir); } else { - return $msg; + return I18n::translate($msg, $msg2=NULL, $domain=NULL, $category=NULL, $count=NULL, $dir); } } +/** + * + * Returns correct plural form of message identified by $msg1 and $msg2 for count $count. + * Some languages have more than one form for plural messages dependent on the count. + * + * @param unknown_type $msg1 + * @param unknown_type $msg2 + * @param unknown_type $count + * @param unknown_type $return + * @return unknown + */ + function __n($msg1, $msg2, $count, $return = null) { + if(!class_exists('I18n')) { + uses('i18n'); + } + $calledFrom = debug_backtrace(); + $dir = dirname($calledFrom[0]['file']); + if(is_null($return)) { + echo I18n::translate($msg1, $msg2, NULL, NULL, $count, $dir); + } else { + return I18n::translate($msg1, $msg2, NULL, NULL, $count, $dir); + } + } +/** + * + * Allows you to override the current domain for a single plural message lookup + * Returns correct plural form of message identified by $msg1 and $msg2 for count $count + * from domain $domain + * + * @param unknown_type $domain + * @param unknown_type $msg1 + * @param unknown_type $msg2 + * @param unknown_type $count + * @param unknown_type $return + * @return unknown + */ + function __dn($domain, $msg1, $msg2, $count, $return = null) { + if(!class_exists('I18n')) { + uses('i18n'); + } + $calledFrom = debug_backtrace(); + $dir = dirname($calledFrom[0]['file']); + if(is_null($return)) { + echo I18n::translate($msg1, $msg2, $domain, NULL, $count, $dir);; + } else { + return I18n::translate($msg1, $msg2, $domain, NULL, $count, $dir); + } + } +/** + * + * Allows you to override the current domain for a single plural message lookup. + * It also allows you to specify a category. + * Returns correct plural form of message identified by $msg1 and $msg2 for count $count + * from domain $domain + * + * The category argument allows a specific category of the locale settings to be used for fetching a message. + * Valid categories are: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES and LC_ALL. + * + * Note that the category must be specified with a numeric value, instead of the constant name. The values are: + * LC_CTYPE 0 + * LC_NUMERIC 1 + * LC_TIME 2 + * LC_COLLATE 3 + * LC_MONETARY 4 + * LC_MESSAGES 5 + * LC_ALL 6 + * + * @param unknown_type $domain + * @param unknown_type $msg1 + * @param unknown_type $msg2 + * @param unknown_type $count + * @param unknown_type $category + * @param unknown_type $return + * @return unknown + */ + function __dcn($domain, $msg1, $msg2, $count, $category, $return = null) { + if(!class_exists('I18n')) { + uses('i18n'); + } + $calledFrom = debug_backtrace(); + $dir = dirname($calledFrom[0]['file']); + if(is_null($return)) { + echo I18n::translate($msg1, $msg2, $domain, $category, $count, $dir); + } else { + return I18n::translate($msg1, $msg2, $domain, $category, $count, $dir); + } + } +/** + * + * Allows you to override the current domain for a single message lookup. + * It also allows you to specify a category. + * + * The category argument allows a specific category of the locale settings to be used for fetching a message. + * Valid categories are: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES and LC_ALL. + * + * Note that the category must be specified with a numeric value, instead of the constant name. The values are: + * LC_CTYPE 0 + * LC_NUMERIC 1 + * LC_TIME 2 + * LC_COLLATE 3 + * LC_MONETARY 4 + * LC_MESSAGES 5 + * LC_ALL 6 + * + * @param unknown_type $domain + * @param unknown_type $msg + * @param unknown_type $category + * @param unknown_type $return + * @return unknown + */ + function __dc($domain, $msg, $category, $return = null) { + if(!class_exists('I18n')) { + uses('i18n'); + } + $calledFrom = debug_backtrace(); + $dir = dirname($calledFrom[0]['file']); + if(is_null($return)) { + echo I18n::translate($msg, NULL, $domain, $category, NULL, $dir); + } else { + return I18n::translate($msg, NULL, $domain, $category, NULL, $dir); + } + } +/** + * + * Allows you to override the current domain for a single message lookup. + * + * @param unknown_type $domain + * @param unknown_type $msg + * @param unknown_type $return + * @return unknown + */ + function __d($domain, $msg, $return = null) { + if(!class_exists('I18n')) { + uses('i18n'); + } + $calledFrom = debug_backtrace(); + $dir = dirname($calledFrom[0]['file']); + if(is_null($return)) { + echo I18n::translate($msg, NULL, $domain, NULL, NULL, $dir); + } else { + return I18n::translate($msg, NULL, $domain, NULL, NULL, $dir); + } + } /** * Counts the dimensions of an array * diff --git a/cake/libs/i18n.php b/cake/libs/i18n.php new file mode 100644 index 000000000..852c5616a --- /dev/null +++ b/cake/libs/i18n.php @@ -0,0 +1,627 @@ + + * Copyright (c) 2005, Cake Software Foundation, Inc. + * 1785 E. Sahara Avenue, Suite 490-204 + * Las Vegas, Nevada 89104 + * + * Licensed under The MIT License + * Redistributions of files must retain the above copyright notice. + * + * @filesource + * @copyright Copyright (c) 2005, Cake Software Foundation, Inc. + * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project + * @package cake + * @subpackage cake.cake.libs + * @since CakePHP v 0.10.3.1465 + * @version $Revision$ + * @modifiedby $LastChangedBy$ + * @lastmodified $Date$ + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + */ + +/** + * Included libraries. + */ +uses('l10n'); + +/** + * Short description for file. + * + * Long description for file + * + * @package cake + * @subpackage cake.cake.libs + * @since CakePHP v 0.10.3.1465 + */ +class I18n extends Object +{ +/** + * Enter description here... + * + * @var unknown_type + * @access private + */ + var $_l10n = null; + +/** + * Enter description here... + * + * @var unknown_type + */ + var $locale = null; + +/** + * Enter description here... + * + * @var unknown_type + * @access private + */ + var $_domains = array(); + +/** + * Enter description here... + * + * @var unknown_type + * @access private + */ + var $_noLocal = null; + +/** + * Enter description here... + * + * @return unknown + */ + function &getInstance() + { + static $instance = array(); + if (!$instance) + { + $instance[0] =& new I18n(); + $instance[0]->_l10n =& new L10n(); + } + return $instance[0]; + } + +/** + * Enter description here... + * + * @param unknown_type $message + * @param unknown_type $message2 + * @param unknown_type $domain + * @param unknown_type $category + * @param unknown_type $count + * @param unknown_type $directory + * @return unknown + */ + function translate($message, $message2 = NULL, $domain = NULL, $category = NULL, $count = NULL, $directory) + { + $_this =& I18n::getInstance(); + + if(!empty($_SESSION['Config']['locale'])) + { + $_this->locale = $_SESSION['Config']['locale']; + } + else + { + $_this->locale = $_this->_l10n->locale; + } + + if(is_null($domain)) + { + if (preg_match('/views{0,1}\\'.DS.'([^\/]*)/', $directory, $regs)) + { + $domain = $regs[1]; + } + elseif (preg_match('/controllers{0,1}\\'.DS.'([^\/]*)/', $directory, $regs)) + { + $domain = ($regs[1]); + } + if(isset($domain) && $domain == 'templates') + { + if (preg_match('/templates{0,1}\\'.DS.'([^\/]*)/', $directory, $regs)) + { + $domain = ($regs[1]); + } + } + } + + if(!isset($_this->_domains[$domain])) + { + $_this->_bindTextDomain($domain); + } + + if (!isset($count)) + { + $pli = 0; + } + elseif (!empty($_this->_domains[$domain]["%plural-c"]) && is_null($_this->_noLocal)) + { + $ph = $_this->_domains[$domain]["%plural-c"]; + $pli = $_this->_pluralGuess($ph, $count); + } + else + { + if ($count != 1) + { + $pli = 1; + } + else + { + $pli = 0; + } + } + + if(!empty($_this->_domains[$domain][$message])) + { + if (($trans = $_this->_domains[$domain][$message]) || ($pli) && ($trans = $_this->_domains[$domain][$message2])) + { + if (is_array($trans)) + { + if (!isset($trans[$pli])) + { + $pli = 0; + + } + $trans = $trans[$pli]; + } + if (strlen($trans)) + { + $message = $trans; + return $message; + } + } + } + if(!empty($pli)) + { + return($message2); + } + else + { + return($message); + } + } + +/** + * Enter description here... + * + * @param unknown_type $type + * @param unknown_type $n + * @return unknown + * @access private + */ + function _pluralGuess(&$type, $n) + { + if (is_string($type)) + { + if (($type == "nplurals=1;plural=0;") || !strlen($type)) + { + $type = -1; + } + elseif ($type == "nplurals=2;plural=n!=1;") + { + $type = 1; + } + elseif ($type == "nplurals=2;plural=n>1;") + { + $type = 2; + } + elseif (strpos($type, "n%100!=11")) + { + if (strpos($type, "n!=0")) + { + $type == 21; + } + if (strpos($type, "n%10<=4")) + { + $type = 22; + } + if (strpos($type, "n%10>=2")) + { + $type = 23; + } + } + elseif (strpos($type, "n<=4")) + { + $type = 25; + } + elseif (strpos($type, "n==2")) + { + $type = 31; + } + elseif (strpos($type, "n%10>=2")) + { + $type = 26; + } + elseif (strpos($type, "n%100==3")) + { + $type = 28; + } + elseif (strpos($type, ";plural=n;")) + { + $type = 7; + } + else + { + $type = 0; + } + } + + switch ($type) + { + case -1: + return (0); + + case 1: + if ($n != 1) + { + return (1); + } + else + { + return (0); + } + case 2: + if ($n > 1) + { + return (1); + } + else + { + return (0); + } + case 7: + return ($n); + case 21: + if (($n % 10 == 1) && ($n % 100 != 11)) + { + return (0); + } + else + { + if ($n != 0 ) + { + return (1); + } + else + { + return (2); + } + } + case 22: + if (($n % 10 == 1) && ($n % 100 != 11)) + { + return (0); + } + else + { + if (($n % 10 >= 2) && ($n % 10 <= 4) && ($n % 100 < 10 || $n % 100 >= 20)) + { + return (1); + } + else + { + return (2); + } + } + case 23: + if (($n % 10 == 1) && ($n % 100 != 11)) + { + return (0); + } + else + { + if (($n %10 >= 2) && ($n % 100 < 10 || $n % 100 >= 20)) + { + return (1); + } + else + { + return (2); + } + } + case 25: + if ($n==1) + { + return (0); + } + else + { + if ($n >= 2 && $n <= 4) + { + return (1); + } + else + { + return (2); + } + } + case 26: + if ($n==1) + { + return (0); + } + else + { + if ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20)) + { + return (1); + } + else + { + return (2); + } + } + case 28: + if ($n % 100 == 1) + { + return (0); + } + else + { + if ($n % 100 == 2 || $n % 100 == 3 || $n % 100 == 4) + { + return (2); + } + else + { + return (3); + } + } + case 31: + if ($n == 1) + { + return (0); + } + else + { + if ($n == 2) + { + return (1); + } + else + { + return (2); + } + } + default: + $type = -1; + } + return(0); + } + +/** + * Enter description here... + * + * @param unknown_type $domain + * @return unknown + * @access private + */ + function _bindTextDomain($domain) + { + $_this =& I18n::getInstance(); + $_this->_noLocal = true; + + $searchPath[] = VIEWS.$domain.DS."locale"; + $searchPath[] = CAKE."locale"; + + foreach (explode(",",$_this->locale) as $d) + { + $d = trim($d); + $d = strtok($d, "@.-+=%:; "); + if (strlen($d)) + { + $dir[] = $d; + } + if (strpos($d, "_")) + { + $dir[] = strtok($d, "_"); + } + } + foreach ($searchPath as $directory) + { + foreach ($dir as $lang) + { + $file = "$directory".DS."$lang".DS."LC_MESSAGES".DS."$domain"; + if (file_exists($fn = "$file.mo") && ($f = fopen($fn, "rb"))) + { + $_this->_loadMo($f, $domain); + $_this->_noLocal = null; + break 2; + } + elseif (file_exists($fn = "$file.po") && ($f = fopen($fn, "r"))) + { + $_this->_loadPo($f, $domain); + $_this->_noLocal = null; + break 2; + } + } + } + if(empty($_this->_domains[$domain])) + { + return($domain); + } + + if ($head = $_this->_domains[$domain][""]) + { + foreach (explode("\n", $head) as $line) + { + $header = strtok($line,":"); + $line = trim(strtok("\n")); + $_this->_domains[$domain]["%po-header"][strtolower($header)] = $line; + } + if(isset($_this->_domains[$domain]["%po-header"]["plural-forms"])) + { + $switch = preg_replace("/[(){}\\[\\]^\\s*\\]]+/", "", $_this->_domains[$domain]["%po-header"]["plural-forms"]); + $_this->_domains[$domain]["%plural-c"] = $switch; + } + } + return($domain); + } + +/** + * Enter description here... + * + * @param unknown_type $file + * @param unknown_type $domain + * @access private + */ + function _loadMo($file, $domain) + { + $_this =& I18n::getInstance(); + $data = fread($file, 1<<20); + fclose($file); + + if ($data) + { + $header = substr($data, 0, 20); + $header = unpack("L1magic/L1version/L1count/L1o_msg/L1o_trn", $header); + extract($header); + if ((dechex($magic) == "950412de") && ($version == 0)) + { + for ($n=0; $n<$count; $n++) + { + $r = unpack("L1len/L1offs", substr($data, $o_msg + $n * 8, 8)); + $msgid = substr($data, $r["offs"], $r["len"]); + unset($msgid_plural); + if (strpos($msgid, "\000")) + { + list($msgid, $msgid_plural) = explode("\000", $msgid); + } + $r = unpack("L1len/L1offs", substr($data, $o_trn + $n * 8, 8)); + $msgstr = substr($data, $r["offs"], $r["len"]); + if (strpos($msgstr, "\000")) + { + $msgstr = explode("\000", $msgstr); + } + $_this->_domains[$domain][$msgid] = $msgstr; + if (isset($msgid_plural)) + { + $_this->_domains[$domain][$msgid_plural] = &$_this->_domains[$domain][$msgid]; + } + } + } + } + } + +/** + * Enter description here... + * + * @param unknown_type $file + * @param unknown_type $domain + * @return unknown + * @access private + */ + function _loadPo($file, $domain) + { + $_this =& I18n::getInstance(); + $type = 0; + $translations = array(); + $translationKey = ""; + $plural = 0; + $header = ""; + + do + { + $line = trim(fgets($file,1024)); + if ($line == "" || $line[0] == "#") + { + continue; + } + if (preg_match("/msgid[[:space:]]+\"(.+)\"$/i", $line, $regs)) + { + $type = 1; + $translationKey = stripcslashes($regs[1]); + } + elseif (preg_match("/msgid[[:space:]]+\"\"$/i", $line, $regs)) + { + $type = 2; + $translationKey = ""; + } + elseif (preg_match("/^\"(.*)\"$/i", $line, $regs) && ($type == 1 || $type == 2 || $type == 3)) + { + $type = 3; + $translationKey .= stripcslashes($regs[1]); + } + elseif (preg_match("/msgstr[[:space:]]+\"(.+)\"$/i", $line, $regs) && ($type == 1 || $type == 3) && $translationKey) + { + $translations[$translationKey] = stripcslashes($regs[1]); + $type = 4; + } elseif (preg_match("/msgstr[[:space:]]+\"\"$/i", $line, $regs) && ($type == 1 || $type == 3) && $translationKey) + { + $type = 4; + $translations[$translationKey] = ""; + } elseif (preg_match("/^\"(.*)\"$/i", $line, $regs) && $type == 4 && $translationKey) + { + $translations[$translationKey] .= stripcslashes($regs[1]); + } elseif (preg_match("/msgid_plural[[:space:]]+\".*\"$/i", $line, $regs)) + { + $type = 6; + } + elseif (preg_match("/msgstr\[(\d+)\][[:space:]]+\"(.+)\"$/i", $line, $regs) && ($type == 6) && $translationKey) + { + $plural = $regs[1]; + $translations[$translationKey][$plural] = stripcslashes($regs[2]); + $type = 6; + } + elseif (preg_match("/msgstr\[(\d+)\][[:space:]]+\"\"$/i", $line, $regs) && ($type == 6) && $translationKey) + { + $plural = $regs[1]; + $translations[$translationKey][$plural] = ""; + $type = 6; + } + elseif (preg_match("/^\"(.*)\"$/i", $line, $regs) && $type == 6 && $translationKey) + { + $translations[$translationKey][$plural] .= stripcslashes($regs[1]); + } + elseif (preg_match("/msgstr[[:space:]]+\"(.+)\"$/i", $line, $regs) && $type == 2 && !$translationKey) + { + $header = stripcslashes($regs[1]); + $type = 5; + } + elseif (preg_match("/msgstr[[:space:]]+\"\"$/i", $line, $regs) && !$translationKey) + { + $header = ""; + $type = 5; + } + elseif (preg_match("/^\"(.*)\"$/i", $line, $regs) && $type == 5) + { + $header .= stripcslashes($regs[1]); + } + else + { + unset($translations[$translationKey]); + $type = 0; + $translationKey = ""; + $plural = 0; + } + } while(!feof($file)); + + fclose($file); + $merge[""] = $header; + return $_this->_domains[$domain] = array_merge($merge ,$translations); + } + +/** + * Enter description here... + * + * @param unknown_type $domain + * @param unknown_type $codeset + * @return unknown + * @access private + * @todo Not implemented + */ + function _bindTextDomainCodeset($domain, $codeset) + { + return($domain); + } +} +?> \ No newline at end of file diff --git a/cake/libs/l10n.php b/cake/libs/l10n.php new file mode 100644 index 000000000..edec36874 --- /dev/null +++ b/cake/libs/l10n.php @@ -0,0 +1,1202 @@ + + * Copyright (c) 2005, Cake Software Foundation, Inc. + * 1785 E. Sahara Avenue, Suite 490-204 + * Las Vegas, Nevada 89104 + * + * Licensed under The MIT License + * Redistributions of files must retain the above copyright notice. + * + * @filesource + * @copyright Copyright (c) 2005, Cake Software Foundation, Inc. + * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project + * @package cake + * @subpackage cake.cake.libs + * @since CakePHP v 0.10.3.1423 + * @version $Revision$ + * @modifiedby $LastChangedBy$ + * @lastmodified $Date$ + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + */ + +/** + * Short description for file. + * + * Long description for file + * + * @package cake + * @subpackage cake.cake.libs + * @since CakePHP v 0.10.3.1423 + */ + +class L10n extends Object +{ + var $language = 'English (United States)'; + var $languagePath = 'eng'; + var $lang = 'en-us'; + var $locale = 'en_US'; + var $winLocale = 'eng'; + + var $_l10nMap = array( +/*Afar*/ 'aar' => 'aa', +/*Abkhazian*/ 'abk' => 'ab', +/*Achinese*/ 'ace' => 'ace', +/*Acoli*/ 'ach' => 'ach', +/*Adangme*/ 'ada' => 'ada', +/*Adyghe; Adygei*/ 'ady' => 'ady', +/*Afro-Asiatic (Other)*/ 'afa' => 'afa', +/*Afrihili*/ 'afh' => 'afh', +/*Amharic*/ 'afr' => 'af', +/*Ainu*/ 'ain' => 'ain', +/*Akan*/ 'aka' => 'ak', +/*Akkadian*/ 'akk' => 'akk', +/*Albanian*/ 'alb' => 'sq', +/*Aleut*/ 'ale' => 'ale', +/*Algonquian Languages*/ 'alg' => 'alg', +/*Southern Altai*/ 'alt' => 'alt', +/*Amharic*/ 'amh' => 'am', +/*English, Old*/ 'ang' => 'ang', +/*Apache languages*/ 'apa' => 'apa', +/*Arabic*/ 'ara' => 'ar', +/*Aramaic*/ 'arc' => 'arc', +/*Aragonese*/ 'arg' => 'an', +/*Armenian*/ 'arm' => 'hy', +/*Araucanian*/ 'arn' => 'arn', +/*Arapaho*/ 'arp' => 'arp', +/*Arawak*/ 'arw' => 'arw', +/*Assamese */ 'asm' => 'as', +/*Asturian; Bable*/ 'ast' => 'ast', +/*Athapascan languages*/ 'ath' => 'ath', +/*Australian languages*/ 'aus' => 'aus', +/*Avaric*/ 'ava' => 'av', +/*Avestan*/ 'ave' => 'ae', +/*Awadhi*/ 'awa' => 'awa', +/*Aymara*/ 'aym' => 'ay', +/*Azerbaijani*/ 'aze' => 'az', +/*Banda*/ 'bad' => 'bad', +/*Bamileke languages*/ 'bai' => 'bai', +/*Bashkir*/ 'bak' => 'ba', +/*Bashkir*/ 'bal' => 'bal', +/*Bambara*/ 'bam' => 'bam', +/*Balinese*/ 'ban' => 'ban', +/*Basque*/ 'baq' => 'eu', +/*Basa*/ 'bas' => 'bas', +/*Baltic (Other)*/ 'bat' => 'bat', +/*Beja*/ 'bej' => 'bej', +/*Belarusian*/ 'bel' => 'bel', +/*Bemba*/ 'bem' => 'bem', +/*Bengali*/ 'ben' => 'ben', +/*Berber (Other)*/ 'ber' => 'ber', +/*Bhojpuri*/ 'bho' => 'bho', +/*Bihari*/ 'bih' => 'bih', +/*Bikol*/ 'bik' => 'bik', +/*Bini*/ 'bin' => 'bin', +/*Bislama*/ 'bis' => 'bis', +/*Siksika*/ 'bla' => 'bla', +/*Bantu (Other)*/ 'bnt' => 'bnt', +/*Bosnian*/ 'bos' => 'bs', +/*Braj*/ 'bra' => 'bra', +/*Breton*/ 'bre' => 'br', +/*Batak (Indonesia)*/ 'btk' => 'btk', +/*Buriat*/ 'bua' => 'bua', +/*Buginese*/ 'bug' => 'bug', +/*Bulgarian*/ 'bul' => 'bg', +/*Burmese*/ 'bur' => 'my', +/*Blin; Bilin*/ 'byn' => 'byn', +/*Caddo*/ 'cad' => 'cad', +/*Central American Indian*/ 'cai' => 'cai', +/*Carib*/ 'car' => 'car', +/*Catalan; Valencian*/ 'cat' => 'ca', +/*Caucasian (Other)*/ 'cau' => 'cau', +/*Cebuano*/ 'ceb' => 'ceb', +/*Celtic (Other)*/ 'cel' => 'cel', +/*Chamorro*/ 'cha' => 'cha', +/*Chibcha*/ 'chb' => 'chb', +/*Chechen*/ 'che' => 'ce', +/*Chagatai*/ 'chg' => 'chg', +/*Chinese*/ 'chi' => 'zh', +/*Chuukese*/ 'chk' => 'chk', +/*Mari*/ 'chm' => 'chm', +/*Chinook jargon*/ 'chn' => 'chn', +/*Choctaw*/ 'cho' => 'cho', +/*Chipewyan*/ 'chp' => 'chp', +/*Cherokee*/ 'chr' => 'chr', +/*Church Slavic; + Old Slavonic; + Church Slavonic;*/ 'chu' => 'cu', +/*Chuvash*/ 'chv' => 'cv', +/*Cheyenne*/ 'chy' => 'chy', +/*Chamic languages*/ 'cmc' => 'cmc', +/*Coptic*/ 'cop' => 'cop', +/*Cornish*/ 'cor' => 'kw', +/*Corsican*/ 'cos' => 'co', +/*Creoles and pidgins, + English based (Other)*/ 'cpe' => 'cpe', +/*Creoles and pidgins, + French-based (Other)*/ 'cpf' => 'cpf', +/*Creoles and pidgins*/ 'cpp' => 'cpp', +/*Cree*/ 'cre' => 'cr', +/*Crimean Tatar; + Crimean Turkish*/ 'crh' => 'crh', +/*Creoles and pidgins + (Other)*/ 'crp' => 'crp', +/*Kashubian*/ 'csb' => 'csb', +/*Cushitic (Other)*/ 'cus' => 'cus', +/*Czech*/ 'cze' => 'cs', +/*Dakota*/ 'dak' => 'dak', +/*Danish*/ 'dan' => 'da', +/*Dargwa*/ 'dar' => 'dar', +/*Dayak*/ 'day' => 'day', +/*Delaware*/ 'del' => 'del', +/*Slave (Athapascan)*/ 'den' => 'den', +/*Dogrib*/ 'dgr' => 'dgr', +/*Dinka*/ 'din' => 'din', +/*Divehi*/ 'div' => 'dv', +/*Dogri*/ 'doi' => 'doi', +/*Dravidian (Other)*/ 'dra' => 'dra', +/*Lower Sorbian*/ 'dsb' => 'dsb', +/*Duala*/ 'dua' => 'dua', +/*Dutch, Middle*/ 'dum' => 'dum', +/*Dutch; Flemish*/ 'dut' => 'nl', +/*Dyula*/ 'dyu' => 'dyu', +/*Dzongkha*/ 'dzo' => 'dzo', +/*Efik*/ 'efi' => 'efi', +/*Egyptian (Ancient)*/ 'egy' => 'egy', +/*Ekajuk*/ 'eka' => 'eka', +/*Elamite*/ 'elx' => 'elx', +/*English*/ 'eng' => 'en', +/*English, Middle*/ 'enm' => 'enm', +/*Esperanto*/ 'epo' => 'eo', +/*Estonian*/ 'est' => 'et', +/*Ewe*/ 'ewe' => 'ee', +/*Ewondo*/ 'ewo' => 'ewo', +/*Fang*/ 'fan' => 'fan', +/*Faroese*/ 'fao' => 'fo', +/*Fanti*/ 'fat' => 'fat', +/*Fijian*/ 'fij' => 'fij', +/*Filipino; Pilipino*/ 'fil' => 'fil', +/*Finnish*/ 'fin' => 'fi', +/*Finno-Ugrian (Other)*/ 'fiu' => 'fiu', +/*Fon*/ 'fon' => 'fon', +/*French*/ 'fre' => 'fr', +/*French, Middle*/ 'frm' => 'frm', +/*French, Old*/ 'fro' => 'fro', +/*Frisian*/ 'fry' => 'fy', +/*Fulah*/ 'ful' => 'ff', +/*Friulian*/ 'fur' => 'fur', +/*Ga*/ 'gaa' => 'gaa', +/*Gayo*/ 'gay' => 'gay', +/*Gbaya*/ 'gba' => 'gba', +/*Germanic (Other)*/ 'gem' => 'gem', +/*Georgian*/ 'geo' => 'ka', +/*German*/ 'ger' => 'de', +/*Geez*/ 'gez' => 'gez', +/*Gilbertese*/ 'gil' => 'gil', +/*Gaelic; + Scottish Gaelic*/ 'gla' => 'gd', +/*Irish*/ 'gle' => 'ga', +/*Galician*/ 'glg' => 'gl', +/*Manx*/ 'glv' => 'gv', +/*German, Middle High*/ 'gmh' => 'gmh', +/*German, Old High*/ 'goh' => 'goh', +/*Gondi*/ 'gon' => 'gon', +/*Gorontalo*/ 'gor' => 'gor', +/*Gothic*/ 'got' => 'got', +/*Grebo*/ 'grb' => 'grb', +/*Greek, Ancient*/ 'grc' => 'grc', +/*Greek, Modern*/ 'gre' => 'gre', +/*Guarani*/ 'grn' => 'gn', +/*Gujarati*/ 'guj' => 'gu', +/*Gwich´in*/ 'gwi' => 'gwi', +/*Haida*/ 'hai' => 'hai', +/*Haitian; + Haitian Creole*/ 'hat' => 'ht', +/*Hausa*/ 'hau' => 'ha', +/*Hawaiian*/ 'haw' => 'haw', +/*Hebrew*/ 'heb' => 'he', +/*Herero*/ 'her' => 'hz', +/*Hiligaynon*/ 'hil' => 'hil', +/*Himachali*/ 'him' => 'him', +/*Hindi*/ 'hin' => 'hi', +/*Hmong*/ 'hmn' => 'hmn', +/*Hiri Motu*/ 'hmo' => 'ho', +/*Upper Sorbian*/ 'hsb' => 'hsb', +/*Hungarian*/ 'hun' => 'hu', +/*Hupa*/ 'hup' => 'hup', +/*Iban*/ 'iba' => 'iba', +/*Igbo*/ 'ibo' => 'ibo', +/*Icelandic*/ 'ice' => 'is', +/*Ido*/ 'ido' => 'io', +/*Sichuan Yi*/ 'iii' => 'ii', +/*Ijo*/ 'ijo' => 'ijo', +/*Inuktitut*/ 'iku' => 'iku', +/*Interlingue*/ 'ile' => 'ile', +/*Iloko*/ 'ilo' => 'ilo', +/*Interlingua*/ 'ina' => 'ia', +/*Indic (Other)*/ 'inc' => 'inc', +/*Indonesian*/ 'ind' => 'ind', +/*Indo-European (Other)*/ 'ine' => 'ine', +/*Ingush*/ 'inh' => 'inh', +/*Inupiaq*/ 'ipk' => 'ipk', +/*Iranian (Other)*/ 'ira' => 'ira', +/*Iroquoian languages*/ 'iro' => 'iro', +/*Italian*/ 'ita' => 'ita', +/*Javanese*/ 'jav' => 'jav', +/*Lojban*/ 'jbo' => 'jbo', +/*Japanese*/ 'jpn' => 'jpn', +/*Judeo-Persian*/ 'jpr' => 'jpr', +/*Judeo-Arabic*/ 'jrb' => 'jrb', +/*Kara-Kalpak*/ 'kaa' => 'kaa', +/*Kabyle*/ 'kab' => 'kab', +/*Kachin*/ 'kac' => 'kac', +/*Kalaallisut; Greenlandic*/'kal' => 'kal', +/*Kamba*/ 'kam' => 'kam', +/*Kannada*/ 'kan' => 'kan', +/*Karen*/ 'kar' => 'kar', +/*Kashmiri*/ 'kas' => 'kas', +/*Kanuri*/ 'kau' => 'kau', +/*Kawi*/ 'kaw' => 'kaw', +/*Kazakh*/ 'kaz' => 'kaz', +/*Kabardian*/ 'kbd' => 'kbd', +/*Khasi*/ 'kha' => 'kha', +/*Khoisan (Other)*/ 'khi' => 'khi', +/*Khmer*/ 'khm' => 'khm', +/*Khotanese*/ 'kho' => 'kho', +/*Kikuyu; Gikuyu*/ 'kik' => 'kik', +/*Kinyarwanda*/ 'kin' => 'kin', +/*Kirghiz*/ 'kir' => 'kir', +/*Kimbundu*/ 'kmb' => 'kmb', +/*Konkani*/ 'kok' => 'kok', +/*Komi*/ 'kom' => 'kom', +/*Kongo*/ 'kon' => 'koo', +/*Korean*/ 'kor' => 'ko', +/*Kosraean*/ 'kos' => 'kos', +/*Kpelle*/ 'kpe' => 'kpe', +/*Karachay-Balkar*/ 'krc' => 'krc', +/*Kru*/ 'kro' => 'kro', +/*Kurukh*/ 'kru' => 'kru', +/*Kuanyama; Kwanyama*/ 'kua' => 'kua', +/*Kumyk*/ 'kum' => 'kum', +/*Kurdish*/ 'kur' => 'ku', +/*Kutenai*/ 'kut' => 'kut', +/*Ladino*/ 'lad' => 'lad', +/*Lahnda*/ 'lah' => 'lah', +/*Lamba*/ 'lam' => 'lam', +/*Lao*/ 'lao' => 'lo', +/*Latin*/ 'lat' => 'lat', +/*Latvian*/ 'lav' => 'lav', +/*Lezghian*/ 'lez' => 'lez', +/*Limburgan; + Limburger; + Limburgish*/ 'lim' => 'lim', +/*Lingala*/ 'lin' => 'lin', +/*Lithuanian*/ 'lit' => 'lt', +/*Mongo*/ 'lol' => 'lol', +/*Lozi*/ 'loz' => 'loz', +/*Luxembourgish; + Letzeburgesch*/ 'ltz' => 'ltz', +/*Luba-Lulua*/ 'lua' => 'lua', +/*Luba-Katanga*/ 'lub' => 'lub', +/*Ganda*/ 'lug' => 'lug', +/*Luiseno*/ 'lui' => 'lui', +/*Lunda*/ 'lun' => 'lun', +/*Luo (Kenya and Tanzania)*/'luo' => 'luo', +/*Lushai*/ 'lus' => 'lus', +/*Macedonian*/ 'mac' => 'mac', +/*Madurese*/ 'mad' => 'mad', +/*Magahi*/ 'mag' => 'mag', +/*Marshallese*/ 'mah' => 'mah', +/*Maithili*/ 'mai' => 'mai', +/*Makasar*/ 'mak' => 'mak', +/*Malayalam*/ 'mal' => 'mal', +/*Mandingo*/ 'man' => 'man', +/*Maori*/ 'mao' => 'mi', +/*Austronesian (Other)*/ 'map' => 'map', +/*Marathi*/ 'mar' => 'mar', +/*Masai*/ 'mas' => 'mas', +/*Malay*/ 'may' => 'ms', +/*Moksha*/ 'mdf' => 'mdf', +/*Mandar*/ 'mdr' => 'mdr', +/*Mende*/ 'men' => 'men', +/*Irish, Middle*/ 'mga' => 'mga', +/*Micmac*/ 'mic' => 'mic', +/*Minangkabau*/ 'min' => 'min', +/*Mon-Khmer (Other)*/ 'mkh' => 'mkh', +/*Malagasy*/ 'mlg' => 'mlg', +/*Maltese*/ 'mlt' => 'mlt', +/*Manchu*/ 'mnc' => 'mnc', +/*Manipuri*/ 'mni' => 'mni', +/*Manobo languages*/ 'mno' => 'mno', +/*Mohawk*/ 'moh' => 'moh', +/*Moldavian*/ 'mol' => 'mol', +/*Mongolian*/ 'mon' => 'mon', +/*Mossi*/ 'mos' => 'mos', +/*unda languages*/ 'mun' => 'mun', +/*Creek*/ 'mus' => 'mus', +/*Mirandese*/ 'mwl' => 'mwl', +/*Marwari*/ 'mwr' => 'mwr', +/*Mayan languages*/ 'myn' => 'myn', +/*Erzya*/ 'myv' => 'myv', +/*Nahuatl*/ 'nah' => 'nah', +/*North American Indian*/ 'nai' => 'nai', +/*Neapolitan*/ 'nap' => 'nap', +/*Nauru*/ 'nau' => 'nau', +/*Navajo; Navaho*/ 'nav' => 'nav', +/*South Ndebele*/ 'nbl' => 'nbl', +/*North Ndebele*/ 'nde' => 'nde', +/*Ndonga*/ 'ndo' => 'ndo', +/*Low German; Low Saxon*/ 'nds' => 'nds', +/*Nepali*/ 'nep' => 'nep', +/*Newari; Nepal Bhasa*/ 'new' => 'new', +/*Nias*/ 'nia' => 'nia', +/*Niger-Kordofanian*/ 'nic' => 'nic', +/*Niuean*/ 'niu' => 'niu', +/*Norwegian Nynorsk*/ 'nno' => 'nno', +/*Norwegian Bokmċl*/ 'nob' => 'nob', +/*Nogai*/ 'nog' => 'nog', +/*Norse, Old*/ 'non' => 'non', +/*Norwegian*/ 'nor' => 'nor', +/*Sotho, Northern*/ 'nso' => 'nso', +/*Nubian languages'*/ 'nub' => 'nub', +/*Classical Newari; + Old Newari; + Classical Nepal Bhasa*/ 'nwc' => 'nwc', +/*Chichewa; Chewa; Nyanja*/ 'nya' => 'nya', +/*Nyamwezi*/ 'nym' => 'nym', +/*Nyankole*/ 'nyn' => 'nyn', +/*Nyoro*/ 'nyo' => 'nyo', +/*Nzima*/ 'nzi' => 'nzi', +/*Occitan; Provençal*/ 'oci' => 'oci', +/*Ojibwa*/ 'oji' => 'oji', +/*Oriya*/ 'ori' => 'ori', +/*Oromo*/ 'orm' => 'orm', +/*Osage*/ 'osa' => 'osa', +/*Ossetian; Ossetic*/ 'oss' => 'oss', +/*Turkish, Ottoman*/ 'ota' => 'ota', +/*Otomian languages*/ 'oto' => 'oto', +/*Papuan (Other)*/ 'paa' => 'paa', +/*Pangasinan*/ 'pag' => 'pag', +/*Pahlavi*/ 'pal' => 'pal', +/*Pampanga*/ 'pam' => 'pam', +/*Panjabi; Punjabi*/ 'pan' => 'pan', +/*Papiamento*/ 'pap' => 'pap', +/*Palauan*/ 'pau' => 'pau', +/*Persian, Old*/ 'peo' => 'peo', +/*Persian*/ 'per' => 'fa', +/*Philippine (Other)*/ 'phi' => 'phi', +/*Phoenician*/ 'phn' => 'phn', +/*Pali*/ 'pli' => 'pli', +/*Polish*/ 'pol' => 'pol', +/*Pohnpeian*/ 'pon' => 'pon', +/*Portuguese*/ 'por' => 'por', +/*Prakrit languages*/ 'pra' => 'pra', +/*Provençal, Old*/ 'pro' => 'pro', +/*Pushto*/ 'pus' => 'pus', +/*Quechua*/ 'que' => 'que', +/*Rajasthani*/ 'raj' => 'raj', +/*Rapanui*/ 'rap' => 'rap', +/*Rarotongan*/ 'rar' => 'rar', +/*Romance (Other)*/ 'roa' => 'roa', +/*Raeto-Romance*/ 'roh' => 'roh', +/*Romany*/ 'rom' => 'rom', +/*Romanian*/ 'rum' => 'ro', +/*Rundi*/ 'run' => 'rn', +/*Aromanian, + Arumanian, + Macedo-Romanian*/ 'rup' => 'rup', +/*Russian*/ 'rus' => 'ru', +/*Sandawe*/ 'sad' => 'sad', +/*Sango*/ 'sag' => 'sg', +/*Yakut*/ 'sah' => 'sah', +/*South American Indian*/ 'sai' => 'sai', +/*Salishan languages*/ 'sal' => 'sal', +/*Samaritan Aramaic*/ 'sam' => 'sam', +/*Sanskrit*/ 'san' => 'sa', +/*Sasak*/ 'sas' => 'sas', +/*Santali*/ 'sat' => 'sat', +/*Serbian*/ 'scc' => 'sr', +/*Sicilian*/ 'scn' => 'scn', +/*Scots*/ 'sco' => 'sco', +/*Croatian*/ 'scr' => 'scr', +/*Selkup*/ 'sel' => 'sel', +/*Semitic (Other)*/ 'sem' => 'sem', +/*Irish, Old*/ 'sga' => 'sga', +/*Shan*/ 'shn' => 'shn', +/*Sidamo*/ 'sid' => 'sid', +/*Sinhala; Sinhalese*/ 'sin' => 'si', +/*Siouan languages*/ 'sio' => 'sio', +/*Sino-Tibetan (Other)*/ 'sit' => 'sit', +/*Slavic (Other)*/ 'sla' => 'sla', +/*Slovak*/ 'slo' => 'sk', +/*Slovenian*/ 'slv' => 'sl', +/*Southern Sami*/ 'sma' => 'sma', +/*Northern Sami*/ 'sme' => 'se', +/*Sami languages (Other)*/ 'smi' => 'smi', +/*Lule Sami*/ 'smj' => 'smj', +/*Inari Sami*/ 'smn' => 'smn', +/*Samoan*/ 'smo' => 'sm', +/*Skolt Sami*/ 'sms' => 'sms', +/*Shona*/ 'sna' => 'sn', +/*Sindhi*/ 'snd' => 'sd', +/*Soninke*/ 'snk' => 'snk', +/*Sogdian*/ 'sog' => 'sog', +/*Somali*/ 'som' => 'so', +/*Songhai*/ 'son' => 'son', +/*Sotho, Southern*/ 'sot' => 'st', +/*Spanish; Castilian*/ 'spa' => 'es', +/*Sardinian*/ 'srd' => 'sc', +/*Serer*/ 'srr' => 'srr', +/*Nilo-Saharan (Other)*/ 'ssa' => 'ssa', +/*Swati*/ 'ssw' => 'ss', +/*Sukuma*/ 'suk' => 'suk', +/*Sundanese*/ 'sun' => 'su', +/*Susu*/ 'sus' => 'sus', +/*Sumerian*/ 'sux' => 'sux', +/*Swahili*/ 'swa' => 'swa', +/*Swedish*/ 'swe' => 'swe', +/*Syriac*/ 'syr' => 'syr', +/*Tahitian*/ 'tah' => 'ty', +/*Tai (Other)*/ 'tai' => 'tai', +/*Tamil*/ 'tam' => 'ta', +/*Tatar*/ 'tat' => 'tt', +/*Telugu*/ 'tel' => 'te', +/*Timne*/ 'tem' => 'tem', +/*Tereno*/ 'ter' => 'ter', +/*Tetum*/ 'tet' => 'tet', +/*Tajik*/ 'tgk' => 'tg', +/*Tagalog*/ 'tgl' => 'tl', +/*Thai*/ 'tha' => 'th', +/*Tibetan*/ 'tib' => 'bo', +/*Tigre*/ 'tig' => 'tig', +/*Tigrinya*/ 'tir' => 'ti', +/*Tiv*/ 'tiv' => 'tiv', +/*Tokelau*/ 'tkl' => 'tkl', +/*Klingon; tlhlngan-Hol*/ 'tlh' => 'tlh', +/*Tlingit*/ 'tli' => 'tli', +/*Tamashek*/ 'tmh' => 'tmh', +/*Tonga (Nyasa)*/ 'tog' => 'tog', +/*Tonga (Tonga Islands)*/ 'ton' => 'to', +/*Tok Pisin'*/ 'tpi' => 'tpi', +/*Tsimshian*/ 'tsi' => ' tsi', +/*Tswana*/ 'tsn' => 'tn', +/*Tsonga*/ 'tso' => 'ts', +/*Turkmen*/ 'tuk' => 'tk', +/*Tumbuka*/ 'tum' => 'tum', +/*Tupi languages*/ 'tup' => 'tup', +/*Turkish*/ 'tur' => 'tr', +/*Altaic (Other)*/ 'tut' => 'tut', +/*Tuvalu*/ 'tvl' => 'tvl', +/*Twi*/ 'twi' => 'tw', +/*Tuvinian*/ 'tyv' => 'tyv', +/*Udmurt*/ 'udm' => 'udm', +/*Ugaritic*/ 'uga' => 'uga', +/*Uighur; Uyghur*/ 'uig' => 'ug', +/*Ukrainian*/ 'ukr' => 'uk', +/*Umbundu*/ 'umb' => 'umb', +/*Urdu*/ 'urd' => 'ur', +/*Uzbek*/ 'uzb' => 'uz', +/*Vai*/ 'vai' => 'vai', +/*Venda*/ 'ven' => 've', +/*Vietnamese*/ 'vie' => 'vi', +/*Volapük*/ 'vol' => 'vo', +/*Votic*/ 'vot' => 'vot', +/*Wakashan languages*/ 'wak' => 'wak', +/*Walamo*/ 'wal' => 'wal', +/*Waray*/ 'war' => 'war', +/*Washo*/ 'was' => 'was', +/*Welsh*/ 'wel' => 'cy', +/*Sorbian languages*/ 'wen' => 'was', +/*Walloon*/ 'wln' => 'wa', +/*Wolof*/ 'wol' => 'wo', +/*Kalmyk*/ 'xal' => 'xal', +/*Xhosa*/ 'xho' => 'xh', +/*Yao*/ 'yao' => 'yao', +/*Yapese*/ 'yap' => 'yap', +/*Yiddish*/ 'yid' => 'yi', +/*Yoruba*/ 'yor' => 'yo', +/*Yupik languages*/ 'ypk' => 'ypk', +/*Zapotec*/ 'zap' => 'zap', +/*Zenaga*/ 'zen' => 'zen', +/*Zhuang; Chuang*/ 'zha' => 'za', +/*Zande*/ 'znd' => 'znd', +/*Zulu*/ 'zul' => 'zu', +/*Zuni*/ 'zun' => 'zun'); + + var $_l10nCatalog = array( + 'aa' => array('language' => 'Afar', '3iso639' => 'aar', '2iso639' => 'aa', 'locale' => 'aa', 'localeFallback' => 'aa'), + 'ab' => array('language' => 'Abkhazian', '3iso639' => 'abk', '2iso639' => 'ab', 'locale' => 'ab', 'localeFallback' => 'ab'), + 'ace' => array('language' => 'Achinese', '3iso639' => 'ace', '2iso639' => null, 'locale' => 'ace', 'localeFallback' => 'ace'), + 'ach' => array('language' => 'Acoli', '3iso639' => 'ach', '2iso639' => null, 'locale' => 'ach', 'localeFallback' => 'ach'), + 'ada' => array('language' => 'Adangme', '3iso639' => 'ada', '2iso639' => null, 'locale' => 'ada', 'localeFallback' => 'ada'), + 'ady' => array('language' => 'Adyghe; Adygei', '3iso639' => 'ady', '2iso639' => null, 'locale' => 'ady', 'localeFallback' => 'ady'), + 'ae' => array('language' => 'Avestan', '3iso639' => 'ave', '2iso639' => 'ae', 'locale' => 'ae', 'localeFallback' => 'ae'), + 'af' => array('language' => 'Afrikaans', '3iso639' => 'afr', '2iso639' => 'af', 'locale' => 'af', 'localeFallback' => 'af'), + 'afa' => array('language' => 'Afro-Asiatic (Other)', '3iso639' => 'afa', '2iso639' => null, 'locale' => 'afa', 'localeFallback' => 'afa'), + 'afh' => array('language' => 'Afrihili', '3iso639' => 'afh', '2iso639' => null, 'locale' => 'afh', 'localeFallback' => 'afh'), + 'ain' => array('language' => 'Ainu', '3iso639' => 'ain', '2iso639' => null, 'locale' => 'ain', 'localeFallback' => 'ain'), + 'ak' => array('language' => 'Akan', '3iso639' => 'aka', '2iso639' => 'ak', 'locale' => 'ak', 'localeFallback' => 'ak'), + 'akk' => array('language' => 'Akkadian', '3iso639' => 'akk', '2iso639' => null, 'locale' => 'akk', 'localeFallback' => 'akk'), + 'ale' => array('language' => 'Aleut', '3iso639' => 'ale', '2iso639' => null, 'locale' => 'ale', 'localeFallback' => 'ale'), + 'alg' => array('language' => 'Algonquian Languages', '3iso639' => 'alg', '2iso639' => null, 'locale' => 'alg', 'localeFallback' => 'alg'), + 'alt' => array('language' => 'Southern Altai', '3iso639' => 'alt', '2iso639' => null, 'locale' => 'alt', 'localeFallback' => 'alt'), + 'am' => array('language' => 'Amharic', '3iso639' => 'amh', '2iso639' => 'am', 'locale' => 'am', 'localeFallback' => 'am'), + 'an' => array('language' => 'Aragonese', '3iso639' => 'arg', '2iso639' => 'an', 'locale' => 'an', 'localeFallback' => 'an'), + 'ang' => array('language' => 'English, Old', '3iso639' => 'ang', '2iso639' => null, 'locale' => 'ang', 'localeFallback' => 'ang'), + 'apa' => array('language' => 'Apache languages', '3iso639' => 'apa', '2iso639' => null, 'locale' => 'apa', 'localeFallback' => 'apa'), + 'ar' => array('language' => 'Arabic', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar', 'localeFallback' => 'ar'), + 'ar-ae' => array('language' => 'Arabic (U.A.E.)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_AE', 'localeFallback' => 'ar'), + 'ar-bh' => array('language' => 'Arabic (Bahrain)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_BH', 'localeFallback' => 'ar'), + 'ar-dz' => array('language' => 'Arabic (Algeria)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_DZ', 'localeFallback' => 'ar'), + 'ar-eg' => array('language' => 'Arabic (Egypt)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_EG', 'localeFallback' => 'ar'), + 'ar-iq' => array('language' => 'Arabic (Iraq)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_IQ', 'localeFallback' => 'ar'), + 'ar-jo' => array('language' => 'Arabic (Jordan)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_JO', 'localeFallback' => 'ar'), + 'ar-kw' => array('language' => 'Arabic (Kuwait)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_KW', 'localeFallback' => 'ar'), + 'ar-lb' => array('language' => 'Arabic (Lebanon)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_LB', 'localeFallback' => 'ar'), + 'ar-ly' => array('language' => 'Arabic (Libya)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_LY', 'localeFallback' => 'ar'), + 'ar-ma' => array('language' => 'Arabic (Morocco)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_MA', 'localeFallback' => 'ar'), + 'ar-om' => array('language' => 'Arabic (Oman)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_OM', 'localeFallback' => 'ar'), + 'ar-qa' => array('language' => 'Arabic (Qatar)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_QA', 'localeFallback' => 'ar'), + 'ar-sa' => array('language' => 'Arabic (Saudi Arabia)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_SA', 'localeFallback' => 'ar'), + 'ar-sy' => array('language' => 'Arabic (Syria)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_SY', 'localeFallback' => 'ar'), + 'ar-tn' => array('language' => 'Arabic (Tunisia)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_TN', 'localeFallback' => 'ar'), + 'ar-ye' => array('language' => 'Arabic (Yemen)', '3iso639' => 'ara', '2iso639' => 'ar', 'locale' => 'ar_YE', 'localeFallback' => 'ar'), + 'arc' => array('language' => 'Aramaic', '3iso639' => 'arc', '2iso639' => null, 'locale' => 'arc', 'localeFallback' => 'arc'), + 'arn' => array('language' => 'Araucanian', '3iso639' => 'arn', '2iso639' => null, 'locale' => 'arn', 'localeFallback' => 'arn'), + 'arp' => array('language' => 'Arapaho', '3iso639' => 'arp', '2iso639' => null, 'locale' => 'arp', 'localeFallback' => 'arp'), + 'arw' => array('language' => 'Arawak', '3iso639' => 'arw', '2iso639' => null, 'locale' => 'arw', 'localeFallback' => 'arw'), + 'as' => array('language' => 'Assamese', '3iso639' => 'asm', '2iso639' => 'as', 'locale' => 'as', 'localeFallback' => 'as'), + 'ast' => array('language' => 'Asturian', '3iso639' => 'ast', '2iso639' => null, 'locale' => 'ast', 'localeFallback' => 'ast'), + 'ath' => array('language' => 'Athapascan languages', '3iso639' => 'ath', '2iso639' => null, 'locale' => 'ath', 'localeFallback' => 'ath'), + 'aus' => array('language' => 'Australian languages', '3iso639' => 'aus', '2iso639' => null, 'locale' => 'aus', 'localeFallback' => 'aus'), + 'av' => array('language' => 'Avaric', '3iso639' => 'ava', '2iso639' => 'av', 'locale' => 'av', 'localeFallback' => 'av'), + 'awa' => array('language' => 'Awadhi', '3iso639' => 'awa', '2iso639' => null, 'locale' => 'awa', 'localeFallback' => 'awa'), + 'ay' => array('language' => 'Aymara', '3iso639' => 'aym', '2iso639' => null, 'locale' => 'ay', 'localeFallback' => 'ay'), + 'az' => array('language' => 'Azerbaijani', '3iso639' => 'aze', '2iso639' => 'az', 'locale' => 'az', 'localeFallback' => 'az'), + 'ba' => array('language' => 'Bashkir', '3iso639' => 'bak', '2iso639' => 'ba', 'locale' => 'ba', 'localeFallback' => 'ba'), + 'bad' => array('language' => 'Banda', '3iso639' => 'bad', '2iso639' => null, 'locale' => 'bad', 'localeFallback' => 'bad'), + 'bai' => array('language' => 'Bamileke languages', '3iso639' => 'bai', '2iso639' => null, 'locale' => 'bai', 'localeFallback' => 'bai'), + 'bal' => array('language' => 'Baluchi', '3iso639' => 'bal', '2iso639' => null, 'locale' => 'bal', 'localeFallback' => 'bal'), + 'bam' => array('language' => 'Bambara', '3iso639' => 'bam', '2iso639' => null, 'locale' => 'bam', 'localeFallback' => 'bam'), + 'ban' => array('language' => 'Balinese', '3iso639' => 'ban', '2iso639' => null, 'locale' => 'ban', 'localeFallback' => 'ban'), + 'bas' => array('language' => 'Basa', '3iso639' => 'bas', '2iso639' => null, 'locale' => 'bas', 'localeFallback' => 'bas'), + 'bat' => array('language' => 'Baltic (Other)', '3iso639' => 'bat', '2iso639' => null, 'locale' => 'bat', 'localeFallback' => 'bat'), + 'be' => array('language' => 'Belarusian', '3iso639' => 'bel', '2iso639' => 'be', 'locale' => 'be', 'localeFallback' => 'be'), + 'bej' => array('language' => 'Beja', '3iso639' => 'bej', '2iso639' => null, 'locale' => 'bej', 'localeFallback' => 'bej'), + 'bel' => array('language' => 'Belarusian', '3iso639' => 'bel', '2iso639' => null, 'locale' => 'bel', 'localeFallback' => 'bel'), + 'bem' => array('language' => 'Bemba', '3iso639' => 'bem', '2iso639' => null, 'locale' => 'bem', 'localeFallback' => 'bem'), + 'ben' => array('language' => 'Bengali', '3iso639' => 'ben', '2iso639' => null, 'locale' => 'ben', 'localeFallback' => 'ben'), + 'ber' => array('language' => 'Berber (Other)', '3iso639' => 'ber', '2iso639' => null, 'locale' => 'ber', 'localeFallback' => 'ber'), + 'bg' => array('language' => 'Bulgarian', '3iso639' => 'bul', '2iso639' => 'bg', 'locale' => 'bg', 'localeFallback' => 'bg'), + 'bh' => array('language' => 'Bihari', '3iso639' => 'bih', '2iso639' => 'bh', 'locale' => 'bh', 'localeFallback' => 'bh'), + 'bho' => array('language' => 'Bhojpuri', '3iso639' => 'bho', '2iso639' => null, 'locale' => 'bho', 'localeFallback' => 'bho'), + 'bi' => array('language' => 'Bislama', '3iso639' => 'bis', '2iso639' => 'bi', 'locale' => 'bi', 'localeFallback' => 'bi'), + 'bih' => array('language' => 'Bihari', '3iso639' => 'bih', '2iso639' => null, 'locale' => 'bih', 'localeFallback' => 'bih'), + 'bik' => array('language' => 'Bikol', '3iso639' => 'bik', '2iso639' => null, 'locale' => 'bik', 'localeFallback' => 'bik'), + 'bin' => array('language' => 'Bini', '3iso639' => 'bin', '2iso639' => null, 'locale' => 'bin', 'localeFallback' => 'bin'), + 'bis' => array('language' => 'Bislama', '3iso639' => 'bis', '2iso639' => null, 'locale' => 'bis', 'localeFallback' => 'bis'), + 'bla' => array('language' => 'Siksika', '3iso639' => 'bla', '2iso639' => null, 'locale' => 'bla', 'localeFallback' => 'bla'), + 'bm' => array('language' => 'Bambara', '3iso639' => 'bam', '2iso639' => 'bm', 'locale' => 'bm', 'localeFallback' => 'bm'), + 'bn' => array('language' => 'Bengali', '3iso639' => 'ben', '2iso639' => 'bn', 'locale' => 'bn', 'localeFallback' => 'bn'), + 'bnt' => array('language' => 'Bantu (Other)', '3iso639' => 'bnt', '2iso639' => null, 'locale' => 'bnt', 'localeFallback' => 'bnt'), + 'bo' => array('language' => 'Tibetan', '3iso639' => 'tib', '2iso639' => 'bo', 'locale' => 'bo', 'localeFallback' => 'bo'), + 'br' => array('language' => 'Breton', '3iso639' => 'bre', '2iso639' => 'br', 'locale' => 'br', 'localeFallback' => 'br'), + 'bra' => array('language' => 'Braj', '3iso639' => 'bra', '2iso639' => null, 'locale' => 'bra', 'localeFallback' => 'bra'), + 'bs' => array('language' => 'Bosnian', '3iso639' => 'bos', '2iso639' => 'bs', 'locale' => 'bs', 'localeFallback' => 'bs'), + 'btk' => array('language' => 'Batak (Indonesia)', '3iso639' => 'btk', '2iso639' => null, 'locale' => 'btk', 'localeFallback' => 'btk'), + 'bua' => array('language' => 'Buriat', '3iso639' => 'bua', '2iso639' => null, 'locale' => 'bua', 'localeFallback' => 'bua'), + 'bug' => array('language' => 'Buginese', '3iso639' => 'bug', '2iso639' => null, 'locale' => 'bug', 'localeFallback' => 'bug'), + 'byn' => array('language' => 'Blin; Bilin', '3iso639' => 'byn', '2iso639' => null, 'locale' => 'byn', 'localeFallback' => 'byn'), + 'ca' => array('language' => 'Catalan', '3iso639' => 'cat', '2iso639' => 'ca', 'locale' => 'es_CA', 'localeFallback' => 'es_CA'), + 'cad' => array('language' => 'Caddo', '3iso639' => 'cad', '2iso639' => null, 'locale' => 'cad', 'localeFallback' => 'cad'), + 'cai' => array('language' => 'Central American Indian (Other)', '3iso639' => 'cai', '2iso639' => null, 'locale' => 'cai', 'localeFallback' => 'cai'), + 'car' => array('language' => 'Carib', '3iso639' => 'car', '2iso639' => null, 'locale' => 'car', 'localeFallback' => 'car'), + 'cau' => array('language' => 'Caucasian (Other)', '3iso639' => 'cau', '2iso639' => null, 'locale' => 'cau', 'localeFallback' => 'cau'), + 'ce' => array('language' => 'Chechen', '3iso639' => 'che', '2iso639' => 'ce', 'locale' => 'ce', 'localeFallback' => 'ce'), + 'ceb' => array('language' => 'Cebuano', '3iso639' => 'ceb', '2iso639' => null, 'locale' => 'ceb', 'localeFallback' => 'ceb'), + 'cel' => array('language' => 'Celtic (Other)', '3iso639' => 'cel', '2iso639' => null, 'locale' => 'cel', 'localeFallback' => 'cel'), + 'ch' => array('language' => 'Chamorro', '3iso639' => 'cha', '2iso639' => 'ch', 'locale' => 'ch', 'localeFallback' => 'ch'), + 'cha' => array('language' => 'Chamorro', '3iso639' => 'cha', '2iso639' => null, 'locale' => 'cha', 'localeFallback' => 'cha'), + 'chb' => array('language' => 'Chibcha', '3iso639' => 'chb', '2iso639' => null, 'locale' => 'chb', 'localeFallback' => 'chb'), + 'chg' => array('language' => 'Chagatai', '3iso639' => 'chg', '2iso639' => null, 'locale' => 'chg', 'localeFallback' => 'chg'), + 'chk' => array('language' => 'Chuukese', '3iso639' => 'chk', '2iso639' => null, 'locale' => 'chk', 'localeFallback' => 'chk'), + 'chm' => array('language' => 'Mari', '3iso639' => 'chm', '2iso639' => null, 'locale' => 'chm', 'localeFallback' => 'chm'), + 'chn' => array('language' => 'Chinook jargon', '3iso639' => 'chn', '2iso639' => null, 'locale' => 'chn', 'localeFallback' => 'chn'), + 'cho' => array('language' => 'Choctaw', '3iso639' => 'cho', '2iso639' => null, 'locale' => 'cho', 'localeFallback' => 'cho'), + 'chp' => array('language' => 'Chipewyan', '3iso639' => 'chp', '2iso639' => null, 'locale' => 'chp', 'localeFallback' => 'chp'), + 'chr' => array('language' => 'Cherokee', '3iso639' => 'chr', '2iso639' => null, 'locale' => 'chr', 'localeFallback' => 'chr'), + 'chy' => array('language' => 'Cheyenne', '3iso639' => 'chy', '2iso639' => null, 'locale' => 'chy', 'localeFallback' => 'chy'), + 'cmc' => array('language' => 'Chamic languages', '3iso639' => 'cmc', '2iso639' => null, 'locale' => 'cmc', 'localeFallback' => 'cmc'), + 'co' => array('language' => 'Corsican', '3iso639' => 'cos', '2iso639' => 'co', 'locale' => 'co', 'localeFallback' => 'co'), + 'cop' => array('language' => 'Coptic', '3iso639' => 'cop', '2iso639' => null, 'locale' => 'cop', 'localeFallback' => 'cop'), + 'cpe' => array('language' => 'Creoles and pidgins, English based (Other)', '3iso639' => 'cpe', '2iso639' => null, 'locale' => 'cpe', 'localeFallback' => 'cpe'), + 'cpf' => array('language' => 'Creoles and pidgins, French-based (Other)', '3iso639' => 'cpf', '2iso639' => null, 'locale' => 'cpf', 'localeFallback' => 'cpf'), + 'cpp' => array('language' => 'Creoles and pidgins', '3iso639' => 'cpp', '2iso639' => null, 'locale' => 'cpp', 'localeFallback' => 'cpp'), + 'cr' => array('language' => 'Cree', '3iso639' => 'cre', '2iso639' => 'cr', 'locale' => 'cr', 'localeFallback' => 'cr'), + 'crh' => array('language' => 'Crimean Tatar; Crimean Turkish', '3iso639' => 'crh', '2iso639' => null, 'locale' => 'crh', 'localeFallback' => 'crh'), + 'crp' => array('language' => 'Creoles and pidgins (Other)', '3iso639' => 'crp', '2iso639' => null, 'locale' => 'crp', 'localeFallback' => 'crp'), + 'cs' => array('language' => 'Czech', '3iso639' => 'cze', '2iso639' => 'cs', 'locale' => 'cs', 'localeFallback' => 'cs'), + 'csb' => array('language' => 'Kashubian', '3iso639' => 'csb', '2iso639' => null, 'locale' => 'csb', 'localeFallback' => 'csb'), + 'cu' => array('language' => 'Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic', '3iso639' => 'chu', '2iso639' => 'cu', 'locale' => 'cu', 'localeFallback' => 'cu'), + 'cus' => array('language' => 'Cushitic (Other)', '3iso639' => 'cus', '2iso639' => null, 'locale' => 'cus', 'localeFallback' => 'cus'), + 'cv' => array('language' => 'Chuvash', '3iso639' => 'chv', '2iso639' => 'cv', 'locale' => 'cv', 'localeFallback' => 'cv'), + 'cy' => array('language' => 'Welsh', '3iso639' => 'wel', '2iso639' => 'cy', 'locale' => 'cy', 'localeFallback' => 'cy'), + 'da' => array('language' => 'Danish', '3iso639' => 'dan', '2iso639' => 'da', 'locale' => 'da', 'localeFallback' => 'da'), + 'dak' => array('language' => 'Dakota', '3iso639' => 'dak', '2iso639' => null, 'locale' => 'dak', 'localeFallback' => 'dak'), + 'dar' => array('language' => 'Dargwa', '3iso639' => 'dar', '2iso639' => null, 'locale' => 'dar', 'localeFallback' => 'dar'), + 'day' => array('language' => 'Dayak', '3iso639' => 'day', '2iso639' => null, 'locale' => 'day', 'localeFallback' => 'day'), + 'de' => array('language' => 'German (Germany)', '3iso639' => 'ger', '2iso639' => 'de', 'locale' => 'de_DE', 'localeFallback' => 'de_DE'), + 'de-at' => array('language' => 'German (Austria)', '3iso639' => 'ger', '2iso639' => 'de', 'locale' => 'de_AT', 'localeFallback' => 'de_DE'), + 'de-ch' => array('language' => 'German (Switzerland)', '3iso639' => 'ger', '2iso639' => 'de', 'locale' => 'de_CH', 'localeFallback' => 'de_DE'), + 'de-de' => array('language' => 'German (Germany)', '3iso639' => 'ger', '2iso639' => 'de', 'locale' => 'de_DE', 'localeFallback' => 'de_DE'), + 'de-li' => array('language' => 'German (Liechtenstein)', '3iso639' => 'ger', '2iso639' => 'de', 'locale' => 'de_LI', 'localeFallback' => 'de_DE'), + 'de-lu' => array('language' => 'German (luxembourg)', '3iso639' => 'ger', '2iso639' => 'de', 'locale' => 'de_LU', 'localeFallback' => 'de_DE'), + 'del' => array('language' => 'Delaware', '3iso639' => 'del', '2iso639' => null, 'locale' => 'del', 'localeFallback' => 'del'), + 'den' => array('language' => 'Slave (Athapascan)', '3iso639' => 'den', '2iso639' => null, 'locale' => 'den', 'localeFallback' => 'den'), + 'dgr' => array('language' => 'Dogrib', '3iso639' => 'dgr', '2iso639' => null, 'locale' => 'dgr', 'localeFallback' => 'dgr'), + 'din' => array('language' => 'Dinka', '3iso639' => 'din', '2iso639' => null, 'locale' => 'din', 'localeFallback' => 'din'), + 'doi' => array('language' => 'Dogri', '3iso639' => 'doi', '2iso639' => null, 'locale' => 'doi', 'localeFallback' => 'doi'), + 'dra' => array('language' => 'Dravidian (Other)', '3iso639' => 'dra', '2iso639' => null, 'locale' => 'dra', 'localeFallback' => 'dra'), + 'dsb' => array('language' => 'Lower Sorbian', '3iso639' => 'dsb', '2iso639' => null, 'locale' => 'dsb', 'localeFallback' => 'dsb'), + 'dua' => array('language' => 'Duala', '3iso639' => 'dua', '2iso639' => null, 'locale' => 'dua', 'localeFallback' => 'dua'), + 'dum' => array('language' => 'Dutch, Middle', '3iso639' => 'dum', '2iso639' => null, 'locale' => 'dum', 'localeFallback' => 'dum'), + 'dv' => array('language' => 'Divehi', '3iso639' => 'div', '2iso639' => 'dv', 'locale' => 'dv', 'localeFallback' => 'dv'), + 'dyu' => array('language' => 'Dyula', '3iso639' => 'dyu', '2iso639' => null, 'locale' => 'dyu', 'localeFallback' => 'dyu'), + 'dz' => array('language' => 'Dzongkha', '3iso639' => 'dzo', '2iso639' => 'dz', 'locale' => 'dz', 'localeFallback' => 'dz'), + 'dzo' => array('language' => 'Dzongkha', '3iso639' => 'dzo', '2iso639' => null, 'locale' => 'dzo', 'localeFallback' => 'dzo'), + 'ee' => array('language' => 'Ewe', '3iso639' => 'ewe', '2iso639' => 'ee', 'locale' => 'ee', 'localeFallback' => 'ee'), + 'efi' => array('language' => 'Efik', '3iso639' => 'efi', '2iso639' => null, 'locale' => 'efi', 'localeFallback' => 'efi'), + 'egy' => array('language' => 'Egyptian (Ancient)', '3iso639' => 'egy', '2iso639' => null, 'locale' => 'egy', 'localeFallback' => 'egy'), + 'eka' => array('language' => 'Ekajuk', '3iso639' => 'eka', '2iso639' => null, 'locale' => 'eka', 'localeFallback' => 'eka'), + 'el' => array('language' => 'Greek', '3iso639' => 'gre', '2iso639' => 'el', 'locale' => 'el', 'localeFallback' => 'div'), + 'elx' => array('language' => 'Elamite', '3iso639' => 'elx', '2iso639' => null, 'locale' => 'elx', 'localeFallback' => 'elx'), + 'en' => array('language' => 'English', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_US', 'localeFallback' => 'en_US'), + 'en-au' => array('language' => 'English (Australia)', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_AU', 'localeFallback' => 'en_US'), + 'en-bz' => array('language' => 'English (Belize)', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_BZ', 'localeFallback' => 'en_US'), + 'en-ca' => array('language' => 'English (Canada)', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_CA', 'localeFallback' => 'en_US'), + 'en-gb' => array('language' => 'English (United Kingdom)', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_GB', 'localeFallback' => 'en_US'), + 'en-ie' => array('language' => 'English (Ireland)','3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_IE', 'localeFallback' => 'en_US'), + 'en-jm' => array('language' => 'English (Jamaica)','3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_JM', 'localeFallback' => 'en_US'), + 'en-nz' => array('language' => 'English (New Zealand)', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_NZ', 'localeFallback' => 'en_US'), + 'en-ph' => array('language' => 'English (Philippines)', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_PH', 'localeFallback' => 'en_US'), + 'en-tt' => array('language' => 'English (Trinidad)', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_TT', 'localeFallback' => 'en_US'), + 'en-us' => array('language' => 'English (United States)','3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_US', 'localeFallback' => 'en_US'), + 'en-za' => array('language' => 'English (South Africa)', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_ZA', 'localeFallback' => 'en_US'), + 'en-zw' => array('language' => 'English (Zimbabwe)', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_ZW', 'localeFallback' => 'en_US'), + 'enm' => array('language' => 'English, Middle', '3iso639' => 'enm', '2iso639' => null, 'locale' => 'enm', 'localeFallback' => 'enm'), + 'eo' => array('language' => 'Esperanto', '3iso639' => 'epo', '2iso639' => 'eo', 'locale' => 'eo', 'localeFallback' => 'eo'), + 'es' => array('language' => 'Spanish (Spain)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es', 'localeFallback' => 'es'), + 'es-ar' => array('language' => 'Spanish (Argentina)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_AR', 'localeFallback' => 'es'), + 'es-bo' => array('language' => 'Spanish (Bolivia)','3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_BO', 'localeFallback' => 'es'), + 'es-cl' => array('language' => 'Spanish (Chile)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_CL', 'localeFallback' => 'es'), + 'es-co' => array('language' => 'Spanish (Colombia)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_CO', 'localeFallback' => 'es'), + 'es-cr' => array('language' => 'Spanish (Costa Rica)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_CR', 'localeFallback' => 'es'), + 'es-do' => array('language' => 'Spanish (Dominican Republic)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_DO', 'localeFallback' => 'es'), + 'es-ec' => array('language' => 'Spanish (Ecuador)','3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_EC', 'localeFallback' => 'es'), + 'es-gt' => array('language' => 'Spanish (Guatemala)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_GT', 'localeFallback' => 'es'), + 'es-hn' => array('language' => 'Spanish (Honduras)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_HN', 'localeFallback' => 'es'), + 'es-mx' => array('language' => 'Spanish (Mexico)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_MX', 'localeFallback' => 'es'), + 'es-ni' => array('language' => 'Spanish (Nicaragua)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_NI', 'localeFallback' => 'es'), + 'es-pa' => array('language' => 'Spanish (Panama)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_PA', 'localeFallback' => 'es'), + 'es-pe' => array('language' => 'Spanish (Peru)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_PE', 'localeFallback' => 'es'), + 'es-pr' => array('language' => 'Spanish (Puerto Rico)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_PR', 'localeFallback' => 'es'), + 'es-py' => array('language' => 'Spanish (Paraguay)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_PY', 'localeFallback' => 'es'), + 'es-sv' => array('language' => 'Spanish (El Salvador)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_SV', 'localeFallback' => 'es'), + 'es-us' => array('language' => 'Spanish (United States)','3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_US', 'localeFallback' => 'es'), + 'es-uy' => array('language' => 'Spanish (Uruguay)','3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_UY', 'localeFallback' => 'es'), + 'es-ve' => array('language' => 'Spanish (Venezuela)', '3iso639' => 'spa', '2iso639' => 'es', 'locale' => 'es_VE', 'localeFallback' => 'es'), + 'et' => array('language' => 'Estonian', '3iso639' => 'est', '2iso639' => 'et', 'locale' => 'et', 'localeFallback' => 'et'), + 'eu' => array('language' => 'Basque', '3iso639' => 'baq', '2iso639' => 'eu', 'locale' => 'eu', 'localeFallback' => 'eu'), + 'ewo' => array('language' => 'Ewondo', '3iso639' => 'ewo', '2iso639' => null, 'locale' => 'ewo', 'localeFallback' => 'ewo'), + 'fa' => array('language' => 'Persian', '3iso639' => 'per', '2iso639' => 'fa', 'locale' => 'fa', 'localeFallback' => 'fa'), + 'fan' => array('language' => 'Fang', '3iso639' => 'fan', '2iso639' => null, 'locale' => 'fan', 'localeFallback' => 'fan'), + 'fat' => array('language' => 'Fanti', '3iso639' => 'fat', '2iso639' => null, 'locale' => 'fat', 'localeFallback' => 'fat'), + 'ff' => array('language' => 'Fulah', '3iso639' => 'ful', '2iso639' => 'ff', 'locale' => 'ff', 'localeFallback' => 'ff'), + 'fi' => array('language' => 'Finnish', '3iso639' => 'fin', '2iso639' => 'fi', 'locale' => 'fi', 'localeFallback' => 'fi'), + 'fil' => array('language' => 'Filipino; Pilipino', '3iso639' => 'fil', '2iso639' => null, 'locale' => 'fil', 'localeFallback' => 'fil'), + 'fiu' => array('language' => 'Finno-Ugrian (Other)', '3iso639' => 'fiu', '2iso639' => null, 'locale' => 'fiu', 'localeFallback' => 'fiu'), + 'fj' => array('language' => 'Fijian', '3iso639' => 'fij', '2iso639' => 'fj', 'locale' => 'fj', 'localeFallback' => 'fj'), + 'fo' => array('language' => 'Faeroese', '3iso639' => 'fao', '2iso639' => 'fo', 'locale' => 'fo', 'localeFallback' => 'fo'), + 'fon' => array('language' => 'Fon', '3iso639' => 'fon', '2iso639' => null, 'locale' => 'fon', 'localeFallback' => 'fon'), + 'fr' => array('language' => 'French (France)', '3iso639' => 'fre', '2iso639' => 'fr', 'locale' => 'fr', 'localeFallback' => 'fr'), + 'fr-be' => array('language' => 'French (Belgium)', '3iso639' => 'fre', '2iso639' => 'fr', 'locale' => 'fr_BE', 'localeFallback' => 'fr'), + 'fr-ca' => array('language' => 'French (Canada)', '3iso639' => 'fre', '2iso639' => 'fr', 'locale' => 'fr_CA', 'localeFallback' => 'fr'), + 'fr-ch' => array('language' => 'French (Switzerland)', '3iso639' => 'fre', '2iso639' => 'fr', 'locale' => 'fr_CH', 'localeFallback' => 'fr'), + 'fr-lu' => array('language' => 'French (Luxembourg)', '3iso639' => 'fre', '2iso639' => 'fr', 'locale' => 'fr_LU', 'localeFallback' => 'fr'), + 'fr-mc' => array('language' => 'French (Monaco)', '3iso639' => 'fre', '2iso639' => 'fr', 'locale' => 'fr_MC', 'localeFallback' => 'fr'), + 'frm' => array('language' => 'French, Middle', '3iso639' => 'frm', '2iso639' => null, 'locale' => 'frm', 'localeFallback' => 'frm'), + 'fro' => array('language' => 'French, Old', '3iso639' => 'fro', '2iso639' => null, 'locale' => 'fro', 'localeFallback' => 'fro'), + 'fur' => array('language' => 'Friulian', '3iso639' => 'fur', '2iso639' => null, 'locale' => 'fur', 'localeFallback' => 'fur'), + 'fy' => array('language' => 'Frisian', '3iso639' => 'fry', '2iso639' => 'fy', 'locale' => 'fy', 'localeFallback' => 'fy'), + 'ga' => array('language' => 'Irish', '3iso639' => 'gle', '2iso639' => 'ga', 'locale' => 'ga', 'localeFallback' => 'ga'), + 'gaa' => array('language' => 'Ga', '3iso639' => 'gaa', '2iso639' => null, 'locale' => 'gaa', 'localeFallback' => 'gaa'), + 'gay' => array('language' => 'Gayo', '3iso639' => 'gay', '2iso639' => null, 'locale' => 'gay', 'localeFallback' => 'gay'), + 'gba' => array('language' => 'Gbaya', '3iso639' => 'gba', '2iso639' => null, 'locale' => 'gba', 'localeFallback' => 'gba'), + 'gd' => array('language' => 'Gaelic, Hiberno-Scottish', '3iso639' => 'ghc', '2iso639' => 'gd', 'locale' => 'gd', 'localeFallback' => 'gd'), + 'gem' => array('language' => 'Germanic (Other)', '3iso639' => 'gem', '2iso639' => null, 'locale' => 'gem', 'localeFallback' => 'gem'), + 'gez' => array('language' => 'Geez', '3iso639' => 'gez', '2iso639' => null, 'locale' => 'gez', 'localeFallback' => 'gez'), + 'gil' => array('language' => 'Gilbertese', '3iso639' => 'gil', '2iso639' => null, 'locale' => 'gil', 'localeFallback' => 'gil'), + 'gl' => array('language' => 'Galician', '3iso639' => 'glg', '2iso639' => 'gl', 'locale' => 'gl', 'localeFallback' => 'gl'), + 'gmh' => array('language' => 'German, Middle High', '3iso639' => 'gmh', '2iso639' => null, 'locale' => 'gmh', 'localeFallback' => 'gmh'), + 'gn' => array('language' => 'Guarani', '3iso639' => 'grn', '2iso639' => 'gn', 'locale' => 'gn', 'localeFallback' => 'gn'), + 'goh' => array('language' => 'German, Old High', '3iso639' => 'goh', '2iso639' => null, 'locale' => 'goh', 'localeFallback' => 'goh'), + 'gon' => array('language' => 'Gondi', '3iso639' => 'gon', '2iso639' => null, 'locale' => 'gon', 'localeFallback' => 'gon'), + 'gor' => array('language' => 'Gorontalo', '3iso639' => 'gor', '2iso639' => null, 'locale' => 'gor', 'localeFallback' => 'gor'), + 'got' => array('language' => 'Gothic', '3iso639' => 'got', '2iso639' => null, 'locale' => 'got', 'localeFallback' => 'got'), + 'grb' => array('language' => 'Grebo', '3iso639' => 'grb', '2iso639' => null, 'locale' => 'grb', 'localeFallback' => 'grb'), + 'grc' => array('language' => 'Greek, Ancient', '3iso639' => 'grc', '2iso639' => null, 'locale' => 'grc', 'localeFallback' => 'grc'), + 'gre' => array('language' => 'Greek, Modern', '3iso639' => 'gre', '2iso639' => null, 'locale' => 'gre', 'localeFallback' => 'gre'), + 'gu' => array('language' => 'Gujarati', '3iso639' => 'guj', '2iso639' => 'gu', 'locale' => 'gu', 'localeFallback' => 'gu'), + 'gv' => array('language' => 'Manx', '3iso639' => 'glv', '2iso639' => 'gv', 'locale' => 'gv', 'localeFallback' => 'gv'), + 'gwi' => array('language' => 'Gwich´in', '3iso639' => 'gwi', '2iso639' => null, 'locale' => 'gwi', 'localeFallback' => 'gwi'), + 'ha' => array('language' => 'Hausa', '3iso639' => 'hau', '2iso639' => 'ha', 'locale' => 'ha', 'localeFallback' => 'ha'), + 'hai' => array('language' => 'Haida', '3iso639' => 'hai', '2iso639' => null, 'locale' => 'hai', 'localeFallback' => 'hai'), + 'haw' => array('language' => 'Hawaiian', '3iso639' => 'haw', '2iso639' => null, 'locale' => 'haw', 'localeFallback' => 'haw'), + 'he' => array('language' => 'Hebrew', '3iso639' => 'heb', '2iso639' => 'he', 'locale' => 'he', 'localeFallback' => 'he'), + 'hi' => array('language' => 'Hindi', '3iso639' => 'hin', '2iso639' => 'hi', 'locale' => 'hi', 'localeFallback' => 'hi'), + 'hil' => array('language' => 'Hiligaynon', '3iso639' => 'hil', '2iso639' => null, 'locale' => 'hil', 'localeFallback' => 'hil'), + 'him' => array('language' => 'Himachali', '3iso639' => 'him', '2iso639' => null, 'locale' => 'him', 'localeFallback' => 'him'), + 'hmn' => array('language' => 'Hmong', '3iso639' => 'hmn', '2iso639' => null, 'locale' => 'hmn', 'localeFallback' => 'hmn'), + 'ho' => array('language' => 'Hiri Motu', '3iso639' => 'hmo', '2iso639' => 'ho', 'locale' => 'ho', 'localeFallback' => 'ho'), + 'hr' => array('language' => 'Croatian', '3iso639' => 'scr', '2iso639' => 'hr', 'locale' => 'hr', 'localeFallback' => 'hr'), + 'hsb' => array('language' => 'Upper Sorbian', '3iso639' => 'hsb', '2iso639' => null, 'locale' => 'hsb', 'localeFallback' => 'hsb'), + 'ht' => array('language' => 'Haitian; Haitian Creole', '3iso639' => 'hat', '2iso639' => 'ht', 'locale' => 'ht', 'localeFallback' => 'ht'), + 'hu' => array('language' => 'Hungarian', '3iso639' => 'hun', '2iso639' => 'hu', 'locale' => 'hu', 'localeFallback' => 'hu'), + 'hup' => array('language' => 'Hupa', '3iso639' => 'hup', '2iso639' => null, 'locale' => 'hup', 'localeFallback' => 'hup'), + 'hy' => array('language' => 'Armenian', '3iso639' => 'arm', '2iso639' => 'hy', 'locale' => 'hy', 'localeFallback' => 'hy'), + 'hz' => array('language' => 'Herero', '3iso639' => 'her', '2iso639' => 'hz', 'locale' => 'hz', 'localeFallback' => 'hz'), + 'ia' => array('language' => 'Interlingua (International Auxiliary Language Association)', '3iso639' => 'ina', '2iso639' => 'ia', 'locale' => 'ia', 'localeFallback' => 'ia'), + 'iba' => array('language' => 'Iban', '3iso639' => 'iba', '2iso639' => null, 'locale' => 'iba', 'localeFallback' => 'iba'), + 'ibo' => array('language' => 'Igbo', '3iso639' => 'ibo', '2iso639' => null, 'locale' => 'ibo', 'localeFallback' => 'ibo'), + 'id' => array('language' => 'Indonesian', '3iso639' => 'ind', '2iso639' => 'id', 'locale' => 'id', 'localeFallback' => 'id'), + 'ie' => array('language' => 'Interlingue', '3iso639' => 'ile', '2iso639' => 'ie', 'locale' => 'ie', 'localeFallback' => 'ie'), + 'ig' => array('language' => 'Igbo', '3iso639' => 'ibo', '2iso639' => 'ig', 'locale' => 'ig', 'localeFallback' => 'ig'), + 'ii' => array('language' => 'Sichuan Yi', '3iso639' => 'iii', '2iso639' => 'ii', 'locale' => 'ii', 'localeFallback' => 'ii'), + 'ijo' => array('language' => 'Ijo', '3iso639' => 'ijo', '2iso639' => null, 'locale' => 'ijo', 'localeFallback' => 'ijo'), + 'ik' => array('language' => 'Inupiaq', '3iso639' => 'ipk', '2iso639' => 'ik', 'locale' => 'ik', 'localeFallback' => 'ik'), + 'iku' => array('language' => 'Inuktitut', '3iso639' => 'iku', '2iso639' => null, 'locale' => 'iku', 'localeFallback' => 'iku'), + 'ile' => array('language' => 'Interlingue', '3iso639' => 'ile', '2iso639' => null, 'locale' => 'ile', 'localeFallback' => 'ile'), + 'ilo' => array('language' => 'Iloko', '3iso639' => 'ilo', '2iso639' => null, 'locale' => 'ilo', 'localeFallback' => 'ilo'), + 'inc' => array('language' => 'Indic (Other)', '3iso639' => 'inc', '2iso639' => null, 'locale' => 'inc', 'localeFallback' => 'inc'), + 'ind' => array('language' => 'Indonesian', '3iso639' => 'ind', '2iso639' => null, 'locale' => 'ind', 'localeFallback' => 'ind'), + 'ine' => array('language' => 'Indo-European (Other)', '3iso639' => 'ine', '2iso639' => null, 'locale' => 'ine', 'localeFallback' => 'ine'), + 'inh' => array('language' => 'Ingush', '3iso639' => 'inh', '2iso639' => null, 'locale' => 'inh', 'localeFallback' => 'inh'), + 'io' => array('language' => 'Ido', '3iso639' => 'ido', '2iso639' => 'io', 'locale' => 'io', 'localeFallback' => 'io'), + 'ipk' => array('language' => 'Inupiaq', '3iso639' => 'ipk', '2iso639' => null, 'locale' => 'ipk', 'localeFallback' => 'ipk'), + 'ira' => array('language' => 'Iranian (Other)', '3iso639' => 'ira', '2iso639' => null, 'locale' => 'ira', 'localeFallback' => 'ira'), + 'iro' => array('language' => 'Iroquoian languages', '3iso639' => 'iro', '2iso639' => null, 'locale' => 'iro', 'localeFallback' => 'iro'), + 'is' => array('language' => 'Icelandic', '3iso639' => 'ice', '2iso639' => 'is', 'locale' => 'is', 'localeFallback' => 'is'), + 'it' => array('language' => 'Italian (Italy)', '3iso639' => 'ita', '2iso639' => 'it', 'locale' => 'it', 'localeFallback' => 'it'), + 'it-ch' => array('language' => 'Italian (Switzerland)', '3iso639' => 'ita', '2iso639' => 'it', 'locale' => 'it_CH', 'localeFallback' => 'it'), + 'ita' => array('language' => 'Italian', '3iso639' => 'ita', '2iso639' => null, 'locale' => 'ita', 'localeFallback' => 'ita'), + 'iu' => array('language' => 'Inuktitut', '3iso639' => 'iku', '2iso639' => 'iu', 'locale' => 'iu', 'localeFallback' => 'iu'), + 'ja' => array('language' => 'Japanese', '3iso639' => 'jpn', '2iso639' => 'ja', 'locale' => 'ja', 'localeFallback' => 'ja'), + 'jav' => array('language' => 'Javanese', '3iso639' => 'jav', '2iso639' => null, 'locale' => 'jav', 'localeFallback' => 'jav'), + 'jbo' => array('language' => 'Lojban', '3iso639' => 'jbo', '2iso639' => null, 'locale' => 'jbo', 'localeFallback' => 'jbo'), + 'jpn' => array('language' => 'Japanese', '3iso639' => 'jpn', '2iso639' => null, 'locale' => 'jpn', 'localeFallback' => 'jpn'), + 'jrb' => array('language' => 'Judeo-Arabic', '3iso639' => 'jrb', '2iso639' => null, 'locale' => 'jrb', 'localeFallback' => 'jrb'), + 'jv' => array('language' => 'Javanese', '3iso639' => 'jav', '2iso639' => 'jv', 'locale' => 'jv', 'localeFallback' => 'jv'), + 'ka' => array('language' => 'Georgian', '3iso639' => 'geo', '2iso639' => 'ka', 'locale' => 'ka', 'localeFallback' => 'ka'), + 'kaa' => array('language' => 'Kara-Kalpak', '3iso639' => 'kaa', '2iso639' => null, 'locale' => 'kaa', 'localeFallback' => 'kaa'), + 'kab' => array('language' => 'Kabyle', '3iso639' => 'kab', '2iso639' => null, 'locale' => 'kab', 'localeFallback' => 'kab'), + 'kac' => array('language' => 'Kachin', '3iso639' => 'kac', '2iso639' => null, 'locale' => 'kac', 'localeFallback' => 'kac'), + 'kal' => array('language' => 'Kalaallisut; Greenlandic', '3iso639' => 'kal', '2iso639' => null, 'locale' => 'kal', 'localeFallback' => 'kal'), + 'kam' => array('language' => 'Kamba', '3iso639' => 'kam', '2iso639' => null, 'locale' => 'kam', 'localeFallback' => 'kam'), + 'kan' => array('language' => 'Kannada', '3iso639' => 'kan', '2iso639' => null, 'locale' => 'kan', 'localeFallback' => 'kan'), + 'kar' => array('language' => 'Karen', '3iso639' => 'kar', '2iso639' => null, 'locale' => 'kar', 'localeFallback' => 'kar'), + 'kas' => array('language' => 'Kashmiri', '3iso639' => 'kas', '2iso639' => null, 'locale' => 'kas', 'localeFallback' => 'kas'), + 'kau' => array('language' => 'Kanuri', '3iso639' => 'kau', '2iso639' => null, 'locale' => 'kau', 'localeFallback' => 'kau'), + 'kaw' => array('language' => 'Kawi', '3iso639' => 'kaw', '2iso639' => null, 'locale' => 'kaw', 'localeFallback' => 'kaw'), + 'kaz' => array('language' => 'Kazakh', '3iso639' => 'kaz', '2iso639' => null, 'locale' => 'kaz', 'localeFallback' => 'kaz'), + 'kbd' => array('language' => 'Kabardian', '3iso639' => 'kbd', '2iso639' => null, 'locale' => 'kbd', 'localeFallback' => 'kbd'), + 'kg' => array('language' => 'Kongo', '3iso639' => 'kon', '2iso639' => 'kg', 'locale' => 'kg', 'localeFallback' => 'kg'), + 'kha' => array('language' => 'Khasi', '3iso639' => 'kha', '2iso639' => null, 'locale' => 'kha', 'localeFallback' => 'kha'), + 'khi' => array('language' => 'Khoisan (Other)', '3iso639' => 'khi', '2iso639' => null, 'locale' => 'khi', 'localeFallback' => 'khi'), + 'khm' => array('language' => 'Khmer', '3iso639' => 'khm', '2iso639' => null, 'locale' => 'khm', 'localeFallback' => 'khm'), + 'kho' => array('language' => 'Khotanese', '3iso639' => 'kho', '2iso639' => null, 'locale' => 'kho', 'localeFallback' => 'kho'), + 'ki' => array('language' => 'Kikuyu; Gikuyu', '3iso639' => 'kik', '2iso639' => 'ki', 'locale' => 'ki', 'localeFallback' => 'ki'), + 'kik' => array('language' => 'Kikuyu; Gikuyu', '3iso639' => 'kik', '2iso639' => null, 'locale' => 'kik', 'localeFallback' => 'kik'), + 'kin' => array('language' => 'Kinyarwanda', '3iso639' => 'kin', '2iso639' => null, 'locale' => 'kin', 'localeFallback' => 'kin'), + 'kir' => array('language' => 'Kirghiz', '3iso639' => 'kir', '2iso639' => null, 'locale' => 'kir', 'localeFallback' => 'kir'), + 'kk' => array('language' => 'Kazakh', '3iso639' => 'kaz', '2iso639' => 'kk', 'locale' => 'kk', 'localeFallback' => 'kk'), + 'kl' => array('language' => 'Kalaallisut; Greenlandic', '3iso639' => 'kal', '2iso639' => 'kl', 'locale' => 'kl', 'localeFallback' => 'kl'), + 'km' => array('language' => 'Khmer', '3iso639' => 'khm', '2iso639' => 'km', 'locale' => 'km', 'localeFallback' => 'km'), + 'kmb' => array('language' => 'Kimbundu', '3iso639' => 'kmb', '2iso639' => null, 'locale' => 'kmb', 'localeFallback' => 'kmb'), + 'kn' => array('language' => 'Kannada', '3iso639' => 'kan', '2iso639' => 'kn', 'locale' => 'kn', 'localeFallback' => 'kn'), + 'ko' => array('language' => 'Korean', '3iso639' => 'kor', '2iso639' => 'ko', 'locale' => 'ko', 'localeFallback' => 'ko'), + 'ko-kp' => array('language' => 'Korea (North), Dem. Rep', '3iso639' => 'kor', '2iso639' => 'ko', 'locale' => 'ko_KP', 'localeFallback' => 'ko'), + 'ko-kr' => array('language' => 'Korea (South)', '3iso639' => 'kor', '2iso639' => 'ko', 'locale' => 'ko_KR', 'localeFallback' => 'ko'), + 'koi8-r' => array('language' => 'Russian', '3iso639' => 'rus', '2iso639' => 'ru', 'locale' => 'koi8-r', 'localeFallback' => 'koi8-r'), + 'kok' => array('language' => 'Konkani', '3iso639' => 'kok', '2iso639' => null, 'locale' => 'kok', 'localeFallback' => 'kok'), + 'kom' => array('language' => 'Komi', '3iso639' => 'kom', '2iso639' => null, 'locale' => 'kom', 'localeFallback' => 'kom'), + 'kon' => array('language' => 'Kongo', '3iso639' => 'kon', '2iso639' => null, 'locale' => 'kon', 'localeFallback' => 'kon'), + 'kos' => array('language' => 'Kosraean', '3iso639' => 'kos', '2iso639' => null, 'locale' => 'kos', 'localeFallback' => 'kos'), + 'kpe' => array('language' => 'Kpelle', '3iso639' => 'kpe', '2iso639' => null, 'locale' => 'kpe', 'localeFallback' => 'kpe'), + 'kr' => array('language' => 'Kanuri', '3iso639' => 'kau', '2iso639' => 'kr', 'locale' => 'kr', 'localeFallback' => 'kr'), + 'krc' => array('language' => 'Karachay-Balkar', '3iso639' => 'krc', '2iso639' => null, 'locale' => 'krc', 'localeFallback' => 'krc'), + 'kro' => array('language' => 'Kru', '3iso639' => 'kro', '2iso639' => null, 'locale' => 'kro', 'localeFallback' => 'kro'), + 'kru' => array('language' => 'Kurukh', '3iso639' => 'kru', '2iso639' => null, 'locale' => 'kru', 'localeFallback' => 'kru'), + 'ks' => array('language' => 'Kashmiri', '3iso639' => 'kas', '2iso639' => 'ks', 'locale' => 'ks', 'localeFallback' => 'ks'), + 'ku' => array('language' => 'Kurdish', '3iso639' => 'kur', '2iso639' => 'ku', 'locale' => 'ku', 'localeFallback' => 'ku'), + 'kua' => array('language' => 'Kuanyama; Kwanyama', '3iso639' => 'kua', '2iso639' => null, 'locale' => 'kua', 'localeFallback' => 'kua'), + 'kum' => array('language' => 'Kumyk', '3iso639' => 'kum', '2iso639' => null, 'locale' => 'kum', 'localeFallback' => 'kum'), + 'kut' => array('language' => 'Kutenai', '3iso639' => 'kut', '2iso639' => null, 'locale' => 'kut', 'localeFallback' => 'kut'), + 'kv' => array('language' => 'Komi', '3iso639' => 'kom', '2iso639' => 'kv', 'locale' => 'kv', 'localeFallback' => 'kv'), + 'kw' => array('language' => 'Cornish', '3iso639' => 'cor', '2iso639' => 'kw', 'locale' => 'kw', 'localeFallback' => 'kw'), + 'ky' => array('language' => 'Kirghiz', '3iso639' => 'kir', '2iso639' => 'ky', 'locale' => 'ky', 'localeFallback' => 'ky'), + 'la' => array('language' => 'Latin', '3iso639' => 'lat', '2iso639' => 'la', 'locale' => 'la', 'localeFallback' => 'la'), + 'lad' => array('language' => 'Ladino', '3iso639' => 'lad', '2iso639' => null, 'locale' => 'lad', 'localeFallback' => 'lad'), + 'lah' => array('language' => 'Lahnda', '3iso639' => 'lah', '2iso639' => null, 'locale' => 'lah', 'localeFallback' => 'lah'), + 'lam' => array('language' => 'Lamba', '3iso639' => 'lam', '2iso639' => null, 'locale' => 'lam', 'localeFallback' => 'lam'), + 'lat' => array('language' => 'Latin', '3iso639' => 'lat', '2iso639' => null, 'locale' => 'lat', 'localeFallback' => 'lat'), + 'lav' => array('language' => 'Latvian', '3iso639' => 'lav', '2iso639' => null, 'locale' => 'lav', 'localeFallback' => 'lav'), + 'lb' => array('language' => 'Luxembourgish; Letzeburgesch', '3iso639' => 'ltz', '2iso639' => 'lb', 'locale' => 'lb', 'localeFallback' => 'lb'), + 'lez' => array('language' => 'Lezghian', '3iso639' => 'lez', '2iso639' => null, 'locale' => 'lez', 'localeFallback' => 'lez'), + 'lg' => array('language' => 'Ganda', '3iso639' => 'lug', '2iso639' => 'lg', 'locale' => 'lg', 'localeFallback' => 'lg'), + 'li' => array('language' => 'Limburgan; Limburger; Limburgish', '3iso639' => 'lim', '2iso639' => 'li', 'locale' => 'li', 'localeFallback' => 'li'), + 'lim' => array('language' => 'Limburgan; Limburger; Limburgish', '3iso639' => 'lim', '2iso639' => null, 'locale' => 'lim', 'localeFallback' => 'lim'), + 'lin' => array('language' => 'Lingala', '3iso639' => 'lin', '2iso639' => null, 'locale' => 'lin', 'localeFallback' => 'lin'), + 'ln' => array('language' => 'Lingala', '3iso639' => 'lin', '2iso639' => 'ln', 'locale' => 'ln', 'localeFallback' => 'ln'), + 'lo' => array('language' => 'Lao', '3iso639' => 'lao', '2iso639' => 'lo', 'locale' => 'lo', 'localeFallback' => 'lo'), + 'lol' => array('language' => 'Mongo', '3iso639' => 'lol', '2iso639' => null, 'locale' => 'lol', 'localeFallback' => 'lol'), + 'loz' => array('language' => 'Lozi', '3iso639' => 'loz', '2iso639' => null, 'locale' => 'loz', 'localeFallback' => 'loz'), + 'lt' => array('language' => 'Lithuanian', '3iso639' => 'lit', '2iso639' => 'lt', 'locale' => 'lt', 'localeFallback' => 'lt'), + 'ltz' => array('language' => 'Luxembourgish; Letzeburgesch', '3iso639' => 'ltz', '2iso639' => null, 'locale' => 'ltz', 'localeFallback' => 'ltz'), + 'lu' => array('language' => 'Luba-Katanga', '3iso639' => 'lub', '2iso639' => 'lu', 'locale' => 'lu', 'localeFallback' => 'lu'), + 'lua' => array('language' => 'Luba-Lulua', '3iso639' => 'lua', '2iso639' => null, 'locale' => 'lua', 'localeFallback' => 'lua'), + 'lub' => array('language' => 'Luba-Katanga', '3iso639' => 'lub', '2iso639' => null, 'locale' => 'lub', 'localeFallback' => 'lub'), + 'lug' => array('language' => 'Ganda', '3iso639' => 'lug', '2iso639' => null, 'locale' => 'lug', 'localeFallback' => 'lug'), + 'lui' => array('language' => 'Luiseno', '3iso639' => 'lui', '2iso639' => null, 'locale' => 'lui', 'localeFallback' => 'lui'), + 'lun' => array('language' => 'Lunda', '3iso639' => 'lun', '2iso639' => null, 'locale' => 'lun', 'localeFallback' => 'lun'), + 'luo' => array('language' => 'Luo (Kenya and Tanzania)', '3iso639' => 'luo', '2iso639' => null, 'locale' => 'luo', 'localeFallback' => 'luo'), + 'lus' => array('language' => 'Lushai', '3iso639' => 'lus', '2iso639' => null, 'locale' => 'lus', 'localeFallback' => 'lus'), + 'lv' => array('language' => 'Latvian', '3iso639' => 'lav', '2iso639' => 'lv', 'locale' => 'lv', 'localeFallback' => 'lv'), + 'mad' => array('language' => 'Madurese', '3iso639' => 'mad', '2iso639' => null, 'locale' => 'mad', 'localeFallback' => 'mad'), + 'mag' => array('language' => 'Magahi', '3iso639' => 'mag', '2iso639' => null, 'locale' => 'mag', 'localeFallback' => 'mag'), + 'mah' => array('language' => 'Marshallese', '3iso639' => 'mah', '2iso639' => null, 'locale' => 'mah', 'localeFallback' => 'mah'), + 'mai' => array('language' => 'Maithili', '3iso639' => 'mai', '2iso639' => null, 'locale' => 'mai', 'localeFallback' => 'mai'), + 'mak' => array('language' => 'Makasar', '3iso639' => 'mak', '2iso639' => null, 'locale' => 'mak', 'localeFallback' => 'mak'), + 'mal' => array('language' => 'Malayalam', '3iso639' => 'mal', '2iso639' => null, 'locale' => 'mal', 'localeFallback' => 'mal'), + 'man' => array('language' => 'Mandingo', '3iso639' => 'man', '2iso639' => null, 'locale' => 'man', 'localeFallback' => 'man'), + 'map' => array('language' => 'Austronesian (Other)', '3iso639' => 'map', '2iso639' => null, 'locale' => 'map', 'localeFallback' => 'map'), + 'mar' => array('language' => 'Marathi', '3iso639' => 'mar', '2iso639' => null, 'locale' => 'mar', 'localeFallback' => 'mar'), + 'mas' => array('language' => 'Masai', '3iso639' => 'mas', '2iso639' => null, 'locale' => 'mas', 'localeFallback' => 'mas'), + 'mdf' => array('language' => 'Moksha', '3iso639' => 'mdf', '2iso639' => null, 'locale' => 'mdf', 'localeFallback' => 'mdf'), + 'mdr' => array('language' => 'Mandar', '3iso639' => 'mdr', '2iso639' => null, 'locale' => 'mdr', 'localeFallback' => 'mdr'), + 'men' => array('language' => 'Mende', '3iso639' => 'men', '2iso639' => null, 'locale' => 'men', 'localeFallback' => 'men'), + 'mg' => array('language' => 'Malagasy', '3iso639' => 'mlg', '2iso639' => 'mg', 'locale' => 'mg', 'localeFallback' => 'mg'), + 'mga' => array('language' => 'Irish, Middle', '3iso639' => 'mga', '2iso639' => null, 'locale' => 'mga', 'localeFallback' => 'mga'), + 'mh' => array('language' => 'Marshallese', '3iso639' => 'mah', '2iso639' => 'mh', 'locale' => 'mh', 'localeFallback' => 'mh'), + 'mi' => array('language' => 'Maori', '3iso639' => 'mao', '2iso639' => 'mi', 'locale' => 'mi', 'localeFallback' => 'mi'), + 'mic' => array('language' => 'Micmac', '3iso639' => 'mic', '2iso639' => null, 'locale' => 'mic', 'localeFallback' => 'mic'), + 'min' => array('language' => 'Minangkabau', '3iso639' => 'min', '2iso639' => null, 'locale' => 'min', 'localeFallback' => 'min'), + 'mk' => array('language' => 'FYRO Macedonian', '3iso639' => 'mac', '2iso639' => 'mk', 'locale' => 'mk', 'localeFallback' => 'mk'), + 'mk-mk' => array('language' => 'Macedonian', '3iso639' => 'mac', '2iso639' => 'mk', 'locale' => 'mk_MK', 'localeFallback' => 'mk'), + 'mkh' => array('language' => 'Mon-Khmer (Other)', '3iso639' => 'mkh', '2iso639' => null, 'locale' => 'mkh', 'localeFallback' => 'mkh'), + 'ml' => array('language' => 'Malayalam', '3iso639' => 'mal', '2iso639' => 'ml', 'locale' => 'ml', 'localeFallback' => 'ml'), + 'mlg' => array('language' => 'Malagasy', '3iso639' => 'mlg', '2iso639' => null, 'locale' => 'mlg', 'localeFallback' => 'mlg'), + 'mlt' => array('language' => 'Maltese', '3iso639' => 'mlt', '2iso639' => null, 'locale' => 'mlt', 'localeFallback' => 'mlt'), + 'mn' => array('language' => 'Mongolian', '3iso639' => 'mon', '2iso639' => 'mn', 'locale' => 'mn', 'localeFallback' => 'mn'), + 'mnc' => array('language' => 'Manchu', '3iso639' => 'haw', '2iso639' => null, 'locale' => 'haw', 'localeFallback' => 'haw'), + 'mni' => array('language' => 'Manipuri', '3iso639' => 'mni', '2iso639' => null, 'locale' => 'mni', 'localeFallback' => 'mni'), + 'mno' => array('language' => 'Manobo languages', '3iso639' => 'mno', '2iso639' => null, 'locale' => 'mno', 'localeFallback' => 'mno'), + 'mo' => array('language' => 'Moldavian', '3iso639' => 'mol', '2iso639' => 'mo', 'locale' => 'mo', 'localeFallback' => 'mo'), + 'moh' => array('language' => 'Mohawk', '3iso639' => 'moh', '2iso639' => null, 'locale' => 'moh', 'localeFallback' => 'moh'), + 'mol' => array('language' => 'Moldavian', '3iso639' => 'mol', '2iso639' => null, 'locale' => 'mol', 'localeFallback' => 'mol'), + 'mon' => array('language' => 'Mongolian', '3iso639' => 'mon', '2iso639' => null, 'locale' => 'mon', 'localeFallback' => 'mon'), + 'mos' => array('language' => 'Mossi', '3iso639' => 'mos', '2iso639' => null, 'locale' => 'mos', 'localeFallback' => 'mos'), + 'mr' => array('language' => 'Marathi', '3iso639' => 'mar', '2iso639' => 'mr', 'locale' => 'mr', 'localeFallback' => 'mr'), + 'ms' => array('language' => 'Malay', '3iso639' => 'may', '2iso639' => 'ms', 'locale' => 'ms', 'localeFallback' => 'ms'), + 'mt' => array('language' => 'Maltese', '3iso639' => 'mlt', '2iso639' => 'mt', 'locale' => 'mt', 'localeFallback' => 'mt'), + 'mun' => array('language' => 'Munda languages', '3iso639' => 'mun', '2iso639' => null, 'locale' => 'mun', 'localeFallback' => 'mun'), + 'mus' => array('language' => 'Creek', '3iso639' => 'mus', '2iso639' => null, 'locale' => 'mus', 'localeFallback' => 'mus'), + 'mwl' => array('language' => 'Mirandese', '3iso639' => 'mwl', '2iso639' => null, 'locale' => 'mwl', 'localeFallback' => 'mwl'), + 'mwr' => array('language' => 'Marwari', '3iso639' => 'mwr', '2iso639' => null, 'locale' => 'mwr', 'localeFallback' => 'mwr'), + 'my' => array('language' => 'Burmese', '3iso639' => 'bur', '2iso639' => 'my', 'locale' => 'my', 'localeFallback' => 'my'), + 'myn' => array('language' => 'Mayan languages', '3iso639' => 'myn', '2iso639' => null, 'locale' => 'myn', 'localeFallback' => 'myn'), + 'myv' => array('language' => 'Erzya', '3iso639' => 'myv', '2iso639' => null, 'locale' => 'myv', 'localeFallback' => 'myv'), + 'na' => array('language' => 'Nauru', '3iso639' => 'nau', '2iso639' => 'na', 'locale' => 'na', 'localeFallback' => 'na'), + 'nah' => array('language' => 'Nahuatl', '3iso639' => 'nah', '2iso639' => null, 'locale' => 'nah', 'localeFallback' => 'nah'), + 'nai' => array('language' => 'North American Indian', '3iso639' => 'nai', '2iso639' => null, 'locale' => 'nai', 'localeFallback' => 'nai'), + 'nap' => array('language' => 'Neapolitan', '3iso639' => 'nap', '2iso639' => null, 'locale' => 'nap', 'localeFallback' => 'nap'), + 'nau' => array('language' => 'Nauru', '3iso639' => 'nau', '2iso639' => null, 'locale' => 'nau', 'localeFallback' => 'nau'), + 'nav' => array('language' => 'Navajo; Navaho', '3iso639' => 'nav', '2iso639' => null, 'locale' => 'nav', 'localeFallback' => 'nav'), + 'nb' => array('language' => 'Norwegian (Bokmal)', '3iso639' => 'nob', '2iso639' => 'nb', 'locale' => 'nb', 'localeFallback' => 'nb'), + 'nbl' => array('language' => 'Ndebele, South; South Ndebele', '3iso639' => 'nbl', '2iso639' => null, 'locale' => 'nbl', 'localeFallback' => 'nbl'), + 'nd' => array('language' => 'North Ndebele', '3iso639' => 'nde', '2iso639' => 'nd', 'locale' => 'nd', 'localeFallback' => 'nd'), + 'nde' => array('language' => 'Ndebele, North; North Ndebele', '3iso639' => 'nde', '2iso639' => null, 'locale' => 'nde', 'localeFallback' => 'nde'), + 'ndo' => array('language' => 'Ndonga', '3iso639' => 'ndo', '2iso639' => null, 'locale' => 'ndo', 'localeFallback' => 'ndo'), + 'nds' => array('language' => 'Low German; Low Saxon;', '3iso639' => 'nds', '2iso639' => null, 'locale' => 'nds', 'localeFallback' => 'nds'), + 'ne' => array('language' => 'Nepali (India)', '3iso639' => 'hrv', '2iso639' => 'hr', 'locale' => 'hr', 'localeFallback' => 'hr'), + 'nep' => array('language' => 'Nepali', '3iso639' => 'nep', '2iso639' => null, 'locale' => 'nep', 'localeFallback' => 'nep'), + 'new' => array('language' => 'Newari; Nepal Bhasa', '3iso639' => 'new', '2iso639' => null, 'locale' => 'new', 'localeFallback' => 'new'), + 'ng' => array('language' => 'Ndonga', '3iso639' => 'ndo', '2iso639' => 'ng', 'locale' => 'ng', 'localeFallback' => 'ng'), + 'nia' => array('language' => 'Nias', '3iso639' => 'nia', '2iso639' => null, 'locale' => 'nia', 'localeFallback' => 'nia'), + 'nic' => array('language' => 'Niger-Kordofanian (Other)', '3iso639' => 'nic', '2iso639' => null, 'locale' => 'nic', 'localeFallback' => 'nic'), + 'niu' => array('language' => 'Niuean', '3iso639' => 'niu', '2iso639' => null, 'locale' => 'niu', 'localeFallback' => 'niu'), + 'nl' => array('language' => 'Dutch (Netherlands)', '3iso639' => 'dut', '2iso639' => 'nl', 'locale' => 'nl', 'localeFallback' => 'nl'), + 'nl-be' => array('language' => 'Dutch (Belgium)', '3iso639' => 'dut', '2iso639' => 'nl', 'locale' => 'nl_BE', 'localeFallback' => 'nl'), + 'nn' => array('language' => 'Norwegian (Nynorsk)', '3iso639' => 'nno', '2iso639' => 'nn', 'locale' => 'nn', 'localeFallback' => 'nn'), + 'nno' => array('language' => 'Norwegian Nynorsk; Nynorsk, Norwegian', '3iso639' => 'nno', '2iso639' => null, 'locale' => 'nno', 'localeFallback' => 'nno'), + 'no' => array('language' => 'Norwegian Bokmċl', '3iso639' => 'nob', '2iso639' => 'no', 'locale' => 'no', 'localeFallback' => 'no'), + 'nob' => array('language' => 'Norwegian Bokmċl; Bokmċl, Norwegian', '3iso639' => 'nob', '2iso639' => null, 'locale' => 'nob', 'localeFallback' => 'nob'), + 'nog' => array('language' => 'Nogai', '3iso639' => 'nog', '2iso639' => null, 'locale' => 'nog', 'localeFallback' => 'nog'), + 'non' => array('language' => 'Norse, Old', '3iso639' => 'non', '2iso639' => null, 'locale' => 'non', 'localeFallback' => 'non'), + 'nor' => array('language' => 'Norwegian', '3iso639' => 'nor', '2iso639' => null, 'locale' => 'nor', 'localeFallback' => 'nor'), + 'nr' => array('language' => 'South Ndebele', '3iso639' => 'nbl', '2iso639' => 'nr', 'locale' => 'nr', 'localeFallback' => 'nr'), + 'nso' => array('language' => 'Northern Sotho; Pedi; Sepedi', '3iso639' => 'nso', '2iso639' => null, 'locale' => 'nso', 'localeFallback' => 'nso'), + 'nub' => array('language' => 'Nubian languages', '3iso639' => 'nub', '2iso639' => null, 'locale' => 'nub', 'localeFallback' => 'nub'), + 'nv' => array('language' => 'Navajo; Navaho', '3iso639' => 'nav', '2iso639' => 'nv', 'locale' => 'nv', 'localeFallback' => 'nv'), + 'nwc' => array('language' => 'Classical Newari; Old Newari; Classical Nepal Bhasa', '3iso639' => 'nwc', '2iso639' => null, 'locale' => 'nwc', 'localeFallback' => 'nwc'), + 'ny' => array('language' => 'Chichewa; Chewa; Nyanja', '3iso639' => 'nya', '2iso639' => 'ny', 'locale' => 'ny', 'localeFallback' => 'ny'), + 'nya' => array('language' => 'Chichewa; Chewa; Nyanja', '3iso639' => 'nya', '2iso639' => null, 'locale' => 'nya', 'localeFallback' => 'nya'), + 'nym' => array('language' => 'Nyamwezi', '3iso639' => 'nym', '2iso639' => null, 'locale' => 'nym', 'localeFallback' => 'nym'), + 'nyn' => array('language' => 'Nyankole', '3iso639' => 'nyn', '2iso639' => null, 'locale' => 'nyn', 'localeFallback' => 'nyn'), + 'nyo' => array('language' => 'Nyoro', '3iso639' => 'nyo', '2iso639' => null, 'locale' => 'nyo', 'localeFallback' => 'nyo'), + 'nzi' => array('language' => 'Nzima', '3iso639' => 'nzi', '2iso639' => null, 'locale' => 'nzi', 'localeFallback' => 'nzi'), + 'oc' => array('language' => 'Occitan (post 1500); Provençal', '3iso639' => 'oci', '2iso639' => 'oc', 'locale' => 'oc', 'localeFallback' => 'oc'), + 'oci' => array('language' => 'Occitan; Provençal', '3iso639' => 'oci', '2iso639' => null, 'locale' => 'oci', 'localeFallback' => 'oci'), + 'oj' => array('language' => 'Ojibwa', '3iso639' => 'oji', '2iso639' => 'oj', 'locale' => 'oj', 'localeFallback' => 'oj'), + 'oji' => array('language' => 'Ojibwa', '3iso639' => 'oji', '2iso639' => null, 'locale' => 'oji', 'localeFallback' => 'oji'), + 'om' => array('language' => 'Oromo', '3iso639' => 'orm', '2iso639' => 'om', 'locale' => 'om', 'localeFallback' => 'om'), + 'or' => array('language' => 'Oriya', '3iso639' => 'ori', '2iso639' => 'or', 'locale' => 'or', 'localeFallback' => 'or'), + 'ori' => array('language' => 'Oriya', '3iso639' => 'ori', '2iso639' => null, 'locale' => 'ori', 'localeFallback' => 'ori'), + 'orm' => array('language' => 'Oromo', '3iso639' => 'orm', '2iso639' => null, 'locale' => 'orm', 'localeFallback' => 'orm'), + 'os' => array('language' => 'Ossetian; Ossetic', '3iso639' => 'oss', '2iso639' => 'os', 'locale' => 'os', 'localeFallback' => 'os'), + 'osa' => array('language' => 'Osage', '3iso639' => 'osa', '2iso639' => null, 'locale' => 'osa', 'localeFallback' => 'osa'), + 'oss' => array('language' => 'Ossetian; Ossetic', '3iso639' => 'oss', '2iso639' => null, 'locale' => 'oss', 'localeFallback' => 'oss'), + 'ota' => array('language' => 'Turkish, Ottoman', '3iso639' => 'ota', '2iso639' => null, 'locale' => 'ota', 'localeFallback' => 'ota'), + 'oto' => array('language' => 'Otomian languages', '3iso639' => 'oto', '2iso639' => null, 'locale' => 'oto', 'localeFallback' => 'oto'), + 'pa' => array('language' => 'Panjabi; Punjabi', '3iso639' => 'pan', '2iso639' => 'pa', 'locale' => 'pa', 'localeFallback' => 'pa'), + 'pa-in' => array('language' => 'Punjabi (India)', '3iso639' => 'pan', '2iso639' => 'pa', 'locale' => 'pa_IN', 'localeFallback' => 'pa'), + 'pa-pk' => array('language' => 'Punjabi (Pakistan)', '3iso639' => 'pan', '2iso639' => 'pa', 'locale' => 'pa_PK', 'localeFallback' => 'pa'), + 'paa' => array('language' => 'Papuan (Other)', '3iso639' => 'paa', '2iso639' => null, 'locale' => 'paa', 'localeFallback' => 'paa'), + 'pag' => array('language' => 'Pangasinan', '3iso639' => 'pag', '2iso639' => null, 'locale' => 'pag', 'localeFallback' => 'pag'), + 'pal' => array('language' => 'Pahlavi', '3iso639' => 'pal', '2iso639' => null, 'locale' => 'pal', 'localeFallback' => 'pal'), + 'pam' => array('language' => 'Pampanga', '3iso639' => 'pam', '2iso639' => null, 'locale' => 'pam', 'localeFallback' => 'pam'), + 'pan' => array('language' => 'Panjabi; Punjabi', '3iso639' => 'pan', '2iso639' => null, 'locale' => 'pan', 'localeFallback' => 'pan'), + 'pap' => array('language' => 'Papiamento', '3iso639' => 'pap', '2iso639' => null, 'locale' => 'pap', 'localeFallback' => 'pap'), + 'pau' => array('language' => 'Palauan', '3iso639' => 'pau', '2iso639' => null, 'locale' => 'pau', 'localeFallback' => 'pau'), + 'peo' => array('language' => 'Persian, Old', '3iso639' => 'peo', '2iso639' => null, 'locale' => 'peo', 'localeFallback' => 'peo'), + 'phi' => array('language' => 'Philippine (Other)', '3iso639' => 'phi', '2iso639' => null, 'locale' => 'phi', 'localeFallback' => 'phi'), + 'phn' => array('language' => 'Phoenician', '3iso639' => 'phn', '2iso639' => null, 'locale' => 'phn', 'localeFallback' => 'phn'), + 'pi' => array('language' => 'Pali', '3iso639' => 'pli', '2iso639' => 'pi', 'locale' => 'pi', 'localeFallback' => 'pi'), + 'pl' => array('language' => 'Polish', '3iso639' => 'pol', '2iso639' => 'pl', 'locale' => 'pl', 'localeFallback' => 'pl'), + 'pli' => array('language' => 'Pali', '3iso639' => 'pli', '2iso639' => null, 'locale' => 'pli', 'localeFallback' => 'pli'), + 'pol' => array('language' => 'Polish', '3iso639' => 'pol', '2iso639' => null, 'locale' => 'pol', 'localeFallback' => 'pol'), + 'pon' => array('language' => 'Pohnpeian', '3iso639' => 'pon', '2iso639' => null, 'locale' => 'pon', 'localeFallback' => 'pon'), + 'por' => array('language' => 'Portuguese', '3iso639' => 'por', '2iso639' => null, 'locale' => 'por', 'localeFallback' => 'por'), + 'pra' => array('language' => 'Prakrit languages', '3iso639' => 'pra', '2iso639' => null, 'locale' => 'pra', 'localeFallback' => 'pra'), + 'pro' => array('language' => 'Provençal, Old', '3iso639' => 'pro', '2iso639' => null, 'locale' => 'pro', 'localeFallback' => 'pro'), + 'ps' => array('language' => 'Pushto', '3iso639' => 'pus', '2iso639' => 'ps', 'locale' => 'ps', 'localeFallback' => 'ps'), + 'pt' => array('language' => 'Portuguese (Portugal)', '3iso639' => 'por', '2iso639' => 'pt', 'locale' => 'pt', 'localeFallback' => 'pt'), + 'pt-br' => array('language' => 'Portuguese (Brazil)', '3iso639' => 'por', '2iso639' => 'pt', 'locale' => 'pt_BR', 'localeFallback' => 'pt'), + 'pus' => array('language' => 'Pushto', '3iso639' => 'pus', '2iso639' => null, 'locale' => 'pus', 'localeFallback' => 'pus'), + 'qu' => array('language' => 'Quechua', '3iso639' => 'que', '2iso639' => 'qu', 'locale' => 'qu', 'localeFallback' => 'qu'), + 'que' => array('language' => 'Quechua', '3iso639' => 'que', '2iso639' => null, 'locale' => 'que', 'localeFallback' => 'que'), + 'raj' => array('language' => 'Rajasthani', '3iso639' => 'raj', '2iso639' => null, 'locale' => 'raj', 'localeFallback' => 'raj'), + 'rap' => array('language' => 'Rapanui', '3iso639' => 'rap', '2iso639' => null, 'locale' => 'rap', 'localeFallback' => 'rap'), + 'rar' => array('language' => 'Rarotongan', '3iso639' => 'rar', '2iso639' => null, 'locale' => 'rar', 'localeFallback' => 'rar'), + 'rm' => array('language' => 'Raeto-Romance', '3iso639' => 'roh', '2iso639' => 'rm', 'locale' => 'rm', 'localeFallback' => 'rm'), + 'rn' => array('language' => 'Rundi', '3iso639' => 'run', '2iso639' => 'rn', 'locale' => 'rn', 'localeFallback' => 'rn'), + 'ro' => array('language' => 'Romanian', '3iso639' => 'rum', '2iso639' => 'ro', 'locale' => 'ro', 'localeFallback' => 'ro'), + 'ro-md' => array('language' => 'Romanian (Moldova)', '3iso639' => 'rum', '2iso639' => 'ro', 'locale' => 'ro_MD', 'localeFallback' => 'ro'), + 'roa' => array('language' => 'Romance (Other)', '3iso639' => 'roa', '2iso639' => null, 'locale' => 'roa', 'localeFallback' => 'roa'), + 'roh' => array('language' => 'Raeto-Romance', '3iso639' => 'roh', '2iso639' => null, 'locale' => 'roh', 'localeFallback' => 'roh'), + 'rom' => array('language' => 'Romany', '3iso639' => 'rom', '2iso639' => null, 'locale' => 'rom', 'localeFallback' => 'rom'), + 'ru' => array('language' => 'Russian', '3iso639' => 'rus', '2iso639' => 'ru', 'locale' => 'ru', 'localeFallback' => 'ru'), + 'ru-md' => array('language' => 'Russian (Moldova)', '3iso639' => 'rus', '2iso639' => 'ru', 'locale' => 'ru_MD', 'localeFallback' => 'ru'), + 'rup' => array('language' => 'Aromanian', '3iso639' => 'rup', '2iso639' => null, 'locale' => 'rup', 'localeFallback' => 'rup'), + 'sa' => array('language' => 'Sanskrit', '3iso639' => 'san', '2iso639' => 'sa', 'locale' => 'sa', 'localeFallback' => 'sa'), + 'sad' => array('language' => 'Sandawe', '3iso639' => 'sad', '2iso639' => null, 'locale' => 'sad', 'localeFallback' => 'sad'), + 'sah' => array('language' => 'Yakut', '3iso639' => 'sah', '2iso639' => null, 'locale' => 'sah', 'localeFallback' => 'sah'), + 'sai' => array('language' => 'South American Indian (Other)', '3iso639' => 'sai', '2iso639' => null, 'locale' => 'sai', 'localeFallback' => 'sai'), + 'sal' => array('language' => 'Salishan languages', '3iso639' => 'sal', '2iso639' => null, 'locale' => 'sal', 'localeFallback' => 'sal'), + 'sam' => array('language' => 'Samaritan Aramaic', '3iso639' => 'sam', '2iso639' => null, 'locale' => 'sam', 'localeFallback' => 'sam'), + 'sas' => array('language' => 'Sasak', '3iso639' => 'sas', '2iso639' => null, 'locale' => 'sas', 'localeFallback' => 'sas'), + 'sat' => array('language' => 'Santali', '3iso639' => 'sat', '2iso639' => null, 'locale' => 'sat', 'localeFallback' => 'sat'), + 'sc' => array('language' => 'Sardinian', '3iso639' => 'srd', '2iso639' => 'sc', 'locale' => 'sc', 'localeFallback' => 'sc'), + 'scn' => array('language' => 'Sicilian', '3iso639' => 'scn', '2iso639' => null, 'locale' => 'scn', 'localeFallback' => 'scn'), + 'sco' => array('language' => 'Scots', '3iso639' => 'sco', '2iso639' => null, 'locale' => 'sco', 'localeFallback' => 'sco'), + 'sd' => array('language' => 'Sindhi', '3iso639' => 'snd', '2iso639' => 'sd', 'locale' => 'sd', 'localeFallback' => 'sd'), + 'se' => array('language' => 'Northern Sami', '3iso639' => 'sme', '2iso639' => 'se', 'locale' => 'se', 'localeFallback' => 'se'), + 'sel' => array('language' => 'Selkup', '3iso639' => 'sel', '2iso639' => null, 'locale' => 'sel', 'localeFallback' => 'sel'), + 'sem' => array('language' => 'Semitic (Other)', '3iso639' => 'sem', '2iso639' => null, 'locale' => 'sem', 'localeFallback' => 'sem'), + 'sg' => array('language' => 'Sango', '3iso639' => 'sag', '2iso639' => 'sg', 'locale' => 'sg', 'localeFallback' => 'sg'), + 'sga' => array('language' => 'Irish, Old', '3iso639' => 'sga', '2iso639' => null, 'locale' => 'sga', 'localeFallback' => 'sga'), + 'shn' => array('language' => 'Shan', '3iso639' => 'shn', '2iso639' => null, 'locale' => 'shn', 'localeFallback' => 'shn'), + 'si' => array('language' => 'Sinhala; Sinhalese', '3iso639' => 'sin', '2iso639' => 'si', 'locale' => 'si', 'localeFallback' => 'si'), + 'sid' => array('language' => 'Sidamo', '3iso639' => 'sid', '2iso639' => null, 'locale' => 'sid', 'localeFallback' => 'sid'), + 'sio' => array('language' => 'Siouan languages', '3iso639' => 'sio', '2iso639' => null, 'locale' => 'sio', 'localeFallback' => 'sio'), + 'sit' => array('language' => 'Sino-Tibetan (Other)', '3iso639' => 'sit', '2iso639' => null, 'locale' => 'sit', 'localeFallback' => 'sit'), + 'sk' => array('language' => 'Slovak', '3iso639' => 'slo', '2iso639' => 'sk', 'locale' => 'sk', 'localeFallback' => 'sk'), + 'sl' => array('language' => 'Slovenian', '3iso639' => 'slv', '2iso639' => 'sl', 'locale' => 'sl', 'localeFallback' => 'sl'), + 'sla' => array('language' => 'Slavic (Other)', '3iso639' => 'sla', '2iso639' => null, 'locale' => 'sla', 'localeFallback' => 'sla'), + 'sm' => array('language' => 'Samoan', '3iso639' => 'smo', '2iso639' => 'sm', 'locale' => 'sm', 'localeFallback' => 'sm'), + 'sma' => array('language' => 'Southern Sami', '3iso639' => 'sma', '2iso639' => null, 'locale' => 'sma', 'localeFallback' => 'sma'), + 'smi' => array('language' => 'Sami languages (Other)', '3iso639' => 'smi', '2iso639' => null, 'locale' => 'smi', 'localeFallback' => 'smi'), + 'smj' => array('language' => 'Lule Sami', '3iso639' => 'smj', '2iso639' => null, 'locale' => 'smj', 'localeFallback' => 'smj'), + 'smn' => array('language' => 'Inari Sami', '3iso639' => 'smn', '2iso639' => null, 'locale' => 'smn', 'localeFallback' => 'smn'), + 'sms' => array('language' => 'Skolt Sami', '3iso639' => 'sms', '2iso639' => null, 'locale' => 'sms', 'localeFallback' => 'sms'), + 'sn' => array('language' => 'Shona', '3iso639' => 'sna', '2iso639' => 'sn', 'locale' => 'sn', 'localeFallback' => 'sn'), + 'snk' => array('language' => 'Soninke', '3iso639' => 'snk', '2iso639' => null, 'locale' => 'snk', 'localeFallback' => 'snk'), + 'so' => array('language' => 'Somali', '3iso639' => 'som', '2iso639' => 'so', 'locale' => 'so', 'localeFallback' => 'so'), + 'sog' => array('language' => 'Sogdian', '3iso639' => 'sog', '2iso639' => null, 'locale' => 'sog', 'localeFallback' => 'sog'), + 'son' => array('language' => 'Songhai', '3iso639' => 'son', '2iso639' => null, 'locale' => 'son', 'localeFallback' => 'son'), + 'sq' => array('language' => 'Albanian', '3iso639' => 'alb', '2iso639' => 'sq', 'locale' => 'sq', 'localeFallback' => 'sq'), + 'sr' => array('language' => 'Serbian', '3iso639' => 'scc', '2iso639' => 'sr', 'locale' => 'sr', 'localeFallback' => 'sr'), + 'srr' => array('language' => 'Serer', '3iso639' => 'srr', '2iso639' => null, 'locale' => 'srr', 'localeFallback' => 'srr'), + 'ss' => array('language' => 'Swati', '3iso639' => 'ssw', '2iso639' => 'ss', 'locale' => 'ss', 'localeFallback' => 'ss'), + 'ssa' => array('language' => 'Nilo-Saharan (Other)', '3iso639' => 'ssa', '2iso639' => null, 'locale' => 'ssa', 'localeFallback' => 'ssa'), + 'st' => array('language' => 'Southern Sotho', '3iso639' => 'sot', '2iso639' => 'st', 'locale' => 'st', 'localeFallback' => 'st'), + 'su' => array('language' => 'Sundanese', '3iso639' => 'sun', '2iso639' => 'su', 'locale' => 'su', 'localeFallback' => 'su'), + 'suk' => array('language' => 'Sukuma', '3iso639' => 'suk', '2iso639' => null, 'locale' => 'suk', 'localeFallback' => 'suk'), + 'sus' => array('language' => 'Susu', '3iso639' => 'sus', '2iso639' => null, 'locale' => 'sus', 'localeFallback' => 'sus'), + 'sux' => array('language' => 'Sumerian', '3iso639' => 'sux', '2iso639' => null, 'locale' => 'sux', 'localeFallback' => 'sux'), + 'sv' => array('language' => 'Swedish', '3iso639' => 'swe', '2iso639' => 'sv', 'locale' => 'sv', 'localeFallback' => 'sv'), + 'sv-fi' => array('language' => 'Swedish (Finland)', '3iso639' => 'swe', '2iso639' => 'sv', 'locale' => 'sv_FI', 'localeFallback' => 'sv'), + 'sw' => array('language' => 'Swahili', '3iso639' => 'swa', '2iso639' => 'sw', 'locale' => 'sw', 'localeFallback' => 'sw'), + 'swa' => array('language' => 'Swahili', '3iso639' => 'swa', '2iso639' => null, 'locale' => 'swa', 'localeFallback' => 'swa'), + 'swe' => array('language' => 'Swedish', '3iso639' => 'swe', '2iso639' => null, 'locale' => 'swe', 'localeFallback' => 'swe'), + 'syr' => array('language' => 'Syriac', '3iso639' => 'syr', '2iso639' => null, 'locale' => 'syr', 'localeFallback' => 'syr'), + 'ta' => array('language' => 'Tamil', '3iso639' => 'tam', '2iso639' => 'ta', 'locale' => 'ta', 'localeFallback' => 'ta'), + 'tai' => array('language' => 'Tai (Other)', '3iso639' => 'tai', '2iso639' => null, 'locale' => 'tai', 'localeFallback' => 'tai'), + 'te' => array('language' => 'Telugu', '3iso639' => 'tel', '2iso639' => 'te', 'locale' => 'te', 'localeFallback' => 'te'), + 'tem' => array('language' => 'Timne', '3iso639' => 'tem', '2iso639' => null, 'locale' => 'tem', 'localeFallback' => 'tem'), + 'ter' => array('language' => 'Tereno', '3iso639' => 'ter', '2iso639' => null, 'locale' => 'ter', 'localeFallback' => 'ter'), + 'tet' => array('language' => 'Tetum', '3iso639' => 'tet', '2iso639' => null, 'locale' => 'tet', 'localeFallback' => 'tet'), + 'tg' => array('language' => 'Tajik', '3iso639' => 'tgk', '2iso639' => 'tg', 'locale' => 'tg', 'localeFallback' => 'tg'), + 'th' => array('language' => 'Thai', '3iso639' => 'tha', '2iso639' => 'th', 'locale' => 'th', 'localeFallback' => 'th'), + 'tig' => array('language' => 'Tigre', '3iso639' => 'tig', '2iso639' => null, 'locale' => 'tig', 'localeFallback' => 'tig'), + 'tir' => array('language' => 'Tigrinya|', '3iso639' => 'tir', '2iso639' => 'ti', 'locale' => 'ti', 'localeFallback' => 'ti'), + 'tiv' => array('language' => 'Tiv', '3iso639' => 'tiv', '2iso639' => null, 'locale' => 'tiv', 'localeFallback' => 'tiv'), + 'tk' => array('language' => 'Turkmen', '3iso639' => 'tuk', '2iso639' => 'tk', 'locale' => 'tk', 'localeFallback' => 'tk'), + 'tkl' => array('language' => 'Tokelau', '3iso639' => 'tkl', '2iso639' => null, 'locale' => 'tkl', 'localeFallback' => 'tkl'), + 'tl' => array('language' => 'Tagalog', '3iso639' => 'tgl', '2iso639' => 'tl', 'locale' => 'tl', 'localeFallback' => 'tl'), + 'tlh' => array('language' => 'Klingon; tlhIngan-Hol', '3iso639' => 'tlh', '2iso639' => null, 'locale' => 'tlh', 'localeFallback' => 'tlh'), + 'tli' => array('language' => 'Tlingit', '3iso639' => 'tli', '2iso639' => null, 'locale' => 'tli', 'localeFallback' => 'tli'), + 'tmh' => array('language' => 'Tamashek', '3iso639' => 'tmh', '2iso639' => null, 'locale' => 'tmh', 'localeFallback' => 'tmh'), + 'tn' => array('language' => 'Tswana', '3iso639' => 'tsn', '2iso639' => 'tn', 'locale' => 'tn', 'localeFallback' => 'tn'), + 'to' => array('language' => 'Tonga (Tonga Islands)', '3iso639' => 'ton', '2iso639' => 'to', 'locale' => 'to', 'localeFallback' => 'to'), + 'tog' => array('language' => 'Tonga (Nyasa)', '3iso639' => 'tog', '2iso639' => null, 'locale' => 'tog', 'localeFallback' => 'tog'), + 'tpi' => array('language' => 'Tok Pisin', '3iso639' => 'tpi', '2iso639' => null, 'locale' => 'tpi', 'localeFallback' => 'tpi'), + 'tr' => array('language' => 'Turkish', '3iso639' => 'tur', '2iso639' => 'tr', 'locale' => 'tr', 'localeFallback' => 'tr'), + 'ts' => array('language' => 'Tsonga', '3iso639' => 'tso', '2iso639' => 'ts', 'locale' => 'ts', 'localeFallback' => 'ts'), + 'tsi' => array('language' => 'Tsimshian', '3iso639' => 'tsi', '2iso639' => null, 'locale' => 'tsi', 'localeFallback' => 'tsi'), + 'tt' => array('language' => 'Tatar', '3iso639' => 'tat', '2iso639' => 'tt', 'locale' => 'tt', 'localeFallback' => 'tt'), + 'tum' => array('language' => 'Tumbuka', '3iso639' => 'tum', '2iso639' => null, 'locale' => 'tum', 'localeFallback' => 'tum'), + 'tup' => array('language' => 'Tupi languages', '3iso639' => 'tup', '2iso639' => null, 'locale' => 'tup', 'localeFallback' => 'tup'), + 'tut' => array('language' => 'Altaic (Other)', '3iso639' => 'tut', '2iso639' => null, 'locale' => 'tut', 'localeFallback' => 'tut'), + 'tvl' => array('language' => 'Tuvalu', '3iso639' => 'tvl', '2iso639' => null, 'locale' => 'tvl', 'localeFallback' => 'tvl'), + 'tw' => array('language' => 'Twi', '3iso639' => 'twi', '2iso639' => 'tw', 'locale' => 'tw', 'localeFallback' => 'tw'), + 'ty' => array('language' => 'Tahitian', '3iso639' => 'tah', '2iso639' => 'ty', 'locale' => 'ty', 'localeFallback' => 'ty'), + 'tyv' => array('language' => 'Tuvinian', '3iso639' => 'tyv', '2iso639' => null, 'locale' => 'tyv', 'localeFallback' => 'tyv'), + 'udm' => array('language' => 'Udmurt', '3iso639' => 'udm', '2iso639' => null, 'locale' => 'udm', 'localeFallback' => 'udm'), + 'ug' => array('language' => 'Uighur; Uyghur', '3iso639' => 'uig', '2iso639' => 'ug', 'locale' => 'ug', 'localeFallback' => 'ug'), + 'uga' => array('language' => 'Ugaritic', '3iso639' => 'uga', '2iso639' => null, 'locale' => 'uga', 'localeFallback' => 'uga'), + 'uk' => array('language' => 'Ukrainian', '3iso639' => 'ukr', '2iso639' => 'uk', 'locale' => 'uk', 'localeFallback' => 'uk'), + 'umb' => array('language' => 'Umbundu', '3iso639' => 'umb', '2iso639' => null, 'locale' => 'umb', 'localeFallback' => 'umb'), + 'ur' => array('language' => 'Urdu', '3iso639' => 'urd', '2iso639' => 'ur', 'locale' => 'ur', 'localeFallback' => 'ur'), + 'us' => array('language' => 'English (United States)', '3iso639' => 'eng', '2iso639' => 'en', 'locale' => 'en_US', 'localeFallback' => 'en_US'), + 'uz' => array('language' => 'Uzbek', '3iso639' => 'uzb', '2iso639' => 'uz', 'locale' => 'uz', 'localeFallback' => 'uz'), + 'vai' => array('language' => 'Vai', '3iso639' => 'vai', '2iso639' => null, 'locale' => 'vai', 'localeFallback' => 'vai'), + 've' => array('language' => 'Venda', '3iso639' => 'ven', '2iso639' => 've', 'locale' => 've', 'localeFallback' => 've'), + 'vi' => array('language' => 'Vietnamese', '3iso639' => 'vie', '2iso639' => 'vi', 'locale' => 'vi', 'localeFallback' => 'vi'), + 'vo' => array('language' => 'Volapük', '3iso639' => 'vol', '2iso639' => 'vo', 'locale' => 'vo', 'localeFallback' => 'vo'), + 'vot' => array('language' => 'Votic', '3iso639' => 'vot', '2iso639' => null, 'locale' => 'vot', 'localeFallback' => 'vot'), + 'wa' => array('language' => 'Walloon', '3iso639' => 'wln', '2iso639' => 'wa', 'locale' => 'wa', 'localeFallback' => 'wa'), + 'wak' => array('language' => 'Wakashan languages', '3iso639' => 'wak', '2iso639' => null, 'locale' => 'wak', 'localeFallback' => 'wak'), + 'wal' => array('language' => 'Walamo', '3iso639' => 'wal', '2iso639' => null, 'locale' => 'wal', 'localeFallback' => 'wal'), + 'war' => array('language' => 'Waray', '3iso639' => 'war', '2iso639' => null, 'locale' => 'war', 'localeFallback' => 'war'), + 'was' => array('language' => 'Washo', '3iso639' => 'was', '2iso639' => null, 'locale' => 'was', 'localeFallback' => 'was'), + 'wen' => array('language' => 'Sorbian languages', '3iso639' => 'wen', '2iso639' => null, 'locale' => 'wen', 'localeFallback' => 'wen'), + 'wo' => array('language' => 'Wolof', '3iso639' => 'wol', '2iso639' => 'wo', 'locale' => 'wo', 'localeFallback' => 'wo'), + 'xal' => array('language' => 'Kalmyk', '3iso639' => 'xal', '2iso639' => null, 'locale' => 'xal', 'localeFallback' => 'xal'), + 'xh' => array('language' => 'Xhosa', '3iso639' => 'xho', '2iso639' => 'xh', 'locale' => 'xh', 'localeFallback' => 'xh'), + 'yao' => array('language' => 'Yao', '3iso639' => 'yao', '2iso639' => null, 'locale' => 'yao', 'localeFallback' => 'yao'), + 'yap' => array('language' => 'Yapese', '3iso639' => 'yap', '2iso639' => null, 'locale' => 'yap', 'localeFallback' => 'yap'), + 'yi' => array('language' => 'Yiddish', '3iso639' => 'yid', '2iso639' => 'yi', 'locale' => 'yi', 'localeFallback' => 'yi'), + 'yo' => array('language' => 'Yoruba', '3iso639' => 'yor', '2iso639' => 'yo', 'locale' => 'yo', 'localeFallback' => 'yo'), + 'ypk' => array('language' => 'Yupik languages', '3iso639' => 'ypk', '2iso639' => null, 'locale' => 'ypk', 'localeFallback' => 'ypk'), + 'za' => array('language' => 'Zhuang; Chuang', '3iso639' => 'zha', '2iso639' => 'za', 'locale' => 'za', 'localeFallback' => 'za'), + 'zap' => array('language' => 'Zapotec', '3iso639' => 'zap', '2iso639' => null, 'locale' => 'zap', 'localeFallback' => 'zap'), + 'zen' => array('language' => 'Zenaga', '3iso639' => 'zen', '2iso639' => null, 'locale' => 'zen', 'localeFallback' => 'zen'), + 'zh' => array('language' => 'Chinese', '3iso639' => 'chi', '2iso639' => 'zh', 'locale' => 'zh', 'localeFallback' => 'zh'), + 'zh-cn' => array('language' => 'Chinese (China)', '3iso639' => 'chi', '2iso639' => 'zh', 'locale' => 'zh_CN', 'localeFallback' => 'zh'), + 'zh-hk' => array('language' => 'Chinese (Hong Kong SAR)', '3iso639' => 'chi', '2iso639' => 'zh', 'locale' => 'zh_HK', 'localeFallback' => 'zh'), + 'zh-mo' => array('language' => 'Chinese (Macau SAR)', '3iso639' => 'chi', '2iso639' => 'zh', 'locale' => 'zh_MO', 'localeFallback' => 'zh'), + 'zh-sg' => array('language' => 'Chinese (Singapore)', '3iso639' => 'chi', '2iso639' => 'zh', 'locale' => 'zh_SG', 'localeFallback' => 'zh'), + 'zh-tw' => array('language' => 'Chinese (Taiwan)', '3iso639' => 'chi', '2iso639' => 'zh', 'locale' => 'zh_TW', 'localeFallback' => 'zh'), + 'znd' => array('language' => 'Zande', '3iso639' => 'znd', '2iso639' => null, 'locale' => 'znd', 'localeFallback' => 'znd'), + 'zu' => array('language' => 'Zulu', '3iso639' => 'zul', '2iso639' => 'zu', 'locale' => 'zu', 'localeFallback' => 'zu'), + 'zun' => array('language' => 'Zuni', '3iso639' => 'zun', '2iso639' => null, 'locale' => 'zun', 'localeFallback' => 'zun')); + + function __construct() + { + parent::__construct(); + } + + function get($language) + { + if (!is_null($language)) + { + return $this->_setLanguage($language); + } + else + { + return $this->_autoLanguage(); + } + } + + function _setLanguage($language = 'eng') + { + if ((!is_null($language)) && (isset($this->_l10nCatalog[$this->_l10nMap[$language]]))) + { + $this->language = $this->_l10nCatalog[$this->_l10nMap[$language]]['language']; + $this->languagePath = array(0 => $this->_l10nCatalog[$language]['locale'], + 1 => $this->_l10nCatalog[$language]['localeFallback'], + 2 => $this->_l10nCatalog[DEFAULT_LANGUAGE]['localeFallback']); + $this->lang = $language; + $this->locale = $this->_l10nCatalog[$this->_l10nMap[$language]]['locale']; + } + else + { + if(defined('DEFAULT_LANGUAGE')) + { + $this->language = $this->_l10nCatalog[$this->_l10nMap[DEFAULT_LANGUAGE]]['language']; + $this->languagePath = array(0 => $this->_l10nCatalog[$this->_l10nMap[DEFAULT_LANGUAGE]]['locale'], + 1 => $this->_l10nCatalog[$this->_l10nMap[DEFAULT_LANGUAGE]]['localeFallback']); + $this->lang = DEFAULT_LANGUAGE; + $this->locale = $this->_l10nCatalog[$this->_l10nMap[DEFAULT_LANGUAGE]]['locale']; + } + } + } + + function _autoLanguage() + { + $_detectableLanguages = split ('[,;]', env('HTTP_ACCEPT_LANGUAGE')); + + foreach ($_detectableLanguages as $langKey => $key) { + if (isset($this->_l10nCatalog[$langKey])) + { + $this->language = $this->_l10nCatalog[$langKey]['language']; + $this->languagePath = array(0 => $this->_l10nCatalog[$langKey]['locale'], + 1 => $this->_l10nCatalog[$langKey]['localeFallback'], + 2 => $this->_l10nCatalog[DEFAULT_LANGUAGE]['localeFallback']); + $this->lang = $langKey; + $this->locale = $this->_l10nCatalog[$langKey]['locale']; + break; + } + } + } +} + +?> \ No newline at end of file diff --git a/cake/libs/model/dbo/dbo_adodb.php b/cake/libs/model/datasources/dbo/dbo_adodb.php similarity index 100% rename from cake/libs/model/dbo/dbo_adodb.php rename to cake/libs/model/datasources/dbo/dbo_adodb.php diff --git a/cake/libs/model/dbo/dbo_generic.php b/cake/libs/model/datasources/dbo/dbo_generic.php similarity index 100% rename from cake/libs/model/dbo/dbo_generic.php rename to cake/libs/model/datasources/dbo/dbo_generic.php diff --git a/cake/libs/model/dbo/dbo_mssql.php b/cake/libs/model/datasources/dbo/dbo_mssql.php similarity index 100% rename from cake/libs/model/dbo/dbo_mssql.php rename to cake/libs/model/datasources/dbo/dbo_mssql.php diff --git a/cake/libs/model/dbo/dbo_mysql.php b/cake/libs/model/datasources/dbo/dbo_mysql.php similarity index 100% rename from cake/libs/model/dbo/dbo_mysql.php rename to cake/libs/model/datasources/dbo/dbo_mysql.php diff --git a/cake/libs/model/dbo/dbo_mysqli.php b/cake/libs/model/datasources/dbo/dbo_mysqli.php similarity index 100% rename from cake/libs/model/dbo/dbo_mysqli.php rename to cake/libs/model/datasources/dbo/dbo_mysqli.php diff --git a/cake/libs/model/dbo/dbo_odbc.php b/cake/libs/model/datasources/dbo/dbo_odbc.php similarity index 100% rename from cake/libs/model/dbo/dbo_odbc.php rename to cake/libs/model/datasources/dbo/dbo_odbc.php diff --git a/cake/libs/model/dbo/dbo_pear.php b/cake/libs/model/datasources/dbo/dbo_pear.php similarity index 100% rename from cake/libs/model/dbo/dbo_pear.php rename to cake/libs/model/datasources/dbo/dbo_pear.php diff --git a/cake/libs/model/dbo/dbo_postgres.php b/cake/libs/model/datasources/dbo/dbo_postgres.php similarity index 100% rename from cake/libs/model/dbo/dbo_postgres.php rename to cake/libs/model/datasources/dbo/dbo_postgres.php diff --git a/cake/libs/model/dbo/dbo_sqlite.php b/cake/libs/model/datasources/dbo/dbo_sqlite.php similarity index 100% rename from cake/libs/model/dbo/dbo_sqlite.php rename to cake/libs/model/datasources/dbo/dbo_sqlite.php diff --git a/cake/libs/model/i18n/i18n.sql b/cake/libs/model/i18n/i18n.sql new file mode 100644 index 000000000..64a60a173 --- /dev/null +++ b/cake/libs/model/i18n/i18n.sql @@ -0,0 +1,18 @@ +CREATE TABLE `i18n` ( + `id` int(11) NOT NULL auto_increment, + `locale` varchar(8) NOT NULL default '', + `i18n_content_id` int(11) NOT NULL default '0', + `model` varchar(255) NOT NULL default '', + `row_id` int(11) NOT NULL default '0', + `field` varchar(255) NOT NULL default '', + PRIMARY KEY (`id`), + KEY `row_id` (`row_id`), + KEY `model` (`model`), + KEY `field` (`field`) +); + +CREATE TABLE `i18n_content` ( + `id` int(11) NOT NULL auto_increment, + `content` text, + PRIMARY KEY (`id`) +); diff --git a/cake/libs/model/i18n/translate.php b/cake/libs/model/i18n/translate.php new file mode 100644 index 000000000..397fcda21 --- /dev/null +++ b/cake/libs/model/i18n/translate.php @@ -0,0 +1,688 @@ + + * Copyright (c) 2005, Cake Software Foundation, Inc. + * 1785 E. Sahara Avenue, Suite 490-204 + * Las Vegas, Nevada 89104 + * + * Licensed under The MIT License + * Redistributions of files must retain the above copyright notice. + * + * @filesource + * @copyright Copyright (c) 2005, Cake Software Foundation, Inc. + * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project + * @package cake + * @subpackage cake.cake.libs.model.i18n + * @since CakePHP v 0.10.0.1554 + * @version $Revision$ + * @modifiedby $LastChangedBy$ + * @lastmodified $Date$ + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + */ + +/** + * Short description for file. + * + * Long description for file + * + * @package cake + * @subpackage cake.cake.libs.model.i18n + * @since CakePHP v 0.10.0.1554 + * + */ +class Translate extends Model +{ + var $locale = array('Afar' => 'aa', + 'Abkhazian' => 'ab', + 'Achinese' => 'ace', + 'Acoli' => 'ach', + 'Adangme' => 'ada', + 'Adyghe; Adygei' => 'ady', + 'Avestan' => 'ae', + 'Afrikaans' => 'af', + 'Afro-Asiatic (Other)' => 'afa', + 'Afrihili' => 'afh', + 'Ainu' => 'ain', + 'Akan' => 'ak', + 'Akkadian' => 'akk', + 'Aleut' => 'ale', + 'Algonquian Languages' => 'alg', + 'Southern Altai' => 'alt', + 'Amharic' => 'am', + 'Aragonese' => 'an', + 'English Old' => 'ang', + 'Apache languages' => 'apa', + 'Arabic' => 'ar', + 'Arabic (U.A.E.)' => 'ar-ae', + 'Arabic (Bahrain)' => 'ar-bh', + 'Arabic (Algeria)' => 'ar-dz', + 'Arabic (Egypt)' => 'ar-eg', + 'Arabic (Iraq)' => 'ar-iq', + 'Arabic (Jordan)' => 'ar-jo', + 'Arabic (Kuwait)' => 'ar-kw', + 'Arabic (Lebanon)' => 'ar-lb', + 'Arabic (Libya)' => 'ar-ly', + 'Arabic (Morocco)' => 'ar-ma', + 'Arabic (Oman)' => 'ar-om', + 'Arabic (Qatar)' => 'ar-qa', + 'Arabic (Saudi Arabia)' => 'ar-sa', + 'Arabic (Syria)' => 'ar-sy', + 'Arabic (Tunisia)' => 'ar-tn', + 'Arabic (Yemen)' => 'ar-ye', + 'Aramaic' => 'arc', + 'Araucanian' => 'arn', + 'Arapaho' => 'arp', + 'Arawak' => 'arw', + 'Assamese' => 'as', + 'Asturian' => 'ast', + 'Athapascan languages' => 'ath', + 'Australian languages' => 'aus', + 'Avaric' => 'av', + 'Awadhi' => 'awa', + 'Aymara' => 'ay', + 'Azerbaijani' => 'az', + 'Bashkir' => 'ba', + 'Banda' => 'bad', + 'Bamileke languages' => 'bai', + 'Baluchi' => 'bal', + 'Bambara' => 'bam', + 'Balinese' => 'ban', + 'Basa' => 'bas', + 'Baltic (Other)' => 'bat', + 'Belarusian' => 'be', + 'Beja' => 'bej', + 'Belarusian' => 'bel', + 'Bemba' => 'bem', + 'Bengali' => 'ben', + 'Berber (Other)' => 'ber', + 'Bulgarian' => 'bg', + 'Bihari' => 'bh', + 'Bhojpuri' => 'bho', + 'Bislama' => 'bi', + 'Bihari' => 'bih', + 'Bikol' => 'bik', + 'Bini' => 'bin', + 'Bislama' => 'bis', + 'Siksika' => 'bla', + 'Bambara' => 'bm', + 'Bengali' => 'bn', + 'Bantu (Other)' => 'bnt', + 'Tibetan' => 'bo', + 'Breton' => 'br', + 'Braj' => 'bra', + 'Bosnian' => 'bs', + 'Batak (Indonesia)' => 'btk', + 'Buriat' => 'bua', + 'Buginese' => 'bug', + 'Blin; Bilin' => 'byn', + 'Catalan' => 'ca', + 'Caddo' => 'cad', + 'Central American Indian (Other)' => 'cai', + 'Carib' => 'car', + 'Caucasian (Other)' => 'cau', + 'Chechen' => 'ce', + 'Cebuano' => 'ceb', + 'Celtic (Other)' => 'cel', + 'Chamorro' => 'ch', + 'Chamorro' => 'cha', + 'Chibcha' => 'chb', + 'Chagatai' => 'chg', + 'Chuukese' => 'chk', + 'Mari' => 'chm', + 'Chinook jargon' => 'chn', + 'Choctaw' => 'cho', + 'Chipewyan' => 'chp', + 'Cherokee' => 'chr', + 'Cheyenne' => 'chy', + 'Chamic languages' => 'cmc', + 'Corsican' => 'co', + 'Coptic' => 'cop', + 'Creoles and pidgins English based (Other)' => 'cpe', + 'Creoles and pidgins French-based (Other)' => 'cpf', + 'Creoles and pidgins' => 'cpp', + 'Cree' => 'cr', + 'Crimean Tatar; Crimean Turkish' => 'crh', + 'Creoles and pidgins (Other)' => 'crp', + 'Czech' => 'cs', + 'Kashubian' => 'csb', + 'Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic' => 'cu', + 'Cushitic (Other)' => 'cus', + 'Chuvash' => 'cv', + 'Welsh' => 'cy', + 'Danish' => 'da', + 'Dakota' => 'dak', + 'Dargwa' => 'dar', + 'Dayak' => 'day', + 'German (Germany)' => 'de', + 'German (Austria)' => 'de-at', + 'German (Switzerland)' => 'de-ch', + 'German (Germany)' => 'de-de', + 'German (Liechtenstein)' => 'de-li', + 'German (luxembourg)' => 'de-lu', + 'Delaware' => 'del', + 'Slave (Athapascan)' => 'den', + 'Dogrib' => 'dgr', + 'Dinka' => 'din', + 'Dogri' => 'doi', + 'Dravidian (Other)' => 'dra', + 'Lower Sorbian' => 'dsb', + 'Duala' => 'dua', + 'Dutch Middle' => 'dum', + 'Divehi' => 'dv', + 'Dyula' => 'dyu', + 'Dzongkha' => 'dz', + 'Dzongkha' => 'dzo', + 'Ewe' => 'ee', + 'Efik' => 'efi', + 'Egyptian (Ancient)' => 'egy', + 'Ekajuk' => 'eka', + 'Greek' => 'el', + 'Elamite' => 'elx', + 'English' => 'en', + 'English (Australia)' => 'en-au', + 'English (Belize)' => 'en-bz', + 'English (Canada)' => 'en-ca', + 'English (United Kingdom)' => 'en-gb', + 'English (Ireland)' => 'en-ie', + 'English (Jamaica)' => 'en-jm', + 'English (New Zealand)' => 'en-nz', + 'English (Philippines)' => 'en-ph', + 'English (Trinidad)' => 'en-tt', + 'English (United States)' => 'en-us', + 'English (South Africa)' => 'en-za', + 'English (Zimbabwe)' => 'en-zw', + 'English Middle' => 'enm', + 'Esperanto' => 'eo', + 'Spanish (Spain)' => 'es', + 'Spanish (Argentina)' => 'es-ar', + 'Spanish (Bolivia)' => 'es-bo', + 'Spanish (Chile)' => 'es-cl', + 'Spanish (Colombia)' => 'es-co', + 'Spanish (Costa Rica)' => 'es-cr', + 'Spanish (Dominican Republic)' => 'es-do', + 'Spanish (Ecuador)' => 'es-ec', + 'Spanish (Guatemala)' => 'es-gt', + 'Spanish (Honduras)' => 'es-hn', + 'Spanish (Mexico)' => 'es-mx', + 'Spanish (Nicaragua)' => 'es-ni', + 'Spanish (Panama)' => 'es-pa', + 'Spanish (Peru)' => 'es-pe', + 'Spanish (Puerto Rico)' => 'es-pr', + 'Spanish (Paraguay)' => 'es-py', + 'Spanish (El Salvador)' => 'es-sv', + 'Spanish (United States)' => 'es-us', + 'Spanish (Uruguay)' => 'es-uy', + 'Spanish (Venezuela)' => 'es-ve', + 'Estonian' => 'et', + 'Basque' => 'eu', + 'Ewondo' => 'ewo', + 'Persian' => 'fa', + 'Fang' => 'fan', + 'Fanti' => 'fat', + 'Fulah' => 'ff', + 'Finnish' => 'fi', + 'Filipino; Pilipino' => 'fil', + 'Finno-Ugrian (Other)' => 'fiu', + 'Fijian' => 'fj', + 'Faeroese' => 'fo', + 'Fon' => 'fon', + 'French (France)' => 'fr', + 'French (Belgium)' => 'fr-be', + 'French (Canada)' => 'fr-ca', + 'French (Switzerland)' => 'fr-ch', + 'French (Luxembourg)' => 'fr-lu', + 'French (Monaco)' => 'fr-mc', + 'French Middle' => 'frm', + 'French Old' => 'fro', + 'Friulian' => 'fur', + 'Frisian' => 'fy', + 'Irish' => 'ga', + 'Ga' => 'gaa', + 'Gayo' => 'gay', + 'Gbaya' => 'gba', + 'Gaelic Hiberno-Scottish' => 'gd', + 'Germanic (Other)' => 'gem', + 'Geez' => 'gez', + 'Gilbertese' => 'gil', + 'Galician' => 'gl', + 'German Middle High' => 'gmh', + 'Guarani' => 'gn', + 'German Old High' => 'goh', + 'Gondi' => 'gon', + 'Gorontalo' => 'gor', + 'Gothic' => 'got', + 'Grebo' => 'grb', + 'Greek Ancient' => 'grc', + 'Greek Modern' => 'gre', + 'Gujarati' => 'gu', + 'Manx' => 'gv', + 'Gwich´in' => 'gwi', + 'Hausa' => 'ha', + 'Haida' => 'hai', + 'Hawaiian' => 'haw', + 'Hebrew' => 'he', + 'Hindi' => 'hi', + 'Hiligaynon' => 'hil', + 'Himachali' => 'him', + 'Hmong' => 'hmn', + 'Hiri Motu' => 'ho', + 'Croatian' => 'hr', + 'Upper Sorbian' => 'hsb', + 'Haitian; Haitian Creole' => 'ht', + 'Hungarian' => 'hu', + 'Hupa' => 'hup', + 'Armenian' => 'hy', + 'Herero' => 'hz', + 'Interlingua (International Auxiliary Language Association)' => 'ia', + 'Iban' => 'iba', + 'Igbo' => 'ibo', + 'Indonesian' => 'id', + 'Interlingue' => 'ie', + 'Igbo' => 'ig', + 'Sichuan Yi' => 'ii', + 'Ijo' => 'ijo', + 'Inupiaq' => 'ik', + 'Inuktitut' => 'iku', + 'Interlingue' => 'ile', + 'Iloko' => 'ilo', + 'Indic (Other)' => 'inc', + 'Indonesian' => 'ind', + 'Indo-European (Other)' => 'ine', + 'Ingush' => 'inh', + 'Ido' => 'io', + 'Inupiaq' => 'ipk', + 'Iranian (Other)' => 'ira', + 'Iroquoian languages' => 'iro', + 'Icelandic' => 'is', + 'Italian (Italy)' => 'it', + 'Italian (Switzerland)' => 'it-ch', + 'Italian' => 'ita', + 'Inuktitut' => 'iu', + 'Japanese' => 'ja', + 'Javanese' => 'jav', + 'Lojban' => 'jbo', + 'Japanese' => 'jpn', + 'Judeo-Arabic' => 'jrb', + 'Javanese' => 'jv', + 'Georgian' => 'ka', + 'Kara-Kalpak' => 'kaa', + 'Kabyle' => 'kab', + 'Kachin' => 'kac', + 'Kalaallisut; Greenlandic' => 'kal', + 'Kamba' => 'kam', + 'Kannada' => 'kan', + 'Karen' => 'kar', + 'Kashmiri' => 'kas', + 'Kanuri' => 'kau', + 'Kawi' => 'kaw', + 'Kazakh' => 'kaz', + 'Kabardian' => 'kbd', + 'Kongo' => 'kg', + 'Khasi' => 'kha', + 'Khoisan (Other)' => 'khi', + 'Khmer' => 'khm', + 'Khotanese' => 'kho', + 'Kikuyu; Gikuyu' => 'ki', + 'Kikuyu; Gikuyu' => 'kik', + 'Kinyarwanda' => 'kin', + 'Kirghiz' => 'kir', + 'Kazakh' => 'kk', + 'Kalaallisut; Greenlandic' => 'kl', + 'Khmer' => 'km', + 'Kimbundu' => 'kmb', + 'Kannada' => 'kn', + 'Korean' => 'ko', + 'Korea (North) Dem. Rep' => 'ko-kp', + 'Korea (South)' => 'ko-kr', + 'Russian' => 'koi8-r', + 'Konkani' => 'kok', + 'Komi' => 'kom', + 'Kongo' => 'kon', + 'Kosraean' => 'kos', + 'Kpelle' => 'kpe', + 'Kanuri' => 'kr', + 'Karachay-Balkar' => 'krc', + 'Kru' => 'kro', + 'Kurukh' => 'kru', + 'Kashmiri' => 'ks', + 'Kurdish' => 'ku', + 'Kuanyama; Kwanyama' => 'kua', + 'Kumyk' => 'kum', + 'Kutenai' => 'kut', + 'Komi' => 'kv', + 'Cornish' => 'kw', + 'Kirghiz' => 'ky', + 'Latin' => 'la', + 'Ladino' => 'lad', + 'Lahnda' => 'lah', + 'Lamba' => 'lam', + 'Latin' => 'lat', + 'Latvian' => 'lav', + 'Luxembourgish; Letzeburgesch' => 'lb', + 'Lezghian' => 'lez', + 'Ganda' => 'lg', + 'Limburgan; Limburger; Limburgish' => 'li', + 'Limburgan; Limburger; Limburgish' => 'lim', + 'Lingala' => 'lin', + 'Lingala' => 'ln', + 'Lao' => 'lo', + 'Mongo' => 'lol', + 'Lozi' => 'loz', + 'Lithuanian' => 'lt', + 'Luxembourgish; Letzeburgesch' => 'ltz', + 'Luba-Katanga' => 'lu', + 'Luba-Lulua' => 'lua', + 'Luba-Katanga' => 'lub', + 'Ganda' => 'lug', + 'Luiseno' => 'lui', + 'Lunda' => 'lun', + 'Luo (Kenya and Tanzania)' => 'luo', + 'Lushai' => 'lus', + 'Latvian' => 'lv', + 'Madurese' => 'mad', + 'Magahi' => 'mag', + 'Marshallese' => 'mah', + 'Maithili' => 'mai', + 'Makasar' => 'mak', + 'Malayalam' => 'mal', + 'Mandingo' => 'man', + 'Austronesian (Other)' => 'map', + 'Marathi' => 'mar', + 'Masai' => 'mas', + 'Moksha' => 'mdf', + 'Mandar' => 'mdr', + 'Mende' => 'men', + 'Malagasy' => 'mg', + 'Irish Middle' => 'mga', + 'Marshallese' => 'mh', + 'Maori' => 'mi', + 'Micmac' => 'mic', + 'Minangkabau' => 'min', + 'FYRO Macedonian' => 'mk', + 'Macedonian' => 'mk-mk', + 'Mon-Khmer (Other)' => 'mkh', + 'Malayalam' => 'ml', + 'Malagasy' => 'mlg', + 'Maltese' => 'mlt', + 'Mongolian' => 'mn', + 'Manchu' => 'mnc', + 'Manipuri' => 'mni', + 'Manobo languages' => 'mno', + 'Moldavian' => 'mo', + 'Mohawk' => 'moh', + 'Moldavian' => 'mol', + 'Mongolian' => 'mon', + 'Mossi' => 'mos', + 'Marathi' => 'mr', + 'Malay' => 'ms', + 'Maltese' => 'mt', + 'Munda languages' => 'mun', + 'Creek' => 'mus', + 'Mirandese' => 'mwl', + 'Marwari' => 'mwr', + 'Burmese' => 'my', + 'Mayan languages' => 'myn', + 'Erzya' => 'myv', + 'Nauru' => 'na', + 'Nahuatl' => 'nah', + 'North American Indian' => 'nai', + 'Neapolitan' => 'nap', + 'Nauru' => 'nau', + 'Navajo; Navaho' => 'nav', + 'Norwegian (Bokmal)' => 'nb', + 'Ndebele South; South Ndebele' => 'nbl', + 'North Ndebele' => 'nd', + 'Ndebele North; North Ndebele' => 'nde', + 'Ndonga' => 'ndo', + 'Low German; Low Saxon;' => 'nds', + 'Nepali (India)' => 'ne', + 'Nepali' => 'nep', + 'Newari; Nepal Bhasa' => 'new', + 'Ndonga' => 'ng', + 'Nias' => 'nia', + 'Niger-Kordofanian (Other)' => 'nic', + 'Niuean' => 'niu', + 'Dutch (Netherlands)' => 'nl', + 'Dutch (Belgium)' => 'nl-be', + 'Norwegian (Nynorsk)' => 'nn', + 'Norwegian Nynorsk; Nynorsk Norwegian' => 'nno', + 'Norwegian Bokmċl' => 'no', + 'Norwegian Bokmċl; Bokmċl Norwegian' => 'nob', + 'Nogai' => 'nog', + 'Norse Old' => 'non', + 'Norwegian' => 'nor', + 'South Ndebele' => 'nr', + 'Northern Sotho; Pedi; Sepedi' => 'nso', + 'Nubian languages' => 'nub', + 'Navajo; Navaho' => 'nv', + 'Classical Newari; Old Newari; Classical Nepal Bhasa' => 'nwc', + 'Chichewa; Chewa; Nyanja' => 'ny', + 'Chichewa; Chewa; Nyanja' => 'nya', + 'Nyamwezi' => 'nym', + 'Nyankole' => 'nyn', + 'Nyoro' => 'nyo', + 'Nzima' => 'nzi', + 'Occitan (post 1500); Provençal' => 'oc', + 'Occitan; Provençal' => 'oci', + 'Ojibwa' => 'oj', + 'Ojibwa' => 'oji', + 'Oromo' => 'om', + 'Oriya' => 'or', + 'Oriya' => 'ori', + 'Oromo' => 'orm', + 'Ossetian; Ossetic' => 'os', + 'Osage' => 'osa', + 'Ossetian; Ossetic' => 'oss', + 'Turkish Ottoman' => 'ota', + 'Otomian languages' => 'oto', + 'Panjabi; Punjabi' => 'pa', + 'Punjabi (India)' => 'pa-in', + 'Punjabi (Pakistan)' => 'pa-pk', + 'Papuan (Other)' => 'paa', + 'Pangasinan' => 'pag', + 'Pahlavi' => 'pal', + 'Pampanga' => 'pam', + 'Panjabi; Punjabi' => 'pan', + 'Papiamento' => 'pap', + 'Palauan' => 'pau', + 'Persian Old' => 'peo', + 'Philippine (Other)' => 'phi', + 'Phoenician' => 'phn', + 'Pali' => 'pi', + 'Polish' => 'pl', + 'Pali' => 'pli', + 'Polish' => 'pol', + 'Pohnpeian' => 'pon', + 'Portuguese' => 'por', + 'Prakrit languages' => 'pra', + 'Provençal Old' => 'pro', + 'Pushto' => 'ps', + 'Portuguese (Portugal)' => 'pt', + 'Portuguese (Brazil)' => 'pt-br', + 'Pushto' => 'pus', + 'Quechua' => 'qu', + 'Quechua' => 'que', + 'Rajasthani' => 'raj', + 'Rapanui' => 'rap', + 'Rarotongan' => 'rar', + 'Raeto-Romance' => 'rm', + 'Rundi' => 'rn', + 'Romanian' => 'ro', + 'Romanian (Moldova)' => 'ro-md', + 'Romance (Other)' => 'roa', + 'Raeto-Romance' => 'roh', + 'Romany' => 'rom', + 'Russian' => 'ru', + 'Russian (Moldova)' => 'ru-md', + 'Aromanian' => 'rup', + 'Sanskrit' => 'sa', + 'Sandawe' => 'sad', + 'Yakut' => 'sah', + 'South American Indian (Other)' => 'sai', + 'Salishan languages' => 'sal', + 'Samaritan Aramaic' => 'sam', + 'Sasak' => 'sas', + 'Santali' => 'sat', + 'Sardinian' => 'sc', + 'Sicilian' => 'scn', + 'Scots' => 'sco', + 'Sindhi' => 'sd', + 'Northern Sami' => 'se', + 'Selkup' => 'sel', + 'Semitic (Other)' => 'sem', + 'Sango' => 'sg', + 'Irish Old' => 'sga', + 'Shan' => 'shn', + 'Sinhala; Sinhalese' => 'si', + 'Sidamo' => 'sid', + 'Siouan languages' => 'sio', + 'Sino-Tibetan (Other)' => 'sit', + 'Slovak' => 'sk', + 'Slovenian' => 'sl', + 'Slavic (Other)' => 'sla', + 'Samoan' => 'sm', + 'Southern Sami' => 'sma', + 'Sami languages (Other)' => 'smi', + 'Lule Sami' => 'smj', + 'Inari Sami' => 'smn', + 'Skolt Sami' => 'sms', + 'Shona' => 'sn', + 'Soninke' => 'snk', + 'Somali' => 'so', + 'Sogdian' => 'sog', + 'Songhai' => 'son', + 'Albanian' => 'sq', + 'Serbian' => 'sr', + 'Serer' => 'srr', + 'Swati' => 'ss', + 'Nilo-Saharan (Other)' => 'ssa', + 'Southern Sotho' => 'st', + 'Sundanese' => 'su', + 'Sukuma' => 'suk', + 'Susu' => 'sus', + 'Sumerian' => 'sux', + 'Swedish' => 'sv', + 'Swedish (Finland)' => 'sv-fi', + 'Swahili' => 'sw', + 'Swahili' => 'swa', + 'Swedish' => 'swe', + 'Syriac' => 'syr', + 'Tamil' => 'ta', + 'Tai (Other)' => 'tai', + 'Telugu' => 'te', + 'Timne' => 'tem', + 'Tereno' => 'ter', + 'Tetum' => 'tet', + 'Tajik' => 'tg', + 'Thai' => 'th', + 'Tigre' => 'tig', + 'Tigrinya|' => 'tir', + 'Tiv' => 'tiv', + 'Turkmen' => 'tk', + 'Tokelau' => 'tkl', + 'Tagalog' => 'tl', + 'Klingon; tlhIngan-Hol' => 'tlh', + 'Tlingit' => 'tli', + 'Tamashek' => 'tmh', + 'Tswana' => 'tn', + 'Tonga (Tonga Islands)' => 'to', + 'Tonga (Nyasa)' => 'tog', + 'Tok Pisin' => 'tpi', + 'Turkish' => 'tr', + 'Tsonga' => 'ts', + 'Tsimshian' => 'tsi', + 'Tatar' => 'tt', + 'Tumbuka' => 'tum', + 'Tupi languages' => 'tup', + 'Altaic (Other)' => 'tut', + 'Tuvalu' => 'tvl', + 'Twi' => 'tw', + 'Tahitian' => 'ty', + 'Tuvinian' => 'tyv', + 'Udmurt' => 'udm', + 'Uighur; Uyghur' => 'ug', + 'Ugaritic' => 'uga', + 'Ukrainian' => 'uk', + 'Umbundu' => 'umb', + 'Urdu' => 'ur', + 'English (United States)' => 'us', + 'Uzbek' => 'uz', + 'Vai' => 'vai', + 'Venda' => 've', + 'Vietnamese' => 'vi', + 'Volapük' => 'vo', + 'Votic' => 'vot', + 'Walloon' => 'wa', + 'Wakashan languages' => 'wak', + 'Walamo' => 'wal', + 'Waray' => 'war', + 'Washo' => 'was', + 'Sorbian languages' => 'wen', + 'Wolof' => 'wo', + 'Kalmyk' => 'xal', + 'Xhosa' => 'xh', + 'Yao' => 'yao', + 'Yapese' => 'yap', + 'Yiddish' => 'yi', + 'Yoruba' => 'yo', + 'Yupik languages' => 'ypk', + 'Zhuang; Chuang' => 'za', + 'Zapotec' => 'zap', + 'Zenaga' => 'zen', + 'Chinese' => 'zh', + 'Chinese (China)' => 'zh-cn', + 'Chinese (Hong Kong SAR)' => 'zh-hk', + 'Chinese (Macau SAR)' => 'zh-mo', + 'Chinese (Singapore)' => 'zh-sg', + 'Chinese (Taiwan)' => 'zh-tw', + 'Zande' => 'znd', + 'Zulu' => 'zu', + 'Zuni' => 'zun'); + + + function read ($id = null, $fields = null) + { + $result = parent::read($id, $fields); + } + + function field ($name, $conditions = null, $order = null) + { + $result = parent::field ($name, $conditions, $order); + } + + function saveField($name, $value, $validate = false) + { + $result = parent::saveField($name, $value, $validate ); + } + + function save ($data=null, $validate=true) + { + $result = parent::save ($data, $validate); + } + + function del ($id = null) + { + $result = parent::del($id); + } + + function find ($conditions = null, $fields = null, $order = null, $recursive = 1) + { + $result = parent::find($conditions , $fields , $order , $recursive); + } + + function findAll ($conditions = null, $fields = null, $order = null, $limit = 50, $page = 1, $recursive = 1) + { + $result = parent::findAll($conditions , $fields , $order , $limit , $page , $recursive); + } + +} + +?> \ No newline at end of file diff --git a/cake/libs/validation.php b/cake/libs/validation.php new file mode 100644 index 000000000..66fe89516 --- /dev/null +++ b/cake/libs/validation.php @@ -0,0 +1,504 @@ + + * Copyright (c) 2005, Cake Software Foundation, Inc. + * 1785 E. Sahara Avenue, Suite 490-204 + * Las Vegas, Nevada 89104 + * + * Licensed under The MIT License + * Redistributions of files must retain the above copyright notice. + * + * @filesource + * @copyright Copyright (c) 2005, Cake Software Foundation, Inc. + * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project + * @package cake + * @subpackage cake.cake.libs + * @since CakePHP v 0.10.3.1343 + * @version $Revision$ + * @modifiedby $LastChangedBy$ + * @lastmodified $Date$ + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + */ + +/** + * Short description for file. + * + * Long description for file + * + * @package cake + * @subpackage cake.cake.libs + * @since CakePHP v 0.10.3.1343 + */ + +class Validation //extends Object +{ +/** + * Enter description here... + * + * @var unknown_type + */ + var $check = null; +/** + * Enter description here... + * + * @var unknown_type + */ + var $regex = null; +/** + * Enter description here... + * + * @var unknown_type + */ + var $country = null; +/** + * Enter description here... + * + * @var unknown_type + */ + var $deep = null; +/** + * Enter description here... + * + * @var unknown_type + */ + var $type = null; + +/** + * Enter description here... + * + * @var unknown_type + */ + var $errors = array(); + + function __construct() + { + //parent::__construct(); + } + + function alphaNumeric($check) + { + } + + function between($check, $min, $max) + { + $length = strlen($check); + if ($length >= $min && $length <= $max) + { + return true; + } + else + { + return false; + } + } +/** + * Returns false if field is left blank -OR- only whitespace characters are present in it's value + * Whitespace characters include Space, Tab, Carriage Return, Newline, Formfeed + * + * @param array or string $check + * @return boolean + */ + function blank($check) + { + if (is_array($check)) + { + $this->_extract($check); + $this->regex = '/\\S*/'; + } + else + { + $this->check = $check; + $this->regex = '/\\S*/'; + } + return $this->_check(); + } + + function cc($check, $regex = null, $type = 'fast') + { + $this->type = $type; + + if (is_array($check)) + { + $this->_extract($check); + } + else + { + $this->check = $check; + } + + if(isset($this->regex)) + { + return $this->_check(); + } + + + $cards = array('all' => array('visa' => '/^4\\d{12}(\\d{3})?$/', + 'mc' => '/^5[1-5]\\d{14}$/', + 'disc' => '/^6011\\d{12}$/', + 'amex' => '/^3[4|7]\\d{13}$/', + 'diners' => '/^3[0|6|8]\\d{12}$/', + 'enroute' => '/^2[014|149]\\d{11}$/', + 'jcb' => '/^3[088|096|112|158|337|528]\\d{12}$/', + 'switch' => '/^(49030[2-9]|49033[5-9]|49110[1-2]|4911(7[4-9]|8[1-2])|4936[0-9]{2}|564182|6333[0-4][0-9]|6759[0-9]{2})\\d{10}(\\d{2,3})?$/', + 'delta' => '/^4(1373[3-7]|462[0-9]{2}|5397[8|9]|54313|5443[2-5]|54742|567(2[5-9]|3[0-9]|4[0-5])|658[3-7][0-9]|659(0[1-9]|[1-4][0-9]|50)|844[09|10]|909[6-7][0-9]|9218[1|2]|98824)\\d{10}$/', + 'solo' => '/^(6334[5-9][0-9]|6767[0-9]{2})\\d{10}(\\d{2,3})?$/'), + 'fast' => '/^(6334[5-9][0-9]|6767[0-9]{2})\\d{10}(\\d{2,3})?$/'); + + if (is_array($this->type)) + { + foreach ($this->type as $key => $value) + { + $card = low($key); + $this->regex = $cards['all'][$card]; + if($this->_check()) + { + return true; + } + } + } + else + { + if($this->type == 'all') + { + foreach ($cards['all'] as $key => $value) + { + $this->regex = $value; + if($this->_check()) + { + return true; + } + } + } + else + { + $this->regex = $cards['fast']; + return $this->_check(); + } + } + } + + function comparison($check1, $operator = null, $check2 = null) + { + $return = false; + + if (is_array($check1)) + { + extract($params, EXTR_OVERWRITE); + } + + switch($operator) + { + case 'is greater': + if($check1 > $check2) + { + $return = true; + } + break; + case 'is less': + if($check1 < $check2) + { + $return = true; + } + break; + case 'greater or equal': + if($check1 >= $check2) + { + $return = true; + } + break; + case 'less or equal': + if($check1 > $check2) + { + $return = true; + } + break; + case 'equal to': + if($check1 == $check2) + { + $return = true; + } + break; + case 'not equal': + if($check1 != $check2) + { + $return = true; + } + break; + } + return $return; + } + + function custom($check, $regex = null) + { + if (is_array($check)) + { + $this->_extract($check); + } + else + { + $this->check = $check; + $this->regex = $regex; + } + return $this->_check(); + } + + function date($check) + { + } + + function decimal($check, $type, $regex= null) + { + //Validates a simple decimal format + //Validate a complex decimal format. + } + + function email($check, $regex= null, $deep = false) + { + if (is_array($check)) + { + $this->_extract($check); + } + else + { + $this->check = $check; + $this->regex = $regex; + $this->deep = $deep; + } + + if(is_null($this->regex)) + { + $this->regex = '/\\A(?:^([a-z0-9][a-z0-9_\\-\\.\\+]*)@([a-z0-9][a-z0-9\\.\\-]{0,63}\\.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)\\z/i'; + } + + if($this->_check() && $this->deep) + { + if (preg_match('/@([a-z0-9][a-z0-9\\.\\-]{0,63}\\.([a-z]*))/', $check, $regs)) + { + $host = gethostbynamel($regs[1]); + if (is_array($host)) + { + $this->error[] = false; + return true; + } + else + { + $this->error[] = true; + return false; + } + } + } + } + + function equalTo($check, $comparedTo) + { + } + + function file($check) + { + } + + function ip($check) + { + } + + function minLength($check, $min) + { + $length = strlen($check); + } + + function maxLength($check, $max) + { + $length = strlen($check); + } + + function money($check, $symbolPosition = 'left') + { + $this->check = $check; + switch ($symbolPosition) + { + case 'left': + $this->regex = '/^(?!\\u00a2)\\p{Sc}?(?!0,?\\d)(?:\\d{1,3}(?:([, .])\\d{3})?(?:\\1\\d{3})*|(?:\\d+))((?!\\1)[,.]\\d{2})?$/'; + break; + case 'right': + $this->regex = '/^(?!0,?\\d)(?:\\d{1,3}(?:([, .])\\d{3})?(?:\\1\\d{3})*|(?:\\d+))((?!\\1)[,.]\\d{2})?(?_check(); + + + } + + function multiple($check, $type, $regex= null) + { + //Validate a select object for a selected index past 0. + //Validate a select against a list of restriced indexes. + //Validate a multiple-select for the quantity selected. + } + + function number($check, $lower = null, $upper = null ) + { + if (isset($lower) && isset($upper) && $lower > $upper) + { + //error + } + if(is_float($check)) + { + + } + } + + function numeric($check) + { + return is_numeric($check); + } + + function phone($check, $regex= null, $country = 'all') + { + if (is_array($check)) + { + $this->_extract($check); + } + else + { + $this->check = $check; + $this->regex = $regex; + $this->country = $country; + } + + + + if(is_null($this->regex)) + { + switch ($this->country) + { + case 'us': + $this->regex = '/1?[-. ]?\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})/'; + break; + } + } + return $this->_check(); + } + + function postal($check, $regex= null, $country = null) + { + if (is_array($check)) + { + $this->_extract($check); + } + else + { + $this->check = $check; + $this->regex = $regex; + $this->country = $country; + } + + if(is_null($this->regex)) + { + switch ($this->country) + { + case 'us': + $this->regex = '/\\A\\b[0-9]{5}(?:-[0-9]{4})?\\b\\z/i'; + break; + case 'uk': + $this->regex = '/\\A\\b[A-Z]{1,2}[0-9][A-Z0-9]? [0-9][ABD-HJLNP-UW-Z]{2}\\b\\z/i'; + break; + case 'ca': + $this->regex = '/\\A\\b[ABCEGHJKLMNPRSTVXY][0-9][A-Z] [0-9][A-Z][0-9]\\b\\z/i'; + break; + } + } + return $this->_check(); + } + + function ssn($check, $regex= null, $country = null) + { + if (is_array($check)) + { + $this->_extract($check); + } + else + { + $this->check = $check; + $this->regex = $regex; + $this->country = $country; + } + + if(is_null($this->regex)) + { + switch ($this->country) + { + case 'us': + $this->regex = '/\\A\\b[0-9]{3}-[0-9]{2}-[0-9]{4}\\b\\z/i'; + break; + case 'dk': + $this->regex = '/\\A\\b[0-9]{6}-[0-9]{4}\\b\\z/i'; + break; + case 'nl': + $this->regex = '/\\A\\b[0-9]{9}\\b\\z/i'; + break; + } + } + return $this->_check(); + } + + function url($check) + { + $this->check = $check; + $this->regex = '/\\A(?:(https?|ftps?|file|news|gopher):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:\/~\\+#]*[\\w\\-\\@?^=%&\/~\\+#])?)\\z/i'; + return $this->_check(); + } + + function userDefined($object, $method, $args) + { + return call_user_func_array(array(&$object, $method), $args); + } + + function _check() + { + if (preg_match($this->regex, $this->check)) + { + $this->error[] = false; + return true; + } + else + { + $this->error[] = true; + return false; + } + } + + function _extract($params) + { + extract($params, EXTR_OVERWRITE); + if (isset($check)) + { + $this->check = $check; + } + if (isset($regex)) + { + $this->regex = $regex; + } + if (isset($country)) + { + $this->country = strtolower($country); + } + if (isset($deep)) + { + $this->deep = $deep; + } + if (isset($type)) + { + $this->type = $type; + } + } +} + +?> \ No newline at end of file