/mvc/components/l10n
[return to app]1 
<?php
2 /**
3  * Localization
4  *
5  * This is CakePHP's l10n class updated to PHP5 syntax for Vork
6  *
7  * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
8  * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
9  *
10  * Licensed under The MIT License
11  * Redistributions of files must retain the above copyright notice.
12  *
13  * @copyright     Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
14  * @link          http://cakephp.org CakePHP(tm) Project
15  * @package       cake
16  * @subpackage    cake.cake.libs
17  * @since         CakePHP(tm) v 1.2.0.4116
18  * @license       MIT License (http://www.opensource.org/licenses/mit-license.php)
19  */
20 
21 /**
22  * Localization
23  *
24  * @package       cake
25  * @subpackage    cake.cake.libs
26  */
27 class l10nComponent {
28     /**
29      * The language for current locale
30      *
31      * @var string
32      * @access public
33      */
34     public $language = 'English (United States)';
35 
36     /**
37      * Locale search paths
38      *
39      * @var array
40      * @access public
41      */
42     public $languagePath = array('eng');
43 
44     /**
45      * ISO 639-3 for current locale
46      *
47      * @var string
48      * @access public
49      */
50     public $lang = 'eng';
51 
52     /**
53      * Locale
54      *
55      * @var string
56      * @access public
57      */
58     public $locale = 'en_us';
59 
60     /**
61      * Default ISO 639-3 language.
62      *
63      * DEFAULT_LANGUAGE is defined in an application this will be set as a fall back
64      *
65      * @var string
66      * @access public
67      */
68     public $default = null;
69 
70     /**
71      * Encoding used for current locale
72      *
73      * @var string
74      * @access public
75      */
76     public $charset = 'utf-8';
77 
78     /**
79      * Text direction for current locale
80      *
81      * @var string
82      * @access public
83      */
84     public $direction = 'ltr';
85 
86     /**
87      * Set to true if a locale is found
88      *
89      * @var string
90      * @access public
91      */
92     public $found = false;
93 
94     /**
95      * Maps ISO 639-3 to I10n::_l10nCatalog
96      *
97      * @var array
98      * @access private
99      */
100     protected $_l10nMap = array(/* Afrikaans */ 'afr' => 'af',
101                                 /* Albanian */ 'alb' => 'sq',
102                                 /* Arabic */ 'ara' => 'ar',
103                                 /* Armenian - Armenia */ 'hye' => 'hy',
104                                 /* Basque */ 'baq' => 'eu',
105                                 /* Bosnian */ 'bos' => 'bs',
106                                 /* Bulgarian */ 'bul' => 'bg',
107                                 /* Byelorussian */ 'bel' => 'be',
108                                 /* Catalan */ 'cat' => 'ca',
109                                 /* Chinese */ 'chi' => 'zh',
110                                 /* Chinese */ 'zho' => 'zh',
111                                 /* Croatian */ 'hrv' => 'hr',
112                                 /* Czech */ 'cze' => 'cs',
113                                 /* Czech */ 'ces' => 'cs',
114                                 /* Danish */ 'dan' => 'da',
115                                 /* Dutch (Standard) */ 'dut' => 'nl',
116                                 /* Dutch (Standard) */ 'nld' => 'nl',
117                                 /* English */ 'eng' => 'en',
118                                 /* Estonian */ 'est' => 'et',
119                                 /* Faeroese */ 'fao' => 'fo',
120                                 /* Farsi */ 'fas' => 'fa',
121                                 /* Farsi */ 'per' => 'fa',
122                                 /* Finnish */ 'fin' => 'fi',
123                                 /* French (Standard) */ 'fre' => 'fr',
124                                 /* French (Standard) */ 'fra' => 'fr',
125                                 /* Gaelic (Scots) */ 'gla' => 'gd',
126                                 /* Galician */ 'glg' => 'gl',
127                                 /* German (Standard) */ 'deu' => 'de',
128                                 /* German (Standard) */ 'ger' => 'de',
129                                 /* Greek */ 'gre' => 'el',
130                                 /* Greek */ 'ell' => 'el',
131                                 /* Hebrew */ 'heb' => 'he',
132                                 /* Hindi */ 'hin' => 'hi',
133                                 /* Hungarian */ 'hun' => 'hu',
134                                 /* Icelandic */ 'ice' => 'is',
135                                 /* Icelandic */ 'isl' => 'is',
136                                 /* Indonesian */ 'ind' => 'id',
137                                 /* Irish */ 'gle' => 'ga',
138                                 /* Italian */ 'ita' => 'it',
139                                 /* Japanese */ 'jpn' => 'ja',
140                                 /* Korean */ 'kor' => 'ko',
141                                 /* Latvian */ 'lav' => 'lv',
142                                 /* Lithuanian */ 'lit' => 'lt',
143                                 /* Macedonian */ 'mac' => 'mk',
144                                 /* Macedonian */ 'mkd' => 'mk',
145                                 /* Malaysian */ 'may' => 'ms',
146                                 /* Malaysian */ 'msa' => 'ms',
147                                 /* Maltese */ 'mlt' => 'mt',
148                                 /* Norwegian */ 'nor' => 'no',
149                                 /* Norwegian Bokmal */ 'nob' => 'nb',
150                                 /* Norwegian Nynorsk */ 'nno' => 'nn',
151                                 /* Polish */ 'pol' => 'pl',
152                                 /* Portuguese (Portugal) */ 'por' => 'pt',
153                                 /* Rhaeto-Romanic */ 'roh' => 'rm',
154                                 /* Romanian */ 'rum' => 'ro',
155                                 /* Romanian */ 'ron' => 'ro',
156                                 /* Russian */ 'rus' => 'ru',
157                                 /* Sami (Lappish) */ 'smi' => 'sz',
158                                 /* Serbian */ 'scc' => 'sr',
159                                 /* Serbian */ 'srp' => 'sr',
160                                 /* Slovak */ 'slo' => 'sk',
161                                 /* Slovak */ 'slk' => 'sk',
162                                 /* Slovenian */ 'slv' => 'sl',
163                                 /* Sorbian */ 'wen' => 'sb',
164                                 /* Spanish (Spain - Traditional) */ 'spa' => 'es',
165                                 /* Swedish */ 'swe' => 'sv',
166                                 /* Thai */ 'tha' => 'th',
167                                 /* Tsonga */ 'tso' => 'ts',
168                                 /* Tswana */ 'tsn' => 'tn',
169                                 /* Turkish */ 'tur' => 'tr',
170                                 /* Ukrainian */ 'ukr' => 'uk',
171                                 /* Urdu */ 'urd' => 'ur',
172                                 /* Venda */ 'ven' => 've',
173                                 /* Vietnamese */ 'vie' => 'vi',
174                                 /* Welsh */ 'cym' => 'cy',
175                                 /* Xhosa */ 'xho' => 'xh',
176                                 /* Yiddish */ 'yid' => 'yi',
177                                 /* Zulu */ 'zul' => 'zu');
178 
179     /**
180      * HTTP_ACCEPT_LANGUAGE catalog
181      *
182      * holds all information related to a language
183      *
184      * @var array
185      * @access private
186      */
187     protected $_l10nCatalog = array(
188         'ar-dz' => array('language'            => 'Arabic (Algeria)',
189                          'locale'            => 'ar_dz',
190                          'localeFallback'    => 'ara',
191                          'charset'            => 'utf-8',
192                          'direction'        => 'rtl'),
193         'ar-eg' => array('language'            => 'Arabic (Egypt)',
194                          'locale'            => 'ar_eg',
195                          'localeFallback'    => 'ara',
196                          'charset'            => 'utf-8',
197                          'direction'        => 'rtl'),
198         'ar-iq' => array('language'            => 'Arabic (Iraq)',
199                          'locale'            => 'ar_iq',
200                          'localeFallback'    => 'ara',
201                          'charset'            => 'utf-8',
202                          'direction'        => 'rtl'),
203         'ar-jo' => array('language'            => 'Arabic (Jordan)',
204                          'locale'            => 'ar_jo',
205                          'localeFallback'    => 'ara',
206                          'charset'            => 'utf-8',
207                          'direction'        => 'rtl'),
208         'ar-kw' => array('language'            => 'Arabic (Kuwait)',
209                          'locale'            => 'ar_kw',
210                          'localeFallback'    => 'ara',
211                          'charset'            => 'utf-8',
212                          'direction'        => 'rtl'),
213         'ar-lb' => array('language'            => 'Arabic (Lebanon)',
214                          'locale'            => 'ar_lb',
215                          'localeFallback'    => 'ara',
216                          'charset'            => 'utf-8',
217                          'direction'        => 'rtl'),
218         'ar-ly' => array('language'            => 'Arabic (Libya)',
219                          'locale'            => 'ar_ly',
220                          'localeFallback'    => 'ara',
221                          'charset'            => 'utf-8',
222                          'direction'        => 'rtl'),
223         'ar-ma' => array('language'            => 'Arabic (Morocco)',
224                          'locale'            => 'ar_ma',
225                          'localeFallback'    => 'ara',
226                          'charset'            => 'utf-8',
227                          'direction'        => 'rtl'),
228         'ar-om' => array('language'            => 'Arabic (Oman)',
229                          'locale'            => 'ar_om',
230                          'localeFallback'    => 'ara',
231                          'charset'            => 'utf-8',
232                          'direction'        => 'rtl'),
233         'ar-qa' => array('language'            => 'Arabic (Qatar)',
234                          'locale'            => 'ar_qa',
235                          'localeFallback'    => 'ara',
236                          'charset'            => 'utf-8',
237                          'direction'        => 'rtl'),
238         'ar-sa' => array('language'            => 'Arabic (Saudi Arabia)',
239                          'locale'            => 'ar_sa',
240                          'localeFallback'    => 'ara',
241                          'charset'            => 'utf-8',
242                          'direction'        => 'rtl'),
243         'ar-sy' => array('language'            => 'Arabic (Syria)',
244                          'locale'            => 'ar_sy',
245                          'localeFallback'    => 'ara',
246                          'charset'            => 'utf-8',
247                          'direction'        => 'rtl'),
248         'ar-tn' => array('language'            => 'Arabic (Tunisia)',
249                          'locale'            => 'ar_tn',
250                          'localeFallback'    => 'ara',
251                          'charset'            => 'utf-8',
252                          'direction'        => 'rtl'),
253         'ar-ye' => array('language'            => 'Arabic (Yemen)',
254                          'locale'            => 'ar_ye',
255                          'localeFallback'    => 'ara',
256                          'charset'            => 'utf-8',
257                          'direction'        => 'rtl'),
258         'be' => array('language'            => 'Byelorussian',
259                          'locale'            => 'bel',
260                          'localeFallback'    => 'bel',
261                          'charset'            => 'utf-8',
262                          'direction'        => 'ltr'),
263         'bg' => array('language'            => 'Bulgarian',
264                          'locale'            => 'bul',
265                          'localeFallback'    => 'bul',
266                          'charset'            => 'utf-8',
267                          'direction'        => 'ltr'),
268         'bs' => array('language'            => 'Bosnian',
269                          'locale'            => 'bos',
270                          'localeFallback'    => 'bos',
271                          'charset'            => 'utf-8',
272                          'direction'        => 'ltr'),
273         'ca' => array('language'            => 'Catalan',
274                          'locale'            => 'cat',
275                          'localeFallback'    => 'cat',
276                          'charset'            => 'utf-8',
277                          'direction'        => 'ltr'),
278         'cs' => array('language'            => 'Czech',
279                          'locale'            => 'cze',
280                          'localeFallback'    => 'cze',
281                          'charset'            => 'utf-8',
282                          'direction'        => 'ltr'),
283         'da' => array('language'            => 'Danish',
284                          'locale'            => 'dan',
285                          'localeFallback'    => 'dan',
286                          'charset'            => 'utf-8',
287                          'direction'        => 'ltr'),
288         'de' => array('language'            => 'German (Standard)',
289                          'locale'            => 'deu',
290                          'localeFallback'    => 'deu',
291                          'charset'            => 'utf-8',
292                          'direction'        => 'ltr'),
293         'de-at' => array('language'            => 'German (Austria)',
294                          'locale'            => 'de_at',
295                          'localeFallback'    => 'deu',
296                          'charset'            => 'utf-8',
297                          'direction'        => 'ltr'),
298         'de-ch' => array('language'            => 'German (Swiss)',
299                          'locale'            => 'de_ch',
300                          'localeFallback'    => 'deu',
301                          'charset'            => 'utf-8',
302                          'direction'        => 'ltr'),
303         'de-de' => array('language'            => 'German (Germany)',
304                          'locale'            => 'de_de',
305                          'localeFallback'    => 'deu',
306                          'charset'            => 'utf-8',
307                          'direction'        => 'ltr'),
308         'de-li' => array('language'            => 'German (Liechtenstein)',
309                          'locale'            => 'de_li',
310                          'localeFallback'    => 'deu',
311                          'charset'            => 'utf-8',
312                          'direction'        => 'ltr'),
313         'de-lu' => array('language'            => 'German (Luxembourg)',
314                          'locale'            => 'de_lu',
315                          'localeFallback'    => 'deu',
316                          'charset'            => 'utf-8',
317                          'direction'        => 'ltr'),
318         'e' => array('language'                => 'Greek',
319                          'locale'            => 'gre',
320                          'localeFallback'    => 'gre',
321                          'charset'            => 'utf-8',
322                          'direction'        => 'ltr'),
323         'el' => array('language'            => 'Greek',
324                          'locale'            => 'gre',
325                          'localeFallback'    => 'gre',
326                          'charset'            => 'utf-8',
327                          'direction'        => 'ltr'),
328         'en' => array('language'            => 'English',
329                          'locale'            => 'eng',
330                          'localeFallback'    => 'eng',
331                          'charset'            => 'utf-8',
332                          'direction'        => 'ltr'),
333         'en-au' => array('language'            => 'English (Australian)',
334                          'locale'            => 'en_au',
335                          'localeFallback'    => 'eng',
336                          'charset'            => 'utf-8',
337                          'direction'        => 'ltr'),
338         'en-bz' => array('language'            => 'English (Belize)',
339                          'locale'            => 'en_bz',
340                          'localeFallback'    => 'eng',
341                          'charset'            => 'utf-8',
342                          'direction'        => 'ltr'),
343         'en-ca' => array('language'            => 'English (Canadian)',
344                          'locale'            => 'en_ca',
345                          'localeFallback'    => 'eng',
346                          'charset'            => 'utf-8',
347                          'direction'        => 'ltr'),
348         'en-gb' => array('language'            => 'English (British)',
349                          'locale'            => 'en_gb',
350                          'localeFallback'    => 'eng',
351                          'charset'            => 'utf-8',
352                          'direction'        => 'ltr'),
353         'en-ie' => array('language'            => 'English (Ireland)',
354                          'locale'            => 'en_ie',
355                          'localeFallback'    => 'eng',
356                          'charset'            => 'utf-8',
357                          'direction'        => 'ltr'),
358         'en-jm' => array('language'            => 'English (Jamaica)',
359                          'locale'            => 'en_jm',
360                          'localeFallback'    => 'eng',
361                          'charset'            => 'utf-8',
362                          'direction'        => 'ltr'),
363         'en-nz' => array('language'            => 'English (New Zealand)',
364                          'locale'            => 'en_nz',
365                          'localeFallback'    => 'eng',
366                          'charset'            => 'utf-8',
367                          'direction'        => 'ltr'),
368         'en-tt' => array('language'            => 'English (Trinidad)',
369                          'locale'            => 'en_tt',
370                          'localeFallback'    => 'eng',
371                          'charset'            => 'utf-8',
372                          'direction'        => 'ltr'),
373         'en-us' => array('language'            => 'English (United States)',
374                          'locale'            => 'en_us',
375                          'localeFallback'    => 'eng',
376                          'charset'            => 'utf-8',
377                          'direction'        => 'ltr'),
378         'en-za' => array('language'            => 'English (South Africa)',
379                          'locale'            => 'en_za',
380                          'localeFallback'    => 'eng',
381                          'charset'            => 'utf-8',
382                          'direction'        => 'ltr'),
383         'es' => array('language'            => 'Spanish (Spain - Traditional)',
384                          'locale'            => 'spa',
385                          'localeFallback'    => 'spa',
386                          'charset'            => 'utf-8',
387                          'direction'        => 'ltr'),
388         'es-ar' => array('language'            => 'Spanish (Argentina)',
389                          'locale'            => 'es_ar',
390                          'localeFallback'    => 'spa',
391                          'charset'            => 'utf-8',
392                          'direction'        => 'ltr'),
393         'es-bo' => array('language'            => 'Spanish (Bolivia)',
394                          'locale'            => 'es_bo',
395                          'localeFallback'    => 'spa',
396                          'charset'            => 'utf-8',
397                          'direction'        => 'ltr'),
398         'es-cl' => array('language'            => 'Spanish (Chile)',
399                          'locale'            => 'es_cl',
400                          'localeFallback'    => 'spa',
401                          'charset'            => 'utf-8',
402                          'direction'        => 'ltr'),
403         'es-co' => array('language'            => 'Spanish (Colombia)',
404                          'locale'            => 'es_co',
405                          'localeFallback'    => 'spa',
406                          'charset'            => 'utf-8',
407                          'direction'        => 'ltr'),
408         'es-cr' => array('language'            => 'Spanish (Costa Rica)',
409                          'locale'            => 'es_cr',
410                          'localeFallback'    => 'spa',
411                          'charset'            => 'utf-8',
412                          'direction'        => 'ltr'),
413         'es-do' => array('language'            => 'Spanish (Dominican Republic)',
414                          'locale'            => 'es_do',
415                          'localeFallback'    => 'spa',
416                          'charset'            => 'utf-8',
417                          'direction'        => 'ltr'),
418         'es-ec' => array('language'            => 'Spanish (Ecuador)',
419                          'locale'            => 'es_ec',
420                          'localeFallback'    => 'spa',
421                          'charset'            => 'utf-8',
422                          'direction'        => 'ltr'),
423         'es-es' => array('language'            => 'Spanish (Spain)',
424                          'locale'            => 'es_es',
425                          'localeFallback'    => 'spa',
426                          'charset'            => 'utf-8',
427                          'direction'        => 'ltr'),
428         'es-gt' => array('language'            => 'Spanish (Guatemala)',
429                          'locale'            => 'es_gt',
430                          'localeFallback'    => 'spa',
431                          'charset'            => 'utf-8',
432                          'direction'        => 'ltr'),
433         'es-hn' => array('language'            => 'Spanish (Honduras)',
434                          'locale'            => 'es_hn',
435                          'localeFallback'    => 'spa',
436                          'charset'            => 'utf-8',
437                          'direction'        => 'ltr'),
438         'es-mx' => array('language'            => 'Spanish (Mexican)',
439                          'locale'            => 'es_mx',
440                          'localeFallback'    => 'spa',
441                          'charset'            => 'utf-8',
442                          'direction'        => 'ltr'),
443         'es-ni' => array('language'            => 'Spanish (Nicaragua)',
444                          'locale'            => 'es_ni',
445                          'localeFallback'    => 'spa',
446                          'charset'            => 'utf-8',
447                          'direction'        => 'ltr'),
448         'es-pa' => array('language'            => 'Spanish (Panama)',
449                          'locale'            => 'es_pa',
450                          'localeFallback'    => 'spa',
451                          'charset'            => 'utf-8',
452                          'direction'        => 'ltr'),
453         'es-pe' => array('language'            => 'Spanish (Peru)',
454                          'locale'            => 'es_pe',
455                          'localeFallback'    => 'spa',
456                          'charset'            => 'utf-8',
457                          'direction'        => 'ltr'),
458         'es-pr' => array('language'            => 'Spanish (Puerto Rico)',
459                          'locale'            => 'es_pr',
460                          'localeFallback'    => 'spa',
461                          'charset'            => 'utf-8',
462                          'direction'        => 'ltr'),
463         'es-py' => array('language'            => 'Spanish (Paraguay)',
464                          'locale'            => 'es_py',
465                          'localeFallback'    => 'spa',
466                          'charset'            => 'utf-8',
467                          'direction'        => 'ltr'),
468         'es-sv' => array('language'            => 'Spanish (El Salvador)',
469                          'locale'            => 'es_sv',
470                          'localeFallback'    => 'spa',
471                          'charset'            => 'utf-8',
472                          'direction'        => 'ltr'),
473         'es-uy' => array('language'            => 'Spanish (Uruguay)',
474                          'locale'            => 'es_uy',
475                          'localeFallback'    => 'spa',
476                          'charset'            => 'utf-8',
477                          'direction'        => 'ltr'),
478         'es-ve' => array('language'            => 'Spanish (Venezuela)',
479                          'locale'            => 'es_ve',
480                          'localeFallback'    => 'spa',
481                          'charset'            => 'utf-8',
482                          'direction'        => 'ltr'),
483         'et' => array('language'            => 'Estonian',
484                          'locale'            => 'est',
485                          'localeFallback'    => 'est',
486                          'charset'            => 'utf-8',
487                          'direction'        => 'ltr'),
488         'eu' => array('language'            => 'Basque',
489                          'locale'            => 'baq',
490                          'localeFallback'    => 'baq',
491                          'charset'            => 'utf-8',
492                          'direction'        => 'ltr'),
493         'fa' => array('language'            => 'Farsi',
494                          'locale'            => 'per',
495                          'localeFallback'    => 'per',
496                          'charset'            => 'utf-8',
497                          'direction'        => 'rtl'),
498         'fi' => array('language'            => 'Finnish',
499                          'locale'            => 'fin',
500                          'localeFallback'    => 'fin',
501                          'charset'            => 'utf-8',
502                          'direction'        => 'ltr'),
503         'fo' => array('language'            => 'Faeroese',
504                          'locale'            => 'fao',
505                          'localeFallback'    => 'fao',
506                          'charset'            => 'utf-8',
507                          'direction'        => 'ltr'),
508         'fr' => array('language'            => 'French (Standard)',
509                          'locale'            => 'fre',
510                          'localeFallback'    => 'fre',
511                          'charset'            => 'utf-8',
512                          'direction'        => 'ltr'),
513         'fr-be' => array('language'            => 'French (Belgium)',
514                          'locale'            => 'fr_be',
515                          'localeFallback'    => 'fre',
516                          'charset'            => 'utf-8',
517                          'direction'        => 'ltr'),
518         'fr-ca' => array('language'            => 'French (Canadian)',
519                          'locale'            => 'fr_ca',
520                          'localeFallback'    => 'fre',
521                          'charset'            => 'utf-8',
522                          'direction'        => 'ltr'),
523         'fr-ch' => array('language'            => 'French (Swiss)',
524                          'locale'            => 'fr_ch',
525                          'localeFallback'    => 'fre',
526                          'charset'            => 'utf-8',
527                          'direction'        => 'ltr'),
528         'fr-fr' => array('language'            => 'French (France)',
529                          'locale'            => 'fr_fr',
530                          'localeFallback'    => 'fre',
531                          'charset'            => 'utf-8',
532                          'direction'        => 'ltr'),
533         'fr-lu' => array('language'            => 'French (Luxembourg)',
534                          'locale'            => 'fr_lu',
535                          'localeFallback'    => 'fre',
536                          'charset'            => 'utf-8',
537                          'direction'        => 'ltr'),
538         'ga' => array('language'            => 'Irish',
539                          'locale'            => 'gle',
540                          'localeFallback'    => 'gle',
541                          'charset'            => 'utf-8',
542                          'direction'        => 'ltr'),
543         'gd' => array('language'            => 'Gaelic (Scots)',
544                          'locale'            => 'gla',
545                          'localeFallback'    => 'gla',
546                          'charset'            => 'utf-8',
547                          'direction'        => 'ltr'),
548         'gd-ie' => array('language'            => 'Gaelic (Irish)',
549                          'locale'            => 'gd_ie',
550                          'localeFallback'    => 'gla',
551                          'charset'            => 'utf-8',
552                          'direction'        => 'ltr'),
553         'gl' => array('language'            => 'Galician',
554                          'locale'            => 'glg',
555                          'localeFallback'    => 'glg',
556                          'charset'            => 'utf-8',
557                          'direction'        => 'ltr'),
558         'he' => array('language'            => 'Hebrew',
559                          'locale'            => 'heb',
560                          'localeFallback'    => 'heb',
561                          'charset'            => 'utf-8',
562                          'direction'        => 'rtl'),
563         'hi' => array('language'            => 'Hindi',
564                          'locale'            => 'hin',
565                          'localeFallback'    => 'hin',
566                          'charset'            => 'utf-8',
567                          'direction'        => 'ltr'),
568         'hr' => array('language'            => 'Croatian',
569                          'locale'            => 'hrv',
570                          'localeFallback'    => 'hrv',
571                          'charset'            => 'utf-8',
572                          'direction'        => 'ltr'),
573         'hu' => array('language'            => 'Hungarian',
574                          'locale'            => 'hun',
575                          'localeFallback'    => 'hun',
576                          'charset'            => 'utf-8',
577                          'direction'        => 'ltr'),
578         'hy' => array('language'            => 'Armenian - Armenia',
579                          'locale'            => 'hye',
580                          'localeFallback'    => 'hye',
581                          'charset'            => 'utf-8',
582                          'direction'        => 'ltr'),
583         'id' => array('language'            => 'Indonesian',
584                          'locale'            => 'ind',
585                          'localeFallback'    => 'ind',
586                          'charset'            => 'utf-8',
587                          'direction'        => 'ltr'),
588         'in' => array('language'            => 'Indonesian',
589                          'locale'            => 'ind',
590                          'localeFallback'    => 'ind',
591                          'charset'            => 'utf-8',
592                          'direction'        => 'ltr'),
593         'is' => array('language'            => 'Icelandic',
594                          'locale'            => 'ice',
595                          'localeFallback'    => 'ice',
596                          'charset'            => 'utf-8',
597                          'direction'        => 'ltr'),
598         'it' => array('language'            => 'Italian',
599                          'locale'            => 'ita',
600                          'localeFallback'    => 'ita',
601                          'charset'            => 'utf-8',
602                          'direction'        => 'ltr'),
603         'it-ch' => array('language'            => 'Italian (Swiss) ',
604                          'locale'            => 'it_ch',
605                          'localeFallback'    => 'ita',
606                          'charset'            => 'utf-8',
607                          'direction'        => 'ltr'),
608         'ja' => array('language'            => 'Japanese',
609                          'locale'            => 'jpn',
610                          'localeFallback'    => 'jpn',
611                          'charset'            => 'utf-8',
612                          'direction'        => 'ltr'),
613         'ko' => array('language'            => 'Korean',
614                          'locale'            => 'kor',
615                          'localeFallback'    => 'kor',
616                          'charset'            => 'kr',
617                          'direction'        => 'ltr'),
618         'ko-kp' => array('language'            => 'Korea (North)',
619                          'locale'            => 'ko_kp',
620                          'localeFallback'    => 'kor',
621                          'charset'            => 'kr',
622                          'direction'        => 'ltr'),
623         'ko-kr' => array('language'            => 'Korea (South)',
624                          'locale'            => 'ko_kr',
625                          'localeFallback'    => 'kor',
626                          'charset'            => 'kr',
627                          'direction'        => 'ltr'),
628         'koi8-r' => array('language'        => 'Russian',
629                          'locale'            => 'koi8_r',
630                          'localeFallback'    => 'rus',
631                          'charset'            => 'koi8-r',
632                          'direction'        => 'ltr'),
633         'lt' => array('language'            => 'Lithuanian',
634                          'locale'            => 'lit',
635                          'localeFallback'    => 'lit',
636                          'charset'            => 'utf-8',
637                          'direction'        => 'ltr'),
638         'lv' => array('language'            => 'Latvian',
639                          'locale'            => 'lav',
640                          'localeFallback'    => 'lav',
641                          'charset'            => 'utf-8',
642                          'direction'        => 'ltr'),
643         'mk' => array('language'            => 'FYRO Macedonian',
644                          'locale'            => 'mk',
645                          'localeFallback'    => 'mac',
646                          'charset'            => 'utf-8',
647                          'direction'        => 'ltr'),
648         'mk-mk' => array('language'            => 'Macedonian',
649                          'locale'            => 'mk_mk',
650                          'localeFallback'    => 'mac',
651                          'charset'            => 'utf-8',
652                          'direction'        => 'ltr'),
653         'ms' => array('language'            => 'Malaysian',
654                          'locale'            => 'may',
655                          'localeFallback'    => 'may',
656                          'charset'            => 'utf-8',
657                          'direction'        => 'ltr'),
658         'mt' => array('language'            => 'Maltese',
659                          'locale'            => 'mlt',
660                          'localeFallback'    => 'mlt',
661                          'charset'            => 'utf-8',
662                          'direction'        => 'ltr'),
663         'n' => array('language'                => 'Dutch (Standard)',
664                          'locale'            => 'dut',
665                          'localeFallback'    => 'dut',
666                          'charset'            => 'utf-8',
667                          'direction'        => 'ltr'),
668         'nb' => array('language'            => 'Norwegian Bokmal',
669                          'locale'            => 'nob',
670                          'localeFallback'    => 'nor',
671                          'charset'            => 'utf-8',
672                          'direction'        => 'ltr'),
673         'nl' => array('language'            => 'Dutch (Standard)',
674                          'locale'            => 'dut',
675                          'localeFallback'    => 'dut',
676                          'charset'            => 'utf-8',
677                          'direction'        => 'ltr'),
678         'nl-be' => array('language'            => 'Dutch (Belgium)',
679                          'locale'            => 'nl_be',
680                          'localeFallback'    => 'dut',
681                          'charset'            => 'utf-8',
682                          'direction'        => 'ltr'),
683         'nn' => array('language'            => 'Norwegian Nynorsk',
684                          'locale'            => 'nno',
685                          'localeFallback'    => 'nor',
686                          'charset'            => 'utf-8',
687                          'direction'        => 'ltr'),
688         'no' => array('language'            => 'Norwegian',
689                          'locale'            => 'nor',
690                          'localeFallback'    => 'nor',
691                          'charset'            => 'utf-8',
692                          'direction'        => 'ltr'),
693         'p' => array('language'                => 'Polish',
694                          'locale'            => 'pol',
695                          'localeFallback'    => 'pol',
696                          'charset'            => 'utf-8',
697                          'direction'        => 'ltr'),
698         'pl' => array('language'            => 'Polish',
699                          'locale'            => 'pol',
700                          'localeFallback'    => 'pol',
701                          'charset'            => 'utf-8',
702                          'direction'        => 'ltr'),
703         'pt' => array('language'            => 'Portuguese (Portugal)',
704                          'locale'            => 'por',
705                          'localeFallback'    => 'por',
706                          'charset'            => 'utf-8',
707                          'direction'        => 'ltr'),
708         'pt-br' => array('language'            => 'Portuguese (Brazil)',
709                          'locale'            => 'pt_br',
710                          'localeFallback'    => 'por',
711                          'charset'            => 'utf-8',
712                          'direction'        => 'ltr'),
713         'rm' => array('language'            => 'Rhaeto-Romanic',
714                          'locale'            => 'roh',
715                          'localeFallback'    => 'roh',
716                          'charset'            => 'utf-8',
717                          'direction'        => 'ltr'),
718         'ro' => array('language'            => 'Romanian',
719                          'locale'            => 'rum',
720                          'localeFallback'    => 'rum',
721                          'charset'            => 'utf-8',
722                          'direction'        => 'ltr'),
723         'ro-mo' => array('language'            => 'Romanian (Moldavia)',
724                          'locale'            => 'ro_mo',
725                          'localeFallback'    => 'rum',
726                          'charset'            => 'utf-8',
727                          'direction'        => 'ltr'),
728         'ru' => array('language'            => 'Russian',
729                          'locale'            => 'rus',
730                          'localeFallback'    => 'rus',
731                          'charset'            => 'utf-8',
732                          'direction'        => 'ltr'),
733         'ru-mo' => array('language'            => 'Russian (Moldavia)',
734                          'locale'            => 'ru_mo',
735                          'localeFallback'    => 'rus',
736                          'charset'            => 'utf-8',
737                          'direction'        => 'ltr'),
738         'sb' => array('language'            => 'Sorbian',
739                          'locale'            => 'wen',
740                          'localeFallback'    => 'wen',
741                          'charset'            => 'utf-8',
742                          'direction'        => 'ltr'),
743         'sk' => array('language'            => 'Slovak',
744                          'locale'            => 'slo',
745                          'localeFallback'    => 'slo',
746                          'charset'            => 'utf-8',
747                          'direction'        => 'ltr'),
748         'sl' => array('language'            => 'Slovenian',
749                          'locale'            => 'slv',
750                          'localeFallback'    => 'slv',
751                          'charset'            => 'utf-8',
752                          'direction'        => 'ltr'),
753         'sq' => array('language'            => 'Albanian',
754                          'locale'            => 'alb',
755                          'localeFallback'    => 'alb',
756                          'charset'            => 'utf-8',
757                          'direction'        => 'ltr'),
758         'sr' => array('language'            => 'Serbian',
759                          'locale'            => 'scc',
760                          'localeFallback'    => 'scc',
761                          'charset'            => 'utf-8',
762                          'direction'        => 'ltr'),
763         'sv' => array('language'            => 'Swedish',
764                          'locale'            => 'swe',
765                          'localeFallback'    => 'swe',
766                          'charset'            => 'utf-8',
767                          'direction'        => 'ltr'),
768         'sv-fi' => array('language'            => 'Swedish (Finland)',
769                          'locale'            => 'sv_fi',
770                          'localeFallback'    => 'swe',
771                          'charset'            => 'utf-8',
772                          'direction'        => 'ltr'),
773         'sx' => array('language'            => 'Sutu',
774                          'locale'            => 'sx',
775                          'localeFallback'    => 'sx',
776                          'charset'            => 'utf-8',
777                          'direction'        => 'ltr'),
778         'sz' => array('language'            => 'Sami (Lappish)',
779                          'locale'            => 'smi',
780                          'localeFallback'    => 'smi',
781                          'charset'            => 'utf-8',
782                          'direction'        => 'ltr'),
783         'th' => array('language'            => 'Thai',
784                          'locale'            => 'tha',
785                          'localeFallback'    => 'tha',
786                          'charset'            => 'utf-8',
787                          'direction'        => 'ltr'),
788         'tn' => array('language'            => 'Tswana',
789                          'locale'            => 'tsn',
790                          'localeFallback'    => 'tsn',
791                          'charset'            => 'utf-8',
792                          'direction'        => 'ltr'),
793         'tr' => array('language'            => 'Turkish',
794                          'locale'            => 'tur',
795                          'localeFallback'    => 'tur',
796                          'charset'            => 'utf-8',
797                          'direction'        => 'ltr'),
798         'ts' => array('language'            => 'Tsonga',
799                          'locale'            => 'tso',
800                          'localeFallback'    => 'tso',
801                          'charset'            => 'utf-8',
802                          'direction'        => 'ltr'),
803         'uk' => array('language'            => 'Ukrainian',
804                          'locale'            => 'ukr',
805                          'localeFallback'    => 'ukr',
806                          'charset'            => 'utf-8',
807                          'direction'        => 'ltr'),
808         'ur' => array('language'            => 'Urdu',
809                          'locale'            => 'urd',
810                          'localeFallback'    => 'urd',
811                          'charset'            => 'utf-8',
812                          'direction'        => 'rtl'),
813         've' => array('language'            => 'Venda',
814                          'locale'            => 'ven',
815                          'localeFallback'    => 'ven',
816                          'charset'            => 'utf-8',
817                          'direction'        => 'ltr'),
818         'vi' => array('language'            => 'Vietnamese',
819                          'locale'            => 'vie',
820                          'localeFallback'    => 'vie',
821                          'charset'            => 'utf-8',
822                          'direction'        => 'ltr'),
823         'cy' => array('language'            => 'Welsh',
824                          'locale'            => 'cym',
825                          'localeFallback'    => 'cym',
826                          'charset'            => 'utf-8',
827                          'direction'        => 'ltr'),
828         'xh' => array('language'            => 'Xhosa',
829                          'locale'            => 'xho',
830                          'localeFallback'    => 'xho',
831                          'charset'            => 'utf-8',
832                          'direction'        => 'ltr'),
833         'yi' => array('language'            => 'Yiddish',
834                          'locale'            => 'yid',
835                          'localeFallback'    => 'yid',
836                          'charset'            => 'utf-8',
837                          'direction'        => 'ltr'),
838         'zh' => array('language'            => 'Chinese',
839                          'locale'            => 'chi',
840                          'localeFallback'    => 'chi',
841                          'charset'            => 'utf-8',
842                          'direction'        => 'ltr'),
843         'zh-cn' => array('language'            => 'Chinese (PRC)',
844                          'locale'            => 'zh_cn',
845                          'localeFallback'    => 'chi',
846                          'charset'            => 'GB2312',
847                          'direction'        => 'ltr'),
848         'zh-hk' => array('language'            => 'Chinese (Hong Kong)',
849                          'locale'            => 'zh_hk',
850                          'localeFallback'    => 'chi',
851                          'charset'            => 'utf-8',
852                          'direction'        => 'ltr'),
853         'zh-sg' => array('language'            => 'Chinese (Singapore)',
854                          'locale'            => 'zh_sg',
855                          'localeFallback'    => 'chi',
856                          'charset'            => 'utf-8',
857                          'direction'        => 'ltr'),
858         'zh-tw' => array('language'            => 'Chinese (Taiwan)',
859                          'locale'            => 'zh_tw',
860                          'localeFallback'    => 'chi',
861                          'charset'            => 'utf-8',
862                          'direction'        => 'ltr'),
863         'zu' => array('language'            => 'Zulu',
864                          'locale'            => 'zul',
865                          'localeFallback'    => 'zul',
866                          'charset'            => 'utf-8',
867                          'direction'        => 'ltr'));
868 
869     /**
870      * Class constructor
871      */
872     public function _construct() {
873         if (defined('DEFAULT_LANGUAGE')) {
874             $this->default = DEFAULT_LANGUAGE;
875         }
876     }
877 
878     /**
879      * Gets the settings for $language.
880      * If $language is null it attempt to get settings from L10n::_autoLanguage(); if this fails
881      * the method will get the settings from L10n::_setLanguage();
882      *
883      * @param string $language Language (if null will use DEFAULT_LANGUAGE if defined)
884      * @access public
885      */
886     public function get($language = null) {
887         if ($language !== null) {
888             return $this->_setLanguage($language);
889         } elseif ($this->_autoLanguage() === false) {
890             return $this->_setLanguage();
891         }
892     }
893 
894     /**
895      * Sets the class vars to correct values for $language.
896      * If $language is null it will use the DEFAULT_LANGUAGE if defined
897      *
898      * @param string $language Language (if null will use DEFAULT_LANGUAGE if defined)
899      * @access private
900      */
901     protected function _setLanguage($language = null) {
902         $langKey = null;
903         if ($language !== null && isset($this->_l10nMap[$language])
904             && isset($this->_l10nCatalog[$this->_l10nMap[$language]])) {
905             $langKey = $this->_l10nMap[$language];
906         } else if ($language !== null && isset($this->_l10nCatalog[$language])) {
907             $langKey = $language;
908         } else if (defined('DEFAULT_LANGUAGE')) {
909             $langKey = $language = DEFAULT_LANGUAGE;
910         }
911 
912         if ($langKey !== null && isset($this->_l10nCatalog[$langKey])) {
913             $this->language = $this->_l10nCatalog[$langKey]['language'];
914             $this->languagePath = array(
915                 $this->_l10nCatalog[$langKey]['locale'],
916                 $this->_l10nCatalog[$langKey]['localeFallback']
917             );
918             $this->lang = $language;
919             $this->locale = $this->_l10nCatalog[$langKey]['locale'];
920             $this->charset = $this->_l10nCatalog[$langKey]['charset'];
921             $this->direction = $this->_l10nCatalog[$langKey]['direction'];
922         } else {
923             $this->lang = $language;
924             $this->languagePath = array($language);
925         }
926 
927         if ($this->default) {
928             if (isset($this->_l10nMap[$this->default]) &&
 isset($this->_l10nCatalog[$this->_l10nMap[$this->default]])) {
929                 $this->languagePath[] = $this->_l10nCatalog[$this->_l10nMap[$this->default]]['localeFallback'];
930             } else if (isset($this->_l10nCatalog[$this->default])) {
931                 $this->languagePath[] = $this->_l10nCatalog[$this->default]['localeFallback'];
932             }
933         }
934         $this->found = true;
935 
936         if ($language) {
937             return $language;
938         }
939     }
940 
941     /**
942      * Attempts to find the locale settings based on the HTTP_ACCEPT_LANGUAGE variable
943      *
944      * @return boolean Success
945      * @access private
946      */
947     protected function _autoLanguage() {
948         $basics = get::helper('cakeBasics');
949         $_detectableLanguages = preg_split('/[,;]/', $basics->env('HTTP_ACCEPT_LANGUAGE'));
950         foreach ($_detectableLanguages as $key => $langKey) {
951             $langKey = strtolower($langKey);
952             if (strpos($langKey, '_') !== false) {
953                 $langKey = str_replace('_', '-', $langKey);
954             }
955 
956             if (isset($this->_l10nCatalog[$langKey])) {
957                 $this->_setLanguage($langKey);
958                 return true;
959             } else if (strpos($langKey, '-') !== false) {
960                 $langKey = substr($langKey, 0, 2);
961                 if (isset($this->_l10nCatalog[$langKey])) {
962                     $this->_setLanguage($langKey);
963                     return true;
964                 }
965             }
966         }
967         return false;
968     }
969 
970     /**
971      * Attempts to find locale for language, or language for locale
972      *
973      * @param mixed $mixed 2/3 char string (language/locale), array of those strings, or null
974      * @return mixed string language/locale, array of those values, whole map as an array,
975      *    or false when language/locale doesn't exist
976      * @access public
977      */
978     public function map($mixed = null) {
979         if (is_array($mixed)) {
980             $result = array();
981             foreach ($mixed as $_mixed) {
982                 if ($_result = $this->map($_mixed)) {
983                     $result[$_mixed] = $_result;
984                 }
985             }
986             return $result;
987         } else if (is_string($mixed)) {
988             if (strlen($mixed) === 2 && in_array($mixed, $this->_l10nMap)) {
989                 return array_search($mixed, $this->_l10nMap);
990             } else if (isset($this->_l10nMap[$mixed])) {
991                 return $this->_l10nMap[$mixed];
992             }
993             return false;
994         }
995         return $this->_l10nMap;
996     }
997 
998     /**
999      * Attempts to find catalog record for requested language
1000      *
1001      * @param mixed $language string requested language, array of requested languages, or null for whole catalog
1002      * @return mixed array catalog record for requested language, array of catalog records, whole catalog,
1003      *    or false when language doesn't exist
1004      * @access public
1005      */
1006     public function catalog($language = null) {
1007         if (is_array($language)) {
1008             $result = array();
1009             foreach ($language as $_language) {
1010                 if ($_result = $this->catalog($_language)) {
1011                     $result[$_language] = $_result;
1012                 }
1013             }
1014             return $result;
1015         } else if (is_string($language)) {
1016             if (isset($this->_l10nCatalog[$language])) {
1017                 return $this->_l10nCatalog[$language];
1018             } else if (isset($this->_l10nMap[$language]) &&
 isset($this->_l10nCatalog[$this->_l10nMap[$language]])) {
1019                 return $this->_l10nCatalog[$this->_l10nMap[$language]];
1020             }
1021             return false;
1022         }
1023         return $this->_l10nCatalog;
1024     }
1025 }


