Update COPYING with new address of the FSF.
[squirrelmail.git] / functions / i18n.php
index eb213859732c79b0796ab89b0d126b7aa7e18989..554ab4427c189a458c62a67b43618ae68b733f5c 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * SquirrelMail internationalization functions
  *
- * Copyright (c) 1999-2004 The SquirrelMail Project Team
+ * Copyright (c) 1999-2005 The SquirrelMail Project Team
  * Licensed under the GNU GPL. For full terms see the file COPYING.
  *
  * This file contains variuos functions that are needed to do
@@ -59,6 +59,39 @@ function sq_textdomain($domain) {
     return $gettext_domain;
 }
 
+/**
+ * php setlocale function wrapper
+ *
+ * From php 4.3.0 it is possible to use arrays in order to set locale.
+ * php gettext extension works only when locale is set. This wrapper
+ * function allows to use more than one locale name.
+ *
+ * @param int $category locale category name. Use php named constants
+ *     (LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME)
+ * @param mixed $locale option contains array with possible locales or string with one locale
+ * @return string name of set locale or false, if all locales fail.
+ * @since 1.5.1 and 1.4.5
+ * @see http://www.php.net/setlocale
+ */
+function sq_setlocale($category,$locale) {
+    // string with only one locale
+    if (is_string($locale))
+        return setlocale($category,$locale);
+
+    if (! check_php_version(4,3)) {
+        $ret=false;
+        $index=0;
+        while ( ! $ret && $index<count($locale)) {
+            $ret=setlocale($category,$locale[$index]);
+            $index++;
+        }
+    } else {
+        // php 4.3.0 or better, use entire array
+        $ret=setlocale($category,$locale);
+    }
+    return $ret;
+}
+
 /**
  * Converts string from given charset to charset, that can be displayed by user translation.
  *
@@ -71,9 +104,11 @@ function sq_textdomain($domain) {
  *
  * @param string $charset
  * @param string $string Text to be decoded
+ * @param boolean $force_decode converts string to html without $charset!=$default_charset check.
+ * Argument is available since 1.5.1 and 1.4.5.
  * @return string decoded string
  */
-function charset_decode ($charset, $string) {
+function charset_decode ($charset, $string, $force_decode=false) {
     global $languages, $squirrelmail_language, $default_charset;
     global $use_php_recode, $use_php_iconv, $aggressive_decoding;
 
@@ -93,7 +128,7 @@ function charset_decode ($charset, $string) {
         $use_php_iconv=false; }
 
     // Don't do conversion if charset is the same.
-    if ( $charset == strtolower($default_charset) )
+    if ( ! $force_decode && $charset == strtolower($default_charset) )
         return htmlspecialchars($string);
 
     // catch iso-8859-8-i thing
@@ -148,7 +183,7 @@ function charset_decode ($charset, $string) {
 
 /**
  * Converts html string to given charset
- * @since 1.5.1
+ * @since 1.5.1 and 1.4.4
  * @param string $string
  * @param string $charset
  * @param boolean $htmlencode keep htmlspecialchars encoding
@@ -184,7 +219,7 @@ function charset_encode($string,$charset,$htmlencode=true) {
  *
  * If conversion is done to charset different that utf-8, unsupported symbols
  * will be replaced with question marks.
- * @since 1.5.1
+ * @since 1.5.1 and 1.4.4
  * @param string $in_charset initial charset
  * @param string $string string that has to be converted
  * @param string $out_charset final charset
@@ -192,7 +227,7 @@ function charset_encode($string,$charset,$htmlencode=true) {
  * @return string converted string
  */
 function charset_convert($in_charset,$string,$out_charset,$htmlencode=true) {
-    $string=charset_decode($in_charset,$string);
+    $string=charset_decode($in_charset,$string,true);
     $string=charset_encode($string,$out_charset,$htmlencode);
     return $string;
 }
@@ -200,7 +235,7 @@ function charset_convert($in_charset,$string,$out_charset,$htmlencode=true) {
 /**
  * Makes charset name suitable for decoding cycles
  *
- * @since 1.5.0
+ * @since 1.5.0 and 1.4.4
  * @param string $charset Name of charset
  * @return string $charset Adjusted name of charset
  */
@@ -255,14 +290,42 @@ function set_up_language($sm_language, $do_search = false, $default = false) {
     $SetupAlready = TRUE;
     sqgetGlobalVar('HTTP_ACCEPT_LANGUAGE',  $accept_lang, SQ_SERVER);
 
-    if ($do_search && ! $sm_language && isset($accept_lang)) {
+    /**
+     * If function is asked to detect preferred language
+     *  OR squirrelmail default language is set to empty string
+     *    AND
+     * squirrelmail language ($sm_language) is empty string
+     * (not set in user's prefs and no cookie with language info)
+     *    AND
+     * browser provides list of preferred languages
+     *  THEN
+     * get preferred language from HTTP_ACCEPT_LANGUAGE header
+     */
+    if (($do_search || empty($squirrelmail_default_language)) &&
+        ! $sm_language &&
+        isset($accept_lang)) {
+        // TODO: use more than one language, if first language is not available
+        // FIXME: function assumes that string contains two or more characters.
+        // FIXME: some languages use 5 chars
         $sm_language = substr($accept_lang, 0, 2);
     }
 
-    if ((!$sm_language||$default) && isset($squirrelmail_default_language)) {
+    /**
+     * If language preference is not set OR script asks to use default language
+     *  AND
+     * default squirrelmail language is not set to empty string
+     *  THEN
+     * use default squirrelmail language value from configuration.
+     */
+    if ((!$sm_language||$default) &&
+        ! empty($squirrelmail_default_language)) {
         $squirrelmail_language = $squirrelmail_default_language;
         $sm_language = $squirrelmail_default_language;
     }
+
+    /** provide failsafe language when detection fails */
+    if (! $sm_language) $sm_language='en_US';
+
     $sm_notAlias = $sm_language;
 
     // Catching removed translation
@@ -282,19 +345,38 @@ function set_up_language($sm_language, $do_search = false, $default = false) {
          isset($languages[$sm_notAlias]['CHARSET']) ) {
         sq_bindtextdomain( 'squirrelmail', SM_PATH . 'locale/' );
         sq_textdomain( 'squirrelmail' );
+
+        // set codeset in order to avoid gettext charset conversions
         if (function_exists('bind_textdomain_codeset')) {
+            // Japanese translation uses different internal charset
             if ($sm_notAlias == 'ja_JP') {
-                bind_textdomain_codeset ("squirrelmail", 'EUC-JP');
+                bind_textdomain_codeset ('squirrelmail', 'EUC-JP');
             } else {
-                bind_textdomain_codeset ("squirrelmail", $languages[$sm_notAlias]['CHARSET'] );
+                bind_textdomain_codeset ('squirrelmail', $languages[$sm_notAlias]['CHARSET'] );
             }
         }
+
+        // Use LOCALE key, if it is set.
         if (isset($languages[$sm_notAlias]['LOCALE'])){
             $longlocale=$languages[$sm_notAlias]['LOCALE'];
         } else {
             $longlocale=$sm_notAlias;
         }
-        if ( !ini_get('safe_mode') &&
+
+        // try setting locale
+        $retlocale=sq_setlocale(LC_ALL, $longlocale);
+
+        // check if locale is set and assign that locale to $longlocale
+        // in order to use it in putenv calls.
+        if (! is_bool($retlocale)) {
+            $longlocale=$retlocale;
+        } elseif (is_array($longlocale)) {
+            // setting of all locales failed.
+            // we need string instead of array used in LOCALE key.
+            $longlocale=$sm_notAlias;
+        }
+
+        if ( !((bool)ini_get('safe_mode')) &&
              getenv( 'LC_ALL' ) != $longlocale ) {
             putenv( "LC_ALL=$longlocale" );
             putenv( "LANG=$longlocale" );
@@ -302,7 +384,6 @@ function set_up_language($sm_language, $do_search = false, $default = false) {
             putenv( "LC_NUMERIC=C" );
             if ($sm_notAlias=='tr_TR') putenv( "LC_CTYPE=C" );
         }
-        setlocale(LC_ALL, $longlocale);
         // Workaround for plugins that use numbers with floating point
         // It might be removed if plugins use correct decimal delimiters
         // according to locale settings.
@@ -360,6 +441,27 @@ function set_up_language($sm_language, $do_search = false, $default = false) {
         } else {
             header( 'Content-Type: text/html; charset=' . $languages[$sm_notAlias]['CHARSET'] );
         }
+        /**
+         * mbstring.func_overload fix (#929644).
+         *
+         * php mbstring extension can replace standard string functions with their multibyte
+         * equivalents. See http://www.php.net/ref.mbstring#mbstring.overload. This feature 
+         * was added in php v.4.2.0
+         *
+         * Some SquirrelMail functions work with 8bit strings in bytes. If interface is forced
+         * to use mbstring functions and mbstring internal encoding is set to multibyte charset,
+         * interface can't trust regular string functions. Due to mbstring overloading design
+         * limits php scripts can't control this setting.
+         *
+         * This hack should fix some issues related to 8bit strings in passwords. Correct fix is
+         * to disable mbstring overloading. Japanese translation uses different internal encoding.
+         */
+        if ($squirrelmail_language != 'ja_JP' &&
+            function_exists('mb_internal_encoding') &&
+            check_php_version(4,2,0) &&
+            (int)ini_get('mbstring.func_overload')!=0) {
+            mb_internal_encoding('pass');
+        }
     }
     return 0;
 }
@@ -368,8 +470,8 @@ function set_up_language($sm_language, $do_search = false, $default = false) {
  * Sets default_charset variable according to the one that is used by user's translations.
  *
  * Function changes global $default_charset variable in order to be sure, that it
- * contains charset used by user's translation. Sanity of $squirrelmail_default_language
- * and $default_charset combination provided in SquirrelMail config is also tested.
+ * contains charset used by user's translation. Sanity of $squirrelmail_language
+ * and $default_charset combination is also tested.
  *
  * There can be a $default_charset setting in the
  * config.php file, but the user may have a different language
@@ -380,11 +482,11 @@ function set_up_language($sm_language, $do_search = false, $default = false) {
  * message blindly with the system-wide $default_charset.
  */
 function set_my_charset(){
-    global $data_dir, $username, $default_charset, $languages, $squirrelmail_default_language;
+    global $data_dir, $username, $default_charset, $languages, $squirrelmail_language;
 
     $my_language = getPref($data_dir, $username, 'language');
     if (!$my_language) {
-        $my_language = $squirrelmail_default_language ;
+        $my_language = $squirrelmail_language ;
     }
     // Catch removed translation
     if (!isset($languages[$my_language])) {
@@ -797,7 +899,7 @@ endswitch;
 
 global $squirrelmail_language, $languages, $use_gettext;
 
-if (! isset($squirrelmail_language)) {
+if (! sqgetGlobalVar('squirrelmail_language',$squirrelmail_language,SQ_COOKIE)) {
     $squirrelmail_language = '';
 }
 
@@ -812,12 +914,13 @@ if (! isset($squirrelmail_language)) {
  *  CHARSET   - Encoding used by translation
  *  ALIAS     - used when 'language' is only short name and 'value' should provide long language name
  *  ALTNAME   - Native translation name. Any 8bit symbols must be html encoded.
- *  LOCALE    - Full locale name (in xx_XX.charset format)
+ *  LOCALE    - Full locale name (in xx_XX.charset format). It can use array with several locale names since 1.4.5 and 1.5.1
  *  DIR       - Text direction. Used to define Right-to-Left languages. Possible values 'rtl' or 'ltr'. If undefined - defaults to 'ltr'
  *  XTRA_CODE - translation uses special functions. See doc/i18n.txt
  *
  * Each 'language' definition requires NAME+CHARSET or ALIAS variables.
  *
+ * @todo TODO: make language loading modular (similar to plugins, with locale/xx_XX/setup.php files)
  * @name $languages
  * @global array $languages
  */
@@ -835,43 +938,43 @@ $languages['bn']['ALIAS'] = 'bn_IN';
 
 $languages['ca_ES']['NAME']    = 'Catalan';
 $languages['ca_ES']['CHARSET'] = 'iso-8859-1';
-$languages['ca_ES']['LOCALE']  = 'ca_ES.ISO8859-1';
+$languages['ca_ES']['LOCALE']  = array('ca_ES.ISO8859-1','ca_ES.ISO-8859-1','ca_ES');
 $languages['ca']['ALIAS'] = 'ca_ES';
 
 $languages['cs_CZ']['NAME']    = 'Czech';
 $languages['cs_CZ']['ALTNAME'] = '&#268;e&scaron;tina';
 $languages['cs_CZ']['CHARSET'] = 'iso-8859-2';
-$languages['cs_CZ']['LOCALE']  = 'cs_CZ.ISO8859-2';
+$languages['cs_CZ']['LOCALE']  = array('cs_CZ.ISO8859-2','cs_CZ.ISO-8859-2','cs_CZ');
 $languages['cs']['ALIAS']      = 'cs_CZ';
 
 $languages['cy_GB']['NAME']    = 'Welsh';
 $languages['cy_GB']['ALTNAME'] = 'Cymraeg';
 $languages['cy_GB']['CHARSET'] = 'iso-8859-1';
-$languages['cy_GB']['LOCALE']  = 'cy_GB.ISO8859-1';
+$languages['cy_GB']['LOCALE']  = array('cy_GB.ISO8859-1','cy_GB.ISO-8859-1','cy_GB');
 $languages['cy']['ALIAS'] = 'cy_GB';
 
 // Danish locale is da_DK.
 $languages['da_DK']['NAME']    = 'Danish';
 $languages['da_DK']['ALTNAME'] = 'Dansk';
 $languages['da_DK']['CHARSET'] = 'iso-8859-1';
-$languages['da_DK']['LOCALE']  = 'da_DK.ISO8859-1';
+$languages['da_DK']['LOCALE']  = array('da_DK.ISO8859-1','da_DK.ISO-8859-1','da_DK');
 $languages['da']['ALIAS'] = 'da_DK';
 
 $languages['de_DE']['NAME']    = 'German';
-$languages['de_DE']['ALTNAME']    = 'Deutsch';
+$languages['de_DE']['ALTNAME'] = 'Deutsch';
 $languages['de_DE']['CHARSET'] = 'iso-8859-1';
-$languages['de_DE']['LOCALE']  = 'de_DE.ISO8859-1';
+$languages['de_DE']['LOCALE']  = array('de_DE.ISO8859-1','de_DE.ISO-8859-1','de_DE');
 $languages['de']['ALIAS'] = 'de_DE';
 
 $languages['el_GR']['NAME']    = 'Greek';
 $languages['el_GR']['ALTNAME'] = '&Epsilon;&lambda;&lambda;&eta;&nu;&iota;&kappa;&#940;';
 $languages['el_GR']['CHARSET'] = 'iso-8859-7';
-$languages['el_GR']['LOCALE']  = 'el_GR.ISO8859-7';
+$languages['el_GR']['LOCALE']  = array('el_GR.ISO8859-7','el_GR.ISO-8859-7','el_GR');
 $languages['el']['ALIAS'] = 'el_GR';
 
 $languages['en_GB']['NAME']    = 'British';
 $languages['en_GB']['CHARSET'] = 'iso-8859-15';
-$languages['en_GB']['LOCALE']  = 'en_GB.ISO8859-15';
+$languages['en_GB']['LOCALE']  = array('en_GB.ISO8859-15','en_GB.ISO-8859-15','en_GB');
 
 $languages['en_US']['NAME']    = 'English';
 $languages['en_US']['CHARSET'] = 'iso-8859-1';
@@ -881,62 +984,62 @@ $languages['en']['ALIAS'] = 'en_US';
 $languages['es_ES']['NAME']    = 'Spanish';
 $languages['es_ES']['ALTNAME'] = 'Espa&ntilde;ol';
 $languages['es_ES']['CHARSET'] = 'iso-8859-1';
-$languages['es_ES']['LOCALE']  = 'es_ES.ISO8859-1';
+$languages['es_ES']['LOCALE']  = array('es_ES.ISO8859-1','es_ES.ISO-8859-1','es_ES');
 $languages['es']['ALIAS'] = 'es_ES';
 
 $languages['et_EE']['NAME']    = 'Estonian';
 $languages['et_EE']['CHARSET'] = 'iso-8859-15';
-$languages['et_EE']['LOCALE']  = 'et_EE.ISO8859-15';
+$languages['et_EE']['LOCALE']  = array('et_EE.ISO8859-15','et_EE.ISO-8859-15','et_EE');
 $languages['et']['ALIAS'] = 'et_EE';
 
 $languages['eu_ES']['NAME']    = 'Basque';
 $languages['eu_ES']['CHARSET'] = 'iso-8859-1';
-$languages['eu_ES']['LOCALE']  = 'eu_ES.ISO8859-1';
+$languages['eu_ES']['LOCALE']  = array('eu_ES.ISO8859-1','eu_ES.ISO-8859-1','eu_ES');
 $languages['eu']['ALIAS'] = 'eu_ES';
 
 $languages['fo_FO']['NAME']    = 'Faroese';
 $languages['fo_FO']['CHARSET'] = 'iso-8859-1';
-$languages['fo_FO']['LOCALE']  = 'fo_FO.ISO8859-1';
+$languages['fo_FO']['LOCALE']  = array('fo_FO.ISO8859-1','fo_FO.ISO-8859-1','fo_FO');
 $languages['fo']['ALIAS'] = 'fo_FO';
 
 $languages['fi_FI']['NAME']    = 'Finnish';
 $languages['fi_FI']['ALTNAME'] = 'Suomi';
 $languages['fi_FI']['CHARSET'] = 'iso-8859-1';
-$languages['fi_FI']['LOCALE']  = 'fi_FI.ISO8859-1';
+$languages['fi_FI']['LOCALE']  = array('fi_FI.ISO8859-1','fi_FI.ISO-8859-1','fi_FI');
 $languages['fi']['ALIAS'] = 'fi_FI';
 
 $languages['fr_FR']['NAME']    = 'French';
 $languages['fr_FR']['ALTNAME'] = 'Fran&#231;ais';
 $languages['fr_FR']['CHARSET'] = 'iso-8859-1';
-$languages['fr_FR']['LOCALE']  = 'fr_FR.ISO8859-1';
+$languages['fr_FR']['LOCALE']  = array('fr_FR.ISO8859-1','fr_FR.ISO-8859-1','fr_FR');
 $languages['fr']['ALIAS'] = 'fr_FR';
 
 $languages['hr_HR']['NAME']    = 'Croatian';
 $languages['hr_HR']['CHARSET'] = 'iso-8859-2';
-$languages['hr_HR']['LOCALE']  = 'hr_HR.ISO8859-2';
+$languages['hr_HR']['LOCALE']  = array('hr_HR.ISO8859-2','hr_HR.ISO-8859-2','hr_HR');
 $languages['hr']['ALIAS'] = 'hr_HR';
 
 $languages['hu_HU']['NAME']    = 'Hungarian';
 $languages['hu_HU']['ALTNAME'] = 'Magyar';
 $languages['hu_HU']['CHARSET'] = 'iso-8859-2';
-$languages['hu_HU']['LOCALE']  = 'hu_HU.ISO8859-2';
+$languages['hu_HU']['LOCALE']  = array('hu_HU.ISO8859-2','hu_HU.ISO-8859-2','hu_HU');
 $languages['hu']['ALIAS'] = 'hu_HU';
 
 $languages['id_ID']['NAME']    = 'Indonesian';
 $languages['id_ID']['ALTNAME'] = 'Bahasa Indonesia';
 $languages['id_ID']['CHARSET'] = 'iso-8859-1';
-$languages['id_ID']['LOCALE']  = 'id_ID.ISO8859-1';
+$languages['id_ID']['LOCALE']  = array('id_ID.ISO8859-1','id_ID.ISO-8859-1','id_ID');
 $languages['id']['ALIAS'] = 'id_ID';
 
 $languages['is_IS']['NAME']    = 'Icelandic';
 $languages['is_IS']['ALTNAME'] = '&Iacute;slenska';
 $languages['is_IS']['CHARSET'] = 'iso-8859-1';
-$languages['is_IS']['LOCALE']  = 'is_IS.ISO8859-1';
+$languages['is_IS']['LOCALE']  = array('is_IS.ISO8859-1','is_IS.ISO-8859-1','is_IS');
 $languages['is']['ALIAS'] = 'is_IS';
 
 $languages['it_IT']['NAME']    = 'Italian';
 $languages['it_IT']['CHARSET'] = 'iso-8859-1';
-$languages['it_IT']['LOCALE']  = 'it_IT.ISO8859-1';
+$languages['it_IT']['LOCALE']  = array('it_IT.ISO8859-1','it_IT.ISO-8859-1','it_IT');
 $languages['it']['ALIAS'] = 'it_IT';
 
 $languages['ja_JP']['NAME']    = 'Japanese';
@@ -961,46 +1064,46 @@ $languages['lt']['ALIAS'] = 'lt_LT';
 $languages['nl_NL']['NAME']    = 'Dutch';
 $languages['nl_NL']['ALTNAME'] = 'Nederlands';
 $languages['nl_NL']['CHARSET'] = 'iso-8859-1';
-$languages['nl_NL']['LOCALE']  = 'nl_NL.ISO8859-1';
+$languages['nl_NL']['LOCALE']  = array('nl_NL.ISO8859-1','nl_NL.ISO-8859-1','nl_NL');
 $languages['nl']['ALIAS'] = 'nl_NL';
 
 $languages['ms_MY']['NAME']    = 'Malay';
 $languages['ms_MY']['ALTNAME'] = 'Bahasa Melayu';
 $languages['ms_MY']['CHARSET'] = 'iso-8859-1';
-$languages['ms_MY']['LOCALE']  = 'ms_MY.ISO8859-1';
+$languages['ms_MY']['LOCALE']  = array('ms_MY.ISO8859-1','ms_MY.ISO-8859-1','ms_MY');
 $languages['my']['ALIAS'] = 'ms_MY';
 
 $languages['nb_NO']['NAME']    = 'Norwegian (Bokm&aring;l)';
 $languages['nb_NO']['ALTNAME'] = 'Norsk (Bokm&aring;l)';
 $languages['nb_NO']['CHARSET'] = 'iso-8859-1';
-$languages['nb_NO']['LOCALE']  = 'nb_NO.ISO8859-1';
+$languages['nb_NO']['LOCALE']  = array('nb_NO.ISO8859-1','nb_NO.ISO-8859-1','nb_NO');
 $languages['nb']['ALIAS'] = 'nb_NO';
 
 $languages['nn_NO']['NAME']    = 'Norwegian (Nynorsk)';
 $languages['nn_NO']['ALTNAME'] = 'Norsk (Nynorsk)';
 $languages['nn_NO']['CHARSET'] = 'iso-8859-1';
-$languages['nn_NO']['LOCALE']  = 'nn_NO.ISO8859-1';
+$languages['nn_NO']['LOCALE']  = array('nn_NO.ISO8859-1','nn_NO.ISO-8859-1','nn_NO');
 
 $languages['pl_PL']['NAME']    = 'Polish';
 $languages['pl_PL']['ALTNAME'] = 'Polski';
 $languages['pl_PL']['CHARSET'] = 'iso-8859-2';
-$languages['pl_PL']['LOCALE']  = 'pl_PL.ISO8859-2';
+$languages['pl_PL']['LOCALE']  = array('pl_PL.ISO8859-2','pl_PL.ISO-8859-2','pl_PL');
 $languages['pl']['ALIAS'] = 'pl_PL';
 
 $languages['pt_PT']['NAME'] = 'Portuguese (Portugal)';
 $languages['pt_PT']['CHARSET'] = 'iso-8859-1';
-$languages['pt_PT']['LOCALE']  = 'pt_PT.ISO8859-1';
+$languages['pt_PT']['LOCALE']  = array('pt_PT.ISO8859-1','pt_PT.ISO-8859-1','pt_PT');
 $languages['pt']['ALIAS'] = 'pt_PT';
 
 $languages['pt_BR']['NAME']    = 'Portuguese (Brazil)';
 $languages['pt_BR']['ALTNAME'] = 'Portugu&ecirc;s do Brasil';
 $languages['pt_BR']['CHARSET'] = 'iso-8859-1';
-$languages['pt_BR']['LOCALE']  = 'pt_BR.ISO8859-1';
+$languages['pt_BR']['LOCALE']  = array('pt_BR.ISO8859-1','pt_BR.ISO-8859-1','pt_BR');
 
 $languages['ro_RO']['NAME']    = 'Romanian';
 $languages['ro_RO']['ALTNAME'] = 'Rom&acirc;n&#259;';
 $languages['ro_RO']['CHARSET'] = 'iso-8859-2';
-$languages['ro_RO']['LOCALE']  = 'ro_RO.ISO8859-2';
+$languages['ro_RO']['LOCALE']  = array('ro_RO.ISO8859-2','ro_RO.ISO-8859-2','ro_RO');
 $languages['ro']['ALIAS'] = 'ro_RO';
 
 $languages['ru_RU']['NAME']    = 'Russian';
@@ -1011,25 +1114,25 @@ $languages['ru']['ALIAS'] = 'ru_RU';
 
 $languages['sk_SK']['NAME']    = 'Slovak';
 $languages['sk_SK']['CHARSET'] = 'iso-8859-2';
-$languages['sk_SK']['LOCALE']  = 'sk_SK.ISO8859-2';
+$languages['sk_SK']['LOCALE']  = array('sk_SK.ISO8859-2','sk_SK.ISO-8859-2','sk_SK');
 $languages['sk']['ALIAS'] = 'sk_SK';
 
 $languages['sl_SI']['NAME']    = 'Slovenian';
 $languages['sl_SI']['ALTNAME'] = 'Sloven&scaron;&#269;ina';
 $languages['sl_SI']['CHARSET'] = 'iso-8859-2';
-$languages['sl_SI']['LOCALE']  = 'sl_SI.ISO8859-2';
+$languages['sl_SI']['LOCALE']  = array('sl_SI.ISO8859-2','sl_SI.ISO-8859-2','sl_SI');
 $languages['sl']['ALIAS'] = 'sl_SI';
 
 $languages['sr_YU']['NAME']    = 'Serbian';
 $languages['sr_YU']['ALTNAME'] = 'Srpski';
 $languages['sr_YU']['CHARSET'] = 'iso-8859-2';
-$languages['sr_YU']['LOCALE']  = 'sr_YU.ISO8859-2';
+$languages['sr_YU']['LOCALE']  = array('sr_YU.ISO8859-2','sr_YU.ISO-8859-2','sr_YU');
 $languages['sr']['ALIAS'] = 'sr_YU';
 
 $languages['sv_SE']['NAME']    = 'Swedish';
 $languages['sv_SE']['ALTNAME'] = 'Svenska';
 $languages['sv_SE']['CHARSET'] = 'iso-8859-1';
-$languages['sv_SE']['LOCALE']  = 'sv_SE.ISO8859-1';
+$languages['sv_SE']['LOCALE']  = array('sv_SE.ISO8859-1','sv_SE.ISO-8859-1','sv_SE');
 $languages['sv']['ALIAS'] = 'sv_SE';
 
 $languages['th_TH']['NAME']    = 'Thai';
@@ -1039,12 +1142,12 @@ $languages['th']['ALIAS'] = 'th_TH';
 
 $languages['tl_PH']['NAME']    = 'Tagalog';
 $languages['tl_PH']['CHARSET'] = 'iso-8859-1';
-$languages['tl_PH']['LOCALE']  = 'tl_PH.ISO8859-1';
+$languages['tl_PH']['LOCALE']  = array('tl_PH.ISO8859-1','tl_PH.ISO-8859-1','tl_PH');
 $languages['tl']['ALIAS'] = 'tl_PH';
 
 $languages['tr_TR']['NAME']    = 'Turkish';
 $languages['tr_TR']['CHARSET'] = 'iso-8859-9';
-$languages['tr_TR']['LOCALE']  = 'tr_TR.ISO8859-9';
+$languages['tr_TR']['LOCALE']  = array('tr_TR.ISO8859-9','tr_TR.ISO-8859-9','tr_TR');
 $languages['tr']['ALIAS'] = 'tr_TR';
 
 $languages['zh_TW']['NAME']    = 'Chinese Trad';