module Rules

  ISOLANG = {
     '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;Bangla',
     '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 (Farsi)',
     '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',
     'id' => 'Indonesian',
     'ie' => 'Interlingue',
     'ik' => 'Inupiak',
     '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',
     'x'  => 'a user-defined language',
     'xx' => 'a user-defined language',
     
     'abk' => 'Abkhazian',
     'ace' => 'Achinese',
     'ach' => 'Acoli',
     'ada' => 'Adangme',
     'ady' => 'Adygei',
     'ady' => 'Adyghe',
     'aar' => 'Afar',
     'afh' => 'Afrihili',
     'afr' => 'Afrikaans',
     'afa' => 'Afro-Asiatic (Other)',
     'aka' => 'Akan',
     'akk' => 'Akkadian',
     'alb/sqi' => 'Albanian',
     'ale' => 'Aleut',
     'alg' => 'Algonquian languages',
     'tut' => 'Altaic (Other)',
     'amh' => 'Amharic',
     'apa' => 'Apache languages',
     'ara' => 'Arabic',
     'arg' => 'Aragonese',
     'arc' => 'Aramaic',
     'arp' => 'Arapaho',
     'arn' => 'Araucanian',
     'arw' => 'Arawak',
     'arm/hye' => 'Armenian',
     'art' => 'Artificial (Other)',
     'asm' => 'Assamese',
     'ast' => 'Asturian',
     'ath' => 'Athapascan languages',
     'aus' => 'Australian languages',
     'map' => 'Austronesian (Other)',
     'ava' => 'Avaric',
     'ave' => 'Avestan',
     'awa' => 'Awadhi',
     'aym' => 'Aymara',
     'aze' => 'Azerbaijani',
     'ast' => 'Bable',
     'ban' => 'Balinese',
     'bat' => 'Baltic (Other)',
     'bal' => 'Baluchi',
     'bam' => 'Bambara',
     'bai' => 'Bamileke languages',
     'bad' => 'Banda',
     'bnt' => 'Bantu (Other)',
     'bas' => 'Basa',
     'bak' => 'Bashkir',
     'baq/eus' => 'Basque',
     'btk' => 'Batak (Indonesia)',
     'bej' => 'Beja',
     'bel' => 'Belarusian',
     'bem' => 'Bemba',
     'ben' => 'Bengali',
     'ber' => 'Berber (Other)',
     'bho' => 'Bhojpuri',
     'bih' => 'Bihari',
     'bik' => 'Bikol',
     'byn' => 'Bilin',
     'bin' => 'Bini',
     'bis' => 'Bislama',
     'byn' => 'Blin',
     'nob' => 'Bokmal, Norwegian',
     'bos' => 'Bosnian',
     'bra' => 'Braj',
     'bre' => 'Breton',
     'bug' => 'Buginese',
     'bul' => 'Bulgarian',
     'bua' => 'Buriat',
     'bur/mya' => 'Burmese',
     'cad' => 'Caddo',
     'car' => 'Carib',
     'spa' => 'Castilian',
     'cat' => 'Catalan',
     'cau' => 'Caucasian (Other)',
     'ceb' => 'Cebuano',
     'cel' => 'Celtic (Other)',
     'cai' => 'Central American Indian (Other)',
     'chg' => 'Chagatai',
     'cmc' => 'Chamic languages',
     'cha' => 'Chamorro',
     'che' => 'Chechen',
     'chr' => 'Cherokee',
     'nya' => 'Chewa',
     'chy' => 'Cheyenne',
     'chb' => 'Chibcha',
     'nya' => 'Chichewa',
     'chi/zho' => 'Chinese',
     'chn' => 'Chinook jargon',
     'chp' => 'Chipewyan',
     'cho' => 'Choctaw',
     'zha' => 'Chuang',
     'chu' => 'Church Slavic',
     'chu' => 'Church Slavonic',
     'chk' => 'Chuukese',
     'chv' => 'Chuvash',
     'cop' => 'Coptic',
     'cor' => 'Cornish',
     'cos' => 'Corsican',
     'cre' => 'Cree',
     'mus' => 'Creek',
     'crp' => 'Creoles and pidgins(Other)',
     'cpe' => 'Creoles and pidgins, English-based (Other)',
     'cpf' => 'Creoles and pidgins, French-based (Other)',
     'cpp' => 'Creoles and pidgins, Portuguese-based (Other)',
     'crh' => 'Crimean Tatar',
     'crh' => 'Crimean Turkish',
     'scr/hrv' => 'Croatian',
     'cus' => 'Cushitic (Other)',
     'cze/ces' => 'Czech',
     'dak' => 'Dakota',
     'dan' => 'Danish',
     'dar' => 'Dargwa',
     'day' => 'Dayak',
     'del' => 'Delaware',
     'din' => 'Dinka',
     'div' => 'Divehi',
     'doi' => 'Dogri',
     'dgr' => 'Dogrib',
     'dra' => 'Dravidian (Other)',
     'dua' => 'Duala',
     'dut/nld' => 'Dutch',
     'dum' => 'Dutch, Middle (ca. 1050-1350)',
     'dyu' => 'Dyula',
     'dzo' => 'Dzongkha',
     'efi' => 'Efik',
     'egy' => 'Egyptian (Ancient)',
     'eka' => 'Ekajuk',
     'elx' => 'Elamite',
     'eng' => 'English',
     'enm' => 'English, Middle (1100-1500)',
     'ang' => 'English, Old (ca.450-1100)',
     'myv' => 'Erzya',
     'epo' => 'Esperanto',
     'est' => 'Estonian',
     'ewe' => 'Ewe',
     'ewo' => 'Ewondo',
     'fan' => 'Fang',
     'fat' => 'Fanti',
     'fao' => 'Faroese',
     'fij' => 'Fijian',
     'fin' => 'Finnish',
     'fiu' => 'Finno-Ugrian (Other)',
     'fon' => 'Fon',
     'fre/fra' => 'French',
     'frm' => 'French, Middle (ca.1400-1600)',
     'fro' => 'French, Old (842-ca.1400)',
     'fry' => 'Frisian',
     'fur' => 'Friulian',
     'ful' => 'Fulah',
     'gaa' => 'Ga',
     'gla' => 'Gaelic',
     'glg' => 'Gallegan',
     'lug' => 'Ganda',
     'gay' => 'Gayo',
     'gba' => 'Gbaya',
     'gez' => 'Geez',
     'geo/kat' => 'Georgian',
     'ger/deu' => 'German',
     'nds' => 'German, Low',
     'gmh' => 'German, Middle High (ca.1050-1500)',
     'goh' => 'German, Old High (ca.750-1050)',
     'gem' => 'Germanic (Other)',
     'kik' => 'Gikuyu',
     'gil' => 'Gilbertese',
     'gon' => 'Gondi',
     'gor' => 'Gorontalo',
     'got' => 'Gothic',
     'grb' => 'Grebo',
     'grc' => 'Greek, Ancient (to 1453)',
     'gre/ell' => 'Greek, Modern (1453-)',
     'grn' => 'Guarani',
     'guj' => 'Gujarati',
     'gwi' => 'Gwich\'in',
     'hai' => 'Haida',
     'hat' => 'Haitian',
     'hat' => 'Haitian Creole',
     'hau' => 'Hausa',
     'haw' => 'Hawaiian',
     'heb' => 'Hebrew',
     'her' => 'Herero',
     'hil' => 'Hiligaynon',
     'him' => 'Himachali',
     'hin' => 'Hindi',
     'hmo' => 'Hiri Motu',
     'hit' => 'Hittite',
     'hmn' => 'Hmong',
     'hun' => 'Hungarian',
     'hup' => 'Hupa',
     'iba' => 'Iban',
     'ice/isl' => 'Icelandic',
     'ido' => 'Ido',
     'ibo' => 'Igbo',
     'ijo' => 'Ijo',
     'ilo' => 'Iloko',
     'smn' => 'Inari Sami',
     'inc' => 'Indic (Other)',
     'ine' => 'Indo-European (Other)',
     'ind' => 'Indonesian',
     'inh' => 'Ingush',
     'ina' => 'Interlingua (International Auxiliary Language Association)',
     'ile' => 'Interlingue',
     'iku' => 'Inuktitut',
     'ipk' => 'Inupiaq',
     'ira' => 'Iranian (Other)',
     'gle' => 'Irish',
     'mga' => 'Irish, Middle (900-1200)',
     'sga' => 'Irish, Old (to 900)',
     'iro' => 'Iroquoian languages',
     'ita' => 'Italian',
     'jpn' => 'Japanese',
     'jav' => 'Javanese',
     'jrb' => 'Judeo-Arabic',
     'jpr' => 'Judeo-Persian',
     'kbd' => 'Kabardian',
     'kab' => 'Kabyle',
     'kac' => 'Kachin',
     'kal' => 'Kalaallisut',
     'xal' => 'Kalmyk',
     'kam' => 'Kamba',
     'kan' => 'Kannada',
     'kau' => 'Kanuri',
     'krc' => 'Karachay-Balkar',
     'kaa' => 'Kara-Kalpak',
     'kar' => 'Karen',
     'kas' => 'Kashmiri',
     'csb' => 'Kashubian',
     'kaw' => 'Kawi',
     'kaz' => 'Kazakh',
     'kha' => 'Khasi',
     'khm' => 'Khmer',
     'khi' => 'Khoisan (Other)',
     'kho' => 'Khotanese',
     'kik' => 'Kikuyu',
     'kmb' => 'Kimbundu',
     'kin' => 'Kinyarwanda',
     'kir' => 'Kirghiz',
     'kom' => 'Komi',
     'kon' => 'Kongo',
     'kok' => 'Konkani',
     'kor' => 'Korean',
     'kos' => 'Kosraean',
     'kpe' => 'Kpelle',
     'kro' => 'Kru',
     'kua' => 'Kuanyama',
     'kum' => 'Kumyk',
     'kur' => 'Kurdish',
     'kru' => 'Kurukh',
     'kut' => 'Kutenai',
     'kua' => 'Kwanyama',
     'lad' => 'Ladino',
     'lah' => 'Lahnda',
     'lam' => 'Lamba',
     'lao' => 'Lao',
     'lat' => 'Latin',
     'lav' => 'Latvian',
     'ltz' => 'Letzeburgesch',
     'lez' => 'Lezghian',
     'lim' => 'Limburgan',
     'lim' => 'Limburger',
     'lim' => 'limburgish',
     'lin' => 'Lingala',
     'lit' => 'Lithuanian',
     'jbo' => 'Lojban',
     'nds' => 'Low German',
     'nds' => 'Low Saxon',
     'dsb' => 'Lower Sorbian',
     'loz' => 'Lozi',
     'lub' => 'Luba-Katanga',
     'lua' => 'Luba-Lulua',
     'lui' => 'Luiseno',
     'smj' => 'Lule Sami',
     'lun' => 'Lunda',
     'luo' => 'Luo (Kenya and Tanzania)',
     'ltz' => 'Luxembourgish',
     'lus' => 'Lushai',
     'mac/mkd' => 'Macedonian',
     'mad' => 'Madurese',
     'mag' => 'Magahi',
     'mai' => 'Maithili',
     'mak' => 'Makasar',
     'mlg' => 'Malagasy',
     'may/msa' => 'Malay',
     'mal' => 'Malayalam',
     'mlt' => 'Maltese',
     'mnc' => 'Manchu',
     'mdr' => 'Mandar',
     'man' => 'Mandingo',
     'mni' => 'Manipuri',
     'mno' => 'Manobo languages',
     'glv' => 'Manx',
     'mao/mri' => 'Maori',
     'mar' => 'Marathi',
     'chm' => 'Mari',
     'mah' => 'Marshallese',
     'mwr' => 'Marwari',
     'mas' => 'Masai',
     'myn' => 'Mayan languages',
     'men' => 'Mende',
     'mic' => 'Micmac',
     'min' => 'Minangkabau',
     'mis' => 'Miscellaneous languages',
     'moh' => 'Mohawk',
     'mdf' => 'Moksha',
     'mol' => 'Moldavian',
     'mkh' => 'Mon-Khmer (Other)',
     'lol' => 'Mongo',
     'mon' => 'Mongolian',
     'mos' => 'Mossi',
     'mul' => 'Multiple languages',
     'mun' => 'Munda languages',
     'nah' => 'Nahuatl',
     'nau' => 'Nauru',
     'nav' => 'Navaho',
     'nav' => 'Navajo',
     'nde' => 'Ndebele, North',
     'nbl' => 'Ndebele, South',
     'ndo' => 'Ndonga',
     'nap' => 'Neapolitan',
     'nep' => 'Nepali',
     'new' => 'Newari',
     'nia' => 'Nias',
     'nic' => 'Niger-Kordofanian (Other)',
     'ssa' => 'Nilo-Saharan (Other)',
     'niu' => 'Niuean',
     'nog' => 'Nogai',
     'non' => 'Norse, Old',
     'nai' => 'North American Indian (Other)',
     'sme' => 'Northern Sami',
     'nde' => 'North Ndebele',
     'nor' => 'Norwegian',
     'nob' => 'Norwegian Bokmal',
     'nno' => 'Norwegian Nynorsk',
     'nub' => 'Nubian languages',
     'nym' => 'Nyamwezi',
     'nya' => 'Nyanja',
     'nyn' => 'Nyankole',
     'nno' => 'Nynorsk, Norwegian',
     'nyo' => 'Nyoro',
     'nzi' => 'Nzima',
     'oci' => 'Occitan (post 1500)',
     'oji' => 'Ojibwa',
     'chu' => 'Old Bulgarian',
     'chu' => 'Old Church Slavonic',
     'chu' => 'Old Slavonic',
     'ori' => 'Oriya',
     'orm' => 'Oromo',
     'osa' => 'Osage',
     'oss' => 'Ossetian',
     'oss' => 'Ossetic',
     'oto' => 'Otomian languages',
     'pal' => 'Pahlavi',
     'pau' => 'Palauan',
     'pli' => 'Pali',
     'pam' => 'Pampanga',
     'pag' => 'Pangasinan',
     'pan' => 'Panjabi',
     'pap' => 'Papiamento',
     'paa' => 'Papuan (Other)',
     'per/fas' => 'Persian',
     'peo' => 'Persian, Old (ca.600-400)',
     'phi' => 'Philippine (Other)',
     'phn' => 'Phoenician',
     'pon' => 'Pohnpeian',
     'pol' => 'Polish',
     'por' => 'Portuguese',
     'pra' => 'Prakrit languages',
     'oci' => 'Provencal',
     'pro' => 'Provencal, Old (to 1500)',
     'pan' => 'Punjabi',
     'pus' => 'Pushto',
     'que' => 'Quechua',
     'roh' => 'Raeto-Romance',
     'raj' => 'Rajasthani',
     'rap' => 'Rapanui',
     'rar' => 'Rarotongan',
     'qaa-qtz' => 'Reserved for local user',
     'roa' => 'Romance (Other)',
     'rum/ron' => 'Romanian',
     'rom' => 'Romany',
     'run' => 'Rundi',
     'rus' => 'Russian',
     'sal' => 'Salishan languages',
     'sam' => 'Samaritan Aramaic',
     'smi' => 'Sami languages (Other)',
     'smo' => 'Samoan',
     'sad' => 'Sandawe',
     'sag' => 'Sango',
     'san' => 'Sanskrit',
     'sat' => 'Santali',
     'srd' => 'Sardinian',
     'sas' => 'Sasak',
     'nds' => 'Saxon, Low',
     'sco' => 'Scots',
     'gla' => 'Scottish Gaelic',
     'sel' => 'Selkup',
     'sem' => 'Semitic (Other)',
     'scc/srp' => 'Serbian',
     'srr' => 'Serer',
     'shn' => 'Shan',
     'sna' => 'Shona',
     'iii' => 'Sichuan Yi',
     'sid' => 'Sidamo',
     'sgn' => 'Sign languages',
     'bla' => 'Siksika',
     'snd' => 'Sindhi',
     'sin' => 'Sinhalese',
     'sit' => 'Sino-Tibetan (Other)',
     'sio' => 'Siouan languages',
     'sms' => 'Skolt Sami',
     'den' => 'Slave (Athapascan)',
     'sla' => 'Slavic (Other)',
     'slo/slk' => 'Slovak',
     'slv' => 'Slovenian',
     'sog' => 'Sogdian',
     'som' => 'Somali',
     'son' => 'Songhai',
     'snk' => 'Soninke',
     'wen' => 'Sorbian languages',
     'nso' => 'Sotho, Northern',
     'sot' => 'Sotho, Southern',
     'sai' => 'South American Indian (Other)',
     'sma' => 'Southern Sami',
     'nbl' => 'South Ndebele',
     'spa' => 'Spanish',
     'suk' => 'Sukuma',
     'sux' => 'Sumerian',
     'sun' => 'Sundanese',
     'sus' => 'Susu',
     'swa' => 'Swahili',
     'ssw' => 'Swati',
     'swe' => 'Swedish',
     'syr' => 'Syriac',
     'tgl' => 'Tagalog',
     'tah' => 'Tahitian',
     'tai' => 'Tai (Other)',
     'tgk' => 'Tajik',
     'tmh' => 'Tamashek',
     'tam' => 'Tamil',
     'tat' => 'Tatar',
     'tel' => 'Telugu',
     'ter' => 'Tereno',
     'tet' => 'Tetum',
     'tha' => 'Thai',
     'tib/bod' => 'Tibetan',
     'tig' => 'Tigre',
     'tir' => 'Tigrinya',
     'tem' => 'Timne',
     'tiv' => 'Tiv',
     'tli' => 'Tlingit',
     'tpi' => 'Tok Pisin',
     'tkl' => 'Tokelau',
     'tog' => 'Tonga (Nyasa)',
     'ton' => 'Tonga (Tonga Islands)',
     'tsi' => 'Tsimshian',
     'tso' => 'Tsonga',
     'tsn' => 'Tswana',
     'tum' => 'Tumbuka',
     'tup' => 'Tupi languages',
     'tur' => 'Turkish',
     'ota' => 'Turkish, Ottoman (1500-1928)',
     'tuk' => 'Turkmen',
     'tvl' => 'Tuvalu',
     'tyv' => 'Tuvinian',
     'twi' => 'Twi',
     'udm' => 'Udmurt',
     'uga' => 'Ugaritic',
     'uig' => 'Uighur',
     'ukr' => 'Ukrainian',
     'umb' => 'Umbundu',
     'und' => 'Undetermined',
     'hsb' => 'Upper Sorbian',
     'urd' => 'Urdu',
     'uzb' => 'Uzbek',
     'vai' => 'Vai',
     'cat' => 'Valencian',
     'ven' => 'Venda',
     'vie' => 'Vietnamese',
     'vol' => 'Volapuk',
     'vot' => 'Votic',
     'wak' => 'Wakashan languages',
     'wal' => 'Walamo',
     'wln' => 'Walloon',
     'war' => 'Waray',
     'was' => 'Washo',
     'wel/cym' => 'Welsh',
     'wol' => 'Wolof',
     'xho' => 'Xhosa',
     'sah' => 'Yakut',
     'yao' => 'Yao',
     'yap' => 'Yapese',
     'yid' => 'Yiddish',
     'yor' => 'Yoruba',
     'ypk' => 'Yupik languages',
     'znd' => 'Zande',
     'zap' => 'Zapotec',
     'zen' => 'Zenaga',
     'zha' => 'Zhuang',
     'zul' => 'Zulu',
     'zun' => 'Zuni' }

  class Iso639 < DataElement
    def validate value
      if ISOLANG.keys.include? value.split('-')[0].downcase
        log :ValidLanguage
      else
        log :InvalidLanguage
      end
    end
  end

end
