'Albania Lek', 'AFN' => 'Afghanistan Afghani', 'AMD' => 'Armenian Dram', 'ANG' => 'Netherlands Antillean Guilder', 'AOA' => 'Angola Kwanza', 'ARS' => 'Argentina Peso', 'AUD' => 'Australia Dollar', 'AWG' => 'Aruba Guilder', 'AZN' => 'Azerbaijan New Manat', 'BAM' => 'Bosnia and Herzegovina Convertible Marka', 'BBD' => 'Barbados Dollar', 'BDT' => 'Bangladesh Taka', 'BGN' => 'Bulgaria Lev', 'BHD' => 'Bahraini Dinar', 'BIF' => 'Burundi Franc', 'BMD' => 'Bermuda Dollar', 'BND' => 'Brunei Darussalam Dollar', 'BOB' => 'Bolivia Boliviano', 'BRL' => 'Brazil Real', 'BSD' => 'Bahamas Dollar', 'BTN' => 'Bhutan Ngultrum', 'BWP' => 'Botswana Pula', 'BYN' => 'Belarus Ruble', 'BZD' => 'Belize Dollar', 'CAD' => 'Canada Dollar', 'CDF' => 'Congolese Franc', 'CHF' => 'Switzerland Franc', 'CLF' => 'Unidad de Fomento', 'CLP' => 'Chile Peso', 'CNH' => 'China Yuan (offshore)', 'CNY' => 'China Yuan Renminbi', 'COP' => 'Colombia Peso', 'CUC' => 'Cuban Convertible Peso', 'CUP' => 'Cuba Peso', 'CVE' => 'Cape Verde Escudo', 'CZK' => 'Czech Republic Koruna', 'DJF' => 'Djibouti Franc', 'DKK' => 'Denmark Krone', 'DOP' => 'Dominican Republic Peso', 'DZD' => 'Algeria Dinar', 'EGP' => 'Egypt Pound', 'ERN' => 'Eritrea Nakfa', 'ETB' => 'Ethiopian Birr', 'EUR' => 'Euro Member Countries', 'FJD' => 'Fiji Dollar', 'FKP' => 'Falkland Islands Pound', 'GBP' => 'United Kingdom Pound', 'GEL' => 'Georgia Lari', 'GGP' => 'Guernsey Pound', 'GHS' => 'Ghana Cedi', 'GIP' => 'Gibraltar Pound', 'GMD' => 'Gambia Dalasi', 'GNF' => 'Guinea Franc', 'GTQ' => 'Guatemala Quetzal', 'GYD' => 'Guyana Dollar', 'HKD' => 'Hong Kong Dollar', 'HNL' => 'Honduras Lempira', 'HRK' => 'Croatia Kuna', 'HTG' => 'Haiti Gourde', 'HUF' => 'Hungary Forint', 'IDR' => 'Indonesia Rupiah', 'ILS' => 'Israel Shekel', 'IMP' => 'Isle of Man Pound', 'INR' => 'India Rupee', 'IQD' => 'Iraq Dinar', 'IRR' => 'Iran Rial', 'ISK' => 'Iceland Krona', 'JEP' => 'Jersey Pound', 'JMD' => 'Jamaica Dollar', 'JOD' => 'Jordan Dinar', 'JPY' => 'Japan Yen', 'KES' => 'Kenya Shilling', 'KGS' => 'Kyrgyzstan Som', 'KHR' => 'Cambodia Riel', 'KMF' => 'Comoros Franc', 'KPW' => 'Korea (North) Won', 'KRW' => 'Korea (South) Won', 'KWD' => 'Kuwaiti Dinar', 'KYD' => 'Cayman Islands Dollar', 'KZT' => 'Kazakhstan Tenge', 'LAK' => 'Laos Kip', 'LBP' => 'Lebanon Pound', 'LKR' => 'Sri Lanka Rupee', 'LRD' => 'Liberia Dollar', 'LSL' => 'Lesotho Loti', 'LYD' => 'Libya Dinar', 'MAD' => 'Morocco Dirham', 'MDL' => 'Moldova Leu', 'MGA' => 'Madagascar Ariary', 'MKD' => 'Macedonia Denar', 'MMK' => 'Myanmar Kyat', 'MNT' => 'Mongolia Tughrik', 'MOP' => 'Macau Pataca', 'MRO' => 'Mauritania Ouguiya', 'MUR' => 'Mauritius Rupee', 'MVR' => 'Maldives Rufiyaa', 'MWK' => 'Malawi Kwacha', 'MXN' => 'Mexico Peso', 'MYR' => 'Malaysia Ringgit', 'MZN' => 'Mozambique Metical', 'NAD' => 'Namibia Dollar', 'NGN' => 'Nigeria Naira', 'NIO' => 'Nicaragua Cordoba', 'NOK' => 'Norway Krone', 'NPR' => 'Nepal Rupee', 'NZD' => 'New Zealand Dollar', 'OMR' => 'Oman Rial', 'PAB' => 'Panama Balboa', 'PEN' => 'Peru Sol', 'PGK' => 'Papua New Guinea Kina', 'PHP' => 'Philippines Peso', 'PKR' => 'Pakistan Rupee', 'PLN' => 'Poland Zloty', 'PYG' => 'Paraguay Guarani', 'QAR' => 'Qatar Riyal', 'RON' => 'Romania Leu', 'RSD' => 'Serbia Dinar', 'RUB' => 'Russia Ruble', 'RWF' => 'Rwanda Franc', 'SAR' => 'Saudi Arabia Riyal', 'SBD' => 'Solomon Islands Dollar', 'SCR' => 'Seychelles Rupee', 'SDG' => 'Sudan Pound', 'SEK' => 'Sweden Krona', 'SGD' => 'Singapore Dollar', 'SHP' => 'Saint Helena Pound', 'SLL' => 'Sierra Leone Leone', 'SOS' => 'Somalia Shilling', 'SPL' => 'Seborga Luigino', 'SRD' => 'Suriname Dollar', 'STD' => 'São Tomé and Príncipe Dobra', 'SVC' => 'El Salvador Colon', 'SYP' => 'Syria Pound', 'SZL' => 'Swaziland Lilangeni', 'THB' => 'Thailand Baht', 'TJS' => 'Tajikistan Somoni', 'TMT' => 'Turkmenistan Manat', 'TND' => 'Tunisia Dinar', 'TOP' => 'Tonga Pa\'anga', 'TRY' => 'Turkey Lira', 'TTD' => 'Trinidad and Tobago Dollar', 'TVD' => 'Tuvalu Dollar', 'TWD' => 'Taiwan New Dollar', 'TZS' => 'Tanzania Shilling', 'UAH' => 'Ukraine Hryvnia', 'UGX' => 'Uganda Shilling', 'USD' => 'United States Dollar', 'UYU' => 'Uruguay Peso', 'UZS' => 'Uzbekistan Som', 'VEF' => 'Venezuela Bolívar', 'VND' => 'Viet Nam Dong', 'VUV' => 'Vanuatu Vatu', 'WST' => 'Samoa Tala', 'XAF' => 'Communauté Financière Africaine (BEAC) CFA Franc BEAC', 'XAG' => 'Silver Ounce', 'XAU' => 'Gold Ounce', 'XCD' => 'East Caribbean Dollar', 'XDR' => 'International Monetary Fund (IMF) Special Drawing Rights', 'XOF' => 'Communauté Financière Africaine (BCEAO) Franc', 'XPD' => 'Palladium Ounce', 'XPF' => 'CFP Franc', 'XPT' => 'Platinum Ounce', 'YER' => 'Yemen Rial', 'ZAR' => 'South Africa Rand', 'ZMW' => 'Zambia Kwacha', 'ZWL' => 'Zimbabwe Dollar' ); // List of locales $locales_array = [ 'af_NA' => 'Afrikaans (Namibia)', 'af_ZA' => 'Afrikaans (South Africa)', 'af' => 'Afrikaans', 'ak_GH' => 'Akan (Ghana)', 'ak' => 'Akan', 'sq_AL' => 'Albanian (Albania)', 'sq' => 'Albanian', 'am_ET' => 'Amharic (Ethiopia)', 'am' => 'Amharic', 'ar_DZ' => 'Arabic (Algeria)', 'ar_BH' => 'Arabic (Bahrain)', 'ar_EG' => 'Arabic (Egypt)', 'ar_IQ' => 'Arabic (Iraq)', 'ar_JO' => 'Arabic (Jordan)', 'ar_KW' => 'Arabic (Kuwait)', 'ar_LB' => 'Arabic (Lebanon)', 'ar_LY' => 'Arabic (Libya)', 'ar_MA' => 'Arabic (Morocco)', 'ar_OM' => 'Arabic (Oman)', 'ar_QA' => 'Arabic (Qatar)', 'ar_SA' => 'Arabic (Saudi Arabia)', 'ar_SD' => 'Arabic (Sudan)', 'ar_SY' => 'Arabic (Syria)', 'ar_TN' => 'Arabic (Tunisia)', 'ar_AE' => 'Arabic (United Arab Emirates)', 'ar_YE' => 'Arabic (Yemen)', 'ar' => 'Arabic', 'hy_AM' => 'Armenian (Armenia)', 'hy' => 'Armenian', 'as_IN' => 'Assamese (India)', 'as' => 'Assamese', 'asa_TZ' => 'Asu (Tanzania)', 'asa' => 'Asu', 'az_Cyrl' => 'Azerbaijani (Cyrillic)', 'az_Cyrl_AZ' => 'Azerbaijani (Cyrillic, Azerbaijan)', 'az_Latn' => 'Azerbaijani (Latin)', 'az_Latn_AZ' => 'Azerbaijani (Latin, Azerbaijan)', 'az' => 'Azerbaijani', 'bm_ML' => 'Bambara (Mali)', 'bm' => 'Bambara', 'eu_ES' => 'Basque (Spain)', 'eu' => 'Basque', 'be_BY' => 'Belarusian (Belarus)', 'be' => 'Belarusian', 'bem_ZM' => 'Bemba (Zambia)', 'bem' => 'Bemba', 'bez_TZ' => 'Bena (Tanzania)', 'bez' => 'Bena', 'bn_BD' => 'Bengali (Bangladesh)', 'bn_IN' => 'Bengali (India)', 'bn' => 'Bengali', 'bs_BA' => 'Bosnian (Bosnia and Herzegovina)', 'bs' => 'Bosnian', 'bg_BG' => 'Bulgarian (Bulgaria)', 'bg' => 'Bulgarian', 'my_MM' => 'Burmese (Myanmar [Burma])', 'my' => 'Burmese', 'ca_ES' => 'Catalan (Spain)', 'ca' => 'Catalan', 'tzm_Latn' => 'Central Morocco Tamazight (Latin)', 'tzm_Latn_MA' => 'Central Morocco Tamazight (Latin, Morocco)', 'tzm' => 'Central Morocco Tamazight', 'chr_US' => 'Cherokee (United States)', 'chr' => 'Cherokee', 'cgg_UG' => 'Chiga (Uganda)', 'cgg' => 'Chiga', 'zh_Hans' => 'Chinese (Simplified Han)', 'zh_Hans_CN' => 'Chinese (Simplified Han, China)', 'zh_Hans_HK' => 'Chinese (Simplified Han, Hong Kong SAR China)', 'zh_Hans_MO' => 'Chinese (Simplified Han, Macau SAR China)', 'zh_Hans_SG' => 'Chinese (Simplified Han, Singapore)', 'zh_Hant' => 'Chinese (Traditional Han)', 'zh_Hant_HK' => 'Chinese (Traditional Han, Hong Kong SAR China)', 'zh_Hant_MO' => 'Chinese (Traditional Han, Macau SAR China)', 'zh_Hant_TW' => 'Chinese (Traditional Han, Taiwan)', 'zh' => 'Chinese', 'kw_GB' => 'Cornish (United Kingdom)', 'kw' => 'Cornish', 'hr_HR' => 'Croatian (Croatia)', 'hr' => 'Croatian', 'cs_CZ' => 'Czech (Czech Republic)', 'cs' => 'Czech', 'da_DK' => 'Danish (Denmark)', 'da' => 'Danish', 'nl_BE' => 'Dutch (Belgium)', 'nl_NL' => 'Dutch (Netherlands)', 'nl' => 'Dutch', 'ebu_KE' => 'Embu (Kenya)', 'ebu' => 'Embu', 'en_AS' => 'English (American Samoa)', 'en_AU' => 'English (Australia)', 'en_BE' => 'English (Belgium)', 'en_BZ' => 'English (Belize)', 'en_BW' => 'English (Botswana)', 'en_CA' => 'English (Canada)', 'en_GU' => 'English (Guam)', 'en_HK' => 'English (Hong Kong SAR China)', 'en_IN' => 'English (India)', 'en_IE' => 'English (Ireland)', 'en_JM' => 'English (Jamaica)', 'en_MT' => 'English (Malta)', 'en_MH' => 'English (Marshall Islands)', 'en_MU' => 'English (Mauritius)', 'en_NA' => 'English (Namibia)', 'en_NZ' => 'English (New Zealand)', 'en_MP' => 'English (Northern Mariana Islands)', 'en_PK' => 'English (Pakistan)', 'en_PH' => 'English (Philippines)', 'en_SG' => 'English (Singapore)', 'en_ZA' => 'English (South Africa)', 'en_TT' => 'English (Trinidad and Tobago)', 'en_UM' => 'English (U.S. Minor Outlying Islands)', 'en_VI' => 'English (U.S. Virgin Islands)', 'en_GB' => 'English (United Kingdom)', 'en_US' => 'English (United States)', 'en_ZW' => 'English (Zimbabwe)', 'en' => 'English', 'eo' => 'Esperanto', 'et_EE' => 'Estonian (Estonia)', 'et' => 'Estonian', 'ee_GH' => 'Ewe (Ghana)', 'ee_TG' => 'Ewe (Togo)', 'ee' => 'Ewe', 'fo_FO' => 'Faroese (Faroe Islands)', 'fo' => 'Faroese', 'fil_PH' => 'Filipino (Philippines)', 'fil' => 'Filipino', 'fi_FI' => 'Finnish (Finland)', 'fi' => 'Finnish', 'fr_BE' => 'French (Belgium)', 'fr_BJ' => 'French (Benin)', 'fr_BF' => 'French (Burkina Faso)', 'fr_BI' => 'French (Burundi)', 'fr_CM' => 'French (Cameroon)', 'fr_CA' => 'French (Canada)', 'fr_CF' => 'French (Central African Republic)', 'fr_TD' => 'French (Chad)', 'fr_KM' => 'French (Comoros)', 'fr_CG' => 'French (Congo - Brazzaville)', 'fr_CD' => 'French (Congo - Kinshasa)', 'fr_CI' => 'French (Côte d’Ivoire)', 'fr_DJ' => 'French (Djibouti)', 'fr_GQ' => 'French (Equatorial Guinea)', 'fr_FR' => 'French (France)', 'fr_GA' => 'French (Gabon)', 'fr_GP' => 'French (Guadeloupe)', 'fr_GN' => 'French (Guinea)', 'fr_LU' => 'French (Luxembourg)', 'fr_MG' => 'French (Madagascar)', 'fr_ML' => 'French (Mali)', 'fr_MQ' => 'French (Martinique)', 'fr_MC' => 'French (Monaco)', 'fr_NE' => 'French (Niger)', 'fr_RW' => 'French (Rwanda)', 'fr_RE' => 'French (Réunion)', 'fr_BL' => 'French (Saint Barthélemy)', 'fr_MF' => 'French (Saint Martin)', 'fr_SN' => 'French (Senegal)', 'fr_CH' => 'French (Switzerland)', 'fr_TG' => 'French (Togo)', 'fr' => 'French', 'ff_SN' => 'Fulah (Senegal)', 'ff' => 'Fulah', 'gl_ES' => 'Galician (Spain)', 'gl' => 'Galician', 'lg_UG' => 'Ganda (Uganda)', 'lg' => 'Ganda', 'ka_GE' => 'Georgian (Georgia)', 'ka' => 'Georgian', 'de_AT' => 'German (Austria)', 'de_BE' => 'German (Belgium)', 'de_DE' => 'German (Germany)', 'de_LI' => 'German (Liechtenstein)', 'de_LU' => 'German (Luxembourg)', 'de_CH' => 'German (Switzerland)', 'de' => 'German', 'el_CY' => 'Greek (Cyprus)', 'el_GR' => 'Greek (Greece)', 'el' => 'Greek', 'gu_IN' => 'Gujarati (India)', 'gu' => 'Gujarati', 'guz_KE' => 'Gusii (Kenya)', 'guz' => 'Gusii', 'ha_Latn' => 'Hausa (Latin)', 'ha_Latn_GH' => 'Hausa (Latin, Ghana)', 'ha_Latn_NE' => 'Hausa (Latin, Niger)', 'ha_Latn_NG' => 'Hausa (Latin, Nigeria)', 'ha' => 'Hausa', 'haw_US' => 'Hawaiian (United States)', 'haw' => 'Hawaiian', 'he_IL' => 'Hebrew (Israel)', 'he' => 'Hebrew', 'hi_IN' => 'Hindi (India)', 'hi' => 'Hindi', 'hu_HU' => 'Hungarian (Hungary)', 'hu' => 'Hungarian', 'is_IS' => 'Icelandic (Iceland)', 'is' => 'Icelandic', 'ig_NG' => 'Igbo (Nigeria)', 'ig' => 'Igbo', 'id_ID' => 'Indonesian (Indonesia)', 'id' => 'Indonesian', 'ga_IE' => 'Irish (Ireland)', 'ga' => 'Irish', 'it_IT' => 'Italian (Italy)', 'it_CH' => 'Italian (Switzerland)', 'it' => 'Italian', 'ja_JP' => 'Japanese (Japan)', 'ja' => 'Japanese', 'kea_CV' => 'Kabuverdianu (Cape Verde)', 'kea' => 'Kabuverdianu', 'kab_DZ' => 'Kabyle (Algeria)', 'kab' => 'Kabyle', 'kl_GL' => 'Kalaallisut (Greenland)', 'kl' => 'Kalaallisut', 'kln_KE' => 'Kalenjin (Kenya)', 'kln' => 'Kalenjin', 'kam_KE' => 'Kamba (Kenya)', 'kam' => 'Kamba', 'kn_IN' => 'Kannada (India)', 'kn' => 'Kannada', 'kk_Cyrl' => 'Kazakh (Cyrillic)', 'kk_Cyrl_KZ' => 'Kazakh (Cyrillic, Kazakhstan)', 'kk' => 'Kazakh', 'km_KH' => 'Khmer (Cambodia)', 'km' => 'Khmer', 'ki_KE' => 'Kikuyu (Kenya)', 'ki' => 'Kikuyu', 'rw_RW' => 'Kinyarwanda (Rwanda)', 'rw' => 'Kinyarwanda', 'kok_IN' => 'Konkani (India)', 'kok' => 'Konkani', 'ko_KR' => 'Korean (South Korea)', 'ko' => 'Korean', 'khq_ML' => 'Koyra Chiini (Mali)', 'khq' => 'Koyra Chiini', 'ses_ML' => 'Koyraboro Senni (Mali)', 'ses' => 'Koyraboro Senni', 'lag_TZ' => 'Langi (Tanzania)', 'lag' => 'Langi', 'lv_LV' => 'Latvian (Latvia)', 'lv' => 'Latvian', 'lt_LT' => 'Lithuanian (Lithuania)', 'lt' => 'Lithuanian', 'luo_KE' => 'Luo (Kenya)', 'luo' => 'Luo', 'luy_KE' => 'Luyia (Kenya)', 'luy' => 'Luyia', 'mk_MK' => 'Macedonian (Macedonia)', 'mk' => 'Macedonian', 'jmc_TZ' => 'Machame (Tanzania)', 'jmc' => 'Machame', 'kde_TZ' => 'Makonde (Tanzania)', 'kde' => 'Makonde', 'mg_MG' => 'Malagasy (Madagascar)', 'mg' => 'Malagasy', 'ms_BN' => 'Malay (Brunei)', 'ms_MY' => 'Malay (Malaysia)', 'ms' => 'Malay', 'ml_IN' => 'Malayalam (India)', 'ml' => 'Malayalam', 'mt_MT' => 'Maltese (Malta)', 'mt' => 'Maltese', 'gv_GB' => 'Manx (United Kingdom)', 'gv' => 'Manx', 'mr_IN' => 'Marathi (India)', 'mr' => 'Marathi', 'mas_KE' => 'Masai (Kenya)', 'mas_TZ' => 'Masai (Tanzania)', 'mas' => 'Masai', 'mer_KE' => 'Meru (Kenya)', 'mer' => 'Meru', 'mfe_MU' => 'Morisyen (Mauritius)', 'mfe' => 'Morisyen', 'naq_NA' => 'Nama (Namibia)', 'naq' => 'Nama', 'ne_IN' => 'Nepali (India)', 'ne_NP' => 'Nepali (Nepal)', 'ne' => 'Nepali', 'nd_ZW' => 'North Ndebele (Zimbabwe)', 'nd' => 'North Ndebele', 'nb_NO' => 'Norwegian Bokmål (Norway)', 'nb' => 'Norwegian Bokmål', 'nn_NO' => 'Norwegian Nynorsk (Norway)', 'nn' => 'Norwegian Nynorsk', 'nyn_UG' => 'Nyankole (Uganda)', 'nyn' => 'Nyankole', 'or_IN' => 'Oriya (India)', 'or' => 'Oriya', 'om_ET' => 'Oromo (Ethiopia)', 'om_KE' => 'Oromo (Kenya)', 'om' => 'Oromo', 'ps_AF' => 'Pashto (Afghanistan)', 'ps' => 'Pashto', 'fa_AF' => 'Persian (Afghanistan)', 'fa_IR' => 'Persian (Iran)', 'fa' => 'Persian', 'pl_PL' => 'Polish (Poland)', 'pl' => 'Polish', 'pt_BR' => 'Portuguese (Brazil)', 'pt_GW' => 'Portuguese (Guinea-Bissau)', 'pt_MZ' => 'Portuguese (Mozambique)', 'pt_PT' => 'Portuguese (Portugal)', 'pt' => 'Portuguese', 'pa_Arab' => 'Punjabi (Arabic)', 'pa_Arab_PK' => 'Punjabi (Arabic, Pakistan)', 'pa_Guru' => 'Punjabi (Gurmukhi)', 'pa_Guru_IN' => 'Punjabi (Gurmukhi, India)', 'pa' => 'Punjabi', 'ro_MD' => 'Romanian (Moldova)', 'ro_RO' => 'Romanian (Romania)', 'ro' => 'Romanian', 'rm_CH' => 'Romansh (Switzerland)', 'rm' => 'Romansh', 'rof_TZ' => 'Rombo (Tanzania)', 'rof' => 'Rombo', 'ru_MD' => 'Russian (Moldova)', 'ru_RU' => 'Russian (Russia)', 'ru_UA' => 'Russian (Ukraine)', 'ru' => 'Russian', 'rwk_TZ' => 'Rwa (Tanzania)', 'rwk' => 'Rwa', 'saq_KE' => 'Samburu (Kenya)', 'saq' => 'Samburu', 'sg_CF' => 'Sango (Central African Republic)', 'sg' => 'Sango', 'seh_MZ' => 'Sena (Mozambique)', 'seh' => 'Sena', 'sr_Cyrl' => 'Serbian (Cyrillic)', 'sr_Cyrl_BA' => 'Serbian (Cyrillic, Bosnia and Herzegovina)', 'sr_Cyrl_ME' => 'Serbian (Cyrillic, Montenegro)', 'sr_Cyrl_RS' => 'Serbian (Cyrillic, Serbia)', 'sr_Latn' => 'Serbian (Latin)', 'sr_Latn_BA' => 'Serbian (Latin, Bosnia and Herzegovina)', 'sr_Latn_ME' => 'Serbian (Latin, Montenegro)', 'sr_Latn_RS' => 'Serbian (Latin, Serbia)', 'sr' => 'Serbian', 'sn_ZW' => 'Shona (Zimbabwe)', 'sn' => 'Shona', 'ii_CN' => 'Sichuan Yi (China)', 'ii' => 'Sichuan Yi', 'si_LK' => 'Sinhala (Sri Lanka)', 'si' => 'Sinhala', 'sk_SK' => 'Slovak (Slovakia)', 'sk' => 'Slovak', 'sl_SI' => 'Slovenian (Slovenia)', 'sl' => 'Slovenian', 'xog_UG' => 'Soga (Uganda)', 'xog' => 'Soga', 'so_DJ' => 'Somali (Djibouti)', 'so_ET' => 'Somali (Ethiopia)', 'so_KE' => 'Somali (Kenya)', 'so_SO' => 'Somali (Somalia)', 'so' => 'Somali', 'es_AR' => 'Spanish (Argentina)', 'es_BO' => 'Spanish (Bolivia)', 'es_CL' => 'Spanish (Chile)', 'es_CO' => 'Spanish (Colombia)', 'es_CR' => 'Spanish (Costa Rica)', 'es_DO' => 'Spanish (Dominican Republic)', 'es_EC' => 'Spanish (Ecuador)', 'es_SV' => 'Spanish (El Salvador)', 'es_GQ' => 'Spanish (Equatorial Guinea)', 'es_GT' => 'Spanish (Guatemala)', 'es_HN' => 'Spanish (Honduras)', 'es_419' => 'Spanish (Latin America)', 'es_MX' => 'Spanish (Mexico)', 'es_NI' => 'Spanish (Nicaragua)', 'es_PA' => 'Spanish (Panama)', 'es_PY' => 'Spanish (Paraguay)', 'es_PE' => 'Spanish (Peru)', 'es_PR' => 'Spanish (Puerto Rico)', 'es_ES' => 'Spanish (Spain)', 'es_US' => 'Spanish (United States)', 'es_UY' => 'Spanish (Uruguay)', 'es_VE' => 'Spanish (Venezuela)', 'es' => 'Spanish', 'sw_KE' => 'Swahili (Kenya)', 'sw_TZ' => 'Swahili (Tanzania)', 'sw' => 'Swahili', 'sv_FI' => 'Swedish (Finland)', 'sv_SE' => 'Swedish (Sweden)', 'sv' => 'Swedish', 'gsw_CH' => 'Swiss German (Switzerland)', 'gsw' => 'Swiss German', 'shi_Latn' => 'Tachelhit (Latin)', 'shi_Latn_MA' => 'Tachelhit (Latin, Morocco)', 'shi_Tfng' => 'Tachelhit (Tifinagh)', 'shi_Tfng_MA' => 'Tachelhit (Tifinagh, Morocco)', 'shi' => 'Tachelhit', 'dav_KE' => 'Taita (Kenya)', 'dav' => 'Taita', 'ta_IN' => 'Tamil (India)', 'ta_LK' => 'Tamil (Sri Lanka)', 'ta' => 'Tamil', 'te_IN' => 'Telugu (India)', 'te' => 'Telugu', 'teo_KE' => 'Teso (Kenya)', 'teo_UG' => 'Teso (Uganda)', 'teo' => 'Teso', 'th_TH' => 'Thai (Thailand)', 'th' => 'Thai', 'bo_CN' => 'Tibetan (China)', 'bo_IN' => 'Tibetan (India)', 'bo' => 'Tibetan', 'ti_ER' => 'Tigrinya (Eritrea)', 'ti_ET' => 'Tigrinya (Ethiopia)', 'ti' => 'Tigrinya', 'to_TO' => 'Tonga (Tonga)', 'to' => 'Tonga', 'tr_TR' => 'Turkish (Turkey)', 'tr' => 'Turkish', 'uk_UA' => 'Ukrainian (Ukraine)', 'uk' => 'Ukrainian', 'ur_IN' => 'Urdu (India)', 'ur_PK' => 'Urdu (Pakistan)', 'ur' => 'Urdu', 'uz_Arab' => 'Uzbek (Arabic)', 'uz_Arab_AF' => 'Uzbek (Arabic, Afghanistan)', 'uz_Cyrl' => 'Uzbek (Cyrillic)', 'uz_Cyrl_UZ' => 'Uzbek (Cyrillic, Uzbekistan)', 'uz_Latn' => 'Uzbek (Latin)', 'uz_Latn_UZ' => 'Uzbek (Latin, Uzbekistan)', 'uz' => 'Uzbek', 'vi_VN' => 'Vietnamese (Vietnam)', 'vi' => 'Vietnamese', 'vun_TZ' => 'Vunjo (Tanzania)', 'vun' => 'Vunjo', 'cy_GB' => 'Welsh (United Kingdom)', 'cy' => 'Welsh', 'yo_NG' => 'Yoruba (Nigeria)', 'yo' => 'Yoruba', 'zu_ZA' => 'Zulu (South Africa)', 'zu' => 'Zulu', ]; if (isset($_POST['add_database'])) { // Check if database has been set up already. If it has, direct user to edit directly instead. if (file_exists('config.php')) { $_SESSION['alert_message'] = "Database already configured. Any further changes should be made by editing the config.php file."; header("Location: setup.php?user"); exit; } $host = trim($_POST['host']); $database = trim($_POST['database']); $username = trim($_POST['username']); $password = trim($_POST['password']); $config_base_url = $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']); $installation_id = randomString(32); // Test database connection before writing it to config.php $conn = mysqli_connect($host, $username, $password, $database); if (!$conn) { exit("Database connection failed - please check and try again

" . mysqli_connect_error()); } $new_config = " 2097152) { $file_error = 1; } if ($file_error == 0) { // directory in which the uploaded file will be moved $upload_file_dir = "uploads/users/1/"; $dest_path = $upload_file_dir . $new_file_name; move_uploaded_file($file_tmp_path, $dest_path); //Set Avatar mysqli_query($mysqli,"UPDATE users SET user_avatar = '$new_file_name' WHERE user_id = 1"); $_SESSION['alert_message'] = 'File successfully uploaded.'; } else { $_SESSION['alert_message'] = 'There was an error moving the file to upload directory. Please make sure the upload directory is writable by web server.'; } } //Create Settings mysqli_query($mysqli,"INSERT INTO user_settings SET user_id = 1, user_role = 3"); $_SESSION['alert_message'] = "User $name created!"; header("Location: setup.php?company"); exit; } if (isset($_POST['add_company_settings'])) { $name = sanitizeInput($_POST['name']); $country = sanitizeInput($_POST['country']); $address = sanitizeInput($_POST['address']); $city = sanitizeInput($_POST['city']); $state = sanitizeInput($_POST['state']); $zip = sanitizeInput($_POST['zip']); $phone = preg_replace("/[^0-9]/", '',$_POST['phone']); $email = sanitizeInput($_POST['email']); $website = sanitizeInput($_POST['website']); $locale = sanitizeInput($_POST['locale']); $currency_code = sanitizeInput($_POST['currency_code']); mysqli_query($mysqli,"INSERT INTO companies SET company_name = '$name', company_address = '$address', company_city = '$city', company_state = '$state', company_zip = '$zip', company_country = '$country', company_phone = '$phone', company_email = '$email', company_website = '$website', company_locale = '$locale', company_currency = '$currency_code'"); //Check to see if a file is attached if ($_FILES['file']['tmp_name'] != '') { // get details of the uploaded file $file_error = 0; $file_tmp_path = $_FILES['file']['tmp_name']; $file_name = $_FILES['file']['name']; $file_size = $_FILES['file']['size']; $file_type = $_FILES['file']['type']; $file_extension = strtolower(end(explode('.',$_FILES['file']['name']))); // sanitize file-name $new_file_name = md5(time() . $file_name) . '.' . $file_extension; // check if file has one of the following extensions $allowed_file_extensions = array('jpg', 'gif', 'png'); if (in_array($file_extension,$allowed_file_extensions) === false) { $file_error = 1; } //Check File Size if ($file_size > 2097152) { $file_error = 1; } if ($file_error == 0) { // directory in which the uploaded file will be moved $upload_file_dir = "uploads/settings/"; $dest_path = $upload_file_dir . $new_file_name; move_uploaded_file($file_tmp_path, $dest_path); mysqli_query($mysqli,"UPDATE companies SET company_logo = '$new_file_name' WHERE company_id = 1"); $_SESSION['alert_message'] = 'File successfully uploaded.'; } else { $_SESSION['alert_message'] = 'There was an error moving the file to upload directory. Please make sure the upload directory is writable by web server.'; } } $latest_database_version = LATEST_DATABASE_VERSION; mysqli_query($mysqli,"INSERT INTO settings SET company_id = 1, config_current_database_version = '$latest_database_version', config_invoice_prefix = 'INV-', config_invoice_next_number = 1, config_recurring_prefix = 'REC-', config_recurring_next_number = 1, config_invoice_overdue_reminders = '1,3,7', config_quote_prefix = 'QUO-', config_quote_next_number = 1, config_default_net_terms = 30, config_ticket_next_number = 1, config_ticket_prefix = 'TCK-'"); # Used only for the install script to grab the generated cronkey and insert into the db if (file_exists("uploads/tmp/cronkey.php")) { include("uploads/tmp/cronkey.php"); mysqli_query($mysqli,"UPDATE settings SET config_cron_key = '$itflow_install_script_generated_cronkey'"); unlink('uploads/tmp/cronkey.php'); } //Create Some Data mysqli_query($mysqli,"INSERT INTO accounts SET account_name = 'Cash', account_currency_code = '$currency_code'"); mysqli_query($mysqli,"INSERT INTO categories SET category_name = 'Office Supplies', category_type = 'Expense', category_color = 'blue'"); mysqli_query($mysqli,"INSERT INTO categories SET category_name = 'Travel', category_type = 'Expense', category_color = 'red'"); mysqli_query($mysqli,"INSERT INTO categories SET category_name = 'Advertising', category_type = 'Expense', category_color = 'green'"); mysqli_query($mysqli,"INSERT INTO categories SET category_name = 'Service', category_type = 'Income', category_color = 'blue'"); mysqli_query($mysqli,"INSERT INTO categories SET category_name = 'Friend', category_type = 'Referral', category_color = 'blue'"); mysqli_query($mysqli,"INSERT INTO categories SET category_name = 'Search Engine', category_type = 'Referral', category_color = 'red'"); mysqli_query($mysqli,"INSERT INTO categories SET category_name = 'Cash', category_type = 'Payment Method', category_color = 'blue'"); mysqli_query($mysqli,"INSERT INTO categories SET category_name = 'Check', category_type = 'Payment Method', category_color = 'red'"); mysqli_query($mysqli,"INSERT INTO calendars SET calendar_name = 'Default', calendar_color = 'blue'"); $_SESSION['alert_message'] = "Company $name created!"; header("Location: setup.php?telemetry"); } if (isset($_POST['add_telemetry'])) { if (isset($_POST['share_data']) && $_POST['share_data'] == 1) { $comments = sanitizeInput($_POST['comments']); $sql = mysqli_query($mysqli,"SELECT * FROM companies WHERE company_id = 1"); $row = mysqli_fetch_array($sql); $company_name = $row['company_name']; $city = $row['company_city']; $state = $row['company_state']; $country = $row['company_country']; $currency = $row['company_currency']; $postdata = http_build_query( array( 'installation_id' => "$installation_id", 'company_name' => "$company_name", 'city' => "$city", 'state' => "$state", 'country' => "$country", 'currency' => "$currency", 'comments' => "$comments", 'collection_method' => 1 ) ); $opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $postdata ) ); $context = stream_context_create($opts); $result = file_get_contents('https://telemetry.itflow.org', false, $context); echo $result; } //final setup stages $myfile = fopen("config.php", "a"); $txt = "\$config_enable_setup = 0;\n\n"; fwrite($myfile, $txt); fclose($myfile); header("Location: login.php"); exit; } ?> ITFlow Setup
Setup Checks
  • Upload is readable and writeable
  • PHP 8.0+ Installed

Connect your Database

Database is already configured. Any further changes should be made by editing the config.php file, or deleting it and refreshing this page.

Create your first user


Company Details


Telemetry

Would you like to share some data with us?



Housekeeping: Post installation, a few additional steps are required


ITFlow Setup

Thank you for choosing to try ITFlow! Feel free to reach out on the forums if you have any questions.

A database must be created before proceeding - click on the button below to get started!


ITFlow is free software: you can redistribute and/or modify it under the terms of the GNU General Public License.
It 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.

Warning: The current directory is not writable. Ensure the webserver process has write access (chmod/chown). Check the docs for info.
"; } ?>