srchub-old

srchub-old Mercurial Source Tree


Root/pluf/src/Pluf/L10n.php

<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of Plume Framework, a simple PHP Application Framework.
# Copyright (C) 2001-2007 Loic d'Anterroches and contributors.
#
# Plume Framework is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Plume Framework is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
# ***** END LICENSE BLOCK ***** */

/**
 * Localization class.
 *
 * The localization of the code is performed using the __() function call.
 * This function is directly available in the Pluf.php file.
 *
 * The Pluf_L10n class is used to load the localization strings in memory
 * in the $GLOBALS['_PX_locale'] array. All the strings are stored in utf-8
 * as all the applications created with the Plume Framework must use the utf-8
 * encoding.
 * The Pluf locale files are in the Pluf/locale/ folder.
 *
 * The locale files can be optimized and an optimized version of the files
 * stored in the Pluf temp folder. The temp folder is defined in the global
 * configuration as 'tmp_folder'. 
 *
 * 2 letter ISO codes from http://www.oasis-open.org/cover/iso639a.html
 */
class Pluf_L10n
{
    /**
     * Folder in which the locale file are available.
     */
    public $locale_folder = '';

    /** 
     * Constructor.
     *
     * See loadDomain(). If no folder is provided, the default Pluf/locale
     * folder is used to load the locales from.
     *
     * @param string Locale folder without trailing slash ('')
     * @param string Language ('en')
     * @param string Domain ('pluf')
     */
    function __construct($folder='', $lang='en', $domain='pluf')
    {
        if ('' == $folder) {
            $this->locale_folder = dirname(__FILE__).'/locale';
        }
        $this->loadDomain($lang, $domain);
    }
    
    /**
     * Load a domain file.
     * A domain file is a .lang file in the main locale folder of plume.
     *
     * @param string Language ('en')
     * @param string Domain, without the .lang ('pluf')
     * @return bool Success
     */
    function loadDomain($lang='en', $domain='pluf')
    {
        if ('en' == $lang) {
            return true;
        }
        return $this->loadFile($this->locale_folder.$lang.'/'.$domain.'.lang');
    }

    /**
     * Load a locale file
     *
     * @param string Complete path to the locale file
     * @return bool Success
     */
    function loadFile($file)
    {
        if (!empty($GLOBALS['_PX_locale_files'][$file])) {
            return true;
        }
        if (!file_exists($file)) {
            return false;
        }
        if (!isset($GLOBALS['_PX_locale'])) {
            $GLOBALS['_PX_locale'] = array();
        }
        // Load optimized file if available
        if ('' != Pluf::f('tmp_folder')) {
            $phpfile = Pluf::f('tmp_folder').'/Pluf_L10n-'
                .str_replace(DIRECTORY_SEPARATOR, '_', substr($file, 0, -5))
                .'.php';
            if (file_exists($phpfile) 
                && (@filemtime($file) < @filemtime($phpfile))) {
                $l = include $phpfile;
                $GLOBALS['_PX_locale'] = array_merge($GLOBALS['_PX_locale'], $l);
                $GLOBALS['_PX_locale_files'][$file] = 'optimized';
                return true;
            }
        }
        $lines = file($file);
        $count = count($lines);
        for ($i=1; $i<$count; $i++) {
            $tmp = (!empty($lines[$i+1])) ? trim($lines[$i+1]) : '';
            if (!empty($tmp) && ';' == substr($lines[$i],0,1)) {
                $GLOBALS['_PX_locale'][trim(substr($lines[$i],1))] = $tmp;
                $i++;
            }
        }
        $GLOBALS['_PX_locale_files'][$file] = true;
        return true;
    }
    
    /**
     * Optimize a locale. Convert the .lang in a .php file 
     * ready to be included. The optimized file is encoded 
     * with the current encoding.
     *
     * @param string Locale file to optimize
     * @return bool Success
     */
    function optimizeLocale($file)
    {
        if (!file_exists($file)) {
            return false;
        }
        $phpfile = Pluf::f('tmp_folder').'/Pluf_L10n-'
            .str_replace(DIRECTORY_SEPARATOR, '_', substr($file, 0, -5))
            .'.php';
        $lines = file($file);
        $out = '<?php '."\n".'/* automatically generated file from: '
            .$file.'  */'."\n\n";
        $out .= '$l = array();'."\n";
        $count = count($lines);
        for ($i=1; $i<$count; $i++) {
            $tmp = (!empty($lines[$i+1])) ? trim($lines[$i+1]) : '';
            if (!empty($tmp) && ';' == substr($lines[$i],0,1)) {
                $string = '$l[\''
                    .str_replace("'", "\\'", trim(substr($lines[$i],1)))
                    .'\'] = \''.str_replace("'", "\\'", $tmp).'\';'."\n";
                $out .= $string;
                $i++;
            }
        }
        $out .= 'return $l;'."\n\n".'?>';
        file_put_contents($phpfile, $out, LOCK_EX);
        @chmod($phpfile, 0777);
        return true;
    }

    /**
     * Get the available locales for a domain.
     *
     * @param string Domain ('')
     * @return array List of 2 letter iso codes
     */
    function getAvailableLocales($domain='')
    {
        $rootdir = $this->locale_folder.'/';
        $locales = array();
        $locales[] = 'en'; //English is always available
        $current_dir = opendir($rootdir);
        if (!empty($domain)) {
            $domain .= '.lang';
        }
        while($entryname = readdir($current_dir)) {
            if (is_dir($rootdir.$entryname.'/') 
                and ($entryname != '.' and $entryname!='..') 
                and (2 == strlen($entryname))
                ) {
                $entryname = strtolower($entryname);
                if (empty($domain)) {
                    $locales[] = $entryname;
                } elseif (is_file($rootdir.$entryname.'/'.$domain)) {
                    $locales[] = $entryname;
                }
            }
        }
        closedir($current_dir);
        sort($locales);
        reset($locales);
        return $locales;
    }

    /**
     * Return the "best" accepted language from the list of available 
     * languages.
     *
     * Use $_SERVER['HTTP_ACCEPT_LANGUAGE'] if the accepted language is empty
     *
     * @param array Available languages in the system
     * @param string String of comma separated accepted languages ('')
     * @return string Language 2 letter iso code, default is 'en'
     */
    function getAcceptedLanguage($available, $accepted ='')
    {
        if (empty($accepted)) {
            if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
                $accepted = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
            } else {
                return 'en';
            }
        }
        $acceptedlist = explode(',', $accepted);
        foreach ($acceptedlist as $lang) {
            //for the fr-FR en-US cases
            $lang = strtolower(substr($lang, 0, 2)); 
            if (in_array($lang, $available)) {
                return $lang;
            }
        }
        //no match found, English
        return 'en';
    }

    /**
     * Returns iso codes.
     *
     * @param bool Is the language the key in the array (false)
     * @return array The key is either the language or the iso code
     */
    function getIsoCodes($lang=false)
    {
        $res = array('aa' => 'Afar',
                     'ab' => 'Abkhazian',
                     'af' => 'Afrikaans',
                     'am' => 'Amharic',
                     'ar' => 'Arabic',
                     'as' => 'Assamese',
                     'ay' => 'Aymara',
                     'az' => 'Azerbaijani',
                     'ba' => 'Bashkir',
                     'be' => 'Byelorussian',
                     'bg' => 'Bulgarian',
                     'bh' => 'Bihari',
                     'bi' => 'Bislama',
                     'bn' => 'Bengali',
                     'bo' => 'Tibetan',
                     'br' => 'Breton',
                     'ca' => 'Catalan',
                     'co' => 'Corsican',
                     'cs' => 'Czech',
                     'cy' => 'Welsh',
                     'da' => 'Danish',
                     'de' => 'German',
                     'dz' => 'Bhutani',
                     'el' => 'Greek',
                     'en' => 'English',
                     'eo' => 'Esperanto',
                     'es' => 'Spanish',
                     'et' => 'Estonian',
                     'eu' => 'Basque',
                     'fa' => 'Persian',
                     'fi' => 'Finnish',
                     'fj' => 'Fiji',
                     'fo' => 'Faroese',
                     'fr' => 'French',
                     'fy' => 'Frisian',
                     'ga' => 'Irish',
                     'gd' => 'Scots gaelic',
                     'gl' => 'Galician',
                     'gn' => 'Guarani',
                     'gu' => 'Gujarati',
                     'ha' => 'Hausa',
                     'he' => 'Hebrew',
                     'hi' => 'Hindi',
                     'hr' => 'Croatian',
                     'hu' => 'Hungarian',
                     'hy' => 'Armenian',
                     'ia' => 'Interlingua',
                     'ie' => 'Interlingue',
                     'ik' => 'Inupiak',
                     'id' => 'Indonesian',
                     'is' => 'Icelandic',
                     'it' => 'Italian',
                     'iu' => 'Inuktitut',
                     'ja' => 'Japanese',
                     'jv' => 'Javanese',
                     'ka' => 'Georgian',
                     'kk' => 'Kazakh',
                     'kl' => 'Greenlandic',
                     'km' => 'Cambodian',
                     'kn' => 'Kannada',
                     'ko' => 'Korean',
                     'ks' => 'Kashmiri',
                     'ku' => 'Kurdish',
                     'ky' => 'Kirghiz',
                     'la' => 'Latin',
                     'ln' => 'Lingala',
                     'lo' => 'Laothian',
                     'lt' => 'Lithuanian',
                     'lv' => 'Latvian;lettish',
                     'mg' => 'Malagasy',
                     'mi' => 'Maori',
                     'mk' => 'Macedonian',
                     'ml' => 'Malayalam',
                     'mn' => 'Mongolian',
                     'mo' => 'Moldavian',
                     'mr' => 'Marathi',
                     'ms' => 'Malay',
                     'mt' => 'Maltese',
                     'my' => 'Burmese',
                     'na' => 'Nauru',
                     'ne' => 'Nepali',
                     'nl' => 'Dutch',
                     'no' => 'Norwegian',
                     'oc' => 'Occitan',
                     'om' => 'Afan (oromo)',
                     'or' => 'Oriya',
                     'pa' => 'Punjabi',
                     'pl' => 'Polish',
                     'ps' => 'Pashto;pushto',
                     'pt' => 'Portuguese',
                     'qu' => 'Quechua',
                     'rm' => 'Rhaeto-romance',
                     'rn' => 'Kurundi',
                     'ro' => 'Romanian',
                     'ru' => 'Russian',
                     'rw' => 'Kinyarwanda',
                     'sa' => 'Sanskrit',
                     'sd' => 'Sindhi',
                     'sg' => 'Sangho',
                     'sh' => 'Serbo-croatian',
                     'si' => 'Singhalese',
                     'sk' => 'Slovak',
                     'sl' => 'Slovenian',
                     'sm' => 'Samoan',
                     'sn' => 'Shona',
                     'so' => 'Somali',
                     'sq' => 'Albanian',
                     'sr' => 'Serbian',
                     'ss' => 'Siswati',
                     'st' => 'Sesotho',
                     'su' => 'Sundanese',
                     'sv' => 'Swedish',
                     'sw' => 'Swahili',
                     'ta' => 'Tamil',
                     'te' => 'Telugu',
                     'tg' => 'Tajik',
                     'th' => 'Thai',
                     'ti' => 'Tigrinya',
                     'tk' => 'Turkmen',
                     'tl' => 'Tagalog',
                     'tn' => 'Setswana',
                     'to' => 'Tonga',
                     'tr' => 'Turkish',
                     'ts' => 'Tsonga',
                     'tt' => 'Tatar',
                     'tw' => 'Twi',
                     'ug' => 'Uigur',
                     'uk' => 'Ukrainian',
                     'ur' => 'Urdu',
                     'uz' => 'Uzbek',
                     'vi' => 'Vietnamese',
                     'vo' => 'Volapuk',
                     'wo' => 'Wolof',
                     'xh' => 'Xhosa',
                     'yi' => 'Yiddish',
                     'yo' => 'Yoruba',
                     'za' => 'Zhuang',
                     'zh' => 'Chinese',
                     'zu' => 'Zulu');
        if ($lang) {
            $res = array_flip($res);
            ksort($res); //order by lang
        }
        return $res;
    }

    /**
     * Get the country codes.
     *
     * @param Indexed by code (false)
     * @return array English name indexed country code or reverse
     */
    public static function getCountryCodes($idx_by_code=false)
    {
        $ctr = array(
                     'Andorra' => 'AD',
                     'United Arab Emirates' => 'AE',
                     'Afghanistan' => 'AF',
                     'Antigua & Barbuda' => 'AG',
                     'Anguilla' => 'AI',
                     'Albania' => 'AL',
                     'Armenia' => 'AM',
                     'Netherlands Antilles' => 'AN',
                     'Angola' => 'AO',
                     'Antarctica' => 'AQ',
                     'Argentina' => 'AR',
                     'American Samoa' => 'AS',
                     'Austria' => 'AT',
                     'Australia' => 'AU',
                     'Aruba' => 'AW',
                     'Azerbaijan' => 'AZ',
                     'Bosnia and Herzegovina' => 'BA',
                     'Barbados' => 'BB',
                     'Bangladesh' => 'BD',
                     'Belgium' => 'BE',
                     'Burkina Faso' => 'BF',
                     'Bulgaria' => 'BG',
                     'Bahrain' => 'BH',
                     'Burundi' => 'BI',
                     'Benin' => 'BJ',
                     'Bermuda' => 'BM',
                     'Brunei Darussalam' => 'BN',
                     'Bolivia' => 'BO',
                     'Brazil' => 'BR',
                     'Bahama' => 'BS',
                     'Bhutan' => 'BT',
                     'Bouvet Island' => 'BV',
                     'Botswana' => 'BW',
                     'Belarus' => 'BY',
                     'Belize' => 'BZ',
                     'Canada' => 'CA',
                     'Cocos (Keeling) Islands' => 'CC',
                     'Central African Republic' => 'CF',
                     'Congo' => 'CG',
                     'Switzerland' => 'CH',
                     'Côte D\'ivoire (Ivory Coast)' => 'CI',
                     'Cook Iislands' => 'CK',
                     'Chile' => 'CL',
                     'Cameroon' => 'CM',
                     'China' => 'CN',
                     'Colombia' => 'CO',
                     'Costa Rica' => 'CR',
                     'Cuba' => 'CU',
                     'Cape Verde' => 'CV',
                     'Christmas Island' => 'CX',
                     'Cyprus' => 'CY',
                     'Czech Republic' => 'CZ',
                     'Germany' => 'DE',
                     'Djibouti' => 'DJ',
                     'Denmark' => 'DK',
                     'Dominica' => 'DM',
                     'Dominican Republic' => 'DO',
                     'Algeria' => 'DZ',
                     'Ecuador' => 'EC',
                     'Estonia' => 'EE',
                     'Egypt' => 'EG',
                     'Western Sahara' => 'EH',
                     'Eritrea' => 'ER',
                     'Spain' => 'ES',
                     'Ethiopia' => 'ET',
                     'Finland' => 'FI',
                     'Fiji' => 'FJ',
                     'Falkland Islands (Malvinas)' => 'FK',
                     'Micronesia' => 'FM',
                     'Faroe Islands' => 'FO',
                     'France' => 'FR',
                     'France, Metropolitan' => 'FX',
                     'Gabon' => 'GA',
                     'United Kingdom (Great Britain)' => 'GB',
                     'Grenada' => 'GD',
                     'Georgia' => 'GE',
                     'French Guiana' => 'GF',
                     'Ghana' => 'GH',
                     'Gibraltar' => 'GI',
                     'Greenland' => 'GL',
                     'Gambia' => 'GM',
                     'Guinea' => 'GN',
                     'Guadeloupe' => 'GP',
                     'Equatorial Guinea' => 'GQ',
                     'Greece' => 'GR',
                     'South Georgia and the South Sandwich Islands' => 'GS',
                     'Guatemala' => 'GT',
                     'Guam' => 'GU',
                     'Guinea-Bissau' => 'GW',
                     'Guyana' => 'GY',
                     'Hong Kong' => 'HK',
                     'Heard & McDonald Islands' => 'HM',
                     'Honduras' => 'HN',
                     'Croatia' => 'HR',
                     'Haiti' => 'HT',
                     'Hungary' => 'HU',
                     'Indonesia' => 'ID',
                     'Ireland' => 'IE',
                     'Israel' => 'IL',
                     'India' => 'IN',
                     'British Indian Ocean Territory' => 'IO',
                     'Iraq' => 'IQ',
                     'Iran, Islamic Republic of' => 'IR',
                     'Iceland' => 'IS',
                     'Italy' => 'IT',
                     'Jamaica' => 'JM',
                     'Jordan' => 'JO',
                     'Japan' => 'JP',
                     'Kenya' => 'KE',
                     'Kyrgyzstan' => 'KG',
                     'Cambodia' => 'KH',
                     'Kiribati' => 'KI',
                     'Comoros' => 'KM',
                     'St. Kitts and Nevis' => 'KN',
                     'Korea, Democratic People\'s Republic of' => 'KP',
                     'Korea, Republic of' => 'KR',
                     'Kuwait' => 'KW',
                     'Cayman Islands' => 'KY',
                     'Kazakhstan' => 'KZ',
                     'Lao People\'s Democratic Republic' => 'LA',
                     'Lebanon' => 'LB',
                     'Saint Lucia' => 'LC',
                     'Liechtenstein' => 'LI',
                     'Sri Lanka' => 'LK',
                     'Liberia' => 'LR',
                     'Lesotho' => 'LS',
                     'Lithuania' => 'LT',
                     'Luxembourg' => 'LU',
                     'Latvia' => 'LV',
                     'Libyan Arab Jamahiriya' => 'LY',
                     'Morocco' => 'MA',
                     'Monaco' => 'MC',
                     'Moldova, Republic of' => 'MD',
                     'Montenegro' => 'ME',
                     'Madagascar' => 'MG',
                     'Marshall Islands' => 'MH',
                     'Macedonia, Republic of' => 'MK',
                     'Mali' => 'ML',
                     'Mongolia' => 'MN',
                     'Myanmar' => 'MM',
                     'Macau' => 'MO',
                     'Northern Mariana Islands' => 'MP',
                     'Martinique' => 'MQ',
                     'Mauritania' => 'MR',
                     'Monserrat' => 'MS',
                     'Malta' => 'MT',
                     'Mauritius' => 'MU',
                     'Maldives' => 'MV',
                     'Malawi' => 'MW',
                     'Mexico' => 'MX',
                     'Malaysia' => 'MY',
                     'Mozambique' => 'MZ',
                     'Namibia' => 'NA',
                     'New Caledonia' => 'NC',
                     'Niger' => 'NE',
                     'Norfolk Island' => 'NF',
                     'Nigeria' => 'NG',
                     'Nicaragua' => 'NI',
                     'Netherlands' => 'NL',
                     'Norway' => 'NO',
                     'Nepal' => 'NP',
                     'Nauru' => 'NR',
                     'Niue' => 'NU',
                     'New Zealand' => 'NZ',
                     'Oman' => 'OM',
                     'Panama' => 'PA',
                     'Peru' => 'PE',
                     'French Polynesia' => 'PF',
                     'Papua New Guinea' => 'PG',
                     'Philippines' => 'PH',
                     'Pakistan' => 'PK',
                     'Poland' => 'PL',
                     'St. Pierre & Miquelon' => 'PM',
                     'Pitcairn' => 'PN',
                     'Puerto Rico' => 'PR',
                     'Portugal' => 'PT',
                     'Palau' => 'PW',
                     'Paraguay' => 'PY',
                     'Qatar' => 'QA',
                     'Réunion' => 'RE',
                     'Romania' => 'RO',
                     'Serbia' => 'RS',
                     'Russian Federation' => 'RU',
                     'Rwanda' => 'RW',
                     'Saudi Arabia' => 'SA',
                     'Solomon Islands' => 'SB',
                     'Seychelles' => 'SC',
                     'Sudan' => 'SD',
                     'Sweden' => 'SE',
                     'Singapore' => 'SG',
                     'St. Helena' => 'SH',
                     'Slovenia' => 'SI',
                     'Svalbard & Jan Mayen Islands' => 'SJ',
                     'Slovakia' => 'SK',
                     'Sierra Leone' => 'SL',
                     'San Marino' => 'SM',
                     'Senegal' => 'SN',
                     'Somalia' => 'SO',
                     'Suriname' => 'SR',
                     'Sao Tome & Principe' => 'ST',
                     'El Salvador' => 'SV',
                     'Syrian Arab Republic' => 'SY',
                     'Swaziland' => 'SZ',
                     'Turks & Caicos Islands' => 'TC',
                     'Chad' => 'TD',
                     'French Southern Territories' => 'TF',
                     'Togo' => 'TG',
                     'Thailand' => 'TH',
                     'Tajikistan' => 'TJ',
                     'Tokelau' => 'TK',
                     'Turkmenistan' => 'TM',
                     'Tunisia' => 'TN',
                     'Tonga' => 'TO',
                     'East Timor' => 'TP',
                     'Turkey' => 'TR',
                     'Trinidad & Tobago' => 'TT',
                     'Tuvalu' => 'TV',
                     'Taiwan' => 'TW',
                     'Tanzania, United Republic of' => 'TZ',
                     'Ukraine' => 'UA',
                     'Uganda' => 'UG',
                     'United States Minor Outlying Islands' => 'UM',
                     'United States of America' => 'US',
                     'Uruguay' => 'UY',
                     'Uzbekistan' => 'UZ',
                     'Vatican City State (Holy See)' => 'VA',
                     'St. Vincent & the Grenadines' => 'VC',
                     'Venezuela' => 'VE',
                     'British Virgin Islands' => 'VG',
                     'United States Virgin Islands' => 'VI',
                     'Viet Nam' => 'VN',
                     'Vanuatu' => 'VU',
                     'Wallis & Futuna Islands' => 'WF',
                     'Samoa' => 'WS',
                     'Yemen' => 'YE',
                     'Mayotte' => 'YT',
                     'South Africa' => 'ZA',
                     'Zambia' => 'ZM',
                     'Zaire' => 'ZR',
                     'Zimbabwe' => 'ZW',
                     'Unknown or unspecified country' => 'ZZ'
                     );
        if ($idx_by_code) {
            $ctr = array_flip($ctr);
        }
        ksort($ctr);
        return $ctr;
    }

    /**
     * Returns iso codes.
     *
     * @param bool Is the language the key in the array (false)
     * @return array The key is either the language or the iso code
     */
    public static function getNativeLanguages($lang=false)
    {
        $res = array(
                     'ab' => 'Аҧсуа',
                     'aa' => 'Afaraf',
                     'af' => 'Afrikaans',
                     'ak' => 'Akan',
                     'am' => 'አማርኛ',
                     'ar' => 'العربية',
                     'an' => 'Aragonés',
                     'as' => 'অসমীয়া',
                     'av' => 'авар мацӀ',
                     'ae' => 'avesta',
                     'ay' => 'aymar aru',
                     'az' => 'Azərbaycanca',
                     'bm' => 'bamanankan',
                     'ba' => 'башҡорт теле',
                     'be' => 'Беларуская мова',
                     'bn' => 'বাংলা',
                     'bh' => 'Bihari',
                     'bi' => 'Bislama',
                     'bs' => 'bosanski jezik',
                     'br' => 'brezhoneg',
                     'bg' => 'български език',
                     'ca' => 'català',
                     'ch' => 'Chamoru',
                     'ce' => 'нохчийн мотт',
                     'ny' => 'chiCheŵa',
                     'cu' => 'чӑваш чӗлхи',
                     'kw' => 'Kernewek',
                     'co' => 'corsu',
                     'cr' => 'ᓀᐦᐃᔭᐍᐏᐣ',
                     'hr' => 'hrvatski jezik',
                     'cs' => 'čeština',
                     'da' => 'dansk',
                     'dv' => 'ދިވެހިބަސ',
                     'dz' => 'རྫོང་ཁ',
                     'en' => 'English',
                     'eo' => 'Esperanto',
                     'et' => 'eesti keel',
                     'ee' => 'Ɛʋɛgbɛ',
                     'fo' => 'føroyskt',
                     'fj' => 'vosa Vakaviti',
                     'fi' => 'suomi',
                     'fr' => 'français',
                     'fy' => 'frysk',
                     'ff' => 'Fulfulde, Pulaar, Pular',
                     'gl' => 'Galego',
                     'lg' => 'Luganda',
                     'ka' => 'ქართული ენა',
                     'de' => 'Deutsch',
                     'el' => 'Ελληνικά',
                     'kl' => 'kalaallisut',
                     'gn' => 'Avañe\'ẽ',
                     'gu' => 'ગુજરાતી',
                     'ht' => 'Kreyòl ayisyen',
                     'ha' => 'Hausancī',
                     'he' => 'עִבְרִית',
                     'hz' => 'Otjiherero',
                     'hi' => 'हिन्दी',
                     'ho' => 'Hiri Motu',
                     'hu' => 'magyar',
                     'is' => 'íslenska',
                     'io' => 'Ido',
                     'ig' => 'Igbo',
                     'id' => 'Bahasa Indonesia',
                     'ia' => 'interlingua',
                     'ie' => 'Interlingue',
                     'iu' => 'ᐃᓄᒃᑎᑐᑦ',
                     'ik' => 'Iñupiaq',
                     'ga' => 'Gaeilge',
                     'it' => 'italiano',
                     'ja' => '日本語 (にほんご)',
                     'jv' => 'basa Jawa',
                     'kn' => 'ಕನ್ನಡ',
                     'kr' => 'कॉशुर',
                     'kk' => 'Қазақ тілі',
                     'km' => 'Central Khmer',
                     'ki' => 'Gĩkũyũ',
                     'rw' => 'kinyaRwanda',
                     'ky' => 'кыргыз тили',
                     'kv' => 'коми кыв',
                     'kg' => 'Kikongo',
                     'ko' => '한국어 (韓國語)',
                     'kj' => 'Kurdish',
                     'lo' => 'ພາສາລາວ',
                     'la' => 'latine',
                     'lv' => 'latviešu valoda',
                     'li' => 'Limburgs',
                     'ln' => 'lingala',
                     'lt' => 'lietuvių kalba',
                     'lu' => 'Luxembourgish',
                     'mg' => 'Malagasy fiteny',
                     'ms' => 'bahasa Melayu',
                     'ml' => 'മലയാളം',
                     'mt' => 'Malti',
                     'gv' => 'Gaelg',
                     'mi' => 'te reo Māori',
                     'mr' => 'मराठी',
                     'mh' => 'Kajin M̧ajeļ',
                     'mn' => 'монгол хэл',
                     'na' => 'Ekakairũ Naoero',
                     'nv' => 'Diné bizaad',
                     'nd' => 'isiNdebele',
                     'nr' => 'isiNdebele',
                     'ng' => 'Owambo',
                     'ne' => 'नेपाली',
                     'se' => 'sámi',
                     'no' => 'Norsk',
                     'nb' => 'Norsk bokmål',
                     'nn' => 'Norsk nynorsk',
                     'oc' => 'Occitan',
                     'oj' => 'ᐊᓂᔑᓇᐯᒧᐏᐣ (Anishinaabemowin)',
                     'or' => 'ଓଡ଼ିଆ',
                     'om' => 'Afaan Oromoo',
                     'os' => 'ирон ӕвзаг',
                     'pi' => 'पालि',
                     'fa' => 'فارسی',
                     'pl' => 'polski',
                     'pt' => 'português',
                     'pa' => 'ਪੰਜਾਬੀ',
                     'ps' => 'پښتو',
                     'qu' => 'Runa Simi',
                     'rm' => 'rumantsch grischun',
                     'rn' => 'kiRundi',
                     'ru' => 'русский язык',
                     'sm' => 'gagana fa\'a Samoa',
                     'sg' => 'yângâ tî sängö',
                     'sa' => 'संस्कृतम्',
                     'sc' => 'sardu',
                     'gd' => 'Gàidhlig',
                     'sr' => 'српски језик',
                     'sn' => 'chiShona',
                     'ii' => 'ꆇꉙ',
                     'sd' => 'سنڌي، سندھی',
                     'si' => 'සිංහල',
                     'sk' => 'slovenčina',
                     'sl' => 'slovenščina',
                     'so' => 'Soomaaliga',
                     'st' => 'Sesotho',
                     'es' => 'español',
                     'su' => 'basa Sunda',
                     'sw' => 'kiswahili',
                     'ss' => 'siSwati',
                     'sv' => 'Svenska',
                     'tl' => 'Tagalog',
                     'ty' => 'te reo Tahiti',
                     'tg' => 'тоҷикӣ',
                     'ta' => 'தமிழ்',
                     'tt' => 'татарча',
                     'te' => 'తెలుగు',
                     'th' => 'ภาษาไทย',
                     'bo' => 'བོད་ཡིག',
                     'ti' => 'ትግርኛ',
                     'to' => 'faka-Tonga',
                     'ts' => 'Xitsonga',
                     'tn' => 'Setswana',
                     'tr' => 'Türkçe',
                     'tk' => 'Түркмен',
                     'tw' => 'Twi',
                     'ug' => 'Uyƣurqə',
                     'uk' => 'українська мова',
                     'ur' => 'اردو',
                     'uz' => 'O\'zbek',
                     've' => 'Tshivenḓa',
                     'vi' => 'Tiếng Việt',
                     'vo' => 'Volapük',
                     'wa' => 'walon',
                     'cy' => 'Cymraeg',
                     'wo' => 'Wolof',
                     'xh' => 'isiXhosa',
                     'yi' => 'ייִדיש',
                     'yo' => 'Yorùbá',
                     'za' => 'Saɯ cueŋƅ',
                     'zu' => 'isiZulu',
                     );
        if ($lang) {
            $res = array_flip($res);
            ksort($res); //order by lang
        }
        return $res;
    }

    public static function getInstalledLanguages()
    {
        $l = array();
        $nl = self::getNativeLanguages();
        foreach (Pluf::f('languages', array('en')) as $lang) {
            $lang2 = substr($lang, 0, 2);
            $l[mb_convert_case($nl[$lang2], MB_CASE_TITLE, 'UTF-8')] = $lang;
        }
        return $l;
    }
}
Source at commit 55305a934bac created 10 years 4 months ago.
By Nathan Adams, Fixing bug where password would not be hashed in database if user updated password

Archive Download this file

Branches

Tags

Page rendered in 1.83359s using 11 queries.