MediaWiki:Gadget-TranslationAdder-Data.js: difference between revisions

From Wiktionary, the free dictionary
Jump to navigation Jump to search
Content deleted Content added
convert Latin to Cyrillic characters in entry name replacements for Ossetian (os) (Special:Diff/52489853)
add Sanskrit (sa) genders to Pali (pi): Wiktionary:Grease pit/2019/May#Pali genders
Line 654: Line 654:
},
},
pi: {
pi: {
g: ["m", "f", "n", "m-p", "f-p", "n-p"],
haswikt: 1
haswikt: 1
},
},

Revision as of 00:47, 23 May 2019

// {{documentation}}
// <nowiki>
// implicit dependencies : ext.gadget.LanguageUtils
/* jshint maxerr:1048576, strict:true, undef:true, latedef:true, es5:true */
/* global $, ScriptUtils */

window.LangMetadata = function() {
	//Singleton
	if (arguments.callee.instance)
		return arguments.callee.instance;
	else
		arguments.callee.instance = this;

	// {{{ Metadata dictionaries
	// FIXME: Is it possible to query this information directly from [[Module:languages]]?
	var metadata = {
		aa: {
			haswikt: 1,
			sc: ["Latn", "Ethi"]
		},
		ab: {
			haswikt: 1,
			sc: ["Cyrl", "Latn", "Geor"]
		},
		aer: {
			sc: "Latn"
		},
		af: {
			g: ["s", "p"],
			haswikt: 1
		},
		ak: {
			haswikt: 1
		},
		akk: {
			g: ["m", "f", "m-p", "f-p"],
			sc: "Xsux"
		},
		als: {
			haswikt: 1
		},
		am: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1,
			sc: "Ethi"
		},
		an: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		ang: {
			alt: 1,
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1
		},
		ar: {
			alt: 1,
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1,
			sc: "Arab"
		},
		arc: {
			g: ["m", "f", "m-p", "f-p"],
			sc: ["Hebr", "Syrc"]
		},
		are: {},
		arz: {
			alt: 1,
			g: ["m", "f", "m-p", "f-p"],
			sc: "Arab"
		},
		as: {
			haswikt: 1,
			sc: "Beng"
		},
		ast: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		av: {
			haswikt: 1
		},
		ay: {
			haswikt: 1
		},
		az: {
			g: ["s", "p"],
			haswikt: 1,
			sc: ["Latn", "Cyrl", "Arab"]
		},
		ba: {
			sc: "Cyrl"
		},
		bar: {},
		"bat-smg": {
			g: ["m", "f", "m-p", "f-p"]
		},
		bbl: {
			sc: "Geor"
		},
		be: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1,
			sc: "Cyrl"
		},
		"be-x-old": {
			sc: "Cyrl"
		},
		bg: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1,
			sc: "Cyrl"
		},
		bh: {
			haswikt: 1,
			sc: "Deva"
		},
		bhb: {
			sc: "Deva"
		},
		bi: {
			haswikt: 1
		},
		blt: {
			sc: "Tavt"
		},
		bm: {
			haswikt: 1,
			sc: ["Latn", "Nkoo", "Arab"]
		},
		bn: {
			haswikt: 1,
			sc: "Beng"
		},
		bo: {
			haswikt: 1,
			sc: "Tibt"
		},
		br: {
			g: ["m", "f"],
			haswikt: 1
		},
		ca: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		cdo: {
			sc: "Hani"
		},
		ce: {
			sc: "Cyrl"
		},
		ch: {
			haswikt: 1
		},
		chr: {
			haswikt: 1,
			sc: "Cher"
		},
		cjy: {
			sc: "Hani"
		},
		ckb: {
			wiktprefix: "ku",
			sc: "Arab",
			wsc: "ku-Arab"
		},
		cmn: {
			sc: "Hani",
			wiktprefix: "zh"
		},
		co: {
			haswikt: 1
		},
		cpx: {
			sc: "Hani"
		},
		cr: {
			haswikt: 1,
			sc: "Cans"
		},
		crh: {},
		cs: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1
		},
		csb: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1
		},
		cu: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			sc: ["Cyrs", "Glag"]
		},
		cv: {
			sc: "Cyrl"
		},
		cy: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		czh: {
			sc: "Hani"
		},
		czo: {
			sc: "Hani"
		},
		da: {
			g: ["c", "n", "c-p", "n-p"],
			haswikt: 1
		},
		dax: {},
		de: {
			g: ["m", "f", "n", "p"],
			haswikt: 1
		},
		dhg: {},
		djb: {},
		dji: {},
		djr: {},
		dng: {
			sc: "Cyrl"
		},
		dsb: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"]
		},
		dsx: {},
		duj: {},
		dv: {
			g: ["s", "p"],
			haswikt: 1,
			sc: "Thaa"
		},
		dz: {
			haswikt: 1,
			sc: "Tibt"
		},
		el: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1
		},
		en: {
			g: ["s", "p"],
			haswikt: 1
		},
		eo: {
			g: ["s", "p"],
			haswikt: 1
		},
		es: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		et: {
			g: ["s", "p"],
			haswikt: 1
		},
		ett: {
			g: ["s", "p"],
			sc: "Ital"
		},
		eu: {
			g: ["s", "p"],
			haswikt: 1
		},
		fa: {
			haswikt: 1,
			sc: "Arab",
			wsc: "fa-Arab"
		},
		fi: {
			g: ["s", "p"],
			haswikt: 1
		},
		fil: {},
		fj: {
			haswikt: 1
		},
		fo: {
			g: ["m", "f", "n"],
			haswikt: 1
		},
		fr: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		frm: {
			g: ["m", "f", "m-p", "f-p"]
		},
		fro: {
			g: ["m", "f", "m-p", "f-p"]
		},
		fy: {
			g: ["c", "n", "p"],
			haswikt: 1
		},
		ga: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		gan: {
			sc: "Hani"
		},
		gd: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		gez: {
			sc: "Ethi"
		},
		gl: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		gmy: {
			sc: "Linb"
		},
		gn: {
			haswikt: 1
		},
		gnn: {
			sc: "Latn"
		},
		got: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			sc: "Goth"
		},
		grc: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"]
		},
		gu: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1,
			sc: "Gujr"
		},
		guf: {
			sc: "Latn"
		},
		gv: {
			haswikt: 1
		},
		ha: {
			haswikt: 1
		},
		hak: {
			sc: "Hani"
		},
		har: {
			sc: "Ethi"
		},
		he: {
			alt: 1,
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1,
			sc: "Hebr"
		},
		hi: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1,
			sc: "Deva"
		},
		hif: {
			sc: ["Latn", "Deva"]
		},
		hit: {
			sc: "Xsux"
		},
		hsb: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1
		},
		hsn: {
			sc: "Hani"
		},
		hu: {
			g: ["s", "p"],
			haswikt: 1
		},
		hy: {
			haswikt: 1,
			sc: "Armn"
		},
		ia: {
			haswikt: 1
		},
		id: {
			haswikt: 1
		},
		ie: {
			haswikt: 1
		},
		ik: {
			haswikt: 1
		},
		ike: {
			sc: "Cans"
		},
		ikt: {
			sc: "Cans"
		},
		io: {
			haswikt: 1
		},
		is: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1
		},
		it: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		iu: {
			haswikt: 1,
			sc: "Cans"
		},
		ja: {
			haswikt: 1,
			sc: "Jpan"
		},
		jay: {
			sc: "Latn"
		},
		jbo: {
			haswikt: 1
		},
		jv: {
			haswikt: 1
		},
		ka: {
			haswikt: 1
		}, // script should include "Geok" for Asomtavruli & Nuskhuri but prevents automatic transliteration?
		khb: {
			sc: ["Talu", "Lana", "Thai"]
		},
		kjh: {
			sc: "Cyrl"
		},
		kk: {
			haswikt: 1,
			sc: "Cyrl"
		},
		kkh: {
			sc: ["Lana", "Thai"]
		},
		kl: {
			haswikt: 1
		},
		km: {
			haswikt: 1,
			sc: "Khmr"
		},
		kn: {
			haswikt: 1,
			sc: "Knda"
		},
		kmr: {
			wiktprefix: "ku"
		},
		ko: {
			haswikt: 1,
			sc: "Kore"
		},
		krc: {
			g: ["s", "p"],
			sc: "Cyrl"
		},
		ks: {
			haswikt: 1,
			sc: ["Arab", "Deva"],
			wsc: "ks-Arab"
		},
		ku: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1,
			sc: ["Arab", "Latn"],
			wsc: "ku-Arab"
		},
		kw: {
			haswikt: 1
		},
		ky: {
			haswikt: 1,
			sc: "Cyrl"
		},
		la: {
			alt: 1,
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1
		},
		lb: {
			haswikt: 1
		},
		lez: {
			sc: "Cyrl"
		},
		li: {
			haswikt: 1
		},
		lki: {
			wiktprefix: "ku"
		},
		ln: {
			haswikt: 1
		},
		lo: {
			haswikt: 1,
			sc: "Laoo"
		},
		lt: {
			alt: 1,
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		lv: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		lzz: {
			sc: "Geor"
		},
		mg: {
			haswikt: 1
		},
		mh: {
			haswikt: 1
		},
		mi: {
			g: 0,
			haswikt: 1
		},
		mk: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1,
			sc: "Cyrl"
		},
		ml: {
			haswikt: 1,
			sc: "Mlym"
		},
		mn: {
			haswikt: 1,
			sc: ["Cyrl", "Mong"]
		},
		mnp: {
			sc: "Hani"
		},
		mo: {
			haswikt: 1,
			sc: "Cyrl"
		},
		mol: {
			sc: "Cyrl"
		},
		mr: {
			g: ["m", "f", "n"],
			haswikt: 1,
			sc: "Deva"
		},
		ms: {
			haswikt: 1,
			sc: ["Latn", "Arab"]
		},
		mt: {
			g: ["m", "f"],
			haswikt: 1
		},
		mwp: {
			sc: "Latn"
		},
		my: {
			haswikt: 1,
			sc: "Mymr"
		},
		na: {
			haswikt: 1
		},
		nah: {
			haswikt: 1
		},
		nan: {
			wiktprefix: "zh-min-nan",
			sc: "Hani"
		},
		nb: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			wiktprefix: "no"
		},
		"nds-de": {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			wiktprefix: "nds"
		},
		"nds-nl": {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			wiktprefix: "nds"
		},
		ne: {
			haswikt: 1,
			sc: "Deva"
		},
		nl: {
			g: ["m", "f", "n", "p"],
			haswikt: 1
		},
		nn: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1
		},
		no: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1
		},
		nod: {
			sc: "Lana"
		},
		non: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"]
		},
		oc: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		om: {
			haswikt: 1
		},
		or: {
			haswikt: 1,
			sc: "Orya"
		},
		orv: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			sc: "Cyrs"
		},
		osc: {
			sc: "Ital"
		},
		ota: {
			sc: "Arab",
			wsc: "ota-Arab"
		},
		pa: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1,
			sc: ["Guru", "Arab"]
		},
		pdt: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			wiktprefix: "nds"
		},
		peo: {
			sc: "Xpeo"
		},
		phn: {
			sc: "Phnx"
		},
		pi: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1
		},
		pjt: {
			sc: "Latn"
		},
		pl: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1
		},
		pox: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"]
		},
		ps: {
			g: ["m", "f", "m-p", "f-p", "p"],
			haswikt: 1,
			sc: "Arab",
			wsc: "ps-Arab"
		},
		pt: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		qu: {
			haswikt: 1
		},
		rit: {
			sc: "Latn"
		},
		rm: {
			g: ["m", "f"],
			haswikt: 1
		},
		rn: {
			haswikt: 1
		},
		ro: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1,
			sc: ["Latn", "Cyrl"]
		},
		"roa-rup": {
			haswikt: 1
		},
		ru: {
			alt: 1,
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1,
			sc: "Cyrl"
		},
		rue: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			sc: "Cyrl"
		},
		ruo: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"]
		},
		rup: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			wiktprefix: "roa-rup"
		},
		ruq: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"]
		},
		rw: {
			haswikt: 1
		},
		sa: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1,
			sc: "Deva"
		},
		sah: {
			sc: "Cyrl"
		},
		sc: {
			haswikt: 1
		},
		scn: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		sco: {
			sc: "Latn"
		},
		sd: {
			haswikt: 1,
			sc: "Arab",
			wsc: "sd-Arab"
		},
		sdh: {
			wiktprefix: "ku"
		},
		sg: {
			haswikt: 1
		},
		sh: {
			alt: 1,
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1,
			sc: ["Latn", "Cyrl"]
		},
		si: {
			haswikt: 1,
			sc: "Sinh"
		},
		simple: {
			haswikt: 1
		},
		sk: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1
		},
		sl: {
			alt: 1,
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1
		},
		sm: {
			haswikt: 1
		},
		sn: {
			haswikt: 1
		},
		so: {
			haswikt: 1
		},
		spx: {
			sc: "Ital"
		},
		sq: {
			g: ["m", "f"],
			haswikt: 1
		},
		ss: {
			haswikt: 1
		},
		st: {
			haswikt: 1
		},
		su: {
			haswikt: 1
		},
		sux: {
			sc: "Xsux"
		},
		sv: {
			g: ["c", "n", "c-p", "n-p"],
			haswikt: 1
		},
		sva: {
			sc: "Geor"
		},
		sw: {
			nclass: 1,
			haswikt: 1
		},
		syc: {
			sc: "Syrc"
		},
		syr: {
			sc: "Syrc"
		},
		szl: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"]
		},
		ta: {
			haswikt: 1,
			sc: "Taml"
		},
		tdd: {
			sc: "Tale"
		},
		te: {
			haswikt: 1,
			sc: "Telu"
		},
		tg: {
			haswikt: 1
		},
		th: {
			haswikt: 1,
			sc: "Thai"
		},
		ti: {
			haswikt: 1,
			sc: "Ethi"
		},
		tig: {
			sc: "Ethi"
		},
		tiw: {
			sc: "Latn"
		},
		tk: {
			haswikt: 1
		},
		tl: {
			haswikt: 1,
			sc: ["Latn", "Tglg"]
		},
		tmr: {
			sc: "Hebr"
		},
		tn: {
			haswikt: 1
		},
		to: {
			haswikt: 1
		},
		tpi: {
			haswikt: 1
		},
		tr: {
			g: ["s", "p"],
			alt: 1,
			haswikt: 1
		},
		ts: {
			haswikt: 1
		},
		tt: {
			haswikt: 1
		},
		tts: {
			sc: "Thai"
		},
		tw: {
			haswikt: 1
		},
		udi: {
			sc: ["Cyrl", "Latn", "Armn", "Geor"]
		},
		ug: {
			haswikt: 1,
			sc: "Arab",
			wsc: "ug-Arab"
		},
		uga: {
			sc: "Ugar"
		},
		uk: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p", "impf", "pf"],
			haswikt: 1,
			sc: "Cyrl"
		},
		ulk: {
			sc: "Latn"
		},
		ur: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1,
			sc: "Arab",
			wsc: "ur-Arab"
		},
		uz: {
			haswikt: 1
		},
		vec: {
			g: ["m", "f", "m-p", "f-p"],
			haswikt: 1
		},
		vi: {
			haswikt: 1
		},
		vls: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"]
		},
		vo: {
			haswikt: 1
		},
		wa: {
			haswikt: 1
		},
		wbp: {
			sc: "Latn"
		},
		wo: {
			haswikt: 1
		},
		wuu: {
			sc: "Hani"
		},
		xae: {
			sc: "Ital"
		},
		xcr: {
			sc: "Cari"
		},
		xfa: {
			sc: "Ital"
		},
		xh: {
			alt: 1,
			nclass: 1,
			haswikt: 1
		},
		xlc: {
			sc: "Lyci"
		},
		xld: {
			sc: "Lydi"
		},
		xlu: {
			sc: "Xsux"
		},
		xmf: {
			sc: "Geor"
		},
		xno: {
			g: ["m", "f", "m-p", "f-p"]
		},
		xrr: {
			sc: "Ital"
		},
		xst: {
			sc: "Ethi"
		},
		xum: {
			sc: "Ital"
		},
		xve: {
			sc: "Ital"
		},
		xvo: {
			sc: "Ital"
		},
		yi: {
			g: ["m", "f", "n", "m-p", "f-p", "n-p"],
			haswikt: 1,
			sc: "Hebr"
		},
		yo: {
			haswikt: 1
		},
		yua: {
			g: ["s", "p"],
			alt: 1
		},
		yue: {
			sc: "Hani"
		},
		za: {
			haswikt: 1,
			sc: "Latn"
		},
		"zh-classical": {
			sc: "Hani"
		},
		"zh-min-nan": {
			haswikt: 1
		},
		"zh-yue": {
			sc: "Hani"
		},
		zu: {
			alt: 1,
			nclass: 1,
			haswikt: 1
		}
	};

	var clean = {
		aar: "aa",
		afar: "aa",
		abk: "ab",
		abkhazian: "ab",
		afr: "af",
		afrikaans: "af",
		aka: "ak",
		akan: "ak",
		amh: "am",
		amharic: "am",
		ara: "ar",
		arabic: "ar",
		arg: "an",
		aragonese: "an",
		asm: "as",
		assamese: "as",
		ava: "av",
		avaric: "av",
		ave: "ae",
		avestan: "ae",
		aym: "ay",
		aymara: "ay",
		aze: "az",
		azerbaijani: "az",
		bak: "ba",
		bashkir: "ba",
		bam: "bm",
		bambara: "bm",
		bel: "be",
		belarusian: "be",
		ben: "bn",
		bengali: "bn",
		bis: "bi",
		bislama: "bi",
		bod: "bo",
		tibetan: "bo",
		bs: "sh",
		bos: "sh",
		bosnian: "sh",
		bre: "br",
		breton: "br",
		bul: "bg",
		bulgarian: "bg",
		cat: "ca",
		catalan: "ca",
		ces: "cs",
		czech: "cs",
		cha: "ch",
		chamorro: "ch",
		che: "ce",
		chechen: "ce",
		chu: "cu",
		churchslavic: "cu",
		chv: "cv",
		chuvash: "cv",
		cor: "kw",
		cornish: "kw",
		cos: "co",
		corsican: "co",
		cre: "cr",
		cree: "cr",
		cym: "cy",
		welsh: "cy",
		dan: "da",
		danish: "da",
		deu: "de",
		german: "de",
		div: "dv",
		dhivehi: "dv",
		dzo: "dz",
		dzongkha: "dz",
		ekk: "et",
		ell: "el",
		greek: "el",
		eng: "en",
		english: "en",
		epo: "eo",
		esperanto: "eo",
		est: "et",
		estonian: "et",
		eus: "eu",
		basque: "eu",
		ewe: "ee",
		fao: "fo",
		faroese: "fo",
		fas: "fa",
		persian: "fa",
		fij: "fj",
		fijian: "fj",
		fil: "tl",
		fin: "fi",
		finnish: "fi",
		fra: "fr",
		french: "fr",
		fry: "fy",
		westernfrisian: "fy",
		ful: "ff",
		fulah: "ff",
		gla: "gd",
		scottishgaelic: "gd",
		gle: "ga",
		irish: "ga",
		glg: "gl",
		galician: "gl",
		glv: "gv",
		manx: "gv",
		grn: "gn",
		guarani: "gn",
		guj: "gu",
		gujarati: "gu",
		hat: "ht",
		haitian: "ht",
		hau: "ha",
		hausa: "ha",
		heb: "he",
		hebrew: "he",
		her: "hz",
		herero: "hz",
		hin: "hi",
		hindi: "hi",
		hmo: "ho",
		hirimotu: "ho",
		hr: "sh",
		hrv: "sh",
		croatian: "sh",
		hun: "hu",
		hungarian: "hu",
		hye: "hy",
		armenian: "hy",
		ibo: "ig",
		igbo: "ig",
		ido: "io",
		iii: "ii",
		sichuanyi: "ii",
		iku: "iu",
		inuktitut: "iu",
		ile: "ie",
		interlingue: "ie",
		ina: "ia",
		interlingua: "ia",
		ind: "id",
		indonesian: "id",
		ipk: "ik",
		inupiaq: "ik",
		isl: "is",
		icelandic: "is",
		ita: "it",
		italian: "it",
		jav: "jv",
		javanese: "jv",
		jpn: "ja",
		japanese: "ja",
		kal: "kl",
		kalaallisut: "kl",
		kan: "kn",
		kannada: "kn",
		kas: "ks",
		kashmiri: "ks",
		kat: "ka",
		georgian: "ka",
		kau: "kr",
		kanuri: "kr",
		kaz: "kk",
		kazakh: "kk",
		khm: "km",
		centralkhmer: "km",
		kik: "ki",
		kikuyu: "ki",
		kin: "rw",
		kinyarwanda: "rw",
		kir: "ky",
		kirghiz: "ky",
		kom: "kv",
		komi: "kv",
		kon: "kg",
		kongo: "kg",
		kor: "ko",
		korean: "ko",
		ksh: "gmw-cfr",
		kua: "kj",
		kuanyama: "kj",
		kur: "ku",
		kurdish: "ku",
		lao: "lo",
		lat: "la",
		latin: "la",
		lav: "lv",
		latvian: "lv",
		lim: "li",
		limburgan: "li",
		lin: "ln",
		lingala: "ln",
		lit: "lt",
		lithuanian: "lt",
		ltz: "lb",
		luxembourgish: "lb",
		lub: "lu",
		lubakatanga: "lu",
		lug: "lg",
		ganda: "lg",
		mah: "mh",
		marshallese: "mh",
		mal: "ml",
		malayalam: "ml",
		mar: "mr",
		marathi: "mr",
		mhr: "chm",
		mari: "chm",
		mkd: "mk",
		macedonian: "mk",
		mlg: "mg",
		malagasy: "mg",
		mlt: "mt",
		maltese: "mt",
		mon: "mn",
		mongolian: "mn",
		mri: "mi",
		maori: "mi",
		msa: "ms",
		malay: "ms",
		mya: "my",
		burmese: "my",
		nau: "na",
		nauru: "na",
		wep: "nds-de",
		westphalian: "nds-de",
		germanlowgerman: "nds-de",
		dutchlowsaxon: "nds-nl",
		act: "nds-nl",
		achterhoeks: "nds-nl",
		drt: "nds-nl",
		drents: "nds-nl",
		gos: "nds-nl",
		gronings: "nds-nl",
		sdz: "nds-nl",
		sallands: "nds-nl",
		stl: "nds-nl",
		stellingwerfs: "nds-nl",
		twd: "nds-nl",
		twents: "nds-nl",
		vel: "nds-nl",
		veluws: "nds-nl",
		nav: "nv",
		navajo: "nv",
		nbl: "nr",
		southndebele: "nr",
		nde: "nd",
		northndebele: "nd",
		ndo: "ng",
		ndonga: "ng",
		nep: "ne",
		nepali: "ne",
		nld: "nl",
		dutch: "nl",
		flemish: "nl",
		nno: "nn",
		norwegiannynorsk: "nn",
		nob: "nb",
		norwegianbokmal: "nb",
		nor: "no",
		norwegian: "no",
		nya: "ny",
		nyanja: "ny",
		oci: "oc",
		occitan: "oc",
		oji: "oj",
		ojibwa: "oj",
		ori: "or",
		oriya: "or",
		orm: "om",
		oromo: "om",
		oss: "os",
		ossetian: "os",
		pan: "pa",
		panjabi: "pa",
		pfl: "gmw-rfr",
		pli: "pi",
		pali: "pi",
		pol: "pl",
		polish: "pl",
		por: "pt",
		portuguese: "pt",
		pus: "ps",
		pushto: "ps",
		que: "qu",
		quechua: "qu",
		roh: "rm",
		romansh: "rm",
		ron: "ro",
		romanian: "ro",
		rn: "rw",
		run: "rw",
		rundi: "rw",
		rus: "ru",
		russian: "ru",
		sag: "sg",
		sango: "sg",
		san: "sa",
		sanskrit: "sa",
		sin: "si",
		sinhala: "si",
		slk: "sk",
		slovak: "sk",
		slv: "sl",
		slovenian: "sl",
		sme: "se",
		northernsami: "se",
		smo: "sm",
		samoan: "sm",
		sna: "sn",
		shona: "sn",
		snd: "sd",
		sindhi: "sd",
		som: "so",
		somali: "so",
		sot: "st",
		southernsotho: "st",
		spa: "es",
		spanish: "es",
		sqi: "sq",
		albanian: "sq",
		srd: "sc",
		sardinian: "sc",
		sr: "sh",
		srp: "sh",
		serbian: "sh",
		ssw: "ss",
		swati: "ss",
		sun: "su",
		sundanese: "su",
		swa: "sw",
		swahili: "sw",
		swe: "sv",
		swedish: "sv",
		tah: "ty",
		tahitian: "ty",
		tam: "ta",
		tamil: "ta",
		tat: "tt",
		tatar: "tt",
		tel: "te",
		telugu: "te",
		tgk: "tg",
		taishanese: "zhx-tai",
		tajik: "tg",
		tgl: "tl",
		tagalog: "tl",
		teochew: "zhx-teo",
		tha: "th",
		thai: "th",
		tir: "ti",
		tigrinya: "ti",
		ton: "to",
		tonga: "to",
		tsn: "tn",
		tswana: "tn",
		tso: "ts",
		tsonga: "ts",
		tuk: "tk",
		turkmen: "tk",
		tur: "tr",
		turkish: "tr",
		twi: "tw",
		uig: "ug",
		uighur: "ug",
		ukr: "uk",
		ukrainian: "uk",
		urd: "ur",
		urdu: "ur",
		uzb: "uz",
		uzbek: "uz",
		ven: "ve",
		venda: "ve",
		vie: "vi",
		vietnamese: "vi",
		westflemish: "vls",
		vol: "vo",
		volapuk: "vo",
		wln: "wa",
		walloon: "wa",
		wol: "wo",
		wolof: "wo",
		xho: "xh",
		xhosa: "xh",
		yid: "yi",
		yiddish: "yi",
		yor: "yo",
		yoruba: "yo",
		zbc: "lod",
		zbe: "lod",
		zbw: "lod",
		zha: "za",
		zhuang: "za",
		zh: "cmn",
		zho: "cmn",
		chinese: "cmn",
		zul: "zu",
		zulu: "zu"
	};
	// }}}

	// FIXME: merge into above
	var c = 'Chinese';
	var a = 'Arabic';
	var nesting = {
		aae: 'Albanian/Arbëresh',
		aat: 'Albanian/Arvanitika',
		als: 'Albanian/Tosk',
		aln: 'Albanian/Gheg',
		apj: 'Apache',
		apm: 'Apache',
		apw: 'Apache',
		syr: 'Aramaic',
		syc: 'Aramaic',
		xcl: 'Armenian',
		axm: 'Armenian',
		// ang:'English',enm:'English', don't nest English (Encyclopetey)
		fro: 'French',
		frm: 'French',
		oge: 'Georgian',
		gsw: 'German',
		ksh: 'German',
		pfl: 'German',
		//gmh:'German',goh:'German', don't nest OHG/MHG (-sche)
		grc: 'Greek/Ancient',
		gmy: 'Greek/Mycenaean', //el:'Greek/Modern', don't nest Modern Greek (Atelaes)
		sga: 'Irish',
		mga: 'Irish',
		kmr: 'Kurdish/Northern Kurdish',
		ckb: 'Kurdish/Central Kurdish',
		sdh: 'Kurdish/Southern Kurdish',
		lki: 'Kurdish/Laki',
		"nds-de": 'Low German',
		"nds-nl": 'Low German',
		nb: 'Norwegian/Bokmål',
		nn: 'Norwegian/Nynorsk',
		mhr: 'Mari',
		mrj: 'Mari',
		cmg: 'Mongolian',
		rmn: 'Romani',
		rml: 'Romani',
		rmc: 'Romani',
		rmf: 'Romani',
		rmo: 'Romani',
		rmy: 'Romani',
		rmw: 'Romani',
		dsb: 'Sorbian',
		hsb: 'Sorbian',
		osp: 'Spanish',
		owl: 'Welsh',
		wlm: 'Welsh',
		"nai-ply": 'Yokuts',
		"nai-bvy": 'Yokuts',
		"nai-tky": 'Yokuts',
		"nai-kry": 'Yokuts',
		"nai-svy": 'Yokuts',
		"nai-nvy": 'Yokuts',
		"nai-dly": 'Yokuts',
		zh: c,
		yue: c,
		dng: c,
		gan: c,
		hak: c,
		czh: c,
		cjy: c,
		cmn: c,
		mnp: c,
		cdo: c,
		nan: c,
		czo: c,
		cpx: c,
		wuu: c,
		hsn: c,
		lzh: c,
		"zhx-teo": c,
		"zhx-tai": c,
		arq: a,
		aao: a,
		bbz: a,
		abv: a,
		shu: a,
		acy: a,
		adf: a,
		avl: a,
		arz: a,
		afb: a,
		ayh: a,
		acw: a,
		ayl: a,
		acm: a,
		ary: a,
		ars: a,
		apc: a,
		ayp: a,
		acx: a,
		aec: a,
		ayn: a,
		ssh: a,
		ajp: a,
		arb: a,
		apd: a,
		pga: a,
		acq: a,
		abh: a,
		aeb: a,
		auz: a
	};

	// These should reflect the replacements made in [[Module:languages]], but should not necessarily be equal.
	var diacriticStrippers = {
		ab: {
			from: "ҔҕҦҧ",
			to: "ӶӷԤԥ"
		},
		/** obsolete to new **/
		abq: {
			from: "Il1",
			to: "ӏӏӏ"
		},
		/** letters and number 1 are used instead of palochka **/
		ady: {
			from: "Il1",
			to: "ӏӏӏ"
		},
		/** letters and number 1 are used instead of palochka **/
		av: {
			from: "Il1",
			to: "ӏӏӏ"
		},
		/** letters and number 1 are used instead of palochka **/
		ce: {
			from: "Il1",
			to: "ӏӏӏ"
		},
		/** letters and number 1 are used instead of palochka **/
		dar: {
			from: "Il1",
			to: "ӏӏӏ"
		},
		/** letters and number 1 are used instead of palochka **/
		inh: {
			from: "Il1",
			to: "ӏӏӏ"
		},
		/** letters and number 1 are used instead of palochka **/
		kbd: {
			from: "Il1",
			to: "ӏӏӏ"
		},
		/** letters and number 1 are used instead of palochka **/
		lbe: {
			from: "Il1",
			to: "ӏӏӏ"
		},
		/** letters and number 1 are used instead of palochka **/
		lez: {
			from: "Il1",
			to: "ӏӏӏ"
		},
		/** letters and number 1 are used instead of palochka **/
		tab: {
			from: "Il1",
			to: "ӏӏӏ"
		},
		/** letters and number 1 are used instead of palochka **/
		cv: {
			from: "ĂăĔĕ",
			to: "ӐӑӖӗ"
		},
		/** Roman to Cyrillic**/
		ang: {
			from: "ĀāǢǣĊċĒēĠġĪīŌōŪūȲȳ",
			to: "AaÆæCcEeGgIiOoUuYy",
			strip: "\u0304\u0307"
		}, //macron and above dot
		ar: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		aao: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		acm: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		acx: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		adf: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		aeb: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		afb: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		ajp: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		apc: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		apd: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		arq: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		ary: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		arz: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		fa: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		ps: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		sd: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		ur: {
			strip: "\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652"
		},
		chl: {
			from: "ÁáÉéÍíÓóÚú",
			to: "AaEeIiOoUu",
			strip: "\u0304"
		}, //acute accent
		he: {
			strip: "\u05B0\u05B1\u05B2\u05B3\u05B4\u05B5\u05B6\u05B7\u05B8\u05B9\u05BA\u05BB\u05BC\u05BD\u05BF\u05C1\u05C2",
			from: "-'\"",
			to: "־׳״"
		},
		la: {
			from: "ĀāĒēĪīŌōŪūȲȳ",
			to: "AaEeIiOoUuYy",
			strip: "\u0304"
		}, //macron
		lt: {
			from: "áãàéẽèìýỹñóõòúù",
			to: "aaaeeeiyynooouu",
			strip: "\u0340\u0301\u0303"
		},
		nci: {
			from: "ĀāĒēĪīŌōŪūȲȳ",
			to: "AaEeIiOoUu",
			strip: "\u0304"
		}, //macron
		ro: {
			from: "ŞŢşţ",
			to: "ȘȚșț"
		},
		//strip ́ and ̀ on Cyrillic Slavic languages, Serbo-Croatian has a longer list
		ru: {
			strip: "\u0300\u0301"
		},
		uk: {
			strip: "\u0300\u0301"
		},
		be: {
			strip: "\u0300\u0301"
		},
		bg: {
			strip: "\u0300\u0301"
		},
		orv: {
			strip: "\u0300\u0301"
		},
		cu: {
			strip: "\u0300\u0301"
		},
		rue: {
			strip: "\u0300\u0301"
		},
		mk: {
			strip: "\u0300\u0301"
		},
		kv: {
			from: "ÖöIi",
			to: "ӦӧІі"
		},
		/** Roman to Cyrillic**/
		koi: {
			from: "ÖöIi",
			to: "ӦӧІі"
		},
		/** Roman to Cyrillic**/
		kpv: {
			from: "ÖöIi",
			to: "ӦӧІі"
		},
		/** Roman to Cyrillic**/
		sh: {
			from: "ȀȁÀàȂȃÁáĀāȄȅÈèȆȇÉéĒēȈȉÌìȊȋÍíĪīȌȍÒòȎȏÓóŌōȐȑȒȓŔŕȔȕÙùȖȗÚúŪūѝӣ",
			to: "AaAaAaAaAaEeEeEeEeEeIiIiIiIiIiOoOoOoOoOoRrRrRrUuUuUuUuUuии",
			strip: "\u030F\u0300\u0311\u0301\u0304"
		},
		sl: {
			from: "áÁàÀâÂȃȂȁȀéÉèÈêÊȇȆȅȄíÍìÌîÎȋȊȉȈóÓòÒôÔȏȎȍȌŕŔȓȒȑȐúÚùÙûÛȗȖȕȔệỆộỘẹẸọỌəł",
			to: "aAaAaAaAaAeEeEeEeEeEiIiIiIiIiIoOoOoOoOoOrRrRrRuUuUuUuUuUeEoOeEoOel",
			strip: "\u0301\u0300\u0302\u0311\u030f\u0323"
		},
		kk: {
			strip: "\u0300\u0301"
		},
		ky: {
			strip: "\u0300\u0301"
		},
		mn: {
			from: "ЄєѲѳЇїVv",
			to: "ӨөӨөҮүҮү",
			strip: "\u0300\u0301"
		},
		tg: {
			strip: "\u0300\u0301"
		},
		sa: {
			strip: "ः"
		},
		/** visarga **/
		bo: {
			strip: "།"
		},
		/** shad **/
		tr: {
			from: "ÂâÛû",
			to: "AaUu",
			strip: "\u0302"
		},
		ja: {
			from: "0123456789",
			to: "0123456789"
		},
		cmn: {
			from: "0123456789",
			to: "0123456789"
		},
		yue: {
			from: "0123456789",
			to: "0123456789"
		},
		nan: {
			from: "0123456789",
			to: "0123456789"
		},
		ko: {
			from: "0123456789",
			to: "0123456789"
		},
		os: {
			from: "Ææ",
			to: "Ӕӕ"
		},
		/** Roman to Cyrillic**/
		uz: {
			from: "'`",
			to: "ʻʻ"
		},
		/** ʻ is a standard symbol in Uzbek but is often replaced with ' or ` **/
		zu: {
			strip_init_hyphen: 1
		}
	};
	
	//Returns true if a Wiktionary exists for the specified language
	this.hasWiktionary = function(lang) {
		if (metadata[lang] && (metadata[lang].haswikt || metadata[lang].wiktprefix))
			return true;
};
	//Returns the domain-name prefix of the Wiktionary for the specified language
	this.getWiktionaryPrefix = function(lang) {
		if (metadata[lang])
			return metadata[lang].wiktprefix || (metadata[lang].haswikt && lang);
	};
	
	// Keep this in sync with ignore_caps in [[Module:translations]].
	this.ignoreCaps = { "ko": true };
	
	// Calls the callback with a boolean indicating whether the specified language
	// has a Wiktionary with the specified entry. The callback might be called
	// synchronously, or it might be called asynchronously.
	this.hasWiktionaryWithEntry = function(lang, title, callback) {
		if (this.hasWiktionary(lang)) {
			if (this.ignoreCaps[lang])
				title = title.replace(/^\^/, "");
			
			$.getJSON(
				'//' + this.getWiktionaryPrefix(lang) + '.wiktionary.org/w/api.php' +
				'?format=json&action=query&titles=' + encodeURIComponent(title) +
				'&converttitles=1&callback=?',
				function(data) {
					data = data && data.query && data.query.pages;
					if (data) {
						callback(!data[-1]);
						return;
					}
					callback(false);
				}
			);
			
		} else
			callback(false);
	};

	//Given a language code return a default script code.
	this.guessScript = function(lang) {
		var scripts = (new ScriptUtils()).GetScriptsByLangCode(lang);
		if (scripts && scripts.length > 0) return scripts[0];
		else return false;
		
		if (metadata[lang]) {
			// enwikt language template? (ur-Arab, polytonic)
			if (metadata[lang].wsc) {
				return metadata[lang].wsc;
			}
			// ISO script code? (Arab, Grek)
			if (metadata[lang].sc) {
				if (typeof metadata[lang].sc == 'object')
					return metadata[lang].sc[0];
				else
					return metadata[lang].sc;
			}
		}

		return false;
	};

	// In a given language, would we expect a translation of the title to have the capitalisation
	// of word?
	this.expectedCase = function(lang, title, word) {
		if (lang == 'de' || lang == 'lb')
			return true;

		if (title.substr(0, 1).toLowerCase() != title.substr(0, 1))
			return true;

		return word.substr(0, 1).toLowerCase() == word.substr(0, 1);
	};

	//Returns a string of standard gender letters (mfnc) or an empty string
	this.getGenders = function(lang) {
		if (metadata[lang])
			return metadata[lang].g;
	};

	//Returns a string of standard noun class numbers or an empty string
	this.hasNounClasses = function(lang) {
		if (metadata[lang])
			return metadata[lang].nclass;
	};

	//Returns true if the specified lang uses optional vowels or diacritics
	this.needsRawPageName = function(lang) {
		if (metadata[lang])
			return metadata[lang].alt && !diacriticStrippers[lang];
	};

	// Computes the raw page name by removing diacritics (for Latin, etc.)
	this.computeRawPageName = function(lang, word) {
		if (diacriticStrippers[lang]) {
			var stripper = diacriticStrippers[lang];

			var map = {};

			if (stripper.from && stripper.to) {
				for (var i = 0; i < stripper.from.length; i++) {
					map[stripper.from.charAt(i)] = stripper.to.charAt(i);
				}
			}
			if (stripper.strip) {
				for (var ii = 0; ii < stripper.strip.length; ii++) {
					map[stripper.strip.charAt(ii)] = "";
				}
			}

			var input = word.split("");
			var output = "";

			for (var iii = 0; iii < input.length; iii++) {
				var repl = map[input[iii]];
				output += repl ? repl : input[iii];
			}

			if (stripper.strip_init_hyphen && output.length > 0 && output.charAt(0) == '-')
				output = output.substr(1);

			return output;
		}
	};

	// Calls [[Module:links]]'s 'remove_diacritics' method on word and rawPageName,
	// and invokes callback with two arguments: (1) the *real* raw page name
	// (superseding even rawPageName), and (2) whether this real raw page name
	// needs to be explicitly specified in the wikitext (i.e., whether the raw page
	// name computed from rawPageName is different from the one that would have been
	// computed from just word).
	this.retrieveRawPageName = function(lang, word, rawPageName, callback) {
		var ents = {
			'<': 'lt',
			'&': 'amp',
			'>': 'gt'
		};
		var temps = {
			'|': '!',
			'=': '=',
			'{': '(',
			'}': ')'
		};

		function encode(s) {
			s = s || '';
			s = s.replace(/[|={}]/g, function(c) {
				return '{{' + temps[c] + '}}';
			});
			s = s.replace(/[<&>]/g, function(c) {
				return '&' + ents[c] + ';';
			});
			s = s.replace(/\t/g, ' ');
			//s = encodeURIComponent(s);
			return s;
		}

		function removeDiacritics(s) {
			return '{{#invoke:languages/templates|getByCode|' + lang + '|makeEntryName|' + encode(s) + '}}';
		}

		var text = removeDiacritics(word) + '\t' + removeDiacritics(rawPageName || word);
		$.ajax({
			dataType: "json",
			url: '/w/api.php',
			data: {
				format: 'json',
				action: 'expandtemplates',
				text: text
			},
			success: function(data) {
				data = data && data.expandtemplates && data.expandtemplates['*'];
				if (/<!--/.test(data)) {
					data = false;
				}
				if (data) {
					data = data && data.split('\t');
					var wordMinus = data[0];
					var rawPageNameMinus = data[1];
					callback(rawPageNameMinus || wordMinus, rawPageNameMinus != wordMinus);
				} else {
					callback(rawPageName || word, rawPageName && rawPageName != word);
				}
			}
		});
	};

	//Given user input, return a language code. Normalises ISO 639-1 codes and names to 639-3.
	this.cleanLangCode = function(lang) {
		var key = lang.toLowerCase().replace(' ', '');
		if (clean[key])
			return clean[key];
		else
			return lang;
	};

	// Get the nesting for a given sub-language
	this.getNested = function(lang) {
		if (nesting[lang])
			return nesting[lang];
		else
			return "";
	};

	function temporalSortKey(langname) {
		return langname.replace(/^(Ancient|Classical|Old|Middle|Early Modern|Modern) (.*)/, function(m, modifier, name) {
			return ({
				Ancient: 0,
				Old: 1,
				Middle: 2,
				"Early Modern": 3,
				Modern: 4
			})[modifier] + name;
		});
	}

	// For enforcing an ordering on nested languages.
	this.nestsBefore = function(a, b) {
		return temporalSortKey(a) < temporalSortKey(b);
	};

	this.getScripts = function(lang) {
		var scripts = (new window.ScriptUtils()).GetScriptsByLangCode(lang) || [];
		return scripts;
	};
};
//</nowiki>