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 f1c1e101e3d4 created 11 years 4 months ago.
By "Nathan Adams ", Fixing issue with site login OTP

Archive Download this file

Branches

Tags

Page rendered in 2.25221s using 11 queries.