package lang; # $Id$ use diagnostics; use strict; use common; use log; #- key: lang name (locale name for some (~5) special cases needing #- extra distinctions) #- [0]: lang name in english #- [1]: transliterated locale name in the locale name (used for sorting) #- [2]: default locale name to use for that language if there isn't #- an existing locale for the combination language+country choosen #- [3]: geographic groups that this language belongs to (for displaying #- in the menu grouped in smaller lists), 1=Europe, 2=Asia, 3=Africa, #- 4=Oceania&Pacific, 5=America (if you wonder, it's the order #- used in the olympic flag) #- [4]: special value for LANGUAGE variable (if different of the default #- of 'll_CC:ll_DD:ll' (ll_CC: locale (if exist) resulting of the #- combination of chosen lang (ll) and country (CC), ll_DD: the #- default locale shown here (field [2]) and ll: the language (the key)) my %langs = ( 'af' => [ 'Afrikaans', 'Afrikaans', 'af_ZA', ' 3 ', 'iso-8859-1' ], 'am' => [ 'Amharic', 'ZZ emarNa', 'am_ET', ' 3 ', 'utf_am' ], #- doesn't work well after install #'ar' => [ 'Arabic', 'AA Arabic', 'ar_EG', ' 23 ', 'utf_ar' ], 'az' => [ 'Azeri (Latin)', 'Azerbaycanca', 'az_AZ', ' 2 ', 'utf_az' ], 'be' => [ 'Belarussian', 'Belaruskaya', 'be_BY', '1 ', 'cp1251' ], 'bg' => [ 'Bulgarian', 'Blgarski', 'bg_BG', '1 ', 'cp1251' ], 'bn' => [ 'Bengali', 'ZZ Bengali', 'bn_BD', ' 2 ', 'unicode' ], 'br' => [ 'Brezhoneg', 'Brezhoneg', 'br_FR', '1 ', 'iso-8859-15', 'br:fr_FR:fr' ], 'bs' => [ 'Bosnian', 'Bosanski', 'bs_BA', '1 ', 'iso-8859-2' ], 'ca' => [ 'Catalan', 'Catala', 'ca_ES', '1 ', 'iso-8859-15', 'ca:es_ES:es' ], 'cs' => [ 'Czech', 'Cestina', 'cs_CZ', '1 ', 'iso-8859-2' ], 'cy' => [ 'Cymraeg (Welsh)', 'Cymraeg', 'cy_GB', '1 ', 'utf_lat8', 'cy:en_GB:en' ], 'da' => [ 'Danish', 'Dansk', 'da_DK', '1 ', 'iso-8859-15' ], 'de' => [ 'German', 'Deutsch', 'de_DE', '1 ', 'iso-8859-15' ], 'el' => [ 'Greek', 'Ellynika', 'el_GR', '1 ', 'iso-8859-7' ], 'en_GB' => [ 'English (British)', 'English (British)', 'en_GB', '12345', 'iso-8859-15' ], 'en_US' => [ 'English (American)', 'English (American)', 'en_US', ' 5', 'C' ], 'eo' => [ 'Esperanto', 'Esperanto', 'eo_XX', '12345', 'unicode' ], 'es' => [ 'Spanish', 'Espanol', 'es_ES', '1 3 5', 'iso-8859-15' ], 'et' => [ 'Estonian', 'Eesti', 'et_EE', '1 ', 'iso-8859-15' ], 'eu' => [ 'Euskara (Basque)', 'Euskara', 'eu_ES', '1 ', 'iso-8859-15' ], 'fa' => [ 'Farsi (Iranian)', 'AA Farsi', 'fa_IR', ' 2 ', 'utf_ar' ], 'fi' => [ 'Finnish (Suomi)', 'Suomi', 'fi_FI', '1 ', 'iso-8859-15' ], #'fo' => [ 'Faroese', 'Foroyskt', 'fo_FO', '1 ', 'iso-8859-1' ], 'fr' => [ 'French', 'Francais', 'fr_FR', '1 345', 'iso-8859-15' ], 'ga' => [ 'Gaelic (Irish)', 'Gaeilge', 'ga_IE', '1 ', 'iso-8859-15', 'ga:en_IE:en_GB:en' ], #'gd' => [ 'Gaelic (Scottish)', 'Gaidhlig', 'gb_GB', '1 ', 'utf_lat8', 'gd:en_GB:en' ], 'gl' => [ 'Galego (Galician)', 'Galego', 'gl_ES', '1 ', 'iso-8859-15', 'gl:es_ES:es:pt:pt_BR' ], #'gv' => [ 'Gaelic (Manx)', 'Gaelg', 'gv_GB', '1 ', 'utf_lat8', 'gv:en_GB:en' ], 'he' => [ 'Hebrew', 'AA Ivrit', 'he_IL', ' 2 ', 'utf_he' ], 'hi' => [ 'Hindi', 'ZZ Hindi', 'hi_IN', ' 2 ', 'unicode' ], 'hr' => [ 'Croatian', 'Hrvatski', 'hr_HR', '1 ', 'iso-8859-2' ], 'hu' => [ 'Hungarian', 'Magyar', 'hu_HU', '1 ', 'iso-8859-2' ], 'hy' => [ 'Armenian', 'ZZ Armenian', 'hy_AM', ' 2 ', 'utf_hy' ], #'ia' => [ 'Interlingua', 'Interlingua', 'ia_XX', '1 5', 'utf8' ], 'id' => [ 'Indonesian', 'Bahasa Indonesia', 'id_ID', ' 2 ', 'iso-8859-1' ], 'is' => [ 'Icelandic', 'Islenska', 'is_IS', '1 ', 'iso-8859-1' ], 'it' => [ 'Italian', 'Italiano', 'it_IT', '1 ', 'iso-8859-15' ], #-'iu' => [ 'Inuktitut', 'ZZ Inuktitut', 'iu_CA', ' 5', 'utf_iu' ], 'ja' => [ 'Japanese', 'ZZ Nihongo', 'ja_JP', ' 2 ', 'jisx0208' ], 'ka' => [ 'Georgian', 'ZZ Georgian', 'ka_GE', ' 2 ', 'utf_ka' ], #-'kl' => [ 'Greenlandic (inuit)', 'ZZ Inuit', 'kl_GL', ' 5', 'iso-8859-1' ], 'kn' => [ 'Kannada', 'ZZ Kannada', 'kn_IN', ' 2 ', 'unicode' ], 'ko' => [ 'Korean', 'ZZ Korea', 'ko_KR', ' 2 ', 'ksc5601' ], #-'kw' => [ 'Cornish', 'Kernewek', 'kw_GB', '1 ', 'utf_lat8', 'kw:en_GB:en' ], 'lo' => [ 'Laotian', 'Laotian', 'lo_LA', ' 2 ', 'utf_lo' ], 'lt' => [ 'Lithuanian', 'Lietuviskai', 'lt_LT', '1 ', 'iso-8859-13' ], 'lv' => [ 'Latvian', 'Latviesu', 'lv_LV', '1 ', 'iso-8859-13' ], 'mi' => [ 'Maori', 'Maori', 'mi_NZ', ' 4 ', 'unicode' ], 'mk' => [ 'Macedonian', 'Makedonski', 'mk_MK', '1 ', 'utf_cyr1' ], 'mn' => [ 'Mongolian', 'Mongol', 'mn_MN', ' 2 ', 'utf_cyr2' ], 'ms' => [ 'Malay', 'Bahasa Melayu', 'ms_MY', ' 2 ', 'iso-8859-1' ], 'mt' => [ 'Maltese', 'Maltin', 'mt_MT', '1 3 ', 'unicode' ], 'nb' => [ 'Norwegian Bokmaal', 'Norsk, Bokmal', 'no_NO', '1 ', 'iso-8859-1', 'nb:no' ], 'nl' => [ 'Dutch', 'Nederlands', 'nl_NL', '1 ', 'iso-8859-15' ], 'nn' => [ 'Norwegian Nynorsk', 'Norsk, Nynorsk', 'nn_NO', '1 ', 'iso-8859-1', 'nn:no@nynorsk:no_NY:no:nb' ], #-'oc' => [ 'Occitan', 'Occitan', 'oc_FR', '1 ', 'iso-8859-1', 'oc:fr_FR:fr' ], #-'ph' => [ 'Pilipino', 'Pilipino', 'ph_PH', ' 2 ', 'iso-8859-1', 'ph:tl' ], 'pl' => [ 'Polish', 'Polski', 'pl_PL', '1 ', 'iso-8859-2' ], 'pt' => [ 'Portuguese', 'Portugues', 'pt_PT', '1 3 ', 'iso-8859-15', 'pt_PT:pt:pt_BR' ], 'pt_BR' => [ 'Portuguese Brazil', 'Portugues do Brasil', 'pt_BR', ' 5', 'iso-8859-1', 'pt_BR:pt_PT:pt' ], 'ro' => [ 'Romanian', 'Romana', 'ro_RO', '1 ', 'iso-8859-2' ], 'ru' => [ 'Russian', 'Russkij', 'ru_RU', '12 ', 'koi8-r' ], 'sk' => [ 'Slovak', 'Slovencina', 'sk_SK', '1 ', 'iso-8859-2' ], 'sl' => [ 'Slovenian', 'Slovenscina', 'sl_SI', '1 ', 'iso-8859-2' ], 'sp' => [ 'Serbian Cyrillic', 'Srpska', 'sp_YU', '1 ', 'iso-8859-5', 'sp:sr' ], 'sq' => [ 'Albanian', 'Shqip', 'sq_AL', '1 ', 'iso-8859-1' ], 'sr' => [ 'Serbian Latin', 'Srpska', 'sr_YU', '1 ', 'iso-8859-2' ], 'sv' => [ 'Swedish', 'Svenska', 'sv_SE', '1 ', 'iso-8859-1' ], 'ta' => [ 'Tamil', 'ZZ Tamil', 'ta_IN', ' 2 ', 'utf_ta' ], 'tg' => [ 'Tajik', 'Tojiki', 'tg_TJ', ' 2 ', 'utf_cyr2' ], 'th' => [ 'Thai', 'ZZ Thai', 'th_TH', ' 2 ', 'tis620' ], 'tr' => [ 'Turkish', 'Turkce', 'tr_TR', ' 2 ', 'iso-8859-9' ], #-'tt' => [ 'Tatar', 'Tatar', 'tt_RU', ' 2 ', 'utf_cyr2' ], 'uk' => [ 'Ukrainian', 'Ukrayinska', 'uk_UA', '1 ', 'koi8-u' ], #-'ur' => [ 'Urdu', 'AA Urdu', 'ur_PK', ' 2 ', 'utf_ar' ], 'uz' => [ 'Uzbek', 'Ozbekcha', 'uz_UZ', ' 2 ', 'unicode' ], 'vi' => [ 'Vietnamese', 'Tieng Viet', 'vi_VN', ' 2 ', 'utf_vi' ], 'wa' => [ 'Walon', 'Walon', 'wa_BE', '1 ', 'iso-8859-15', 'wa:fr_BE:fr' ], #- Xhosa locale (xh_ZA) is not yet available, using en_ZA instead, #- and defining a LANGUAGE variable #waiting for lang-xh.png, it has kde trans. #-'xh' => [ 'Xhosa', 'IsiXhosa', 'xh_ZA', ' 3 ', 'iso-8859-1', 'xh:en_ZA' ], #-'yi' => [ 'Yiddish', 'AA Yidish', 'yi_US', '1 5', 'utf_he' ], 'zh_CN' => [ 'Chinese Simplified', 'ZZ ZhongWen', 'zh_CN', ' 2 ', 'gb2312', 'zh_CN.GB2312:zh_CN:zh' ], 'zh_TW' => [ 'Chinese Traditional', 'ZZ ZhongWen', 'zh_TW', ' 2 ', 'Big5', 'zh_TW.Big5:zh_TW:zh_HK:zh' ], ); sub l2name { exists $langs{$_[0]} && $langs{$_[0]}[0] } sub l2transliterated { exists $langs{$_[0]} && $langs{$_[0]}[1] } sub l2locale { exists $langs{$_[0]} && $langs{$_[0]}[2] } sub l2location { my %geo = (1 => 'Europe', 2 => 'Asia', 3 => 'Africa', 4 => 'Oceania/Pacific', 5 => 'America'); map { if_($langs{$_[0]}[3] =~ $_, $geo{$_}) } 1..5; } sub l2charset { exists $langs{$_[0]} && $langs{$_[0]}[4] } sub l2language { exists $langs{$_[0]} && $langs{$_[0]}[5] } sub list_langs { my (%options) = @_; my @l = keys %langs; $options{exclude_non_installed} ? grep { -e "/usr/share/locale/".l2locale($_)."/LC_CTYPE" } @l : @l; } sub text_direction_rtl { N("default:LTR") eq "default:RTL" } #- key: country name (that should be YY in xx_YY locale) #- [0]: country name in natural language #- [1]: default locale for that country #- [2]: geographic groups that this country belongs to (for displaying #- in the menu grouped in smaller lists), 1=Europe, 2=Asia, 3=Africa, #- 4=Oceania&Pacific, 5=America (if you wonder, it's the order #- used in the olympic flag) #- #- Note: for countries for which a glibc locale don't exist (yet) I tried to #- put a locale that makes sense; and a '#' at the end of the line to show #- the locale is not the "correct" one. 'en_US' is used when no good choice #- is available. my %countries = ( 'AF' => [ N_("Afghanistan"), 'en_US', '2' ], # 'AD' => [ N_("Andorra"), 'ca_ES', '1' ], # 'AE' => [ N_("United Arab Emirates"), 'ar_AE', '2' ], 'AG' => [ N_("Antigua and Barbuda"), 'en_US', '5' ], # 'AI' => [ N_("Anguilla"), 'en_US', '5' ], # 'AL' => [ N_("Albania"), 'sq_AL', '1' ], 'AM' => [ N_("Armenia"), 'hy_AM', '2' ], 'AN' => [ N_("Netherlands Antilles"), 'en_US', '5' ], # 'AO' => [ N_("Angola"), 'pt_PT', '3' ], # 'AQ' => [ N_("Antarctica"), 'en_US', '4' ], # 'AR' => [ N_("Argentina"), 'es_AR', '5' ], 'AS' => [ N_("American Samoa"), 'en_US', '4' ], # 'AT' => [ N_("Austria"), 'de_AT', '1' ], 'AU' => [ N_("Australia"), 'en_AU', '4' ], 'AW' => [ N_("Aruba"), 'en_US', '5' ], # 'AZ' => [ N_("Azerbaijan"), 'az_AZ', '1' ], 'BA' => [ N_("Bosnia and Herzegovina"), 'bs_BA', '1' ], 'BB' => [ N_("Barbados"), 'en_US', '5' ], # 'BD' => [ N_("Bangladesh"), 'bn_BD', '2' ], 'BE' => [ N_("Belgium"), 'fr_BE', '1' ], 'BF' => [ N_("Burkina Faso"), 'en_US', '3' ], # 'BG' => [ N_("Bulgaria"), 'bg_BG', '1' ], 'BH' => [ N_("Bahrain"), 'ar_BH', '2' ], 'BI' => [ N_("Burundi"), 'en_US', '3' ], # 'BJ' => [ N_("Benin"), 'fr_FR', '3' ], # 'BM' => [ N_("Bermuda"), 'en_US', '5' ], # 'BN' => [ N_("Brunei Darussalam"), 'ar_EG', '2' ], # 'BO' => [ N_("Bolivia"), 'es_BO', '5' ], 'BR' => [ N_("Brazil"), 'pt_BR', '5' ], 'BS' => [ N_("Bahamas"), 'en_US', '5' ], # 'BT' => [ N_("Bhutan"), 'en_IN', '2' ], # 'BV' => [ N_("Bouvet Island"), 'en_US', '3' ], # 'BW' => [ N_("Botswana"), 'en_BW', '3' ], 'BY' => [ N_("Belarus"), 'be_BY', '1' ], 'BZ' => [ N_("Belize"), 'en_US', '5' ], # 'CA' => [ N_("Canada"), 'en_CA', '5' ], 'CC' => [ N_("Cocos (Keeling) Islands"), 'en_US', '4' ], # 'CD' => [ N_("Congo (Kinshasa)"), 'fr_FR', '3' ], # 'CF' => [ N_("Central African Republic"), 'fr_FR', '3' ], # 'CG' => [ N_("Congo (Brazzaville)"), 'fr_FR', '3' ], # 'CH' => [ N_("Switzerland"), 'de_CH', '1' ], 'CI' => [ N_("Cote d'Ivoire"), 'fr_FR', '3' ], # 'CK' => [ N_("Cook Islands"), 'en_US', '4' ], # 'CL' => [ N_("Chile"), 'es_CL', '5' ], 'CM' => [ N_("Cameroon"), 'fr_FR', '3' ], # 'CN' => [ N_("China"), 'zh_CN', '2' ], 'CO' => [ N_("Colombia"), 'es_CO', '5' ], 'CR' => [ N_("Costa Rica"), 'es_CR', '5' ], 'CU' => [ N_("Cuba"), 'es_DO', '5' ], # 'CV' => [ N_("Cape Verde"), 'pt_PT', '3' ], # 'CX' => [ N_("Christmas Island"), 'en_US', '4' ], # 'CY' => [ N_("Cyprus"), 'en_US', '1' ], # 'CZ' => [ N_("Czech Republic"), 'cs_CZ', '2' ], 'DE' => [ N_("Germany"), 'de_DE', '1' ], 'DJ' => [ N_("Djibouti"), 'en_US', '3' ], # 'DK' => [ N_("Denmark"), 'da_DK', '1' ], 'DM' => [ N_("Dominica"), 'en_US', '5' ], # 'DO' => [ N_("Dominican Republic"), 'es_DO', '5' ], 'DZ' => [ N_("Algeria"), 'ar_DZ', '3' ], 'EC' => [ N_("Ecuador"), 'es_EC', '5' ], 'EE' => [ N_("Estonia"), 'et_EE', '1' ], 'EG' => [ N_("Egypt"), 'ar_EG', '3' ], 'EH' => [ N_("Western Sahara"), 'ar_MA', '3' ], # 'ER' => [ N_("Eritrea"), 'ti_ER', '3' ], 'ES' => [ N_("Spain"), 'es_ES', '1' ], 'ET' => [ N_("Ethiopia"), 'am_ET', '3' ], 'FI' => [ N_("Finland"), 'fi_FI', '1' ], 'FJ' => [ N_("Fiji"), 'en_US', '4' ], # 'FK' => [ N_("Falkland Islands (Malvinas)"), 'en_GB', '5' ], # 'FM' => [ N_("Micronesia"), 'en_US', '4' ], # 'FO' => [ N_("Faroe Islands"), 'fo_FO', '1' ], 'FR' => [ N_("France"), 'fr_FR', '1' ], 'GA' => [ N_("Gabon"), 'fr_FR', '3' ], # 'GB' => [ N_("United Kingdom"), 'en_GB', '1' ], 'GD' => [ N_("Grenada"), 'en_US', '5' ], # 'GE' => [ N_("Georgia"), 'ka_GE', '2' ], 'GF' => [ N_("French Guiana"), 'fr_FR', '5' ], # 'GH' => [ N_("Ghana"), 'fr_FR', '3' ], # 'GI' => [ N_("Gibraltar"), 'en_GB', '1' ], # 'GL' => [ N_("Greenland"), 'kl_GL', '5' ], 'GM' => [ N_("Gambia"), 'en_US', '3' ], # 'GN' => [ N_("Guinea"), 'en_US', '3' ], # 'GP' => [ N_("Guadeloupe"), 'fr_FR', '5' ], # 'GQ' => [ N_("Equatorial Guinea"), 'en_US', '3' ], # 'GR' => [ N_("Greece"), 'el_GR', '1' ], 'GS' => [ N_("South Georgia and the South Sandwich Islands"), 'en_US', '4' ], # 'GT' => [ N_("Guatemala"), 'es_GT', '5' ], 'GU' => [ N_("Guam"), 'en_US', '4' ], # 'GW' => [ N_("Guinea-Bissau"), 'pt_PT', '3' ], # 'GY' => [ N_("Guyana"), 'en_US', '5' ], # 'HK' => [ N_("China") . ' (' . N_("Hong Kong") . ')', 'zh_HK', '2' ], 'HM' => [ N_("Heard and McDonald Islands"), 'en_US', '4' ], # 'HN' => [ N_("Honduras"), 'es_HN', '5' ], 'HR' => [ N_("Croatia"), 'hr_HR', '1' ], 'HT' => [ N_("Haiti"), 'fr_FR', '5' ], # 'HU' => [ N_("Hungary"), 'hu_HU', '1' ], 'ID' => [ N_("Indonesia"), 'id_ID', '2' ], 'IE' => [ N_("Ireland"), 'en_IE', '1' ], 'IL' => [ N_("Israel"), 'he_IL', '2' ], 'IN' => [ N_("India"), 'hi_IN', '2' ], 'IO' => [ N_("British Indian Ocean Territory"), 'en_GB', '2' ], # 'IQ' => [ N_("Iraq"), 'ar_IQ', '2' ], 'IR' => [ N_("Iran"), 'fa_IR', '2' ], 'IS' => [ N_("Iceland"), 'is_IS', '1' ], 'IT' => [ N_("Italy"), 'it_IT', '1' ], 'JM' => [ N_("Jamaica"), 'en_US', '5' ], # 'JO' => [ N_("Jordan"), 'ar_JO', '2' ], 'JP' => [ N_("Japan"), 'ja_JP', '2' ], 'KE' => [ N_("Kenya"), 'en_ZW', '3' ], # 'KG' => [ N_("Kyrgyzstan"), 'en_US', '2' ], # 'KH' => [ N_("Cambodia"), 'en_US', '2' ], # kh_KH not released yet 'KI' => [ N_("Kiribati"), 'en_US', '3' ], # 'KM' => [ N_("Comoros"), 'en_US', '2' ], # 'KN' => [ N_("Saint Kitts and Nevis"), 'en_US', '5' ], # 'KP' => [ N_("Korea (North)"), 'ko_KR', '2' ], # 'KR' => [ N_("Korea"), 'ko_KR', '2' ], 'KW' => [ N_("Kuwait"), 'ar_KW', '2' ], 'KY' => [ N_("Cayman Islands"), 'en_US', '5' ], # 'KZ' => [ N_("Kazakhstan"), 'ru_RU', '2' ], # 'LA' => [ N_("Laos"), 'lo_LA', '2' ], 'LB' => [ N_("Lebanon"), 'ar_LB', '2' ], 'LC' => [ N_("Saint Lucia"), 'en_US', '5' ], # 'LI' => [ N_("Liechtenstein"), 'de_CH', '1' ], # 'LK' => [ N_("Sri Lanka"), 'en_IN', '2' ], # 'LR' => [ N_("Liberia"), 'en_US', '3' ], # 'LS' => [ N_("Lesotho"), 'en_BW', '3' ], # 'LT' => [ N_("Lithuania"), 'lt_LT', '1' ], 'LU' => [ N_("Luxembourg"), 'de_LU', '1' ], 'LV' => [ N_("Latvia"), 'lv_LV', '1' ], 'LY' => [ N_("Libya"), 'ar_LY', '3' ], 'MA' => [ N_("Morocco"), 'ar_MA', '3' ], 'MC' => [ N_("Monaco"), 'fr_FR', '1' ], # 'MD' => [ N_("Moldova"), 'ro_RO', '1' ], # 'MG' => [ N_("Madagascar"), 'fr_FR', '3' ], # 'MH' => [ N_("Marshall Islands"), 'en_US', '4' ], # 'MK' => [ N_("Macedonia"), 'mk_MK', '1' ], 'ML' => [ N_("Mali"), 'en_US', '3' ], # 'MM' => [ N_("Myanmar"), 'en_US', '2' ], # 'MN' => [ N_("Mongolia"), 'mn_MN', '2' ], 'MP' => [ N_("Northern Mariana Islands"), 'en_US', '2' ], # 'MQ' => [ N_("Martinique"), 'fr_FR', '5' ], # 'MR' => [ N_("Mauritania"), 'en_US', '3' ], # 'MS' => [ N_("Montserrat"), 'en_US', '5' ], # 'MT' => [ N_("Malta"), 'mt_MT', '1' ], 'MU' => [ N_("Mauritius"), 'en_US', '3' ], # 'MV' => [ N_("Maldives"), 'en_US', '4' ], # 'MW' => [ N_("Malawi"), 'en_US', '3' ], # 'MX' => [ N_("Mexico"), 'es_MX', '5' ], 'MY' => [ N_("Malaysia"), 'ms_MY', '2' ], 'MZ' => [ N_("Mozambique"), 'pt_PT', '3' ], # 'NA' => [ N_("Namibia"), 'en_US', '3' ], # 'NC' => [ N_("New Caledonia"), 'fr_FR', '4' ], # 'NE' => [ N_("Niger"), 'en_US', '3' ], # 'NF' => [ N_("Norfolk Island"), 'en_GB', '4' ], # 'NG' => [ N_("Nigeria"), 'en_US', '3' ], # 'NI' => [ N_("Nicaragua"), 'es_NI', '5' ], 'NL' => [ N_("Netherlands"), 'nl_NL', '1' ], 'NO' => [ N_("Norway"), 'no_NO', '1' ], 'NP' => [ N_("Nepal"), 'en_IN', '2' ], # 'NR' => [ N_("Nauru"), 'en_US', '4' ], # 'NU' => [ N_("Niue"), 'en_US', '4' ], # 'NZ' => [ N_("New Zealand"), 'en_NZ', '4' ], 'OM' => [ N_("Oman"), 'ar_OM', '2' ], 'PA' => [ N_("Panama"), 'es_PA', '5' ], 'PE' => [ N_("Peru"), 'es_PE', '5' ], 'PF' => [ N_("French Polynesia"), 'fr_FR', '4' ], # 'PG' => [ N_("Papua New Guinea"), 'en_NZ', '4' ], # 'PH' => [ N_("Philippines"), 'ph_PH', '2' ], 'PK' => [ N_("Pakistan"), 'ur_PK', '2' ], 'PL' => [ N_("Poland"), 'pl_PL', '1' ], 'PM' => [ N_("Saint Pierre and Miquelon"), 'fr_CA', '5' ], # 'PN' => [ N_("Pitcairn"), 'en_US', '4' ], # 'PR' => [ N_("Puerto Rico"), 'es_PR', '5' ], 'PS' => [ N_("Palestine"), 'ar_JO', '2' ], # 'PT' => [ N_("Portugal"), 'pt_PT', '1' ], 'PY' => [ N_("Paraguay"), 'es_PY', '5' ], 'PW' => [ N_("Palau"), 'en_US', '2' ], # 'QA' => [ N_("Qatar"), 'ar_QA', '2' ], 'RE' => [ N_("Reunion"), 'fr_FR', '2' ], # 'RO' => [ N_("Romania"), 'ro_RO', '1' ], 'RU' => [ N_("Russia"), 'ru_RU', '1' ], 'RW' => [ N_("Rwanda"), 'fr_FR', '3' ], # 'SA' => [ N_("Saudi Arabia"), 'ar_SA', '2' ], 'SB' => [ N_("Solomon Islands"), 'en_US', '4' ], # 'SC' => [ N_("Seychelles"), 'en_US', '4' ], # 'SD' => [ N_("Sudan"), 'ar_SD', '5' ], 'SE' => [ N_("Sweden"), 'sv_SE', '1' ], 'SG' => [ N_("Singapore"), 'en_SG', '2' ], 'SH' => [ N_("Saint Helena"), 'en_GB', '5' ], # 'SI' => [ N_("Slovenia"), 'sl_SI', '1' ], 'SJ' => [ N_("Svalbard and Jan Mayen Islands"), 'en_US', '1' ], # 'SK' => [ N_("Slovakia"), 'sk_SK', '1' ], 'SL' => [ N_("Sierra Leone"), 'en_US', '3' ], # 'SM' => [ N_("San Marino"), 'it_IT', '1' ], # 'SN' => [ N_("Senegal"), 'fr_FR', '3' ], # 'SO' => [ N_("Somalia"), 'en_US', '3' ], # 'SR' => [ N_("Suriname"), 'nl_NL', '5' ], # 'ST' => [ N_("Sao Tome and Principe"), 'en_US', '5' ], # 'SV' => [ N_("El Salvador"), 'es_SV', '5' ], 'SY' => [ N_("Syria"), 'ar_SY', '2' ], 'SZ' => [ N_("Swaziland"), 'en_BW', '3' ], # 'TC' => [ N_("Turks and Caicos Islands"), 'en_US', '5' ], # 'TD' => [ N_("Chad"), 'en_US', '3' ], # 'TF' => [ N_("French Southern Territories"), 'fr_FR', '4' ], # 'TG' => [ N_("Togo"), 'fr_FR', '3' ], # 'TH' => [ N_("Thailand"), 'th_TH', '2' ], 'TJ' => [ N_("Tajikistan"), 'tg_TJ', '2' ], 'TK' => [ N_("Tokelau"), 'en_US', '4' ], # 'TL' => [ N_("East Timor"), 'pt_PT', '4' ], # 'TM' => [ N_("Turkmenistan"), 'en_US', '2' ], # 'TN' => [ N_("Tunisia"), 'ar_TN', '5' ], 'TO' => [ N_("Tonga"), 'en_US', '3' ], # 'TR' => [ N_("Turkey"), 'tr_TR', '2' ], 'TT' => [ N_("Trinidad and Tobago"), 'en_US', '5' ], # 'TV' => [ N_("Tuvalu"), 'en_US', '4' ], # 'TW' => [ N_("Taiwan"), 'zh_TW', '2' ], 'TZ' => [ N_("Tanzania"), 'en_US', '3' ], # 'UA' => [ N_("Ukraine"), 'uk_UA', '1' ], 'UG' => [ N_("Uganda"), 'en_US', '3' ], # 'UM' => [ N_("United States Minor Outlying Islands"), 'en_US', '5' ], # 'US' => [ N_("United States"), 'en_US', '5' ], 'UY' => [ N_("Uruguay"), 'es_UY', '5' ], 'UZ' => [ N_("Uzbekistan"), 'uz_UZ', '2' ], 'VA' => [ N_("Vatican"), 'it_IT', '1' ], # 'VC' => [ N_("Saint Vincent and the Grenadines"), 'en_US', '5' ], 'VE' => [ N_("Venezuela"), 'es_VE', '5' ], 'VG' => [ N_("Virgin Islands (British)"), 'en_GB', '5' ], # 'VI' => [ N_("Virgin Islands (U.S.)"), 'en_US', '5' ], # 'VN' => [ N_("Vietnam"), 'vi_VN', '2' ], 'VU' => [ N_("Vanuatu"), 'en_US', '4' ], # 'WF' => [ N_("Wallis and Futuna"), 'fr_FR', '4' ], # 'WS' => [ N_("Samoa"), 'en_US', '4' ], # 'YE' => [ N_("Yemen"), 'ar_YE', '2' ], 'YT' => [ N_("Mayotte"), 'fr_FR', '3' ], # 'YU' => [ N_("Serbia"), 'sp_YU', '1' ], 'ZA' => [ N_("South Africa"), 'en_ZA', '5' ], 'ZM' => [ N_("Zambia"), 'en_US', '3' ], # 'ZW' => [ N_("Zimbabwe"), 'en_ZW', '5' ], ); sub c2name { exists $countries{$_[0]} && translate($countries{$_[0]}[0]) } sub c2locale { exists $countries{$_[0]} && $countries{$_[0]}[1] } sub list_countries { my (%options) = @_; my @l = keys %countries; $options{exclude_non_installed} ? grep { -e "/usr/share/locale/".c2locale($_)."/LC_CTYPE" } @l : @l; } #- this list is built with 'cd /usr/share/i18n/locales ; echo ??_??' #- plus sp_YU, eo_XX, mn_MN, lo_LA, ph_PH, en_BE our @locales = qw(af_ZA am_ET ar_AE ar_BH ar_DZ ar_EG ar_IN ar_IQ ar_JO ar_KW ar_LB ar_LY ar_MA ar_OM ar_QA ar_SA ar_SD ar_SY ar_TN ar_YE az_AZ be_BY bg_BG bn_BD bn_IN br_FR bs_BA ca_ES cs_CZ cy_GB da_DK de_AT de_BE de_CH de_DE de_LU el_GR en_AU en_BW en_CA en_DK en_GB en_HK en_IE en_IN en_NZ en_PH en_SG en_US en_ZA en_ZW es_AR es_BO es_CL es_CO es_CR es_DO es_EC es_ES es_GT es_HN es_MX es_NI es_PA es_PE es_PR es_PY es_SV es_US es_UY es_VE et_EE eu_ES fa_IR fi_FI fo_FO fr_BE fr_CA fr_CH fr_FR fr_LU ga_IE gd_GB gl_ES gv_GB he_IL hi_IN hr_HR hu_HU hy_AM id_ID is_IS it_CH it_IT iw_IL ja_JP ka_GE kl_GL ko_KR kw_GB lt_LT lv_LV mi_NZ mk_MK mr_IN ms_MY mt_MT nl_BE nl_NL nn_NO no_NO oc_FR pl_PL pt_BR pt_PT ro_RO ru_RU ru_UA se_NO sk_SK sl_SI sq_AL sr_YU sv_FI sv_SE ta_IN te_IN tg_TJ th_TH ti_ER ti_ET tl_PH tr_TR tt_RU uk_UA ur_PK uz_UZ vi_VN wa_BE yi_US zh_CN zh_HK zh_SG zh_TW sp_YU eo_XX mn_MN lo_LA ph_PH en_BE); sub standard_locale { my ($lang, $country, $utf8) = @_; retry: member("${lang}_${country}", @locales) and return "${lang}_${country}".($utf8 ? '.UTF-8' : ''); length($lang) > 2 and $lang =~ s/^(..).*/$1/, goto retry; } sub getlocale_for_lang { my ($lang, $country, $utf8) = @_; standard_locale($lang, $country, $utf8) || l2locale($lang).($utf8 ? '.UTF-8' : ''); } sub getlocale_for_country { my ($lang, $country, $utf8) = @_; standard_locale($lang, $country, $utf8) || c2locale($country).($utf8 ? '.UTF-8' : ''); } sub getLANGUAGE { my ($lang, $country, $utf8) = @_; l2language($lang) || join(':', uniq(getlocale_for_lang($lang, $country, $utf8), $lang, if_($lang =~ /^(..)_/, $1))); } my %xim = ( #- xcin only works with 'zh_TW', 'zh_TW.Big5', 'zh_CN', 'zh_CN.GB2312' #- all other locale names, in particular 'zh_HK' or 'zh_TW.UTF-8' #- are unknown to it. So chinput is used for all but 'zh_TW' 'zh_TW' => { ENC => 'big5', XIM => 'xcin', XIM_PROGRAM => 'xcin', XMODIFIERS => '"@im=xcin-zh_TW"', CONSOLE_NOT_LOCALIZED => 'yes', }, 'zh_TW.UTF-8' => { ENC => 'utf8', XIM => 'Chinput', XIM_PROGRAM => 'chinput', XMODIFIERS => '"@im=Chinput"', CONSOLE_NOT_LOCALIZED => 'yes', }, 'zh_CN' => { ENC => 'gb', XIM => 'Chinput', XIM_PROGRAM => 'chinput', XMODIFIERS => '"@im=Chinput"', CONSOLE_NOT_LOCALIZED => 'yes', }, 'zh_CN.UTF-8' => { ENC => 'utf8', XIM => 'Chinput', XIM_PROGRAM => 'chinput', XMODIFIERS => '"@im=Chinput"', CONSOLE_NOT_LOCALIZED => 'yes', }, 'zh_SG' => { ENC => 'gb', XIM => 'Chinput', XIM_PROGRAM => 'chinput', XMODIFIERS => '"@im=Chinput"', CONSOLE_NOT_LOCALIZED => 'yes', }, 'zh_SG.UTF-8' => { ENC => 'utf8', XIM => 'Chinput', XIM_PROGRAM => 'chinput', XMODIFIERS => '"@im=Chinput"', CONSOLE_NOT_LOCALIZED => 'yes', }, 'zh_HK' => { ENC => 'big5', XIM => 'Chinput', XIM_PROGRAM => 'chinput', XMODIFIERS => '"@im=Chinput"', CONSOLE_NOT_LOCALIZED => 'yes', }, 'zh_HK.UTF-8' => { ENC => 'utf8', XIM => 'Chinput', XIM_PROGRAM => 'chinput', XMODIFIERS => '"@im=Chinput"', CONSOLE_NOT_LOCALIZED => 'yes', }, 'ko_KR' => { ENC => 'kr', XIM => 'Ami', #- NOTE: there are several possible versions of ami, for the different #- desktops (kde, gnome, etc). So XIM_PROGRAM isn't defined; it will #- be the xinitrc script, XIM section, that will choose the right one #- XIM_PROGRAM => 'ami', XMODIFIERS => '"@im=Ami"', CONSOLE_NOT_LOCALIZED => 'yes', }, 'ko_KR.UTF-8' => { ENC => 'utf8', XIM => 'Ami', #- NOTE: there are several possible versions of ami, for the different #- desktops (kde, gnome, etc). So XIM_PROGRAM isn't defined; it will #- be the xinitrc script, XIM section, that will choose the right one #- XIM_PROGRAM => 'ami', XMODIFIERS => '"@im=Ami"', CONSOLE_NOT_LOCALIZED => 'yes', }, 'ja_JP' => { ENC => 'eucj', XIM => 'kinput2', XIM_PROGRAM => 'kinput2', XMODIFIERS => '"@im=kinput2"', }, 'ja_JP.UTF-8' => { ENC => 'utf8', XIM => 'kinput2', XIM_PROGRAM => 'kinput2', XMODIFIERS => '"@im=kinput2"', }, #- XFree86 has an internal XIM for Thai that enables syntax checking etc. #- 'Passthroug' is no check at all, 'BasicCheck' accepts bad sequences #- and convert them to right ones, 'Strict' refuses bad sequences 'th_TH' => { XIM_PROGRAM => '/bin/true', #- it's an internal module XMODIFIERS => '"@im=BasicCheck"', }, #- xvnkb is not an XIM input method; but an input method of another #- kind, only XIM_PROGRAM needs to be defined #- ! xvnkb doesn't work in UTF-8 ! #- 'vi_VN.VISCII' => { #- XIM_PROGRAM => 'xvnkb', #- }, ); #- [0]: console font name #- [1]: sfm map for console font (if needed) #- [2]: acm file for console font (none if utf8) #- [3]: iocharset param for mount (utf8 if utf8) #- [4]: codepage parameter for mount (none if utf8) my %charsets = ( #- chinese needs sper--r--