1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* Internationalization helpers |
4
|
|
|
* |
5
|
|
|
* @author Vitex <[email protected]> |
6
|
|
|
* @copyright 2018 [email protected] (G) |
7
|
|
|
*/ |
8
|
|
|
|
9
|
|
|
namespace Ease; |
10
|
|
|
|
11
|
|
|
/** |
12
|
|
|
* Ease Locale support |
13
|
|
|
* |
14
|
|
|
* @author vitex |
15
|
|
|
*/ |
16
|
|
|
class Locale |
17
|
|
|
{ |
18
|
|
|
/** |
19
|
|
|
* @var Locale Singleton is stored here |
20
|
|
|
*/ |
21
|
|
|
public static $_instance; |
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* Current Used locale code |
25
|
|
|
* @var string |
26
|
|
|
*/ |
27
|
|
|
public static $localeUsed = null; |
28
|
|
|
|
29
|
|
|
/** |
30
|
|
|
* i18n files location |
31
|
|
|
* @var string dirpath |
32
|
|
|
*/ |
33
|
|
|
public static $i18n = null; |
34
|
|
|
|
35
|
|
|
/** |
36
|
|
|
* GetText Domain |
37
|
|
|
* @var string |
38
|
|
|
*/ |
39
|
|
|
public static $textDomain = null; |
40
|
|
|
|
41
|
|
|
/** |
42
|
|
|
* All Language Codes => languages |
43
|
|
|
* @var array |
44
|
|
|
*/ |
45
|
|
|
public static $alllngs = [ |
46
|
|
|
"af_NA" => "Afrikaans (Namibia)", |
47
|
|
|
"af_ZA" => "Afrikaans (South Africa)", |
48
|
|
|
"af" => "Afrikaans", |
49
|
|
|
"ak_GH" => "Akan (Ghana)", |
50
|
|
|
"ak" => "Akan", |
51
|
|
|
"sq_AL" => "Albanian (Albania)", |
52
|
|
|
"sq" => "Albanian", |
53
|
|
|
"am_ET" => "Amharic (Ethiopia)", |
54
|
|
|
"am" => "Amharic", |
55
|
|
|
"ar_DZ" => "Arabic (Algeria)", |
56
|
|
|
"ar_BH" => "Arabic (Bahrain)", |
57
|
|
|
"ar_EG" => "Arabic (Egypt)", |
58
|
|
|
"ar_IQ" => "Arabic (Iraq)", |
59
|
|
|
"ar_JO" => "Arabic (Jordan)", |
60
|
|
|
"ar_KW" => "Arabic (Kuwait)", |
61
|
|
|
"ar_LB" => "Arabic (Lebanon)", |
62
|
|
|
"ar_LY" => "Arabic (Libya)", |
63
|
|
|
"ar_MA" => "Arabic (Morocco)", |
64
|
|
|
"ar_OM" => "Arabic (Oman)", |
65
|
|
|
"ar_QA" => "Arabic (Qatar)", |
66
|
|
|
"ar_SA" => "Arabic (Saudi Arabia)", |
67
|
|
|
"ar_SD" => "Arabic (Sudan)", |
68
|
|
|
"ar_SY" => "Arabic (Syria)", |
69
|
|
|
"ar_TN" => "Arabic (Tunisia)", |
70
|
|
|
"ar_AE" => "Arabic (United Arab Emirates)", |
71
|
|
|
"ar_YE" => "Arabic (Yemen)", |
72
|
|
|
"ar" => "Arabic", |
73
|
|
|
"hy_AM" => "Armenian (Armenia)", |
74
|
|
|
"hy" => "Armenian", |
75
|
|
|
"as_IN" => "Assamese (India)", |
76
|
|
|
"as" => "Assamese", |
77
|
|
|
"asa_TZ" => "Asu (Tanzania)", |
78
|
|
|
"asa" => "Asu", |
79
|
|
|
"az_Cyrl" => "Azerbaijani (Cyrillic)", |
80
|
|
|
"az_Cyrl_AZ" => "Azerbaijani (Cyrillic, Azerbaijan)", |
81
|
|
|
"az_Latn" => "Azerbaijani (Latin)", |
82
|
|
|
"az_Latn_AZ" => "Azerbaijani (Latin, Azerbaijan)", |
83
|
|
|
"az" => "Azerbaijani", |
84
|
|
|
"bm_ML" => "Bambara (Mali)", |
85
|
|
|
"bm" => "Bambara", |
86
|
|
|
"eu_ES" => "Basque (Spain)", |
87
|
|
|
"eu" => "Basque", |
88
|
|
|
"be_BY" => "Belarusian (Belarus)", |
89
|
|
|
"be" => "Belarusian", |
90
|
|
|
"bem_ZM" => "Bemba (Zambia)", |
91
|
|
|
"bem" => "Bemba", |
92
|
|
|
"bez_TZ" => "Bena (Tanzania)", |
93
|
|
|
"bez" => "Bena", |
94
|
|
|
"bn_BD" => "Bengali (Bangladesh)", |
95
|
|
|
"bn_IN" => "Bengali (India)", |
96
|
|
|
"bn" => "Bengali", |
97
|
|
|
"bs_BA" => "Bosnian (Bosnia and Herzegovina)", |
98
|
|
|
"bs" => "Bosnian", |
99
|
|
|
"bg_BG" => "Bulgarian (Bulgaria)", |
100
|
|
|
"bg" => "Bulgarian", |
101
|
|
|
"my_MM" => "Burmese (Myanmar [Burma])", |
102
|
|
|
"my" => "Burmese", |
103
|
|
|
"ca_ES" => "Catalan (Spain)", |
104
|
|
|
"ca" => "Catalan", |
105
|
|
|
"tzm_Latn" => "Central Morocco Tamazight (Latin)", |
106
|
|
|
"tzm_Latn_MA" => "Central Morocco Tamazight (Latin, Morocco)", |
107
|
|
|
"tzm" => "Central Morocco Tamazight", |
108
|
|
|
"chr_US" => "Cherokee (United States)", |
109
|
|
|
"chr" => "Cherokee", |
110
|
|
|
"cgg_UG" => "Chiga (Uganda)", |
111
|
|
|
"cgg" => "Chiga", |
112
|
|
|
"zh_Hans" => "Chinese (Simplified Han)", |
113
|
|
|
"zh_Hans_CN" => "Chinese (Simplified Han, China)", |
114
|
|
|
"zh_Hans_HK" => "Chinese (Simplified Han, Hong Kong SAR China)", |
115
|
|
|
"zh_Hans_MO" => "Chinese (Simplified Han, Macau SAR China)", |
116
|
|
|
"zh_Hans_SG" => "Chinese (Simplified Han, Singapore)", |
117
|
|
|
"zh_Hant" => "Chinese (Traditional Han)", |
118
|
|
|
"zh_Hant_HK" => "Chinese (Traditional Han, Hong Kong SAR China)", |
119
|
|
|
"zh_Hant_MO" => "Chinese (Traditional Han, Macau SAR China)", |
120
|
|
|
"zh_Hant_TW" => "Chinese (Traditional Han, Taiwan)", |
121
|
|
|
"zh" => "Chinese", |
122
|
|
|
"kw_GB" => "Cornish (United Kingdom)", |
123
|
|
|
"kw" => "Cornish", |
124
|
|
|
"hr_HR" => "Croatian (Croatia)", |
125
|
|
|
"hr" => "Croatian", |
126
|
|
|
"cs_CZ" => "Czech (Czech Republic)", |
127
|
|
|
"cs" => "Czech", |
128
|
|
|
"da_DK" => "Danish (Denmark)", |
129
|
|
|
"da" => "Danish", |
130
|
|
|
"nl_BE" => "Dutch (Belgium)", |
131
|
|
|
"nl_NL" => "Dutch (Netherlands)", |
132
|
|
|
"nl" => "Dutch", |
133
|
|
|
"ebu_KE" => "Embu (Kenya)", |
134
|
|
|
"ebu" => "Embu", |
135
|
|
|
"en_AS" => "English (American Samoa)", |
136
|
|
|
"en_AU" => "English (Australia)", |
137
|
|
|
"en_BE" => "English (Belgium)", |
138
|
|
|
"en_BZ" => "English (Belize)", |
139
|
|
|
"en_BW" => "English (Botswana)", |
140
|
|
|
"en_CA" => "English (Canada)", |
141
|
|
|
"en_GU" => "English (Guam)", |
142
|
|
|
"en_HK" => "English (Hong Kong SAR China)", |
143
|
|
|
"en_IN" => "English (India)", |
144
|
|
|
"en_IE" => "English (Ireland)", |
145
|
|
|
"en_JM" => "English (Jamaica)", |
146
|
|
|
"en_MT" => "English (Malta)", |
147
|
|
|
"en_MH" => "English (Marshall Islands)", |
148
|
|
|
"en_MU" => "English (Mauritius)", |
149
|
|
|
"en_NA" => "English (Namibia)", |
150
|
|
|
"en_NZ" => "English (New Zealand)", |
151
|
|
|
"en_MP" => "English (Northern Mariana Islands)", |
152
|
|
|
"en_PK" => "English (Pakistan)", |
153
|
|
|
"en_PH" => "English (Philippines)", |
154
|
|
|
"en_SG" => "English (Singapore)", |
155
|
|
|
"en_ZA" => "English (South Africa)", |
156
|
|
|
"en_TT" => "English (Trinidad and Tobago)", |
157
|
|
|
"en_UM" => "English (U.S. Minor Outlying Islands)", |
158
|
|
|
"en_VI" => "English (U.S. Virgin Islands)", |
159
|
|
|
"en_GB" => "English (United Kingdom)", |
160
|
|
|
"en_US" => "English (United States)", |
161
|
|
|
"en_ZW" => "English (Zimbabwe)", |
162
|
|
|
"en" => "English", |
163
|
|
|
"eo" => "Esperanto", |
164
|
|
|
"et_EE" => "Estonian (Estonia)", |
165
|
|
|
"et" => "Estonian", |
166
|
|
|
"ee_GH" => "Ewe (Ghana)", |
167
|
|
|
"ee_TG" => "Ewe (Togo)", |
168
|
|
|
"ee" => "Ewe", |
169
|
|
|
"fo_FO" => "Faroese (Faroe Islands)", |
170
|
|
|
"fo" => "Faroese", |
171
|
|
|
"fil_PH" => "Filipino (Philippines)", |
172
|
|
|
"fil" => "Filipino", |
173
|
|
|
"fi_FI" => "Finnish (Finland)", |
174
|
|
|
"fi" => "Finnish", |
175
|
|
|
"fr_BE" => "French (Belgium)", |
176
|
|
|
"fr_BJ" => "French (Benin)", |
177
|
|
|
"fr_BF" => "French (Burkina Faso)", |
178
|
|
|
"fr_BI" => "French (Burundi)", |
179
|
|
|
"fr_CM" => "French (Cameroon)", |
180
|
|
|
"fr_CA" => "French (Canada)", |
181
|
|
|
"fr_CF" => "French (Central African Republic)", |
182
|
|
|
"fr_TD" => "French (Chad)", |
183
|
|
|
"fr_KM" => "French (Comoros)", |
184
|
|
|
"fr_CG" => "French (Congo - Brazzaville)", |
185
|
|
|
"fr_CD" => "French (Congo - Kinshasa)", |
186
|
|
|
"fr_CI" => "French (Côte d’Ivoire)", |
187
|
|
|
"fr_DJ" => "French (Djibouti)", |
188
|
|
|
"fr_GQ" => "French (Equatorial Guinea)", |
189
|
|
|
"fr_FR" => "French (France)", |
190
|
|
|
"fr_GA" => "French (Gabon)", |
191
|
|
|
"fr_GP" => "French (Guadeloupe)", |
192
|
|
|
"fr_GN" => "French (Guinea)", |
193
|
|
|
"fr_LU" => "French (Luxembourg)", |
194
|
|
|
"fr_MG" => "French (Madagascar)", |
195
|
|
|
"fr_ML" => "French (Mali)", |
196
|
|
|
"fr_MQ" => "French (Martinique)", |
197
|
|
|
"fr_MC" => "French (Monaco)", |
198
|
|
|
"fr_NE" => "French (Niger)", |
199
|
|
|
"fr_RW" => "French (Rwanda)", |
200
|
|
|
"fr_RE" => "French (Réunion)", |
201
|
|
|
"fr_BL" => "French (Saint Barthélemy)", |
202
|
|
|
"fr_MF" => "French (Saint Martin)", |
203
|
|
|
"fr_SN" => "French (Senegal)", |
204
|
|
|
"fr_CH" => "French (Switzerland)", |
205
|
|
|
"fr_TG" => "French (Togo)", |
206
|
|
|
"fr" => "French", |
207
|
|
|
"ff_SN" => "Fulah (Senegal)", |
208
|
|
|
"ff" => "Fulah", |
209
|
|
|
"gl_ES" => "Galician (Spain)", |
210
|
|
|
"gl" => "Galician", |
211
|
|
|
"lg_UG" => "Ganda (Uganda)", |
212
|
|
|
"lg" => "Ganda", |
213
|
|
|
"ka_GE" => "Georgian (Georgia)", |
214
|
|
|
"ka" => "Georgian", |
215
|
|
|
"de_AT" => "German (Austria)", |
216
|
|
|
"de_BE" => "German (Belgium)", |
217
|
|
|
"de_DE" => "German (Germany)", |
218
|
|
|
"de_LI" => "German (Liechtenstein)", |
219
|
|
|
"de_LU" => "German (Luxembourg)", |
220
|
|
|
"de_CH" => "German (Switzerland)", |
221
|
|
|
"de" => "German", |
222
|
|
|
"el_CY" => "Greek (Cyprus)", |
223
|
|
|
"el_GR" => "Greek (Greece)", |
224
|
|
|
"el" => "Greek", |
225
|
|
|
"gu_IN" => "Gujarati (India)", |
226
|
|
|
"gu" => "Gujarati", |
227
|
|
|
"guz_KE" => "Gusii (Kenya)", |
228
|
|
|
"guz" => "Gusii", |
229
|
|
|
"ha_Latn" => "Hausa (Latin)", |
230
|
|
|
"ha_Latn_GH" => "Hausa (Latin, Ghana)", |
231
|
|
|
"ha_Latn_NE" => "Hausa (Latin, Niger)", |
232
|
|
|
"ha_Latn_NG" => "Hausa (Latin, Nigeria)", |
233
|
|
|
"ha" => "Hausa", |
234
|
|
|
"haw_US" => "Hawaiian (United States)", |
235
|
|
|
"haw" => "Hawaiian", |
236
|
|
|
"he_IL" => "Hebrew (Israel)", |
237
|
|
|
"he" => "Hebrew", |
238
|
|
|
"hi_IN" => "Hindi (India)", |
239
|
|
|
"hi" => "Hindi", |
240
|
|
|
"hu_HU" => "Hungarian (Hungary)", |
241
|
|
|
"hu" => "Hungarian", |
242
|
|
|
"is_IS" => "Icelandic (Iceland)", |
243
|
|
|
"is" => "Icelandic", |
244
|
|
|
"ig_NG" => "Igbo (Nigeria)", |
245
|
|
|
"ig" => "Igbo", |
246
|
|
|
"id_ID" => "Indonesian (Indonesia)", |
247
|
|
|
"id" => "Indonesian", |
248
|
|
|
"ga_IE" => "Irish (Ireland)", |
249
|
|
|
"ga" => "Irish", |
250
|
|
|
"it_IT" => "Italian (Italy)", |
251
|
|
|
"it_CH" => "Italian (Switzerland)", |
252
|
|
|
"it" => "Italian", |
253
|
|
|
"ja_JP" => "Japanese (Japan)", |
254
|
|
|
"ja" => "Japanese", |
255
|
|
|
"kea_CV" => "Kabuverdianu (Cape Verde)", |
256
|
|
|
"kea" => "Kabuverdianu", |
257
|
|
|
"kab_DZ" => "Kabyle (Algeria)", |
258
|
|
|
"kab" => "Kabyle", |
259
|
|
|
"kl_GL" => "Kalaallisut (Greenland)", |
260
|
|
|
"kl" => "Kalaallisut", |
261
|
|
|
"kln_KE" => "Kalenjin (Kenya)", |
262
|
|
|
"kln" => "Kalenjin", |
263
|
|
|
"kam_KE" => "Kamba (Kenya)", |
264
|
|
|
"kam" => "Kamba", |
265
|
|
|
"kn_IN" => "Kannada (India)", |
266
|
|
|
"kn" => "Kannada", |
267
|
|
|
"kk_Cyrl" => "Kazakh (Cyrillic)", |
268
|
|
|
"kk_Cyrl_KZ" => "Kazakh (Cyrillic, Kazakhstan)", |
269
|
|
|
"kk" => "Kazakh", |
270
|
|
|
"km_KH" => "Khmer (Cambodia)", |
271
|
|
|
"km" => "Khmer", |
272
|
|
|
"ki_KE" => "Kikuyu (Kenya)", |
273
|
|
|
"ki" => "Kikuyu", |
274
|
|
|
"rw_RW" => "Kinyarwanda (Rwanda)", |
275
|
|
|
"rw" => "Kinyarwanda", |
276
|
|
|
"kok_IN" => "Konkani (India)", |
277
|
|
|
"kok" => "Konkani", |
278
|
|
|
"ko_KR" => "Korean (South Korea)", |
279
|
|
|
"ko" => "Korean", |
280
|
|
|
"khq_ML" => "Koyra Chiini (Mali)", |
281
|
|
|
"khq" => "Koyra Chiini", |
282
|
|
|
"ses_ML" => "Koyraboro Senni (Mali)", |
283
|
|
|
"ses" => "Koyraboro Senni", |
284
|
|
|
"lag_TZ" => "Langi (Tanzania)", |
285
|
|
|
"lag" => "Langi", |
286
|
|
|
"lv_LV" => "Latvian (Latvia)", |
287
|
|
|
"lv" => "Latvian", |
288
|
|
|
"lt_LT" => "Lithuanian (Lithuania)", |
289
|
|
|
"lt" => "Lithuanian", |
290
|
|
|
"luo_KE" => "Luo (Kenya)", |
291
|
|
|
"luo" => "Luo", |
292
|
|
|
"luy_KE" => "Luyia (Kenya)", |
293
|
|
|
"luy" => "Luyia", |
294
|
|
|
"mk_MK" => "Macedonian (Macedonia)", |
295
|
|
|
"mk" => "Macedonian", |
296
|
|
|
"jmc_TZ" => "Machame (Tanzania)", |
297
|
|
|
"jmc" => "Machame", |
298
|
|
|
"kde_TZ" => "Makonde (Tanzania)", |
299
|
|
|
"kde" => "Makonde", |
300
|
|
|
"mg_MG" => "Malagasy (Madagascar)", |
301
|
|
|
"mg" => "Malagasy", |
302
|
|
|
"ms_BN" => "Malay (Brunei)", |
303
|
|
|
"ms_MY" => "Malay (Malaysia)", |
304
|
|
|
"ms" => "Malay", |
305
|
|
|
"ml_IN" => "Malayalam (India)", |
306
|
|
|
"ml" => "Malayalam", |
307
|
|
|
"mt_MT" => "Maltese (Malta)", |
308
|
|
|
"mt" => "Maltese", |
309
|
|
|
"gv_GB" => "Manx (United Kingdom)", |
310
|
|
|
"gv" => "Manx", |
311
|
|
|
"mr_IN" => "Marathi (India)", |
312
|
|
|
"mr" => "Marathi", |
313
|
|
|
"mas_KE" => "Masai (Kenya)", |
314
|
|
|
"mas_TZ" => "Masai (Tanzania)", |
315
|
|
|
"mas" => "Masai", |
316
|
|
|
"mer_KE" => "Meru (Kenya)", |
317
|
|
|
"mer" => "Meru", |
318
|
|
|
"mfe_MU" => "Morisyen (Mauritius)", |
319
|
|
|
"mfe" => "Morisyen", |
320
|
|
|
"naq_NA" => "Nama (Namibia)", |
321
|
|
|
"naq" => "Nama", |
322
|
|
|
"ne_IN" => "Nepali (India)", |
323
|
|
|
"ne_NP" => "Nepali (Nepal)", |
324
|
|
|
"ne" => "Nepali", |
325
|
|
|
"nd_ZW" => "North Ndebele (Zimbabwe)", |
326
|
|
|
"nd" => "North Ndebele", |
327
|
|
|
"nb_NO" => "Norwegian Bokmål (Norway)", |
328
|
|
|
"nb" => "Norwegian Bokmål", |
329
|
|
|
"nn_NO" => "Norwegian Nynorsk (Norway)", |
330
|
|
|
"nn" => "Norwegian Nynorsk", |
331
|
|
|
"nyn_UG" => "Nyankole (Uganda)", |
332
|
|
|
"nyn" => "Nyankole", |
333
|
|
|
"or_IN" => "Oriya (India)", |
334
|
|
|
"or" => "Oriya", |
335
|
|
|
"om_ET" => "Oromo (Ethiopia)", |
336
|
|
|
"om_KE" => "Oromo (Kenya)", |
337
|
|
|
"om" => "Oromo", |
338
|
|
|
"ps_AF" => "Pashto (Afghanistan)", |
339
|
|
|
"ps" => "Pashto", |
340
|
|
|
"fa_AF" => "Persian (Afghanistan)", |
341
|
|
|
"fa_IR" => "Persian (Iran)", |
342
|
|
|
"fa" => "Persian", |
343
|
|
|
"pl_PL" => "Polish (Poland)", |
344
|
|
|
"pl" => "Polish", |
345
|
|
|
"pt_BR" => "Portuguese (Brazil)", |
346
|
|
|
"pt_GW" => "Portuguese (Guinea-Bissau)", |
347
|
|
|
"pt_MZ" => "Portuguese (Mozambique)", |
348
|
|
|
"pt_PT" => "Portuguese (Portugal)", |
349
|
|
|
"pt" => "Portuguese", |
350
|
|
|
"pa_Arab" => "Punjabi (Arabic)", |
351
|
|
|
"pa_Arab_PK" => "Punjabi (Arabic, Pakistan)", |
352
|
|
|
"pa_Guru" => "Punjabi (Gurmukhi)", |
353
|
|
|
"pa_Guru_IN" => "Punjabi (Gurmukhi, India)", |
354
|
|
|
"pa" => "Punjabi", |
355
|
|
|
"ro_MD" => "Romanian (Moldova)", |
356
|
|
|
"ro_RO" => "Romanian (Romania)", |
357
|
|
|
"ro" => "Romanian", |
358
|
|
|
"rm_CH" => "Romansh (Switzerland)", |
359
|
|
|
"rm" => "Romansh", |
360
|
|
|
"rof_TZ" => "Rombo (Tanzania)", |
361
|
|
|
"rof" => "Rombo", |
362
|
|
|
"ru_MD" => "Russian (Moldova)", |
363
|
|
|
"ru_RU" => "Russian (Russia)", |
364
|
|
|
"ru_UA" => "Russian (Ukraine)", |
365
|
|
|
"ru" => "Russian", |
366
|
|
|
"rwk_TZ" => "Rwa (Tanzania)", |
367
|
|
|
"rwk" => "Rwa", |
368
|
|
|
"saq_KE" => "Samburu (Kenya)", |
369
|
|
|
"saq" => "Samburu", |
370
|
|
|
"sg_CF" => "Sango (Central African Republic)", |
371
|
|
|
"sg" => "Sango", |
372
|
|
|
"seh_MZ" => "Sena (Mozambique)", |
373
|
|
|
"seh" => "Sena", |
374
|
|
|
"sr_Cyrl" => "Serbian (Cyrillic)", |
375
|
|
|
"sr_Cyrl_BA" => "Serbian (Cyrillic, Bosnia and Herzegovina)", |
376
|
|
|
"sr_Cyrl_ME" => "Serbian (Cyrillic, Montenegro)", |
377
|
|
|
"sr_Cyrl_RS" => "Serbian (Cyrillic, Serbia)", |
378
|
|
|
"sr_Latn" => "Serbian (Latin)", |
379
|
|
|
"sr_Latn_BA" => "Serbian (Latin, Bosnia and Herzegovina)", |
380
|
|
|
"sr_Latn_ME" => "Serbian (Latin, Montenegro)", |
381
|
|
|
"sr_Latn_RS" => "Serbian (Latin, Serbia)", |
382
|
|
|
"sr" => "Serbian", |
383
|
|
|
"sn_ZW" => "Shona (Zimbabwe)", |
384
|
|
|
"sn" => "Shona", |
385
|
|
|
"ii_CN" => "Sichuan Yi (China)", |
386
|
|
|
"ii" => "Sichuan Yi", |
387
|
|
|
"si_LK" => "Sinhala (Sri Lanka)", |
388
|
|
|
"si" => "Sinhala", |
389
|
|
|
"sk_SK" => "Slovak (Slovakia)", |
390
|
|
|
"sk" => "Slovak", |
391
|
|
|
"sl_SI" => "Slovenian (Slovenia)", |
392
|
|
|
"sl" => "Slovenian", |
393
|
|
|
"xog_UG" => "Soga (Uganda)", |
394
|
|
|
"xog" => "Soga", |
395
|
|
|
"so_DJ" => "Somali (Djibouti)", |
396
|
|
|
"so_ET" => "Somali (Ethiopia)", |
397
|
|
|
"so_KE" => "Somali (Kenya)", |
398
|
|
|
"so_SO" => "Somali (Somalia)", |
399
|
|
|
"so" => "Somali", |
400
|
|
|
"es_AR" => "Spanish (Argentina)", |
401
|
|
|
"es_BO" => "Spanish (Bolivia)", |
402
|
|
|
"es_CL" => "Spanish (Chile)", |
403
|
|
|
"es_CO" => "Spanish (Colombia)", |
404
|
|
|
"es_CR" => "Spanish (Costa Rica)", |
405
|
|
|
"es_DO" => "Spanish (Dominican Republic)", |
406
|
|
|
"es_EC" => "Spanish (Ecuador)", |
407
|
|
|
"es_SV" => "Spanish (El Salvador)", |
408
|
|
|
"es_GQ" => "Spanish (Equatorial Guinea)", |
409
|
|
|
"es_GT" => "Spanish (Guatemala)", |
410
|
|
|
"es_HN" => "Spanish (Honduras)", |
411
|
|
|
"es_419" => "Spanish (Latin America)", |
412
|
|
|
"es_MX" => "Spanish (Mexico)", |
413
|
|
|
"es_NI" => "Spanish (Nicaragua)", |
414
|
|
|
"es_PA" => "Spanish (Panama)", |
415
|
|
|
"es_PY" => "Spanish (Paraguay)", |
416
|
|
|
"es_PE" => "Spanish (Peru)", |
417
|
|
|
"es_PR" => "Spanish (Puerto Rico)", |
418
|
|
|
"es_ES" => "Spanish (Spain)", |
419
|
|
|
"es_US" => "Spanish (United States)", |
420
|
|
|
"es_UY" => "Spanish (Uruguay)", |
421
|
|
|
"es_VE" => "Spanish (Venezuela)", |
422
|
|
|
"es" => "Spanish", |
423
|
|
|
"sw_KE" => "Swahili (Kenya)", |
424
|
|
|
"sw_TZ" => "Swahili (Tanzania)", |
425
|
|
|
"sw" => "Swahili", |
426
|
|
|
"sv_FI" => "Swedish (Finland)", |
427
|
|
|
"sv_SE" => "Swedish (Sweden)", |
428
|
|
|
"sv" => "Swedish", |
429
|
|
|
"gsw_CH" => "Swiss German (Switzerland)", |
430
|
|
|
"gsw" => "Swiss German", |
431
|
|
|
"shi_Latn" => "Tachelhit (Latin)", |
432
|
|
|
"shi_Latn_MA" => "Tachelhit (Latin, Morocco)", |
433
|
|
|
"shi_Tfng" => "Tachelhit (Tifinagh)", |
434
|
|
|
"shi_Tfng_MA" => "Tachelhit (Tifinagh, Morocco)", |
435
|
|
|
"shi" => "Tachelhit", |
436
|
|
|
"dav_KE" => "Taita (Kenya)", |
437
|
|
|
"dav" => "Taita", |
438
|
|
|
"ta_IN" => "Tamil (India)", |
439
|
|
|
"ta_LK" => "Tamil (Sri Lanka)", |
440
|
|
|
"ta" => "Tamil", |
441
|
|
|
"te_IN" => "Telugu (India)", |
442
|
|
|
"te" => "Telugu", |
443
|
|
|
"teo_KE" => "Teso (Kenya)", |
444
|
|
|
"teo_UG" => "Teso (Uganda)", |
445
|
|
|
"teo" => "Teso", |
446
|
|
|
"th_TH" => "Thai (Thailand)", |
447
|
|
|
"th" => "Thai", |
448
|
|
|
"bo_CN" => "Tibetan (China)", |
449
|
|
|
"bo_IN" => "Tibetan (India)", |
450
|
|
|
"bo" => "Tibetan", |
451
|
|
|
"ti_ER" => "Tigrinya (Eritrea)", |
452
|
|
|
"ti_ET" => "Tigrinya (Ethiopia)", |
453
|
|
|
"ti" => "Tigrinya", |
454
|
|
|
"to_TO" => "Tonga (Tonga)", |
455
|
|
|
"to" => "Tonga", |
456
|
|
|
"tr_TR" => "Turkish (Turkey)", |
457
|
|
|
"tr" => "Turkish", |
458
|
|
|
"uk_UA" => "Ukrainian (Ukraine)", |
459
|
|
|
"uk" => "Ukrainian", |
460
|
|
|
"ur_IN" => "Urdu (India)", |
461
|
|
|
"ur_PK" => "Urdu (Pakistan)", |
462
|
|
|
"ur" => "Urdu", |
463
|
|
|
"uz_Arab" => "Uzbek (Arabic)", |
464
|
|
|
"uz_Arab_AF" => "Uzbek (Arabic, Afghanistan)", |
465
|
|
|
"uz_Cyrl" => "Uzbek (Cyrillic)", |
466
|
|
|
"uz_Cyrl_UZ" => "Uzbek (Cyrillic, Uzbekistan)", |
467
|
|
|
"uz_Latn" => "Uzbek (Latin)", |
468
|
|
|
"uz_Latn_UZ" => "Uzbek (Latin, Uzbekistan)", |
469
|
|
|
"uz" => "Uzbek", |
470
|
|
|
"vi_VN" => "Vietnamese (Vietnam)", |
471
|
|
|
"vi" => "Vietnamese", |
472
|
|
|
"vun_TZ" => "Vunjo (Tanzania)", |
473
|
|
|
"vun" => "Vunjo", |
474
|
|
|
"cy_GB" => "Welsh (United Kingdom)", |
475
|
|
|
"cy" => "Welsh", |
476
|
|
|
"yo_NG" => "Yoruba (Nigeria)", |
477
|
|
|
"yo" => "Yoruba", |
478
|
|
|
"zu_ZA" => "Zulu (South Africa)", |
479
|
|
|
"zu" => "Zulu" |
480
|
|
|
]; |
481
|
|
|
|
482
|
|
|
/** |
483
|
|
|
* Prepare use of localization |
484
|
|
|
* |
485
|
|
|
* @param string $setLocale en_US|cs_CZ|.. |
486
|
|
|
* @param string $i18n directory ( /usr/lib/locale/ in Debian ) |
487
|
|
|
* @param string $textDomain we want use $i18n/$setLocale/LC_ALL/$textDomain.mo |
488
|
|
|
*/ |
489
|
|
|
public function __construct($setLocale = null, $i18n = '../i18n', |
490
|
|
|
$textDomain = null) |
491
|
|
|
{ |
492
|
|
|
if (is_null($setLocale)) { |
493
|
|
|
$setLocale = self::getPreferedLocale(); |
494
|
|
|
} |
495
|
|
|
if (is_null($textDomain)) { |
496
|
|
|
if (is_null(self::$textDomain)) { |
|
|
|
|
497
|
|
|
if (defined('EASE_APPNAME')) { |
498
|
|
|
$textDomain = strtolower(constant('EASE_APPNAME')); |
499
|
|
|
} |
500
|
|
|
} else { |
501
|
|
|
$textDomain = self::$textDomain; |
502
|
|
|
} |
503
|
|
|
} |
504
|
|
|
self::initializeGetText($textDomain, $setLocale, $i18n); |
505
|
|
|
} |
506
|
|
|
|
507
|
|
|
/** |
508
|
|
|
* Prefered Locale Code - 1) Requested 2) Session 3) Browser for WebPage or |
509
|
|
|
* getenv('LC_ALL') for CLI |
510
|
|
|
* |
511
|
|
|
* @return string locale code |
512
|
|
|
*/ |
513
|
1 |
|
public static function getPreferedLocale() |
514
|
|
|
{ |
515
|
|
|
// $locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']); |
516
|
1 |
|
if (php_sapi_name() == 'cli') { |
517
|
1 |
|
$locale = getenv('LC_ALL'); |
518
|
|
|
} else { |
519
|
|
|
$reqLocale = self::requestLocale(); |
520
|
|
|
if (is_null($reqLocale)) { |
|
|
|
|
521
|
|
|
$sesLocale = self::sessionLocale(); |
522
|
|
|
if (is_null($sesLocale)) { |
523
|
|
|
$locale = self::browserLocale(); |
524
|
|
|
} else { |
525
|
|
|
$locale = $sesLocale; |
526
|
|
|
} |
527
|
|
|
} else { |
528
|
|
|
$locale = $reqLocale; |
529
|
|
|
} |
530
|
|
|
} |
531
|
1 |
|
return $locale; |
532
|
|
|
} |
533
|
|
|
|
534
|
|
|
/** |
535
|
|
|
* Session by page GET or POST request with 'locale' field |
536
|
|
|
* |
537
|
|
|
* @return string Locale Code |
538
|
|
|
*/ |
539
|
1 |
|
public static function requestLocale() |
540
|
|
|
{ |
541
|
1 |
|
return isset($_REQUEST) && array_key_exists('locale', $_REQUEST) ? $_REQUEST['locale'] |
542
|
1 |
|
: null; |
543
|
|
|
} |
544
|
|
|
|
545
|
|
|
/** |
546
|
|
|
* Locale code saved to session field $_SESSION['locale'] |
547
|
|
|
* |
548
|
|
|
* @return string locale code |
549
|
|
|
*/ |
550
|
1 |
|
public static function sessionLocale() |
551
|
|
|
{ |
552
|
1 |
|
return isset($_SESSION) && array_key_exists('locale', $_SESSION) ? $_SESSION['locale'] |
553
|
1 |
|
: null; |
554
|
|
|
} |
555
|
|
|
|
556
|
|
|
/** |
557
|
|
|
* Locale code by browser default language |
558
|
|
|
* |
559
|
|
|
* @return string locale code |
560
|
|
|
*/ |
561
|
1 |
|
public static function browserLocale() |
562
|
|
|
{ |
563
|
1 |
|
return self::langToLocale(self::autodetected()); |
564
|
|
|
} |
565
|
|
|
|
566
|
|
|
/** |
567
|
|
|
* List of availble locales |
568
|
|
|
* |
569
|
|
|
* @return array locales availble |
570
|
|
|
*/ |
571
|
1 |
|
public function availble() |
572
|
|
|
{ |
573
|
1 |
|
$locales = []; |
574
|
1 |
|
$d = dir(self::$i18n); |
575
|
1 |
|
while (false !== ($entry = $d->read())) { |
576
|
1 |
|
if (($entry[0] != '.') && file_exists(self::$i18n.'/'.$entry.'/LC_MESSAGES/'.self::$textDomain.'.mo')) { |
577
|
1 |
|
$locales[$entry] = _(self::$alllngs[$entry]); |
578
|
|
|
} |
579
|
|
|
} |
580
|
1 |
|
$d->close(); |
581
|
1 |
|
return $locales; |
582
|
|
|
} |
583
|
|
|
|
584
|
|
|
/** |
585
|
|
|
* Store GetText Domain |
586
|
|
|
* @param string $textDomain |
587
|
|
|
*/ |
588
|
1 |
|
public static function setTextDomain($textDomain) |
589
|
|
|
{ |
590
|
1 |
|
self::$textDomain = $textDomain; |
591
|
1 |
|
} |
592
|
|
|
|
593
|
|
|
/** |
594
|
|
|
* Initialise Gettext |
595
|
|
|
* |
596
|
|
|
* $i18n/$defaultLocale/LC_MESSAGES/$appname.mo |
597
|
|
|
* |
598
|
|
|
* @param string $appname name for binddomain |
599
|
|
|
* @param string $defaultLocale locale of source code localstring |
600
|
|
|
* @param string $i18n directory base localisation directory |
601
|
|
|
* |
602
|
|
|
* @return |
603
|
|
|
*/ |
604
|
1 |
|
public static function initializeGetText($appname, $defaultLocale = 'en_US', |
605
|
|
|
$i18n = '../i18n') |
606
|
|
|
{ |
607
|
1 |
|
self::$i18n = $i18n; |
608
|
1 |
|
self::setTextDomain($appname); |
609
|
1 |
|
return self::useLocale($defaultLocale); |
610
|
|
|
} |
611
|
|
|
|
612
|
|
|
/** |
613
|
|
|
* Find Locale Code for browser language |
614
|
|
|
* |
615
|
|
|
* @param string $lang browser lan en|cs|.. |
616
|
|
|
* |
617
|
|
|
* @return string locale code |
618
|
|
|
*/ |
619
|
1 |
|
public static function langToLocale($lang) |
620
|
|
|
{ |
621
|
1 |
|
$defaultLocale = 'C'; |
622
|
1 |
|
$langs = []; |
623
|
1 |
|
foreach (self::$alllngs as $langCode => $language) { |
624
|
1 |
|
$langs[$langCode] = [strstr($langCode, '_') ? substr($langCode, 0, |
625
|
1 |
|
strpos($langCode, '_')) : $langCode, $language]; |
626
|
|
|
} |
627
|
1 |
|
foreach ($langs as $code => $langInfo) { |
628
|
1 |
|
if ($lang == $langInfo[0]) { |
629
|
1 |
|
$defaultLocale = $code; |
630
|
1 |
|
break; |
631
|
|
|
} |
632
|
|
|
} |
633
|
1 |
|
return $defaultLocale; |
634
|
|
|
} |
635
|
|
|
|
636
|
|
|
/** |
637
|
|
|
* Use Effective locale to requested |
638
|
|
|
* |
639
|
|
|
* @param string $localeCode locale code to use |
640
|
|
|
* |
641
|
|
|
* @return string used locale code |
642
|
|
|
*/ |
643
|
1 |
|
public static function useLocale($localeCode) |
644
|
|
|
{ |
645
|
1 |
|
\setlocale(LC_ALL, $localeCode); |
646
|
1 |
|
\bind_textdomain_codeset(self::$textDomain, 'UTF-8'); |
647
|
1 |
|
\putenv("LC_ALL=$localeCode"); |
648
|
1 |
|
if (!empty(self::$textDomain)) { |
649
|
1 |
|
if (file_exists(self::$i18n)) { |
650
|
1 |
|
\bindtextdomain(self::$textDomain, self::$i18n); |
651
|
|
|
} |
652
|
1 |
|
\textdomain(self::$textDomain); |
653
|
|
|
} |
654
|
1 |
|
if (isset($_SESSION)) { |
655
|
1 |
|
$_SESSION['locale'] = $localeCode; |
656
|
|
|
} |
657
|
1 |
|
self::$localeUsed = $localeCode; |
658
|
1 |
|
} |
659
|
|
|
|
660
|
|
|
/** |
661
|
|
|
* Try to autodetect default language |
662
|
|
|
* |
663
|
|
|
* @return string lang code |
664
|
|
|
*/ |
665
|
1 |
|
public static function autodetected() |
666
|
|
|
{ |
667
|
1 |
|
return array_key_exists('HTTP_ACCEPT_LANGUAGE', $_SERVER) && function_exists('\locale_accept_from_http') |
668
|
1 |
|
? \locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']) : null; |
669
|
|
|
} |
670
|
|
|
|
671
|
|
|
/** |
672
|
|
|
* obtain ISO 639-1 language code |
673
|
|
|
* |
674
|
|
|
* @return string |
675
|
|
|
*/ |
676
|
1 |
|
public function get2Code() |
677
|
|
|
{ |
678
|
1 |
|
$localeUsed = $this->getLocaleUsed(); |
679
|
1 |
|
return strstr($localeUsed, '_') ? current(explode('_', $localeUsed)) : $localeUsed; |
680
|
|
|
} |
681
|
|
|
|
682
|
|
|
/** |
683
|
|
|
* get Current Used locale code |
684
|
|
|
* |
685
|
|
|
* @return string |
686
|
|
|
*/ |
687
|
1 |
|
public static function getLocaleUsed() |
688
|
|
|
{ |
689
|
1 |
|
return isset(self::$localeUsed) ? self::$localeUsed : self::$_instance->getLocaleUsed(); |
690
|
|
|
} |
691
|
|
|
|
692
|
|
|
/** |
693
|
|
|
* Common instance of Locale class |
694
|
|
|
* |
695
|
|
|
* @return \Ease\Locale |
696
|
|
|
*/ |
697
|
|
|
public static function singleton() |
698
|
|
|
{ |
699
|
|
|
if (!isset(self::$_instance)) { |
700
|
|
|
$class = __CLASS__; |
701
|
|
|
self::$_instance = new $class(); |
702
|
|
|
} |
703
|
|
|
return self::$_instance; |
704
|
|
|
} |
705
|
|
|
} |
706
|
|
|
|