language and country) * * @config * @var array */ private static $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)', 'ast_ES' => 'Asturian (Spain)', '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)', 'bcc_PK' => 'Balochi, Southern (Pakistan)', 'bcl_PH' => 'Bicolano, Central (Philippines)', 'be_BY' => 'Belarusian (Belarus)', 'bew_ID' => 'Betawi (Indonesia)', 'bg_BG' => 'Bulgarian (Bulgaria)', 'bgc_IN' => 'Haryanvi (India)', 'bgn_PK' => 'Balochi, Western (Pakistan)', 'bgp_PK' => 'Balochi, Easter (Pakistan)', 'bhb_IN' => 'Bhili (India)', 'bhi_IN' => 'Bhilali (India)', '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)', 'cs_CZ' => 'Czech (Czech Republic)', 'cwd_CA' => 'Cree, Woods (Canada)', '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_DE' => 'English (Germany)', 'en_ES' => 'English (Spain)', 'en_FR' => 'English (France)', 'en_GB' => 'English (United Kingdom)', 'en_HK' => 'English (Hong Kong SAR China)', 'en_IE' => 'English (Ireland)', 'en_IN' => 'English (India)', 'en_IT' => 'English (Italy)', '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_NL' => 'English (Netherlands)', '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)', '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_GB' => 'Irish (United Kingdom)', 'ga_IE' => 'Irish (Ireland)', '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_NE' => 'Hausa (Niger)', 'ha_NG' => 'Hausa (Nigeria)', '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_AT' => 'Croatian (Austria)', 'hr_BA' => 'Croatian (Bosnia and Herzegovina)', 'hr_HR' => 'Croatian (Croatia)', 'ht_HT' => 'Haitian (Haiti)', 'hu_AT' => 'Hungarian (Austria)', 'hu_HU' => 'Hungarian (Hungary)', '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_FR' => 'Italian (France)', 'it_HR' => 'Italian (Croatia)', 'it_IT' => 'Italian (Italy)', 'it_SM' => 'Italian (San Marino)', '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_CN' => 'Kazakh (China)', 'kk_KZ' => 'Kazakh (Kazakhstan)', 'kl_DK' => 'Kalaallisut (Denmark)', 'kl_GL' => 'Kalaallisut (Greenland)', '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' => 'te reo Māori (New Zealand)', 'min_ID' => 'Minangkabau (Indonesia)', 'mk_MK' => 'Macedonian (Macedonia)', 'ml_IN' => 'Malayalam (India)', 'mn_CN' => 'Mongolian (China)', 'mn_MN' => 'Mongolian (Mongolia)', 'mni_IN' => 'Manipuri (India)', 'mr_IN' => 'Marathi (India)', 'ms_BN' => 'Malay (Brunei)', 'ms_CC' => 'Malay (Cocos Islands)', 'ms_ID' => 'Malay (Indonesia)', 'ms_MY' => 'Malay (Malaysia)', 'ms_SG' => 'Malay (Singapore)', '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_IN' => 'Nepali (India)', 'ne_NP' => 'Nepali (Nepal)', '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)', 'sco_SCO' => 'Scots', '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_RS' => 'Slovak (Serbia)', 'sk_SK' => 'Slovak (Slovakia)', 'sl_AT' => 'Slovenian (Austria)', 'sl_SI' => 'Slovenian (Slovenia)', 'sm_AS' => 'Samoan (American Samoa)', 'sm_WS' => 'Samoan (Samoa)', 'sn_ZW' => 'Shona (Zimbabwe)', 'so_DJ' => 'Somali (Djibouti)', 'so_ET' => 'Somali (Ethiopia)', 'so_SO' => 'Somali (Somalia)', '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_SO' => 'Swahili (Somalia)', 'sw_TZ' => 'Swahili (Tanzania)', 'sw_UG' => 'Swahili (Uganda)', 'swb_KM' => 'Comorian (Comoros)', 'swb_YT' => 'Comorian (Mayotte)', 'swv_IN' => 'Shekhawati (India)', 'ta_IN' => 'Tamil (India)', 'ta_LK' => 'Tamil (Sri Lanka)', 'ta_MY' => 'Tamil (Malaysia)', 'ta_SG' => 'Tamil (Singapore)', '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_IR' => 'Turkmen (Iran)', 'tk_TM' => 'Turkmen (Turkmenistan)', '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_DE' => 'Turkish (Germany)', 'tr_MK' => 'Turkish (Macedonia)', 'tr_TR' => 'Turkish (Turkey)', 'ts_MZ' => 'Tsonga (Mozambique)', 'ts_ZA' => 'Tsonga (South Africa)', '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_AF' => 'Uzbek (Afghanistan)', 'uz_UZ' => 'Uzbek (Uzbekistan)', 've_ZA' => 'Venda (South Africa)', 'vi_US' => 'Vietnamese (United States)', 'vi_VN' => 'Vietnamese (Vietnam)', '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)', 'zh_cmn' => 'Chinese (Mandarin)', 'zh_yue' => 'Chinese (Cantonese)', 'zu_ZA' => 'Zulu (South Africa)' ); /** * List of language names * * Language codes follow ISO 639-1 (2 letter), unless not present, in which case a locale will be * encoded in ISO 639-3 (3 letter). See https://en.wikipedia.org/wiki/ISO_639 * * @config * @var array */ private static $languages = array( 'af' => 'Afrikaans', 'sq' => 'Albanian', 'ar' => 'Arabic', 'eu' => 'Basque', 'be' => 'Belarusian', 'bn' => 'Bengali', 'bg' => 'Bulgarian', 'ca' => 'Catalan', 'zh' => 'Chinese', 'hr' => 'Croatian', 'cs' => 'Czech', 'cy' => 'Welsh', 'da' => 'Danish', 'nl' => 'Dutch', 'en' => 'English', 'eo' => 'Esperanto', 'et' => 'Estonian', 'fo' => 'Faroese', 'fi' => 'Finnish', 'fr' => 'French', 'gd' => 'Gaelic', 'gl' => 'Galician', 'de' => 'German', 'el' => 'Greek', 'gu' => 'Gujarati', 'ha' => 'Hausa', 'he' => 'Hebrew', 'hi' => 'Hindi', 'hu' => 'Hungarian', 'is' => 'Icelandic', 'io' => 'Ido', 'id' => 'Indonesian', 'ga' => 'Irish', 'it' => 'Italian', 'ja' => 'Japanese', 'jv' => 'Javanese', 'ko' => 'Korean', 'ku' => 'Kurdish', 'lv' => 'Latvian', 'lt' => 'Lithuanian', 'lmo' => 'Lombard', 'mk' => 'Macedonian', 'mi' => 'te reo Māori', 'ms' => 'Malay', 'mt' => 'Maltese', 'mr' => 'Marathi', 'ne' => 'Nepali', 'nb' => 'Norwegian', 'om' => 'Oromo', 'fa' => 'Persian', 'pl' => 'Polish', 'pt' => 'Portuguese', 'pa' => 'Punjabi', 'qu' => 'Quechua', 'rm' => 'Romansh', 'ro' => 'Romanian', 'ru' => 'Russian', 'sco' => 'Scots', 'sr' => 'Serbian', 'sk' => 'Slovak', 'sl' => 'Slovenian', 'es' => 'Spanish', 'sv' => 'Swedish', 'tl' => 'Tagalog', 'ta' => 'Tamil', 'te' => 'Telugu', 'to' => 'Tonga', 'ts' => 'Tsonga', 'tn' => 'Tswana', 'tr' => 'Turkish', 'tk' => 'Turkmen', 'tw' => 'Twi', 'uk' => 'Ukrainian', 'ur' => 'Urdu', 'uz' => 'Uzbek', 've' => 'Venda', 'vi' => 'Vietnamese', 'wa' => 'Walloon', 'wo' => 'Wolof', 'xh' => 'Xhosa', 'yi' => 'Yiddish', 'zu' => 'Zulu', ); /** * Config for ltr/rtr of specific locales. * Will default to ltr. * * @config * @var array */ private static $text_direction = [ 'ar' => 'rtl', 'dv' => 'rtl', 'fa' => 'rtl', 'ha_Arab' => 'rtl', 'he' => 'rtl', 'ku' => 'rtl', 'pa_Arab' => 'rtl', 'ps' => 'rtl', 'syr' => 'rtl', 'ug' => 'rtl', 'ur' => 'rtl', 'uz_Arab' => 'rtl', ]; /** * @config * @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 */ private 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', 'eo' => 'eo_XX', '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', 'kxm' => 'kxm_TH', '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_PT', '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', ); /** * Standard list of countries * * @var array */ private static $countries = [ 'ad' => 'Andorra', 'ae' => 'United Arab Emirates', 'af' => 'Afghanistan', 'ag' => 'Antigua and Barbuda', 'ai' => 'Anguilla', 'al' => 'Albania', 'am' => 'Armenia', 'an' => 'Netherlands Antilles', 'ao' => 'Angola', 'aq' => 'Antarctica', 'ar' => 'Argentina', 'as' => 'American Samoa', 'at' => 'Austria', 'au' => 'Australia', 'aw' => 'Aruba', 'ax' => 'Åland Islands', 'az' => 'Azerbaijan', 'ba' => 'Bosnia and Herzegovina', 'bb' => 'Barbados', 'bd' => 'Bangladesh', 'be' => 'Belgium', 'bf' => 'Burkina Faso', 'bg' => 'Bulgaria', 'bh' => 'Bahrain', 'bi' => 'Burundi', 'bj' => 'Benin', 'bl' => 'Saint Barthélemy', 'bm' => 'Bermuda', 'bn' => 'Brunei', 'bo' => 'Bolivia', 'bq' => 'Bonaire, Sint Eustatius and Saba', 'br' => 'Brazil', 'bs' => 'Bahamas', 'bt' => 'Bhutan', 'bv' => 'Bouvet Island', 'bw' => 'Botswana', 'by' => 'Belarus', 'bz' => 'Belize', 'ca' => 'Canada', 'cc' => 'Cocos [Keeling] Islands', 'cd' => 'Congo - Kinshasa', 'cf' => 'Central African Republic', 'cg' => 'Congo - Brazzaville', 'ch' => 'Switzerland', 'ci' => 'Côte d’Ivoire', 'ck' => 'Cook Islands', 'cl' => 'Chile', 'cm' => 'Cameroon', 'cn' => 'China', 'co' => 'Colombia', 'cr' => 'Costa Rica', 'cu' => 'Cuba', 'cv' => 'Cape Verde', 'cx' => 'Christmas Island', 'cy' => 'Cyprus', 'cz' => 'Czech Republic', 'de' => 'Germany', 'dj' => 'Djibouti', 'dk' => 'Denmark', 'dm' => 'Dominica', 'do' => 'Dominican Republic', 'dz' => 'Algeria', 'ec' => 'Ecuador', 'ee' => 'Estonia', 'eg' => 'Egypt', 'eh' => 'Western Sahara', 'er' => 'Eritrea', 'es' => 'Spain', 'et' => 'Ethiopia', 'fi' => 'Finland', 'fj' => 'Fiji', 'fk' => 'Falkland Islands', 'fm' => 'Micronesia', 'fo' => 'Faroe Islands', 'fr' => 'France', 'ga' => 'Gabon', 'gb' => 'United Kingdom', 'gd' => 'Grenada', 'ge' => 'Georgia', 'gf' => 'French Guiana', 'gg' => 'Guernsey', 'gh' => 'Ghana', 'gi' => 'Gibraltar', 'gl' => 'Greenland', 'gm' => 'Gambia', 'gn' => 'Guinea', 'gp' => 'Guadeloupe', 'gq' => 'Equatorial Guinea', 'gr' => 'Greece', 'gs' => 'South Georgia and the South Sandwich Islands', 'gt' => 'Guatemala', 'gu' => 'Guam', 'gw' => 'Guinea-Bissau', 'gy' => 'Guyana', 'hk' => 'Hong Kong SAR China', 'hm' => 'Heard Island and McDonald Islands', 'hn' => 'Honduras', 'hr' => 'Croatia', 'ht' => 'Haiti', 'hu' => 'Hungary', 'id' => 'Indonesia', 'ie' => 'Ireland', 'il' => 'Israel', 'im' => 'Isle of Man', 'in' => 'India', 'io' => 'British Indian Ocean Territory', 'iq' => 'Iraq', 'ir' => 'Iran', 'is' => 'Iceland', 'it' => 'Italy', 'je' => 'Jersey', 'jm' => 'Jamaica', 'jo' => 'Jordan', 'jp' => 'Japan', 'ke' => 'Kenya', 'kg' => 'Kyrgyzstan', 'kh' => 'Cambodia', 'ki' => 'Kiribati', 'km' => 'Comoros', 'kn' => 'Saint Kitts and Nevis', 'kp' => 'North Korea', 'kr' => 'South Korea', 'kw' => 'Kuwait', 'ky' => 'Cayman Islands', 'kz' => 'Kazakhstan', 'la' => 'Laos', 'lb' => 'Lebanon', 'lc' => 'Saint Lucia', 'li' => 'Liechtenstein', 'lk' => 'Sri Lanka', 'lr' => 'Liberia', 'ls' => 'Lesotho', 'lt' => 'Lithuania', 'lu' => 'Luxembourg', 'lv' => 'Latvia', 'ly' => 'Libya', 'ma' => 'Morocco', 'mc' => 'Monaco', 'md' => 'Moldova', 'me' => 'Montenegro', 'mf' => 'Saint Martin', 'mg' => 'Madagascar', 'mh' => 'Marshall Islands', 'mk' => 'Macedonia', 'ml' => 'Mali', 'mm' => 'Myanmar [Burma]', 'mn' => 'Mongolia', 'mo' => 'Macau SAR China', 'mp' => 'Northern Mariana Islands', 'mq' => 'Martinique', 'mr' => 'Mauritania', 'ms' => 'Montserrat', 'mt' => 'Malta', 'mu' => 'Mauritius', 'mv' => 'Maldives', 'mw' => 'Malawi', 'mx' => 'Mexico', 'my' => 'Malaysia', 'mz' => 'Mozambique', 'na' => 'Namibia', 'nc' => 'New Caledonia', 'ne' => 'Niger', 'nf' => 'Norfolk Island', 'ng' => 'Nigeria', 'ni' => 'Nicaragua', 'nl' => 'Netherlands', 'no' => 'Norway', 'np' => 'Nepal', 'nr' => 'Nauru', 'nu' => 'Niue', 'nz' => 'New Zealand', 'om' => 'Oman', 'pa' => 'Panama', 'pe' => 'Peru', 'pf' => 'French Polynesia', 'pg' => 'Papua New Guinea', 'ph' => 'Philippines', 'pk' => 'Pakistan', 'pl' => 'Poland', 'pm' => 'Saint Pierre and Miquelon', 'pn' => 'Pitcairn Islands', 'pr' => 'Puerto Rico', 'ps' => 'Palestinian Territories', 'pt' => 'Portugal', 'pw' => 'Palau', 'py' => 'Paraguay', 'qa' => 'Qatar', 'qo' => 'Outlying Oceania', 're' => 'Réunion', 'ro' => 'Romania', 'rs' => 'Serbia', 'ru' => 'Russia', 'rw' => 'Rwanda', 'sa' => 'Saudi Arabia', 'sb' => 'Solomon Islands', 'sc' => 'Seychelles', 'sd' => 'Sudan', 'se' => 'Sweden', 'sg' => 'Singapore', 'sh' => 'Saint Helena', 'si' => 'Slovenia', 'sj' => 'Svalbard and Jan Mayen', 'sk' => 'Slovakia', 'sl' => 'Sierra Leone', 'sm' => 'San Marino', 'sn' => 'Senegal', 'so' => 'Somalia', 'sr' => 'Suriname', 'st' => 'São Tomé and Príncipe', 'sv' => 'El Salvador', 'sy' => 'Syria', 'sz' => 'Swaziland', 'tc' => 'Turks and Caicos Islands', 'td' => 'Chad', 'tf' => 'French Southern Territories', 'tg' => 'Togo', 'th' => 'Thailand', 'tj' => 'Tajikistan', 'tk' => 'Tokelau', 'tl' => 'Timor-Leste', 'tm' => 'Turkmenistan', 'tn' => 'Tunisia', 'to' => 'Tonga', 'tr' => 'Turkey', 'tt' => 'Trinidad and Tobago', 'tv' => 'Tuvalu', 'tw' => 'Taiwan', 'tz' => 'Tanzania', 'ua' => 'Ukraine', 'ug' => 'Uganda', 'um' => 'U.S. Minor Outlying Islands', 'us' => 'United States', 'uy' => 'Uruguay', 'uz' => 'Uzbekistan', 'va' => 'Vatican City', 'vc' => 'Saint Vincent and the Grenadines', 've' => 'Venezuela', 'vg' => 'British Virgin Islands', 'vi' => 'U.S. Virgin Islands', 'vn' => 'Vietnam', 'vu' => 'Vanuatu', 'wf' => 'Wallis and Futuna', 'ws' => 'Samoa', 'ye' => 'Yemen', 'yt' => 'Mayotte', 'za' => 'South Africa', 'zm' => 'Zambia', 'zw' => 'Zimbabwe', ]; /** * Returns the script direction in format compatible with the HTML "dir" attribute. * * @see http://www.w3.org/International/tutorials/bidi-xhtml/ * @param string $locale Optional locale incl. region (underscored) * @return string "rtl" or "ltr" */ public function scriptDirection($locale = null) { $dirs = static::config()->get('text_direction'); if (!$locale) { $locale = i18n::get_locale(); } if (isset($dirs[$locale])) { return $dirs[$locale]; } $lang = $this->langFromLocale($locale); if (isset($dirs[$lang])) { return $dirs[$lang]; } return 'ltr'; } /** * 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" */ public function localeFromLang($lang) { $lang = Locale::canonicalize($lang); // Check subtags $subtags = $this->config()->get('likely_subtags'); if (isset($subtags[$lang])) { return $subtags[$lang]; } // Search locales $locales = $this->config()->get('locales'); foreach ($locales as $locale => $name) { if (Locale::filterMatches($lang, $locale)) { return $locale; } } // Default to lang_LANG return strtolower($lang) . '_' . strtoupper($lang); } /** * Returns the "short" language name from a locale, * e.g. "en_US" would return "en". * * @param string $locale E.g. "en_US" * @return string Short language code, e.g. "en" */ public function langFromLocale($locale) { return Locale::getPrimaryLanguage($locale); } /** * Cache of localised locales, keyed by locale localised in * * @var array */ private static $cache_locales = []; /** * Get all locale codes and names * * @return array Map of locale code => name */ public function getLocales() { // Cache by locale $locale = i18n::get_locale(); if (!empty(static::$cache_locales[$locale])) { return static::$cache_locales[$locale]; } // Localise all locales $locales = $this->config()->get('locales'); $localised = []; foreach ($locales as $code => $default) { $localised[$code] = $this->localeName($code); } // Save cache static::$cache_locales[$locale] = $localised; return $localised; } /** * Cache of localised languages, keyed by locale localised in * * @var array */ private static $cache_languages = []; /** * Get all language codes and names * * @return array Map of language code => name */ public function getLanguages() { // Cache by locale $locale = i18n::get_locale(); if (!empty(static::$cache_languages[$locale])) { return static::$cache_languages[$locale]; } // Localise all languages $languages = $this->config()->get('languages'); $localised = []; foreach ($languages as $code => $default) { $localised[$code] = $this->languageName($code); } // Save cache static::$cache_languages[$locale] = $localised; return $localised; } /** * Get name of locale * * @param string $locale * @return string */ public function localeName($locale) { return Locale::getDisplayName($locale, i18n::get_locale()); } /** * Get language name for this language or locale code * * @param string $code * @return string */ public function languageName($code) { return Locale::getDisplayLanguage($code, i18n::get_locale()); } /** * Cache of localised countries, keyed by locale localised in * * @var array */ private static $cache_countries = []; /** * Get all country codes and names * * @return array Map of country code => name */ public function getCountries() { // Cache by locale $locale = i18n::get_locale(); if (!empty(static::$cache_countries[$locale])) { return static::$cache_countries[$locale]; } // Localise all countries $countries = $this->config()->get('countries'); $localised = []; foreach ($countries as $code => $default) { $localised[$code] = $this->countryName($code); } // Always sort by localised name, not key $collator = new Collator(i18n::get_locale()); $collator->asort($localised); static::$cache_countries[$locale] = $localised; return $localised; } /** * Get name of country * * @param string $code ISO 3166-1 country code * @return string */ public function countryName($code) { return Locale::getDisplayRegion('-' . $code, i18n::get_locale()); } /** * Returns the country code / suffix on any locale * * @param string $locale E.g. "en_US" * @return string Country code, e.g. "us" */ public function countryFromLocale($locale) { return strtolower(Locale::getRegion($locale)) ?: null; } /** * Validates a "long" locale format (e.g. "en_US") by checking it against {@link $locales}. * * @param string $locale * @return bool */ public function validate($locale) { if (!$locale) { return false; } $lang = $this->langFromLocale($locale); $region = $this->countryFromLocale($locale); if (!$lang || !$region) { return false; } // Check the configurable whitelist $localeCode = strtolower($lang) . '_' . strtoupper($region); $locales = $this->getLocales(); if (array_key_exists($localeCode, $locales) || array_key_exists(strtolower($localeCode), $locales) ) { return true; } // Fallback return strcasecmp($lang, $region) && strcasecmp($lang, $locale) && strcasecmp($region, $locale); } /** * Reset the local cache of this object */ public static function reset() { static::$cache_countries = []; static::$cache_languages = []; static::$cache_locales = []; } }