blob: ad79cdb6b6186d3eba5e78192cb0f429ddb9d275 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
package timezone; # $Id$
use diagnostics;
use strict;
use vars;
use common;
use log;
sub getTimeZones {
my ($prefix) = @_;
local *F;
open F, "cd $prefix/usr/share/zoneinfo && find [A-Z]* -type f |";
my @l = chomp_(<F>);
close F or die "cannot list the available zoneinfos";
sort @l;
}
sub read {
my %t = getVarsFromSh("$::prefix/etc/sysconfig/clock") or return {};
{ timezone => $t{ZONE}, UTC => text2bool($t{UTC}) };
}
sub ntp_server {
my ($prefix, $server) = @_;
my $f = "$prefix/etc/ntp.conf";
-e $f or return;
if (@_ > 1) {
my $added = 0;
substInFile {
if (/^#?\s*server\s+(\S*)/ && $1 ne '127.127.1.0') {
$_ = $added ? "#server $1\n" : "server $server\n";
$added = 1;
}
} $f;
output("$prefix/etc/ntp/step-tickers", "$server\n");
} else {
($server) = grep { $_ ne '127.127.1.0' } map { if_(/^\s*server\s+(\S*)/, $1) } cat_($f);
}
$server;
}
sub write {
my ($prefix, $t) = @_;
ntp_server($prefix, $t->{ntp});
eval { cp_af("$prefix/usr/share/zoneinfo/$t->{timezone}", "$prefix/etc/localtime") };
$@ and log::l("installing /etc/localtime failed");
setVarsInSh("$prefix/etc/sysconfig/clock", {
ZONE => $t->{timezone},
UTC => bool2text($t->{UTC}),
ARC => "false",
});
}
my %l2t = (
'Afrikaans (South Africa)' => 'Africa/Johannesburg',
'Arabic' => 'Africa/Cairo',
'Armenian (Armenia)' => 'Asia/Yerevan',
'Azeri (Azerbaijan)' => 'Asia/Baku',
'Belarussian (Belarus)' => 'Europe/Minsk',
'Bosnian (Bosnia)' => 'Europe/Sarajevo',
'Brezhoneg (Brittany)' => 'Europe/Paris',
'Bulgarian (Bulgaria)' => 'Europe/Sofia',
'Catalan' => 'Europe/Madrid',
'Chinese Traditional (Taiwan)' => 'Asia/Taipei',
'Chinese Simplified (China)' => 'Asia/Beijing',
'Croatian (Bosnia)' => 'Europe/Sarajevo',
'Croatian (Croatia)' => 'Europe/Zagreb',
'Cymraeg (Welsh)' => 'Europe/London',
'Czech' => 'Europe/Prague',
'Danish (Denmark)' => 'Europe/Copenhagen',
'Dutch (Netherlands)' => 'Europe/Amsterdam',
'English (United States)' => 'America/New_York',
'English (United Kingdom)' => 'Europe/London',
'Esperanto' => 'Europe/Warsaw',
'Estonian (Estonia)' => 'Europe/Tallinn',
'Euskara (Basque)' => 'Europe/Madrid',
'Finnish (Finland)' => 'Europe/Helsinki',
'French (France)' => 'Europe/Paris',
'French (Belgium)' => 'Europe/Brussels',
'French (Canada)' => 'Canada/Atlantic', # or Newfoundland ? or Eastern ?
'Gaeilge (Ireland)' => 'Europe/Dublin',
'Galego' => 'Europe/Madrid',
'Georgian (Georgia)' => 'Asia/Yerevan',
'German (Austria)' => 'Europe/Vienna',
'German (Germany)' => 'Europe/Berlin',
'Greek (Greece)' => 'Europe/Athens',
'Greenlandic' => 'Arctic/Longyearbyen',
'Hebrew (Israel)' => 'Asia/Tel_Aviv',
'Hungarian (Hungary)' => 'Europe/Budapest',
'Icelandic (Iceland)' => 'Atlantic/Reykjavik',
'Indonesian (Indonesia)' => 'Asia/Jakarta',
'Iranian (Iran)' => 'Asia/Tehran',
'Italian (Italy)' => 'Europe/Rome',
#-'Italian (San Marino)' => 'Europe/San_Marino',
#-'Italian (Vatican)' => 'Europe/Vatican',
#-'Italian (Switzerland)' => 'Europe/Zurich',
'Japanese (Japon)' => 'Asia/Tokyo',
'Korean (Korea)' => 'Asia/Seoul',
'Latvian (Latvia)' => 'Europe/Riga',
'Lithuanian (Lithuania)' => 'Europe/Vilnius',
'Macedonian (Macedonia)' => 'Europe/Skopje',
'Maori (New Zealand)' => 'Australia/Sydney',
'Norwegian (Bokmaal)' => 'Europe/Oslo',
'Norwegian (Nynorsk)' => 'Europe/Oslo',
'Polish (Poland)' => 'Europe/Warsaw',
'Portuguese (Brazil)' => 'Brazil/East', # most people live on the east coast
'Portuguese (Portugal)' => 'Europe/Lisbon',
'Romanian (Rumania)' => 'Europe/Bucharest',
'Russian (Russia)' => 'Europe/Moscow',
'Serbian (Serbia)' => 'Europe/Belgrade',
'Slovak (Slovakia)' => 'Europe/Bratislava',
'Slovenian (Slovenia)' => 'Europe/Ljubljana',
'Spanish (Argentina)' => 'America/Buenos_Aires',
'Spanish (Mexico)' => 'America/Mexico_City',
'Spanish (Spain)' => 'Europe/Madrid',
'Swedish (Sweden)' => 'Europe/Stockholm',
'Tajik (Tajikistan)' => 'Asia/Dushanbe',
'Tamil (Sri Lanka)' => 'Asia/Colombo',
'Tatar' => 'Europe/Minsk',
'Thai (Thailand)' => 'Asia/Bangkok',
'Turkish (Turkey)' => 'Europe/Istanbul',
'Ukrainian (Ukraine)' => 'Europe/Kiev',
'Uzbek (Uzbekistan)' => 'Asia/Tashkent',
'Vietnamese (Vietnam)' => 'Asia/Saigon',
'Walon (Belgium)' => 'Europe/Brussels',
);
sub fuzzyChoice {
my ($b, $count) = common::bestMatchSentence($_[0], keys %l2t);
$count ? $b : '';
}
sub bestTimezone { $l2t{fuzzyChoice($_[0])} || 'GMT' }
my %sex = (
fr_FR => { '[iln]a$' => 1, '[cdilnst]e$' => 1, 'e$' => .8, 'n$' => .1, 'd$' => .05, 't$' => 0 },
en => { 'a$' => 1, 'o$' => 0, '[ln]$' => .3, '[rs]$' => .2 },
);
sub sexProb($) {
local ($_) = @_;
my $l = $sex{$ENV{LC_ALL}} or return 0.5;
my ($prob, $nb) = (0, 0);
foreach my $k (keys %$l) {
/$k/ and $prob += $l->{$k}, $nb++;
}
$nb ? $prob / $nb : 0.5;
}
sub ntp_servers {
q(Australia (ntp.adelaide.edu.au)
Australia (ntp.saard.net)
Australia (time.esec.com.au)
Canada (ntp.cpsc.ucalgary.ca)
Canada (ntp1.cmc.ec.gc.ca)
Canada (ntp2.cmc.ec.gc.ca)
Canada (time.chu.nrc.ca)
Canada (time.nrc.ca)
Canada (timelord.uregina.ca)
Spain (slug.ctv.es)
France (ntp.univ-lyon1.fr)
Croatia (zg1.ntp.carnet.hr)
Croatia (zg2.ntp.carnet.hr)
Croatia (st.ntp.carnet.hr)
Croatia (ri.ntp.carnet.hr)
Croatia (os.ntp.carnet.hr)
Indonesia (ntp.incaf.net)
Italy (time.ien.it)
Korea, republic of (time.nuri.net)
Norway (fartein.ifi.uio.no)
Russia (ntp.landau.ac.ru)
Singapore (ntp.shim.org)
Slovenia (time.ijs.si)
United kingdom (ntp.cs.strath.ac.uk)
United kingdom (ntp2a.mcc.ac.uk)
United kingdom (ntp2b.mcc.ac.uk)
United kingdom (ntp2c.mcc.ac.uk)
United kingdom (ntp2d.mcc.ac.uk)
United states DE (louie.udel.edu)
United states IL (ntp-0.cso.uiuc.edu)
United states IL (ntp-1.cso.uiuc.edu)
United states IL (ntp-2.cso.uiuc.edu)
United states IN (gilbreth.ecn.purdue.edu)
United states IN (harbor.ecn.purdue.edu)
United states IN (molecule.ecn.purdue.edu)
);
}
1;
|
/a>
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
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))
our %langs = (
'af' => [ 'Afrikaans', 'Afrikaans', 'af_ZA', ' 3 ', 'iso-8859-1' ],
'am' => [ 'Amharic', 'ZZ emarNa', 'am_ET', ' 3 ', 'utf_am' ],
'ar' => [ 'Arabic', 'AA Arabic', 'ar_EG', ' 23 ', 'utf_ar' ],
'as' => [ 'Assamese', 'ZZ Assamese', 'as_IN', ' 2 ', 'utf_bn' ],
'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 ', 'utf_bn' ],
'br' => [ 'Britton', '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' => [ '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' ],
#-'dz' => [ 'Buthanese', 'ZZ Dzhonka', 'dz_BT', ' 2 ', 'unicode' ],
'el' => [ 'Greek', 'Ellynika', 'el_GR', '1 ', 'iso-8859-7' ],
'en_GB' => [ 'English', 'English', 'en_GB', '12345', 'iso-8859-15' ],
'en_US' => [ 'English (American)', 'English (American)', 'en_US', ' 5', 'C' ],
'en_IE' => [ 'English (Ireland)', 'English (Ireland)', 'en_IE', '1 ', 'iso-8859-15', 'en_IE:en_GB:en' ],
'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' => [ 'Galician', 'Galego', 'gl_ES', '1 ', 'iso-8859-15', 'gl:es_ES:es:pt:pt_BR' ],
#- there isn't yet a gu_IN locale, using hi_IN instead
'gu' => [ 'Gujarati', 'ZZ Gujarati', 'hi_IN', ' 2 ', 'unicode' ],
#'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' ],
# locale not done yet
'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 ', 'utf_kn' ],
'ko' => [ 'Korean', 'ZZ Korea', 'ko_KR', ' 2 ', 'ksc5601' ],
# locale not done yet
'ku' => [ 'Kurdish', 'Kurdi', 'ku_TR', ' 2 ', 'iso-8859-9' ],
#-'kw' => [ 'Cornish', 'Kernewek', 'kw_GB', '1 ', 'utf_lat8', 'kw:en_GB:en' ],
# no li_NL locale yet; using nl_NL instead and defning LANGUAGE
'li' => [ 'Limbourgish', 'Limburgs', 'nl_NL', '1 ', 'iso-8859-15' ],
'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' ],
'ml' => [ 'Malayalam', 'ZZ Malayalam', 'ml_IN', ' 2 ', 'unicode' ],
'mn' => [ 'Mongolian', 'Mongol', 'mn_MN', ' 2 ', 'utf_cyr2' ],
'mr' => [ 'Marathi', 'ZZ Marathi', 'mr_IN', ' 2 ', 'unicode' ],
'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' ],
#'nds' => [ 'Low Saxon', 'Platduutsch', 'nds_DE', '1 ', 'iso-8859-1' ],
# locale?
'ne' => [ 'Nepali', 'ZZ Nepali', 'ne_IN', ' 2 ', 'unicode' ],
'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-u' ],
'se' => [ 'Saami', 'Samegiella', 'se_NO', '1 ', 'unicode' ],
'sk' => [ 'Slovak', 'Slovencina', 'sk_SK', '1 ', 'iso-8859-2' ],
'sl' => [ 'Slovenian', 'Slovenscina', 'sl_SI', '1 ', 'iso-8859-2' ],
'sq' => [ 'Albanian', 'Shqip', 'sq_AL', '1 ', 'iso-8859-1' ],
'sr' => [ 'Serbian Cyrillic', 'Srpska', 'sr_YU', '1 ', 'iso-8859-5', 'sp:sr' ],
'sr@Latn' => [ 'Serbian Latin', 'Srpska', 'sr_YU', '1 ', 'iso-8859-2', 'sh:sr@Latn' ],
#- ss_ZA not yet done, using en_ZA locale instead
'ss' => [ 'Swati', 'SiSwati', 'en_ZA', ' 3 ', 'iso-8859-1', 'ss:en_ZA' ],
'st' => [ 'Sotho', 'Sesotho', 'st_ZA', ' 3 ', 'iso-8859-1', 'st:nso:en_ZA' ],
'sv' => [ 'Swedish', 'Svenska', 'sv_SE', '1 ', 'iso-8859-1' ],
'ta' => [ 'Tamil', 'ZZ Tamil', 'ta_IN', ' 2 ', 'utf_ta' ],
'te' => [ 'Telugu', 'ZZ Telugu', 'te_IN', ' 2 ', 'unicode' ],
'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 (latin)', 'Ozbekcha', 'uz_UZ', ' 2 ', 'utf_cyr2' ],
'uz@Cyrl' => [ 'Uzbek (cyrillic)', 'Ozbekcha', 'uz_UZ', ' 2 ', 'utf_cyr2', 'uz@Cyrl:uz' ],
#- ve_ZA not yet done, using en_ZA locale instead
've' => [ 'Venda', 'Venda', 'en_ZA', ' 3 ', 'iso-8859-1', 've:ven:en_ZA' ],
'vi' => [ 'Vietnamese', 'Tieng Viet', 'vi_VN', ' 2 ', 'utf_vi' ],
'wa' => [ 'Walon', 'Walon', 'wa_BE', '1 ', 'iso-8859-15', 'wa:fr_BE:fr' ],
#- locale not done yet
#'wen' => [ 'Sorbian', 'XX Sorbian', 'wen_XX', '1 ', 'iso-8859-1' ],
'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' ],
'zu' => [ 'Zulu', 'IsiZulu', 'zu_ZA', ' 3 ', 'iso-8859-1', 'xh:en_ZA' ],
);
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' ],