locale_folder = dirname(__FILE__).'/locale'; } $this->loadDomain($lang, $domain); } /** * Load a domain file. * A domain file is a .lang file in the main locale folder of plume. * * @param string Language ('en') * @param string Domain, without the .lang ('pluf') * @return bool Success */ function loadDomain($lang='en', $domain='pluf') { if ('en' == $lang) { return true; } return $this->loadFile($this->locale_folder.$lang.'/'.$domain.'.lang'); } /** * Load a locale file * * @param string Complete path to the locale file * @return bool Success */ function loadFile($file) { if (!empty($GLOBALS['_PX_locale_files'][$file])) { return true; } if (!file_exists($file)) { return false; } if (!isset($GLOBALS['_PX_locale'])) { $GLOBALS['_PX_locale'] = array(); } // Load optimized file if available if ('' != Pluf::f('tmp_folder')) { $phpfile = Pluf::f('tmp_folder').'/Pluf_L10n-' .str_replace(DIRECTORY_SEPARATOR, '_', substr($file, 0, -5)) .'.php'; if (file_exists($phpfile) && (@filemtime($file) < @filemtime($phpfile))) { $l = include $phpfile; $GLOBALS['_PX_locale'] = array_merge($GLOBALS['_PX_locale'], $l); $GLOBALS['_PX_locale_files'][$file] = 'optimized'; return true; } } $lines = file($file); $count = count($lines); for ($i=1; $i<$count; $i++) { $tmp = (!empty($lines[$i+1])) ? trim($lines[$i+1]) : ''; if (!empty($tmp) && ';' == substr($lines[$i],0,1)) { $GLOBALS['_PX_locale'][trim(substr($lines[$i],1))] = $tmp; $i++; } } $GLOBALS['_PX_locale_files'][$file] = true; return true; } /** * Optimize a locale. Convert the .lang in a .php file * ready to be included. The optimized file is encoded * with the current encoding. * * @param string Locale file to optimize * @return bool Success */ function optimizeLocale($file) { if (!file_exists($file)) { return false; } $phpfile = Pluf::f('tmp_folder').'/Pluf_L10n-' .str_replace(DIRECTORY_SEPARATOR, '_', substr($file, 0, -5)) .'.php'; $lines = file($file); $out = ''; file_put_contents($phpfile, $out, LOCK_EX); @chmod($phpfile, 0777); return true; } /** * Get the available locales for a domain. * * @param string Domain ('') * @return array List of 2 letter iso codes */ function getAvailableLocales($domain='') { $rootdir = $this->locale_folder.'/'; $locales = array(); $locales[] = 'en'; //English is always available $current_dir = opendir($rootdir); if (!empty($domain)) { $domain .= '.lang'; } while($entryname = readdir($current_dir)) { if (is_dir($rootdir.$entryname.'/') and ($entryname != '.' and $entryname!='..') and (2 == strlen($entryname)) ) { $entryname = strtolower($entryname); if (empty($domain)) { $locales[] = $entryname; } elseif (is_file($rootdir.$entryname.'/'.$domain)) { $locales[] = $entryname; } } } closedir($current_dir); sort($locales); reset($locales); return $locales; } /** * Return the "best" accepted language from the list of available * languages. * * Use $_SERVER['HTTP_ACCEPT_LANGUAGE'] if the accepted language is empty * * @param array Available languages in the system * @param string String of comma separated accepted languages ('') * @return string Language 2 letter iso code, default is 'en' */ function getAcceptedLanguage($available, $accepted ='') { if (empty($accepted)) { if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $accepted = $_SERVER['HTTP_ACCEPT_LANGUAGE']; } else { return 'en'; } } $acceptedlist = explode(',', $accepted); foreach ($acceptedlist as $lang) { //for the fr-FR en-US cases $lang = strtolower(substr($lang, 0, 2)); if (in_array($lang, $available)) { return $lang; } } //no match found, English return 'en'; } /** * Returns iso codes. * * @param bool Is the language the key in the array (false) * @return array The key is either the language or the iso code */ function getIsoCodes($lang=false) { $res = array('aa' => 'Afar', 'ab' => 'Abkhazian', 'af' => 'Afrikaans', 'am' => 'Amharic', 'ar' => 'Arabic', 'as' => 'Assamese', 'ay' => 'Aymara', 'az' => 'Azerbaijani', 'ba' => 'Bashkir', 'be' => 'Byelorussian', 'bg' => 'Bulgarian', 'bh' => 'Bihari', 'bi' => 'Bislama', 'bn' => 'Bengali', 'bo' => 'Tibetan', 'br' => 'Breton', 'ca' => 'Catalan', 'co' => 'Corsican', 'cs' => 'Czech', 'cy' => 'Welsh', 'da' => 'Danish', 'de' => 'German', 'dz' => 'Bhutani', 'el' => 'Greek', 'en' => 'English', 'eo' => 'Esperanto', 'es' => 'Spanish', 'et' => 'Estonian', 'eu' => 'Basque', 'fa' => 'Persian', 'fi' => 'Finnish', 'fj' => 'Fiji', 'fo' => 'Faroese', 'fr' => 'French', 'fy' => 'Frisian', 'ga' => 'Irish', 'gd' => 'Scots gaelic', 'gl' => 'Galician', 'gn' => 'Guarani', 'gu' => 'Gujarati', 'ha' => 'Hausa', 'he' => 'Hebrew', 'hi' => 'Hindi', 'hr' => 'Croatian', 'hu' => 'Hungarian', 'hy' => 'Armenian', 'ia' => 'Interlingua', 'ie' => 'Interlingue', 'ik' => 'Inupiak', 'id' => 'Indonesian', 'is' => 'Icelandic', 'it' => 'Italian', 'iu' => 'Inuktitut', 'ja' => 'Japanese', 'jv' => 'Javanese', 'ka' => 'Georgian', 'kk' => 'Kazakh', 'kl' => 'Greenlandic', 'km' => 'Cambodian', 'kn' => 'Kannada', 'ko' => 'Korean', 'ks' => 'Kashmiri', 'ku' => 'Kurdish', 'ky' => 'Kirghiz', 'la' => 'Latin', 'ln' => 'Lingala', 'lo' => 'Laothian', 'lt' => 'Lithuanian', 'lv' => 'Latvian;lettish', 'mg' => 'Malagasy', 'mi' => 'Maori', 'mk' => 'Macedonian', 'ml' => 'Malayalam', 'mn' => 'Mongolian', 'mo' => 'Moldavian', 'mr' => 'Marathi', 'ms' => 'Malay', 'mt' => 'Maltese', 'my' => 'Burmese', 'na' => 'Nauru', 'ne' => 'Nepali', 'nl' => 'Dutch', 'no' => 'Norwegian', 'oc' => 'Occitan', 'om' => 'Afan (oromo)', 'or' => 'Oriya', 'pa' => 'Punjabi', 'pl' => 'Polish', 'ps' => 'Pashto;pushto', 'pt' => 'Portuguese', 'qu' => 'Quechua', 'rm' => 'Rhaeto-romance', 'rn' => 'Kurundi', 'ro' => 'Romanian', 'ru' => 'Russian', 'rw' => 'Kinyarwanda', 'sa' => 'Sanskrit', 'sd' => 'Sindhi', 'sg' => 'Sangho', 'sh' => 'Serbo-croatian', 'si' => 'Singhalese', 'sk' => 'Slovak', 'sl' => 'Slovenian', 'sm' => 'Samoan', 'sn' => 'Shona', 'so' => 'Somali', 'sq' => 'Albanian', 'sr' => 'Serbian', 'ss' => 'Siswati', 'st' => 'Sesotho', 'su' => 'Sundanese', 'sv' => 'Swedish', 'sw' => 'Swahili', 'ta' => 'Tamil', 'te' => 'Telugu', 'tg' => 'Tajik', 'th' => 'Thai', 'ti' => 'Tigrinya', 'tk' => 'Turkmen', 'tl' => 'Tagalog', 'tn' => 'Setswana', 'to' => 'Tonga', 'tr' => 'Turkish', 'ts' => 'Tsonga', 'tt' => 'Tatar', 'tw' => 'Twi', 'ug' => 'Uigur', 'uk' => 'Ukrainian', 'ur' => 'Urdu', 'uz' => 'Uzbek', 'vi' => 'Vietnamese', 'vo' => 'Volapuk', 'wo' => 'Wolof', 'xh' => 'Xhosa', 'yi' => 'Yiddish', 'yo' => 'Yoruba', 'za' => 'Zhuang', 'zh' => 'Chinese', 'zu' => 'Zulu'); if ($lang) { $res = array_flip($res); ksort($res); //order by lang } return $res; } /** * Get the country codes. * * @param Indexed by code (false) * @return array English name indexed country code or reverse */ public static function getCountryCodes($idx_by_code=false) { $ctr = array( 'Andorra' => 'AD', 'United Arab Emirates' => 'AE', 'Afghanistan' => 'AF', 'Antigua & Barbuda' => 'AG', 'Anguilla' => 'AI', 'Albania' => 'AL', 'Armenia' => 'AM', 'Netherlands Antilles' => 'AN', 'Angola' => 'AO', 'Antarctica' => 'AQ', 'Argentina' => 'AR', 'American Samoa' => 'AS', 'Austria' => 'AT', 'Australia' => 'AU', 'Aruba' => 'AW', 'Azerbaijan' => 'AZ', 'Bosnia and Herzegovina' => 'BA', 'Barbados' => 'BB', 'Bangladesh' => 'BD', 'Belgium' => 'BE', 'Burkina Faso' => 'BF', 'Bulgaria' => 'BG', 'Bahrain' => 'BH', 'Burundi' => 'BI', 'Benin' => 'BJ', 'Bermuda' => 'BM', 'Brunei Darussalam' => 'BN', 'Bolivia' => 'BO', 'Brazil' => 'BR', 'Bahama' => 'BS', 'Bhutan' => 'BT', 'Bouvet Island' => 'BV', 'Botswana' => 'BW', 'Belarus' => 'BY', 'Belize' => 'BZ', 'Canada' => 'CA', 'Cocos (Keeling) Islands' => 'CC', 'Central African Republic' => 'CF', 'Congo' => 'CG', 'Switzerland' => 'CH', 'Côte D\'ivoire (Ivory Coast)' => 'CI', 'Cook Iislands' => 'CK', 'Chile' => 'CL', 'Cameroon' => 'CM', 'China' => 'CN', 'Colombia' => 'CO', 'Costa Rica' => 'CR', 'Cuba' => 'CU', 'Cape Verde' => 'CV', 'Christmas Island' => 'CX', 'Cyprus' => 'CY', 'Czech Republic' => 'CZ', 'Germany' => 'DE', 'Djibouti' => 'DJ', 'Denmark' => 'DK', 'Dominica' => 'DM', 'Dominican Republic' => 'DO', 'Algeria' => 'DZ', 'Ecuador' => 'EC', 'Estonia' => 'EE', 'Egypt' => 'EG', 'Western Sahara' => 'EH', 'Eritrea' => 'ER', 'Spain' => 'ES', 'Ethiopia' => 'ET', 'Finland' => 'FI', 'Fiji' => 'FJ', 'Falkland Islands (Malvinas)' => 'FK', 'Micronesia' => 'FM', 'Faroe Islands' => 'FO', 'France' => 'FR', 'France, Metropolitan' => 'FX', 'Gabon' => 'GA', 'United Kingdom (Great Britain)' => 'GB', 'Grenada' => 'GD', 'Georgia' => 'GE', 'French Guiana' => 'GF', 'Ghana' => 'GH', 'Gibraltar' => 'GI', 'Greenland' => 'GL', 'Gambia' => 'GM', 'Guinea' => 'GN', 'Guadeloupe' => 'GP', 'Equatorial Guinea' => 'GQ', 'Greece' => 'GR', 'South Georgia and the South Sandwich Islands' => 'GS', 'Guatemala' => 'GT', 'Guam' => 'GU', 'Guinea-Bissau' => 'GW', 'Guyana' => 'GY', 'Hong Kong' => 'HK', 'Heard & McDonald Islands' => 'HM', 'Honduras' => 'HN', 'Croatia' => 'HR', 'Haiti' => 'HT', 'Hungary' => 'HU', 'Indonesia' => 'ID', 'Ireland' => 'IE', 'Israel' => 'IL', 'India' => 'IN', 'British Indian Ocean Territory' => 'IO', 'Iraq' => 'IQ', 'Iran, Islamic Republic of' => 'IR', 'Iceland' => 'IS', 'Italy' => 'IT', 'Jamaica' => 'JM', 'Jordan' => 'JO', 'Japan' => 'JP', 'Kenya' => 'KE', 'Kyrgyzstan' => 'KG', 'Cambodia' => 'KH', 'Kiribati' => 'KI', 'Comoros' => 'KM', 'St. Kitts and Nevis' => 'KN', 'Korea, Democratic People\'s Republic of' => 'KP', 'Korea, Republic of' => 'KR', 'Kuwait' => 'KW', 'Cayman Islands' => 'KY', 'Kazakhstan' => 'KZ', 'Lao People\'s Democratic Republic' => 'LA', 'Lebanon' => 'LB', 'Saint Lucia' => 'LC', 'Liechtenstein' => 'LI', 'Sri Lanka' => 'LK', 'Liberia' => 'LR', 'Lesotho' => 'LS', 'Lithuania' => 'LT', 'Luxembourg' => 'LU', 'Latvia' => 'LV', 'Libyan Arab Jamahiriya' => 'LY', 'Morocco' => 'MA', 'Monaco' => 'MC', 'Moldova, Republic of' => 'MD', 'Montenegro' => 'ME', 'Madagascar' => 'MG', 'Marshall Islands' => 'MH', 'Macedonia, Republic of' => 'MK', 'Mali' => 'ML', 'Mongolia' => 'MN', 'Myanmar' => 'MM', 'Macau' => 'MO', 'Northern Mariana Islands' => 'MP', 'Martinique' => 'MQ', 'Mauritania' => 'MR', 'Monserrat' => 'MS', 'Malta' => 'MT', 'Mauritius' => 'MU', 'Maldives' => 'MV', 'Malawi' => 'MW', 'Mexico' => 'MX', 'Malaysia' => 'MY', 'Mozambique' => 'MZ', 'Namibia' => 'NA', 'New Caledonia' => 'NC', 'Niger' => 'NE', 'Norfolk Island' => 'NF', 'Nigeria' => 'NG', 'Nicaragua' => 'NI', 'Netherlands' => 'NL', 'Norway' => 'NO', 'Nepal' => 'NP', 'Nauru' => 'NR', 'Niue' => 'NU', 'New Zealand' => 'NZ', 'Oman' => 'OM', 'Panama' => 'PA', 'Peru' => 'PE', 'French Polynesia' => 'PF', 'Papua New Guinea' => 'PG', 'Philippines' => 'PH', 'Pakistan' => 'PK', 'Poland' => 'PL', 'St. Pierre & Miquelon' => 'PM', 'Pitcairn' => 'PN', 'Puerto Rico' => 'PR', 'Portugal' => 'PT', 'Palau' => 'PW', 'Paraguay' => 'PY', 'Qatar' => 'QA', 'Réunion' => 'RE', 'Romania' => 'RO', 'Serbia' => 'RS', 'Russian Federation' => 'RU', 'Rwanda' => 'RW', 'Saudi Arabia' => 'SA', 'Solomon Islands' => 'SB', 'Seychelles' => 'SC', 'Sudan' => 'SD', 'Sweden' => 'SE', 'Singapore' => 'SG', 'St. Helena' => 'SH', 'Slovenia' => 'SI', 'Svalbard & Jan Mayen Islands' => 'SJ', 'Slovakia' => 'SK', 'Sierra Leone' => 'SL', 'San Marino' => 'SM', 'Senegal' => 'SN', 'Somalia' => 'SO', 'Suriname' => 'SR', 'Sao Tome & Principe' => 'ST', 'El Salvador' => 'SV', 'Syrian Arab Republic' => 'SY', 'Swaziland' => 'SZ', 'Turks & Caicos Islands' => 'TC', 'Chad' => 'TD', 'French Southern Territories' => 'TF', 'Togo' => 'TG', 'Thailand' => 'TH', 'Tajikistan' => 'TJ', 'Tokelau' => 'TK', 'Turkmenistan' => 'TM', 'Tunisia' => 'TN', 'Tonga' => 'TO', 'East Timor' => 'TP', 'Turkey' => 'TR', 'Trinidad & Tobago' => 'TT', 'Tuvalu' => 'TV', 'Taiwan' => 'TW', 'Tanzania, United Republic of' => 'TZ', 'Ukraine' => 'UA', 'Uganda' => 'UG', 'United States Minor Outlying Islands' => 'UM', 'United States of America' => 'US', 'Uruguay' => 'UY', 'Uzbekistan' => 'UZ', 'Vatican City State (Holy See)' => 'VA', 'St. Vincent & the Grenadines' => 'VC', 'Venezuela' => 'VE', 'British Virgin Islands' => 'VG', 'United States Virgin Islands' => 'VI', 'Viet Nam' => 'VN', 'Vanuatu' => 'VU', 'Wallis & Futuna Islands' => 'WF', 'Samoa' => 'WS', 'Yemen' => 'YE', 'Mayotte' => 'YT', 'South Africa' => 'ZA', 'Zambia' => 'ZM', 'Zaire' => 'ZR', 'Zimbabwe' => 'ZW', 'Unknown or unspecified country' => 'ZZ' ); if ($idx_by_code) { $ctr = array_flip($ctr); } ksort($ctr); return $ctr; } /** * Returns iso codes. * * @param bool Is the language the key in the array (false) * @return array The key is either the language or the iso code */ public static function getNativeLanguages($lang=false) { $res = array( 'ab' => 'Аҧсуа', 'aa' => 'Afaraf', 'af' => 'Afrikaans', 'ak' => 'Akan', 'am' => 'አማርኛ', 'ar' => 'العربية', 'an' => 'Aragonés', 'as' => 'অসমীয়া', 'av' => 'авар мацӀ', 'ae' => 'avesta', 'ay' => 'aymar aru', 'az' => 'Azərbaycanca', 'bm' => 'bamanankan', 'ba' => 'башҡорт теле', 'be' => 'Беларуская мова', 'bn' => 'বাংলা', 'bh' => 'Bihari', 'bi' => 'Bislama', 'bs' => 'bosanski jezik', 'br' => 'brezhoneg', 'bg' => 'български език', 'ca' => 'català', 'ch' => 'Chamoru', 'ce' => 'нохчийн мотт', 'ny' => 'chiCheŵa', 'cu' => 'чӑваш чӗлхи', 'kw' => 'Kernewek', 'co' => 'corsu', 'cr' => 'ᓀᐦᐃᔭᐍᐏᐣ', 'hr' => 'hrvatski jezik', 'cs' => 'čeština', 'da' => 'dansk', 'dv' => 'ދިވެހިބަސ', 'dz' => 'རྫོང་ཁ', 'en' => 'English', 'eo' => 'Esperanto', 'et' => 'eesti keel', 'ee' => 'Ɛʋɛgbɛ', 'fo' => 'føroyskt', 'fj' => 'vosa Vakaviti', 'fi' => 'suomi', 'fr' => 'français', 'fy' => 'frysk', 'ff' => 'Fulfulde, Pulaar, Pular', 'gl' => 'Galego', 'lg' => 'Luganda', 'ka' => 'ქართული ენა', 'de' => 'Deutsch', 'el' => 'Ελληνικά', 'kl' => 'kalaallisut', 'gn' => 'Avañe\'ẽ', 'gu' => 'ગુજરાતી', 'ht' => 'Kreyòl ayisyen', 'ha' => 'Hausancī', 'he' => 'עִבְרִית', 'hz' => 'Otjiherero', 'hi' => 'हिन्दी', 'ho' => 'Hiri Motu', 'hu' => 'magyar', 'is' => 'íslenska', 'io' => 'Ido', 'ig' => 'Igbo', 'id' => 'Bahasa Indonesia', 'ia' => 'interlingua', 'ie' => 'Interlingue', 'iu' => 'ᐃᓄᒃᑎᑐᑦ', 'ik' => 'Iñupiaq', 'ga' => 'Gaeilge', 'it' => 'italiano', 'ja' => '日本語 (にほんご)', 'jv' => 'basa Jawa', 'kn' => 'ಕನ್ನಡ', 'kr' => 'कॉशुर', 'kk' => 'Қазақ тілі', 'km' => 'Central Khmer', 'ki' => 'Gĩkũyũ', 'rw' => 'kinyaRwanda', 'ky' => 'кыргыз тили', 'kv' => 'коми кыв', 'kg' => 'Kikongo', 'ko' => '한국어 (韓國語)', 'kj' => 'Kurdish', 'lo' => 'ພາສາລາວ', 'la' => 'latine', 'lv' => 'latviešu valoda', 'li' => 'Limburgs', 'ln' => 'lingala', 'lt' => 'lietuvių kalba', 'lu' => 'Luxembourgish', 'mg' => 'Malagasy fiteny', 'ms' => 'bahasa Melayu', 'ml' => 'മലയാളം', 'mt' => 'Malti', 'gv' => 'Gaelg', 'mi' => 'te reo Māori', 'mr' => 'मराठी', 'mh' => 'Kajin M̧ajeļ', 'mn' => 'монгол хэл', 'na' => 'Ekakairũ Naoero', 'nv' => 'Diné bizaad', 'nd' => 'isiNdebele', 'nr' => 'isiNdebele', 'ng' => 'Owambo', 'ne' => 'नेपाली', 'se' => 'sámi', 'no' => 'Norsk', 'nb' => 'Norsk bokmål', 'nn' => 'Norsk nynorsk', 'oc' => 'Occitan', 'oj' => 'ᐊᓂᔑᓇᐯᒧᐏᐣ (Anishinaabemowin)', 'or' => 'ଓଡ଼ିଆ', 'om' => 'Afaan Oromoo', 'os' => 'ирон ӕвзаг', 'pi' => 'पालि', 'fa' => 'فارسی', 'pl' => 'polski', 'pt' => 'português', 'pa' => 'ਪੰਜਾਬੀ', 'ps' => 'پښتو', 'qu' => 'Runa Simi', 'rm' => 'rumantsch grischun', 'rn' => 'kiRundi', 'ru' => 'русский язык', 'sm' => 'gagana fa\'a Samoa', 'sg' => 'yângâ tî sängö', 'sa' => 'संस्कृतम्', 'sc' => 'sardu', 'gd' => 'Gàidhlig', 'sr' => 'српски језик', 'sn' => 'chiShona', 'ii' => 'ꆇꉙ', 'sd' => 'سنڌي، سندھی', 'si' => 'සිංහල', 'sk' => 'slovenčina', 'sl' => 'slovenščina', 'so' => 'Soomaaliga', 'st' => 'Sesotho', 'es' => 'español', 'su' => 'basa Sunda', 'sw' => 'kiswahili', 'ss' => 'siSwati', 'sv' => 'Svenska', 'tl' => 'Tagalog', 'ty' => 'te reo Tahiti', 'tg' => 'тоҷикӣ', 'ta' => 'தமிழ்', 'tt' => 'татарча', 'te' => 'తెలుగు', 'th' => 'ภาษาไทย', 'bo' => 'བོད་ཡིག', 'ti' => 'ትግርኛ', 'to' => 'faka-Tonga', 'ts' => 'Xitsonga', 'tn' => 'Setswana', 'tr' => 'Türkçe', 'tk' => 'Түркмен', 'tw' => 'Twi', 'ug' => 'Uyƣurqə', 'uk' => 'українська мова', 'ur' => 'اردو', 'uz' => 'O\'zbek', 've' => 'Tshivenḓa', 'vi' => 'Tiếng Việt', 'vo' => 'Volapük', 'wa' => 'walon', 'cy' => 'Cymraeg', 'wo' => 'Wolof', 'xh' => 'isiXhosa', 'yi' => 'ייִדיש', 'yo' => 'Yorùbá', 'za' => 'Saɯ cueŋƅ', 'zu' => 'isiZulu', ); if ($lang) { $res = array_flip($res); ksort($res); //order by lang } return $res; } public static function getInstalledLanguages() { $l = array(); $nl = self::getNativeLanguages(); foreach (Pluf::f('languages', array('en')) as $lang) { $lang2 = substr($lang, 0, 2); $l[mb_convert_case($nl[$lang2], MB_CASE_TITLE, 'UTF-8')] = $lang; } return $l; } }