<?php

/* --------------------------------------------------------------------

  Chevereto
  https://chevereto.com/

  @author	Rodolfo Berrios A. <http://rodolfoberrios.com/>
            <inbox@rodolfoberrios.com>

  Copyright (C) Rodolfo Berrios A. All rights reserved.

  BY USING THIS SOFTWARE YOU DECLARE TO ACCEPT THE CHEVERETO EULA
  https://chevereto.com/license

  --------------------------------------------------------------------- */

namespace CHV;

use G;
use Exception;
use DirectoryIterator;
use G\GettextException;
use RegexIterator;
use Throwable;

class L10n
{
    protected static $instance;
    protected static $processed;
    const CHV_DEFAULT_LANGUAGE_EXTENSION = 'po';
    const CHV_BASE_LANGUAGE = 'en';

    public static $gettext;
    public static $translation_table;
    public static $available_languages;
    public static $enabled_languages;
    public static $disabled_languages;
    public static $locale = self::CHV_BASE_LANGUAGE;
    public static $forced_locale = false;

    public static function bindEnabled()
    {
        // Stock the available languages
        self::$available_languages = [];
        $directory = new DirectoryIterator(CHV_APP_PATH_CONTENT_LANGUAGES);
        $regex  = new RegexIterator($directory, '/^.+\.' . self::CHV_DEFAULT_LANGUAGE_EXTENSION . '$/i', RegexIterator::GET_MATCH);
        $locales = self::getLocales();
        foreach ($regex as $file) {
            $file = $file[0];
            $locale_code = basename($file, '.' . self::CHV_DEFAULT_LANGUAGE_EXTENSION);
            self::$available_languages[$locale_code] = $locales[$locale_code];
        }

        // Remove any missing lang array
        self::$available_languages = array_filter(self::$available_languages);

        // Handle the enabled/disabled languages
        self::$enabled_languages = self::$available_languages;
        self::$disabled_languages = [];
        foreach (getSetting('languages_disable') as $k) {
            self::$disabled_languages[$k] = $locales[$k];
            unset(self::$enabled_languages[$k]);
        }
    }

    public function __construct()
    {
        if (self::$available_languages == false) {
            self::bindEnabled();
        }

        if (!self::$forced_locale) {

            if (array_key_exists(getSetting('default_language'), self::$available_languages)) {
                $locale = getSetting('default_language'); // Default from DB value
            } else {
                $locale = self::$locale; // Default from class static
            }

            // Auto-language?
            if (getSetting('auto_language') and !Login::isLoggedUser()) {
                foreach (G\get_client_languages() as $k => $v) {
                    $user_locale = str_replace('_', '-', $k);
                    if (array_key_exists($user_locale, self::$available_languages) and !array_key_exists($user_locale, self::$disabled_languages)) {
                        $locale = $user_locale;
                        break;
                    } else {
                        // try to use a base language
                        foreach (self::$available_languages as $k => $v) {
                            if ($v['base'] == substr($user_locale, 0, 2)) {
                                $locale = $k;
                                break;
                            }
                        }
                    }
                    if ($locale) {
                        break;
                    }
                };
            }

            // Override with the user selected lang
            if (Login::isLoggedUser() || isset($_COOKIE['USER_SELECTED_LANG'])) {
                $user_lang = Login::getUser() ? Login::getUser()['language'] : $_COOKIE['USER_SELECTED_LANG'];
                if (array_key_exists($user_lang, self::$available_languages) and !array_key_exists($user_lang, self::$disabled_languages)) {
                    $locale = $user_lang;
                }
            }
        } else {
            $locale = self::$forced_locale;
        }

        if (!defined('CHV_LANGUAGE_CODE')) {
            // Set some language definitions
            define('CHV_LANGUAGE_CODE', $locale);
        }
        if (!defined('CHV_LANGUAGE_FILE')) {
            define('CHV_LANGUAGE_FILE', CHV_APP_PATH_CONTENT_LANGUAGES . $locale . '.' . self::CHV_DEFAULT_LANGUAGE_EXTENSION);
        }
        self::processTranslation($locale);
    }

    public static function hasInstance()
    {
        return isset(self::$instance);
    }

    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public static function setLocale($locale)
    {
        if (is_null(self::$instance)) {
            self::$forced_locale = $locale;
        } else {
            self::processTranslation($locale);
        }
    }

    public static function processTranslation($locale)
    {
        if (is_null($locale)) {
            $locale = self::$locale;
        }
        if ($locale == self::$locale and isset(self::$translation_table)) {
            return;
        }
        if (!array_key_exists($locale, self::$available_languages)) {
            if (array_key_exists(self::$locale, self::$available_languages)) {
                $locale = self::$available_languages;
            } else {
                $array = self::$available_languages;
                reset($array);
                $first_key = key($array);
                $locale = $first_key;
            }
        }
        $filename = $locale . '.' . self::CHV_DEFAULT_LANGUAGE_EXTENSION;
        $language_file = CHV_APP_PATH_CONTENT_LANGUAGES . $filename;
        $language_override_file = dirname($language_file) . '/overrides/' . $filename;
        self::$locale = $locale;
        $language_handling = [
            'base' => [
                'file'      => $language_file,
                'cache_path'  => dirname($language_file) . '/cache/',
                'table'      => [],
            ],
            'override' => [
                'file'      => $language_override_file,
                'cache_path'  => dirname($language_file) . '/cache/overrides/',
                'table'     => [],
            ]
        ];
        foreach ($language_handling as $k => $v) {
            $cache_path = $v['cache_path'];
            $cache_file = basename($v['file']) . '.cache.php';
            if (!file_exists($v['file'])) {
                continue;
            }
            if (!file_exists($cache_path)) {
                try {
                    mkdir($cache_path);
                } catch (Throwable $e) {
                    $cache_path = dirname($cache_path);
                }
            }
            self::$gettext = new G\Gettext([
                'file'         => $v['file'],
                'cache_filepath'  => $cache_path . $cache_file,
                'cache_header'    => $k == 'base',
            ]);
            if ($k == 'base') {
                $translation_plural = self::$gettext->translation_plural;
                $translation_header = self::$gettext->translation_header;
            }
            $language_handling[$k]['table'] = self::$gettext->translation_table;
        }
        self::$gettext->translation_plural = $translation_plural;
        self::$gettext->translation_header = $translation_header;
        self::$gettext->translation_table = array_merge($language_handling['base']['table'], $language_handling['override']['table']);
        self::$translation_table = self::$gettext->translation_table;
    }

    // gettext wrapper
    public static function gettext($msg)
    {
        $translation = self::getGettext()->gettext($msg);
        return $translation;
    }

    // ngettext wrapper
    public static function ngettext($msg, $msg_plural, $count)
    {
        $translation = self::getGettext()->ngettext($msg, $msg_plural, $count);
        return $translation;
    }

    public static function setStatic($var, $value)
    {
        $instance = self::getInstance();
        $instance::${$var} = $value;
    }

    public static function getStatic($var)
    {
        $instance = self::getInstance();
        return $instance::${$var};
    }
    public static function getAvailableLanguages()
    {
        return self::getStatic('available_languages');
    }
    public static function getEnabledLanguages()
    {
        if (is_null(self::$instance)) {
            self::bindEnabled();
        }
        return self::$enabled_languages;
    }
    public static function getDisabledLanguages()
    {
        return self::getStatic('disabled_languages');
    }
    public static function getGettext()
    {
        return self::getStatic('gettext');
    }
    public static function getTranslation()
    {
        return self::getStatic('translation_table');
    }
    public static function getLocale()
    {
        return self::getStatic('locale');
    }

    public static function setCookieLang($lang)
    {
        $args = [
      'USER_SELECTED_LANG',
      $lang,
      time() + (60 * 60 * 24 * 30),
      G_ROOT_PATH_RELATIVE,
      G\get_host_domain(),
      G_HTTP_PROTOCOL == 'https', // secure,
      true, // httpOnly
    ];
        if (setcookie(...$args)) {
            $_COOKIE['USER_SELECTED_LANG'] = $lang; // so hot
        }
    }

    // Locales table
    public static function getLocales()
    {
        return [
      'af' => [
        'code' => 'af',
        'dir' => 'ltr',
        'name' => 'Afrikaans',
        'base' => 'af',
        'short_name' => 'AF',
      ],
      'af-AF' => [
        'code' => 'af-AF',
        'dir' => 'ltr',
        'name' => 'Afrikaans',
        'base' => 'af',
        'short_name' => 'AF (AF)',
      ],
      'am' => [
        'code' => 'am',
        'dir' => 'ltr',
        'name' => 'āmariññā',
        'base' => 'am',
        'short_name' => 'AM',
      ],
      'am-AM' => [
        'code' => 'am-AM',
        'dir' => 'ltr',
        'name' => 'āmariññā',
        'base' => 'am',
        'short_name' => 'AM (AM)',
      ],
      'an' => [
        'code' => 'an',
        'dir' => 'ltr',
        'name' => 'Aragonés',
        'base' => 'an',
        'short_name' => 'AN',
      ],
      'an-AN' => [
        'code' => 'an-AN',
        'dir' => 'ltr',
        'name' => 'Aragonés',
        'base' => 'an',
        'short_name' => 'AN (AN)',
      ],
      'ar' => [
        'code' => 'ar',
        'dir' => 'rtl',
        'name' => 'العربية',
        'base' => 'ar',
        'short_name' => 'AR',
      ],
      'ar-AE' => [
        'code' => 'ar-AE',
        'dir' => 'rtl',
        'name' => 'العربية (الإمارات)',
        'base' => 'ar',
        'short_name' => 'AR (AE)',
      ],
      'ar-BH' => [
        'code' => 'ar-BH',
        'dir' => 'rtl',
        'name' => 'العربية (البحرين)',
        'base' => 'ar',
        'short_name' => 'AR (BH)',
      ],
      'ar-DZ' => [
        'code' => 'ar-DZ',
        'dir' => 'rtl',
        'name' => 'العربية (الجزائر)',
        'base' => 'ar',
        'short_name' => 'AR (DZ)',
      ],
      'ar-EG' => [
        'code' => 'ar-EG',
        'dir' => 'rtl',
        'name' => 'العربية (مصر)',
        'base' => 'ar',
        'short_name' => 'AR (EG)',
      ],
      'ar-IQ' => [
        'code' => 'ar-IQ',
        'dir' => 'rtl',
        'name' => 'العربية (العراق)',
        'base' => 'ar',
        'short_name' => 'AR (IQ)',
      ],
      'ar-JO' => [
        'code' => 'ar-JO',
        'dir' => 'rtl',
        'name' => 'العربية (الأردن)',
        'base' => 'ar',
        'short_name' => 'AR (JO)',
      ],
      'ar-KW' => [
        'code' => 'ar-KW',
        'dir' => 'rtl',
        'name' => 'العربية (الكويت)',
        'base' => 'ar',
        'short_name' => 'AR (KW)',
      ],
      'ar-LB' => [
        'code' => 'ar-LB',
        'dir' => 'rtl',
        'name' => 'العربية (لبنان)',
        'base' => 'ar',
        'short_name' => 'AR (LB)',
      ],
      'ar-LY' => [
        'code' => 'ar-LY',
        'dir' => 'rtl',
        'name' => 'العربية (ليبيا)',
        'base' => 'ar',
        'short_name' => 'AR (LY)',
      ],
      'ar-MA' => [
        'code' => 'ar-MA',
        'dir' => 'rtl',
        'name' => 'العربية (المغرب)',
        'base' => 'ar',
        'short_name' => 'AR (MA)',
      ],
      'ar-OM' => [
        'code' => 'ar-OM',
        'dir' => 'rtl',
        'name' => 'العربية (سلطنة عمان)',
        'base' => 'ar',
        'short_name' => 'AR (OM)',
      ],
      'ar-QA' => [
        'code' => 'ar-QA',
        'dir' => 'rtl',
        'name' => 'العربية (قطر)',
        'base' => 'ar',
        'short_name' => 'AR (QA)',
      ],
      'ar-SA' => [
        'code' => 'ar-SA',
        'dir' => 'rtl',
        'name' => 'العربية (السعودية)',
        'base' => 'ar',
        'short_name' => 'AR (SA)',
      ],
      'ar-SD' => [
        'code' => 'ar-SD',
        'dir' => 'rtl',
        'name' => 'العربية (السودان)',
        'base' => 'ar',
        'short_name' => 'AR (SD)',
      ],
      'ar-SY' => [
        'code' => 'ar-SY',
        'dir' => 'rtl',
        'name' => 'العربية (سوريا)',
        'base' => 'ar',
        'short_name' => 'AR (SY)',
      ],
      'ar-TN' => [
        'code' => 'ar-TN',
        'dir' => 'rtl',
        'name' => 'العربية (تونس)',
        'base' => 'ar',
        'short_name' => 'AR (TN)',
      ],
      'ar-YE' => [
        'code' => 'ar-YE',
        'dir' => 'rtl',
        'name' => 'العربية (اليمن)',
        'base' => 'ar',
        'short_name' => 'AR (YE)',
      ],
      'as' => [
        'code' => 'as',
        'dir' => 'ltr',
        'name' => 'অসমীয়া',
        'base' => 'as',
        'short_name' => 'AS',
      ],
      'as-AS' => [
        'code' => 'as-AS',
        'dir' => 'ltr',
        'name' => 'অসমীয়া',
        'base' => 'as',
        'short_name' => 'AS (AS)',
      ],
      'ast' => [
        'code' => 'ast',
        'dir' => 'ltr',
        'name' => 'Asturianu',
        'base' => 'ast',
        'short_name' => 'AST',
      ],
      'ast-AST' => [
        'code' => 'ast-AST',
        'dir' => 'ltr',
        'name' => 'Asturianu',
        'base' => 'ast',
        'short_name' => 'AST (AST)',
      ],
      'az' => [
        'code' => 'az',
        'dir' => 'ltr',
        'name' => 'Azərbaycan',
        'base' => 'az',
        'short_name' => 'AZ',
      ],
      'az-AZ' => [
        'code' => 'az-AZ',
        'dir' => 'ltr',
        'name' => 'Azərbaycan',
        'base' => 'az',
        'short_name' => 'AZ (AZ)',
      ],
      'ba' => [
        'code' => 'ba',
        'dir' => 'ltr',
        'name' => 'Башҡорт',
        'base' => 'ba',
        'short_name' => 'BA',
      ],
      'ba-BA' => [
        'code' => 'ba-BA',
        'dir' => 'ltr',
        'name' => 'Башҡорт',
        'base' => 'ba',
        'short_name' => 'BA (BA)',
      ],
      'be' => [
        'code' => 'be',
        'dir' => 'ltr',
        'name' => 'Беларускі',
        'base' => 'be',
        'short_name' => 'BE',
      ],
      'be-BY' => [
        'code' => 'be-BY',
        'dir' => 'ltr',
        'name' => 'Беларускі',
        'base' => 'be',
        'short_name' => 'BE (BY)',
      ],
      'bg' => [
        'code' => 'bg',
        'dir' => 'ltr',
        'name' => 'Български',
        'base' => 'bg',
        'short_name' => 'BG',
      ],
      'bg-BG' => [
        'code' => 'bg-BG',
        'dir' => 'ltr',
        'name' => 'Български',
        'base' => 'bg',
        'short_name' => 'BG (BG)',
      ],
      'bn' => [
        'code' => 'bn',
        'dir' => 'ltr',
        'name' => 'Bangla',
        'base' => 'bn',
        'short_name' => 'BN',
      ],
      'bn-BN' => [
        'code' => 'bn-BN',
        'dir' => 'ltr',
        'name' => 'Bangla',
        'base' => 'bn',
        'short_name' => 'BN (BN)',
      ],
      'br' => [
        'code' => 'br',
        'dir' => 'ltr',
        'name' => 'Brezhoneg',
        'base' => 'br',
        'short_name' => 'BR',
      ],
      'br-BR' => [
        'code' => 'br-BR',
        'dir' => 'ltr',
        'name' => 'Brezhoneg',
        'base' => 'br',
        'short_name' => 'BR (BR)',
      ],
      'bs' => [
        'code' => 'bs',
        'dir' => 'ltr',
        'name' => 'Bosanski',
        'base' => 'bs',
        'short_name' => 'BS',
      ],
      'bs-BS' => [
        'code' => 'bs-BS',
        'dir' => 'ltr',
        'name' => 'Bosanski',
        'base' => 'bs',
        'short_name' => 'BS (BS)',
      ],
      'ca' => [
        'code' => 'ca',
        'dir' => 'ltr',
        'name' => 'Сatalà',
        'base' => 'ca',
        'short_name' => 'CA',
      ],
      'ca-ES' => [
        'code' => 'ca-ES',
        'dir' => 'ltr',
        'name' => 'Сatalà (Espanya)',
        'base' => 'ca',
        'short_name' => 'CA (ES)',
      ],
      'ce' => [
        'code' => 'ce',
        'dir' => 'ltr',
        'name' => 'Нохчийн',
        'base' => 'ce',
        'short_name' => 'CE',
      ],
      'ce-CE' => [
        'code' => 'ce-CE',
        'dir' => 'ltr',
        'name' => 'Нохчийн',
        'base' => 'ce',
        'short_name' => 'CE (CE)',
      ],
      'ch' => [
        'code' => 'ch',
        'dir' => 'ltr',
        'name' => 'Chamoru',
        'base' => 'ch',
        'short_name' => 'CH',
      ],
      'ch-CH' => [
        'code' => 'ch-CH',
        'dir' => 'ltr',
        'name' => 'Chamoru',
        'base' => 'ch',
        'short_name' => 'CH (CH)',
      ],
      'co' => [
        'code' => 'co',
        'dir' => 'ltr',
        'name' => 'Corsu',
        'base' => 'co',
        'short_name' => 'CO',
      ],
      'co-CO' => [
        'code' => 'co-CO',
        'dir' => 'ltr',
        'name' => 'Corsu',
        'base' => 'co',
        'short_name' => 'CO (CO)',
      ],
      'cr' => [
        'code' => 'cr',
        'dir' => 'ltr',
        'name' => 'Cree',
        'base' => 'cr',
        'short_name' => 'CR',
      ],
      'cr-CR' => [
        'code' => 'cr-CR',
        'dir' => 'ltr',
        'name' => 'Cree',
        'base' => 'cr',
        'short_name' => 'CR (CR)',
      ],
      'cs' => [
        'code' => 'cs',
        'dir' => 'ltr',
        'name' => 'Čeština',
        'base' => 'cs',
        'short_name' => 'CS',
      ],
      'cs-CZ' => [
        'code' => 'cs-CZ',
        'dir' => 'ltr',
        'name' => 'Čeština',
        'base' => 'cs',
        'short_name' => 'CS (CZ)',
      ],
      'cv' => [
        'code' => 'cv',
        'dir' => 'ltr',
        'name' => 'Чăвашла',
        'base' => 'cv',
        'short_name' => 'CV',
      ],
      'cv-CV' => [
        'code' => 'cv-CV',
        'dir' => 'ltr',
        'name' => 'Чăвашла',
        'base' => 'cv',
        'short_name' => 'CV (CV)',
      ],
      'cy' => [
        'code' => 'cy',
        'dir' => 'ltr',
        'name' => 'Cymraeg',
        'base' => 'cy',
        'short_name' => 'CY',
      ],
      'cy-CY' => [
        'code' => 'cy-CY',
        'dir' => 'ltr',
        'name' => 'Cymraeg',
        'base' => 'cy',
        'short_name' => 'CY (CY)',
      ],
      'da' => [
        'code' => 'da',
        'dir' => 'ltr',
        'name' => 'Dansk',
        'base' => 'da',
        'short_name' => 'DA',
      ],
      'da-DK' => [
        'code' => 'da-DK',
        'dir' => 'ltr',
        'name' => 'Dansk',
        'base' => 'da',
        'short_name' => 'DA (DK)',
      ],
      'de' => [
        'code' => 'de',
        'dir' => 'ltr',
        'name' => 'Deutsch',
        'base' => 'de',
        'short_name' => 'DE',
      ],
      'de-AT' => [
        'code' => 'de-AT',
        'dir' => 'ltr',
        'name' => 'Deutsch (Österreich)',
        'base' => 'de',
        'short_name' => 'DE (AT)',
      ],
      'de-CH' => [
        'code' => 'de-CH',
        'dir' => 'ltr',
        'name' => 'Deutsch (Schweiz)',
        'base' => 'de',
        'short_name' => 'DE (CH)',
      ],
      'de-DE' => [
        'code' => 'de-DE',
        'dir' => 'ltr',
        'name' => 'Deutsch (Deutschland)',
        'base' => 'de',
        'short_name' => 'DE (DE)',
      ],
      'de-LU' => [
        'code' => 'de-LU',
        'dir' => 'ltr',
        'name' => 'Deutsch (Luxemburg)',
        'base' => 'de',
        'short_name' => 'DE (LU)',
      ],
      'el' => [
        'code' => 'el',
        'dir' => 'ltr',
        'name' => 'Ελληνικά',
        'base' => 'el',
        'short_name' => 'EL',
      ],
      'el-CY' => [
        'code' => 'el-CY',
        'dir' => 'ltr',
        'name' => 'Ελληνικά (Κύπρος)',
        'base' => 'el',
        'short_name' => 'EL (CY)',
      ],
      'el-GR' => [
        'code' => 'el-GR',
        'dir' => 'ltr',
        'name' => 'Ελληνικά (Ελλάδα)',
        'base' => 'el',
        'short_name' => 'EL (GR)',
      ],
      'en' => [
        'code' => 'en',
        'dir' => 'ltr',
        'name' => 'English',
        'base' => 'en',
        'short_name' => 'EN',
      ],
      'en-AU' => [
        'code' => 'en-AU',
        'dir' => 'ltr',
        'name' => 'English (Australia)',
        'base' => 'en',
        'short_name' => 'EN (AU)',
      ],
      'en-CA' => [
        'code' => 'en-CA',
        'dir' => 'ltr',
        'name' => 'English (Canada)',
        'base' => 'en',
        'short_name' => 'EN (CA)',
      ],
      'en-GB' => [
        'code' => 'en-GB',
        'dir' => 'ltr',
        'name' => 'English (UK)',
        'base' => 'en',
        'short_name' => 'EN (GB)',
      ],
      'en-IE' => [
        'code' => 'en-IE',
        'dir' => 'ltr',
        'name' => 'English (Ireland)',
        'base' => 'en',
        'short_name' => 'EN (IE)',
      ],
      'en-IN' => [
        'code' => 'en-IN',
        'dir' => 'ltr',
        'name' => 'English (India)',
        'base' => 'en',
        'short_name' => 'EN (IN)',
      ],
      'en-MT' => [
        'code' => 'en-MT',
        'dir' => 'ltr',
        'name' => 'English (Malta)',
        'base' => 'en',
        'short_name' => 'EN (MT)',
      ],
      'en-NZ' => [
        'code' => 'en-NZ',
        'dir' => 'ltr',
        'name' => 'English (New Zealand)',
        'base' => 'en',
        'short_name' => 'EN (NZ)',
      ],
      'en-PH' => [
        'code' => 'en-PH',
        'dir' => 'ltr',
        'name' => 'English (Philippines)',
        'base' => 'en',
        'short_name' => 'EN (PH)',
      ],
      'en-SG' => [
        'code' => 'en-SG',
        'dir' => 'ltr',
        'name' => 'English (Singapore)',
        'base' => 'en',
        'short_name' => 'EN (SG)',
      ],
      'en-US' => [
        'code' => 'en-US',
        'dir' => 'ltr',
        'name' => 'English (US)',
        'base' => 'en',
        'short_name' => 'EN (US)',
      ],
      'en-ZA' => [
        'code' => 'en-ZA',
        'dir' => 'ltr',
        'name' => 'English (South Africa)',
        'base' => 'en',
        'short_name' => 'EN (ZA)',
      ],
      'eo' => [
        'code' => 'eo',
        'dir' => 'ltr',
        'name' => 'Esperanta',
        'base' => 'eo',
        'short_name' => 'EO',
      ],
      'eo-EO' => [
        'code' => 'eo-EO',
        'dir' => 'ltr',
        'name' => 'Esperanta',
        'base' => 'eo',
        'short_name' => 'EO (EO)',
      ],
      'es' => [
        'code' => 'es',
        'dir' => 'ltr',
        'name' => 'Español',
        'base' => 'es',
        'short_name' => 'ES',
      ],
      'es-AR' => [
        'code' => 'es-AR',
        'dir' => 'ltr',
        'name' => 'Español (Argentina)',
        'base' => 'es',
        'short_name' => 'ES (AR)',
      ],
      'es-BO' => [
        'code' => 'es-BO',
        'dir' => 'ltr',
        'name' => 'Español (Bolivia)',
        'base' => 'es',
        'short_name' => 'ES (BO)',
      ],
      'es-CL' => [
        'code' => 'es-CL',
        'dir' => 'ltr',
        'name' => 'Español (Chile)',
        'base' => 'es',
        'short_name' => 'ES (CL)',
      ],
      'es-CO' => [
        'code' => 'es-CO',
        'dir' => 'ltr',
        'name' => 'Español (Colombia)',
        'base' => 'es',
        'short_name' => 'ES (CO)',
      ],
      'es-CR' => [
        'code' => 'es-CR',
        'dir' => 'ltr',
        'name' => 'Español (Costa Rica)',
        'base' => 'es',
        'short_name' => 'ES (CR)',
      ],
      'es-DO' => [
        'code' => 'es-DO',
        'dir' => 'ltr',
        'name' => 'Español (República Dominicana)',
        'base' => 'es',
        'short_name' => 'ES (DO)',
      ],
      'es-EC' => [
        'code' => 'es-EC',
        'dir' => 'ltr',
        'name' => 'Español (Ecuador)',
        'base' => 'es',
        'short_name' => 'ES (EC)',
      ],
      'es-ES' => [
        'code' => 'es-ES',
        'dir' => 'ltr',
        'name' => 'Español (España)',
        'base' => 'es',
        'short_name' => 'ES (ES)',
      ],
      'es-GT' => [
        'code' => 'es-GT',
        'dir' => 'ltr',
        'name' => 'Español (Guatemala)',
        'base' => 'es',
        'short_name' => 'ES (GT)',
      ],
      'es-HN' => [
        'code' => 'es-HN',
        'dir' => 'ltr',
        'name' => 'Español (Honduras)',
        'base' => 'es',
        'short_name' => 'ES (HN)',
      ],
      'es-MX' => [
        'code' => 'es-MX',
        'dir' => 'ltr',
        'name' => 'Español (México)',
        'base' => 'es',
        'short_name' => 'ES (MX)',
      ],
      'es-NI' => [
        'code' => 'es-NI',
        'dir' => 'ltr',
        'name' => 'Español (Nicaragua)',
        'base' => 'es',
        'short_name' => 'ES (NI)',
      ],
      'es-PA' => [
        'code' => 'es-PA',
        'dir' => 'ltr',
        'name' => 'Español (Panamá)',
        'base' => 'es',
        'short_name' => 'ES (PA)',
      ],
      'es-PE' => [
        'code' => 'es-PE',
        'dir' => 'ltr',
        'name' => 'Español (Perú)',
        'base' => 'es',
        'short_name' => 'ES (PE)',
      ],
      'es-PR' => [
        'code' => 'es-PR',
        'dir' => 'ltr',
        'name' => 'Español (Puerto Rico)',
        'base' => 'es',
        'short_name' => 'ES (PR)',
      ],
      'es-PY' => [
        'code' => 'es-PY',
        'dir' => 'ltr',
        'name' => 'Español (Paraguay)',
        'base' => 'es',
        'short_name' => 'ES (PY)',
      ],
      'es-SV' => [
        'code' => 'es-SV',
        'dir' => 'ltr',
        'name' => 'Español (El Salvador)',
        'base' => 'es',
        'short_name' => 'ES (SV)',
      ],
      'es-US' => [
        'code' => 'es-US',
        'dir' => 'ltr',
        'name' => 'Español (Estados Unidos)',
        'base' => 'es',
        'short_name' => 'ES (US)',
      ],
      'es-UY' => [
        'code' => 'es-UY',
        'dir' => 'ltr',
        'name' => 'Español (Uruguay)',
        'base' => 'es',
        'short_name' => 'ES (UY)',
      ],
      'es-VE' => [
        'code' => 'es-VE',
        'dir' => 'ltr',
        'name' => 'Español (Venezuela)',
        'base' => 'es',
        'short_name' => 'ES (VE)',
      ],
      'et' => [
        'code' => 'et',
        'dir' => 'ltr',
        'name' => 'Eesti',
        'base' => 'et',
        'short_name' => 'ET',
      ],
      'et-EE' => [
        'code' => 'et-EE',
        'dir' => 'ltr',
        'name' => 'Eesti (Eesti)',
        'base' => 'et',
        'short_name' => 'ET (EE)',
      ],
      'eu' => [
        'code' => 'eu',
        'dir' => 'ltr',
        'name' => 'Euskera',
        'base' => 'eu',
        'short_name' => 'EU',
      ],
      'eu-EU' => [
        'code' => 'eu-EU',
        'dir' => 'ltr',
        'name' => 'Euskera',
        'base' => 'eu',
        'short_name' => 'EU (EU)',
      ],
      'fa' => [
        'code' => 'fa',
        'dir' => 'rtl',
        'name' => 'فارسی',
        'base' => 'fa',
        'short_name' => 'FA',
      ],
      'fa-FA' => [
        'code' => 'fa-FA',
        'dir' => 'rtl',
        'name' => 'فارسی',
        'base' => 'fa',
        'short_name' => 'FA (FA)',
      ],
      'fi' => [
        'code' => 'fi',
        'dir' => 'ltr',
        'name' => 'Suomi',
        'base' => 'fi',
        'short_name' => 'FI',
      ],
      'fi-FI' => [
        'code' => 'fi-FI',
        'dir' => 'ltr',
        'name' => 'Suomi',
        'base' => 'fi',
        'short_name' => 'FI (FI)',
      ],
      'fj' => [
        'code' => 'fj',
        'dir' => 'ltr',
        'name' => 'Na Vosa Vakaviti',
        'base' => 'fj',
        'short_name' => 'FJ',
      ],
      'fj-FJ' => [
        'code' => 'fj-FJ',
        'dir' => 'ltr',
        'name' => 'Na Vosa Vakaviti',
        'base' => 'fj',
        'short_name' => 'FJ (FJ)',
      ],
      'fo' => [
        'code' => 'fo',
        'dir' => 'ltr',
        'name' => 'Føroyskt',
        'base' => 'fo',
        'short_name' => 'FO',
      ],
      'fo-FO' => [
        'code' => 'fo-FO',
        'dir' => 'ltr',
        'name' => 'Føroyskt',
        'base' => 'fo',
        'short_name' => 'FO (FO)',
      ],
      'fr' => [
        'code' => 'fr',
        'dir' => 'ltr',
        'name' => 'Français',
        'base' => 'fr',
        'short_name' => 'FR',
      ],
      'fr-BE' => [
        'code' => 'fr-BE',
        'dir' => 'ltr',
        'name' => 'Français (Belgique)',
        'base' => 'fr',
        'short_name' => 'FR (BE)',
      ],
      'fr-CA' => [
        'code' => 'fr-CA',
        'dir' => 'ltr',
        'name' => 'Français (Canada)',
        'base' => 'fr',
        'short_name' => 'FR (CA)',
      ],
      'fr-CH' => [
        'code' => 'fr-CH',
        'dir' => 'ltr',
        'name' => 'Français (Suisse)',
        'base' => 'fr',
        'short_name' => 'FR (CH)',
      ],
      'fr-FR' => [
        'code' => 'fr-FR',
        'dir' => 'ltr',
        'name' => 'Français (France)',
        'base' => 'fr',
        'short_name' => 'FR (FR)',
      ],
      'fr-LU' => [
        'code' => 'fr-LU',
        'dir' => 'ltr',
        'name' => 'Français (Luxembourg)',
        'base' => 'fr',
        'short_name' => 'FR (LU)',
      ],
      'fy' => [
        'code' => 'fy',
        'dir' => 'ltr',
        'name' => 'Frysk',
        'base' => 'fy',
        'short_name' => 'FY',
      ],
      'fy-FY' => [
        'code' => 'fy-FY',
        'dir' => 'ltr',
        'name' => 'Frysk',
        'base' => 'fy',
        'short_name' => 'FY (FY)',
      ],
      'ga' => [
        'code' => 'ga',
        'dir' => 'ltr',
        'name' => 'Gaeilge',
        'base' => 'ga',
        'short_name' => 'GA',
      ],
      'ga-IE' => [
        'code' => 'ga-IE',
        'dir' => 'ltr',
        'name' => 'Gaeilge (Éire)',
        'base' => 'ga',
        'short_name' => 'GA (IE)',
      ],
      'gd' => [
        'code' => 'gd',
        'dir' => 'ltr',
        'name' => 'Gàidhlig',
        'base' => 'gd',
        'short_name' => 'GD',
      ],
      'gd-GD' => [
        'code' => 'gd-GD',
        'dir' => 'ltr',
        'name' => 'Gàidhlig',
        'base' => 'gd',
        'short_name' => 'GD (GD)',
      ],
      'gl' => [
        'code' => 'gl',
        'dir' => 'ltr',
        'name' => 'Galego',
        'base' => 'gl',
        'short_name' => 'GL',
      ],
      'gl-GL' => [
        'code' => 'gl-GL',
        'dir' => 'ltr',
        'name' => 'Galego',
        'base' => 'gl',
        'short_name' => 'GL (GL)',
      ],
      'gu' => [
        'code' => 'gu',
        'dir' => 'ltr',
        'name' => 'Gujarati',
        'base' => 'gu',
        'short_name' => 'GU',
      ],
      'gu-GU' => [
        'code' => 'gu-GU',
        'dir' => 'ltr',
        'name' => 'Gujarati',
        'base' => 'gu',
        'short_name' => 'GU (GU)',
      ],
      'he' => [
        'code' => 'he',
        'dir' => 'rtl',
        'name' => 'עברית',
        'base' => 'he',
        'short_name' => 'HE',
      ],
      'he-IL' => [
        'code' => 'he-IL',
        'dir' => 'rtl',
        'name' => 'עברית',
        'base' => 'he',
        'short_name' => 'HE (IL)',
      ],
      'hi' => [
        'code' => 'hi',
        'dir' => 'ltr',
        'name' => 'हिंदी',
        'base' => 'hi',
        'short_name' => 'HI',
      ],
      'hi-IN' => [
        'code' => 'hi-IN',
        'dir' => 'ltr',
        'name' => 'हिंदी (भारत)',
        'base' => 'hi',
        'short_name' => 'HI (IN)',
      ],
      'hr' => [
        'code' => 'hr',
        'dir' => 'ltr',
        'name' => 'Hrvatski',
        'base' => 'hr',
        'short_name' => 'HR',
      ],
      'hr-HR' => [
        'code' => 'hr-HR',
        'dir' => 'ltr',
        'name' => 'Hrvatski',
        'base' => 'hr',
        'short_name' => 'HR (HR)',
      ],
      'hsb' => [
        'code' => 'hsb',
        'dir' => 'ltr',
        'name' => 'Hornjoserbšćina',
        'base' => 'hsb',
        'short_name' => 'HSB',
      ],
      'hsb-HSB' => [
        'code' => 'hsb-HSB',
        'dir' => 'ltr',
        'name' => 'Hornjoserbšćina',
        'base' => 'hsb',
        'short_name' => 'HSB (HSB)',
      ],
      'ht' => [
        'code' => 'ht',
        'dir' => 'ltr',
        'name' => 'Kreyòl Ayisyen',
        'base' => 'ht',
        'short_name' => 'HT',
      ],
      'ht-HT' => [
        'code' => 'ht-HT',
        'dir' => 'ltr',
        'name' => 'Kreyòl Ayisyen',
        'base' => 'ht',
        'short_name' => 'HT (HT)',
      ],
      'hu' => [
        'code' => 'hu',
        'dir' => 'ltr',
        'name' => 'Magyar',
        'base' => 'hu',
        'short_name' => 'HU',
      ],
      'hu-HU' => [
        'code' => 'hu-HU',
        'dir' => 'ltr',
        'name' => 'Magyar',
        'base' => 'hu',
        'short_name' => 'HU (HU)',
      ],
      'hy' => [
        'code' => 'hy',
        'dir' => 'ltr',
        'name' => 'հայերեն',
        'base' => 'hy',
        'short_name' => 'HY',
      ],
      'hy-HY' => [
        'code' => 'hy-HY',
        'dir' => 'ltr',
        'name' => 'հայերեն',
        'base' => 'hy',
        'short_name' => 'HY (HY)',
      ],
      'ia' => [
        'code' => 'ia',
        'dir' => 'ltr',
        'name' => 'Interlingua',
        'base' => 'ia',
        'short_name' => 'IA',
      ],
      'ia-IA' => [
        'code' => 'ia-IA',
        'dir' => 'ltr',
        'name' => 'Interlingua',
        'base' => 'ia',
        'short_name' => 'IA (IA)',
      ],
      'id' => [
        'code' => 'id',
        'dir' => 'ltr',
        'name' => 'Bahasa Indonesia',
        'base' => 'id',
        'short_name' => 'ID',
      ],
      'id-ID' => [
        'code' => 'id-ID',
        'dir' => 'ltr',
        'name' => 'Bahasa Indonesia',
        'base' => 'id',
        'short_name' => 'ID (ID)',
      ],
      'ie' => [
        'code' => 'ie',
        'dir' => 'ltr',
        'name' => 'Interlingue',
        'base' => 'ie',
        'short_name' => 'IE',
      ],
      'ie-IE' => [
        'code' => 'ie-IE',
        'dir' => 'ltr',
        'name' => 'Interlingue',
        'base' => 'ie',
        'short_name' => 'IE (IE)',
      ],
      'in' => [
        'code' => 'in',
        'dir' => 'ltr',
        'name' => 'Bahasa Indonesia',
        'base' => 'in',
        'short_name' => 'IN',
      ],
      'in-ID' => [
        'code' => 'in-ID',
        'dir' => 'ltr',
        'name' => 'Bahasa Indonesia (Indonesia)',
        'base' => 'in',
        'short_name' => 'IN (ID)',
      ],
      'is' => [
        'code' => 'is',
        'dir' => 'ltr',
        'name' => 'Íslenska',
        'base' => 'is',
        'short_name' => 'IS',
      ],
      'is-IS' => [
        'code' => 'is-IS',
        'dir' => 'ltr',
        'name' => 'Íslenska (Ísland)',
        'base' => 'is',
        'short_name' => 'IS (IS)',
      ],
      'it' => [
        'code' => 'it',
        'dir' => 'ltr',
        'name' => 'Italiano',
        'base' => 'it',
        'short_name' => 'IT',
      ],
      'it-CH' => [
        'code' => 'it-CH',
        'dir' => 'ltr',
        'name' => 'Italiano (Svizzera)',
        'base' => 'it',
        'short_name' => 'IT (CH)',
      ],
      'it-IT' => [
        'code' => 'it-IT',
        'dir' => 'ltr',
        'name' => 'Italiano (Italia)',
        'base' => 'it',
        'short_name' => 'IT (IT)',
      ],
      'iu' => [
        'code' => 'iu',
        'dir' => 'ltr',
        'name' => 'Inuktitut',
        'base' => 'iu',
        'short_name' => 'IU',
      ],
      'iu-IU' => [
        'code' => 'iu-IU',
        'dir' => 'ltr',
        'name' => 'Inuktitut',
        'base' => 'iu',
        'short_name' => 'IU (IU)',
      ],
      'iw' => [
        'code' => 'iw',
        'dir' => 'ltr',
        'name' => 'עברית',
        'base' => 'iw',
        'short_name' => 'IW',
      ],
      'iw-IL' => [
        'code' => 'iw-IL',
        'dir' => 'ltr',
        'name' => 'עברית',
        'base' => 'iw',
        'short_name' => 'IW (IL)',
      ],
      'ja' => [
        'code' => 'ja',
        'dir' => 'ltr',
        'name' => '日本語',
        'base' => 'ja',
        'short_name' => 'JA',
      ],
      'ja-JP' => [
        'code' => 'ja-JP',
        'dir' => 'ltr',
        'name' => '日本語',
        'base' => 'ja',
        'short_name' => 'JA (JP)',
      ],
      'ka' => [
        'code' => 'ka',
        'dir' => 'ltr',
        'name' => 'ქართული',
        'base' => 'ka',
        'short_name' => 'KA',
      ],
      'ka-KA' => [
        'code' => 'ka-KA',
        'dir' => 'ltr',
        'name' => 'ქართული',
        'base' => 'ka',
        'short_name' => 'KA (KA)',
      ],
      'kk' => [
        'code' => 'kk',
        'dir' => 'ltr',
        'name' => 'Қазақша',
        'base' => 'kk',
        'short_name' => 'KK',
      ],
      'kk-KK' => [
        'code' => 'kk-KK',
        'dir' => 'ltr',
        'name' => 'Қазақша',
        'base' => 'kk',
        'short_name' => 'KK (KK)',
      ],
      'km' => [
        'code' => 'km',
        'dir' => 'ltr',
        'name' => 'Khmer',
        'base' => 'km',
        'short_name' => 'KM',
      ],
      'km-KM' => [
        'code' => 'km-KM',
        'dir' => 'ltr',
        'name' => 'Khmer',
        'base' => 'km',
        'short_name' => 'KM (KM)',
      ],
      'ko' => [
        'code' => 'ko',
        'dir' => 'ltr',
        'name' => '한국어',
        'base' => 'ko',
        'short_name' => 'KO',
      ],
      'ko-KR' => [
        'code' => 'ko-KR',
        'dir' => 'ltr',
        'name' => '한국어',
        'base' => 'ko',
        'short_name' => 'KO (KR)',
      ],
      'ky' => [
        'code' => 'ky',
        'dir' => 'ltr',
        'name' => 'Кыргызча',
        'base' => 'ky',
        'short_name' => 'KY',
      ],
      'ky-KY' => [
        'code' => 'ky-KY',
        'dir' => 'ltr',
        'name' => 'Кыргызча',
        'base' => 'ky',
        'short_name' => 'KY (KY)',
      ],
      'la' => [
        'code' => 'la',
        'dir' => 'ltr',
        'name' => 'Latina',
        'base' => 'la',
        'short_name' => 'LA',
      ],
      'la-LA' => [
        'code' => 'la-LA',
        'dir' => 'ltr',
        'name' => 'Latina',
        'base' => 'la',
        'short_name' => 'LA (LA)',
      ],
      'lb' => [
        'code' => 'lb',
        'dir' => 'ltr',
        'name' => 'Lëtzebuergesch',
        'base' => 'lb',
        'short_name' => 'LB',
      ],
      'lb-LB' => [
        'code' => 'lb-LB',
        'dir' => 'ltr',
        'name' => 'Lëtzebuergesch',
        'base' => 'lb',
        'short_name' => 'LB (LB)',
      ],
      'lt' => [
        'code' => 'lt',
        'dir' => 'ltr',
        'name' => 'Lietuvių',
        'base' => 'lt',
        'short_name' => 'LT',
      ],
      'lt-LT' => [
        'code' => 'lt-LT',
        'dir' => 'ltr',
        'name' => 'Lietuvių (Lietuva)',
        'base' => 'lt',
        'short_name' => 'LT (LT)',
      ],
      'lv' => [
        'code' => 'lv',
        'dir' => 'ltr',
        'name' => 'Latviešu',
        'base' => 'lv',
        'short_name' => 'LV',
      ],
      'lv-LV' => [
        'code' => 'lv-LV',
        'dir' => 'ltr',
        'name' => 'Latviešu (Latvija)',
        'base' => 'lv',
        'short_name' => 'LV (LV)',
      ],
      'mi' => [
        'code' => 'mi',
        'dir' => 'ltr',
        'name' => 'Te Reo Māori',
        'base' => 'mi',
        'short_name' => 'MI',
      ],
      'mi-MI' => [
        'code' => 'mi-MI',
        'dir' => 'ltr',
        'name' => 'Te Reo Māori',
        'base' => 'mi',
        'short_name' => 'MI (MI)',
      ],
      'mk' => [
        'code' => 'mk',
        'dir' => 'ltr',
        'name' => 'Македонски',
        'base' => 'mk',
        'short_name' => 'MK',
      ],
      'mk-MK' => [
        'code' => 'mk-MK',
        'dir' => 'ltr',
        'name' => 'Македонски (Македонија)',
        'base' => 'mk',
        'short_name' => 'MK (MK)',
      ],
      'ml' => [
        'code' => 'ml',
        'dir' => 'ltr',
        'name' => 'Malayalam',
        'base' => 'ml',
        'short_name' => 'ML',
      ],
      'ml-ML' => [
        'code' => 'ml-ML',
        'dir' => 'ltr',
        'name' => 'Malayalam',
        'base' => 'ml',
        'short_name' => 'ML (ML)',
      ],
      'mo' => [
        'code' => 'mo',
        'dir' => 'ltr',
        'name' => 'Graiul Moldovenesc',
        'base' => 'mo',
        'short_name' => 'MO',
      ],
      'mo-MO' => [
        'code' => 'mo-MO',
        'dir' => 'ltr',
        'name' => 'Graiul Moldovenesc',
        'base' => 'mo',
        'short_name' => 'MO (MO)',
      ],
      'mr' => [
        'code' => 'mr',
        'dir' => 'ltr',
        'name' => 'मराठी',
        'base' => 'mr',
        'short_name' => 'MR',
      ],
      'mr-MR' => [
        'code' => 'mr-MR',
        'dir' => 'ltr',
        'name' => 'मराठी',
        'base' => 'mr',
        'short_name' => 'MR (MR)',
      ],
      'ms' => [
        'code' => 'ms',
        'dir' => 'ltr',
        'name' => 'Bahasa Melayu',
        'base' => 'ms',
        'short_name' => 'MS',
      ],
      'ms-MY' => [
        'code' => 'ms-MY',
        'dir' => 'ltr',
        'name' => 'Bahasa Melayu',
        'base' => 'ms',
        'short_name' => 'MS (MY)',
      ],
      'mt' => [
        'code' => 'mt',
        'dir' => 'ltr',
        'name' => 'Malti',
        'base' => 'mt',
        'short_name' => 'MT',
      ],
      'mt-MT' => [
        'code' => 'mt-MT',
        'dir' => 'ltr',
        'name' => 'Malti',
        'base' => 'mt',
        'short_name' => 'MT (MT)',
      ],
      'nb' => [
        'code' => 'nb',
        'dir' => 'ltr',
        'name' => '‪Norsk Bokmål‬',
        'base' => 'nb',
        'short_name' => 'NB',
      ],
      'nb-NB' => [
        'code' => 'nb-NB',
        'dir' => 'ltr',
        'name' => '‪Norsk Bokmål‬',
        'base' => 'nb',
        'short_name' => 'NB (NB)',
      ],
      'ne' => [
        'code' => 'ne',
        'dir' => 'ltr',
        'name' => 'नेपाली',
        'base' => 'ne',
        'short_name' => 'NE',
      ],
      'ne-NE' => [
        'code' => 'ne-NE',
        'dir' => 'ltr',
        'name' => 'नेपाली',
        'base' => 'ne',
        'short_name' => 'NE (NE)',
      ],
      'ng' => [
        'code' => 'ng',
        'dir' => 'ltr',
        'name' => 'Oshiwambo',
        'base' => 'ng',
        'short_name' => 'NG',
      ],
      'ng-NG' => [
        'code' => 'ng-NG',
        'dir' => 'ltr',
        'name' => 'Oshiwambo',
        'base' => 'ng',
        'short_name' => 'NG (NG)',
      ],
      'nl' => [
        'code' => 'nl',
        'dir' => 'ltr',
        'name' => 'Nederlands',
        'base' => 'nl',
        'short_name' => 'NL',
      ],
      'nl-BE' => [
        'code' => 'nl-BE',
        'dir' => 'ltr',
        'name' => 'Nederlands (België)',
        'base' => 'nl',
        'short_name' => 'NL (BE)',
      ],
      'nl-NL' => [
        'code' => 'nl-NL',
        'dir' => 'ltr',
        'name' => 'Nederlands (Nederland)',
        'base' => 'nl',
        'short_name' => 'NL (NL)',
      ],
      'nn' => [
        'code' => 'nn',
        'dir' => 'ltr',
        'name' => 'Norsk',
        'base' => 'nn',
        'short_name' => 'NN',
      ],
      'nn-NN' => [
        'code' => 'nn-NN',
        'dir' => 'ltr',
        'name' => 'Norsk (Nynorsk)',
        'base' => 'nn',
        'short_name' => 'NN (NN)',
      ],
      'no' => [
        'code' => 'no',
        'dir' => 'ltr',
        'name' => 'Norsk',
        'base' => 'no',
        'short_name' => 'NO',
      ],
      'no-NO' => [
        'code' => 'no-NO',
        'dir' => 'ltr',
        'name' => 'Norsk (Norge)',
        'base' => 'no',
        'short_name' => 'NO (NO)',
      ],
      'nv' => [
        'code' => 'nv',
        'dir' => 'ltr',
        'name' => 'Diné Bizaad',
        'base' => 'nv',
        'short_name' => 'NV',
      ],
      'nv-NV' => [
        'code' => 'nv-NV',
        'dir' => 'ltr',
        'name' => 'Diné Bizaad',
        'base' => 'nv',
        'short_name' => 'NV (NV)',
      ],
      'oc' => [
        'code' => 'oc',
        'dir' => 'ltr',
        'name' => 'Lenga d’òc',
        'base' => 'oc',
        'short_name' => 'OC',
      ],
      'oc-OC' => [
        'code' => 'oc-OC',
        'dir' => 'ltr',
        'name' => 'Lenga d’òc',
        'base' => 'oc',
        'short_name' => 'OC (OC)',
      ],
      'om' => [
        'code' => 'om',
        'dir' => 'ltr',
        'name' => 'Afaan Oromoo',
        'base' => 'om',
        'short_name' => 'OM',
      ],
      'om-OM' => [
        'code' => 'om-OM',
        'dir' => 'ltr',
        'name' => 'Afaan Oromoo',
        'base' => 'om',
        'short_name' => 'OM (OM)',
      ],
      'pa' => [
        'code' => 'pa',
        'dir' => 'rtl',
        'name' => 'भारत गणराज्य',
        'base' => 'pa',
        'short_name' => 'PA',
      ],
      'pa-IN' => [
        'code' => 'pa-IN',
        'dir' => 'rtl',
        'name' => 'भारत गणराज्य (नेपाली)',
        'base' => 'pa',
        'short_name' => 'PA (IN)',
      ],
      'pa-PK' => [
        'code' => 'pa-PK',
        'dir' => 'rtl',
        'name' => 'یپنجاب (پنجاب)',
        'base' => 'pa',
        'short_name' => 'PA (PK)',
      ],
      'pl' => [
        'code' => 'pl',
        'dir' => 'ltr',
        'name' => 'Polski',
        'base' => 'pl',
        'short_name' => 'PL',
      ],
      'pl-PL' => [
        'code' => 'pl-PL',
        'dir' => 'ltr',
        'name' => 'Polski (Polska)',
        'base' => 'pl',
        'short_name' => 'PL (PL)',
      ],
      'pt' => [
        'code' => 'pt',
        'dir' => 'ltr',
        'name' => 'Português',
        'base' => 'pt',
        'short_name' => 'PT',
      ],
      'pt-BR' => [
        'code' => 'pt-BR',
        'dir' => 'ltr',
        'name' => 'Português (Brasil)',
        'base' => 'pt',
        'short_name' => 'PT (BR)',
      ],
      'pt-PT' => [
        'code' => 'pt-PT',
        'dir' => 'ltr',
        'name' => 'Português (Portugal)',
        'base' => 'pt',
        'short_name' => 'PT (PT)',
      ],
      'qu' => [
        'code' => 'qu',
        'dir' => 'ltr',
        'name' => 'Runa Simi',
        'base' => 'qu',
        'short_name' => 'QU',
      ],
      'qu-QU' => [
        'code' => 'qu-QU',
        'dir' => 'ltr',
        'name' => 'Runa Simi',
        'base' => 'qu',
        'short_name' => 'QU (QU)',
      ],
      'rm' => [
        'code' => 'rm',
        'dir' => 'ltr',
        'name' => 'Rumantsch',
        'base' => 'rm',
        'short_name' => 'RM',
      ],
      'rm-RM' => [
        'code' => 'rm-RM',
        'dir' => 'ltr',
        'name' => 'Rumantsch',
        'base' => 'rm',
        'short_name' => 'RM (RM)',
      ],
      'ro' => [
        'code' => 'ro',
        'dir' => 'ltr',
        'name' => 'Română',
        'base' => 'ro',
        'short_name' => 'RO',
      ],
      'ro-RO' => [
        'code' => 'ro-RO',
        'dir' => 'ltr',
        'name' => 'Română (România)',
        'base' => 'ro',
        'short_name' => 'RO (RO)',
      ],
      'ru' => [
        'code' => 'ru',
        'dir' => 'ltr',
        'name' => 'Русский',
        'base' => 'ru',
        'short_name' => 'RU',
      ],
      'ru-RU' => [
        'code' => 'ru-RU',
        'dir' => 'ltr',
        'name' => 'Русский (Россия)',
        'base' => 'ru',
        'short_name' => 'RU (RU)',
      ],
      'sa' => [
        'code' => 'sa',
        'dir' => 'ltr',
        'name' => 'संस्कृत',
        'base' => 'sa',
        'short_name' => 'SA',
      ],
      'sa-SA' => [
        'code' => 'sa-SA',
        'dir' => 'ltr',
        'name' => 'संस्कृत',
        'base' => 'sa',
        'short_name' => 'SA (SA)',
      ],
      'sc' => [
        'code' => 'sc',
        'dir' => 'ltr',
        'name' => 'Sardu',
        'base' => 'sc',
        'short_name' => 'SC',
      ],
      'sc-SC' => [
        'code' => 'sc-SC',
        'dir' => 'ltr',
        'name' => 'Sardu',
        'base' => 'sc',
        'short_name' => 'SC (SC)',
      ],
      'sd' => [
        'code' => 'sd',
        'dir' => 'rtl',
        'name' => 'فارسی',
        'base' => 'sd',
        'short_name' => 'SD',
      ],
      'sd-SD' => [
        'code' => 'sd-SD',
        'dir' => 'rtl',
        'name' => 'فارسی',
        'base' => 'sd',
        'short_name' => 'SD (SD)',
      ],
      'sg' => [
        'code' => 'sg',
        'dir' => 'ltr',
        'name' => 'Sango',
        'base' => 'sg',
        'short_name' => 'SG',
      ],
      'sg-SG' => [
        'code' => 'sg-SG',
        'dir' => 'ltr',
        'name' => 'Sango',
        'base' => 'sg',
        'short_name' => 'SG (SG)',
      ],
      'sk' => [
        'code' => 'sk',
        'dir' => 'ltr',
        'name' => 'Slovenčina',
        'base' => 'sk',
        'short_name' => 'SK',
      ],
      'sk-SK' => [
        'code' => 'sk-SK',
        'dir' => 'ltr',
        'name' => 'Slovenčina (Slovenská republika)',
        'base' => 'sk',
        'short_name' => 'SK (SK)',
      ],
      'sl' => [
        'code' => 'sl',
        'dir' => 'ltr',
        'name' => 'Slovenščina',
        'base' => 'sl',
        'short_name' => 'SL',
      ],
      'sl-SI' => [
        'code' => 'sl-SI',
        'dir' => 'ltr',
        'name' => 'Slovenščina (Slovenija)',
        'base' => 'sl',
        'short_name' => 'SL (SI)',
      ],
      'so' => [
        'code' => 'so',
        'dir' => 'ltr',
        'name' => 'Af Somali',
        'base' => 'so',
        'short_name' => 'SO',
      ],
      'so-SO' => [
        'code' => 'so-SO',
        'dir' => 'ltr',
        'name' => 'Af Somali',
        'base' => 'so',
        'short_name' => 'SO (SO)',
      ],
      'sq' => [
        'code' => 'sq',
        'dir' => 'ltr',
        'name' => 'Shqipe',
        'base' => 'sq',
        'short_name' => 'SQ',
      ],
      'sq-AL' => [
        'code' => 'sq-AL',
        'dir' => 'ltr',
        'name' => 'Shqipe',
        'base' => 'sq',
        'short_name' => 'SQ (AL)',
      ],
      'sr' => [
        'code' => 'sr',
        'dir' => 'ltr',
        'name' => 'Српски',
        'base' => 'sr',
        'short_name' => 'SR',
      ],
      'sr-BA' => [
        'code' => 'sr-BA',
        'dir' => 'ltr',
        'name' => 'Српски (Босна и Херцеговина)',
        'base' => 'sr',
        'short_name' => 'SR (BA)',
      ],
      'sr-CS' => [
        'code' => 'sr-CS',
        'dir' => 'ltr',
        'name' => 'Српски (Србија и Црна Гора)',
        'base' => 'sr',
        'short_name' => 'SR (CS)',
      ],
      'sr-RS' => [
        'code' => 'sr-RS',
        'dir' => 'ltr',
        'name' => 'Српски',
        'base' => 'sr',
        'short_name' => 'SR (RS)',
      ],
      'sv' => [
        'code' => 'sv',
        'dir' => 'ltr',
        'name' => 'Svenska',
        'base' => 'sv',
        'short_name' => 'SV',
      ],
      'sv-SE' => [
        'code' => 'sv-SE',
        'dir' => 'ltr',
        'name' => 'Svenska (Sverige)',
        'base' => 'sv',
        'short_name' => 'SV (SE)',
      ],
      'sw' => [
        'code' => 'sw',
        'dir' => 'ltr',
        'name' => 'Kiswahili',
        'base' => 'sw',
        'short_name' => 'SW',
      ],
      'sw-SW' => [
        'code' => 'sw-SW',
        'dir' => 'ltr',
        'name' => 'Kiswahili',
        'base' => 'sw',
        'short_name' => 'SW (SW)',
      ],
      'ta' => [
        'code' => 'ta',
        'dir' => 'ltr',
        'name' => 'தமிழ',
        'base' => 'ta',
        'short_name' => 'TA',
      ],
      'ta-TA' => [
        'code' => 'ta-TA',
        'dir' => 'ltr',
        'name' => 'தமிழ',
        'base' => 'ta',
        'short_name' => 'TA (TA)',
      ],
      'th' => [
        'code' => 'th',
        'dir' => 'ltr',
        'name' => 'ไทย',
        'base' => 'th',
        'short_name' => 'TH',
      ],
      'th-TH' => [
        'code' => 'th-TH',
        'dir' => 'ltr',
        'name' => 'ไทย (ประเทศไทย)',
        'base' => 'th',
        'short_name' => 'TH (TH)',
      ],
      'tig' => [
        'code' => 'tig',
        'dir' => 'ltr',
        'name' => 'Tigré',
        'base' => 'tig',
        'short_name' => 'TIG',
      ],
      'tig-TIG' => [
        'code' => 'tig-TIG',
        'dir' => 'ltr',
        'name' => 'Tigré',
        'base' => 'tig',
        'short_name' => 'TIG (TIG)',
      ],
      'tk' => [
        'code' => 'tk',
        'dir' => 'ltr',
        'name' => 'Түркмен',
        'base' => 'tk',
        'short_name' => 'TK',
      ],
      'tk-TK' => [
        'code' => 'tk-TK',
        'dir' => 'ltr',
        'name' => 'Түркмен',
        'base' => 'tk',
        'short_name' => 'TK (TK)',
      ],
      'tlh' => [
        'code' => 'tlh',
        'dir' => 'ltr',
        'name' => 'tlhIngan Hol',
        'base' => 'tlh',
        'short_name' => 'TLH',
      ],
      'tlh-TLH' => [
        'code' => 'tlh-TLH',
        'dir' => 'ltr',
        'name' => 'tlhIngan Hol',
        'base' => 'tlh',
        'short_name' => 'TLH (TLH)',
      ],
      'tr' => [
        'code' => 'tr',
        'dir' => 'ltr',
        'name' => 'Türkçe',
        'base' => 'tr',
        'short_name' => 'TR',
      ],
      'tr-TR' => [
        'code' => 'tr-TR',
        'dir' => 'ltr',
        'name' => 'Türkçe',
        'base' => 'tr',
        'short_name' => 'TR (TR)',
      ],
      'uk' => [
        'code' => 'uk',
        'dir' => 'ltr',
        'name' => 'Українська',
        'base' => 'uk',
        'short_name' => 'UK',
      ],
      'uk-UA' => [
        'code' => 'uk-UA',
        'dir' => 'ltr',
        'name' => 'Українська',
        'base' => 'uk',
        'short_name' => 'UK (UA)',
      ],
      've' => [
        'code' => 've',
        'dir' => 'ltr',
        'name' => 'Tshivenda',
        'base' => 've',
        'short_name' => 'VE',
      ],
      've-VE' => [
        'code' => 've-VE',
        'dir' => 'ltr',
        'name' => 'Tshivenda',
        'base' => 've',
        'short_name' => 'VE (VE)',
      ],
      'vi' => [
        'code' => 'vi',
        'dir' => 'ltr',
        'name' => 'Tiếng Việt',
        'base' => 'vi',
        'short_name' => 'VI',
      ],
      'vi-VN' => [
        'code' => 'vi-VN',
        'dir' => 'ltr',
        'name' => 'Tiếng Việt',
        'base' => 'vi',
        'short_name' => 'VI (VN)',
      ],
      'vo' => [
        'code' => 'vo',
        'dir' => 'ltr',
        'name' => 'Volapük',
        'base' => 'vo',
        'short_name' => 'VO',
      ],
      'vo-VO' => [
        'code' => 'vo-VO',
        'dir' => 'ltr',
        'name' => 'Volapük',
        'base' => 'vo',
        'short_name' => 'VO (VO)',
      ],
      'wa' => [
        'code' => 'wa',
        'dir' => 'ltr',
        'name' => 'Walon',
        'base' => 'wa',
        'short_name' => 'WA',
      ],
      'wa-WA' => [
        'code' => 'wa-WA',
        'dir' => 'ltr',
        'name' => 'Walon',
        'base' => 'wa',
        'short_name' => 'WA (WA)',
      ],
      'xh' => [
        'code' => 'xh',
        'dir' => 'ltr',
        'name' => 'isiXhosa',
        'base' => 'xh',
        'short_name' => 'XH',
      ],
      'xh-XH' => [
        'code' => 'xh-XH',
        'dir' => 'ltr',
        'name' => 'isiXhosa',
        'base' => 'xh',
        'short_name' => 'XH (XH)',
      ],
      'yi' => [
        'code' => 'yi',
        'dir' => 'rtl',
        'name' => 'ייִדיש',
        'base' => 'yi',
        'short_name' => 'YI',
      ],
      'yi-YI' => [
        'code' => 'yi-YI',
        'dir' => 'rtl',
        'name' => 'ייִדיש',
        'base' => 'yi',
        'short_name' => 'YI (YI)',
      ],
      'zh' => [
        'code' => 'zh',
        'dir' => 'ltr',
        'name' => '中文',
        'base' => 'zh',
        'short_name' => 'ZH',
      ],
      // hans
      'zh-CN' => [
        'code' => 'zh-CN',
        'dir' => 'ltr',
        'name' => '简体中文',
        'base' => 'zh',
        'short_name' => 'ZH (CN)',
      ],
      'zh-HK' => [
        'code' => 'zh-HK',
        'dir' => 'ltr',
        'name' => '中文 (香港)',
        'base' => 'zh',
        'short_name' => 'ZH (HK)',
      ],
      'zh-SG' => [
        'code' => 'zh-SG',
        'dir' => 'ltr',
        'name' => '中文 (新加坡)',
        'base' => 'zh',
        'short_name' => 'ZH (SG)',
      ],
      // hant
      'zh-TW' => [
        'code' => 'zh-TW',
        'dir' => 'ltr',
        'name' => '繁體中文',
        'base' => 'zh',
        'short_name' => 'ZH (TW)',
      ],
      'zu' => [
        'code' => 'zu',
        'dir' => 'ltr',
        'name' => 'isiZulu',
        'base' => 'zu',
        'short_name' => 'ZU',
      ],
      'zu-ZU' => [
        'code' => 'zu-ZU',
        'dir' => 'ltr',
        'name' => 'isiZulu',
        'base' => 'zu',
        'short_name' => 'ZU (ZU)',
      ],
    ];
    }
}

class L10nException extends Exception
{
}

//error_reporting($error_reporting_level);
