{ "translatorID":"1300cd65-d23a-4bbf-93e5-a3c9e00d1066", "translatorType":4, "label":"Primo", "creator":"Matt Burton, Avram Lyon, Etienne Cavalié", "target":"/primo_library/", "minVersion":"2.0", "maxVersion":"", "priority":100, "inRepository":true, "lastUpdated":"2010-06-08 07:15:00" } /* Supports Primo 2: Université de Nice, France (http://catalogue.unice.fr/) Supports Primo 3 Boston College (http://www.bc.edu/supersleuth), Oxford Libraries (http://solo.ouls.ox.ac.uk/) */ function detectWeb(doc, url) { var namespace = doc.documentElement.namespaceURI; var nsResolver = namespace ? function(prefix) { if (prefix == 'x') return namespace; else return null; } : null; if (doc.evaluate('//span[@class="results_corner EXLResultsTitleCorner"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) { return 'multiple'; } else if (doc.evaluate('//div[@class="EXLContent EXLBriefDisplay"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) { return 'multiple'; } else if (doc.evaluate('//div[@class="results2 EXLFullResultsHeader"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) { return 'book'; } else if (doc.evaluate('//div[@class="EXLContent EXLFullDisplay"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) { return 'book'; } } // There is code for handling RIS, but let's stick with PNX for now. function doWeb(doc, url) { var namespace = doc.documentElement.namespaceURI; var nsResolver = namespace ? function(prefix) { if (prefix == 'x') return namespace; else return null; } : null; var links = new Array(); if (detectWeb(doc,url) == 'multiple') { var items = new Object(); var linkIterator = ""; var titleIterator = ""; if (doc.evaluate('//h2[contains(@class, "EXLResultTitle")]/a/@href', doc, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength == 0) { // Primo v2 linkIterator = doc.evaluate('//div[contains(@class, "title")]/a/@href', doc, nsResolver, XPathResult.ANY_TYPE, null); titleIterator = doc.evaluate('//div[contains(@class, "title")]/a/span', doc, nsResolver, XPathResult.ANY_TYPE, null); } else { // Primo v3 linkIterator = doc.evaluate('//h2[contains(@class, "EXLResultTitle")]/a/@href', doc, nsResolver, XPathResult.ANY_TYPE, null); titleIterator = doc.evaluate('//h2[contains(@class, "EXLResultTitle")]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); } // try/catch for the case when there are no search results, let doc.evealuate fail quietly try { while (link = linkIterator.iterateNext(), title = titleIterator.iterateNext()) { // create an array containing the links and add '&showPnx=true' to the end var xmlLink = Zotero.Utilities.trimInternal(link.textContent)+'&showPnx=true'; Zotero.debug(xmlLink); var title = Zotero.Utilities.trimInternal(title.textContent); items[xmlLink] = title; } items = Zotero.selectItems(items); for(var link in items) { links.push(link); } } catch(e) { Zotero.debug("Search results contained zero items. "+e); return; } } else { links.push(url+'&showPnx=true'); } Zotero.Utilities.HTTP.doGet(links, function(text) { text = text.replace(/^<\?xml\s+version\s*=\s*(["'])[^\1]+\1[^?]*\?>/, ""); //because E4X is full of FAIL var xmldoc = new XML(text); if (xmldoc.display.type.toString() == 'book') { var item = new Zotero.Item("book"); } else if (xmldoc.display.type.toString() == 'audio') { var item = new Zotero.Item("audioRecording"); } else if (xmldoc.display.type.toString() == 'video') { var item = new Zotero.Item("videoRecording"); } else { var item = new Zotero.Item("document"); } item.title = xmldoc.display.title.toString(); var creators = xmldoc.display.creator.toString().replace(/\d{4}-(\d{4})?/, '').split("; "); var contributors = xmldoc.display.contributor.toString().replace(/\d{4}-(\d{4})?/, '').split("; "); if (!creators[0]) { // not available using as author instead creators = contributors; contributors = null; } for (creator in creators) { if (creators[creator]) { item.creators.push(Zotero.Utilities.cleanAuthor(creators[creator], "author")); } } for (contributor in contributors) { if (contributors[contributor]) { item.creators.push(Zotero.Utilities.cleanAuthor(contributors[contributor], "contributor")); } } var pubplace = xmldoc.display.publisher.toString().split(" : "); if (pubplace) { item.place = pubplace[0]; item.publisher = pubplace[1]; } var date = xmldoc.display.creationdate.toString(); if (date) item.date = date.match(/\d+/)[0]; var language = xmldoc.display.language.toString(); // We really hope that Primo always uses ISO 639-2 // This looks odd, but it just means that we're using the verbatim // content if it isn't in our ISO 639-2 hash. if (language) if(!(item.language = iso6392(language))) item.language = language; var pages = xmldoc.display.format.toString().match(/(\d+)\sp\./); if (pages) item.pages = pages[1]; // The identifier field is supposed to have standardized format, but // the super-tolerant idCheck should be better than a regex. // (although note that it will reject invalid ISBNs) var locators = idCheck(xmldoc.display.identifier.toString()); if (locators.isbn10) item.ISBN = locators.isbn10; if (locators.isbn13) item.ISBN = locators.isbn13; if (locators.issn) item.ISSN = locators.issn; var edition = xmldoc.display.edition.toString(); if (edition) item.edition = edition; for each (subject in xmldoc.search.subject) { item.tags.push(subject.toString()); } // does callNumber get stored anywhere else in the xml? item.callNumber = xmldoc.enrichment.classificationlcc[0]; item.complete(); }, function() {Zotero.done();}); Zotero.wait(); } /* The next two functions are logic that could be bundled away into the translator toolkit. */ // Implementation of ISBN and ISSN check-digit verification // Based on ISBN Users' Manual (http://www.isbn.org/standards/home/isbn/international/html/usm4.htm) // and the Wikipedia treatment of ISBN (http://en.wikipedia.org/wiki/International_Standard_Book_Number) // and the Wikipedia treatment of ISSN (http://en.wikipedia.org/wiki/International_Standard_Serial_Number) // This will also check ISMN validity, although it does not distinguish from their // neighbors in namespace, ISBN-13. It does not handle pre-2008 M-prefixed ISMNs; see // http://en.wikipedia.org/wiki/International_Standard_Music_Number // This does not validate multiple identifiers in one field, // but it will gracefully ignore all non-number detritus, // such as extraneous hyphens, spaces, and comments. // It currently maintains hyphens in non-initial and non-final position, // discarding consecutive ones beyond the first as well. // It also adds the customary hyphen to valid ISSNs. // Takes the first 8 valid digits and tries to read an ISSN, // takes the first 10 valid digits and tries to read an ISBN 10, // and takes the first 13 valid digits to try to read an ISBN 13 // Returns an object with three attributes: // "issn" // "isbn10" // "isbn13" // Each will be set to a valid identifier if found, and otherwise be a // boolean false. // There could conceivably be a valid ISBN-13 with an ISBN-10 // substring; this should probably be interpreted as the latter, but it is a // client UI issue. idCheck = function(isbn) { // For ISBN 10, multiple by these coefficients, take the sum mod 11 // and subtract from 11 var isbn10 = [10, 9, 8, 7, 6, 5, 4, 3, 2]; // For ISBN 13, multiple by these coefficients, take the sum mod 10 // and subtract from 10 var isbn13 = [1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3]; // For ISSN, multiply by these coefficients, take the sum mod 11 // and subtract from 11 var issn = [8, 7, 6, 5, 4, 3, 2]; // We make a single pass through the provided string, interpreting the // first 10 valid characters as an ISBN-10, and the first 13 as an // ISBN-13. We then return an array of booleans and valid detected // ISBNs. var j = 0; var sum8 = 0; var num8 = ""; var sum10 = 0; var num10 = ""; var sum13 = 0; var num13 = ""; var chars = []; for (var i=0; i < isbn.length; i++) { if (isbn.charAt(i) == " ") { // Since the space character evaluates as a number, // it is a special case. } else if (j > 0 && isbn.charAt(i) == "-" && isbn.charAt(i-1) != "-") { // Preserve hyphens, except in initial and final position // Also discard consecutive hyphens if(j < 7) num8 += "-"; if(j < 10) num10 += "-"; if(j < 13) num13 += "-"; } else if (j < 7 && ((isbn.charAt(i) - 0) == isbn.charAt(i))) { sum8 += isbn.charAt(i) * issn[j]; sum10 += isbn.charAt(i) * isbn10[j]; sum13 += isbn.charAt(i) * isbn13[j]; num8 += isbn.charAt(i); num10 += isbn.charAt(i); num13 += isbn.charAt(i); j++; } else if (j == 7 && (isbn.charAt(i) == "X" || isbn.charAt(i) == "x" || ((isbn.charAt(i) - 0) == isbn.charAt(i)))) { // In ISSN, an X represents the check digit "10". if(isbn.charAt(i) == "X" || isbn.charAt(i) == "x") { var check8 = 10; num8 += "X"; } else { var check8 = isbn.charAt(i); sum10 += isbn.charAt(i) * isbn10[j]; sum13 += isbn.charAt(i) * isbn13[j]; num8 += isbn.charAt(i); num10 += isbn.charAt(i); num13 += isbn.charAt(i); j++; } } else if (j < 9 && ((isbn.charAt(i) - 0) == isbn.charAt(i))) { sum10 += isbn.charAt(i) * isbn10[j]; sum13 += isbn.charAt(i) * isbn13[j]; num10 += isbn.charAt(i); num13 += isbn.charAt(i); j++; } else if (j == 9 && (isbn.charAt(i) == "X" || isbn.charAt(i) == "x" || ((isbn.charAt(i) - 0) == isbn.charAt(i)))) { // In ISBN-10, an X represents the check digit "10". if(isbn.charAt(i) == "X" || isbn.charAt(i) == "x") { var check10 = 10; num10 += "X"; } else { var check10 = isbn.charAt(i); sum13 += isbn.charAt(i) * isbn13[j]; num10 += isbn.charAt(i); num13 += isbn.charAt(i); j++; } } else if(j < 12 && ((isbn.charAt(i) - 0) == isbn.charAt(i))) { sum13 += isbn.charAt(i) * isbn13[j]; num13 += isbn.charAt(i); j++; } else if (j == 12 && ((isbn.charAt(i) - 0) == isbn.charAt(i))) { var check13 = isbn.charAt(i); num13 += isbn.charAt(i); } } var valid8 = ((11 - sum8 % 11) % 11) == check8; var valid10 = ((11 - sum10 % 11) % 11) == check10; var valid13 = (10 - sum13 % 10 == check13); var matches = false; // Since ISSNs have a standard hyphen placement, we can add a hyphen if (valid8 && (matches = num8.match(/([0-9]{4})([0-9]{3}[0-9Xx])/))) { num8 = matches[1] + '-' + matches[2]; } if(!valid8) {num8 = false}; if(!valid10) {num10 = false}; if(!valid13) {num13 = false}; return {"isbn10" : num10, "isbn13" : num13, "issn" : num8}; } // This function should be replaced by a lookup from the multilingual machinery in multilingual builds of Zotero // Gives name for three-letter code function iso6392(code) { MAP_ISO6391_ISO6392 = {'aar' : 'Afar', 'abk' : 'Abkhazian', 'ace' : 'Achinese', 'ach' : 'Acoli', 'ada' : 'Adangme', 'ady' : 'Adyghe; Adygei', 'afa' : 'Afro-Asiatic languages', 'afh' : 'Afrihili', 'afr' : 'Afrikaans', 'ain' : 'Ainu', 'aka' : 'Akan', 'akk' : 'Akkadian', 'alb' : 'Albanian', 'ale' : 'Aleut', 'alg' : 'Algonquian languages', 'alt' : 'Southern Altai', 'amh' : 'Amharic', 'ang' : 'English, Old (ca.450-1100)', 'anp' : 'Angika', 'apa' : 'Apache languages', 'ara' : 'Arabic', 'arc' : 'Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)', 'arg' : 'Aragonese', 'arm' : 'Armenian', 'arn' : 'Mapudungun; Mapuche', 'arp' : 'Arapaho', 'art' : 'Artificial languages', 'arw' : 'Arawak', 'asm' : 'Assamese', 'ast' : 'Asturian; Bable; Leonese; Asturleonese', 'ath' : 'Athapascan languages', 'aus' : 'Australian languages', 'ava' : 'Avaric', 'ave' : 'Avestan', 'awa' : 'Awadhi', 'aym' : 'Aymara', 'aze' : 'Azerbaijani', 'bad' : 'Banda languages', 'bai' : 'Bamileke languages', 'bak' : 'Bashkir', 'bal' : 'Baluchi', 'bam' : 'Bambara', 'ban' : 'Balinese', 'baq' : 'Basque', 'bas' : 'Basa', 'bat' : 'Baltic languages', 'bej' : 'Beja; Bedawiyet', 'bel' : 'Belarusian', 'bem' : 'Bemba', 'ben' : 'Bengali', 'ber' : 'Berber languages', 'bho' : 'Bhojpuri', 'bih' : 'Bihari languages', 'bik' : 'Bikol', 'bin' : 'Bini; Edo', 'bis' : 'Bislama', 'bla' : 'Siksika', 'bnt' : 'Bantu languages', 'tib' : 'Tibetan', 'bos' : 'Bosnian', 'bra' : 'Braj', 'bre' : 'Breton', 'btk' : 'Batak languages', 'bua' : 'Buriat', 'bug' : 'Buginese', 'bul' : 'Bulgarian', 'bur' : 'Burmese', 'byn' : 'Blin; Bilin', 'cad' : 'Caddo', 'cai' : 'Central American Indian languages', 'car' : 'Galibi Carib', 'cat' : 'Catalan; Valencian', 'cau' : 'Caucasian languages', 'ceb' : 'Cebuano', 'cel' : 'Celtic languages', 'cze' : 'Czech', 'cha' : 'Chamorro', 'chb' : 'Chibcha', 'che' : 'Chechen', 'chg' : 'Chagatai', 'chi' : 'Chinese', 'chk' : 'Chuukese', 'chm' : 'Mari', 'chn' : 'Chinook jargon', 'cho' : 'Choctaw', 'chp' : 'Chipewyan; Dene Suline', 'chr' : 'Cherokee', 'chu' : 'Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic', 'chv' : 'Chuvash', 'chy' : 'Cheyenne', 'cmc' : 'Chamic languages', 'cop' : 'Coptic', 'cor' : 'Cornish', 'cos' : 'Corsican', 'cpe' : 'Creoles and pidgins, English based', 'cpf' : 'Creoles and pidgins, French-based', 'cpp' : 'Creoles and pidgins, Portuguese-based', 'cre' : 'Cree', 'crh' : 'Crimean Tatar; Crimean Turkish', 'crp' : 'Creoles and pidgins', 'csb' : 'Kashubian', 'cus' : 'Cushitic languages', 'wel' : 'Welsh', 'cze' : 'Czech', 'dak' : 'Dakota', 'dan' : 'Danish', 'dar' : 'Dargwa', 'day' : 'Land Dayak languages', 'del' : 'Delaware', 'den' : 'Slave (Athapascan)', 'ger' : 'German', 'dgr' : 'Dogrib', 'din' : 'Dinka', 'div' : 'Divehi; Dhivehi; Maldivian', 'doi' : 'Dogri', 'dra' : 'Dravidian languages', 'dsb' : 'Lower Sorbian', 'dua' : 'Duala', 'dum' : 'Dutch, Middle (ca.1050-1350)', 'dut' : 'Dutch; Flemish', 'dyu' : 'Dyula', 'dzo' : 'Dzongkha', 'efi' : 'Efik', 'egy' : 'Egyptian (Ancient)', 'eka' : 'Ekajuk', 'gre' : 'Greek, Modern (1453-)', 'elx' : 'Elamite', 'eng' : 'English', 'enm' : 'English, Middle (1100-1500)', 'epo' : 'Esperanto', 'est' : 'Estonian', 'baq' : 'Basque', 'ewe' : 'Ewe', 'ewo' : 'Ewondo', 'fan' : 'Fang', 'fao' : 'Faroese', 'per' : 'Persian', 'fat' : 'Fanti', 'fij' : 'Fijian', 'fil' : 'Filipino; Pilipino', 'fin' : 'Finnish', 'fiu' : 'Finno-Ugrian languages', 'fon' : 'Fon', 'fre' : 'French', 'fre' : 'French', 'frm' : 'French, Middle (ca.1400-1600)', 'fro' : 'French, Old (842-ca.1400)', 'frr' : 'Northern Frisian', 'frs' : 'Eastern Frisian', 'fry' : 'Western Frisian', 'ful' : 'Fulah', 'fur' : 'Friulian', 'gaa' : 'Ga', 'gay' : 'Gayo', 'gba' : 'Gbaya', 'gem' : 'Germanic languages', 'geo' : 'Georgian', 'ger' : 'German', 'gez' : 'Geez', 'gil' : 'Gilbertese', 'gla' : 'Gaelic; Scottish Gaelic', 'gle' : 'Irish', 'glg' : 'Galician', 'glv' : 'Manx', 'gmh' : 'German, Middle High (ca.1050-1500)', 'goh' : 'German, Old High (ca.750-1050)', 'gon' : 'Gondi', 'gor' : 'Gorontalo', 'got' : 'Gothic', 'grb' : 'Grebo', 'grc' : 'Greek, Ancient (to 1453)', 'gre' : 'Greek, Modern (1453-)', 'grn' : 'Guarani', 'gsw' : 'Swiss German; Alemannic; Alsatian', 'guj' : 'Gujarati', 'gwi' : 'Gwich\'in', 'hai' : 'Haida', 'hat' : 'Haitian; Haitian Creole', 'hau' : 'Hausa', 'haw' : 'Hawaiian', 'heb' : 'Hebrew', 'her' : 'Herero', 'hil' : 'Hiligaynon', 'him' : 'Himachali languages; Western Pahari languages', 'hin' : 'Hindi', 'hit' : 'Hittite', 'hmn' : 'Hmong', 'hmo' : 'Hiri Motu', 'hrv' : 'Croatian', 'hsb' : 'Upper Sorbian', 'hun' : 'Hungarian', 'hup' : 'Hupa', 'arm' : 'Armenian', 'iba' : 'Iban', 'ibo' : 'Igbo', 'ice' : 'Icelandic', 'ido' : 'Ido', 'iii' : 'Sichuan Yi; Nuosu', 'ijo' : 'Ijo languages', 'iku' : 'Inuktitut', 'ile' : 'Interlingue; Occidental', 'ilo' : 'Iloko', 'ina' : 'Interlingua (International Auxiliary Language Association)', 'inc' : 'Indic languages', 'ind' : 'Indonesian', 'ine' : 'Indo-European languages', 'inh' : 'Ingush', 'ipk' : 'Inupiaq', 'ira' : 'Iranian languages', 'iro' : 'Iroquoian languages', 'ice' : 'Icelandic', 'ita' : 'Italian', 'jav' : 'Javanese', 'jbo' : 'Lojban', 'jpn' : 'Japanese', 'jpr' : 'Judeo-Persian', 'jrb' : 'Judeo-Arabic', 'kaa' : 'Kara-Kalpak', 'kab' : 'Kabyle', 'kac' : 'Kachin; Jingpho', 'kal' : 'Kalaallisut; Greenlandic', 'kam' : 'Kamba', 'kan' : 'Kannada', 'kar' : 'Karen languages', 'kas' : 'Kashmiri', 'geo' : 'Georgian', 'kau' : 'Kanuri', 'kaw' : 'Kawi', 'kaz' : 'Kazakh', 'kbd' : 'Kabardian', 'kha' : 'Khasi', 'khi' : 'Khoisan languages', 'khm' : 'Central Khmer', 'kho' : 'Khotanese; Sakan', 'kik' : 'Kikuyu; Gikuyu', 'kin' : 'Kinyarwanda', 'kir' : 'Kirghiz; Kyrgyz', 'kmb' : 'Kimbundu', 'kok' : 'Konkani', 'kom' : 'Komi', 'kon' : 'Kongo', 'kor' : 'Korean', 'kos' : 'Kosraean', 'kpe' : 'Kpelle', 'krc' : 'Karachay-Balkar', 'krl' : 'Karelian', 'kro' : 'Kru languages', 'kru' : 'Kurukh', 'kua' : 'Kuanyama; Kwanyama', 'kum' : 'Kumyk', 'kur' : 'Kurdish', 'kut' : 'Kutenai', 'lad' : 'Ladino', 'lah' : 'Lahnda', 'lam' : 'Lamba', 'lao' : 'Lao', 'lat' : 'Latin', 'lav' : 'Latvian', 'lez' : 'Lezghian', 'lim' : 'Limburgan; Limburger; Limburgish', 'lin' : 'Lingala', 'lit' : 'Lithuanian', 'lol' : 'Mongo', 'loz' : 'Lozi', 'ltz' : 'Luxembourgish; Letzeburgesch', 'lua' : 'Luba-Lulua', 'lub' : 'Luba-Katanga', 'lug' : 'Ganda', 'lui' : 'Luiseno', 'lun' : 'Lunda', 'luo' : 'Luo (Kenya and Tanzania)', 'lus' : 'Lushai', 'mac' : 'Macedonian', 'mad' : 'Madurese', 'mag' : 'Magahi', 'mah' : 'Marshallese', 'mai' : 'Maithili', 'mak' : 'Makasar', 'mal' : 'Malayalam', 'man' : 'Mandingo', 'mao' : 'Maori', 'map' : 'Austronesian languages', 'mar' : 'Marathi', 'mas' : 'Masai', 'may' : 'Malay', 'mdf' : 'Moksha', 'mdr' : 'Mandar', 'men' : 'Mende', 'mga' : 'Irish, Middle (900-1200)', 'mic' : 'Mi\'kmaq; Micmac', 'min' : 'Minangkabau', 'mis' : 'Uncoded languages', 'mac' : 'Macedonian', 'mkh' : 'Mon-Khmer languages', 'mlg' : 'Malagasy', 'mlt' : 'Maltese', 'mnc' : 'Manchu', 'mni' : 'Manipuri', 'mno' : 'Manobo languages', 'moh' : 'Mohawk', 'mon' : 'Mongolian', 'mos' : 'Mossi', 'mao' : 'Maori', 'may' : 'Malay', 'mul' : 'Multiple languages', 'mun' : 'Munda languages', 'mus' : 'Creek', 'mwl' : 'Mirandese', 'mwr' : 'Marwari', 'bur' : 'Burmese', 'myn' : 'Mayan languages', 'myv' : 'Erzya', 'nah' : 'Nahuatl languages', 'nai' : 'North American Indian languages', 'nap' : 'Neapolitan', 'nau' : 'Nauru', 'nav' : 'Navajo; Navaho', 'nbl' : 'Ndebele, South; South Ndebele', 'nde' : 'Ndebele, North; North Ndebele', 'ndo' : 'Ndonga', 'nds' : 'Low German; Low Saxon; German, Low; Saxon, Low', 'nep' : 'Nepali', 'new' : 'Nepal Bhasa; Newari', 'nia' : 'Nias', 'nic' : 'Niger-Kordofanian languages', 'niu' : 'Niuean', 'dut' : 'Dutch; Flemish', 'nno' : 'Norwegian Nynorsk; Nynorsk, Norwegian', 'nob' : 'Bokmål, Norwegian; Norwegian Bokmål', 'nog' : 'Nogai', 'non' : 'Norse, Old', 'nor' : 'Norwegian', 'nqo' : 'N\'Ko', 'nso' : 'Pedi; Sepedi; Northern Sotho', 'nub' : 'Nubian languages', 'nwc' : 'Classical Newari; Old Newari; Classical Nepal Bhasa', 'nya' : 'Chichewa; Chewa; Nyanja', 'nym' : 'Nyamwezi', 'nyn' : 'Nyankole', 'nyo' : 'Nyoro', 'nzi' : 'Nzima', 'oci' : 'Occitan (post 1500)', 'oji' : 'Ojibwa', 'ori' : 'Oriya', 'orm' : 'Oromo', 'osa' : 'Osage', 'oss' : 'Ossetian; Ossetic', 'ota' : 'Turkish, Ottoman (1500-1928)', 'oto' : 'Otomian languages', 'paa' : 'Papuan languages', 'pag' : 'Pangasinan', 'pal' : 'Pahlavi', 'pam' : 'Pampanga; Kapampangan', 'pan' : 'Panjabi; Punjabi', 'pap' : 'Papiamento', 'pau' : 'Palauan', 'peo' : 'Persian, Old (ca.600-400 B.C.)', 'per' : 'Persian', 'phi' : 'Philippine languages', 'phn' : 'Phoenician', 'pli' : 'Pali', 'pol' : 'Polish', 'pon' : 'Pohnpeian', 'por' : 'Portuguese', 'pra' : 'Prakrit languages', 'pro' : 'Provençal, Old (to 1500);Occitan, Old (to 1500)', 'pus' : 'Pushto; Pashto', 'qaa' : 'Reserved for local use', 'que' : 'Quechua', 'raj' : 'Rajasthani', 'rap' : 'Rapanui', 'rar' : 'Rarotongan; Cook Islands Maori', 'roa' : 'Romance languages', 'roh' : 'Romansh', 'rom' : 'Romany', 'rum' : 'Romanian; Moldavian; Moldovan', 'rum' : 'Romanian; Moldavian; Moldovan', 'run' : 'Rundi', 'rup' : 'Aromanian; Arumanian; Macedo-Romanian', 'rus' : 'Russian', 'sad' : 'Sandawe', 'sag' : 'Sango', 'sah' : 'Yakut', 'sai' : 'South American Indian languages', 'sal' : 'Salishan languages', 'sam' : 'Samaritan Aramaic', 'san' : 'Sanskrit', 'sas' : 'Sasak', 'sat' : 'Santali', 'scn' : 'Sicilian', 'sco' : 'Scots', 'sel' : 'Selkup', 'sem' : 'Semitic languages', 'sga' : 'Irish, Old (to 900)', 'sgn' : 'Sign Languages', 'shn' : 'Shan', 'sid' : 'Sidamo', 'sin' : 'Sinhala; Sinhalese', 'sio' : 'Siouan languages', 'sit' : 'Sino-Tibetan languages', 'sla' : 'Slavic languages', 'slo' : 'Slovak', 'slo' : 'Slovak', 'slv' : 'Slovenian', 'sma' : 'Southern Sami', 'sme' : 'Northern Sami', 'smi' : 'Sami languages', 'smj' : 'Lule Sami', 'smn' : 'Inari Sami', 'smo' : 'Samoan', 'sms' : 'Skolt Sami', 'sna' : 'Shona', 'snd' : 'Sindhi', 'snk' : 'Soninke', 'sog' : 'Sogdian', 'som' : 'Somali', 'son' : 'Songhai languages', 'sot' : 'Sotho, Southern', 'spa' : 'Spanish; Castilian', 'alb' : 'Albanian', 'srd' : 'Sardinian', 'srn' : 'Sranan Tongo', 'srp' : 'Serbian', 'srr' : 'Serer', 'ssa' : 'Nilo-Saharan languages', 'ssw' : 'Swati', 'suk' : 'Sukuma', 'sun' : 'Sundanese', 'sus' : 'Susu', 'sux' : 'Sumerian', 'swa' : 'Swahili', 'swe' : 'Swedish', 'syc' : 'Classical Syriac', 'syr' : 'Syriac', 'tah' : 'Tahitian', 'tai' : 'Tai languages', 'tam' : 'Tamil', 'tat' : 'Tatar', 'tel' : 'Telugu', 'tem' : 'Timne', 'ter' : 'Tereno', 'tet' : 'Tetum', 'tgk' : 'Tajik', 'tgl' : 'Tagalog', 'tha' : 'Thai', 'tib' : 'Tibetan', 'tig' : 'Tigre', 'tir' : 'Tigrinya', 'tiv' : 'Tiv', 'tkl' : 'Tokelau', 'tlh' : 'Klingon; tlhIngan-Hol', 'tli' : 'Tlingit', 'tmh' : 'Tamashek', 'tog' : 'Tonga (Nyasa)', 'ton' : 'Tonga (Tonga Islands)', 'tpi' : 'Tok Pisin', 'tsi' : 'Tsimshian', 'tsn' : 'Tswana', 'tso' : 'Tsonga', 'tuk' : 'Turkmen', 'tum' : 'Tumbuka', 'tup' : 'Tupi languages', 'tur' : 'Turkish', 'tut' : 'Altaic languages', 'tvl' : 'Tuvalu', 'twi' : 'Twi', 'tyv' : 'Tuvinian', 'udm' : 'Udmurt', 'uga' : 'Ugaritic', 'uig' : 'Uighur; Uyghur', 'ukr' : 'Ukrainian', 'umb' : 'Umbundu', 'und' : 'Undetermined', 'urd' : 'Urdu', 'uzb' : 'Uzbek', 'vai' : 'Vai', 'ven' : 'Venda', 'vie' : 'Vietnamese', 'vol' : 'Volapük', 'vot' : 'Votic', 'wak' : 'Wakashan languages', 'wal' : 'Wolaitta; Wolaytta', 'war' : 'Waray', 'was' : 'Washo', 'wel' : 'Welsh', 'wen' : 'Sorbian languages', 'wln' : 'Walloon', 'wol' : 'Wolof', 'xal' : 'Kalmyk; Oirat', 'xho' : 'Xhosa', 'yao' : 'Yao', 'yap' : 'Yapese', 'yid' : 'Yiddish', 'yor' : 'Yoruba', 'ypk' : 'Yupik languages', 'zap' : 'Zapotec', 'zbl' : 'Blissymbols; Blissymbolics; Bliss', 'zen' : 'Zenaga', 'zha' : 'Zhuang; Chuang', 'chi' : 'Chinese', 'znd' : 'Zande languages', 'zul' : 'Zulu', 'zun' : 'Zuni', 'zxx' : 'No linguistic content; Not applicable', 'zza' : 'Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki'}; var lang; return ((lang = MAP_ISO6391_ISO6392[code]) !== null) ? lang : false; }