mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
3469e4d22a
------------------------------------------------------------------------ r68900 | sminnee | 2008-12-15 14:30:41 +1300 (Mon, 15 Dec 2008) | 1 line Static caching merges from dnc branch ------------------------------------------------------------------------ r68917 | sminnee | 2008-12-15 14:49:06 +1300 (Mon, 15 Dec 2008) | 1 line Merged Requirements fix from nestedurls branch ------------------------------------------------------------------------ r70033 | aoneil | 2009-01-13 14:03:41 +1300 (Tue, 13 Jan 2009) | 2 lines Add translation migration task ------------------------------------------------------------------------ r70072 | ischommer | 2009-01-13 17:34:27 +1300 (Tue, 13 Jan 2009) | 5 lines API CHANGE Removed obsolete internal Translatable methods: hasOwnTranslatableFields(), allFieldsInTable() ENHANCEMENT Removed $create flag in Translatable::getTranslation() and replaced with explit action createTranslation() ENHANCEMENT Sorting return array of Translatable::getTranslatedLangs() ENHANCEMENT Added a note about saving a page before creating a translation MINOR Added phpdoc to Translatable ------------------------------------------------------------------------ r70073 | ischommer | 2009-01-13 17:34:45 +1300 (Tue, 13 Jan 2009) | 1 line ENHANCEMENT Added basic unit tests to new Translatable API ------------------------------------------------------------------------ r70080 | aoneil | 2009-01-13 18:04:21 +1300 (Tue, 13 Jan 2009) | 3 lines BUGFIX: Fix translatable migration regenerating URLSegments when it shouldn't BUGFIX: Fix translatable migration not writing records to Live properly ------------------------------------------------------------------------ r70118 | ischommer | 2009-01-14 11:28:24 +1300 (Wed, 14 Jan 2009) | 3 lines API CHANGE Removed obsolete Translatable::table_exists() ENHANCEMENT Made Translatable constructor arguments optional, as by default all database fields are marked translatable MINOR More unit tests for Translatable ------------------------------------------------------------------------ r70138 | ischommer | 2009-01-14 17:00:30 +1300 (Wed, 14 Jan 2009) | 1 line BUGFIX Disabled assumption that SQLQuery->filtersOnID() should only kick in when exactly one WHERE clause is given - this is very fragile and hard to test. It would return TRUE on $where = "SiteTree.ID = 5", but not on $where = array("Lang = 'de'", "SiteTree.ID = 5") ------------------------------------------------------------------------ r70214 | ischommer | 2009-01-15 18:56:25 +1300 (Thu, 15 Jan 2009) | 3 lines BUGFIX Falling back to Translatable::current_lang() if no $context object is given, in augmentAllChildrenIncludingDeleted() and AllChildrenIncludingDeleted() MINOR phpdoc for Translatable MINOR Added more Translatable unit tests ------------------------------------------------------------------------ r70306 | ischommer | 2009-01-16 17:14:34 +1300 (Fri, 16 Jan 2009) | 9 lines ENHANCEMENT Recursively creating translations for parent pages to ensure that a translated page is still accessible by traversing the tree, e.g. in "cms translation mode" (in Translatable->onBeforeWrite()) ENHANCEMENT Simplified AllChildrenIncludingDeleted() to not require a special augmentAllChildrenIncludingDeleted() implementation: We don't combine untranslated/translated children any longer (which was used in CMS tree view), but rather just show translated records ENHANCEMENT Ensuring uniqueness of URL segments by appending "-<langcode>" to new translations (in Translatable->onBeforeWrite()) ENHANCEMENT Added Translatable->alternateGetByUrl() as a hook into SiteTree::get_by_url() ENHANCEMENT Adding link back to original page in CMS editform for translations BUGFIX Excluding HiddenField instances from Translatable->updateCMSFields() BUGFIX Don't require a record to be written (through exists()) when checking Translatable->isTranslation() or Translatable->hasTranslation() MINOR Don't use createMethod() shortcut for Translatable->AllChildrenIncludingDeleted() MINOR Added Translatable unit tests ------------------------------------------------------------------------ r70318 | ischommer | 2009-01-19 11:46:16 +1300 (Mon, 19 Jan 2009) | 1 line BUGFIX Reverted special cases for Translatable in Versioned->canBeVersioned() (originally committed in r42119) - was checking for existence of underscores in table names as an indication of the "_lang" suffix, which is no longer needed. It was also a flawed assumption which tripped over classes like TranslatableTest_TestPage ------------------------------------------------------------------------ r70319 | ischommer | 2009-01-19 11:47:02 +1300 (Mon, 19 Jan 2009) | 1 line ENHANCEMENT Disabled Translatab-e>augmentWrite() - was only needed for the blacklist fields implementation which is inactive for the moment ------------------------------------------------------------------------ r70326 | ischommer | 2009-01-19 14:25:23 +1300 (Mon, 19 Jan 2009) | 2 lines ENHANCEMENT Making ErrorPage static HTML files translatable (#2233) ENHANCEMENT Added ErrorPage::$static_filepath to flexibly set location of static error pages (defaults to /assets) ------------------------------------------------------------------------ r70327 | ischommer | 2009-01-19 15:18:41 +1300 (Mon, 19 Jan 2009) | 1 line FEATURE Enabled specifying a language through a hidden field in SearchForm which limits the search to pages in this language (incl. unit tests) ------------------------------------------------------------------------ r71258 | sharvey | 2009-02-03 15:49:34 +1300 (Tue, 03 Feb 2009) | 2 lines BUGFIX: Fix translatable being enabled when it shouldn't be ------------------------------------------------------------------------ r71340 | ischommer | 2009-02-04 14:36:12 +1300 (Wed, 04 Feb 2009) | 1 line BUGFIX Including Hierarchy->children in flushCache() and renamed to _cache_children. This caused problems in TranslatableTest when re-using the same SiteTree->Children() method with different languages on the same object (even with calling flushCache() inbetween the calls) ------------------------------------------------------------------------ r71567 | gmunn | 2009-02-10 13:49:16 +1300 (Tue, 10 Feb 2009) | 1 line 'URLSegment' on line 484 and 494 now escaped ------------------------------------------------------------------------ r72054 | ischommer | 2009-02-23 10:30:41 +1300 (Mon, 23 Feb 2009) | 3 lines BUGFIX Fixed finding a translated homepage without an explicit URLSegment (e.g. http://mysite.com/?lang=de) - see #3540 ENHANCEMENT Added Translatable::get_homepage_urlsegment_by_language() ENHANCEMENT Added RootURLController::get_default_homepage_urlsegment() ------------------------------------------------------------------------ r72367 | ischommer | 2009-03-03 11:13:30 +1300 (Tue, 03 Mar 2009) | 2 lines ENHANCEMENT Added i18n::get_lang_from_locale() and i18n::convert_rfc1766() ENHANCEMENT Using IETF/HTTP compatible "long" language code in SiteTree->MetaTags(). This means the default <meta type="content-language..."> value will be "en-US" instead of "en". The locale can be either set through the Translatable content language, or through i18n::set_locale() ------------------------------------------------------------------------ r73036 | sminnee | 2009-03-14 13:16:32 +1300 (Sat, 14 Mar 2009) | 1 line ENHANCEMENT #3032 ajshort: Use static methods for accessing static data ------------------------------------------------------------------------ r73059 | sminnee | 2009-03-15 14:09:59 +1300 (Sun, 15 Mar 2009) | 2 lines ENHANCEMENT: Added Object::clearCache() to clear a cache BUGFIX: Make object cache testing more robust ------------------------------------------------------------------------ r73338 | ischommer | 2009-03-19 05:13:40 +1300 (Thu, 19 Mar 2009) | 9 lines API CHANGE Added concept of "translation groups" to Translatable- every page can belong to a group of related translations, rather than having an explicit "original", meaning you can have pages in "non-default" languages which have no representation in other language trees. This group is recorded in a new table "<classname>_translationgroups". Translatable->createTranslation() and Translatable->onBeforeWrite() will automatically associate records in this groups. Added Translatable->addTranslationGroup(), Translatable->removeTranslationGroup(), Translatable->getTranslationGroup() API CHANGE Removed Translatable->isTranslation() - after the new "translation group" model, every page is potentially a translation API CHANGE Translatable->findOriginalIDs(), Translatable->setOriginalPage(), Translatable->getOriginalPage() ENHANCEMENT Translatable->getCMSFields() will now always show the "create translation" option, not only on default languages - meaning you can create translations based on other translations ENHANCEMENT Translatable language dropdown in CMS will always show all available languages, rather than filtering by already existing translations ENHANCEMENT Added check for an existing record in Translatable->createTranslation() BUGFIX Removed Translatable->getLang() which overloaded the $db property - it was causing side effects during creation of SiteTree default records. BUGFIX Added check in Translatable->augmentSQL() to avoid reapplying "Lang = ..." filter twice BUGFIX Removed bypass in Translatable->AllChildrenIncludingDeleted() ------------------------------------------------------------------------ r73339 | ischommer | 2009-03-19 05:15:46 +1300 (Thu, 19 Mar 2009) | 1 line BUGFIX Disabled "untranslated" CSS class for SiteTree elements - doesn't apply any longer with the new "translation groups" concept ------------------------------------------------------------------------ r73341 | ischommer | 2009-03-19 06:01:51 +1300 (Thu, 19 Mar 2009) | 1 line BUGFIX Disabled auto-excluding of default language from the "available languages" array in LanguageDropdownField - due to the new "translation groups" its possible to have a translation from another language into the default language ------------------------------------------------------------------------ r73342 | ischommer | 2009-03-19 06:13:23 +1300 (Thu, 19 Mar 2009) | 4 lines BUGFIX Setting ParentID of translated record if recursively creating parents in Translatable::onBeforeWrite() BUGFIX Fixing inline form action for "create translation" BUGFIX Removed link to "original page" for a translation - no longer valid MINOR documentation for Translatable ------------------------------------------------------------------------ r73464 | ischommer | 2009-03-20 20:51:00 +1300 (Fri, 20 Mar 2009) | 1 line MINOR documentation ------------------------------------------------------------------------ r73465 | ischommer | 2009-03-20 20:58:52 +1300 (Fri, 20 Mar 2009) | 1 line BUGFIX Fixed Hierarchy->Children() testing in TranslatableTest - with the new datamodel you can't call Children() in a different language regardless of Translatable::set_reading_lang(), the Children() call has to be made from a parent in the same language ------------------------------------------------------------------------ r73466 | ischommer | 2009-03-20 21:36:40 +1300 (Fri, 20 Mar 2009) | 2 lines ENHANCEMENT Added Translatable::get_locale_from_lang(), Translatable::get_common_locales(), $common_locales and $likely_subtags in preparation to switch Translatable from using short "lang" codes to proper long locales API CHANGE Deprecated Translatable::set_default_lang(), Translatable::default_lang() ------------------------------------------------------------------------ r73467 | ischommer | 2009-03-20 21:38:57 +1300 (Fri, 20 Mar 2009) | 1 line ENHANCEMENT Supporting "Locale-English" and "Locale-Native" as listing arguments in LanguageDropdownField ------------------------------------------------------------------------ r73468 | ischommer | 2009-03-20 21:47:06 +1300 (Fri, 20 Mar 2009) | 7 lines ENHANCEMENT Adjusted SearchForm, Debug, ErrorPage, SiteTree to using locales instead of lang codes API CHANGE Changed Translatable datamodel to use locales ("en_US") instead of lang values ("en). API CHANGE Changed Translatable::$default_lang to $default_locale, Translatable::$reading_lang to $reading_locale API CHANGE Using "locale" instead of "lang" in Translatable::choose_site_lang() to auto-detect language from cookies or GET parameters API CHANGE Deprecated Translatable::is_default_lang(), set_default_lang(), get_default_lang(), current_lang(), set_reading_lang(), get_reading_lang(), get_by_lang(), get_one_by_lang() API CHANGE Removed Translatable::get_original() - with the new "translation groups" concept there no longer is an original for a translation BUGFIX Updated MigrateTranslatableTask to new Locale based datamodel ------------------------------------------------------------------------ r73470 | ischommer | 2009-03-20 21:56:57 +1300 (Fri, 20 Mar 2009) | 1 line MINOR fixed typo ------------------------------------------------------------------------ r73472 | sminnee | 2009-03-21 17:30:04 +1300 (Sat, 21 Mar 2009) | 1 line BUGFIX: Fixed translatable test execution by making protected methods public ------------------------------------------------------------------------ r73473 | sminnee | 2009-03-21 18:10:05 +1300 (Sat, 21 Mar 2009) | 1 line ENHANCEMENT: Added Object::combined_static(), which gets all values of a static property from each class in the hierarchy ------------------------------------------------------------------------ r73883 | ischommer | 2009-04-01 08:32:19 +1300 (Wed, 01 Apr 2009) | 1 line BUGFIX Making $_SINGLETONS a global instead of a static in Core.php so it can be re-used in other places ------------------------------------------------------------------------ r73951 | ischommer | 2009-04-02 05:35:32 +1300 (Thu, 02 Apr 2009) | 3 lines API CHANGE Deprecated Translatable::enable() and i18n::enable()- use Object::add_extension('SiteTree','Translatable'), Deprecated Translatable::disable() and i18n::disable() - use Object::remove_extension('SiteTree','Translatable'), Deprecated Translatable::enabled() - use $myPage->hasExtension('Translatable') API CHANGE Removed Translatable::creating_from() - doesn't apply any longer ENHANCEMENT Translatable extension is no longer hooked up to SiteTree by default, which should improve performance and memory usage for sites not using Translatable. Please use Object::add_extension('SiteTree','Translatable') in your _config.php instead. Adjusted several classes (Image, ErrorPage, RootURLController) to the new behaviour. ------------------------------------------------------------------------ r73882 | ischommer | 2009-04-01 08:31:21 +1300 (Wed, 01 Apr 2009) | 1 line ENHANCEMENT Added DataObjectDecorator->setOwner() ------------------------------------------------------------------------ r73884 | ischommer | 2009-04-01 08:32:51 +1300 (Wed, 01 Apr 2009) | 1 line ENHANCEMENT Added Extension::get_classname_without_arguments() ------------------------------------------------------------------------ r73900 | ischommer | 2009-04-01 11:27:53 +1300 (Wed, 01 Apr 2009) | 7 lines API CHANGE Deprecated Object->extInstance(), use getExtensionInstance() instead ENHANCEMENT Added Object->getExtensionInstances() ENHANCEMENT Added Object::get_extensions() ENHANCEMENT Unsetting class caches when using Object::add_extension() to avoid problems with defineMethods etc. BUGFIX Fixed extension comparison with case sensitivity and stripping arguments in Object::has_extension() BUGFIX Unsetting all cached singletons in Object::remove_extension() to avoid outdated extension_instances MINOR Documentation in Object ------------------------------------------------------------------------ r74017 | ischommer | 2009-04-03 10:49:40 +1300 (Fri, 03 Apr 2009) | 1 line ENHANCEMENT Improved deprecated fallbacks in Translatable by auto-converting short language codes to long locales and vice versa through i18n::get_lang_from_locale()/i18n::get_locale_from_lang() ------------------------------------------------------------------------ r74030 | ischommer | 2009-04-03 11:41:26 +1300 (Fri, 03 Apr 2009) | 1 line MINOR Re-added Translatable::default_lang() for more graceful fallback to Translatable::default_locale() ------------------------------------------------------------------------ r74065 | ischommer | 2009-04-04 05:38:51 +1300 (Sat, 04 Apr 2009) | 1 line BUGFIX Re-added Translatable->isTranslation() for more friendly deprecation (originally removed in r73338) ------------------------------------------------------------------------ r74069 | ischommer | 2009-04-04 09:43:01 +1300 (Sat, 04 Apr 2009) | 1 line BUGFIX Fixed legacy handling of Translatable::enable(),Translatable::disable() and Translatable::is_enabled() - applying extension to SiteTree instead of Page to avoid datamodel clashes ------------------------------------------------------------------------ r74070 | ischommer | 2009-04-04 10:23:51 +1300 (Sat, 04 Apr 2009) | 1 line API CHANGE Deprecated Translatable::choose_site_lang(), use choose_site_locale() ------------------------------------------------------------------------ r74941 | ischommer | 2009-04-22 15:22:09 +1200 (Wed, 22 Apr 2009) | 2 lines ENHANCEMENT Adding SapphireTest::set_up_once() and SapphireTest::tear_down_once() for better test performance with state that just needs to be initialized once per test case (not per test method). Added new SapphireTestSuite to support this through PHPUnit. ENHANCEMENT Using set_up_once() in TranslatableTest and TranslatableSearchFormTest for better test run performance ------------------------------------------------------------------------ r74942 | ischommer | 2009-04-22 15:24:50 +1200 (Wed, 22 Apr 2009) | 1 line BUGFIX Fixed TranslatableSearchFormTest->setUp() method ------------------------------------------------------------------------ r73509 | ischommer | 2009-03-23 11:59:14 +1300 (Mon, 23 Mar 2009) | 1 line MINOR phpdoc documentation ------------------------------------------------------------------------ git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.3@74986 467b73ca-7a2a-4603-9d3b-597d59a354a9
1793 lines
56 KiB
PHP
Executable File
1793 lines
56 KiB
PHP
Executable File
<?php
|
||
/**
|
||
* Base-class for storage and retrieval of translated entities.
|
||
*
|
||
* Usage PHP:
|
||
* <code>
|
||
* _t('MyNamespace.MYENTITY', 'My default natural language value');
|
||
* _t('MyNamespace.MYENTITY', 'My default natural language value', PR_MEDIUM, 'My explanatory context');
|
||
* sprintf(_t('MyNamespace.MYENTITY', 'Counting %s things'), 42);
|
||
* </code>
|
||
*
|
||
* Usage Templates:
|
||
* <code>
|
||
* <% _t('MyNamespace.MYENTITY', 'My default natural language value') %>
|
||
* <% sprintf(_t('MyNamespace.MYENTITY','Counting %s things'),$ThingsCount) %>
|
||
* </code>
|
||
*
|
||
* Usage Javascript (see sapphire/javascript/i18n.js):
|
||
* <code>
|
||
* ss.i18n._t('MyEntity.MyNamespace','My default natural language value');
|
||
* </code>
|
||
*
|
||
* File-based i18n-translations always have a "locale" (e.g. 'en_US').
|
||
* Common language names (e.g. 'en') are mainly used in {Translatable} for
|
||
* database-entities.
|
||
*
|
||
* Features a "textcollector-mode" that parses all files with a certain extension
|
||
* (currently *.php and *.ss) for new translatable strings. Textcollector will write
|
||
* updated string-tables to their respective folders inside the module, and automatically
|
||
* namespace entities to the classes/templates they are found in (e.g. $lang['en_US']['AssetAdmin']['UPLOADFILES']).
|
||
*
|
||
* Caution: Does not apply any character-set conversion, it is assumed that all content
|
||
* is stored and represented in UTF-8 (Unicode). Please make sure your files are created with the correct
|
||
* character-set, and your HTML-templates render UTF-8.
|
||
*
|
||
* Caution: The language file has to be stored in the same module path as the "filename namespaces"
|
||
* on the entities. So an entity stored in $lang['en_US']['AssetAdmin']['DETAILSTAB'] has to
|
||
* in the language file cms/lang/en_US.php, as the referenced file (AssetAdmin.php) is stored
|
||
* in the "cms" module.
|
||
*
|
||
* Please see the {Translatable} DataObjectDecorator for managing translations of database-content.
|
||
*
|
||
* @see http://www.w3.org/TR/i18n-html-tech-lang
|
||
*
|
||
* @author Bernat Foj Capell <bernat@silverstripe.com>
|
||
* @package sapphire
|
||
* @subpackage misc
|
||
*/
|
||
class i18n extends Object {
|
||
|
||
/**
|
||
* This static variable is used to store the current defined locale.
|
||
*/
|
||
protected static $current_locale = '';
|
||
|
||
/**
|
||
* This is the locale in which generated language files are (we assume US English)
|
||
*
|
||
* @var string
|
||
*/
|
||
protected static $default_locale = 'en_US';
|
||
|
||
/**
|
||
* @var boolean
|
||
*/
|
||
protected static $js_i18n = true;
|
||
|
||
/**
|
||
* Use javascript i18n through the ss.i18n class (enabled by default).
|
||
* If set to TRUE, includes javascript requirements for the base library
|
||
* (sapphire/javascript/i18n.js) and all necessary lang files (e.g. sapphire/lang/de_DE.js)
|
||
* plus fallbacks to the default locale (e.g. sapphire/lang/en_US.js).
|
||
* If set to FALSE, only includes a stub implementation
|
||
* which is necessary. Mainly disabled to save bandwidth
|
||
* in a frontend context when website is in single language.
|
||
*
|
||
* Caution: This flag gets overwritten in {@link LeftAndMain::init()} to enforce javascript
|
||
* i18n for the CMS interfaces.
|
||
*
|
||
* @see Requirements::process_i18n_javascript()
|
||
*
|
||
* @param bool $bool
|
||
*/
|
||
public static function set_js_i18n($bool) {
|
||
self::$js_i18n = $bool;
|
||
}
|
||
|
||
/**
|
||
* @return bool
|
||
*/
|
||
public static function get_js_i18n() {
|
||
return self::$js_i18n;
|
||
}
|
||
|
||
/**
|
||
* An exhaustive list of possible locales (code => language and country)
|
||
*
|
||
* @var array
|
||
*/
|
||
public static $all_locales = array(
|
||
'aa_DJ' => 'Afar (Djibouti)',
|
||
'ab_GE' => 'Abkhazian (Georgia)',
|
||
'abr_GH' => 'Abron (Ghana)',
|
||
'ace_ID' => 'Achinese (Indonesia)',
|
||
'ady_RU' => 'Adyghe (Russia)',
|
||
'af_ZA' => 'Afrikaans (South Africa)',
|
||
'ak_GH' => 'Akan (Ghana)',
|
||
'am_ET' => 'Amharic (Ethiopia)',
|
||
'ar_AE' => 'Arabic (United Arab Emirates)',
|
||
'ar_BH' => 'Arabic (Bahrain)',
|
||
'ar_DZ' => 'Arabic (Algeria)',
|
||
'ar_EG' => 'Arabic (Egypt)',
|
||
'ar_EH' => 'Arabic (Western Sahara)',
|
||
'ar_IQ' => 'Arabic (Iraq)',
|
||
'ar_JO' => 'Arabic (Jordan)',
|
||
'ar_KW' => 'Arabic (Kuwait)',
|
||
'ar_LB' => 'Arabic (Lebanon)',
|
||
'ar_LY' => 'Arabic (Libya)',
|
||
'ar_MA' => 'Arabic (Morocco)',
|
||
'ar_MR' => 'Arabic (Mauritania)',
|
||
'ar_OM' => 'Arabic (Oman)',
|
||
'ar_PS' => 'Arabic (Palestinian Territory)',
|
||
'ar_QA' => 'Arabic (Qatar)',
|
||
'ar_SA' => 'Arabic (Saudi Arabia)',
|
||
'ar_SD' => 'Arabic (Sudan)',
|
||
'ar_SY' => 'Arabic (Syria)',
|
||
'ar_TD' => 'Arabic (Chad)',
|
||
'ar_TN' => 'Arabic (Tunisia)',
|
||
'ar_YE' => 'Arabic (Yemen)',
|
||
'as_IN' => 'Assamese (India)',
|
||
'auv_FR' => 'Auvergnat (France)',
|
||
'av_RU' => 'Avaric (Russia)',
|
||
'awa_IN' => 'Awadhi (India)',
|
||
'ay_BO' => 'Aymara (Bolivia)',
|
||
'ay_PE' => 'Aymara (Peru)',
|
||
'az_AZ' => 'Azerbaijani (Azerbaijan)',
|
||
'az_IR' => 'Azerbaijani (Iran)',
|
||
'ba_RU' => 'Bashkir (Russia)',
|
||
'ban_ID' => 'Balinese (Indonesia)',
|
||
'be_BY' => 'Belarusian (Belarus)',
|
||
'bew_ID' => 'Betawi (Indonesia)',
|
||
'bg_BG' => 'Bulgarian (Bulgaria)',
|
||
'bgc_IN' => 'Haryanvi (India)',
|
||
'bcc_PK' => 'Balochi, Southern (Pakistan)',
|
||
'bgn_PK' => 'Balochi, Western (Pakistan)',
|
||
'bgp_PK' => 'Balochi, Easter (Pakistan)',
|
||
'bhb_IN' => 'Bhili (India)',
|
||
'bhi_IN' => 'Bhilali (India)',
|
||
'bcl_PH' => 'Bicolano, Central (Philippines)',
|
||
'bhk_PH' => 'Bicolano, Albay (Philippines)',
|
||
'bho_IN' => 'Bhojpuri (India)',
|
||
'bho_MU' => 'Bhojpuri (Mauritius)',
|
||
'bho_NP' => 'Bhojpuri (Nepal)',
|
||
'bi_VU' => 'Bislama (Vanuatu)',
|
||
'bjj_IN' => 'Kanauji (India)',
|
||
'bjn_ID' => 'Banjar (Indonesia)',
|
||
'bm_ML' => 'Bambara (Mali)',
|
||
'bn_BD' => 'Bengali (Bangladesh)',
|
||
'bn_IN' => 'Bengali (India)',
|
||
'bo_CN' => 'Tibetan (China)',
|
||
'bqi_IR' => 'Bakhtiari (Iran)',
|
||
'brh_PK' => 'Brahui (Pakistan)',
|
||
'bs_BA' => 'Bosnian (Bosnia and Herzegovina)',
|
||
'btk_ID' => 'Batak (Indonesia)',
|
||
'buc_YT' => 'Bushi (Mayotte)',
|
||
'bug_ID' => 'Buginese (Indonesia)',
|
||
'ca_AD' => 'Catalan (Andorra)',
|
||
'ca_ES' => 'Catalan (Spain)',
|
||
'ce_RU' => 'Chechen (Russia)',
|
||
'ceb_PH' => 'Cebuano (Philippines)',
|
||
'cgg_UG' => 'Chiga (Uganda)',
|
||
'ch_GU' => 'Chamorro (Guam)',
|
||
'chk_FM' => 'Chuukese (Micronesia)',
|
||
'crk_CA' => 'Cree, Plains (Canada)',
|
||
'cwd_CA' => 'Cree, Woods (Canada)',
|
||
'cs_CZ' => 'Czech (Czech Republic)',
|
||
'cy_GB' => 'Welsh (United Kingdom)',
|
||
'da_DK' => 'Danish (Denmark)',
|
||
'da_GL' => 'Danish (Greenland)',
|
||
'dcc_IN' => 'Deccan (India)',
|
||
'de_AT' => 'German (Austria)',
|
||
'de_BE' => 'German (Belgium)',
|
||
'de_CH' => 'German (Switzerland)',
|
||
'de_DE' => 'German (Germany)',
|
||
'de_LI' => 'German (Liechtenstein)',
|
||
'de_LU' => 'German (Luxembourg)',
|
||
'dgo_IN' => 'Dogri (India)',
|
||
'dhd_IN' => 'Dhundari (India)',
|
||
'diq_TR' => 'Dimli (Turkey)',
|
||
'dje_NE' => 'Zarma (Niger)',
|
||
'dv_MV' => 'Divehi (Maldives)',
|
||
'dz_BT' => 'Dzongkha (Bhutan)',
|
||
'ee_GH' => 'Ewe (Ghana)',
|
||
'el_CY' => 'Greek (Cyprus)',
|
||
'el_GR' => 'Greek (Greece)',
|
||
'en_AS' => 'English (American Samoa)',
|
||
'en_AU' => 'English (Australia)',
|
||
'en_BM' => 'English (Bermuda)',
|
||
'en_BS' => 'English (Bahamas)',
|
||
'en_CA' => 'English (Canada)',
|
||
'en_GB' => 'English (United Kingdom)',
|
||
'en_HK' => 'English (Hong Kong SAR China)',
|
||
'en_IE' => 'English (Ireland)',
|
||
'en_IN' => 'English (India)',
|
||
'en_JM' => 'English (Jamaica)',
|
||
'en_KE' => 'English (Kenya)',
|
||
'en_LR' => 'English (Liberia)',
|
||
'en_MM' => 'English (Myanmar)',
|
||
'en_MW' => 'English (Malawi)',
|
||
'en_MY' => 'English (Malaysia)',
|
||
'en_NZ' => 'English (New Zealand)',
|
||
'en_PH' => 'English (Philippines)',
|
||
'en_SG' => 'English (Singapore)',
|
||
'en_TT' => 'English (Trinidad and Tobago)',
|
||
'en_US' => 'English (United States)',
|
||
'en_ZA' => 'English (South Africa)',
|
||
'en_DE' => 'English (Germany)',
|
||
'en_ES' => 'English (Spain)',
|
||
'en_FR' => 'English (France)',
|
||
'en_IT' => 'English (Italy)',
|
||
'en_NL' => 'English (Netherlands)',
|
||
'eo_XX' => 'Esperanto',
|
||
'es_419' => 'Spanish (Latin America)',
|
||
'es_AR' => 'Spanish (Argentina)',
|
||
'es_BO' => 'Spanish (Bolivia)',
|
||
'es_CL' => 'Spanish (Chile)',
|
||
'es_CO' => 'Spanish (Colombia)',
|
||
'es_CR' => 'Spanish (Costa Rica)',
|
||
'es_CU' => 'Spanish (Cuba)',
|
||
'es_DO' => 'Spanish (Dominican Republic)',
|
||
'es_EC' => 'Spanish (Ecuador)',
|
||
'es_ES' => 'Spanish (Spain)',
|
||
'es_GQ' => 'Spanish (Equatorial Guinea)',
|
||
'es_GT' => 'Spanish (Guatemala)',
|
||
'es_HN' => 'Spanish (Honduras)',
|
||
'es_MX' => 'Spanish (Mexico)',
|
||
'es_NI' => 'Spanish (Nicaragua)',
|
||
'es_PA' => 'Spanish (Panama)',
|
||
'es_PE' => 'Spanish (Peru)',
|
||
'es_PH' => 'Spanish (Philippines)',
|
||
'es_PR' => 'Spanish (Puerto Rico)',
|
||
'es_PY' => 'Spanish (Paraguay)',
|
||
'es_SV' => 'Spanish (El Salvador)',
|
||
'es_US' => 'Spanish (United States)',
|
||
'es_UY' => 'Spanish (Uruguay)',
|
||
'es_VE' => 'Spanish (Venezuela)',
|
||
'et_EE' => 'Estonian (Estonia)',
|
||
'eu_ES' => 'Basque (Spain)',
|
||
'fa_AF' => 'Persian (Afghanistan)',
|
||
'fa_IR' => 'Persian (Iran)',
|
||
'fa_PK' => 'Persian (Pakistan)',
|
||
'fan_GQ' => 'Fang (Equatorial Guinea)',
|
||
'fi_FI' => 'Finnish (Finland)',
|
||
'fi_SE' => 'Finnish (Sweden)',
|
||
'fil_PH' => 'Filipino (Philippines)',
|
||
'fj_FJ' => 'Fijian (Fiji)',
|
||
'fo_FO' => 'Faroese (Faroe Islands)',
|
||
'fon_BJ' => 'Fon (Benin)',
|
||
'fr_002' => 'French (Africa)',
|
||
'fr_BE' => 'French (Belgium)',
|
||
'fr_CA' => 'French (Canada)',
|
||
'fr_CH' => 'French (Switzerland)',
|
||
'fr_DZ' => 'French (Algeria)',
|
||
'fr_FR' => 'French (France)',
|
||
'fr_GF' => 'French (French Guiana)',
|
||
'fr_GP' => 'French (Guadeloupe)',
|
||
'fr_HT' => 'French (Haiti)',
|
||
'fr_KM' => 'French (Comoros)',
|
||
'fr_MA' => 'French (Morocco)',
|
||
'fr_MQ' => 'French (Martinique)',
|
||
'fr_MU' => 'French (Mauritius)',
|
||
'fr_NC' => 'French (New Caledonia)',
|
||
'fr_PF' => 'French (French Polynesia)',
|
||
'fr_PM' => 'French (Saint Pierre and Miquelon)',
|
||
'fr_RE' => 'French (Reunion)',
|
||
'fr_SC' => 'French (Seychelles)',
|
||
'fr_SN' => 'French (Senegal)',
|
||
'fr_US' => 'French (United States)',
|
||
'fuv_NG' => 'Fulfulde (Nigeria)',
|
||
'ga_IE' => 'Irish (Ireland)',
|
||
'ga_GB' => 'Irish (United Kingdom)',
|
||
'gaa_GH' => 'Ga (Ghana)',
|
||
'gbm_IN' => 'Garhwali (India)',
|
||
'gcr_GF' => 'Guianese Creole French (French Guiana)',
|
||
'gd_GB' => 'Scottish Gaelic (United Kingdom)',
|
||
'gil_KI' => 'Gilbertese (Kiribati)',
|
||
'gl_ES' => 'Galician (Spain)',
|
||
'glk_IR' => 'Gilaki (Iran)',
|
||
'gn_PY' => 'Guarani (Paraguay)',
|
||
'gno_IN' => 'Gondi, Northern (India)',
|
||
'gsw_CH' => 'Swiss German (Switzerland)',
|
||
'gsw_LI' => 'Swiss German (Liechtenstein)',
|
||
'gu_IN' => 'Gujarati (India)',
|
||
'guz_KE' => 'Gusii (Kenya)',
|
||
'ha_NG' => 'Hausa (Nigeria)',
|
||
'ha_NE' => 'Hausa (Niger)',
|
||
'haw_US' => 'Hawaiian (United States)',
|
||
'haz_AF' => 'Hazaragi (Afghanistan)',
|
||
'he_IL' => 'Hebrew (Israel)',
|
||
'hi_IN' => 'Hindi (India)',
|
||
'hil_PH' => 'Hiligaynon (Philippines)',
|
||
'hne_IN' => 'Chhattisgarhi (India)',
|
||
'hno_PK' => 'Hindko, Northern (Pakistan)',
|
||
'hoc_IN' => 'Ho (India)',
|
||
'hr_BA' => 'Croatian (Bosnia and Herzegovina)',
|
||
'hr_HR' => 'Croatian (Croatia)',
|
||
'hr_AT' => 'Croatian (Austria)',
|
||
'ht_HT' => 'Haitian (Haiti)',
|
||
'hu_HU' => 'Hungarian (Hungary)',
|
||
'hu_AT' => 'Hungarian (Austria)',
|
||
'hu_RO' => 'Hungarian (Romania)',
|
||
'hu_RS' => 'Hungarian (Serbia)',
|
||
'hy_AM' => 'Armenian (Armenia)',
|
||
'id_ID' => 'Indonesian (Indonesia)',
|
||
'ig_NG' => 'Igbo (Nigeria)',
|
||
'ilo_PH' => 'Iloko (Philippines)',
|
||
'inh_RU' => 'Ingush (Russia)',
|
||
'is_IS' => 'Icelandic (Iceland)',
|
||
'it_CH' => 'Italian (Switzerland)',
|
||
'it_IT' => 'Italian (Italy)',
|
||
'it_SM' => 'Italian (San Marino)',
|
||
'it_FR' => 'Italian (France)',
|
||
'it_HR' => 'Italian (Croatia)',
|
||
'it_US' => 'Italian (United States)',
|
||
'iu_CA' => 'Inuktitut (Canada)',
|
||
'ja_JP' => 'Japanese (Japan)',
|
||
'jv_ID' => 'Javanese (Indonesia)',
|
||
'ka_GE' => 'Georgian (Georgia)',
|
||
'kam_KE' => 'Kamba (Kenya)',
|
||
'kbd_RU' => 'Kabardian (Russia)',
|
||
'kfy_IN' => 'Kumauni (India)',
|
||
'kha_IN' => 'Khasi (India)',
|
||
'khn_IN' => 'Khandesi (India)',
|
||
'ki_KE' => 'Kikuyu (Kenya)',
|
||
'kj_NA' => 'Kuanyama (Namibia)',
|
||
'kk_KZ' => 'Kazakh (Kazakhstan)',
|
||
'kk_CN' => 'Kazakh (China)',
|
||
'kl_GL' => 'Kalaallisut (Greenland)',
|
||
'kl_DK' => 'Kalaallisut (Denmark)',
|
||
'kln_KE' => 'Kalenjin (Kenya)',
|
||
'km_KH' => 'Khmer (Cambodia)',
|
||
'kn_IN' => 'Kannada (India)',
|
||
'ko_KR' => 'Korean (Korea)',
|
||
'koi_RU' => 'Komi-Permyak (Russia)',
|
||
'kok_IN' => 'Konkani (India)',
|
||
'kos_FM' => 'Kosraean (Micronesia)',
|
||
'kpv_RU' => 'Komi-Zyrian (Russia)',
|
||
'krc_RU' => 'Karachay-Balkar (Russia)',
|
||
'kru_IN' => 'Kurukh (India)',
|
||
'ks_IN' => 'Kashmiri (India)',
|
||
'ku_IQ' => 'Kurdish (Iraq)',
|
||
'ku_IR' => 'Kurdish (Iran)',
|
||
'ku_SY' => 'Kurdish (Syria)',
|
||
'ku_TR' => 'Kurdish (Turkey)',
|
||
'kum_RU' => 'Kumyk (Russia)',
|
||
'kxm_TH' => 'Khmer, Northern (Thailand)',
|
||
'ky_KG' => 'Kirghiz (Kyrgyzstan)',
|
||
'la_VA' => 'Latin (Vatican)',
|
||
'lah_PK' => 'Lahnda (Pakistan)',
|
||
'lb_LU' => 'Luxembourgish (Luxembourg)',
|
||
'lbe_RU' => 'Lak (Russia)',
|
||
'lc_XX' => 'LOLCAT',
|
||
'lez_RU' => 'Lezghian (Russia)',
|
||
'lg_UG' => 'Ganda (Uganda)',
|
||
'lij_IT' => 'Ligurian (Italy)',
|
||
'lij_MC' => 'Ligurian (Monaco)',
|
||
'ljp_ID' => 'Lampung (Indonesia)',
|
||
'lmn_IN' => 'Lambadi (India)',
|
||
'ln_CD' => 'Lingala (Congo - Kinshasa)',
|
||
'ln_CG' => 'Lingala (Congo - Brazzaville)',
|
||
'lo_LA' => 'Lao (Laos)',
|
||
'lrc_IR' => 'Luri, Northern (Iran)',
|
||
'lt_LT' => 'Lithuanian (Lithuania)',
|
||
'luo_KE' => 'Luo (Kenya)',
|
||
'luy_KE' => 'Luyia (Kenya)',
|
||
'lv_LV' => 'Latvian (Latvia)',
|
||
'mad_ID' => 'Madurese (Indonesia)',
|
||
'mai_IN' => 'Maithili (India)',
|
||
'mai_NP' => 'Maithili (Nepal)',
|
||
'mak_ID' => 'Makasar (Indonesia)',
|
||
'mdf_RU' => 'Moksha (Russia)',
|
||
'mdh_PH' => 'Maguindanao (Philippines)',
|
||
'mer_KE' => 'Meru (Kenya)',
|
||
'mfa_TH' => 'Malay, Pattani (Thailand)',
|
||
'mfe_MU' => 'Morisyen (Mauritius)',
|
||
'mg_MG' => 'Malagasy (Madagascar)',
|
||
'mh_MH' => 'Marshallese (Marshall Islands)',
|
||
'mi_NZ' => 'Maori (New Zealand)',
|
||
'min_ID' => 'Minangkabau (Indonesia)',
|
||
'mk_MK' => 'Macedonian (Macedonia)',
|
||
'ml_IN' => 'Malayalam (India)',
|
||
'mn_MN' => 'Mongolian (Mongolia)',
|
||
'mn_CN' => 'Mongolian (China)',
|
||
'mni_IN' => 'Manipuri (India)',
|
||
'mr_IN' => 'Marathi (India)',
|
||
'ms_BN' => 'Malay (Brunei)',
|
||
'ms_MY' => 'Malay (Malaysia)',
|
||
'ms_SG' => 'Malay (Singapore)',
|
||
'ms_CC' => 'Malay (Cocos Islands)',
|
||
'ms_ID' => 'Malay (Indonesia)',
|
||
'mt_MT' => 'Maltese (Malta)',
|
||
'mtr_IN' => 'Mewari (India)',
|
||
'mup_IN' => 'Malvi (India)',
|
||
'muw_IN' => 'Mundari (India)',
|
||
'my_MM' => 'Burmese (Myanmar)',
|
||
'myv_RU' => 'Erzya (Russia)',
|
||
'na_NR' => 'Nauru (Nauru)',
|
||
'nb_NO' => 'Norwegian Bokmal (Norway)',
|
||
'nb_SJ' => 'Norwegian Bokmal (Svalbard and Jan Mayen)',
|
||
'nd_ZW' => 'North Ndebele (Zimbabwe)',
|
||
'ndc_MZ' => 'Ndau (Mozambique)',
|
||
'ne_NP' => 'Nepali (Nepal)',
|
||
'ne_IN' => 'Nepali (India)',
|
||
'ng_NA' => 'Ndonga (Namibia)',
|
||
'ngl_MZ' => 'Lomwe (Mozambique)',
|
||
'niu_NU' => 'Niuean (Niue)',
|
||
'nl_AN' => 'Dutch (Netherlands Antilles)',
|
||
'nl_AW' => 'Dutch (Aruba)',
|
||
'nl_BE' => 'Dutch (Belgium)',
|
||
'nl_NL' => 'Dutch (Netherlands)',
|
||
'nl_SR' => 'Dutch (Suriname)',
|
||
'nn_NO' => 'Norwegian Nynorsk (Norway)',
|
||
'nod_TH' => 'Thai, Northern (Thailand)',
|
||
'noe_IN' => 'Nimadi (India)',
|
||
'nso_ZA' => 'Northern Sotho (South Africa)',
|
||
'ny_MW' => 'Nyanja (Malawi)',
|
||
'ny_ZM' => 'Nyanja (Zambia)',
|
||
'nyn_UG' => 'Nyankole (Uganda)',
|
||
'om_ET' => 'Oromo (Ethiopia)',
|
||
'or_IN' => 'Oriya (India)',
|
||
'pa_IN' => 'Punjabi (India)',
|
||
'pag_PH' => 'Pangasinan (Philippines)',
|
||
'pap_AN' => 'Papiamento (Netherlands Antilles)',
|
||
'pap_AW' => 'Papiamento (Aruba)',
|
||
'pau_PW' => 'Palauan (Palau)',
|
||
'pl_PL' => 'Polish (Poland)',
|
||
'pl_UA' => 'Polish (Ukraine)',
|
||
'pon_FM' => 'Pohnpeian (Micronesia)',
|
||
'ps_AF' => 'Pashto (Afghanistan)',
|
||
'ps_PK' => 'Pashto (Pakistan)',
|
||
'pt_AO' => 'Portuguese (Angola)',
|
||
'pt_BR' => 'Portuguese (Brazil)',
|
||
'pt_CV' => 'Portuguese (Cape Verde)',
|
||
'pt_GW' => 'Portuguese (Guinea-Bissau)',
|
||
'pt_MZ' => 'Portuguese (Mozambique)',
|
||
'pt_PT' => 'Portuguese (Portugal)',
|
||
'pt_ST' => 'Portuguese (Sao Tome and Principe)',
|
||
'pt_TL' => 'Portuguese (East Timor)',
|
||
'qu_BO' => 'Quechua (Bolivia)',
|
||
'qu_PE' => 'Quechua (Peru)',
|
||
'rcf_RE' => 'R<>union Creole French (Reunion)',
|
||
'rej_ID' => 'Rejang (Indonesia)',
|
||
'rif_MA' => 'Tarifit (Morocco)',
|
||
'rjb_IN' => 'Rajbanshi (India)',
|
||
'rm_CH' => 'Rhaeto-Romance (Switzerland)',
|
||
'rmt_IR' => 'Domari (Iran)',
|
||
'rn_BI' => 'Rundi (Burundi)',
|
||
'ro_MD' => 'Romanian (Moldova)',
|
||
'ro_RO' => 'Romanian (Romania)',
|
||
'ro_RS' => 'Romanian (Serbia)',
|
||
'ru_BY' => 'Russian (Belarus)',
|
||
'ru_KG' => 'Russian (Kyrgyzstan)',
|
||
'ru_KZ' => 'Russian (Kazakhstan)',
|
||
'ru_RU' => 'Russian (Russia)',
|
||
'ru_SJ' => 'Russian (Svalbard and Jan Mayen)',
|
||
'ru_UA' => 'Russian (Ukraine)',
|
||
'rw_RW' => 'Kinyarwanda (Rwanda)',
|
||
'sa_IN' => 'Sanskrit (India)',
|
||
'sah_RU' => 'Yakut (Russia)',
|
||
'sas_ID' => 'Sasak (Indonesia)',
|
||
'sat_IN' => 'Santali (India)',
|
||
'sck_IN' => 'Sadri (India)',
|
||
'sco_GB' => 'Scots (United Kingdom)',
|
||
'sd_IN' => 'Sindhi (India)',
|
||
'sd_PK' => 'Sindhi (Pakistan)',
|
||
'se_NO' => 'Northern Sami (Norway)',
|
||
'sg_CF' => 'Sango (Central African Republic)',
|
||
'si_LK' => 'Sinhalese (Sri Lanka)',
|
||
'sid_ET' => 'Sidamo (Ethiopia)',
|
||
'sk_SK' => 'Slovak (Slovakia)',
|
||
'sk_RS' => 'Slovak (Serbia)',
|
||
'sl_SI' => 'Slovenian (Slovenia)',
|
||
'sl_AT' => 'Slovenian (Austria)',
|
||
'sm_AS' => 'Samoan (American Samoa)',
|
||
'sm_WS' => 'Samoan (Samoa)',
|
||
'sn_ZW' => 'Shona (Zimbabwe)',
|
||
'so_SO' => 'Somali (Somalia)',
|
||
'so_DJ' => 'Somali (Djibouti)',
|
||
'so_ET' => 'Somali (Ethiopia)',
|
||
'sou_TH' => 'Thai, Southern (Thailand)',
|
||
'sq_AL' => 'Albanian (Albania)',
|
||
'sr_BA' => 'Serbian (Bosnia and Herzegovina)',
|
||
'sr_ME' => 'Serbian (Montenegro)',
|
||
'sr_RS' => 'Serbian (Serbia)',
|
||
'ss_SZ' => 'Swati (Swaziland)',
|
||
'ss_ZA' => 'Swati (South Africa)',
|
||
'st_LS' => 'Southern Sotho (Lesotho)',
|
||
'st_ZA' => 'Southern Sotho (South Africa)',
|
||
'su_ID' => 'Sundanese (Indonesia)',
|
||
'sv_AX' => 'Swedish (Aland Islands)',
|
||
'sv_FI' => 'Swedish (Finland)',
|
||
'sv_SE' => 'Swedish (Sweden)',
|
||
'sw_KE' => 'Swahili (Kenya)',
|
||
'sw_TZ' => 'Swahili (Tanzania)',
|
||
'sw_UG' => 'Swahili (Uganda)',
|
||
'sw_SO' => 'Swahili (Somalia)',
|
||
'swb_KM' => 'Comorian (Comoros)',
|
||
'swb_YT' => 'Comorian (Mayotte)',
|
||
'swv_IN' => 'Shekhawati (India)',
|
||
'ta_IN' => 'Tamil (India)',
|
||
'ta_LK' => 'Tamil (Sri Lanka)',
|
||
'ta_SG' => 'Tamil (Singapore)',
|
||
'ta_MY' => 'Tamil (Malaysia)',
|
||
'tcy_IN' => 'Tulu (India)',
|
||
'te_IN' => 'Telugu (India)',
|
||
'tet_TL' => 'Tetum (East Timor)',
|
||
'tg_TJ' => 'Tajik (Tajikistan)',
|
||
'th_TH' => 'Thai (Thailand)',
|
||
'ti_ER' => 'Tigrinya (Eritrea)',
|
||
'ti_ET' => 'Tigrinya (Ethiopia)',
|
||
'tk_TM' => 'Turkmen (Turkmenistan)',
|
||
'tk_IR' => 'Turkmen (Iran)',
|
||
'tkl_TK' => 'Tokelau (Tokelau)',
|
||
'tl_PH' => 'Tagalog (Philippines)',
|
||
'tl_US' => 'Tagalog (United States)',
|
||
'tn_BW' => 'Tswana (Botswana)',
|
||
'tn_ZA' => 'Tswana (South Africa)',
|
||
'to_TO' => 'Tonga (Tonga)',
|
||
'tr_CY' => 'Turkish (Cyprus)',
|
||
'tr_TR' => 'Turkish (Turkey)',
|
||
'tr_DE' => 'Turkish (Germany)',
|
||
'tr_MK' => 'Turkish (Macedonia)',
|
||
'ts_ZA' => 'Tsonga (South Africa)',
|
||
'ts_MZ' => 'Tsonga (Mozambique)',
|
||
'tsg_PH' => 'Tausug (Philippines)',
|
||
'tt_RU' => 'Tatar (Russia)',
|
||
'tts_TH' => 'Thai, Northeastern (Thailand)',
|
||
'tvl_TV' => 'Tuvalu (Tuvalu)',
|
||
'tw_GH' => 'Twi (Ghana)',
|
||
'ty_PF' => 'Tahitian (French Polynesia)',
|
||
'tyv_RU' => 'Tuvinian (Russia)',
|
||
'tzm_MA' => 'Tamazight, Central Atlas (Morocco)',
|
||
'udm_RU' => 'Udmurt (Russia)',
|
||
'ug_CN' => 'Uighur (China)',
|
||
'uk_UA' => 'Ukrainian (Ukraine)',
|
||
'uli_FM' => 'Ulithian (Micronesia)',
|
||
'ur_IN' => 'Urdu (India)',
|
||
'ur_PK' => 'Urdu (Pakistan)',
|
||
'uz_UZ' => 'Uzbek (Uzbekistan)',
|
||
'uz_AF' => 'Uzbek (Afghanistan)',
|
||
've_ZA' => 'Venda (South Africa)',
|
||
'vi_VN' => 'Vietnamese (Vietnam)',
|
||
'vi_US' => 'Vietnamese (United States)',
|
||
'vmw_MZ' => 'Waddar (Mozambique)',
|
||
'wal_ET' => 'Walamo (Ethiopia)',
|
||
'war_PH' => 'Waray (Philippines)',
|
||
'wbq_IN' => 'Waddar (India)',
|
||
'wbr_IN' => 'Wagdi (India)',
|
||
'wo_MR' => 'Wolof (Mauritania)',
|
||
'wo_SN' => 'Wolof (Senegal)',
|
||
'wtm_IN' => 'Mewati (India)',
|
||
'xh_ZA' => 'Xhosa (South Africa)',
|
||
'xnr_IN' => 'Kangri (India)',
|
||
'xog_UG' => 'Soga (Uganda)',
|
||
'yap_FM' => 'Yapese (Micronesia)',
|
||
'yo_NG' => 'Yoruba (Nigeria)',
|
||
'za_CN' => 'Zhuang (China)',
|
||
'zh_CN' => 'Chinese (China)',
|
||
'zh_HK' => 'Chinese (Hong Kong SAR China)',
|
||
'zh_MO' => 'Chinese (Macao SAR China)',
|
||
'zh_SG' => 'Chinese (Singapore)',
|
||
'zh_TW' => 'Chinese (Taiwan)',
|
||
'zh_US' => 'Chinese (United States)',
|
||
'zu_ZA' => 'Zulu (South Africa)',
|
||
);
|
||
|
||
/**
|
||
* @var array $common_languages A list of commonly used languages, in the form
|
||
* langcode => array( EnglishName, NativeName)
|
||
*/
|
||
public static $common_languages = array(
|
||
'af' => array('Afrikaans', 'Afrikaans'),
|
||
'sq' => array('Albanian', 'shqip'),
|
||
'ar' => array('Arabic', 'العربية'),
|
||
'eu' => array('Basque', 'euskera'),
|
||
'be' => array('Belarusian', 'Беларуская мова'),
|
||
'bn' => array('Bengali', 'বাংলা'),
|
||
'bg' => array('Bulgarian', 'български'),
|
||
'ca' => array('Catalan', 'català'),
|
||
'zh-yue' => array('Chinese (Cantonese)', '廣東話 [广东话]'),
|
||
'zh-cmn' => array('Chinese (Mandarin)', '普通話 [普通话]'),
|
||
'zh-min-nan' => array('Chinese (Min Nan)', '台語'),
|
||
'hr' => array('Croatian', 'Hrvatski'),
|
||
'cs' => array('Czech', 'čeština'),
|
||
'da' => array('Danish', 'dansk'),
|
||
'nl' => array('Dutch', 'Nederlands'),
|
||
'en' => array('English', 'English'),
|
||
'eo' => array('Esperanto', 'Esperanto'),
|
||
'et' => array('Estonian', 'eesti keel'),
|
||
'fo' => array('Faroese', 'Føroyska'),
|
||
'fi' => array('Finnish', 'suomi'),
|
||
'fr' => array('French', 'français'),
|
||
'gd' => array('Gaelic', 'Gaeilge'),
|
||
'gl' => array('Galician', 'Galego'),
|
||
'de' => array('German', 'Deutsch'),
|
||
'el' => array('Greek', 'ελληνικά'),
|
||
'gu' => array('Gujarati', 'ગુજરાતી'),
|
||
'ha' => array('Hausa', 'حَوْسَ'),
|
||
'he' => array('Hebrew', 'עברית'),
|
||
'hi' => array('Hindi', 'हिन्दी'),
|
||
'hu' => array('Hungarian', 'magyar'),
|
||
'is' => array('Icelandic', 'Íslenska'),
|
||
'io' => array('Ido', 'Ido'),
|
||
'id' => array('Indonesian', 'Bahasa Indonesia'),
|
||
'ga' => array('Irish', 'Irish'),
|
||
'it' => array('Italian', 'italiano'),
|
||
'ja' => array('Japanese', '日本語'),
|
||
'jv' => array('Javanese', 'basa Jawa'),
|
||
'ko' => array('Korean', '한국어 [韓國語]'),
|
||
'ku' => array('Kurdish', 'Kurdí'),
|
||
'lv' => array('Latvian', 'latviešu'),
|
||
'lt' => array('Lithuanian', 'lietuviškai'),
|
||
'lmo' => array('Lombard', 'Lombardo'),
|
||
'mk' => array('Macedonian', 'македонски'),
|
||
'mi' => array('Maori', 'Māori'),
|
||
'ms' => array('Malay', 'Bahasa melayu'),
|
||
'mt' => array('Maltese', 'Malti'),
|
||
'mr' => array('Marathi', 'मराठी'),
|
||
'ne' => array('Nepali', 'नेपाली'),
|
||
'no' => array('Norwegian', 'Norsk'),
|
||
'om' => array('Oromo', 'Afaan Oromo'),
|
||
'fa' => array('Persian', 'فارسى'),
|
||
'pl' => array('Polish', 'polski'),
|
||
'pt-PT' => array('Portuguese (Portugal)', 'português (Portugal)'),
|
||
'pt-BR' => array('Portuguese (Brazil)', 'português (Brazil)'),
|
||
'pa' => array('Punjabi', 'ਪੰਜਾਬੀ'),
|
||
'qu' => array('Quechua', 'Quechua'),
|
||
'rm' => array('Romansh', 'rumantsch'),
|
||
'ro' => array('Romanian', 'român'),
|
||
'ru' => array('Russian', 'Русский'),
|
||
'sco' => array('Scots', 'Scoats leid, Lallans'),
|
||
'sr' => array('Serbian', 'српски'),
|
||
'sk' => array('Slovak', 'slovenčina'),
|
||
'sl' => array('Slovenian', 'slovenščina'),
|
||
'es' => array('Spanish', 'español'),
|
||
'sv' => array('Swedish', 'Svenska'),
|
||
'tl' => array('Tagalog', 'Tagalog'),
|
||
'ta' => array('Tamil', 'தமிழ்'),
|
||
'te' => array('Telugu', 'తెలుగు'),
|
||
'to' => array('Tonga', 'chiTonga'),
|
||
'ts' => array('Tsonga', 'xiTshonga'),
|
||
'tn' => array('Tswana', 'seTswana'),
|
||
'tr' => array('Turkish', 'Türkçe'),
|
||
'tk' => array('Turkmen', 'түркmенче'),
|
||
'tw' => array('Twi', 'twi'),
|
||
'uk' => array('Ukrainian', 'Українська'),
|
||
'ur' => array('Urdu', 'اردو'),
|
||
'uz' => array('Uzbek', 'ўзбек'),
|
||
've' => array('Venda', 'tshiVenḓa'),
|
||
'vi' => array('Vietnamese', 'tiếng việt'),
|
||
'wa' => array('Walloon', 'walon'),
|
||
'wo' => array('Wolof', 'Wollof'),
|
||
'xh' => array('Xhosa', 'isiXhosa'),
|
||
'yi' => array('Yiddish', 'ײִדיש'),
|
||
'zu' => array('Zulu', 'isiZulu')
|
||
);
|
||
|
||
/**
|
||
* @var array $common_locales
|
||
* Sorted alphabtically by the common language name,
|
||
* not the locale key.
|
||
*/
|
||
public static $common_locales = array(
|
||
'af_ZA' => array('Afrikaans', 'Afrikaans'),
|
||
'sq_AL' => array('Albanian', 'shqip'),
|
||
'ar_EG' => array('Arabic', 'العربية'),
|
||
'eu_ES' => array('Basque', 'euskera'),
|
||
'be_BY' => array('Belarusian', 'Беларуская мова'),
|
||
'bn_BD' => array('Bengali', 'বাংলা'),
|
||
'bg_BG' => array('Bulgarian', 'български'),
|
||
'ca_ES' => array('Catalan', 'català'),
|
||
'zh-yue_ZH-YUE' => array('Chinese (Cantonese)', '廣東話 [广东话]'),
|
||
'zh-cmn_ZH-CMN' => array('Chinese (Mandarin)', '普通話 [普通话]'),
|
||
'zh-min-nan_ZH-MIN-NAN' => array('Chinese (Min Nan)', '台語'),
|
||
'hr_HR' => array('Croatian', 'Hrvatski'),
|
||
'cs_CZ' => array('Czech', 'čeština'),
|
||
'cy_GB' => array('Welsh', 'Welsh/Cymraeg'),
|
||
'da_DK' => array('Danish', 'dansk'),
|
||
'nl_NL' => array('Dutch', 'Nederlands'),
|
||
'en_US' => array('English', 'English'),
|
||
'eo_EO' => array('Esperanto', 'Esperanto'),
|
||
'et_EE' => array('Estonian', 'eesti keel'),
|
||
'fo_FO' => array('Faroese', 'Føroyska'),
|
||
'fi_FI' => array('Finnish', 'suomi'),
|
||
'fr_FR' => array('French', 'français'),
|
||
'gd_GB' => array('Gaelic', 'Gaeilge'),
|
||
'gl_ES' => array('Galician', 'Galego'),
|
||
'de_DE' => array('German', 'Deutsch'),
|
||
'el_GR' => array('Greek', 'ελληνικά'),
|
||
'gu_IN' => array('Gujarati', 'ગુજરાતી'),
|
||
'ha_NG' => array('Hausa', 'حَوْسَ'),
|
||
'he_IL' => array('Hebrew', 'עברית'),
|
||
'hi_IN' => array('Hindi', 'हिन्दी'),
|
||
'hu_HU' => array('Hungarian', 'magyar'),
|
||
'is_IS' => array('Icelandic', 'Íslenska'),
|
||
'io_IO' => array('Ido', 'Ido'),
|
||
'id_ID' => array('Indonesian', 'Bahasa Indonesia'),
|
||
'ga_IE' => array('Irish', 'Irish'),
|
||
'it_IT' => array('Italian', 'italiano'),
|
||
'ja_JP' => array('Japanese', '日本語'),
|
||
'jv_ID' => array('Javanese', 'basa Jawa'),
|
||
'ko_KR' => array('Korean', '한국어 [韓國語]'),
|
||
'ku_IQ' => array('Kurdish', 'Kurdí'),
|
||
'lv_LV' => array('Latvian', 'latviešu'),
|
||
'lt_LT' => array('Lithuanian', 'lietuviškai'),
|
||
'lmo_LMO' => array('Lombard', 'Lombardo'),
|
||
'mk_MK' => array('Macedonian', 'македонски'),
|
||
'mi_NZ' => array('Maori', 'Maori'),
|
||
'ms_MY' => array('Malay', 'Bahasa melayu'),
|
||
'mt_MT' => array('Maltese', 'Malti'),
|
||
'mr_IN' => array('Marathi', 'मराठी'),
|
||
'ne_NP' => array('Nepali', 'नेपाली'),
|
||
'no_NO' => array('Norwegian', 'Norsk'),
|
||
'om_ET' => array('Oromo', 'Afaan Oromo'),
|
||
'fa_IR' => array('Persian', 'فارسى'),
|
||
'pl_PL' => array('Polish', 'polski'),
|
||
'pt-PT_PT-PT' => array('Portuguese (Portugal)', 'português (Portugal)'),
|
||
'pt-BR_PT-BR' => array('Portuguese (Brazil)', 'português (Brazil)'),
|
||
'pa_IN' => array('Punjabi', 'ਪੰਜਾਬੀ'),
|
||
'qu_PE' => array('Quechua', 'Quechua'),
|
||
'rm_CH' => array('Romansh', 'rumantsch'),
|
||
'ro_RO' => array('Romanian', 'român'),
|
||
'ru_RU' => array('Russian', 'Русский'),
|
||
'sco_SCO' => array('Scots', 'Scoats leid, Lallans'),
|
||
'sr_RS' => array('Serbian', 'српски'),
|
||
'sk_SK' => array('Slovak', 'slovenčina'),
|
||
'sl_SI' => array('Slovenian', 'slovenščina'),
|
||
'es_ES' => array('Spanish', 'español'),
|
||
'sv_SE' => array('Swedish', 'Svenska'),
|
||
'tl_PH' => array('Tagalog', 'Tagalog'),
|
||
'ta_IN' => array('Tamil', 'தமிழ்'),
|
||
'te_IN' => array('Telugu', 'తెలుగు'),
|
||
'to_TO' => array('Tonga', 'chiTonga'),
|
||
'ts_ZA' => array('Tsonga', 'xiTshonga'),
|
||
'tn_ZA' => array('Tswana', 'seTswana'),
|
||
'tr_TR' => array('Turkish', 'Türkçe'),
|
||
'tk_TM' => array('Turkmen', 'түркmенче'),
|
||
'tw_GH' => array('Twi', 'twi'),
|
||
'uk_UA' => array('Ukrainian', 'Українська'),
|
||
'ur_PK' => array('Urdu', 'اردو'),
|
||
'uz_UZ' => array('Uzbek', 'ўзбек'),
|
||
've_ZA' => array('Venda', 'tshiVenḓa'),
|
||
'vi_VN' => array('Vietnamese', 'tiếng việt'),
|
||
'wa_WA' => array('Walloon', 'walon'),
|
||
'wo_SN' => array('Wolof', 'Wollof'),
|
||
'xh_ZA' => array('Xhosa', 'isiXhosa'),
|
||
'yi_YI' => array('Yiddish', 'ײִדיש'),
|
||
'zu_ZA' => array('Zulu', 'isiZulu'),
|
||
);
|
||
|
||
static $tinymce_lang = array(
|
||
'ca_AD' => 'ca',
|
||
'ca_ES' => 'ca',
|
||
'cs_CZ' => 'cs',
|
||
'cy_GB' => 'cy',
|
||
'da_DK' => 'da',
|
||
'da_GL' => 'da',
|
||
'de_AT' => 'de',
|
||
'de_BE' => 'de',
|
||
'de_CH' => 'de',
|
||
'de_DE' => 'de',
|
||
'de_LI' => 'de',
|
||
'de_LU' => 'de',
|
||
'de_BR' => 'de',
|
||
'de_US' => 'de',
|
||
'el_CY' => 'el',
|
||
'el_GR' => 'el',
|
||
'es_AR' => 'es',
|
||
'es_BO' => 'es',
|
||
'es_CL' => 'es',
|
||
'es_CO' => 'es',
|
||
'es_CR' => 'es',
|
||
'es_CU' => 'es',
|
||
'es_DO' => 'es',
|
||
'es_EC' => 'es',
|
||
'es_ES' => 'es',
|
||
'es_GQ' => 'es',
|
||
'es_GT' => 'es',
|
||
'es_HN' => 'es',
|
||
'es_MX' => 'es',
|
||
'es_NI' => 'es',
|
||
'es_PA' => 'es',
|
||
'es_PE' => 'es',
|
||
'es_PH' => 'es',
|
||
'es_PR' => 'es',
|
||
'es_PY' => 'es',
|
||
'es_SV' => 'es',
|
||
'es_UY' => 'es',
|
||
'es_VE' => 'es',
|
||
'es_AD' => 'es',
|
||
'es_BZ' => 'es',
|
||
'es_US' => 'es',
|
||
'fa_AF' => 'fa',
|
||
'fa_IR' => 'fa',
|
||
'fa_PK' => 'fa',
|
||
'fi_FI' => 'fi',
|
||
'fi_SE' => 'fi',
|
||
'fr_BE' => 'fr',
|
||
'fr_BF' => 'fr',
|
||
'fr_BI' => 'fr',
|
||
'fr_BJ' => 'fr',
|
||
'fr_CA' => 'fr_ca',
|
||
'fr_CF' => 'fr',
|
||
'fr_CG' => 'fr',
|
||
'fr_CH' => 'fr',
|
||
'fr_CI' => 'fr',
|
||
'fr_CM' => 'fr',
|
||
'fr_DJ' => 'fr',
|
||
'fr_DZ' => 'fr',
|
||
'fr_FR' => 'fr',
|
||
'fr_GA' => 'fr',
|
||
'fr_GF' => 'fr',
|
||
'fr_GN' => 'fr',
|
||
'fr_GP' => 'fr',
|
||
'fr_HT' => 'fr',
|
||
'fr_KM' => 'fr',
|
||
'fr_LU' => 'fr',
|
||
'fr_MA' => 'fr',
|
||
'fr_MC' => 'fr',
|
||
'fr_MG' => 'fr',
|
||
'fr_ML' => 'fr',
|
||
'fr_MQ' => 'fr',
|
||
'fr_MU' => 'fr',
|
||
'fr_NC' => 'fr',
|
||
'fr_NE' => 'fr',
|
||
'fr_PF' => 'fr',
|
||
'fr_PM' => 'fr',
|
||
'fr_RE' => 'fr',
|
||
'fr_RW' => 'fr',
|
||
'fr_SC' => 'fr',
|
||
'fr_SN' => 'fr',
|
||
'fr_SY' => 'fr',
|
||
'fr_TD' => 'fr',
|
||
'fr_TG' => 'fr',
|
||
'fr_TN' => 'fr',
|
||
'fr_VU' => 'fr',
|
||
'fr_WF' => 'fr',
|
||
'fr_YT' => 'fr',
|
||
'fr_GB' => 'fr',
|
||
'fr_US' => 'fr',
|
||
'he_IL' => 'he',
|
||
'hu_HU' => 'hu',
|
||
'hu_AT' => 'hu',
|
||
'hu_RO' => 'hu',
|
||
'hu_RS' => 'hu',
|
||
'is_IS' => 'is',
|
||
'it_CH' => 'it',
|
||
'it_IT' => 'it',
|
||
'it_SM' => 'it',
|
||
'it_FR' => 'it',
|
||
'it_HR' => 'it',
|
||
'it_US' => 'it',
|
||
'it_VA' => 'it',
|
||
'ja_JP' => 'ja',
|
||
'ko_KP' => 'ko',
|
||
'ko_KR' => 'ko',
|
||
'ko_CN' => 'ko',
|
||
'nb_NO' => 'nb',
|
||
'nb_SJ' => 'nb',
|
||
'nl_AN' => 'nl',
|
||
'nl_AW' => 'nl',
|
||
'nl_BE' => 'nl',
|
||
'nl_NL' => 'nl',
|
||
'nl_SR' => 'nl',
|
||
'nn_NO' => 'nn',
|
||
'pl_PL' => 'pl',
|
||
'pl_UA' => 'pl',
|
||
'pt_AO' => 'pt_br',
|
||
'pt_BR' => 'pt_br',
|
||
'pt_CV' => 'pt_br',
|
||
'pt_GW' => 'pt_br',
|
||
'pt_MZ' => 'pt_br',
|
||
'pt_PT' => 'pt_br',
|
||
'pt_ST' => 'pt_br',
|
||
'pt_TL' => 'pt_br',
|
||
'ro_MD' => 'ro',
|
||
'ro_RO' => 'ro',
|
||
'ro_RS' => 'ro',
|
||
'ru_BY' => 'ru',
|
||
'ru_KG' => 'ru',
|
||
'ru_KZ' => 'ru',
|
||
'ru_RU' => 'ru',
|
||
'ru_SJ' => 'ru',
|
||
'ru_UA' => 'ru',
|
||
'si_LK' => 'si',
|
||
'sk_SK' => 'sk',
|
||
'sk_RS' => 'sk',
|
||
'sq_AL' => 'sq',
|
||
'sr_BA' => 'sr',
|
||
'sr_ME' => 'sr',
|
||
'sr_RS' => 'sr',
|
||
'sv_FI' => 'sv',
|
||
'sv_SE' => 'sv',
|
||
'tr_CY' => 'tr',
|
||
'tr_TR' => 'tr',
|
||
'tr_DE' => 'tr',
|
||
'tr_MK' => 'tr',
|
||
'uk_UA' => 'uk',
|
||
'vi_VN' => 'vi',
|
||
'vi_US' => 'vi',
|
||
'zh_CN' => 'zh_cn',
|
||
'zh_HK' => 'zh_cn',
|
||
'zh_MO' => 'zh_cn',
|
||
'zh_SG' => 'zh_cn',
|
||
'zh_TW' => 'zh_tw',
|
||
'zh_ID' => 'zh_cn',
|
||
'zh_MY' => 'zh_cn',
|
||
'zh_TH' => 'zh_cn',
|
||
'zh_US' => 'zn_cn',
|
||
|
||
);
|
||
|
||
/**
|
||
* @var array $likely_subtags Provides you "likely locales"
|
||
* for a given "short" language code. This is a guess,
|
||
* as we can't disambiguate from e.g. "en" to "en_US" - it
|
||
* could also mean "en_UK".
|
||
* @see http://www.unicode.org/cldr/data/charts/supplemental/likely_subtags.html
|
||
*/
|
||
static $likely_subtags = array(
|
||
'aa' => 'aa_ET',
|
||
'ab' => 'ab_GE',
|
||
'ady' => 'ady_RU',
|
||
'af' => 'af_ZA',
|
||
'ak' => 'ak_GH',
|
||
'am' => 'am_ET',
|
||
'ar' => 'ar_EG',
|
||
'as' => 'as_IN',
|
||
'ast' => 'ast_ES',
|
||
'av' => 'av_RU',
|
||
'ay' => 'ay_BO',
|
||
'az' => 'az_AZ',
|
||
'az_Cyrl' => 'az_AZ',
|
||
'az_Arab' => 'az_IR',
|
||
'az_IR' => 'az_IR',
|
||
'ba' => 'ba_RU',
|
||
'be' => 'be_BY',
|
||
'bg' => 'bg_BG',
|
||
'bi' => 'bi_VU',
|
||
'bn' => 'bn_BD',
|
||
'bo' => 'bo_CN',
|
||
'bs' => 'bs_BA',
|
||
'ca' => 'ca_ES',
|
||
'ce' => 'ce_RU',
|
||
'ceb' => 'ceb_PH',
|
||
'ch' => 'ch_GU',
|
||
'chk' => 'chk_FM',
|
||
'crk' => 'crk_CA',
|
||
'cs' => 'cs_CZ',
|
||
'cwd' => 'cwd_CA',
|
||
'cy' => 'cy_GB',
|
||
'da' => 'da_DK',
|
||
'de' => 'de_DE',
|
||
'dv' => 'dv_MV',
|
||
'dz' => 'dz_BT',
|
||
'ee' => 'ee_GH',
|
||
'efi' => 'efi_NG',
|
||
'el' => 'el_GR',
|
||
'en' => 'en_US',
|
||
'es' => 'es_ES',
|
||
'et' => 'et_EE',
|
||
'eu' => 'eu_ES',
|
||
'fa' => 'fa_IR',
|
||
'fi' => 'fi_FI',
|
||
'fil' => 'fil_PH',
|
||
'fj' => 'fj_FJ',
|
||
'fo' => 'fo_FO',
|
||
'fr' => 'fr_FR',
|
||
'fur' => 'fur_IT',
|
||
'fy' => 'fy_NL',
|
||
'ga' => 'ga_IE',
|
||
'gaa' => 'gaa_GH',
|
||
'gd' => 'gd_GB',
|
||
'gil' => 'gil_KI',
|
||
'gl' => 'gl_ES',
|
||
'gn' => 'gn_PY',
|
||
'gu' => 'gu_IN',
|
||
'ha' => 'ha_NG',
|
||
'ha_Arab' => 'ha_SD',
|
||
'ha_SD' => 'ha_SD',
|
||
'haw' => 'haw_US',
|
||
'he' => 'he_IL',
|
||
'hi' => 'hi_IN',
|
||
'hil' => 'hil_PH',
|
||
'ho' => 'ho_PG',
|
||
'hr' => 'hr_HR',
|
||
'ht' => 'ht_HT',
|
||
'hu' => 'hu_HU',
|
||
'hy' => 'hy_AM',
|
||
'id' => 'id_ID',
|
||
'ig' => 'ig_NG',
|
||
'ii' => 'ii_CN',
|
||
'ilo' => 'ilo_PH',
|
||
'inh' => 'inh_RU',
|
||
'is' => 'is_IS',
|
||
'it' => 'it_IT',
|
||
'iu' => 'iu_CA',
|
||
'ja' => 'ja_JP',
|
||
'jv' => 'jv_ID',
|
||
'ka' => 'ka_GE',
|
||
'kaj' => 'kaj_NG',
|
||
'kam' => 'kam_KE',
|
||
'kbd' => 'kbd_RU',
|
||
'kha' => 'kha_IN',
|
||
'kk' => 'kk_KZ',
|
||
'kl' => 'kl_GL',
|
||
'km' => 'km_KH',
|
||
'kn' => 'kn_IN',
|
||
'ko' => 'ko_KR',
|
||
'koi' => 'koi_RU',
|
||
'kok' => 'kok_IN',
|
||
'kos' => 'kos_FM',
|
||
'kpe' => 'kpe_LR',
|
||
'kpv' => 'kpv_RU',
|
||
'krc' => 'krc_RU',
|
||
'ks' => 'ks_IN',
|
||
'ku' => 'ku_IQ',
|
||
'ku_Latn' => 'ku_TR',
|
||
'ku_TR' => 'ku_TR',
|
||
'kum' => 'kum_RU',
|
||
'ky' => 'ky_KG',
|
||
'la' => 'la_VA',
|
||
'lah' => 'lah_PK',
|
||
'lb' => 'lb_LU',
|
||
'lbe' => 'lbe_RU',
|
||
'lez' => 'lez_RU',
|
||
'ln' => 'ln_CD',
|
||
'lo' => 'lo_LA',
|
||
'lt' => 'lt_LT',
|
||
'lv' => 'lv_LV',
|
||
'mai' => 'mai_IN',
|
||
'mdf' => 'mdf_RU',
|
||
'mdh' => 'mdh_PH',
|
||
'mg' => 'mg_MG',
|
||
'mh' => 'mh_MH',
|
||
'mi' => 'mi_NZ',
|
||
'mk' => 'mk_MK',
|
||
'ml' => 'ml_IN',
|
||
'mn' => 'mn_MN',
|
||
'mn_CN' => 'mn_CN',
|
||
'mn_Mong' => 'mn_CN',
|
||
'mr' => 'mr_IN',
|
||
'ms' => 'ms_MY',
|
||
'mt' => 'mt_MT',
|
||
'my' => 'my_MM',
|
||
'myv' => 'myv_RU',
|
||
'na' => 'na_NR',
|
||
'nb' => 'nb_NO',
|
||
'ne' => 'ne_NP',
|
||
'niu' => 'niu_NU',
|
||
'nl' => 'nl_NL',
|
||
'nn' => 'nn_NO',
|
||
'nr' => 'nr_ZA',
|
||
'nso' => 'nso_ZA',
|
||
'ny' => 'ny_MW',
|
||
'om' => 'om_ET',
|
||
'or' => 'or_IN',
|
||
'os' => 'os_GE',
|
||
'pa' => 'pa_IN',
|
||
'pa_Arab' => 'pa_PK',
|
||
'pa_PK' => 'pa_PK',
|
||
'pag' => 'pag_PH',
|
||
'pap' => 'pap_AN',
|
||
'pau' => 'pau_PW',
|
||
'pl' => 'pl_PL',
|
||
'pon' => 'pon_FM',
|
||
'ps' => 'ps_AF',
|
||
'pt' => 'pt_BR',
|
||
'qu' => 'qu_PE',
|
||
'rm' => 'rm_CH',
|
||
'rn' => 'rn_BI',
|
||
'ro' => 'ro_RO',
|
||
'ru' => 'ru_RU',
|
||
'rw' => 'rw_RW',
|
||
'sa' => 'sa_IN',
|
||
'sah' => 'sah_RU',
|
||
'sat' => 'sat_IN',
|
||
'sd' => 'sd_IN',
|
||
'se' => 'se_NO',
|
||
'sg' => 'sg_CF',
|
||
'si' => 'si_LK',
|
||
'sid' => 'sid_ET',
|
||
'sk' => 'sk_SK',
|
||
'sl' => 'sl_SI',
|
||
'sm' => 'sm_WS',
|
||
'sn' => 'sn_ZW',
|
||
'so' => 'so_SO',
|
||
'sq' => 'sq_AL',
|
||
'sr' => 'sr_RS',
|
||
'ss' => 'ss_ZA',
|
||
'st' => 'st_ZA',
|
||
'su' => 'su_ID',
|
||
'sv' => 'sv_SE',
|
||
'sw' => 'sw_TZ',
|
||
'swb' => 'swb_KM',
|
||
'ta' => 'ta_IN',
|
||
'te' => 'te_IN',
|
||
'tet' => 'tet_TL',
|
||
'tg' => 'tg_TJ',
|
||
'th' => 'th_TH',
|
||
'ti' => 'ti_ET',
|
||
'tig' => 'tig_ER',
|
||
'tk' => 'tk_TM',
|
||
'tkl' => 'tkl_TK',
|
||
'tl' => 'tl_PH',
|
||
'tn' => 'tn_ZA',
|
||
'to' => 'to_TO',
|
||
'tpi' => 'tpi_PG',
|
||
'tr' => 'tr_TR',
|
||
'trv' => 'trv_TW',
|
||
'ts' => 'ts_ZA',
|
||
'tsg' => 'tsg_PH',
|
||
'tt' => 'tt_RU',
|
||
'tts' => 'tts_TH',
|
||
'tvl' => 'tvl_TV',
|
||
'tw' => 'tw_GH',
|
||
'ty' => 'ty_PF',
|
||
'tyv' => 'tyv_RU',
|
||
'udm' => 'udm_RU',
|
||
'ug' => 'ug_CN',
|
||
'uk' => 'uk_UA',
|
||
'uli' => 'uli_FM',
|
||
'und' => 'en_US',
|
||
'und_AD' => 'ca_AD',
|
||
'und_AE' => 'ar_AE',
|
||
'und_AF' => 'fa_AF',
|
||
'und_AL' => 'sq_AL',
|
||
'und_AM' => 'hy_AM',
|
||
'und_AN' => 'pap_AN',
|
||
'und_AO' => 'pt_AO',
|
||
'und_AR' => 'es_AR',
|
||
'und_AS' => 'sm_AS',
|
||
'und_AT' => 'de_AT',
|
||
'und_AW' => 'nl_AW',
|
||
'und_AX' => 'sv_AX',
|
||
'und_AZ' => 'az_AZ',
|
||
'und_Arab' => 'ar_EG',
|
||
'und_Arab_CN' => 'ug_CN',
|
||
'und_Arab_DJ' => 'ar_DJ',
|
||
'und_Arab_ER' => 'ar_ER',
|
||
'und_Arab_IL' => 'ar_IL',
|
||
'und_Arab_IN' => 'ur_IN',
|
||
'und_Arab_PK' => 'ur_PK',
|
||
'und_Armn' => 'hy_AM',
|
||
'und_BA' => 'bs_BA',
|
||
'und_BD' => 'bn_BD',
|
||
'und_BE' => 'nl_BE',
|
||
'und_BF' => 'fr_BF',
|
||
'und_BG' => 'bg_BG',
|
||
'und_BH' => 'ar_BH',
|
||
'und_BI' => 'rn_BI',
|
||
'und_BJ' => 'fr_BJ',
|
||
'und_BL' => 'fr_BL',
|
||
'und_BN' => 'ms_BN',
|
||
'und_BO' => 'es_BO',
|
||
'und_BR' => 'pt_BR',
|
||
'und_BT' => 'dz_BT',
|
||
'und_BY' => 'be_BY',
|
||
'und_Beng' => 'bn_BD',
|
||
'und_CD' => 'fr_CD',
|
||
'und_CF' => 'sg_CF',
|
||
'und_CG' => 'ln_CG',
|
||
'und_CH' => 'de_CH',
|
||
'und_CI' => 'fr_CI',
|
||
'und_CL' => 'es_CL',
|
||
'und_CM' => 'fr_CM',
|
||
'und_CN' => 'zh_CN',
|
||
'und_CO' => 'es_CO',
|
||
'und_CR' => 'es_CR',
|
||
'und_CU' => 'es_CU',
|
||
'und_CV' => 'pt_CV',
|
||
'und_CY' => 'el_CY',
|
||
'und_CZ' => 'cs_CZ',
|
||
'und_Cans' => 'cwd_CA',
|
||
'und_Cyrl' => 'ru_RU',
|
||
'und_Cyrl_BA' => 'sr_BA',
|
||
'und_Cyrl_GE' => 'ab_GE',
|
||
'und_DE' => 'de_DE',
|
||
'und_DJ' => 'aa_DJ',
|
||
'und_DK' => 'da_DK',
|
||
'und_DO' => 'es_DO',
|
||
'und_DZ' => 'ar_DZ',
|
||
'und_Deva' => 'hi_IN',
|
||
'und_EC' => 'es_EC',
|
||
'und_EE' => 'et_EE',
|
||
'und_EG' => 'ar_EG',
|
||
'und_EH' => 'ar_EH',
|
||
'und_ER' => 'ti_ER',
|
||
'und_ES' => 'es_ES',
|
||
'und_ET' => 'am_ET',
|
||
'und_Ethi' => 'am_ET',
|
||
'und_FI' => 'fi_FI',
|
||
'und_FJ' => 'fj_FJ',
|
||
'und_FM' => 'chk_FM',
|
||
'und_FO' => 'fo_FO',
|
||
'und_FR' => 'fr_FR',
|
||
'und_GA' => 'fr_GA',
|
||
'und_GE' => 'ka_GE',
|
||
'und_GF' => 'fr_GF',
|
||
'und_GH' => 'ak_GH',
|
||
'und_GL' => 'kl_GL',
|
||
'und_GN' => 'fr_GN',
|
||
'und_GP' => 'fr_GP',
|
||
'und_GQ' => 'fr_GQ',
|
||
'und_GR' => 'el_GR',
|
||
'und_GT' => 'es_GT',
|
||
'und_GU' => 'ch_GU',
|
||
'und_GW' => 'pt_GW',
|
||
'und_Geor' => 'ka_GE',
|
||
'und_Grek' => 'el_GR',
|
||
'und_Gujr' => 'gu_IN',
|
||
'und_Guru' => 'pa_IN',
|
||
'und_HK' => 'zh_HK',
|
||
'und_HN' => 'es_HN',
|
||
'und_HR' => 'hr_HR',
|
||
'und_HT' => 'ht_HT',
|
||
'und_HU' => 'hu_HU',
|
||
'und_Hani' => 'zh_CN',
|
||
'und_Hans' => 'zh_CN',
|
||
'und_Hant' => 'zh_TW',
|
||
'und_Hebr' => 'he_IL',
|
||
'und_ID' => 'id_ID',
|
||
'und_IL' => 'he_IL',
|
||
'und_IN' => 'hi_IN',
|
||
'und_IQ' => 'ar_IQ',
|
||
'und_IR' => 'fa_IR',
|
||
'und_IS' => 'is_IS',
|
||
'und_IT' => 'it_IT',
|
||
'und_JO' => 'ar_JO',
|
||
'und_JP' => 'ja_JP',
|
||
'und_Jpan' => 'ja_JP',
|
||
'und_KG' => 'ky_KG',
|
||
'und_KH' => 'km_KH',
|
||
'und_KM' => 'ar_KM',
|
||
'und_KP' => 'ko_KP',
|
||
'und_KR' => 'ko_KR',
|
||
'und_KW' => 'ar_KW',
|
||
'und_KZ' => 'ru_KZ',
|
||
'und_Khmr' => 'km_KH',
|
||
'und_Knda' => 'kn_IN',
|
||
'und_Kore' => 'ko_KR',
|
||
'und_LA' => 'lo_LA',
|
||
'und_LB' => 'ar_LB',
|
||
'und_LI' => 'de_LI',
|
||
'und_LK' => 'si_LK',
|
||
'und_LS' => 'st_LS',
|
||
'und_LT' => 'lt_LT',
|
||
'und_LU' => 'fr_LU',
|
||
'und_LV' => 'lv_LV',
|
||
'und_LY' => 'ar_LY',
|
||
'und_Laoo' => 'lo_LA',
|
||
'und_Latn_CN' => 'ii_CN',
|
||
'und_Latn_CY' => 'tr_CY',
|
||
'und_Latn_DZ' => 'fr_DZ',
|
||
'und_Latn_ET' => 'om_ET',
|
||
'und_Latn_KM' => 'fr_KM',
|
||
'und_Latn_MA' => 'fr_MA',
|
||
'und_Latn_MK' => 'sq_MK',
|
||
'und_Latn_SY' => 'fr_SY',
|
||
'und_Latn_TD' => 'fr_TD',
|
||
'und_Latn_TN' => 'fr_TN',
|
||
'und_MA' => 'ar_MA',
|
||
'und_MC' => 'fr_MC',
|
||
'und_MD' => 'ro_MD',
|
||
'und_ME' => 'sr_ME',
|
||
'und_MF' => 'fr_MF',
|
||
'und_MG' => 'mg_MG',
|
||
'und_MH' => 'mh_MH',
|
||
'und_MK' => 'mk_MK',
|
||
'und_ML' => 'fr_ML',
|
||
'und_MM' => 'my_MM',
|
||
'und_MN' => 'mn_MN',
|
||
'und_MO' => 'zh_MO',
|
||
'und_MQ' => 'fr_MQ',
|
||
'und_MR' => 'ar_MR',
|
||
'und_MT' => 'mt_MT',
|
||
'und_MV' => 'dv_MV',
|
||
'und_MW' => 'ny_MW',
|
||
'und_MX' => 'es_MX',
|
||
'und_MY' => 'ms_MY',
|
||
'und_MZ' => 'pt_MZ',
|
||
'und_Mlym' => 'ml_IN',
|
||
'und_Mong' => 'mn_CN',
|
||
'und_Mymr' => 'my_MM',
|
||
'und_NC' => 'fr_NC',
|
||
'und_NE' => 'ha_NE',
|
||
'und_NG' => 'ha_NG',
|
||
'und_NI' => 'es_NI',
|
||
'und_NL' => 'nl_NL',
|
||
'und_NO' => 'nb_NO',
|
||
'und_NP' => 'ne_NP',
|
||
'und_NR' => 'na_NR',
|
||
'und_NU' => 'niu_NU',
|
||
'und_OM' => 'ar_OM',
|
||
'und_Orya' => 'or_IN',
|
||
'und_PA' => 'es_PA',
|
||
'und_PE' => 'es_PE',
|
||
'und_PF' => 'ty_PF',
|
||
'und_PG' => 'tpi_PG',
|
||
'und_PH' => 'fil_PH',
|
||
'und_PK' => 'ur_PK',
|
||
'und_PL' => 'pl_PL',
|
||
'und_PM' => 'fr_PM',
|
||
'und_PR' => 'es_PR',
|
||
'und_PS' => 'ar_PS',
|
||
'und_PT' => 'pt_PT',
|
||
'und_PW' => 'pau_PW',
|
||
'und_PY' => 'gn_PY',
|
||
'und_QA' => 'ar_QA',
|
||
'und_RE' => 'fr_RE',
|
||
'und_RO' => 'ro_RO',
|
||
'und_RS' => 'sr_RS',
|
||
'und_RU' => 'ru_RU',
|
||
'und_RW' => 'rw_RW',
|
||
'und_SA' => 'ar_SA',
|
||
'und_SD' => 'ar_SD',
|
||
'und_SE' => 'sv_SE',
|
||
'und_SI' => 'sl_SI',
|
||
'und_SJ' => 'nb_SJ',
|
||
'und_SK' => 'sk_SK',
|
||
'und_SM' => 'it_SM',
|
||
'und_SN' => 'fr_SN',
|
||
'und_SO' => 'so_SO',
|
||
'und_SR' => 'nl_SR',
|
||
'und_ST' => 'pt_ST',
|
||
'und_SV' => 'es_SV',
|
||
'und_SY' => 'ar_SY',
|
||
'und_Sinh' => 'si_LK',
|
||
'und_TD' => 'ar_TD',
|
||
'und_TG' => 'ee_TG',
|
||
'und_TH' => 'th_TH',
|
||
'und_TJ' => 'tg_TJ',
|
||
'und_TK' => 'tkl_TK',
|
||
'und_TL' => 'tet_TL',
|
||
'und_TM' => 'tk_TM',
|
||
'und_TN' => 'ar_TN',
|
||
'und_TO' => 'to_TO',
|
||
'und_TR' => 'tr_TR',
|
||
'und_TV' => 'tvl_TV',
|
||
'und_TW' => 'zh_TW',
|
||
'und_Taml' => 'ta_IN',
|
||
'und_Telu' => 'te_IN',
|
||
'und_Thaa' => 'dv_MV',
|
||
'und_Thai' => 'th_TH',
|
||
'und_Tibt' => 'bo_CN',
|
||
'und_UA' => 'uk_UA',
|
||
'und_UY' => 'es_UY',
|
||
'und_UZ' => 'uz_UZ',
|
||
'und_VA' => 'la_VA',
|
||
'und_VE' => 'es_VE',
|
||
'und_VN' => 'vi_VN',
|
||
'und_VU' => 'fr_VU',
|
||
'und_WF' => 'fr_WF',
|
||
'und_WS' => 'sm_WS',
|
||
'und_YE' => 'ar_YE',
|
||
'und_YT' => 'fr_YT',
|
||
'und_ZW' => 'sn_ZW',
|
||
'ur' => 'ur_PK',
|
||
'uz' => 'uz_UZ',
|
||
'uz_AF' => 'uz_AF',
|
||
'uz_Arab' => 'uz_AF',
|
||
've' => 've_ZA',
|
||
'vi' => 'vi_VN',
|
||
'wal' => 'wal_ET',
|
||
'war' => 'war_PH',
|
||
'wo' => 'wo_SN',
|
||
'xh' => 'xh_ZA',
|
||
'yap' => 'yap_FM',
|
||
'yo' => 'yo_NG',
|
||
'za' => 'za_CN',
|
||
'zh' => 'zh_CN',
|
||
'zh_HK' => 'zh_HK',
|
||
'zh_Hani' => 'zh_CN',
|
||
'zh_Hant' => 'zh_TW',
|
||
'zh_MO' => 'zh_MO',
|
||
'zh_TW' => 'zh_TW',
|
||
'zu' => 'zu_ZA',
|
||
);
|
||
|
||
/**
|
||
* This is the main translator function. Returns the string defined by $class and $entity according to the currently set locale.
|
||
*
|
||
* @param string $entity Entity that identifies the string. It must be in the form "Namespace.Entity" where Namespace will be usually
|
||
* the class name where this string is used and Entity identifies the string inside the namespace.
|
||
* @param string $string The original string itself. In a usual call this is a mandatory parameter, but if you are reusing a string which
|
||
* has already been "declared" (using another call to this function, with the same class and entity), you can omit it.
|
||
* @param string $priority Optional parameter to set a translation priority. If a string is widely used, should have a high priority (PR_HIGH),
|
||
* in this way translators will be able to prioritise this strings. If a string is rarely shown, you should use PR_LOW.
|
||
* You can use PR_MEDIUM as well. Leaving this field blank will be interpretated as a "normal" priority (less than PR_MEDIUM).
|
||
* @param string $context If the string can be difficult to translate by any reason, you can help translators with some more info using this param
|
||
*
|
||
* @return string The translated string, according to the currently set locale {@link i18n::set_locale()}
|
||
*/
|
||
static function _t($entity, $string = "", $priority = 40, $context = "") {
|
||
global $lang;
|
||
|
||
// get current locale (either default or user preference)
|
||
$locale = i18n::get_locale();
|
||
|
||
// parse $entity into its parts
|
||
$entityParts = explode('.',$entity);
|
||
$realEntity = array_pop($entityParts);
|
||
$class = implode('.',$entityParts);
|
||
|
||
// if language table isn't loaded for this locale, get it for each of the modules
|
||
if(!isset($lang[$locale])) i18n::include_by_locale($locale);
|
||
|
||
// fallback to the passed $string if no translation is present
|
||
$transEntity = isset($lang[$locale][$class][$realEntity]) ? $lang[$locale][$class][$realEntity] : $string;
|
||
|
||
// entities can be stored in both array and literal values in the language tables
|
||
return (is_array($transEntity) ? $transEntity[0] : $transEntity);
|
||
}
|
||
|
||
/**
|
||
* Get a list of commonly used languages
|
||
*
|
||
* @param boolean $native Use native names for languages instead of English ones
|
||
* @return list of languages in the form 'code' => 'name'
|
||
*/
|
||
static function get_common_languages($native = false) {
|
||
$languages = array();
|
||
foreach (self::$common_languages as $code => $name) {
|
||
$languages[$code] = ($native ? $name[1] : $name[0]);
|
||
}
|
||
return $languages;
|
||
}
|
||
|
||
/**
|
||
* Get a list of commonly used locales
|
||
*
|
||
* @param boolean $native Use native names for locale instead of English ones
|
||
* @return list of languages in the form 'code' => 'name'
|
||
*/
|
||
static function get_common_locales($native = false) {
|
||
$languages = array();
|
||
foreach (self::$common_locales as $code => $name) {
|
||
$languages[$code] = ($native ? $name[1] : $name[0]);
|
||
}
|
||
return $languages;
|
||
}
|
||
|
||
/**
|
||
* Get a list of locales (code => language and country)
|
||
*
|
||
* @return list of languages in the form 'code' => 'name'
|
||
*/
|
||
static function get_locale_list() {
|
||
return self::$all_locales;
|
||
}
|
||
|
||
/**
|
||
* Searches the root-directory for module-directories
|
||
* (identified by having a _config.php on their first directory-level).
|
||
* Returns all found locales.
|
||
*
|
||
* @return array
|
||
*/
|
||
static function get_existing_translations() {
|
||
$locales = array();
|
||
|
||
$baseDir = Director::baseFolder();
|
||
$modules = scandir($baseDir);
|
||
foreach($modules as $module) {
|
||
if($module[0] == '.') continue;
|
||
|
||
$moduleDir = $baseDir . DIRECTORY_SEPARATOR . $module;
|
||
$langDir = $moduleDir . DIRECTORY_SEPARATOR . "lang";
|
||
if(is_dir($moduleDir) && is_file($moduleDir . DIRECTORY_SEPARATOR . "_config.php") && is_dir($langDir)) {
|
||
$moduleLocales = scandir($langDir);
|
||
foreach($moduleLocales as $moduleLocale) {
|
||
if(preg_match('/(.*)\.php$/',$moduleLocale, $matches)) {
|
||
if(isset($matches[1]) && isset(self::$all_locales[$matches[1]])) {
|
||
$locales[$matches[1]] = self::$all_locales[$matches[1]];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// sort by title (not locale)
|
||
asort($locales);
|
||
|
||
return $locales;
|
||
}
|
||
|
||
/**
|
||
* Get a name from a language code (two characters, e.g. "en").
|
||
*
|
||
* @see get_locale_name()
|
||
*
|
||
* @param mixed $code Language code
|
||
* @param boolean $native If true, the native name will be returned
|
||
* @return Name of the language
|
||
*/
|
||
static function get_language_name($code, $native = false) {
|
||
$langs = self::$common_languages;
|
||
return ($native ? $langs[$code][1] : $langs[$code][0]);
|
||
}
|
||
|
||
/**
|
||
* Get a name from a locale code (xx_YY).
|
||
*
|
||
* @see get_language_name()
|
||
*
|
||
* @param mixed $code locale code
|
||
* @return Name of the locale
|
||
*/
|
||
static function get_locale_name($code) {
|
||
$langs = self::get_locale_list();
|
||
return isset($langs[$code]) ? $langs[$code] : false;
|
||
}
|
||
|
||
/**
|
||
* Get a code from an English language name
|
||
*
|
||
* @param mixed $name Name of the language
|
||
* @return Language code (if the name is not found, it'll return the passed name)
|
||
*/
|
||
static function get_language_code($name) {
|
||
$code = array_search($name,self::get_common_languages());
|
||
return ($code ? $code : $name);
|
||
}
|
||
|
||
/**
|
||
* Get the current tinyMCE language
|
||
*
|
||
* @return Language
|
||
*/
|
||
static function get_tinymce_lang() {
|
||
if(isset(self::$tinymce_lang[self::get_locale()])) {
|
||
return self::$tinymce_lang[self::get_locale()];
|
||
}
|
||
|
||
return 'en';
|
||
}
|
||
|
||
/**
|
||
* Searches the root-directory for module-directories
|
||
* (identified by having a _config.php on their first directory-level
|
||
* and a language-file with the default locale in the /lang-subdirectory).
|
||
*
|
||
* @return array
|
||
*/
|
||
static function get_translatable_modules() {
|
||
$translatableModules = array();
|
||
|
||
$baseDir = Director::baseFolder();
|
||
$modules = scandir($baseDir);
|
||
foreach($modules as $module) {
|
||
$moduleDir = $baseDir . DIRECTORY_SEPARATOR . $module;
|
||
if(
|
||
is_dir($moduleDir)
|
||
&& is_file($moduleDir . DIRECTORY_SEPARATOR . "_config.php")
|
||
&& is_file($moduleDir . DIRECTORY_SEPARATOR . "lang" . DIRECTORY_SEPARATOR . self::$default_locale . ".php")
|
||
) {
|
||
$translatableModules[] = $module;
|
||
}
|
||
}
|
||
return $translatableModules;
|
||
}
|
||
|
||
/**
|
||
* Returns the "short" language name from a locale,
|
||
* e.g. "en_US" would return "en". This conversion
|
||
* is determined internally by the {@link $tinymce_lang}
|
||
* lookup table. If no match can be found in this lookup,
|
||
* the characters before the underscore ("_") are returned.
|
||
*
|
||
* @todo More generic lookup table, don't rely on tinymce specific conversion
|
||
*
|
||
* @param string $locale E.g. "en_US"
|
||
* @return string Short language code, e.g. "en"
|
||
*/
|
||
static function get_lang_from_locale($locale) {
|
||
if(isset(self::$tinymce_lang[$locale])) {
|
||
return self::$tinymce_lang[$locale];
|
||
} else {
|
||
return preg_replace('/(_|-).*/', '', $locale);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Provides you "likely locales"
|
||
* for a given "short" language code. This is a guess,
|
||
* as we can't disambiguate from e.g. "en" to "en_US" - it
|
||
* could also mean "en_UK". Based on the Unicode CLDR
|
||
* project.
|
||
* @see http://www.unicode.org/cldr/data/charts/supplemental/likely_subtags.html
|
||
*
|
||
* @param string $lang Short language code, e.g. "en"
|
||
* @return string Long locale, e.g. "en_US"
|
||
*/
|
||
static function get_locale_from_lang($lang) {
|
||
if(isset(self::$likely_subtags[$lang])) {
|
||
return self::$likely_subtags[$lang];
|
||
} else {
|
||
return $lang . '_' . strtoupper($lang);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Gets a RFC 1766 compatible language code,
|
||
* e.g. "en-US".
|
||
*
|
||
* @see http://www.ietf.org/rfc/rfc1766.txt
|
||
* @see http://tools.ietf.org/html/rfc2616#section-3.10
|
||
*
|
||
* @param string $locale
|
||
* @return string
|
||
*/
|
||
static function convert_rfc1766($locale) {
|
||
return str_replace('_','-', $locale);
|
||
}
|
||
|
||
/**
|
||
* Given a file name (a php class name, without the .php ext, or a template name, including the .ss extension)
|
||
* this helper function determines the module where this file is located
|
||
*
|
||
* @param string $name php class name or template file name (including *.ss extension)
|
||
* @return string Module where the file is located
|
||
*/
|
||
public static function get_owner_module($name) {
|
||
// if $name is a template file
|
||
if(substr($name,-3) == '.ss') {
|
||
global $_TEMPLATE_MANIFEST;
|
||
$templateManifest = $_TEMPLATE_MANIFEST[substr($name,0,-3)];
|
||
if(is_array($templateManifest) && isset($templateManifest['themes'])) {
|
||
$absolutePath = $templateManifest['themes'][SSViewer::current_theme()];
|
||
} else {
|
||
$absolutePath = $templateManifest;
|
||
}
|
||
|
||
$path = str_replace('\\','/',Director::makeRelative(current($absolutePath)));
|
||
|
||
ereg('/([^/]+)/',$path,$module);
|
||
}
|
||
// $name is assumed to be a PHP class
|
||
else {
|
||
global $_CLASS_MANIFEST;
|
||
if(strpos($name,'_') !== false) $name = strtok($name,'_');
|
||
if(isset($_CLASS_MANIFEST[$name])) {
|
||
$path = str_replace('\\','/',Director::makeRelative($_CLASS_MANIFEST[$name]));
|
||
ereg('/([^/]+)/', $path, $module);
|
||
}
|
||
}
|
||
return (isset($module)) ? $module[1] : false;
|
||
|
||
}
|
||
|
||
/**
|
||
* Set the current locale
|
||
* See http://unicode.org/cldr/data/diff/supplemental/languages_and_territories.html for a list of possible locales
|
||
*
|
||
* @param string $locale Locale to be set
|
||
*/
|
||
static function set_locale($locale) {
|
||
if ($locale) self::$current_locale = $locale;
|
||
}
|
||
|
||
/**
|
||
* Get the current locale
|
||
*
|
||
* @return string Current locale in the system
|
||
*/
|
||
static function get_locale() {
|
||
return (!empty(self::$current_locale)) ? self::$current_locale : self::$default_locale;
|
||
}
|
||
|
||
/**
|
||
* @deprecated 2.4 Use Translatable::set_default_locale()
|
||
* @param $lang String
|
||
*/
|
||
static function set_default_lang($lang) {
|
||
Translatable::set_default_locale($lang);
|
||
}
|
||
|
||
/**
|
||
* @deprecated 2.4 Use Translatable::default_locale()
|
||
* @return String
|
||
*/
|
||
static function default_lang() {
|
||
return Translatable::default_locale();
|
||
}
|
||
|
||
static function default_locale() {
|
||
return self::$default_locale;
|
||
}
|
||
|
||
/**
|
||
* Enables the multilingual content feature (proxy for Translatable::enable()).
|
||
*
|
||
* @deprecated 2.4 Use Object::add_extension('Page', 'Translatable');
|
||
*/
|
||
static function enable() {
|
||
Translatable::enable();
|
||
}
|
||
|
||
/**
|
||
* Disable the multilingual content feature (proxy for Translatable::disable())
|
||
*
|
||
* @deprecated 2.4 Use Object::add_extension('Page', 'Translatable');
|
||
*/
|
||
static function disable() {
|
||
Translatable::disable();
|
||
}
|
||
|
||
/**
|
||
* Include a locale file determined by module name and locale
|
||
*
|
||
* @param string $module Module that contains the locale file
|
||
* @param string $locale Locale to be loaded
|
||
*/
|
||
static function include_locale_file($module, $locale) {
|
||
if (file_exists($file = Director::getAbsFile("$module/lang/$locale.php"))) include_once($file);
|
||
}
|
||
|
||
/**
|
||
* Includes all available language files for a certain defined locale
|
||
*
|
||
* @param string $locale All resources from any module in locale $locale will be loaded
|
||
*/
|
||
static function include_by_locale($locale) {
|
||
$topLevel = scandir(Director::baseFolder());
|
||
foreach($topLevel as $module) {
|
||
//$topLevel is the website root, some server is configurated not to allow excess website root's parent level
|
||
//and we don't need to check website root's parent level and websit root level for its lang folder, so we skip these 2 levels checking.
|
||
if($module == ".." || $module == ".") continue;
|
||
if (file_exists(Director::getAbsFile("$module/_config.php")) &&
|
||
file_exists($file = Director::getAbsFile("$module/lang/$locale.php"))) {
|
||
include_once($file);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Given a class name (a "locale namespace"), will search for its module and, if available,
|
||
* will load the resources for the currently defined locale.
|
||
* If not available, the original English resource will be loaded instead (to avoid blanks)
|
||
*
|
||
* @param string $class Resources for this class will be included, according to the set locale.
|
||
*/
|
||
static function include_by_class($class) {
|
||
$module = self::get_owner_module($class);
|
||
|
||
if(!$module) user_error("i18n::include_by_class: Class {$class} not found", E_USER_WARNING);
|
||
$locale = self::get_locale();
|
||
|
||
if (file_exists($file = Director::getAbsFile("$module/lang/". self::get_locale() . '.php'))) {
|
||
include($file);
|
||
} else if (self::get_locale() != self::$default_locale) {
|
||
$old = self::get_locale();
|
||
self::set_locale(self::$default_locale);
|
||
self::include_by_class($class);
|
||
self::set_locale($old);
|
||
|
||
} else if(file_exists(Director::getAbsFile("$module/lang"))) {
|
||
user_error("i18n::include_by_class: Locale file $file should exist", E_USER_WARNING);
|
||
}
|
||
|
||
// If the language file wasn't included for this class, include an empty array to prevent
|
||
// this method from being called again
|
||
global $lang;
|
||
if(!isset($lang[$locale][$class])) $lang[$locale][$class] = array();
|
||
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------------------------//
|
||
|
||
/**
|
||
* This method will delete every SiteTree instance in the given language
|
||
*/
|
||
public function removelang() {
|
||
if (!Permission::check("ADMIN")) user_error("You must be an admin to remove a language", E_USER_ERROR);
|
||
$translatedToDelete = Translatable::get_by_locale('SiteTree',$this->urlParams['ID']);
|
||
foreach ($translatedToDelete as $object) {
|
||
$object->delete();
|
||
}
|
||
echo "Language {$this->urlParams['ID']} successfully removed";
|
||
}
|
||
|
||
}
|
||
?>
|