summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'UniversalLanguageSelector/lib')
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/GPL-LICENSE342
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/MIT-LICENSE22
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/css/jquery.ime.css214
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/images/ime-active.pngbin0 -> 319 bytes
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/images/ime-active.svg1
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/images/tick.pngbin0 -> 261 bytes
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/images/tick.svg1
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/jquery.ime.js3177
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/README.md138
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/af/af-tilde.js24
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ajg/ajg-tilde.js35
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ak/ak-qx.js26
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ak/ak-tilde.js23
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/am/am-transliteration.js432
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ann/ann-tilde.js30
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ar/ar-kbd.js115
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/as/as-avro.js168
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/as/as-bornona.js84
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/as/as-inscript.js124
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/as/as-inscript2.js128
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/as/as-phonetic.js112
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/as/as-rodali.js147
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/as/as-transliteration.js114
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/azb/azb-kbd.js108
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bas/bas-tilde.js31
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bbc/batak-qwerty.js89
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bci/bci-tilde.js28
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/be/be-kbd.js101
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/be/be-latin.js38
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/be/be-transliteration.js94
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ber/ber-tfng.js54
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bgn/bgn-kbd.js108
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bkm/bkm-tilde.js41
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bm/bm-alt.js32
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bm/bm-tilde.js31
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-avro.js194
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-inscript.js123
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-inscript2.js128
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-nkb.js133
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-probhat.js102
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bo/bo-ewts.js285
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bo/bo-sambhota.js190
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/brx/brx-inscript.js112
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/brx/brx-inscript2.js117
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/bwr/bwr-tilde.js27
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/byn/byn-geezim.js421
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-arkbd.js103
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-fakbd.js104
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-lakbd.js100
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/cv/README.md26
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-cyr-altgr.js120
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-cyr-numbers.js112
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-lat-altgr.js34
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/cyrl/cyrl-palochka.js59
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/da/da-normforms.js49
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/dag/dag-alt.js31
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/dag/dag-tilde.js32
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/de/de-transliteration.js27
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/din/din-fqsx.js49
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/din/din-tilde.js28
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/doi/doi-inscript2.js119
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ee/ee-tilde.js37
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/efi/efi-tilde.js30
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/el/el-kbd.js96
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-h-f.js59
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-h.js54
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-plena.js99
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-q.js55
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-transliteration.js49
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-vi.js65
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-x.js53
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/fa/fa-kbd.js167
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ff/ff-alt.js38
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ff/ff-tilde.js32
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/fi/fi-transliteration.js32
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/fo/fo-normforms.js65
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/fon/fon-tilde.js29
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/fonipa/ipa-sil.js240
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/fonipa/ipa-x-sampa.js189
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/gaa/gaa-cqx.js32
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/gaa/gaa-tilde.js28
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/gom/gom-inscript2.js119
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/got/got-standard.js45
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-inscript.js113
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-inscript2.js118
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-phonetic.js110
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-transliteration.js156
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/gur/gur-tilde.js36
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ha/ha-tilde.js33
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/he/he-standard-2012-extonly.js68
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/he/he-standard-2012.js117
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-bolnagri.js108
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-inscript.js122
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-inscript2.js127
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-phonetic.js111
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-transliteration.js198
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hoc/hoc-transliteration.js105
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hr/hr-kbd.js60
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-emslegacy.js169
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-ephonetic.js173
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-ephoneticalt.js171
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-typewriter.js168
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-wmslegacy.js169
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ig/ig-tilde.js29
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/is/is-normforms.js78
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ish/ish-tilde.js22
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/jv/jv-transliteration.js273
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ka/ka-kbd.js56
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ka/ka-transliteration.js58
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/kab/kab-tilde.js41
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/kbp/kbp-tilde.js35
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/kcg/kcg-tilde.js24
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ki/ki-tilde.js22
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/kk/kk-arabic.js62
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/kk/kk-kbd.js108
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/km/km-nidakyk.js270
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-inscript.js111
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-inscript2.js119
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-kgp.js104
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-transliteration.js154
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/kr/kr-tilde.js27
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ks/ks-inscript.js129
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ks/ks-kbd.js98
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ku/ku-h.js47
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ku/ku-tr.js32
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ky/ky-cyrl-alt.js25
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/lg/lg-tilde.js20
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ln/ln-tilde.js25
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/lo/lo-kbd.js122
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/lrc/lrc-kbd.js108
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/lud/lud-transliteration.js29
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/lut/lut-tulalip.js55
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mad/mad-tilde.js26
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mai/mai-inscript.js22
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mai/mai-inscript2.js25
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mg/mg-tilde.js25
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mh/mh.js43
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-inscript.js90
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-inscript2.js132
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-transliteration.js338
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-cyrl.js118
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-todo.js112
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-todoali.js112
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-trad.js112
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-tradali.js111
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mn/phagspa.js112
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mnc/mnc-ali.js112
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mnc/mnc.js112
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mni/mni-inscript2.js125
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mnw/mnw-simplified-anonta.js105
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-inscript.js115
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-inscript2.js121
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-phonetic.js110
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-transliteration.js147
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mul-bf/mul-bf.js48
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/mul-cm/mul-cm.js65
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/my/my-mm3.js155
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/my/my-xkb.js105
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/nb/nb-normforms.js50
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/nb/nb-tildeforms.js35
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-inscript.js113
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-inscript2.js116
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-rom.js106
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-trad.js106
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-transliteration.js165
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/nia/nia-tilde.js22
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/nmz/nmz-tilde.js29
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/nqo/nqo-standard-qwerty.js93
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/nqo/nqo-transliteration.js102
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/nso/nso-tilde.js24
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/nus/nus-tilde.js28
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ny/ny-tilde.js21
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/or/or-OdiScript.js115
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript.js106
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript2.js116
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/or/or-lekhani.js172
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/or/or-phonetic.js110
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/or/or-transliteration.js149
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-inscript.js97
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-inscript2.js111
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-jhelum.js131
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-phonetic.js98
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-transliteration.js119
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/pms/pms.js38
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/roa-tara/roa-tara.js24
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-jcuken.js96
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-kbd.js100
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-phonetic.js83
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-yawerty.js109
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-iast.js59
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-inscript.js113
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-inscript2.js117
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-transliteration.js165
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sah/sah-transliteration.js103
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-inscript2-ol-chiki.js64
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-inscript2.js107
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-sarjom-baha.js83
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sd/sd-inscript2.js124
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sdh/sdh-kbd.js108
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/se/se-normforms.js38
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ses/ses-tilde.js40
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sg/sg-tilde.js24
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/si/si-singlish.js110
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/si/si-wijesekara.js105
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sjo/sjo.js112
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sk/sk-kbd.js105
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sr/sr-kbd.js98
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/st/st-tilde.js22
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/sv/sv-normforms.js50
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-99.js190
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-bamini.js90
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-inscript.js103
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-inscript2.js107
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-transliteration.js120
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/te/te-apple.js159
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/te/te-inscript.js122
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/te/te-inscript2.js126
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/te/te-modular.js179
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/te/te-transliteration.js221
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/th/th-kedmanee.js115
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/th/th-pattachote.js115
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ti/ti-geezim.js421
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/tig/tig-geezim.js421
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/tn/tn-tilde.js24
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/tum/tum-tilde.js21
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/udm/udm-alt.js40
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ug/ug-kbd.js79
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/uk/uk-kbd.js101
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ur/ur-phonetic.js98
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ur/ur-transliteration.js98
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/uz/uz-kbd.js102
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/vai/vai-transliteration.js322
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/ve/ve-tilde.js28
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/vec/vec-GVU.js36
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/wo/wo-alt.js32
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/wo/wo-tilde.js28
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/yo/yo-alt.js24
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/yo/yo-tilde.js29
-rw-r--r--UniversalLanguageSelector/lib/jquery.ime/rules/zh/zh-pinyin-transliteration.js60
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/CREDITS16
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/GPL-LICENSE342
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/MIT-LICENSE22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.css119
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.grid.css307
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.lcd.css140
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.mobile.css307
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/aeb-latn.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/af.json26
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/am.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/anp.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ar.json26
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/arn.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/arz.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/as.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ast.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/av.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/awa.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/az.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/azb.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ba.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ban-bali.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ban.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/bbc-latn.json17
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/bcc.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/bci.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/bcl.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/be-tarask.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/be.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/bg.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/bgn.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/blk.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/bn.json26
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/br.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/bs.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/bto.json13
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ca.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ce.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ckb.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/cop.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/cs.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/cv.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/cy.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/da.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/de-formal.json12
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/de.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/diq.json27
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/dsb.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/dty.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ee.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/el.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/en-gb.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/en.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/eo.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/es.json27
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/et.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/eu.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/fa.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/fat.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/fi.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/fit.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/fo.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/fr.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/fur.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/fy.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ga.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/gcr.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/gd.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/gl.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/glk.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/gn.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/gom-deva.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/gom-latn.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/got.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/grc.json18
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/gsw.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/gu.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/guc.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/guw.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ha.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/hak.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/haw.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/he.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/hi.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/hif-latn.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/hoc.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/hr.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/hrx.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/hsb.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ht.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/hu.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/hy.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/hyw.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ia.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/id.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ie.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ike-cans.json15
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ilo.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/inh.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/io.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/is.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/it.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ja.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/jv.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ka.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/kab.json27
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/kcg.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/khw.json13
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/kiu.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/kjh.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/kjp.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/kk-cyrl.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/km.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/kn.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ko.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/krc.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ks-arab.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ksh.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ksw.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ku-latn.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ky.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/lb.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/lez.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/li.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/lki.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/lrc.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/lt.json26
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/lv.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/map-bms.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mg.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/min.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mk.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ml.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mn.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mnc.json12
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mni.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mnw.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mr.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mrh.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ms-arab.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ms.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mt.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mwl.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/my.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/mzn.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nah.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nap.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nb.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nds-nl.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ne.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nia.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nl-informal.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nl.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nn.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nod.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nqo.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nso.json15
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/nyn.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/oc.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/olo.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/om.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/or.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/os.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/pa.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/pl.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/pms.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/pnb.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ps.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/pt-br.json27
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/pt.json28
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/qqq.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/rn.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ro.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/roa-tara.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/rsk.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ru.json26
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/rup.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/rw.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sa.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sah.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sc.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/scn.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sco.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sd.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sdh.json13
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/shn.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/si.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sk.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/skr-arab.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sl.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/smn.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sms.json11
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sq.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sr-ec.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sr-el.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sro.json13
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sv.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/sw.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/syl.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/szy.json11
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ta.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/tcy.json16
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/tdd.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/te.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/th.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ti.json19
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/tl.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/tly.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/tok.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/tr.json28
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/tt-cyrl.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/tum.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/tw.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/twd.json11
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/tzm.json14
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/udm.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ug-arab.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/uk.json25
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/ur.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/uz.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/vec.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/vep.json20
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/vi.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/vo.json12
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/war.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/xmf.json19
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/yi.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/yrl.json22
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/yue.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/zea.json16
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/zgh.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hans.json23
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hant.json24
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hk.json21
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/images/close.svg8
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/images/language.svg7
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/images/search.svg7
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.core.js499
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.js6461
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.utils.js335
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.languagefilter.js361
-rw-r--r--UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.lcd.js481
-rw-r--r--UniversalLanguageSelector/lib/jquery.webfonts/GPL-LICENSE342
-rw-r--r--UniversalLanguageSelector/lib/jquery.webfonts/MIT-LICENSE22
-rw-r--r--UniversalLanguageSelector/lib/jquery.webfonts/src/jquery.webfonts.js518
-rw-r--r--UniversalLanguageSelector/lib/rangy/rangy-core.js3845
485 files changed, 45268 insertions, 0 deletions
diff --git a/UniversalLanguageSelector/lib/jquery.ime/GPL-LICENSE b/UniversalLanguageSelector/lib/jquery.ime/GPL-LICENSE
new file mode 100644
index 00000000..019694a9
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/GPL-LICENSE
@@ -0,0 +1,342 @@
+== GNU GENERAL PUBLIC LICENSE ==
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+=== Preamble ===
+
+The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+
+'''0.''' This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+'''1.''' You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+'''2.''' You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ '''a)''' You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ '''b)''' You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ '''c)''' If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+'''3.''' You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ '''a)''' Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ '''b)''' Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ '''c)''' Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+'''4.''' You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+'''5.''' You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+'''6.''' Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+'''7.''' If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+'''8.''' If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+'''9.''' The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+'''10.''' If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+=== NO WARRANTY ===
+
+'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ '''END OF TERMS AND CONDITIONS'''
+
+== How to Apply These Terms to Your New Programs ==
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/UniversalLanguageSelector/lib/jquery.ime/MIT-LICENSE b/UniversalLanguageSelector/lib/jquery.ime/MIT-LICENSE
new file mode 100644
index 00000000..8a9a70a7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/MIT-LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
+Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
+contributors. See CREDITS for a list.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/UniversalLanguageSelector/lib/jquery.ime/css/jquery.ime.css b/UniversalLanguageSelector/lib/jquery.ime/css/jquery.ime.css
new file mode 100644
index 00000000..5883565c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/css/jquery.ime.css
@@ -0,0 +1,214 @@
+.imeselector {
+ position: absolute;
+ /* @embed */
+ background: url( ../images/ime-active.png ) no-repeat left center;
+ /* @embed */
+ background-image: -webkit-linear-gradient( transparent, transparent ), url( ../images/ime-active.svg );
+ /* @embed */
+ background-image: linear-gradient( transparent, transparent ), url( ../images/ime-active.svg );
+ background-color: rgba( 255, 255, 255, 0.75 );
+ background-position: left 3px center;
+ min-height: 15px;
+ font-size: small;
+ padding: 2px 2px 1px 20px;
+ box-shadow: 0 1px 3px 0 #777;
+ margin-top: 0;
+ text-align: left;
+ font-family: sans-serif;
+ white-space: nowrap;
+ z-index: 1000;
+}
+
+.imeselector:hover {
+ box-shadow: 0 1px 3px 0 #565656;
+ border-top: 0;
+ background-color: rgba( 255, 255, 255, 0.85 );
+}
+
+.imeselector a,
+.ime-disable {
+ cursor: pointer;
+ text-decoration: none;
+ outline: 0;
+ color: #222;
+ line-height: 1em;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+
+.ime-setting-caret {
+ margin-left: 2px;
+ margin-top: 8px;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 4px solid #565656;
+ content: '';
+ display: inline-block;
+ height: 0;
+ vertical-align: top;
+ width: 0;
+}
+
+span.ime-disable-link {
+ padding-left: 20px;
+ white-space: nowrap;
+}
+
+span.ime-disable-shortcut {
+ text-align: right;
+ margin-left: 10px;
+ color: #888;
+ font-size: smaller;
+ padding-right: 4px;
+}
+
+.ime-list-title,
+.ime-lang-title {
+ color: #39d;
+ border-bottom: solid 1px #39d;
+ text-align: left;
+ font-size: larger;
+ font-weight: normal;
+ padding-bottom: 5px;
+ padding-left: 20px;
+ padding-top: 9px;
+ margin: 0 0 1px;
+}
+
+.ime-language-list-wrapper {
+ position: relative;
+ padding: 0;
+ display: block;
+ overflow-y: auto;
+ max-height: 150px;
+}
+
+.imeselector-menu {
+ background-color: #fff;
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding-box;
+ background-clip: padding-box;
+ position: absolute;
+ top: 14px;
+ right: 0;
+ display: none;
+ float: left;
+ margin-top: 13px;
+ min-width: 160px;
+ padding: 0;
+ border: 1px solid #a2a9b1;
+ border-radius: 2px;
+ -webkit-box-shadow: 0 5px 10px rgba( 0, 0, 0, 0.2 );
+ -moz-box-shadow: 0 5px 10px rgba( 0, 0, 0, 0.2 );
+ box-shadow: 0 5px 10px rgba( 0, 0, 0, 0.2 );
+ text-align: left;
+}
+
+.imeselector-menu.ime-right {
+ right: auto;
+}
+
+.imeselector-menu ul {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+/* The triangle shaped callout */
+.imeselector-menu:before {
+ border-bottom: 7px solid #a2a9b1;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ content: '';
+ display: inline-block;
+ right: 9px;
+ position: absolute;
+ top: -7px;
+}
+
+.imeselector-menu.ime-right:before {
+ right: auto;
+ left: 9px;
+}
+
+.imeselector-menu:after {
+ border-bottom: 6px solid #fff;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ content: '';
+ display: inline-block;
+ right: 10px;
+ position: absolute;
+ top: -6px;
+}
+
+.imeselector-menu.ime-right:after {
+ right: auto;
+ left: 10px;
+}
+
+.imeselector-menu.ime-position-top:before {
+ border-bottom: 0;
+ border-top: 7px solid #a2a9b1;
+ top: auto;
+ bottom: -7px;
+}
+
+.imeselector-menu.ime-position-top:after {
+ border-bottom: 0;
+ border-top: 6px solid #fff;
+ top: auto;
+ bottom: -6px;
+}
+
+.imeselector-menu .ime-checked {
+ /* @embed */
+ background: url( ../images/tick.png ) no-repeat left 4px center;
+ /* @embed */
+ background-image: -webkit-linear-gradient( transparent, transparent ), url( ../images/tick.svg );
+ /* @embed */
+ background-image: linear-gradient( transparent, transparent ), url( ../images/tick.svg );
+}
+
+.imeselector-menu .ime-help-link {
+ background-color: #f0f0f0;
+ border-radius: 0 0 2px 2px;
+ border-top: 1px solid #ddd;
+ margin-top: 6px;
+ padding: 2px 0;
+ color: #444;
+}
+
+.imeselector-menu .ime-help-link > a:hover {
+ background-color: #f0f0f0;
+ color: #000;
+}
+
+.imeselector-menu .selectable-row-item {
+ color: #333;
+ display: block;
+ padding-left: 20px;
+ padding-right: 20px;
+ font-weight: normal;
+ outline: 0;
+ white-space: nowrap;
+ position: relative;
+}
+
+.imeselector-menu .selectable-row {
+ cursor: pointer;
+}
+
+.imeselector-menu .selectable-row:hover {
+ background-color: #f0f0f0;
+}
+
+.ime-open {
+ z-index: 1000;
+ display: block;
+}
+
+.imeselector-menu li {
+ position: relative;
+}
diff --git a/UniversalLanguageSelector/lib/jquery.ime/images/ime-active.png b/UniversalLanguageSelector/lib/jquery.ime/images/ime-active.png
new file mode 100644
index 00000000..e299c827
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/images/ime-active.png
Binary files differ
diff --git a/UniversalLanguageSelector/lib/jquery.ime/images/ime-active.svg b/UniversalLanguageSelector/lib/jquery.ime/images/ime-active.svg
new file mode 100644
index 00000000..a9dcfdb2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/images/ime-active.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="15" height="11"><path d="M9 1.281c-.124.259-.185.599-.5.688-.55.081-1.133.018-1.688 0-.866-.032-1.733-.148-2.594 0-.588.157-.953.727-1.188 1.25-.178.416-.271.836-.344 1.281h-2.688v11.5h20v-11.5h-16.344c.109-.52.203-1.057.563-1.469.222-.231.587-.17.875-.188 1.212.003 2.415.179 3.625.063.463-.058.812-.455.969-.875l.188-.438-.875-.313zm-7.125 5.844h1.563c.094 0 .188.093.188.188v1.531c0 .094-.093.188-.188.188h-1.563c-.094 0-.156-.093-.156-.188v-1.531c0-.094.062-.188.156-.188zm2.844 0h1.563c.094 0 .156.093.156.188v1.531c0 .094-.062.188-.156.188h-1.563c-.094 0-.156-.093-.156-.188v-1.531c0-.094.062-.188.156-.188zm2.844 0h1.563c.094 0 .156.093.156.188v1.531c0 .094-.062.188-.156.188h-1.563c-.094 0-.188-.093-.188-.188v-1.531c0-.094.093-.188.188-.188zm2.813 0h1.563c.094 0 .188.093.188.188v1.531c0 .094-.093.188-.188.188h-1.563c-.094 0-.156-.093-.156-.188v-1.531c0-.094.062-.188.156-.188zm2.844 0h1.563c.094 0 .156.093.156.188v1.531c0 .094-.062.188-.156.188h-1.563c-.094 0-.156-.093-.156-.188v-1.531c0-.094.062-.188.156-.188zm2.844 0h1.531c.094 0 .188.093.188.188v1.531c0 .094-.093.188-.188.188h-1.531c-.094 0-.188-.093-.188-.188v-1.531c0-.094.093-.188.188-.188zm-12.844 3h1.563c.094 0 .156.093.156.188v1.563c0 .094-.062.156-.156.156h-1.563c-.094 0-.156-.062-.156-.156v-1.563c0-.094.062-.188.156-.188zm2.906 0h1.563c.094 0 .188.093.188.188v1.563c0 .094-.093.156-.188.156h-1.563c-.094 0-.156-.062-.156-.156v-1.563c0-.094.062-.188.156-.188zm2.938 0h1.531c.094 0 .188.093.188.188v1.563c0 .094-.093.156-.188.156h-1.531c-.094 0-.188-.062-.188-.156v-1.563c0-.094.093-.188.188-.188zm2.906 0h1.563c.094 0 .156.093.156.188v1.563c0 .094-.062.156-.156.156h-1.563c-.094 0-.188-.062-.188-.156v-1.563c0-.094.093-.188.188-.188zm2.906 0h1.563c.094 0 .156.093.156.188v1.563c0 .094-.062.156-.156.156h-1.563c-.094 0-.156-.062-.156-.156v-1.563c0-.094.062-.188.156-.188zm-10.875 3.563h12c.088 0 .156.068.156.156v.844c0 .088-.068.156-.156.156h-12c-.088 0-.156-.068-.156-.156v-.844c0-.088.068-.156.156-.156z" fill="#565656" transform="scale(.75) translate(0 -1.3)"/></svg> \ No newline at end of file
diff --git a/UniversalLanguageSelector/lib/jquery.ime/images/tick.png b/UniversalLanguageSelector/lib/jquery.ime/images/tick.png
new file mode 100644
index 00000000..5499831b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/images/tick.png
Binary files differ
diff --git a/UniversalLanguageSelector/lib/jquery.ime/images/tick.svg b/UniversalLanguageSelector/lib/jquery.ime/images/tick.svg
new file mode 100644
index 00000000..1e548a3c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/images/tick.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="9"><path d="M11.226.257l-6.718 6.453-2.699-2.575-1.292 1.302c1.33 1.273 2.65 2.557 3.99 3.821 2.654-2.591 5.337-5.153 8.01-7.726z" fill="#222"/></svg> \ No newline at end of file
diff --git a/UniversalLanguageSelector/lib/jquery.ime/jquery.ime.js b/UniversalLanguageSelector/lib/jquery.ime/jquery.ime.js
new file mode 100644
index 00000000..df41e7d4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/jquery.ime.js
@@ -0,0 +1,3177 @@
+/*! jquery.ime - v0.2.0+20220907
+* https://github.com/wikimedia/jquery.ime
+* Copyright (c) 2022 Santhosh Thottingal; License: (GPL-2.0-or-later OR MIT) */
+( function ( $ ) {
+ 'use strict';
+
+ var TextEntryFactory, TextEntry, FormWidgetEntry, ContentEditableEntry,
+ defaultInputMethod;
+
+ /**
+ * private function for debugging
+ *
+ * @param {jQuery} [$obj]
+ */
+ function debug( $obj ) {
+ if ( window.console && window.console.log ) {
+ window.console.log( $obj );
+ }
+ }
+
+ /**
+ * Just initializes an empty static object.
+ * Similar to initClass in https://www.mediawiki.org/wiki/OOjs
+ *
+ * @param {Function} fn
+ */
+ function initClass( fn ) {
+ fn.static = fn.static || {};
+ }
+
+ /**
+ * Inheritance. Uses pattern similar to OOjs (https://www.mediawiki.org/wiki/OOjs).
+ * Extend prototype and static methods and properties of child constructor from
+ * a parent constructor.
+ *
+ * @param {Function} targetFn
+ * @param {Function} originFn
+ */
+ function inheritClass( targetFn, originFn ) {
+ targetFn.parent = originFn;
+ targetFn.prototype = $.extend( {}, originFn.prototype );
+ targetFn.prototype.constructor = originFn.constructor;
+ targetFn.static = $.extend( {}, originFn.static );
+ }
+
+ /**
+ * IME Class
+ *
+ * @class IME
+ * @constructor
+ * @param {HTMLElement} element Element on which to listen for events
+ * @param {TextEntry} textEntry Text entry object to use to get/set text
+ * @param {Object} [options]
+ * @param {Function} [options.helpHandler] Called for each input method row in the selector
+ * @param {Object} [options.helpHandler.imeSelector]
+ * @param {string} [options.helpHandler.ime] Id of the input method
+ */
+ function IME( element, textEntry, options ) {
+ this.$element = $( element );
+ this.textEntry = textEntry;
+ // This needs to be delayed here since extending language list happens at DOM ready
+ $.ime.defaults.languages = Object.keys( $.ime.languages );
+ this.options = $.extend( {}, $.ime.defaults, options );
+ if ( this.options.imePath ) {
+ // Set the global IME path from the one specified to the instance
+ // TODO: remove this functionality and force clients to set the global
+ // IME path
+ $.ime.path = this.options.imePath;
+ }
+ this.active = false;
+ this.shifted = false;
+ this.inputmethod = null;
+ this.language = null;
+ this.context = '';
+ if ( this.options.showSelector ) {
+ this.options.selectorInside = options.selectorInside !== undefined ?
+ options.selectorInside :
+ // eslint-disable-next-line no-jquery/no-class-state
+ this.$element.hasClass( 'ime-position-inside' );
+ this.selector = this.$element.imeselector( this.options );
+ }
+ this.listen();
+ }
+
+ IME.prototype = {
+ constructor: IME,
+
+ /**
+ * Listen for events and bind to handlers
+ */
+ listen: function () {
+ this.$element.on( {
+ 'keypress.ime': this.keypress.bind( this ),
+ 'keyup.ime': this.keyup.bind( this ),
+ 'keydown.ime': this.keydown.bind( this ),
+ 'destroy.ime': this.destroy.bind( this ),
+ 'enable.ime': this.enable.bind( this ),
+ 'disable.ime': this.disable.bind( this )
+ } );
+ },
+
+ /**
+ * Return a list of available language codes
+ *
+ * @return {string[]} Available language codes
+ */
+ getLanguageCodes: function () {
+ return $.ime.defaults.languages;
+ },
+
+ /**
+ * Return the autonym for a language code
+ *
+ * @param {string} languageCode The language code
+ * @return {string|undefined} The autonym, if known
+ */
+ getAutonym: function ( languageCode ) {
+ var info = $.ime.languages[ languageCode ];
+ return info && info.autonym;
+ },
+
+ /**
+ * Return a list of available input method ids for a language
+ *
+ * @param {string} languageCode A language code
+ * @return {string[]} Available input method ids for that language
+ */
+ getInputMethodIds: function ( languageCode ) {
+ var info = $.ime.languages[ languageCode ];
+ return ( info && info.inputmethods ) || [];
+ },
+
+ /**
+ * Return the name of an input method
+ *
+ * @param {string} inputMethodId The id of an input method
+ * @return {string} The input method's name
+ * @see IME#load
+ */
+ getInputMethodName: function ( inputMethodId ) {
+ return $.ime.sources[ inputMethodId ].name;
+ },
+
+ /**
+ * Return a list of input method info { id: ..., name: ... } for a language.
+ *
+ * @param {string} languageCode A language code
+ * @return {Object[]} Info object for each available input method
+ */
+ getInputMethods: function ( languageCode ) {
+ return this.getInputMethodIds( languageCode ).map( function ( inputMethodId ) {
+ return {
+ id: inputMethodId,
+ name: $.ime.sources[ inputMethodId ].name
+ };
+ } );
+ },
+
+ /**
+ * Transliterate a given string input based on context and input method definition.
+ * If there are no matching rules defined, returns the original string.
+ *
+ * @param {string} input
+ * @param {string} context
+ * @param {boolean} altGr whether altGr key is pressed or not
+ * @return {Object} Transliteration object
+ * @return {boolean} return.noop Whether to consider input processed or passed through.
+ * @return {string} return.output The transliterated input or input unmodified.
+ */
+ transliterate: function ( input, context, altGr ) {
+ var patterns, regex, rule, replacement, i, retval;
+
+ if ( altGr ) {
+ patterns = this.inputmethod.patterns_x || [];
+ } else {
+ patterns = this.inputmethod.patterns || [];
+ }
+
+ if ( this.shifted ) {
+ // if shift is pressed give priority for the patterns_shift
+ // if exists.
+ // Example: Shift+space where shift does not alter the keycode
+ patterns = ( this.inputmethod.patterns_shift || [] )
+ .concat( patterns );
+ }
+
+ if ( typeof patterns === 'function' ) {
+ // For backwards compatibility, allow the rule functions to return plain
+ // string. Determine noop by checking whether input is different from
+ // output. If the rule function returns object, just return it as-is.
+ retval = patterns.call( this, input, context );
+ if ( typeof retval === 'string' ) {
+ return { noop: input === retval, output: retval };
+ }
+
+ return retval;
+ }
+
+ for ( i = 0; i < patterns.length; i++ ) {
+ rule = patterns[ i ];
+ regex = new RegExp( rule[ 0 ] + '$' );
+
+ // Last item in the rules.
+ // It can also be a function, because the replace
+ // method can have a function as the second argument.
+ replacement = rule.slice( -1 )[ 0 ];
+
+ // Input string match test
+ if ( regex.test( input ) ) {
+ // Context test required?
+ if ( rule.length === 3 ) {
+ if ( new RegExp( rule[ 1 ] + '$' ).test( context ) ) {
+ return { noop: false, output: input.replace( regex, replacement ) };
+ }
+ } else {
+ return { noop: false, output: input.replace( regex, replacement ) };
+ }
+ }
+ }
+
+ // No matches, return the input
+ return { noop: true, output: input };
+ },
+
+ keyup: function ( e ) {
+ if ( e.which === 16 ) { // shift key
+ this.shifted = false;
+ }
+ },
+
+ keydown: function ( e ) {
+ if ( e.which === 16 ) { // shift key
+ this.shifted = true;
+ }
+ },
+
+ /**
+ * Keypress handler
+ *
+ * @param {jQuery.Event} e Event
+ * @return {boolean}
+ */
+ keypress: function ( e ) {
+ var altGr = false,
+ c, input, replacement;
+
+ if ( !this.active ) {
+ return true;
+ }
+
+ if ( !this.inputmethod ) {
+ return true;
+ }
+
+ // handle backspace
+ if ( e.which === 8 ) {
+ // Blank the context
+ this.context = '';
+ return true;
+ }
+
+ if ( e.altKey || e.altGraphKey ) {
+ altGr = true;
+ }
+
+ // Don't process ASCII control characters except linefeed,
+ // as well as anything involving Ctrl, Meta and Alt,
+ // but do process extended keymaps
+ if ( ( e.which < 32 && e.which !== 13 && !altGr ) || e.ctrlKey || e.metaKey ) {
+ // Blank the context
+ this.context = '';
+
+ return true;
+ }
+
+ c = String.fromCharCode( e.which );
+
+ // Append the character being typed to the preceding few characters,
+ // to provide context for the transliteration regexes.
+ input = this.textEntry.getTextBeforeSelection( this.inputmethod.maxKeyLength );
+ replacement = this.transliterate( input + c, this.context, altGr );
+
+ // Update the context
+ this.context += c;
+
+ if ( this.context.length > this.inputmethod.contextLength ) {
+ // The buffer is longer than needed, truncate it at the front
+ this.context = this.context.substring(
+ this.context.length - this.inputmethod.contextLength
+ );
+ }
+
+ // Allow rules to explicitly define whether we match something.
+ // Otherwise we cannot distinguish between no matching rule and
+ // rule that provides identical output but consumes the event
+ // to prevent normal behavior. See Udmurt layout which uses
+ // altgr rules to allow typing the original character.
+ if ( replacement.noop ) {
+ return true;
+ }
+
+ this.textEntry.replaceTextAtSelection( input.length, replacement.output );
+
+ e.stopPropagation();
+
+ return false;
+ },
+
+ /**
+ * Check whether the input method is active or not
+ *
+ * @return {boolean}
+ */
+ isActive: function () {
+ return this.active;
+ },
+
+ /**
+ * Disable the input method
+ */
+ disable: function () {
+ this.active = false;
+ $.ime.preferences.setIM( 'system' );
+ },
+
+ /**
+ * Enable the input method
+ */
+ enable: function () {
+ this.active = true;
+ },
+
+ /**
+ * Toggle the active state of input method
+ */
+ toggle: function () {
+ this.active = !this.active;
+ },
+
+ /**
+ * Destroy the binding of ime to the editable element
+ */
+ destroy: function () {
+ $( document.body ).off( '.ime' );
+ this.$element.off( '.ime' ).removeData( 'ime' ).removeData( 'imeselector' );
+ },
+
+ /**
+ * Get the current input method
+ *
+ * @return {string} Current input method id
+ */
+ getIM: function () {
+ return this.inputmethod;
+ },
+
+ /**
+ * Set the current input method
+ *
+ * @param {string} inputmethodId
+ * @fires imeLanguageChange
+ */
+ setIM: function ( inputmethodId ) {
+ this.inputmethod = $.ime.inputmethods[ inputmethodId ];
+ $.ime.preferences.setIM( inputmethodId );
+ this.$element.trigger( 'imeMethodChange' );
+ },
+
+ /**
+ * Set the current Language
+ *
+ * @param {string} languageCode
+ * @fires imeLanguageChange
+ * @return {boolean}
+ */
+ setLanguage: function ( languageCode ) {
+ if ( !$.ime.languages[ languageCode ] ) {
+ debug( 'Language ' + languageCode + ' is not known to jquery.ime.' );
+
+ return false;
+ }
+
+ this.language = languageCode;
+ $.ime.preferences.setLanguage( languageCode );
+ this.$element.trigger( 'imeLanguageChange' );
+ return true;
+ },
+
+ /**
+ * Get current language
+ *
+ * @return {string}
+ */
+ getLanguage: function () {
+ return this.language;
+ },
+
+ /**
+ * load an input method by given id
+ *
+ * @param {string} inputmethodId
+ * @return {jQuery.Promise}
+ */
+ load: function ( inputmethodId ) {
+ return $.ime.load( inputmethodId );
+ }
+ };
+
+ /**
+ * TextEntry factory
+ *
+ * @class TextEntryFactory
+ * @constructor
+ */
+ TextEntryFactory = function IMETextEntryFactory() {
+ this.TextEntryClasses = [];
+ };
+
+ /* Inheritance */
+
+ initClass( TextEntryFactory );
+
+ /* Methods */
+
+ /**
+ * Register a TextEntry class, with priority over previous registrations
+ *
+ * @param {TextEntry} TextEntryClass Class to register
+ */
+ TextEntryFactory.prototype.register = function ( TextEntryClass ) {
+ this.TextEntryClasses.unshift( TextEntryClass );
+ };
+
+ /**
+ * Wrap an editable element with the appropriate TextEntry class
+ *
+ * @param {jQuery} $element The element to wrap
+ * @return {TextEntry|null} A TextEntry, or null if no match
+ */
+ TextEntryFactory.prototype.wrap = function ( $element ) {
+ var i, len, TextEntryClass;
+ // eslint-disable-next-line no-jquery/no-class-state
+ if ( $element.hasClass( 'noime' ) ) {
+ return null;
+ }
+ for ( i = 0, len = this.TextEntryClasses.length; i < len; i++ ) {
+ TextEntryClass = this.TextEntryClasses[ i ];
+ if ( TextEntryClass.static.canWrap( $element ) ) {
+ return new TextEntryClass( $element );
+ }
+ }
+ return null;
+ };
+
+ /* Initialization */
+
+ TextEntryFactory.static.singleton = new TextEntryFactory();
+
+ /**
+ * Generic text entry
+ *
+ * @class TextEntry
+ * @abstract
+ */
+ TextEntry = function IMETextEntry() {
+ };
+
+ /* Inheritance */
+
+ initClass( TextEntry );
+
+ /* Static methods */
+
+ /**
+ * Test whether can wrap this type of element
+ *
+ * @param {jQuery} $element The element to wrap
+ * @return {boolean} Whether the element can be wrapped
+ */
+ TextEntry.static.canWrap = function () {
+ return false;
+ };
+
+ /* Abstract methods */
+
+ /**
+ * Get text immediately before the current selection start.
+ *
+ * This SHOULD return the empty string for non-collapsed selections.
+ *
+ * @param {number} maxLength Maximum number of chars (code units) to return
+ * @return {string} Up to maxLength of text
+ */
+ TextEntry.prototype.getTextBeforeSelection = null;
+
+ /**
+ * Replace the currently selected text and/or text before the selection
+ *
+ * @param {number} precedingCharCount Number of chars before selection to replace
+ * @param {string} newText Replacement text
+ */
+ TextEntry.prototype.replaceTextAtSelection = null;
+
+ /**
+ * TextEntry class for input/textarea widgets
+ *
+ * @class FormWidgetEntry
+ * @constructor
+ * @param {jQuery} $element The element to wrap
+ */
+ FormWidgetEntry = function IMEFormWidgetEntry( $element ) {
+ this.$element = $element;
+ };
+
+ /* Inheritance */
+
+ inheritClass( FormWidgetEntry, TextEntry );
+
+ /* Static methods */
+
+ /**
+ * @inheritdoc TextEntry
+ */
+ FormWidgetEntry.static.canWrap = function ( $element ) {
+ return $element.is( 'input:not([type]), input[type=text], input[type=search], textarea' ) &&
+ !$element.prop( 'readonly' ) &&
+ !$element.prop( 'disabled' );
+ };
+
+ /* Instance methods */
+
+ /**
+ * @inheritdoc TextEntry
+ */
+ FormWidgetEntry.prototype.getTextBeforeSelection = function ( maxLength ) {
+ var element = this.$element.get( 0 );
+ return this.$element.val().substring(
+ Math.max( 0, element.selectionStart - maxLength ),
+ element.selectionStart
+ );
+ };
+
+ /**
+ * @inheritdoc TextEntry
+ */
+ FormWidgetEntry.prototype.replaceTextAtSelection = function ( precedingCharCount, newText ) {
+ var element = this.$element.get( 0 ),
+ start = element.selectionStart,
+ scrollTop = element.scrollTop;
+
+ // Replace the whole text of the text area:
+ // text before + newText + text after.
+ // This could be made better if range selection worked on browsers.
+ // But for complex scripts, browsers place cursor in unexpected places
+ // and it's not possible to fix cursor programmatically.
+ // Ref Bug https://bugs.webkit.org/show_bug.cgi?id=66630
+ element.value = element.value.substring( 0, start - precedingCharCount ) +
+ newText +
+ element.value.substring( element.selectionEnd, element.value.length );
+
+ // restore scroll
+ element.scrollTop = scrollTop;
+ // set selection
+ element.selectionStart = element.selectionEnd = start - precedingCharCount + newText.length;
+ };
+
+ TextEntryFactory.static.singleton.register( FormWidgetEntry );
+
+ /**
+ * TextEntry class for ContentEditable
+ *
+ * @class ContentEditableEntry
+ * @constructor
+ * @param {jQuery} $element The element to wrap
+ */
+ ContentEditableEntry = function IMEContentEditableEntry( $element ) {
+ this.$element = $element;
+ };
+
+ /* Inheritance */
+
+ inheritClass( ContentEditableEntry, TextEntry );
+
+ /* Static methods */
+
+ /**
+ * @inheritdoc TextEntry
+ */
+ ContentEditableEntry.static.canWrap = function ( $element ) {
+ return $element.is( '[contenteditable]' );
+ };
+
+ /* Instance methods */
+
+ /**
+ * @inheritdoc TextEntry
+ */
+ ContentEditableEntry.prototype.getTextBeforeSelection = function ( maxLength ) {
+ var range = this.getSelectedRange();
+ if ( !range || !range.collapsed || range.startContainer.nodeType !== Node.TEXT_NODE ) {
+ return '';
+ }
+ return range.startContainer.nodeValue.substring(
+ Math.max( 0, range.startOffset - maxLength ),
+ range.startOffset
+ );
+ };
+
+ /**
+ * @inheritdoc SelectionWrapper
+ */
+ ContentEditableEntry.prototype.replaceTextAtSelection = function (
+ precedingCharCount,
+ newText
+ ) {
+ var textNode, textOffset, newOffset, newRange,
+ sel = window.getSelection(),
+ range = this.getSelectedRange();
+
+ if ( !range ) {
+ return;
+ }
+
+ // Trigger any externally registered jQuery compositionstart event listeners.
+ // TODO: Try node.dispatchEvent( new CompositionEvent(...) ) so listeners not
+ // registered using jQuery will also get triggered, then fallback gracefully for
+ // browsers that do not support it.
+ this.$element.trigger( 'compositionstart' );
+
+ if ( !range.collapsed ) {
+ range.deleteContents();
+ }
+
+ newRange = document.createRange();
+ if ( range.startContainer.nodeType === Node.TEXT_NODE ) {
+ // Alter this text node's content and move the cursor
+ textNode = range.startContainer;
+ textOffset = range.startOffset;
+ textNode.nodeValue =
+ textNode.nodeValue.substr( 0, textOffset - precedingCharCount ) +
+ newText +
+ textNode.nodeValue.substr( textOffset );
+ newOffset = textOffset - precedingCharCount + newText.length;
+ newRange.setStart( range.startContainer, newOffset );
+ newRange.setEnd( range.startContainer, newOffset );
+ } else {
+ // XXX assert precedingCharCount === 0
+ // Insert a new text node with the new text
+ textNode = document.createTextNode( newText );
+ range.startContainer.insertBefore(
+ textNode,
+ range.startContainer.childNodes[ range.startOffset ]
+ );
+ newRange.setStart( textNode, textNode.length );
+ newRange.setEnd( textNode, textNode.length );
+ }
+ sel.removeAllRanges();
+ sel.addRange( newRange );
+
+ // Trigger any externally registered jQuery compositionend / input event listeners.
+ // TODO: Try node.dispatchEvent( new CompositionEvent(...) ) so listeners not
+ // registered using jQuery will also get triggered, then fallback gracefully for
+ // browsers that do not support it.
+ this.$element.trigger( 'compositionend' );
+ this.$element.trigger( 'input' );
+ };
+
+ /**
+ * Get the selection range inside the wrapped element, or null
+ *
+ * @return {Range|null} The selection range
+ */
+ ContentEditableEntry.prototype.getSelectedRange = function () {
+ var range,
+ sel = window.getSelection();
+
+ if ( sel.rangeCount === 0 ) {
+ return null;
+ }
+ range = sel.getRangeAt( 0 );
+ if ( !this.$element[ 0 ].contains( range.commonAncestorContainer ) ) {
+ return null;
+ }
+ return range;
+ };
+
+ TextEntryFactory.static.singleton.register( ContentEditableEntry );
+
+ /* Exports */
+
+ /**
+ * jQuery plugin ime
+ *
+ * @param {Object} option
+ * @return {jQuery}
+ */
+ $.fn.ime = function ( option ) {
+ return this.each( function () {
+ var data, textEntry,
+ $this = $( this ),
+ options = typeof option === 'object' && option;
+
+ data = $this.data( 'ime' );
+ if ( !data ) {
+ textEntry = TextEntryFactory.static.singleton.wrap( $this );
+ if ( !textEntry ) {
+ return;
+ }
+ data = new IME( this, textEntry, options );
+ $this.data( 'ime', data );
+ }
+
+ if ( typeof option === 'string' ) {
+ data[ option ]();
+ }
+ } );
+ };
+
+ $.ime = {};
+ $.ime.inputmethods = {};
+ $.ime.sources = {};
+ $.ime.preferences = {};
+ $.ime.languages = {};
+
+ /**
+ * @property {string} Relative or absolute path for the rules folder of jquery.ime
+ */
+ $.ime.path = '../';
+ $.ime.textEntryFactory = TextEntryFactory.static.singleton;
+ $.ime.TextEntry = TextEntry;
+ $.ime.inheritClass = inheritClass;
+
+ defaultInputMethod = {
+ contextLength: 0,
+ maxKeyLength: 1
+ };
+
+ /**
+ * load an input method by given id
+ *
+ * @param {string} inputmethodId
+ * @return {jQuery.Promise}
+ */
+ $.ime.load = function ( inputmethodId ) {
+ var dependency,
+ deferred = $.Deferred();
+
+ if ( $.ime.inputmethods[ inputmethodId ] ) {
+ return deferred.resolve();
+ }
+
+ // Validate the input method id.
+ if ( !$.ime.sources[ inputmethodId ] ) {
+ return deferred.reject();
+ }
+
+ dependency = $.ime.sources[ inputmethodId ].depends;
+ if ( dependency && !$.ime.inputmethods[ dependency ] ) {
+ $.ime.load( dependency ).done( function () {
+ $.ime.load( inputmethodId ).done( function () {
+ deferred.resolve();
+ } );
+ } );
+
+ return deferred;
+ }
+
+ debug( 'Loading ' + inputmethodId );
+ deferred = $.ajax( {
+ url: $.ime.path + $.ime.sources[ inputmethodId ].source,
+ dataType: 'script',
+ cache: true
+ } ).done( function () {
+ debug( inputmethodId + ' loaded' );
+ } ).fail( function ( jqxhr, settings, exception ) {
+ debug( 'Error in loading inputmethod ' + inputmethodId + ' Exception: ' + exception );
+ } );
+
+ return deferred.promise();
+ };
+
+ $.ime.register = function ( inputMethod ) {
+ $.ime.inputmethods[ inputMethod.id ] = $.extend( {}, defaultInputMethod, inputMethod );
+ };
+
+ /**
+ * Set the relative/absolute path to rules/ (for loading input methods)
+ *
+ * @param {string} path The relative/absolute path in which rules/ lies
+ */
+ $.ime.setPath = function ( path ) {
+ $.ime.path = path;
+ };
+
+ // default options
+ $.ime.defaults = {
+ languages: [], // Languages to be used- by default all languages
+ helpHandler: null, // Called for each ime option in the menu
+ showSelector: true,
+ selectorInside: undefined // If not set will check if '.ime-position-inside' class is preset
+ };
+}( jQuery ) );
+
+( function ( $ ) {
+ 'use strict';
+
+ var selectorTemplate, MutationObserver;
+
+ function IMESelector( element, options ) {
+ this.$element = $( element );
+ this.options = $.extend( {}, IMESelector.defaults, options );
+ this.active = false;
+ this.$imeSetting = null;
+ this.$menu = null;
+ this.inputmethod = null;
+ this.timer = null;
+ this.init();
+ this.listen();
+ }
+
+ function languageListTitle() {
+ return $( '<h3>' )
+ .addClass( 'ime-lang-title' )
+ .attr( 'data-i18n', 'jquery-ime-other-languages' )
+ .text( 'Other languages' );
+ }
+
+ function imeList() {
+ return $( '<ul>' ).addClass( 'ime-list' );
+ }
+
+ function imeListTitle() {
+ return $( '<h3>' ).addClass( 'ime-list-title autonym' );
+ }
+
+ function toggleMenuItem() {
+ return $( '<div>' ).addClass( 'ime-disable selectable-row' ).append(
+ $( '<span>' )
+ .addClass( 'ime-disable-link' )
+ .addClass( 'ime-checked' )
+ .attr( 'data-i18n', 'jquery-ime-disable-text' )
+ .text( 'System input method' ),
+ $( '<span>' )
+ .addClass( 'ime-disable-shortcut' )
+ .text( 'CTRL+M' )
+ );
+ }
+
+ /**
+ * Check whether a keypress event corresponds to the shortcut key
+ *
+ * @param {event} event
+ * @return {boolean} true if the key is a shortcut key
+ */
+ function isShortcutKey( event ) {
+ // 77 - The letter M, for Ctrl-M
+ return event.ctrlKey && !event.altKey && ( event.which === 77 );
+ }
+
+ IMESelector.prototype = {
+ constructor: IMESelector,
+
+ init: function () {
+ this.prepareSelectorMenu();
+ this.position();
+ this.$imeSetting.hide();
+ },
+
+ prepareSelectorMenu: function () {
+ // TODO: In this approach there is a menu for each editable area.
+ // With correct event mapping we can probably reduce it to one menu.
+ this.$imeSetting = $( selectorTemplate );
+ this.$menu = $( '<div>' ).addClass( 'imeselector-menu' ).attr( 'role', 'menu' );
+ this.$menu.append(
+ imeListTitle(),
+ imeList(),
+ toggleMenuItem(),
+ languageListTitle()
+ );
+
+ this.prepareLanguageList();
+ this.$menu.append( this.helpLink() );
+
+ if ( $.i18n ) {
+ this.$menu.i18n();
+ }
+
+ this.$imeSetting.append( this.$menu );
+ $( document.body ).append( this.$imeSetting );
+ },
+
+ stopTimer: function () {
+ if ( this.timer ) {
+ clearTimeout( this.timer );
+ this.timer = null;
+ }
+
+ this.$imeSetting.stop( true, true );
+ },
+
+ resetTimer: function () {
+ var imeselector = this;
+
+ this.stopTimer();
+
+ this.timer = setTimeout(
+ function () {
+ // TODO: Use CSS transitions
+ // eslint-disable-next-line no-jquery/no-animate
+ imeselector.$imeSetting.animate( {
+ opacity: 0,
+ marginTop: '-20px'
+ }, 500, function () {
+ imeselector.$imeSetting.hide();
+ // Restore properties for the next time it becomes visible:
+ imeselector.$imeSetting.css( 'opacity', 1 );
+ imeselector.$imeSetting.css( 'margin-top', 0 );
+ } );
+ }, this.options.timeout
+ );
+ },
+
+ focus: function () {
+ // Hide all other IME settings and collapse open menus
+ // eslint-disable-next-line no-jquery/no-global-selector
+ $( 'div.imeselector' ).hide();
+ // eslint-disable-next-line no-jquery/no-global-selector
+ $( 'div.imeselector-menu' ).removeClass( 'ime-open' );
+ this.afterKeydown();
+ },
+
+ afterKeydown: function () {
+ this.$imeSetting.show();
+ this.resetTimer();
+ },
+
+ show: function () {
+ this.$menu.addClass( 'ime-open' );
+ this.stopTimer();
+ this.$imeSetting.show();
+
+ return false;
+ },
+
+ hide: function () {
+ this.$menu.removeClass( 'ime-open' );
+ this.resetTimer();
+
+ return false;
+ },
+
+ toggle: function () {
+ // eslint-disable-next-line no-jquery/no-class-state
+ if ( this.$menu.hasClass( 'ime-open' ) ) {
+ this.hide();
+ } else {
+ this.show();
+ }
+ },
+
+ /**
+ * Bind the events and listen
+ */
+ listen: function () {
+ var imeselector = this;
+
+ imeselector.$imeSetting.on( 'click.ime', function ( e ) {
+ var $t = $( e.target );
+
+ // eslint-disable-next-line no-jquery/no-class-state
+ if ( $t.hasClass( 'imeselector-toggle' ) ) {
+ imeselector.toggle();
+ }
+
+ return false;
+ } );
+
+ imeselector.$element.on( 'blur.ime', function () {
+ // eslint-disable-next-line no-jquery/no-class-state
+ if ( !imeselector.$imeSetting.hasClass( 'ime-onfocus' ) ) {
+ imeselector.$imeSetting.hide();
+ imeselector.hide();
+ }
+ } );
+
+ // Hide the menu when clicked outside
+ $( document.body ).on( 'click', function () {
+ imeselector.hide();
+ } );
+
+ // ... but when clicked on window do not propagate it.
+ this.$menu.on( 'click', function ( event ) {
+ event.stopPropagation();
+ } );
+
+ imeselector.$imeSetting.on( 'mouseenter', function () {
+ // We don't want the selector to disappear
+ // while the user is trying to click it
+ imeselector.stopTimer();
+ imeselector.$imeSetting.addClass( 'ime-onfocus' );
+ } ).on( 'mouseleave', function () {
+ imeselector.resetTimer();
+ imeselector.$imeSetting.removeClass( 'ime-onfocus' );
+ } );
+
+ imeselector.$menu.on( 'click.ime', 'li', function () {
+ imeselector.$element.trigger( 'focus' );
+
+ return false;
+ } );
+
+ imeselector.$menu.on( 'click.ime', 'li.ime-im', function () {
+ imeselector.selectIM( $( this ).data( 'ime-inputmethod' ) );
+ imeselector.$element.trigger( 'setim.ime', $( this ).data( 'ime-inputmethod' ) );
+
+ return false;
+ } );
+
+ imeselector.$menu.on( 'click.ime', 'li.ime-lang', function () {
+ var im = imeselector.selectLanguage( $( this ).attr( 'lang' ) );
+
+ imeselector.$element.trigger( 'setim.ime', im );
+
+ return false;
+ } );
+
+ imeselector.$menu.on( 'click.ime', 'div.ime-disable', function () {
+ imeselector.disableIM();
+
+ return false;
+ } );
+
+ // Just make it work as a regular link
+ imeselector.$menu.on( 'click.ime', '.ime-help-link', function ( e ) {
+ e.stopPropagation();
+ } );
+
+ imeselector.$element.on( 'focus.ime', function ( e ) {
+ imeselector.selectLanguage( imeselector.decideLanguage() );
+ imeselector.focus();
+ e.stopPropagation();
+ } );
+
+ imeselector.$element.attrchange( function () {
+ // eslint-disable-next-line no-jquery/no-sizzle
+ if ( imeselector.$element.is( ':hidden' ) ) {
+ imeselector.$imeSetting.hide();
+ }
+ } );
+
+ // Possible resize of textarea
+ imeselector.$element.on( {
+ 'mouseup.ime': this.position.bind( this ),
+ 'keydown.ime': this.keydown.bind( this )
+ } );
+
+ // Update IM selector position when the window is resized
+ // or the browser window is zoomed in or zoomed out
+ $( window ).on( 'resize', function () {
+ imeselector.position();
+ } );
+ },
+
+ /**
+ * Keydown event handler. Handles shortcut key presses
+ *
+ * @this HTMLElement
+ * @param {jQuery.Event} e
+ * @return {boolean}
+ */
+ keydown: function ( e ) {
+ var ime = $( e.target ).data( 'ime' ),
+ firstInputmethod,
+ previousInputMethods,
+ languageCode;
+
+ this.afterKeydown(); // shows the trigger in case it is hidden
+
+ if ( isShortcutKey( e ) ) {
+ if ( ime.isActive() ) {
+ this.disableIM();
+ this.$element.trigger( 'setim.ime', 'system' );
+ } else {
+ if ( this.inputmethod !== null ) {
+ this.selectIM( this.inputmethod.id );
+ this.$element.trigger( 'setim.ime', this.inputmethod.id );
+ } else {
+ languageCode = this.decideLanguage();
+ this.selectLanguage( languageCode );
+
+ if ( !ime.isActive() && $.ime.languages[ languageCode ] ) {
+ // Even after pressing toggle shortcut again, it is still disabled
+ // Check if there is a previously used input method.
+ previousInputMethods = $.ime.preferences.getPreviousInputMethods();
+
+ if ( previousInputMethods[ 0 ] ) {
+ this.selectIM( previousInputMethods[ 0 ] );
+ } else {
+ // Provide the default input method in this case.
+ firstInputmethod =
+ $.ime.languages[ languageCode ].inputmethods[ 0 ];
+ this.selectIM( firstInputmethod );
+ }
+ }
+ }
+ }
+
+ e.preventDefault();
+ e.stopPropagation();
+
+ return false;
+ }
+
+ return true;
+ },
+
+ /**
+ * Position the im selector relative to the edit area
+ */
+ position: function () {
+ var menuWidth, menuTop, menuLeft, elementPosition,
+ top, left, cssTop, cssLeft, verticalRoom, overflowsOnRight,
+ imeSelector = this,
+ rtlElement = this.$element.css( 'direction' ) === 'rtl',
+ $window = $( window );
+
+ this.focus(); // shows the trigger in case it is hidden
+
+ elementPosition = this.$element.offset();
+ top = elementPosition.top + this.$element.outerHeight();
+ left = elementPosition.left;
+
+ // RTL element position fix
+ if ( !rtlElement ) {
+ left = elementPosition.left + this.$element.outerWidth() -
+ this.$imeSetting.outerWidth();
+ }
+
+ if ( this.options.selectorInside ) {
+ top -= this.$imeSetting.outerHeight();
+ }
+
+ // While determining whether to place the selector above or below the input box,
+ // take into account the value of scrollTop, to avoid the selector from always
+ // getting placed above the input box since window.height would be less than top
+ // if the page has been scrolled.
+ verticalRoom = $window.height() + $( document ).scrollTop() - top;
+
+ if ( verticalRoom < this.$imeSetting.outerHeight() ) {
+ top = elementPosition.top - this.$imeSetting.outerHeight();
+ if ( this.options.selectorInside ) {
+ top += this.$imeSetting.outerHeight();
+ }
+ menuTop = this.$menu.outerHeight() +
+ this.$imeSetting.outerHeight();
+
+ // Flip the menu to the top only if it can fit in the space there
+ if ( menuTop < top ) {
+ this.$menu
+ .addClass( 'ime-position-top' )
+ .css( 'top', -menuTop );
+ }
+ }
+
+ cssTop = top;
+ cssLeft = left;
+ this.$element.parents().each( function () {
+ if ( $( this ).css( 'position' ) === 'fixed' ) {
+ imeSelector.$imeSetting.css( 'position', 'fixed' );
+ cssTop -= $( document ).scrollTop();
+ cssLeft -= $( document ).scrollLeft();
+ return false;
+ }
+ } );
+
+ this.$imeSetting.css( {
+ top: cssTop,
+ left: cssLeft
+ } );
+
+ menuWidth = this.$menu.width();
+ overflowsOnRight = ( left - $( document ).scrollLeft() + menuWidth ) > $window.width();
+
+ // Adjust horizontal position if there's
+ // not enough space on any side
+ if ( menuWidth > left ||
+ rtlElement && overflowsOnRight
+ ) {
+ if ( rtlElement ) {
+ if ( overflowsOnRight ) {
+ this.$menu.addClass( 'ime-right' );
+ menuLeft = this.$imeSetting.outerWidth() - menuWidth;
+ } else {
+ menuLeft = 0;
+ }
+ } else {
+ this.$menu.addClass( 'ime-right' );
+ menuLeft = elementPosition.left;
+ }
+
+ this.$menu.css( 'left', menuLeft );
+ }
+ },
+
+ /**
+ * Select a language
+ *
+ * @param {string} languageCode
+ * @return {string|boolean} Selected input method id or false
+ */
+ selectLanguage: function ( languageCode ) {
+ var ime, imePref, language;
+
+ // consider language codes case insensitive
+ languageCode = languageCode && languageCode.toLowerCase();
+
+ ime = this.$element.data( 'ime' );
+ imePref = $.ime.preferences.getIM( languageCode );
+ language = $.ime.languages[ languageCode ];
+
+ this.setMenuTitle( this.getAutonym( languageCode ) );
+
+ if ( !language ) {
+ return false;
+ }
+
+ if ( ime.getLanguage() === languageCode ) {
+ // Nothing to do. It is same as the current language,
+ // but check whether the input method changed.
+ if ( ime.inputmethod && ime.inputmethod.id !== imePref ) {
+ this.selectIM( $.ime.preferences.getIM( languageCode ) );
+ }
+
+ return $.ime.preferences.getIM( languageCode );
+ }
+
+ this.$menu.find( 'li.ime-lang' ).show();
+ this.$menu.find( 'li[lang=' + languageCode + ']' ).hide();
+
+ this.prepareInputMethods( languageCode );
+ this.hide();
+ // And select the default inputmethod
+ ime.setLanguage( languageCode );
+ this.inputmethod = null;
+ this.selectIM( $.ime.preferences.getIM( languageCode ) );
+
+ return $.ime.preferences.getIM( languageCode );
+ },
+
+ /**
+ * Get the autonym by language code.
+ *
+ * @param {string} languageCode
+ * @return {string} The autonym
+ */
+ getAutonym: function ( languageCode ) {
+ return $.ime.languages[ languageCode ] &&
+ $.ime.languages[ languageCode ].autonym;
+ },
+
+ /**
+ * Set the title of the selector menu.
+ *
+ * @param {string} title
+ */
+ setMenuTitle: function ( title ) {
+ this.$menu.find( '.ime-list-title' ).text( title );
+ },
+
+ /**
+ * Decide on initial language to select
+ *
+ * @return {string}
+ */
+ decideLanguage: function () {
+ if ( $.ime.preferences.getLanguage() ) {
+ // There has been an override by the user,
+ // so return the language selected by user
+ return $.ime.preferences.getLanguage();
+ }
+
+ if ( this.$element.attr( 'lang' ) &&
+ $.ime.languages[ this.$element.attr( 'lang' ) ]
+ ) {
+ return this.$element.attr( 'lang' );
+ }
+
+ // There is either no IMs for the given language attr
+ // or there is no lang attr at all.
+ return $.ime.preferences.getDefaultLanguage();
+ },
+
+ /**
+ * Select an input method
+ *
+ * @param {string} inputmethodId
+ */
+ selectIM: function ( inputmethodId ) {
+ var imeselector = this,
+ ime;
+
+ if ( !inputmethodId ) {
+ return;
+ }
+
+ this.$menu.find( '.ime-checked' ).removeClass( 'ime-checked' );
+ this.$menu.find( 'li[data-ime-inputmethod=' + inputmethodId + ']' )
+ .addClass( 'ime-checked' );
+ ime = this.$element.data( 'ime' );
+
+ if ( inputmethodId === 'system' ) {
+ this.disableIM();
+
+ return;
+ }
+
+ ime.load( inputmethodId ).done( function () {
+ imeselector.inputmethod = $.ime.inputmethods[ inputmethodId ];
+ imeselector.hide();
+ ime.enable();
+ ime.setIM( inputmethodId );
+ imeselector.$imeSetting.find( 'a.ime-name' ).text(
+ $.ime.sources[ inputmethodId ].name
+ );
+
+ imeselector.position();
+
+ // Save this preference
+ $.ime.preferences.save();
+ } );
+ },
+
+ /**
+ * Disable the inputmethods (Use the system input method)
+ */
+ disableIM: function () {
+ this.$menu.find( '.ime-checked' ).removeClass( 'ime-checked' );
+ this.$menu.find( 'div.ime-disable' ).addClass( 'ime-checked' );
+ this.$element.data( 'ime' ).disable();
+ this.$imeSetting.find( 'a.ime-name' ).text( '' );
+ this.hide();
+ this.position();
+
+ // Save this preference
+ $.ime.preferences.save();
+ },
+
+ /**
+ * Prepare language list
+ */
+ prepareLanguageList: function () {
+ var languageCodeIndex,
+ $languageListWrapper,
+ $languageList,
+ languageList,
+ $languageItem,
+ $language,
+ languageCode,
+ language;
+
+ // Language list can be very long, so we use a container with
+ // overflow auto
+ $languageListWrapper = $( '<div>' ).addClass( 'ime-language-list-wrapper' );
+ $languageList = $( '<ul>' ).addClass( 'ime-language-list' );
+
+ if ( typeof this.options.languages === 'function' ) {
+ languageList = this.options.languages();
+ } else {
+ languageList = this.options.languages;
+ }
+
+ for ( languageCodeIndex in languageList ) {
+ languageCode = languageList[ languageCodeIndex ];
+ language = $.ime.languages[ languageCode ];
+
+ if ( !language ) {
+ continue;
+ }
+
+ $languageItem = $( '<a>' )
+ .attr( 'href', '#' )
+ .text( this.getAutonym( languageCode ) )
+ .addClass( 'selectable-row-item autonym' );
+ $language = $( '<li>' ).addClass( 'ime-lang selectable-row' ).attr( 'lang', languageCode );
+ $language.append( $languageItem );
+ $languageList.append( $language );
+ }
+
+ $languageListWrapper.append( $languageList );
+ this.$menu.append( $languageListWrapper );
+
+ if ( this.options.languageSelector ) {
+ this.$menu.append( this.options.languageSelector() );
+ }
+ },
+
+ /**
+ * Prepare input methods in menu for the given language code
+ *
+ * @param {string} languageCode
+ */
+ prepareInputMethods: function ( languageCode ) {
+ var language = $.ime.languages[ languageCode ],
+ $imeList = this.$menu.find( '.ime-list' ),
+ imeSelector = this;
+
+ $imeList.empty();
+
+ language.inputmethods.forEach( function ( inputmethod ) {
+ var $imeItem, $inputMethod, source, name;
+
+ source = $.ime.sources[ inputmethod ];
+ if ( !source ) {
+ return;
+ }
+ name = source.name;
+
+ $imeItem = $( '<a>' )
+ .attr( 'href', '#' )
+ .text( name )
+ .addClass( 'selectable-row-item' );
+
+ $inputMethod = $( '<li>' )
+ .attr( 'data-ime-inputmethod', inputmethod )
+ .addClass( 'ime-im selectable-row' )
+ .append(
+ $( '<span>' ).addClass( 'ime-im-check' ),
+ $imeItem
+ );
+
+ if ( imeSelector.options.helpHandler ) {
+ $inputMethod.append(
+ imeSelector.options.helpHandler.call( imeSelector, inputmethod )
+ );
+ }
+
+ $imeList.append( $inputMethod );
+ } );
+ },
+
+ /**
+ * Create a help link element.
+ *
+ * @return {jQuery}
+ */
+ helpLink: function () {
+ return $( '<div>' ).addClass( 'ime-help-link selectable-row' )
+ .append( $( '<a>' ).text( 'Help' )
+ .addClass( 'selectable-row-item' )
+ .attr( {
+ href: 'http://github.com/wikimedia/jquery.ime',
+ target: '_blank',
+ 'data-i18n': 'jquery-ime-help'
+ } )
+ );
+ }
+ };
+
+ IMESelector.defaults = {
+ defaultLanguage: 'en',
+ timeout: 2500 // Milliseconds after which IME widget hides itself.
+ };
+
+ /*
+ * imeselector PLUGIN DEFINITION
+ */
+
+ $.fn.imeselector = function ( options ) {
+ return this.each( function () {
+ var $this = $( this ),
+ data = $this.data( 'imeselector' );
+
+ if ( !data ) {
+ $this.data( 'imeselector', ( data = new IMESelector( this, options ) ) );
+ }
+
+ if ( typeof options === 'string' ) {
+ data[ options ].call( $this );
+ }
+ } );
+ };
+
+ $.fn.imeselector.Constructor = IMESelector;
+
+ selectorTemplate = '<div class="imeselector imeselector-toggle">' +
+ '<a class="ime-name imeselector-toggle" href="#"></a>' +
+ '<b class="ime-setting-caret imeselector-toggle"></b></div>';
+
+ MutationObserver = window.MutationObserver ||
+ window.WebKitMutationObserver ||
+ window.MozMutationObserver;
+
+ function isDOMAttrModifiedSupported() {
+ var p = document.createElement( 'p' ),
+ flag = false;
+
+ if ( p.addEventListener ) {
+ p.addEventListener( 'DOMAttrModified', function () {
+ flag = true;
+ }, false );
+ } else if ( p.attachEvent ) {
+ p.attachEvent( 'onDOMAttrModified', function () {
+ flag = true;
+ } );
+ } else {
+ return false;
+ }
+
+ p.setAttribute( 'id', 'target' );
+
+ return flag;
+ }
+
+ $.fn.attrchange = function ( callback ) {
+ var observer;
+
+ if ( MutationObserver ) {
+ observer = new MutationObserver( function ( mutations ) {
+ mutations.forEach( function ( e ) {
+ callback.call( e.target, e.attributeName );
+ } );
+ } );
+
+ return this.each( function () {
+ observer.observe( this, {
+ subtree: false,
+ attributes: true
+ } );
+ } );
+ } else if ( isDOMAttrModifiedSupported() ) {
+ return this.on( 'DOMAttrModified', function ( e ) {
+ callback.call( this, e.originalEvent.attrName );
+ } );
+ } else if ( 'onpropertychange' in document.body ) {
+ return this.on( 'propertychange', function () {
+ callback.call( this, window.event.propertyName );
+ } );
+ }
+ };
+}( jQuery ) );
+
+( function ( $ ) {
+ 'use strict';
+
+ $.extend( $.ime.preferences, {
+ registry: {
+ isDirty: false,
+ language: null,
+ previousLanguages: [], // array of previous languages
+ previousInputMethods: [], // array of previous inputmethods
+ imes: {
+ en: 'system'
+ }
+ },
+
+ setLanguage: function ( language ) {
+ // Do nothing if there's no actual change
+ if ( language === this.registry.language ) {
+ return;
+ }
+
+ this.registry.language = language;
+ this.registry.isDirty = true;
+ if ( !this.registry.previousLanguages ) {
+ this.registry.previousLanguages = [];
+ }
+
+ // Add to the previous languages, but avoid duplicates.
+ if ( this.registry.previousLanguages.indexOf( language ) === -1 ) {
+ this.registry.previousLanguages.unshift( language );
+ this.registry.previousLanguages = this.registry.previousLanguages.slice( 0, 5 );
+ }
+ },
+
+ getLanguage: function () {
+ return this.registry.language;
+ },
+
+ getDefaultLanguage: function () {
+ return 'en';
+ },
+
+ getPreviousLanguages: function () {
+ return this.registry.previousLanguages;
+ },
+
+ getPreviousInputMethods: function () {
+ return this.registry.previousInputMethods || [];
+ },
+
+ // Set the given IM as the last used for the language
+ setIM: function ( inputMethod ) {
+ if ( !this.registry.imes ) {
+ this.registry.imes = {};
+ }
+
+ // Do nothing if there's no actual change
+ if ( inputMethod === this.registry.imes[ this.registry.language ] ) {
+ return;
+ }
+
+ this.registry.imes[ this.getLanguage() ] = inputMethod;
+ this.registry.isDirty = true;
+ if ( !this.registry.previousInputMethods ) {
+ this.registry.previousInputMethods = [];
+ }
+
+ // Add to the previous languages,
+ if ( inputMethod !== 'system' ) {
+ this.registry.previousInputMethods.unshift( inputMethod );
+ this.registry.previousInputMethods =
+ this.registry.previousInputMethods.slice( 0, 5 );
+ }
+ },
+
+ // Return the last used or the default IM for language
+ getIM: function ( language ) {
+ if ( !this.registry.imes ) {
+ this.registry.imes = {};
+ }
+
+ return this.registry.imes[ language ] || 'system';
+ },
+
+ save: function () {
+ // save registry in cookies or localstorage
+ },
+
+ load: function () {
+ // load registry from cookies or localstorage
+ }
+ } );
+}( jQuery ) );
+
+( function ( $ ) {
+ 'use strict';
+
+ // All keys have quotes for consistency
+ /* eslint-disable quote-props */
+ $.extend( $.ime.sources, {
+ 'af-tilde': {
+ name: 'Afrikaans tilde',
+ source: 'rules/af/af-tilde.js'
+ },
+ 'ajg-tilde': {
+ name: 'Aja tilde',
+ source: 'rules/ajg/ajg-tilde.js'
+ },
+ 'ak-qx': {
+ name: 'Akan QX replacement',
+ source: 'rules/ak/ak-qx.js'
+ },
+ 'ak-tilde': {
+ name: 'Akan tilde',
+ source: 'rules/ak/ak-tilde.js'
+ },
+ 'am-transliteration': {
+ name: 'ትራንስልተራትዖን',
+ source: 'rules/am/am-transliteration.js'
+ },
+ 'ann-tilde': {
+ name: 'Obolo tilde',
+ source: 'rules/ann/ann-tilde.js'
+ },
+ 'ar-kbd': {
+ name: 'لوحة المفاتيح العربية',
+ source: 'rules/ar/ar-kbd.js'
+ },
+ 'as-avro': {
+ name: 'অভ্ৰ',
+ source: 'rules/as/as-avro.js'
+ },
+ 'as-bornona': {
+ name: 'বৰ্ণনা',
+ source: 'rules/as/as-bornona.js'
+ },
+ 'as-inscript': {
+ name: 'ইনস্ক্ৰিপ্ট',
+ source: 'rules/as/as-inscript.js'
+ },
+ 'as-inscript2': {
+ name: 'ইনস্ক্ৰিপ্ট ২',
+ source: 'rules/as/as-inscript2.js'
+ },
+ 'as-phonetic': {
+ name: 'ফনেটিক',
+ source: 'rules/as/as-phonetic.js'
+ },
+ 'as-rodali': {
+ name: 'ৰ\'দালি',
+ source: 'rules/as/as-rodali.js'
+ },
+ 'as-transliteration': {
+ name: 'প্ৰতিৰূপান্তৰণ',
+ source: 'rules/as/as-transliteration.js'
+ },
+ 'azb-kbd': {
+ name: 'تۆرکجه',
+ source: 'rules/azb/azb-kbd.js'
+ },
+ 'bas-tilde': {
+ name: 'Ɓasaá tilde',
+ source: 'rules/bas/bas-tilde.js'
+ },
+ 'batak-qwerty': {
+ name: 'Batak QWERTY',
+ source: 'rules/bbc/batak-qwerty.js'
+ },
+ 'bci-tilde': {
+ name: 'Baoulé tilde keyboard',
+ source: 'rules/bci/bci-tilde.js'
+ },
+ 'be-kbd': {
+ name: 'Стандартная',
+ source: 'rules/be/be-kbd.js'
+ },
+ 'be-latin': {
+ name: 'Łacinka',
+ source: 'rules/be/be-latin.js'
+ },
+ 'be-transliteration': {
+ name: 'Транслітэрацыя',
+ source: 'rules/be/be-transliteration.js'
+ },
+ 'ber-tfng': {
+ name: 'Tifinagh',
+ source: 'rules/ber/ber-tfng.js'
+ },
+ 'bgn-kbd': {
+ name: 'روچ کپتین بلوچی',
+ source: 'rules/bgn/bgn-kbd.js'
+ },
+ 'bkm-tilde': {
+ name: 'Kom tilde',
+ source: 'rules/bkm/bkm-tilde.js'
+ },
+ 'bm-alt': {
+ name: 'Bamanankan Alt',
+ source: 'rules/bm/bm-alt.js'
+ },
+ 'bm-tilde': {
+ name: 'Bamanankan tilde',
+ source: 'rules/bm/bm-tilde.js'
+ },
+ 'bn-avro': {
+ name: 'অভ্র',
+ source: 'rules/bn/bn-avro.js'
+ },
+ 'bn-inscript': {
+ name: 'ইনস্ক্ৰিপ্ট',
+ source: 'rules/bn/bn-inscript.js'
+ },
+ 'bn-inscript2': {
+ name: 'ইনস্ক্ৰিপ্ট ২',
+ source: 'rules/bn/bn-inscript2.js'
+ },
+ 'bn-nkb': {
+ name: 'জাতীয় কিবোর্ড',
+ source: 'rules/bn/bn-nkb.js'
+ },
+ 'bn-probhat': {
+ name: 'প্রভাত',
+ source: 'rules/bn/bn-probhat.js'
+ },
+ 'bo-ewts': {
+ name: 'Tibetan EWTS',
+ source: 'rules/bo/bo-ewts.js'
+ },
+ 'bo-sambhota': {
+ name: 'Tibetan Sambhota',
+ source: 'rules/bo/bo-sambhota.js'
+ },
+ 'brx-inscript': {
+ name: 'इनस्क्रिप्ट',
+ source: 'rules/brx/brx-inscript.js'
+ },
+ 'brx-inscript2': {
+ name: 'इनस्क्रिप्ट २',
+ source: 'rules/brx/brx-inscript2.js'
+ },
+ 'bwr-tilde': {
+ name: 'Bura tilde',
+ source: 'rules/bwr/bwr-tilde.js'
+ },
+ 'byn-geezim': {
+ name: 'ብሊን',
+ source: 'rules/byn/byn-geezim.js'
+ },
+ 'ckb-transliteration-arkbd': {
+ name: 'باشووری',
+ source: 'rules/ckb/ckb-transliteration-arkbd.js'
+ },
+ 'ckb-transliteration-fakbd': {
+ name: 'ڕۆژھەڵاتی',
+ source: 'rules/ckb/ckb-transliteration-fakbd.js'
+ },
+ 'ckb-transliteration-lakbd': {
+ name: 'لاتینی',
+ source: 'rules/ckb/ckb-transliteration-lakbd.js'
+ },
+ 'cv-cyr-altgr': {
+ name: 'Чăвашла (AltGr)',
+ source: 'rules/cv/cv-cyr-altgr.js'
+ },
+ 'cv-cyr-numbers': {
+ name: 'Чăвашла (цифрилисем)',
+ source: 'rules/cv/cv-cyr-numbers.js'
+ },
+ 'cv-lat-altgr': {
+ name: 'Căvašla (AltGr)',
+ source: 'rules/cv/cv-lat-altgr.js'
+ },
+ 'cyrl-palochka': {
+ name: 'Palochka',
+ source: 'rules/cyrl/cyrl-palochka.js'
+ },
+ 'da-normforms': {
+ name: 'Brug translitteration',
+ source: 'rules/da/da-normforms.js'
+ },
+ 'dag-alt': {
+ name: 'Dagbani Alt',
+ source: 'rules/dag/dag-alt.js'
+ },
+ 'dag-tilde': {
+ name: 'Dagbani tilde',
+ source: 'rules/dag/dag-tilde.js'
+ },
+ 'de-transliteration': {
+ name: 'Deutsch Tilde',
+ source: 'rules/de/de-transliteration.js'
+ },
+ 'din-fqsx': {
+ name: 'Dinka FQSX',
+ source: 'rules/din/din-fqsx.js'
+ },
+ 'din-tilde': {
+ name: 'Dinka tilde',
+ source: 'rules/din/din-tilde.js'
+ },
+ 'doi-inscript2': {
+ name: 'इनस्क्रिप्ट २',
+ source: 'rules/doi/doi-inscript2.js'
+ },
+ 'ee-tilde': {
+ name: 'Ewe Tilde',
+ source: 'rules/ee/ee-tilde.js'
+ },
+ 'efi-tilde': {
+ name: 'Efik - tilde',
+ source: 'rules/efi/efi-tilde.js'
+ },
+ 'el-kbd': {
+ name: 'Τυπική πληκτρολόγιο',
+ source: 'rules/el/el-kbd.js'
+ },
+ 'eo-h': {
+ name: 'Esperanto h',
+ source: 'rules/eo/eo-h.js'
+ },
+ 'eo-h-f': {
+ name: 'Esperanto h fundamente',
+ source: 'rules/eo/eo-h-f.js'
+ },
+ 'eo-plena': {
+ name: 'Esperanto plena',
+ source: 'rules/eo/eo-plena.js'
+ },
+ 'eo-q': {
+ name: 'Esperanto q sistemo',
+ source: 'rules/eo/eo-q.js'
+ },
+ 'eo-transliteration': {
+ name: 'transliterigo',
+ source: 'rules/eo/eo-transliteration.js'
+ },
+ 'eo-vi': {
+ name: 'Esperanto vi sistemo',
+ source: 'rules/eo/eo-vi.js'
+ },
+ 'eo-x': {
+ name: 'Esperanto x sistemo',
+ source: 'rules/eo/eo-x.js'
+ },
+ 'fa-kbd': {
+ name: 'فارسی',
+ source: 'rules/fa/fa-kbd.js'
+ },
+ 'ff-alt': {
+ name: 'Fulfulde alt',
+ source: 'rules/ff/ff-alt.js'
+ },
+ 'ff-tilde': {
+ name: 'Fulfulde tilde',
+ source: 'rules/ff/ff-tilde.js'
+ },
+ 'fi-transliteration': {
+ name: 'translitterointi',
+ source: 'rules/fi/fi-transliteration.js'
+ },
+ 'fo-normforms': {
+ name: 'Føroyskt',
+ source: 'rules/fo/fo-normforms.js'
+ },
+ 'fon-tilde': {
+ name: 'Fon Tilde',
+ source: 'rules/fon/fon-tilde.js'
+ },
+ 'gaa-cqx': {
+ name: 'Ga CQX replacement',
+ source: 'rules/gaa/gaa-cqx.js'
+ },
+ 'gaa-tilde': {
+ name: 'Ga tilde',
+ source: 'rules/gaa/gaa-tilde.js'
+ },
+ 'gom-inscript2': {
+ name: 'इनस्क्रिप्ट २',
+ source: 'rules/gom/gom-inscript2.js'
+ },
+ 'got-standard': {
+ name: '𐌲𐌿𐍄𐌹𐍃𐌺𐌰 𐍂𐌰𐌶𐌳𐌰',
+ source: 'rules/got/got-standard.js'
+ },
+ 'gu-inscript': {
+ name: 'ઇનસ્ક્રિપ્ટ',
+ source: 'rules/gu/gu-inscript.js'
+ },
+ 'gu-inscript2': {
+ name: 'ઇનસ્ક્રિપ્ટ ૨',
+ source: 'rules/gu/gu-inscript2.js'
+ },
+ 'gu-phonetic': {
+ name: 'ફોનૅટિક',
+ source: 'rules/gu/gu-phonetic.js'
+ },
+ 'gu-transliteration': {
+ name: 'લિપ્યંતરણ',
+ source: 'rules/gu/gu-transliteration.js'
+ },
+ 'gur-tilde': {
+ name: 'Farefare tilde',
+ source: 'rules/gur/gur-tilde.js'
+ },
+ 'ha-tilde': {
+ name: 'Hausa - tilde',
+ source: 'rules/ha/ha-tilde.js'
+ },
+ 'he-standard-2012': {
+ name: 'עברית עם ניקוד על בסיס אנגלית',
+ source: 'rules/he/he-standard-2012.js'
+ },
+ 'he-standard-2012-extonly': {
+ name: 'עברית עם ניקוד',
+ source: 'rules/he/he-standard-2012-extonly.js'
+ },
+ 'hi-bolnagri': {
+ name: 'बोलनागरी',
+ source: 'rules/hi/hi-bolnagri.js'
+ },
+ 'hi-inscript': {
+ name: 'इनस्क्रिप्ट',
+ source: 'rules/hi/hi-inscript.js'
+ },
+ 'hi-inscript2': {
+ name: 'इनस्क्रिप्ट २',
+ source: 'rules/hi/hi-inscript2.js'
+ },
+ 'hi-phonetic': {
+ name: 'फोनेटिक',
+ source: 'rules/hi/hi-phonetic.js'
+ },
+ 'hi-transliteration': {
+ name: 'लिप्यंतरण',
+ source: 'rules/hi/hi-transliteration.js'
+ },
+ 'hoc-transliteration': {
+ name: 'Ho transliteration',
+ source: 'rules/hoc/hoc-transliteration.js'
+ },
+ 'hr-kbd': {
+ name: 'Croatian kbd',
+ source: 'rules/hr/hr-kbd.js'
+ },
+ 'hy-emslegacy': {
+ name: 'Մայքրոսոֆթի հին արևելահայերեն',
+ source: 'rules/hy/hy-emslegacy.js'
+ },
+ 'hy-ephonetic': {
+ name: 'Հնչյունային դասավորություն',
+ source: 'rules/hy/hy-ephonetic.js'
+ },
+ 'hy-ephoneticalt': {
+ name: 'Հնչյունային նոր (R→Ր, F→Թ)',
+ source: 'rules/hy/hy-ephoneticalt.js'
+ },
+ 'hy-typewriter': {
+ name: 'Գրամեքենայի դասավորություն',
+ source: 'rules/hy/hy-typewriter.js'
+ },
+ 'hy-wmslegacy': {
+ name: 'Մայքրոսոֆթի հին արևմտահայերեն',
+ source: 'rules/hy/hy-wmslegacy.js'
+ },
+ 'ig-tilde': {
+ name: 'Igbo - tilde',
+ source: 'rules/ig/ig-tilde.js'
+ },
+ 'ipa-sil': {
+ name: 'International Phonetic Alphabet - SIL',
+ source: 'rules/fonipa/ipa-sil.js'
+ },
+ 'ipa-x-sampa': {
+ name: 'International Phonetic Alphabet - X-SAMPA',
+ source: 'rules/fonipa/ipa-x-sampa.js'
+ },
+ 'is-normforms': {
+ name: 'Venjuleg eyðublöð',
+ source: 'rules/is/is-normforms.js'
+ },
+ 'ish-tilde': {
+ name: 'Esan Awain tilde',
+ source: 'rules/ish/ish-tilde.js'
+ },
+ 'jv-transliteration': {
+ name: 'Transliteration',
+ source: 'rules/jv/jv-transliteration.js'
+ },
+ 'ka-kbd': {
+ name: 'სტანდარტული კლავიატურის',
+ source: 'rules/ka/ka-kbd.js'
+ },
+ 'ka-transliteration': {
+ name: 'ტრანსლიტერაცია',
+ source: 'rules/ka/ka-transliteration.js'
+ },
+ 'kab-tilde': {
+ name: 'Taqbaylit Alatin tilde',
+ source: 'rules/kab/kab-tilde.js'
+ },
+ 'kbp-tilde': {
+ name: 'Kabɩyɛ tilde',
+ source: 'rules/kbp/kbp-tilde.js'
+ },
+ 'kcg-tilde': {
+ name: 'Tyap tilde',
+ source: 'rules/kcg/kcg-tilde.js'
+ },
+ 'ki-tilde': {
+ name: 'Gĩkũyũ',
+ source: 'rules/ki/ki-tilde.js'
+ },
+ 'kk-arabic': {
+ name: 'Kazakh Arabic transliteration',
+ source: 'rules/kk/kk-arabic.js'
+ },
+ 'kk-kbd': {
+ name: 'Кирил',
+ source: 'rules/kk/kk-kbd.js'
+ },
+ 'km-nidakyk': {
+ name: 'ក្តារ​ចុច​យូនីកូដ​ខ្មែរ (NiDA)',
+ source: 'rules/km/km-nidakyk.js'
+ },
+ 'kn-inscript': {
+ name: 'ಇನ್ಸ್ಕ್ರಿಪ್ಟ್',
+ source: 'rules/kn/kn-inscript.js'
+ },
+ 'kn-inscript2': {
+ name: 'ಇನ್\u200cಸ್ಕ್ರಿಪ್ಟ್ ೨',
+ source: 'rules/kn/kn-inscript2.js'
+ },
+ 'kn-kgp': {
+ name: 'KGP/Nudi/KP Rao',
+ source: 'rules/kn/kn-kgp.js'
+ },
+ 'kn-transliteration': {
+ name: 'ಲಿಪ್ಯಂತರಣ',
+ source: 'rules/kn/kn-transliteration.js'
+ },
+ 'kr-tilde': {
+ name: 'Kanuri tilde',
+ source: 'rules/kr/kr-tilde.js'
+ },
+ 'ky-cyrl-alt': {
+ name: 'Кыргыз Alt',
+ source: 'rules/ky/ky-cyrl-alt.js'
+ },
+ 'ks-inscript': {
+ name: 'इनस्क्रिप्ट',
+ source: 'rules/ks/ks-inscript.js'
+ },
+ 'ks-kbd': {
+ name: 'Kashmiri Arabic',
+ source: 'rules/ks/ks-kbd.js'
+ },
+ 'ku-h': {
+ name: 'Kurdî-h',
+ source: 'rules/ku/ku-h.js'
+ },
+ 'ku-tr': {
+ name: 'Kurdî-tr',
+ source: 'rules/ku/ku-tr.js'
+ },
+ 'lg-tilde': {
+ name: 'Luganda tilde',
+ source: 'rules/lg/lg-tilde.js'
+ },
+ 'ln-tilde': {
+ name: 'Lingála tilde',
+ source: 'rules/ln/ln-tilde.js'
+ },
+ 'lo-kbd': {
+ name: 'າຶກ',
+ source: 'rules/lo/lo-kbd.js'
+ },
+ 'lrc-kbd': {
+ name: 'لۊری شومالی',
+ source: 'rules/lrc/lrc-kbd.js'
+ },
+ 'lud-transliteration': {
+ name: 'lud',
+ source: 'rules/lud/lud-transliteration.js'
+ },
+ 'lut-tulalip': {
+ name: 'Lushootseed Tulalip',
+ source: 'rules/lut/lut-tulalip.js'
+ },
+ 'mad-tilde': {
+ name: 'Madhurâ tilde',
+ source: 'rules/mad/mad-tilde.js'
+ },
+ 'mai-inscript': {
+ name: 'इनस्क्रिप्ट',
+ source: 'rules/mai/mai-inscript.js',
+ depends: 'hi-inscript'
+ },
+ 'mai-inscript2': {
+ name: 'इनस्क्रिप्ट २',
+ source: 'rules/mai/mai-inscript2.js',
+ depends: 'hi-inscript2'
+ },
+ 'mg-tilde': {
+ name: 'Malagasy tilde',
+ source: 'rules/mg/mg-tilde.js'
+ },
+ 'mh': {
+ name: 'Kajin M̧ajeļ',
+ source: 'rules/mh/mh.js'
+ },
+ 'ml-inscript': {
+ name: 'ഇൻസ്ക്രിപ്റ്റ്',
+ source: 'rules/ml/ml-inscript.js'
+ },
+ 'ml-inscript2': {
+ name: 'ഇൻസ്ക്രിപ്റ്റ് 2',
+ source: 'rules/ml/ml-inscript2.js'
+ },
+ 'ml-transliteration': {
+ name: 'ലിപ്യന്തരണം',
+ source: 'rules/ml/ml-transliteration.js'
+ },
+ 'mn-cyrl': {
+ name: 'Кирилл',
+ source: 'rules/mn/mn-cyrl.js'
+ },
+ 'mn-todo': {
+ name: 'ᡐᡆᡑᡆ ᡋᡅᡔᡅᡎ᠌',
+ source: 'rules/mn/mn-todo.js'
+ },
+ 'mn-todoali': {
+ name: 'Todo Mongolian Ali-gali',
+ source: 'rules/mn/mn-todoali.js'
+ },
+ 'mn-trad': {
+ name: 'ᠮᠣᠩᠭᠣᠯ ᠪᠢᠴᠢᠭ᠌',
+ source: 'rules/mn/mn-trad.js'
+ },
+ 'mn-tradali': {
+ name: 'Traditional Mongolian Ali-gali',
+ source: 'rules/mn/mn-tradali.js'
+ },
+ 'mnc': {
+ name: 'ᠮᠠᠨᠵᡠ',
+ source: 'rules/mnc/mnc.js'
+ },
+ 'mnc-ali': {
+ name: 'Manchu Ali-gali',
+ source: 'rules/mnc/mnc-ali.js'
+ },
+ 'mni-inscript2': {
+ name: 'ইনস্ক্ৰিপ্ট ২',
+ source: 'rules/mni/mni-inscript2.js'
+ },
+ 'mnw-simplified-anonta': {
+ name: 'Mon Simplified Anonta',
+ source: 'rules/mnw/mnw-simplified-anonta.js'
+ },
+ 'mr-inscript': {
+ name: 'मराठी लिपी',
+ source: 'rules/mr/mr-inscript.js'
+ },
+ 'mr-inscript2': {
+ name: 'मराठी इनस्क्रिप्ट २',
+ source: 'rules/mr/mr-inscript2.js'
+ },
+ 'mr-phonetic': {
+ name: 'फोनेटिक',
+ source: 'rules/mr/mr-phonetic.js'
+ },
+ 'mr-transliteration': {
+ name: 'अक्षरांतरण',
+ source: 'rules/mr/mr-transliteration.js'
+ },
+ 'mul-bf': {
+ name: 'Burkina Faso tilde keyboard',
+ source: 'rules/mul-bf/mul-bf.js'
+ },
+ 'mul-cm': {
+ name: 'General Alphabet of Cameroon Languages tilde keyboard',
+ source: 'rules/mul-cm/mul-cm.js'
+ },
+ 'my-mm3': {
+ name: 'မြန်မာ၃ လက်ကွက်',
+ source: 'rules/my/my-mm3.js'
+ },
+ 'my-xkb': {
+ name: 'မြန်မာဘာသာ xkb',
+ source: 'rules/my/my-xkb.js'
+ },
+ 'nb-normforms': {
+ name: 'Normal transliterasjon',
+ source: 'rules/nb/nb-normforms.js'
+ },
+ 'nb-tildeforms': {
+ name: 'Tildemerket transliterasjon',
+ source: 'rules/nb/nb-tildeforms.js'
+ },
+ 'ne-inscript': {
+ name: 'इनस्क्रिप्ट',
+ source: 'rules/ne/ne-inscript.js'
+ },
+ 'ne-inscript2': {
+ name: 'इनस्क्रिप्ट २',
+ source: 'rules/ne/ne-inscript2.js'
+ },
+ 'ne-rom': {
+ name: 'Romanized',
+ source: 'rules/ne/ne-rom.js'
+ },
+ 'ne-trad': {
+ name: 'Traditional',
+ source: 'rules/ne/ne-trad.js'
+ },
+ 'ne-transliteration': {
+ name: 'ट्रांस्लितेरेशन',
+ source: 'rules/ne/ne-transliteration.js'
+ },
+ 'nia-tilde': {
+ name: 'Li Niha tilde',
+ source: 'rules/nia/nia-tilde.js'
+ },
+ 'nmz-tilde': {
+ name: 'Nawdm tilde',
+ source: 'rules/nmz/nmz-tilde.js'
+ },
+ 'nqo-standard-qwerty': {
+ name: "N'Ko standard QWERTY",
+ source: 'rules/nqo/nqo-standard-qwerty.js'
+ },
+ 'nqo-transliteration': {
+ name: "N'Ko transliteration",
+ source: 'rules/nqo/nqo-transliteration.js'
+ },
+ 'nso-tilde': {
+ name: 'Sesotho sa Leboa tilde',
+ source: 'rules/nso/nso-tilde.js'
+ },
+ 'nus-tilde': {
+ name: 'Thok Naath tilde',
+ source: 'rules/nus/nus-tilde.js'
+ },
+ 'ny-tilde': {
+ name: 'Chichewa / Nyanja tilde',
+ source: 'rules/ny/ny-tilde.js'
+ },
+ 'or-inscript': {
+ name: 'ଇନସ୍କ୍ରିପ୍ଟ',
+ source: 'rules/or/or-inscript.js'
+ },
+ 'or-inscript2': {
+ name: 'ଇନସ୍କ୍ରିପ୍ଟ2',
+ source: 'rules/or/or-inscript2.js'
+ },
+ 'or-lekhani': {
+ name: 'ଲେଖନୀ',
+ source: 'rules/or/or-lekhani.js'
+ },
+ 'or-OdiScript': {
+ name: 'ଓଡ଼ିସ୍କ୍ରିପ୍ଟ',
+ source: 'rules/or/or-OdiScript.js'
+ },
+ 'or-phonetic': {
+ name: 'ଫୋନେଟିକ',
+ source: 'rules/or/or-phonetic.js'
+ },
+ 'or-transliteration': {
+ name: 'ଟ୍ରାନ୍ସଲିଟରେସନ',
+ source: 'rules/or/or-transliteration.js'
+ },
+ 'pa-inscript': {
+ name: 'ਇਨਸਕ੍ਰਿਪਟ',
+ source: 'rules/pa/pa-inscript.js'
+ },
+ 'pa-inscript2': {
+ name: 'ਇਨਸਕ੍ਰਿਪਟ2',
+ source: 'rules/pa/pa-inscript2.js'
+ },
+ 'pa-jhelum': {
+ name: 'ਜੇਹਲਮ',
+ source: 'rules/pa/pa-jhelum.js'
+ },
+ 'pa-transliteration': {
+ name: 'ਲਿਪਾਂਤਰਨ',
+ source: 'rules/pa/pa-transliteration.js'
+ },
+ 'pa-phonetic': {
+ name: 'ਫੋਨੇਟਿਕ',
+ source: 'rules/pa/pa-phonetic.js'
+ },
+ 'phagspa': {
+ name: 'PhagsPa',
+ source: 'rules/mn/phagspa.js'
+ },
+ 'pms': {
+ name: 'Piemontèis',
+ source: 'rules/pms/pms.js'
+ },
+ 'roa-tara-GVU': {
+ name: 'Tarandine',
+ source: 'rules/roa-tara/roa-tara.js'
+ },
+ 'ru-jcuken': {
+ name: 'ЙЦУКЕН',
+ source: 'rules/ru/ru-jcuken.js'
+ },
+ 'ru-kbd': {
+ name: 'кбд',
+ source: 'rules/ru/ru-kbd.js'
+ },
+ 'ru-phonetic': {
+ name: 'фонетический',
+ source: 'rules/ru/ru-phonetic.js'
+ },
+ 'ru-yawerty': {
+ name: 'yawerty',
+ source: 'rules/ru/ru-yawerty.js'
+ },
+ 'sa-iast': {
+ name: 'Romanized',
+ source: 'rules/sa/sa-iast.js'
+ },
+ 'sa-inscript': {
+ name: 'इनस्क्रिप्ट',
+ source: 'rules/sa/sa-inscript.js'
+ },
+ 'sa-inscript2': {
+ name: 'इनस्क्रिप्ट २',
+ source: 'rules/sa/sa-inscript2.js'
+ },
+ 'sa-transliteration': {
+ name: 'लिप्यन्तरणम्',
+ source: 'rules/sa/sa-transliteration.js'
+ },
+ 'sah-transliteration': {
+ name: 'Transliteration',
+ source: 'rules/sah/sah-transliteration.js'
+ },
+ 'sat-inscript2': {
+ name: 'इनस्क्रिप्ट २',
+ source: 'rules/sat/sat-inscript2.js'
+ },
+ 'sat-inscript2-ol-chiki': {
+ name: 'inscript2 ᱚᱞ ᱪᱤᱠᱤ',
+ source: 'rules/sat/sat-inscript2-ol-chiki.js'
+ },
+ 'sat-sarjom-baha': {
+ name: 'sarjom baha',
+ source: 'rules/sat/sat-sarjom-baha.js'
+ },
+ 'sd-inscript2': {
+ name: 'इनस्क्रिप्ट २',
+ source: 'rules/sd/sd-inscript2.js'
+ },
+ 'sdh-kbd': {
+ name: 'کوردی خوارگ',
+ source: 'rules/sdh/sdh-kbd.js'
+ },
+ 'se-normforms': {
+ name: 'Normal forms',
+ source: 'rules/se/se-normforms.js'
+ },
+ 'ses-tilde': {
+ name: 'Koyraboro Senni tilde',
+ source: 'rules/ses/ses-tilde.js'
+ },
+ 'sg-tilde': {
+ name: 'Sängö',
+ source: 'rules/sg/sg-tilde.js'
+ },
+ 'si-singlish': {
+ name: 'සිංග්ලිෂ්',
+ source: 'rules/si/si-singlish.js'
+ },
+ 'si-wijesekara': {
+ name: 'විජේසේකර',
+ source: 'rules/si/si-wijesekara.js'
+ },
+ 'sjo': {
+ name: 'ᠰᡞᠪᡝ',
+ source: 'rules/sjo/sjo.js'
+ },
+ 'sk-kbd': {
+ name: 'Štandardná',
+ source: 'rules/sk/sk-kbd.js'
+ },
+ 'sr-kbd': {
+ name: 'Стандардна',
+ source: 'rules/sr/sr-kbd.js'
+ },
+ 'st-tilde': {
+ name: 'Sesotho tilde',
+ source: 'rules/st/st-tilde.js'
+ },
+ 'sv-normforms': {
+ name: 'Normal forms',
+ source: 'rules/sv/sv-normforms.js'
+ },
+ 'ta-99': {
+ name: 'தமிழ்99',
+ source: 'rules/ta/ta-99.js'
+ },
+ 'ta-bamini': {
+ name: 'பாமினி',
+ source: 'rules/ta/ta-bamini.js'
+ },
+ 'ta-inscript': {
+ name: 'இன்ஸ்கிரிப்ட்',
+ source: 'rules/ta/ta-inscript.js'
+ },
+ 'ta-inscript2': {
+ name: 'இன்ஸ்கிரிப்ட் 2',
+ source: 'rules/ta/ta-inscript2.js'
+ },
+ 'ta-transliteration': {
+ name: 'எழுத்துப்பெயர்ப்பு',
+ source: 'rules/ta/ta-transliteration.js'
+ },
+ 'te-apple': {
+ name: 'ఆపిల్',
+ source: 'rules/te/te-apple.js'
+ },
+ 'te-inscript': {
+ name: 'ఇన్\u200dస్క్రిప్ట్',
+ source: 'rules/te/te-inscript.js'
+ },
+ 'te-inscript2': {
+ name: 'ఇన్\u200dస్క్రిప్ట్ 2',
+ source: 'rules/te/te-inscript2.js'
+ },
+ 'te-modular': {
+ name: 'మాడ్యులర్',
+ source: 'rules/te/te-modular.js'
+ },
+ 'te-transliteration': {
+ name: 'లిప్యంతరీకరణ',
+ source: 'rules/te/te-transliteration.js'
+ },
+ 'th-kedmanee': {
+ name: 'เกษมณี',
+ source: 'rules/th/th-kedmanee.js'
+ },
+ 'th-pattachote': {
+ name: 'ปัตตะโชติ',
+ source: 'rules/th/th-pattachote.js'
+ },
+ 'ti-geezim': {
+ name: 'ትግርኛ',
+ source: 'rules/ti/ti-geezim.js'
+ },
+ 'tig-geezim': {
+ name: 'ትግረ',
+ source: 'rules/tig/tig-geezim.js'
+ },
+ 'tn-tilde': {
+ name: 'Setswana tilde',
+ source: 'rules/tn/tn-tilde.js'
+ },
+ 'tum-tilde': {
+ name: 'ChiTumbuka tilde',
+ source: 'rules/tum/tum-tilde.js'
+ },
+ 'udm-alt': {
+ name: 'Удмурт ALT',
+ source: 'rules/udm/udm-alt.js'
+ },
+ 'ug-kbd': {
+ name: 'Uyghur kbd',
+ source: 'rules/ug/ug-kbd.js'
+ },
+ 'uk-kbd': {
+ name: 'кбд',
+ source: 'rules/uk/uk-kbd.js'
+ },
+ 'ur-phonetic': {
+ name: 'صوتی',
+ source: 'rules/ur/ur-phonetic.js'
+ },
+ 'ur-transliteration': {
+ name: 'ٹرانسلٹریشن',
+ source: 'rules/ur/ur-transliteration.js'
+ },
+ 'uz-kbd': {
+ name: 'Uzbek kbd',
+ source: 'rules/uz/uz-kbd.js'
+ },
+ 've-tilde': {
+ name: 'TshiVenḓa tilde',
+ source: 'rules/ve/ve-tilde.js'
+ },
+ 'vai-transliteration': {
+ name: 'Vai transliteration',
+ source: 'rules/vai/vai-transliteration.js'
+ },
+ 'vec-GVU': {
+ name: 'Vèneto',
+ source: 'rules/vec/vec-GVU.js'
+ },
+ 'wo-alt': {
+ name: 'Wolof Alt',
+ source: 'rules/wo/wo-alt.js'
+ },
+ 'wo-tilde': {
+ name: 'Wolof tilde',
+ source: 'rules/wo/wo-tilde.js'
+ },
+ 'yo-alt': {
+ name: 'Yorùbá Alt',
+ source: 'rules/yo/yo-alt.js'
+ },
+ 'yo-tilde': {
+ name: 'Yorùbá tilde',
+ source: 'rules/yo/yo-tilde.js'
+ },
+ 'zh-pinyin-transliteration': {
+ name: '拼音符号输入法',
+ source: 'rules/zh/zh-pinyin-transliteration.js'
+ }
+ } );
+ /* eslint-disable quote-props */
+
+ $.extend( $.ime.languages, {
+ ady: {
+ autonym: 'адыгэбзэ',
+ inputmethods: [ 'cyrl-palochka' ]
+ },
+ af: {
+ autonym: 'Afrikaans',
+ inputmethods: [ 'af-tilde' ]
+ },
+ ahr: {
+ autonym: 'अहिराणी',
+ inputmethods: [ 'mr-transliteration', 'mr-inscript' ]
+ },
+ ajg: {
+ autonym: 'ajagbe',
+ inputmethods: [ 'ajg-tilde' ]
+ },
+ ak: {
+ autonym: 'Akan',
+ inputmethods: [ 'ak-qx', 'ak-tilde' ]
+ },
+ am: {
+ autonym: 'አማርኛ',
+ inputmethods: [ 'am-transliteration' ]
+ },
+ ann: {
+ autonym: 'Obolo',
+ inputmethods: [ 'ann-tilde' ]
+ },
+ ar: {
+ autonym: 'العربية',
+ inputmethods: [ 'ar-kbd' ]
+ },
+ as: {
+ autonym: 'অসমীয়া',
+ inputmethods: [ 'as-transliteration', 'as-avro', 'as-bornona', 'as-inscript', 'as-phonetic', 'as-inscript2', 'as-rodali' ]
+ },
+ av: {
+ autonym: 'авар',
+ inputmethods: [ 'cyrl-palochka' ]
+ },
+ azb: {
+ autonym: 'تۆرکجه',
+ inputmethods: [ 'azb-kbd' ]
+ },
+ bas: {
+ autonym: 'ɓasaá',
+ inputmethods: [ 'bas-tilde', 'mul-cm' ]
+ },
+ bbc: {
+ autonym: 'Batak',
+ inputmethods: [ 'batak-qwerty' ]
+ },
+ bci: {
+ autonym: 'wawle',
+ inputmethods: [ 'bci-tilde' ]
+ },
+ be: {
+ autonym: 'беларуская',
+ inputmethods: [ 'be-transliteration', 'be-latin', 'be-kbd' ]
+ },
+ 'be-tarask': {
+ autonym: 'беларуская (тарашкевіца)',
+ inputmethods: [ 'be-transliteration', 'be-latin' ]
+ },
+ bh: {
+ autonym: 'भोजपुरी',
+ inputmethods: [ 'hi-transliteration' ]
+ },
+ bgn: {
+ autonym: 'روچ کپتین بلوچی',
+ inputmethods: [ 'bgn-kbd' ]
+ },
+ bho: {
+ autonym: 'भोजपुरी',
+ inputmethods: [ 'hi-transliteration' ]
+ },
+ bkm: {
+ autonym: 'Itaŋikom',
+ inputmethods: [ 'bkm-tilde', 'mul-cm' ]
+ },
+ bm: {
+ autonym: 'Bamanankan',
+ inputmethods: [ 'bm-alt', 'bm-tilde' ]
+ },
+ bn: {
+ autonym: 'বাংলা',
+ inputmethods: [ 'bn-avro', 'bn-inscript', 'bn-nkb', 'bn-probhat', 'bn-inscript2' ]
+ },
+ bo: {
+ autonym: 'བོད་ཡིག།',
+ inputmethods: [ 'bo-ewts', 'bo-sambhota' ]
+ },
+ brx: {
+ autonym: 'बोड़ो',
+ inputmethods: [ 'brx-inscript', 'brx-inscript2' ]
+ },
+ bum: {
+ autonym: 'bulu',
+ inputmethods: [ 'mul-cm' ]
+ },
+ bwr: {
+ autonym: 'bura',
+ inputmethods: [ 'bwr-tilde' ]
+ },
+ byn: {
+ autonym: 'ብሊን',
+ inputmethods: [ 'byn-geezim' ]
+ },
+ ce: {
+ autonym: 'нохчийн',
+ inputmethods: [ 'cyrl-palochka' ]
+ },
+ ckb: {
+ autonym: 'کوردی',
+ inputmethods: [ 'ckb-transliteration-arkbd', 'ckb-transliteration-fakbd', 'ckb-transliteration-lakbd' ]
+ },
+ cv: {
+ autonym: 'Чăвашла',
+ inputmethods: [ 'cv-cyr-altgr', 'cv-lat-altgr', 'cv-cyr-numbers' ]
+ },
+ da: {
+ autonym: 'Dansk',
+ inputmethods: [ 'da-normforms' ]
+ },
+ dag: {
+ autonym: 'Dagbani',
+ inputmethods: [ 'dag-alt', 'dag-tilde' ]
+ },
+ dar: {
+ autonym: 'дарган',
+ inputmethods: [ 'cyrl-palochka' ]
+ },
+ de: {
+ autonym: 'Deutsch',
+ inputmethods: [ 'de-transliteration' ]
+ },
+ din: {
+ autonym: 'Thuɔŋjäŋ',
+ inputmethods: [ 'din-fqsx', 'din-tilde' ]
+ },
+ diq: {
+ autonym: 'Kirdkî',
+ inputmethods: [ 'ku-h', 'ku-tr' ]
+ },
+ doi: {
+ autonym: 'डोगरी',
+ inputmethods: [ 'doi-inscript2' ]
+ },
+ en: {
+ autonym: 'English',
+ inputmethods: [ 'ipa-sil', 'ipa-x-sampa' ]
+ },
+ ee: {
+ autonym: 'Èʋegbe',
+ inputmethods: [ 'ee-tilde' ]
+ },
+ efi: {
+ autonym: 'efịk',
+ inputmethods: [ 'efi-tilde' ]
+ },
+ el: {
+ autonym: 'Ελληνικά',
+ inputmethods: [ 'el-kbd' ]
+ },
+ eo: {
+ autonym: 'Esperanto',
+ inputmethods: [ 'eo-transliteration', 'eo-h', 'eo-h-f', 'eo-plena', 'eo-q', 'eo-vi', 'eo-x' ]
+ },
+ fa: {
+ autonym: 'فارسی',
+ inputmethods: [ 'fa-kbd' ]
+ },
+ fat: {
+ autonym: 'mfantse',
+ inputmethods: [ 'ak-qx', 'ak-tilde' ]
+ },
+ ff: {
+ autonym: 'Fulfulde',
+ inputmethods: [ 'ff-alt', 'ff-tilde' ]
+ },
+ fi: {
+ autonym: 'Suomi',
+ inputmethods: [ 'fi-transliteration' ]
+ },
+ fo: {
+ autonym: 'Føroyskt',
+ inputmethods: [ 'fo-normforms' ]
+ },
+ fon: {
+ autonym: 'Fon',
+ inputmethods: [ 'fon-tilde' ]
+ },
+ fonipa: {
+ autonym: 'International Phonetic Alphabet',
+ inputmethods: [ 'ipa-sil', 'ipa-x-sampa' ]
+ },
+ gaa: {
+ autonym: 'Ga',
+ inputmethods: [ 'gaa-cqx', 'gaa-tilde' ]
+ },
+ got: {
+ autonym: '𐌲𐌿𐍄𐌹𐍃𐌺𐌰 𐍂𐌰𐌶𐌳𐌰',
+ inputmethods: [ 'got-standard' ]
+ },
+ ha: {
+ autonym: 'Hausa',
+ inputmethods: [ 'ha-tilde' ]
+ },
+ ig: {
+ autonym: 'Igbo',
+ inputmethods: [ 'ig-tilde' ]
+ },
+ gom: {
+ autonym: 'गोंयची कोंकणी / Gõychi Konknni',
+ inputmethods: [ 'hi-transliteration', 'hi-inscript', 'gom-inscript2' ]
+ },
+ gu: {
+ autonym: 'ગુજરાતી',
+ inputmethods: [ 'gu-transliteration', 'gu-inscript', 'gu-inscript2', 'gu-phonetic' ]
+ },
+ gur: {
+ autonym: 'farefare',
+ inputmethods: [ 'gur-tilde' ]
+ },
+ he: {
+ autonym: 'עברית',
+ inputmethods: [ 'he-standard-2012-extonly', 'he-standard-2012' ]
+ },
+ hi: {
+ autonym: 'हिन्दी',
+ inputmethods: [ 'hi-transliteration', 'hi-inscript', 'hi-bolnagri', 'hi-phonetic', 'hi-inscript2' ]
+ },
+ hne: {
+ autonym: 'छत्तीसगढ़ी',
+ inputmethods: [ 'hi-transliteration' ]
+ },
+ hoc: {
+ autonym: '𑢹𑣉𑣉',
+ inputmethods: [ 'hoc-transliteration' ]
+ },
+ hr: {
+ autonym: 'Hrvatski',
+ inputmethods: [ 'hr-kbd' ]
+ },
+ hy: {
+ autonym: 'հայերեն',
+ inputmethods: [ 'hy-ephonetic', 'hy-typewriter', 'hy-ephoneticalt', 'hy-emslegacy', 'hy-wmslegacy' ]
+ },
+ inh: {
+ autonym: 'гӀалгӀай',
+ inputmethods: [ 'cyrl-palochka' ]
+ },
+ is: {
+ autonym: 'Íslenska',
+ inputmethods: [ 'is-normforms' ]
+ },
+ ish: {
+ autonym: 'awain',
+ inputmethods: [ 'ish-tilde' ]
+ },
+ jv: {
+ autonym: 'ꦧꦱꦗꦮ',
+ inputmethods: [ 'jv-transliteration' ]
+ },
+ ka: {
+ autonym: 'ქართული ენა',
+ inputmethods: [ 'ka-transliteration', 'ka-kbd' ]
+ },
+ kab: {
+ autonym: 'Taqbaylit / ⵜⴰⵇⴱⴰⵢⵍⵉⵜ',
+ inputmethods: [ 'kab-tilde', 'ber-tfng' ]
+ },
+ kbd: {
+ autonym: 'адыгэбзэ (къэбэрдеибзэ)',
+ inputmethods: [ 'cyrl-palochka' ]
+ },
+ kbp: {
+ autonym: 'Kabɩyɛ',
+ inputmethods: [ 'kbp-tilde' ]
+ },
+ kcg: {
+ autonym: 'Tyap',
+ inputmethods: [ 'kcg-tilde' ]
+ },
+ ken: {
+ autonym: 'kɛ́nyáŋ',
+ inputmethods: [ 'mul-cm' ]
+ },
+ ki: {
+ autonym: 'Gĩkũyũ',
+ inputmethods: [ 'ki-tilde' ]
+ },
+ kk: {
+ autonym: 'Қазақша',
+ inputmethods: [ 'kk-kbd', 'kk-arabic' ]
+ },
+ km: {
+ autonym: 'ភាសា​ខ្មែរ',
+ inputmethods: [ 'km-nidakyk' ]
+ },
+ kn: {
+ autonym: 'ಕನ್ನಡ',
+ inputmethods: [ 'kn-transliteration', 'kn-inscript', 'kn-kgp', 'kn-inscript2' ]
+ },
+ kr: {
+ autonym: 'kanuri',
+ inputmethods: [ 'kr-tilde' ]
+ },
+ ks: {
+ autonym: 'कॉशुर / کٲشُر',
+ inputmethods: [ 'ks-inscript', 'ks-kbd' ]
+ },
+ ky: {
+ autonym: 'Кыргыз',
+ inputmethods: [ 'ky-cyrl-alt' ]
+ },
+ ku: {
+ autonym: 'Kurdî',
+ inputmethods: [ 'ku-h', 'ku-tr' ]
+ },
+ lbe: {
+ autonym: 'лакку',
+ inputmethods: [ 'cyrl-palochka' ]
+ },
+ lez: {
+ autonym: 'лезги',
+ inputmethods: [ 'cyrl-palochka' ]
+ },
+ lg: {
+ autonym: 'Luganda',
+ inputmethods: [ 'lg-tilde' ]
+ },
+ ln: {
+ autonym: 'Lingála',
+ inputmethods: [ 'ln-tilde' ]
+ },
+ lo: {
+ autonym: 'ລາວ',
+ inputmethods: [ 'lo-kbd' ]
+ },
+ lrc: {
+ autonym: 'لۊری شومالی',
+ inputmethods: [ 'lrc-kbd' ]
+ },
+ lud: {
+ autonym: 'lüüdi',
+ inputmethods: [ 'lud-transliteration' ]
+ },
+ lut: {
+ autonym: 'dxʷləšucid',
+ inputmethods: [ 'lut-tulalip' ]
+ },
+ mai: {
+ autonym: 'मैथिली',
+ inputmethods: [ 'mai-inscript', 'mai-inscript2' ]
+ },
+ mad: {
+ autonym: 'madhurâ',
+ inputmethods: [ 'mad-tilde' ]
+ },
+ mg: {
+ autonym: 'Malagasy',
+ inputmethods: [ 'mg-tilde' ]
+ },
+ mh: {
+ autonym: 'Kajin M̧ajeļ',
+ inputmethods: [ 'mh' ]
+ },
+ ml: {
+ autonym: 'മലയാളം',
+ inputmethods: [ 'ml-transliteration', 'ml-inscript', 'ml-inscript2' ]
+ },
+ mn: {
+ autonym: 'Монгол',
+ inputmethods: [ 'mn-cyrl', 'mn-trad', 'mn-todo', 'mn-tradali', 'mn-todoali', 'phagspa' ]
+ },
+ mnc: {
+ autonym: 'ᠮᠠᠨᠵᡠ',
+ inputmethods: [ 'mnc', 'mnc-ali' ]
+ },
+ mni: {
+ autonym: 'Manipuri',
+ inputmethods: [ 'mni-inscript2' ]
+ },
+ mnw: {
+ autonym: 'ဘာသာ မန်',
+ inputmethods: [ 'mnw-simplified-anonta' ]
+ },
+ mos: {
+ autonym: 'moore',
+ inputmethods: [ 'mul-bf' ]
+ },
+ mr: {
+ autonym: 'मराठी',
+ inputmethods: [ 'mr-transliteration', 'mr-inscript2', 'mr-inscript', 'mr-phonetic' ]
+ },
+ my: {
+ autonym: 'မြန်မာ',
+ inputmethods: [ 'my-mm3', 'my-xkb' ]
+ },
+ nb: {
+ autonym: 'Norsk (bokmål)',
+ inputmethods: [ 'nb-normforms', 'nb-tildeforms' ]
+ },
+ ne: {
+ autonym: 'नेपाली',
+ inputmethods: [ 'ne-transliteration', 'ne-inscript2', 'ne-inscript', 'ne-rom', 'ne-trad' ]
+ },
+ 'new': {
+ autonym: 'नेपाल भाषा',
+ inputmethods: [ 'hi-transliteration', 'hi-inscript' ]
+ },
+ nia: {
+ autonym: 'li niha',
+ inputmethods: [ 'nia-tilde' ]
+ },
+ nmz: {
+ autonym: 'nawdm',
+ inputmethods: [ 'nmz-tilde' ]
+ },
+ nn: {
+ autonym: 'Norsk (nynorsk)',
+ inputmethods: [ 'nb-normforms', 'nb-tildeforms' ]
+ },
+ nqo: {
+ autonym: 'ߒߞߏ',
+ inputmethods: [ 'nqo-standard-qwerty', 'nqo-transliteration' ]
+ },
+ nso: {
+ autonym: 'Sesotho sa Leboa',
+ inputmethods: [ 'nso-tilde' ]
+ },
+ nus: {
+ autonym: 'Thok Naath',
+ inputmethods: [ 'nus-tilde' ]
+ },
+ ny: {
+ autonym: 'Chichewa',
+ inputmethods: [ 'ny-tilde' ]
+ },
+ or: {
+ autonym: 'ଓଡ଼ିଆ',
+ inputmethods: [ 'or-phonetic', 'or-transliteration', 'or-inscript', 'or-inscript2', 'or-lekhani', 'or-OdiScript' ]
+ },
+ pa: {
+ autonym: 'ਪੰਜਾਬੀ',
+ inputmethods: [ 'pa-transliteration', 'pa-inscript', 'pa-phonetic', 'pa-inscript2', 'pa-jhelum' ]
+ },
+ pms: {
+ autonym: 'Piemontèis',
+ inputmethods: [ 'pms' ]
+ },
+ rif: {
+ autonym: 'ⵜⴰⵔⵉⴼⵉⵜ',
+ inputmethods: [ 'ber-tfng' ]
+ },
+ 'roa-tara': {
+ autonym: 'Tarandine',
+ inputmethods: [ 'roa-tara-GVU' ]
+ },
+ ru: {
+ autonym: 'русский',
+ inputmethods: [ 'ru-jcuken', 'ru-kbd', 'ru-phonetic', 'ru-yawerty' ]
+ },
+ sa: {
+ autonym: 'संस्कृत',
+ inputmethods: [ 'sa-transliteration', 'sa-inscript2', 'sa-inscript', 'sa-iast' ]
+ },
+ sah: {
+ autonym: 'саха тыла',
+ inputmethods: [ 'sah-transliteration' ]
+ },
+ sat: {
+ autonym: 'ᱥᱟᱱᱛᱟᱞᱤ (संताली)',
+ inputmethods: [ 'sat-inscript2', 'sat-inscript2-ol-chiki', 'sat-sarjom-baha' ]
+ },
+ sd: {
+ autonym: 'सिंधी',
+ inputmethods: [ 'sd-inscript2' ]
+ },
+ sdh: {
+ autonym: 'کوردی خوارگ',
+ inputmethods: [ 'sdh-kbd' ]
+ },
+ se: {
+ autonym: 'Davvisámegiella',
+ inputmethods: [ 'se-normforms' ]
+ },
+ ses: {
+ autonym: 'Koyraboro Senni',
+ inputmethods: [ 'ses-tilde' ]
+ },
+ sg: {
+ autonym: 'Sängö',
+ inputmethods: [ 'sg-tilde' ]
+ },
+ shi: {
+ autonym: 'ⵜⴰⵛⵍⵃⵉⵜ',
+ inputmethods: [ 'ber-tfng' ]
+ },
+ si: {
+ autonym: 'සිංහල',
+ inputmethods: [ 'si-singlish', 'si-wijesekara' ]
+ },
+ sjo: {
+ autonym: 'ᠰᡞᠪᡝ',
+ inputmethods: [ 'sjo' ]
+ },
+ sk: {
+ autonym: 'Slovenčina',
+ inputmethods: [ 'sk-kbd' ]
+ },
+ sr: {
+ autonym: 'Српски / srpski',
+ inputmethods: [ 'sr-kbd' ]
+ },
+ st: {
+ autonym: 'Sesotho',
+ inputmethods: [ 'st-tilde' ]
+ },
+ sv: {
+ autonym: 'Svenska',
+ inputmethods: [ 'sv-normforms' ]
+ },
+ ta: {
+ autonym: 'தமிழ்',
+ inputmethods: [ 'ta-transliteration', 'ta-99', 'ta-inscript', 'ta-bamini', 'ta-inscript2' ]
+ },
+ tcy: {
+ autonym: 'ತುಳು',
+ inputmethods: [ 'kn-transliteration', 'kn-inscript', 'kn-kgp', 'kn-inscript2' ]
+ },
+ te: {
+ autonym: 'తెలుగు',
+ inputmethods: [ 'te-transliteration', 'te-inscript', 'te-inscript2', 'te-apple', 'te-modular' ]
+ },
+ th: {
+ autonym: 'ไทย',
+ inputmethods: [ 'th-kedmanee', 'th-pattachote' ]
+ },
+ ti: {
+ autonym: 'ትግርኛ',
+ inputmethods: [ 'ti-geezim' ]
+ },
+ tig: {
+ autonym: 'ትግረ',
+ inputmethods: [ 'tig-geezim' ]
+ },
+ tkr: {
+ autonym: 'цӀаӀхна миз',
+ inputmethods: [ 'cyrl-palochka' ]
+ },
+ tn: {
+ autonym: 'Setswana',
+ inputmethods: [ 'tn-tilde' ]
+ },
+ tum: {
+ autonym: 'ChiTumbuka',
+ inputmethods: [ 'tum-tilde' ]
+ },
+ tw: {
+ autonym: 'Twi',
+ inputmethods: [ 'ak-qx', 'ak-tilde' ]
+ },
+ tzm: {
+ autonym: 'ⵜⴰⵎⴰⵣⵉⵖⵜ',
+ inputmethods: [ 'ber-tfng' ]
+ },
+ udm: {
+ autonym: 'удмурт',
+ inputmethods: [ 'udm-alt' ]
+ },
+ uk: {
+ autonym: 'Українська',
+ inputmethods: [ 'uk-kbd' ]
+ },
+ ug: {
+ autonym: 'ئۇيغۇرچە / Uyghurche',
+ inputmethods: [ 'ug-kbd' ]
+ },
+ ur: {
+ autonym: 'اردو',
+ inputmethods: [ 'ur-transliteration', 'ur-phonetic' ]
+ },
+ uz: {
+ autonym: 'Oʻzbekcha',
+ inputmethods: [ 'uz-kbd' ]
+ },
+ vai: {
+ autonym: 'ꕙꔤ',
+ inputmethods: [ 'vai-transliteration' ]
+ },
+ ve: {
+ autonym: 'TshiVenḓa',
+ inputmethods: [ 've-tilde' ]
+ },
+ vec: {
+ autonym: 'Vèneto',
+ inputmethods: [ 'vec-GVU' ]
+ },
+ wo: {
+ autonym: 'Wolof',
+ inputmethods: [ 'wo-alt', 'wo-tilde' ]
+ },
+ yo: {
+ autonym: 'Yorùbá',
+ inputmethods: [ 'yo-alt', 'yo-tilde' ]
+ },
+ zh: {
+ autonym: '中文',
+ inputmethods: [ 'zh-pinyin-transliteration' ]
+ }
+ } );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/README.md b/UniversalLanguageSelector/lib/jquery.ime/rules/README.md
new file mode 100644
index 00000000..0d106c4b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/README.md
@@ -0,0 +1,138 @@
+<!-- markdownlint-disable MD010 -->
+jQuery.ime Input method specification
+=====================================
+
+Input methods are defined in javascript files. An input method is a javascript
+object and it is passed to `$.ime.register()` method to register with `jquery.ime`
+
+eg: `$.ime.register( hebrewStandardKeyboard );`
+
+Input methods can be built by reusing parts of other methods, this is especially
+interesting for complex patterns. If rules are reused then the methods must be
+loaded first. This is done through configurations in `jquery.ime.inputmethods.js`.
+
+For examples on reuse, see the rules "nb-normforms" or "hi-inscript".
+
+Metadata fields
+---------------
+
+id: A mandatory unique identifier that represents the input method.
+eg: `"hindi-inscript"`
+
+name: A mandatory short name for the input method. eg: `"Hindi InScript"`
+
+Note that the names used in the menu comes from [jquery.ime.inputmethods.js](../src/jquery.ime.inputmethods.js)
+
+description: An optional short description about the input method.
+eg: `"keyboard layout as per inscript standard"`
+
+date: An optional string to represent when this input method was written.
+Format should be: yyyy-mm-dd
+
+author: An optional string containing the authors name. Can contain email
+address as well. eg: `"Santhosh Thottingal, <santhosh.thottingal@gmail.com>"`
+
+URL: A mandatory string containing URL for source where keyboard is defined,
+information about trademark restrictions if any, layout and help.
+
+license: An optional string containing licence information. Eg: `"CC-BY-SA"` or
+`"GPLv3"`.
+
+version: An optional string containing version information.
+
+Input method definition
+-----------------------
+
+patterns: A regular expression table that maps the original inputs to the
+target language.
+
+eg:
+
+```javascript
+patterns: [
+ [ 'q', '/' ],
+ [ 'w', '\'' ],
+ [ 'e', 'ק' ],
+ [ 'r', 'ר' ],
+ [ 't', 'א' ],
+ [ 'y', 'ט' ],
+ [ 'u', 'ו' ],
+ [ 'i', 'ן' ],
+ [ 'o', 'ם' ],
+ [ 'p', 'פ' ]
+ // ...
+ // These characters are mirrored in RTL languages
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+ [ '\\[', ']' ],
+ [ '\\]', '[' ]
+ ]
+```
+
+Any valid regular expression is possible as first element of each array item.
+
+ex: `[ '([ക-ഹ])a', '$1ാ' ]`
+ex: `[ '(([ൺ-ൿം])\u200c+)?I', '$2ഐ' ]`
+
+In the above example, $1, $1 etc are according to the normal regular expression
+replace syntax.
+
+The second member of the pattern can be a function as well.
+
+eg:
+
+```javascript
+patterns: [ [ '[a-z]', function ( $1 ) {
+ return $1.toUpperCase();
+ } ] ]
+```
+
+This rule replace all key strokes to its upper case character.
+
+patterns_x: Defined the same way as ordinary patterns, but active while holding down the alt key or
+alt graph key. When active the normal patterns will be excluded. These two modifier keys can be
+handled differently on various hardware. It might be necessary to define ordinary patterns in
+addition to patterns_x to catch all cases.
+
+patterns_shift: Defined the same way as ordinary patterns, but active while holding down the shift
+key. When active the normal patterns will still be run, but only after the rules listed in
+patterns_shift is run.
+
+contextLength: Length of the context to remember. jquery.ime can replace the
+text based on the previously typed characters.
+
+eg:
+
+```javascript
+ [ 'ൿh', 'c', 'ച്' ]
+```
+
+Note that this pattern definition has 3 members, the middle one is the context.
+This rule is interpreted as as an override to pattern definitions with 2 members.
+
+The current key is h, previous key is c. For the previous key press c, we have
+a transliteration ൿ. But if it is followed by h and ൿ is indeed from key press
+c, replace ൿh with ച്
+
+To make this work, we need to remember the previous key strokes. How many of
+them we need to remember? contextLength should have that value.
+
+This is optional field with default value 0. ie, we don't remember previous key
+strokes by default.
+
+maxKeyLength: While trying to find possible matches, we need to know how many
+characters from the current typing location(cursor) should be used before
+giving up.
+
+maxKeyLength defines it. Normally it is the length of largest regex sequence in
+the patterns.
+
+This field is optional and default value is 1.
+
+Examples
+--------
+
+For complete examples, please refer the existing input method definitions.
+
+Documentation of input methods are available at
+[mw:Help:Extension:UniversalLanguageSelector/Input methods](https://www.mediawiki.org/wiki/Help:Extension:UniversalLanguageSelector/Input_methods)
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/af/af-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/af/af-tilde.js
new file mode 100644
index 00000000..b62b928a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/af/af-tilde.js
@@ -0,0 +1,24 @@
+( function ( $ ) {
+ 'use strict';
+
+ var afTilde = {
+ id: 'af-tilde',
+ name: 'Afrikaans tilde',
+ description: 'Afrikaans tilde',
+ date: '2019-04-30',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ "~\\'", '’' ], // Initial apostrophe
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~:', '\u0308' ] // Combining diaeresis
+ ]
+ };
+
+ $.ime.register( afTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ajg/ajg-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ajg/ajg-tilde.js
new file mode 100644
index 00000000..b8014cdf
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ajg/ajg-tilde.js
@@ -0,0 +1,35 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ajgTilde = {
+ id: 'ajg-tilde',
+ name: 'ajg-tilde',
+ description: 'Aja tilde keyboard',
+ date: '2021-11-13',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Mahuton POSSOUPE, Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~D', 'Ɖ' ],
+ [ '~d', 'ɖ' ],
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~G', 'Ɣ' ],
+ [ '~g', 'ɣ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~Z', 'Ʒ' ],
+ [ '~z', 'ʒ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~-', '\u0304' ], // Combining macron
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( ajgTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ak/ak-qx.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ak/ak-qx.js
new file mode 100644
index 00000000..c3338bfc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ak/ak-qx.js
@@ -0,0 +1,26 @@
+( function ( $ ) {
+ 'use strict';
+
+ var akQx = {
+ id: 'ak-qx',
+ name: 'Akan QX replacement',
+ description: 'Akan input method with Q and X replaced by Ɛ and Ɔ',
+ date: '2016-06-23',
+ URL: 'https://www.kasahorow.org/node/260',
+ author: 'Amir E. Aharoni, based on Kasahorow',
+ license: 'GPLv3',
+ version: '1.1',
+ patterns: [
+ [ '\\\\Q', 'Q' ],
+ [ '\\\\q', 'q' ],
+ [ '\\\\X', 'X' ],
+ [ '\\\\x', 'x' ],
+ [ 'Q', 'Ɛ' ],
+ [ 'q', 'ɛ' ],
+ [ 'X', 'Ɔ' ],
+ [ 'x', 'ɔ' ]
+ ]
+ };
+
+ $.ime.register( akQx );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ak/ak-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ak/ak-tilde.js
new file mode 100644
index 00000000..1f31a00e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ak/ak-tilde.js
@@ -0,0 +1,23 @@
+( function ( $ ) {
+ 'use strict';
+
+ var akTilde = {
+ id: 'ak-tilde',
+ name: 'Akan tilde',
+ description: 'Akan tilde',
+ date: '2019-05-06',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ]
+ ]
+ };
+
+ $.ime.register( akTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/am/am-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/am/am-transliteration.js
new file mode 100644
index 00000000..e2267dc6
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/am/am-transliteration.js
@@ -0,0 +1,432 @@
+( function ( $ ) {
+ 'use strict';
+
+ var amTransliteration = {
+ id: 'am-transliteration',
+ name: 'Amharic Transliteration',
+ description: 'Amharic Transliteration',
+ date: '2012-09-09',
+ URL: 'http://am.wikipedia.org/wiki/%E1%8A%A5%E1%88%AD%E1%8B%B3%E1%89%B3:%E1%8A%A2%E1%89%B5%E1%8B%AE%E1%8D%92%E1%8A%AD_%E1%88%B4%E1%88%AB',
+ author: 'Elfalem [[User:Elfalem]])',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 2,
+ patterns: [
+ [ '\\\\([A-Za-z\\>\\<_~ ])', '\\\\', '$1' ], // include space also
+
+ [ '፼0', '፲፼' ], // 10000 and 0 becomes 10 10000
+ [ '፲፻0', '፼' ], // 10x100 and 0 becomes 10000
+ [ '፻0', '፲፻' ], // NUM_100 and 0 becomes 10 100
+
+ [ '፻0', '፲፻' ], // 1000
+
+ [ '፳0', '፪፻' ], // 200
+ [ '፴0', '፫፻' ], // 300
+ [ '፵0', '፬፻' ], // 400
+ [ '፶0', '፭፻' ], // 500
+ [ '፷0', '፮፻' ], // 600
+ [ '፸0', '፯፻' ], // 700
+ [ '፹0', '፰፻' ], // 800
+ [ '፺0', '፱፻' ], // 900
+
+ [ '፩0', '፲' ], // 10
+ [ '፪0', '፳' ], // 20
+ [ '፫0', '፴' ], // 30
+ [ '፬0', '፵' ], // 40
+ [ '፭0', '፶' ], // 50
+ [ '፮0', '፷' ], // 60
+ [ '፯0', '፸' ], // 70
+ [ '፰0', '፹' ], // 80
+ [ '፱0', '፺' ], // 90
+ [ '፲0', '፻' ], // 100
+
+ [ '1', '፩' ],
+ [ '2', '፪' ],
+ [ '3', '፫' ],
+ [ '4', '፬' ],
+ [ '5', '፭' ],
+ [ '6', '፮' ],
+ [ '7', '፯' ],
+ [ '8', '፰' ],
+ [ '9', '፱' ],
+
+ [ 'ህe', 'ሀ' ],
+ [ 'ህu', 'ሁ' ],
+ [ 'ህi', 'ሂ' ],
+ [ 'ህa', 'ሃ' ],
+ [ '(ሀe|ህE)', 'ሄ' ],
+ [ 'ህo', 'ሆ' ],
+ [ 'ህW', 'ኋ' ],
+
+ [ 'ልe', 'ለ' ],
+ [ 'ልu', 'ሉ' ],
+ [ 'ልi', 'ሊ' ],
+ [ 'ልa', 'ላ' ],
+ [ '(ለe|ልE)', 'ሌ' ],
+ [ 'ልo', 'ሎ' ],
+ [ 'ልW', 'ሏ' ],
+
+ [ 'ሕe', 'ሐ' ],
+ [ 'ሕu', 'ሑ' ],
+ [ 'ሕi', 'ሒ' ],
+ [ 'ሕa', 'ሓ' ],
+ [ '(ሐe|ሕE)', 'ሔ' ],
+ [ 'ሕo', 'ሖ' ],
+ [ 'ሕW', 'ሗ' ],
+
+ [ 'ምe', 'መ' ],
+ [ 'ምu', 'ሙ' ],
+ [ 'ምi', 'ሚ' ],
+ [ 'ምa', 'ማ' ],
+ [ '(መe|ምE)', 'ሜ' ],
+ [ 'ምo', 'ሞ' ],
+ [ 'ምW', 'ሟ' ],
+
+ [ 'ርe', 'ረ' ],
+ [ 'ርu', 'ሩ' ],
+ [ 'ርi', 'ሪ' ],
+ [ 'ርa', 'ራ' ],
+ [ '(ረe|ርE)', 'ሬ' ],
+ [ 'ርo', 'ሮ' ],
+ [ 'ርW', 'ሯ' ],
+
+ [ 'ስe', 'ሰ' ],
+ [ 'ስu', 'ሱ' ],
+ [ 'ስi', 'ሲ' ],
+ [ 'ስa', 'ሳ' ],
+ [ '(ሰe|ስE)', 'ሴ' ],
+ [ 'ስo', 'ሶ' ],
+ [ 'ስW', 'ሷ' ],
+
+ [ 'ሥe', 'ሠ' ],
+ [ 'ሥu', 'ሡ' ],
+ [ 'ሥi', 'ሢ' ],
+ [ 'ሥa', 'ሣ' ],
+ [ '(ሠe|ሥE)', 'ሤ' ],
+ [ 'ሥo', 'ሦ' ],
+ [ 'ሥW', 'ሧ' ],
+
+ [ 'ሽe', 'ሸ' ],
+ [ 'ሽu', 'ሹ' ],
+ [ 'ሽi', 'ሺ' ],
+ [ 'ሽa', 'ሻ' ],
+ [ '(ሸe|ሽE)', 'ሼ' ],
+ [ 'ሽo', 'ሾ' ],
+ [ 'ሽW', 'ሿ' ],
+
+ [ 'ቅe', 'ቀ' ],
+ [ 'ቅu', 'ቁ' ],
+ [ 'ቅi', 'ቂ' ],
+ [ 'ቅa', 'ቃ' ],
+ [ '(ቀe|ቅE)', 'ቄ' ],
+ [ 'ቅo', 'ቆ' ],
+
+ [ 'ቋe', 'ቈ' ],
+ [ '(ቋu|ቋW)', 'ቍ' ],
+ [ 'ቋi', 'ቊ' ],
+ [ 'ቋa', 'ቋ' ],
+ [ 'ቋo', 'ቌ' ],
+
+ [ 'ቕe', 'ቐ' ],
+ [ 'ቕu', 'ቑ' ],
+ [ 'ቕi', 'ቒ' ],
+ [ 'ቕa', 'ቓ' ],
+ [ '(ቐe|ቕE)', 'ቔ' ],
+ [ 'ቕo', 'ቖ' ],
+ [ 'ቕW', 'ቛ' ],
+
+ [ '(ቛe|ቛee)', 'ቜ' ], // the second pattern probably won't be invoked in any case
+ [ 'ቛu', 'ቘ' ],
+ [ 'ቛi', 'ቚ' ],
+ [ 'ቛa', 'ቝ' ],
+
+ [ 'ብe', 'በ' ],
+ [ 'ብu', 'ቡ' ],
+ [ 'ብi', 'ቢ' ],
+ [ 'ብa', 'ባ' ],
+ [ '(በe|ብE)', 'ቤ' ],
+ [ 'ብo', 'ቦ' ],
+ [ 'ብW', 'ቧ' ],
+
+ [ 'ቭe', 'ቨ' ],
+ [ 'ቭu', 'ቩ' ],
+ [ 'ቭi', 'ቪ' ],
+ [ 'ቭa', 'ቫ' ],
+ [ '(ቨe|ቭE)', 'ቬ' ],
+ [ 'ቭo', 'ቮ' ],
+ [ 'ቭW', 'ቯ' ],
+
+ [ 'ትe', 'ተ' ],
+ [ 'ትu', 'ቱ' ],
+ [ 'ትi', 'ቲ' ],
+ [ 'ትa', 'ታ' ],
+ [ '(ተe|ትE)', 'ቴ' ],
+ [ 'ትo', 'ቶ' ],
+ [ 'ትW', 'ቷ' ],
+
+ [ 'ችe', 'ቸ' ],
+ [ 'ችu', 'ቹ' ],
+ [ 'ችi', 'ቺ' ],
+ [ 'ችa', 'ቻ' ],
+ [ '(ቸe|ችE)', 'ቼ' ],
+ [ 'ችo', 'ቾ' ],
+ [ 'ችW', 'ቿ' ],
+
+ [ 'ንe', 'ነ' ],
+ [ 'ንu', 'ኑ' ],
+ [ 'ንi', 'ኒ' ],
+ [ 'ንa', 'ና' ],
+ [ '(ነe|ንE)', 'ኔ' ],
+ [ 'ንo', 'ኖ' ],
+ [ 'ንW', 'ኗ' ],
+
+ [ 'ኝe', 'ኘ' ],
+ [ 'ኝu', 'ኙ' ],
+ [ 'ኝi', 'ኚ' ],
+ [ 'ኝa', 'ኛ' ],
+ [ '(ኘe|ኝE)', 'ኜ' ],
+ [ 'ኝo', 'ኞ' ],
+ [ 'ኝW', 'ኟ' ],
+
+ [ 'ክe', 'ከ' ],
+ [ 'ክu', 'ኩ' ],
+ [ 'ክi', 'ኪ' ],
+ [ 'ክa', 'ካ' ],
+ [ '(ከe|ክE)', 'ኬ' ],
+ [ 'ክo', 'ኮ' ],
+ [ 'ክW', 'ኳ' ],
+
+ [ 'ኳe', 'ኰ' ],
+ [ '(ኳu|ኳ\')', 'ኵ' ],
+ [ 'ኳi', 'ኲ' ],
+ [ '(ኰe|ኳE)', 'ኴ' ],
+
+ [ 'ኽe', 'ኸ' ],
+ [ 'ኽu', 'ኹ' ],
+ [ 'ኽi', 'ኺ' ],
+ [ 'ኽa', 'ኻ' ],
+ [ '(ኸe|ኽE)', 'ኼ' ],
+ [ 'ኽo', 'ኾ' ],
+ [ 'ኽW', 'ዃ' ],
+
+ [ 'ዃe', 'ዀ' ],
+ [ '(ዃu|ዃ\')', 'ዅ' ],
+ [ 'ዃi', 'ዂ' ],
+ [ 'ዃE', 'ዄ' ],
+
+ [ 'ውe', 'ወ' ],
+ [ 'ውu', 'ዉ' ],
+ [ 'ውi', 'ዊ' ],
+ [ 'ውa', 'ዋ' ],
+ [ '(ወe|ውE)', 'ዌ' ],
+ [ 'ውo', 'ዎ' ],
+
+ [ 'ዝe', 'ዘ' ],
+ [ 'ዝu', 'ዙ' ],
+ [ 'ዝi', 'ዚ' ],
+ [ 'ዝa', 'ዛ' ],
+ [ '(ዘe|ዝE)', 'ዜ' ],
+ [ 'ዝo', 'ዞ' ],
+ [ 'ዝW', 'ዟ' ],
+
+ [ 'ዥe', 'ዠ' ],
+ [ 'ዥu', 'ዡ' ],
+ [ 'ዥi', 'ዢ' ],
+ [ 'ዥa', 'ዣ' ],
+ [ '(ዠe|ዥE)', 'ዤ' ],
+ [ 'ዥo', 'ዦ' ],
+ [ 'ዥW', 'ዧ' ],
+
+ [ 'ይe', 'የ' ],
+ [ 'ይu', 'ዩ' ],
+ [ 'ይi', 'ዪ' ],
+ [ 'ይa', 'ያ' ],
+ [ '(የe|ይE)', 'ዬ' ],
+ [ 'ይo', 'ዮ' ],
+
+ [ 'ድe', 'ደ' ],
+ [ 'ድu', 'ዱ' ],
+ [ 'ድi', 'ዲ' ],
+ [ 'ድa', 'ዳ' ],
+ [ '(ደe|ድE)', 'ዴ' ],
+ [ 'ድo', 'ዶ' ],
+ [ 'ድW', 'ዷ' ],
+
+ [ 'ዽe', 'ዸ' ],
+ [ 'ዽu', 'ዹ' ],
+ [ 'ዽi', 'ዺ' ],
+ [ 'ዽa', 'ዻ' ],
+ [ '(ዸe|ዽE)', 'ዼ' ],
+ [ 'ዽo', 'ዾ' ],
+ [ 'ዽW', 'ዿ' ],
+
+ [ 'ጅe', 'ጀ' ],
+ [ 'ጅu', 'ጁ' ],
+ [ 'ጅi', 'ጂ' ],
+ [ 'ጅa', 'ጃ' ],
+ [ '(ጀe|ጅE)', 'ጄ' ],
+ [ 'ጅo', 'ጆ' ],
+ [ 'ጅW', 'ጇ' ],
+
+ [ 'ግe', 'ገ' ],
+ [ 'ግu', 'ጉ' ],
+ [ 'ግi', 'ጊ' ],
+ [ 'ግa', 'ጋ' ],
+ [ '(ገe|ግE)', 'ጌ' ],
+ [ 'ግo', 'ጎ' ],
+
+ [ 'ጓe', 'ጐ' ],
+ [ '(ጓu|ጓ\')', 'ጕ' ],
+ [ 'ጓi', 'ጒ' ],
+ [ '(ጐe|ጓE)', 'ጔ' ],
+
+ [ 'ጝe', 'ጘ' ],
+ [ 'ጝu', 'ጙ' ],
+ [ 'ጝi', 'ጚ' ],
+ [ 'ጝa', 'ጛ' ],
+ [ '(ጘe|ጝE)', 'ጜ' ],
+ [ 'ጝo', 'ጞ' ],
+
+ [ 'ጥe', 'ጠ' ],
+ [ 'ጥu', 'ጡ' ],
+ [ 'ጥi', 'ጢ' ],
+ [ 'ጥa', 'ጣ' ],
+ [ '(ጠe|ጥE)', 'ጤ' ],
+ [ 'ጥo', 'ጦ' ],
+ [ 'ጥW', 'ጧ' ],
+
+ [ 'ጭe', 'ጨ' ],
+ [ 'ጭu', 'ጩ' ],
+ [ 'ጭi', 'ጪ' ],
+ [ 'ጭa', 'ጫ' ],
+ [ '(ጨe|ጭE)', 'ጬ' ],
+ [ 'ጭo', 'ጮ' ],
+ [ 'ጭW', 'ጯ' ],
+
+ [ 'ጵe', 'ጰ' ],
+ [ 'ጵu', 'ጱ' ],
+ [ 'ጵi', 'ጲ' ],
+ [ 'ጵa', 'ጳ' ],
+ [ '(ጰe|ጵE)', 'ጴ' ],
+ [ 'ጵo', 'ጶ' ],
+ [ 'ጵW', 'ጷ' ],
+
+ [ 'ጽe', 'ጸ' ],
+ [ 'ጽu', 'ጹ' ],
+ [ 'ጽi', 'ጺ' ],
+ [ 'ጽa', 'ጻ' ],
+ [ '(ጸe|ጽE)', 'ጼ' ],
+ [ 'ጽo', 'ጾ' ],
+ [ 'ጽW', 'ጿ' ],
+
+ [ 'ፅe', 'ፀ' ],
+ [ 'ፅu', 'ፁ' ],
+ [ 'ፅi', 'ፂ' ],
+ [ 'ፅa', 'ፃ' ],
+ [ '(ፀe|ፅE)', 'ፄ' ],
+ [ 'ፅo', 'ፆ' ],
+
+ [ 'ፍe', 'ፈ' ],
+ [ 'ፍu', 'ፉ' ],
+ [ 'ፍi', 'ፊ' ],
+ [ 'ፍa', 'ፋ' ],
+ [ '(ፈe|ፍE)', 'ፌ' ],
+ [ 'ፍo', 'ፎ' ],
+ [ 'ፍW', 'ፏ' ],
+ [ 'ፍY', 'ፚ' ],
+
+ [ 'ፕe', 'ፐ' ],
+ [ 'ፕu', 'ፑ' ],
+ [ 'ፕi', 'ፒ' ],
+ [ 'ፕa', 'ፓ' ],
+ [ '(ፐe|ፕE)', 'ፔ' ],
+ [ 'ፕo', 'ፖ' ],
+ [ 'ፕW', 'ፗ' ],
+
+ // the following mappings are not documented in Ethiopic sera
+ [ 'ኅu', 'ኁ' ],
+ [ 'ኅi', 'ኂ' ],
+ [ 'ኅa', 'ኃ' ],
+ [ 'ኅE', 'ኄ' ],
+ [ 'ኅo', 'ኆ' ],
+ [ 'ኅW', 'ኋ' ],
+ // end
+
+ [ 'ህh', 'ኅ' ],
+ [ 'h', 'ህ' ],
+ [ '(l|L)', 'ል' ],
+ [ 'H', 'ሕ' ],
+ [ '(m|M)', 'ም' ],
+ [ '(r|R)', 'ር' ],
+ [ 'ስs', 'ሥ' ],
+ [ 's', 'ስ' ],
+ [ '(x|X)', 'ሽ' ],
+ [ 'q', 'ቅ' ],
+ [ 'ቅW', 'ቋ' ],
+ [ 'Q', 'ቕ' ],
+ [ 'ቕW', 'ቛ' ],
+ [ '(b|B)', 'ብ' ],
+ [ '(v|V)', 'ቭ' ],
+ [ 't', 'ት' ],
+ [ 'c', 'ች' ],
+ [ 'n', 'ን' ],
+ [ 'N', 'ኝ' ],
+ [ 'k', 'ክ' ],
+ [ '(ክW|ኳa)', 'ኳ' ],
+ [ 'K', 'ኽ' ],
+ [ '(ኽW|ዃa)', 'ዃ' ],
+ [ 'z', 'ዝ' ],
+ [ 'Z', 'ዥ' ],
+ [ '(y|Y)', 'ይ' ],
+ [ 'd', 'ድ' ],
+ [ 'D', 'ዽ' ],
+ [ '(j|J)', 'ጅ' ],
+ [ 'g', 'ግ' ],
+ [ '(ግW|ጓa)', 'ጓ' ],
+ [ 'G', 'ጝ' ],
+ [ 'T', 'ጥ' ],
+ [ 'C', 'ጭ' ],
+ [ 'P', 'ጵ' ],
+ [ 'ጽS', 'ፅ' ],
+ [ 'S', 'ጽ' ],
+ [ '(f|F)', 'ፍ' ],
+ [ 'p', 'ፕ' ],
+ [ '(w|W)', 'ው' ],
+
+ // vowels
+ // the following mappings are not documented in Ethiopic sera
+ [ 'አa', 'ዓ' ],
+ [ 'A', 'ኣ' ],
+ [ 'አe', 'ዐ' ],
+ [ 'ኡu', 'ዑ' ],
+ [ 'ኢi', 'ዒ' ],
+ [ 'ኤE', 'ዔ' ],
+ [ 'እe', 'ዕ' ],
+ [ 'ኦo', 'ዖ' ],
+ // end undocumented
+
+ [ 'እa', 'ኧ' ],
+ [ 'e', 'እ' ],
+ [ 'u', 'ኡ' ],
+ [ 'i', 'ኢ' ],
+ [ 'a', 'አ' ],
+ [ 'E', 'ኤ' ],
+ [ 'o', 'ኦ' ],
+ // end vowels
+
+ [ '\\<\\<', '«' ],
+ [ '\\>\\>', '»' ],
+ [ '\\?\\?', '፧' ],
+ [ '\\*\\*', '፨' ],
+ [ '\\;', '፤' ],
+ [ '፡\\:', '።' ],
+ [ ',', '፣' ],
+ [ '፡-', '፦' ],
+ [ '\\:', '፡' ]
+
+ ]
+ };
+
+ $.ime.register( amTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ann/ann-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ann/ann-tilde.js
new file mode 100644
index 00000000..b204356c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ann/ann-tilde.js
@@ -0,0 +1,30 @@
+( function ( $ ) {
+ 'use strict';
+
+ var annTilde = {
+ id: 'ann-tilde',
+ name: 'ann-tilde',
+ description: 'Obolo input keyboard',
+ date: '2020-11-03',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.1',
+ patterns: [
+ [ '~N', 'N̄' ],
+ [ '~n', 'n̄' ],
+ [ '~O', 'Ọ' ],
+ [ '~o', 'ọ' ],
+ [ '~S', 'Ṣ' ],
+ [ '~s', 'ṣ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~-', '\u0304' ], // Combining macron
+ [ '~v', '\u030C' ], // Combining caron
+ [ '~\\.', '\u0323' ] // Combining dot below
+ ]
+ };
+
+ $.ime.register( annTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ar/ar-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ar/ar-kbd.js
new file mode 100644
index 00000000..13ca3c0f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ar/ar-kbd.js
@@ -0,0 +1,115 @@
+( function ( $ ) {
+ 'use strict';
+
+ var arKbd = {
+ id: 'ar-kbd',
+ name: 'kbd',
+ description: 'PC Arabic keyboard layout',
+ date: '2013-02-09',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '١' ],
+ [ '2', '٢' ],
+ [ '3', '٣' ],
+ [ '4', '٤' ],
+ [ '5', '٥' ],
+ [ '6', '٦' ],
+ [ '7', '٧' ],
+ [ '8', '٨' ],
+ [ '9', '٩' ],
+ [ '0', '٠' ],
+ [ '`', 'ذ' ],
+
+ [ 'q', 'ض' ],
+ [ 'w', 'ص' ],
+ [ 'e', 'ث' ],
+ [ 'r', 'ق' ],
+ [ 't', 'ف' ],
+ [ 'y', 'غ' ],
+ [ 'u', 'ع' ],
+ [ 'i', 'ه' ],
+ [ 'o', 'خ' ],
+ [ 'p', 'ح' ],
+ [ '\\[', 'ج' ],
+ [ '\\]', 'د' ],
+
+ [ 'a', 'ش' ],
+ [ 's', 'س' ],
+ [ 'd', 'ي' ],
+ [ 'f', 'ب' ],
+ [ 'g', 'ل' ],
+ [ 'h', 'ا' ],
+ [ 'j', 'ت' ],
+ [ 'k', 'ن' ],
+ [ 'l', 'م' ],
+ [ ';', 'ك' ],
+ [ '\'', 'ط' ],
+
+ [ 'z', 'ئ' ],
+ [ 'x', 'ء' ],
+ [ 'c', 'ؤ' ],
+ [ 'v', 'ر' ],
+ [ 'b', 'لا' ],
+ [ 'n', 'ى' ],
+ [ 'm', 'ة' ],
+ [ ',', 'و' ],
+ [ '\\.', 'ز' ],
+ [ '/', 'ظ' ],
+
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+ [ '\\~', 'ّ' ],
+
+ [ 'Q', 'َ' ],
+ [ 'W', 'ً' ],
+ [ 'E', 'ُ' ],
+ [ 'R', 'ٌ' ],
+ [ 'T', 'لإ' ],
+ [ 'Y', 'إ' ],
+ [ 'U', '`' ],
+ [ 'I', '÷' ],
+ [ 'O', '×' ],
+ [ 'P', '؛' ],
+ [ '\\{', '>' ],
+ [ '\\}', '<' ],
+
+ [ 'A', 'ِ' ],
+ [ 'S', 'ٍ' ],
+ [ 'D', ']' ],
+ [ 'F', '[' ],
+ [ 'G', 'لأ' ],
+ [ 'H', 'أ' ],
+ [ 'J', 'ـ' ],
+ [ 'K', '،' ],
+ [ 'L', '/' ],
+
+ [ 'Z', '~' ],
+ [ 'X', 'ْ' ],
+ [ 'C', '}' ],
+ [ 'V', '{' ],
+ [ 'B', 'لآ' ],
+ [ 'N', 'آ' ],
+ [ 'M', '\'' ],
+ [ '\\<', ',' ],
+ [ '\\>', '.' ],
+ [ '\\?', '؟' ]
+ ],
+ patterns_x: [
+ [ ',', '>' ],
+ [ '\\.', '<' ],
+ [ '\\[', ']' ],
+ [ '\\]', '[' ],
+ [ 'J', '\u200d' ],
+ [ 'L', '\u200e' ],
+ [ 'N', '\u200c' ],
+ [ 'R', '\u200f' ],
+ [ '\\{', '}' ],
+ [ '\\}', '{' ]
+ ]
+ };
+
+ $.ime.register( arKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-avro.js b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-avro.js
new file mode 100644
index 00000000..6d4871dd
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-avro.js
@@ -0,0 +1,168 @@
+( function ( $ ) {
+ 'use strict';
+
+ var asAvro = {
+ id: 'as-avro',
+ name: 'অভ্ৰ',
+ description: 'Assamese Avro layout based on Bengali Avro input method',
+ date: '2012-10-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ '([ক-হড়ঢ়য়ৰ])্?ৰৰi', '[^o`]', '$1ৃ' ],
+ [ 'ৰৰi', '[^o`]', 'ঋ' ],
+
+ [ '(([ক-হড়ঢ়য়ৰ])|য়)o', '[^o`]', '$1' ], // য় cannot be included in the range, why? everywhere else it is OK!
+ [ '([ক-হড়ঢ়য়ৰ])a', '[^o`]', '$1া' ],
+ [ '([ক-হড়ঢ়য়ৰ])i', '[^o`]', '$1ি' ],
+ [ '([ক-হড়ঢ়য়ৰ])I', '[^o`]', '$1ী' ],
+ [ '([ক-হড়ঢ়য়ৰ])u', '[^o`]', '$1ু' ],
+ [ '([ক-হড়ঢ়য়ৰ])U', '[^o`]', '$1ূ' ],
+ [ '([ক-হড়ঢ়য়ৰ])o', '[o`]', '$1ু' ],
+ [ '([ক-হড়ঢ়য়ৰ])e', '[^o`]', '$1ে' ],
+ [ '([ক-হড়ঢ়য়ৰ])োI', '[^o`]', '$1ৈ' ],
+ [ '([ক-হড়ঢ়য়ৰ])O', '[^o`]', '$1ো' ],
+ [ '([ক-হড়ঢ়য়ৰ])োU', '[^o`]', '$1ৌ' ],
+
+ // 'চচh', '[^o`]', 'চ্চ'],
+
+ [ '([কঙলষস])(k|K)', '[^o`]', '$1্ক' ],
+ [ '([ঙদল])(g|G)', '[^o`]', '$1্গ' ],
+ [ 'গg', '[^o`]', 'জ্ঞ' ],
+ [ '([চশ])c', '[^o`]', '$1্চ' ],
+ [ '([জঞব])j', '[^o`]', '$1্জ' ],
+ [ 'নj', '[^o`]', 'ঞ্জ' ],
+ [ '([কটণনপলষস])T', '[^o`]', '$1্ট' ],
+ [ '([ডণনল])D', '[^o`]', '$1্ড' ],
+ [ '([গষহ])N', '[^o`]', '$1্ণ' ],
+ [ '([কতনপশসহ])t', '[^o`]', '$1্ত' ],
+ [ '([দনব])d', '[^o`]', '$1্দ' ],
+ [ '([গঘণতধনপমশসহ])n', '[^o`]', '$1্ন' ],
+ [ '([পমলস])p', '[^o`]', '$1্প' ],
+ [ '([বমল])b', '[^o`]', '$1্ব' ],
+ [ '([দম])(v|V)', '[^o`]', '$1্ভ' ],
+ [ '([কগঙটণতদধনমলশষসহ])m', '[^o`]', '$1্ম' ],
+ [ '([ক-ঘচ-ঝট-যলশ-হড়ঢ়য়])r', '[^o`]', '$1্ৰ' ],
+ [ '([কগপ-বমলশসহ])l', '[^o`]', '$1্ল' ],
+ [ '([কনপ])s', '[^o`]', '$1্স' ],
+ [ '([ক-হড়ঢ়য়ৰ])w', '[^o`]', '$1্ব' ],
+ [ '([ক-হড়ঢ়য়ৰ])y', '[^o`]', '$1্য' ],
+ [ 'নc', '[^o`]', 'ঞ্চ' ],
+
+ [ 'ত`', '`', 'ৎ' ],
+
+ [ 'ক্ক(h|H)', '[^o`]', 'ক্ষ' ],
+ [ 'কশ(h|H)', '[^o`]', 'ক্ষ' ],
+ // '([অ-ঔা-ৌ])ৰৰk', '[^o]', '$1র্ক'],
+
+ [ 'ৰৰk', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ক' ],
+ [ 'ৰৰg', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্গ' ],
+ [ 'ৰৰc', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্চ' ],
+ [ 'ৰৰj', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্জ' ],
+ [ 'ৰৰT', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ট' ],
+ [ 'ৰৰD', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ড' ],
+ [ 'ৰৰN', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ণ' ],
+ [ 'ৰৰt', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ত' ],
+ [ 'ৰৰd', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্দ' ],
+ [ 'ৰৰn', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ন' ],
+ [ 'ৰৰp', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্প' ],
+ [ 'ৰৰf', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ফ' ],
+ [ 'ৰৰb', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ব' ],
+ [ 'ৰৰv', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ভ' ],
+ [ 'ৰৰm', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ম' ],
+ [ 'ৰৰz', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্য' ],
+ [ 'ৰৰl', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ল' ],
+ [ 'ৰৰS', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্শ' ],
+ [ 'ৰৰs', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্স' ],
+ [ 'ৰৰh', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্হ' ],
+ [ 'ৰৰR', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ড়' ],
+ [ 'ৰৰ(y|Y)', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্য়' ],
+
+ [ 'শ(h|H)', 'S', 'ষ' ],
+
+ [ 'অo', '[^`]', 'উ' ],
+ [ 'এe', '[^o`]', 'ঈ' ],
+
+ [ 'কh', '[^o`]', 'খ' ],
+ [ 'গh', '[^o`]', 'ঘ' ],
+ [ 'ণg', '[^o`]', 'ঙ' ],
+ [ 'চh', '[^o`]', 'ছ' ],
+ [ 'জh', '[^o`]', 'ঝ' ],
+ [ 'ণG', '[^o`]', 'ঞ' ],
+ [ 'টh', '[^o`]', 'ঠ' ],
+ [ 'ডh', '[^o`]', 'ঢ' ],
+ [ 'তh', '[^o`]', 'থ' ],
+ [ 'দh', '[^o`]', 'ধ' ],
+ [ 'পh', '[^o`]', 'ফ' ],
+ [ 'বh', '[^o`]', 'ভ' ],
+ [ '(সh)', '[^o`]', 'শ' ],
+ [ 'ড়h', '[^o`]', 'ঢ়' ],
+ [ 'ত্`', '[^o`]', 'ৎ' ],
+ [ 'নg', '[^o`]', 'ং' ],
+ [ 'ঃ`', '[^o`]', ':' ],
+ [ 'ৰৰi', '[^o`]', 'ঋ' ],
+ [ 'ওI', '[^o`]', 'ঐ' ],
+ [ 'ওU', '[^o`]', 'ঔ' ],
+ [ '(k|K)', 'ক' ],
+ [ '(g|G)', 'গ' ],
+ [ '(c|C)', 'চ' ],
+ [ 'j', 'জ' ],
+ [ 'T', 'ট' ],
+ [ 'D', 'ড' ],
+ [ 'N', 'ণ' ],
+ [ 't', 'ত' ],
+ [ 'd', 'দ' ],
+ [ 'n', 'ন' ],
+ [ '(p|P)', 'প' ],
+ [ 'f', 'ফ' ],
+ [ '(b|B)', 'ব' ],
+ [ '(v|V)', 'ভ' ],
+ [ '(m|M)', 'ম' ],
+ [ 'z', 'য' ],
+ [ 'r', 'ৰ' ],
+ [ '(l|L)', 'ল' ],
+ [ 'S', 'শ' ],
+ [ 's', 'স' ],
+ [ '(h|H)', 'হ' ],
+ [ 'R', 'ড়' ],
+ [ '(y|Y)', 'য়' ],
+
+ [ 'Z', '্য' ],
+
+ [ 'o', 'অ' ],
+ [ '(a|A)', 'আ' ],
+ [ 'i', 'ই' ],
+ [ 'I', 'ঈ' ],
+ [ 'u', 'উ' ],
+ [ 'U', 'ঊ' ],
+ [ 'e', 'এ' ],
+ [ 'O', 'ও' ],
+
+ [ '0', '০' ],
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '3', '৩' ],
+ [ '4', '৪' ],
+ [ '5', '৫' ],
+ [ '6', '৬' ],
+ [ '7', '৭' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+
+ [ '\\\\\\.', '.' ],
+
+ [ ',,', '্' ],
+ [ '\\:', 'ঃ' ],
+ [ '\\^', 'ঁ' ],
+ [ '\\.', '।' ],
+ [ '\\$', '৳' ],
+ [ 'ঃ`', ':' ],
+ [ '`', '' ] ]
+ };
+
+ $.ime.register( asAvro );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-bornona.js b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-bornona.js
new file mode 100644
index 00000000..8260d502
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-bornona.js
@@ -0,0 +1,84 @@
+( function ( $ ) {
+ 'use strict';
+
+ var asBornona = {
+ id: 'as-bornona',
+ name: 'বৰ্ণনা',
+ description: 'Bornona input method for Assamese',
+ date: '2012-10-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 0,
+ patterns: [
+ [ 'q', 'ং' ],
+ [ 'Q', 'ঙ' ],
+ [ 'w', 'ঢ' ],
+ [ 'W', 'ঠ' ],
+ [ 'e', 'ে' ],
+ [ 'E', 'ৈ' ],
+ [ 'r', 'ৰ' ],
+ [ 'R', 'ৃ' ],
+ [ 't', 'ত' ],
+ [ 'T', 'ট' ],
+ [ 'y', 'ধ' ],
+ [ 'Y', 'থ' ],
+ [ 'u', 'ু' ],
+ [ 'U', 'ূ' ],
+ [ 'i', 'ি' ],
+ [ 'I', 'ী' ],
+ [ 'o', 'ো' ],
+ [ 'O', 'ৌ' ],
+ [ 'p', 'প' ],
+ [ 'P', '্ৰ' ],
+ [ '\\|', 'র' ],
+ [ '\\\\', 'ৱ' ],
+ [ 'a', 'া' ],
+ [ 'A', 'অ' ],
+ [ 's', 'স' ],
+ [ 'S', 'শ' ],
+ [ 'd', 'দ' ],
+ [ 'D', 'ড' ],
+ [ 'f', 'ফ' ],
+ [ 'F', 'ৰ্ফ' ],
+ [ 'g', 'গ' ],
+ [ 'G', 'ঘ' ],
+ [ 'h', '্' ],
+ [ 'H', 'হ' ],
+ [ 'j', 'জ' ],
+ [ 'J', 'ঝ' ],
+ [ 'k', 'ক' ],
+ [ 'K', 'খ' ],
+ [ 'l', 'ল' ],
+ [ 'L', '।' ],
+ [ 'z', 'য' ],
+ [ 'Z', 'ড়' ],
+ [ 'x', 'ষ' ],
+ [ 'X', 'ঢ়' ],
+ [ 'c', 'চ' ],
+ [ 'C', 'ছ' ],
+ [ 'v', 'ভ' ],
+ [ 'V', '্য' ],
+ [ 'b', 'ব' ],
+ [ 'B', 'য়' ],
+ [ 'n', 'ন' ],
+ [ 'N', 'ণ' ],
+ [ 'm', 'ম' ],
+ [ 'M', 'ঞ' ],
+ [ '0', '০' ],
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '3', '৩' ],
+ [ '4', '৪' ],
+ [ '5', '৫' ],
+ [ '6', '৬' ],
+ [ '7', '৭' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+ [ '\\`', '\u200C' ] ]
+ };
+
+ $.ime.register( asBornona );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-inscript.js
new file mode 100644
index 00000000..63e37813
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-inscript.js
@@ -0,0 +1,124 @@
+( function ( $ ) {
+ 'use strict';
+
+ var asInScript = {
+ id: 'as-inscript',
+ name: 'ইনস্ক্ৰিপ্ট',
+ description: 'InScript input method for Assamese according to CDAC\'s Enhanced InScript Keyboard Layout 5.2',
+ date: '2012-10-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 0,
+ patterns: [
+ [ 'X', 'ঁ' ],
+ [ 'x', 'ং' ],
+ [ '_', 'ঃ' ],
+ [ 'D', 'অ' ],
+ [ 'E', 'আ' ],
+ [ 'F', 'ই' ],
+ [ 'R', 'ঈ' ],
+ [ 'G', 'উ' ],
+ [ 'T', 'ঊ' ],
+ [ '\\+', 'ঋ' ],
+ [ 'S', 'এ' ],
+ [ 'W', 'ঐ' ],
+ [ 'A', 'ও' ],
+ [ 'Q', 'ঔ' ],
+ [ 'k', 'ক' ],
+ [ 'K', 'খ' ],
+ [ 'i', 'গ' ],
+ [ 'I', 'ঘ' ],
+ [ 'U', 'ঙ' ],
+ [ ';', 'চ' ],
+ [ '\\:', 'ছ' ],
+ [ 'p', 'জ' ],
+ [ 'P', 'ঝ' ],
+ [ '\\}', 'ঞ' ],
+ [ '\'', 'ট' ],
+ [ '"', 'ঠ' ],
+ [ '\\[', 'ড' ],
+ [ '\\{', 'ঢ' ],
+ [ 'C', 'ণ' ],
+ [ 'l', 'ত' ],
+ [ 'L', 'থ' ],
+ [ 'o', 'দ' ],
+ [ 'O', 'ধ' ],
+ [ 'v', 'ন' ],
+ [ 'h', 'প' ],
+ [ 'H', 'ফ' ],
+ [ 'y', 'ব' ],
+ [ 'Y', 'ভ' ],
+ [ 'c', 'ম' ],
+ [ '\\?', 'য' ],
+ [ 'j', '\u09F0' ],
+ [ 'J', 'ৎ' ],
+ [ 'n', 'ল' ],
+ [ 'M', 'শ' ],
+ [ '\\<', 'ষ' ],
+ [ 'm', 'স' ],
+ [ 'u', 'হ' ],
+ [ '\\]', '়' ],
+ [ 'e', 'া' ],
+ [ 'f', 'ি' ],
+ [ 'r', 'ী' ],
+ [ 'g', 'ু' ],
+ [ 't', 'ূ' ],
+ [ '\\=', 'ৃ' ],
+ [ 's', 'ে' ],
+ [ 'w', 'ৈ' ],
+ [ 'a', 'ো' ],
+ [ 'q', 'ৌ' ],
+ [ 'd', '্' ],
+ [ '/', 'য়' ],
+ [ '\\>', '৤' ],
+ [ '0', '০' ],
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '3', '৩' ],
+ [ '4', '৪' ],
+ [ '5', '৫' ],
+ [ '6', '৬' ],
+ [ '7', '৭' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+ [ 'z', 'ʼ' ],
+ [ '\\!', 'অ্যা' ],
+ [ '\\#', '্\u09F0' ],
+ [ '\\$', '\u09F0্' ],
+ [ '\\%', 'জ্ঞ' ],
+ [ '\\^', 'ত্র' ],
+ [ '\\&', 'ক্ষ' ],
+ [ '\\*', 'শ্র' ],
+ [ '\\(', '\u200D' ],
+ [ '\\)', '\u200C' ] ],
+ patterns_x: [
+ [ 'F', 'ঌ' ],
+ [ '\\>', 'ঽ' ],
+ [ '\\=', 'ৠ' ],
+ [ 'l', 'ৎ' ],
+ [ '\\[', 'ড়' ],
+ [ '\\{', 'ঢ়' ],
+ [ '\\+', 'ৠ' ],
+ [ 'R', 'ৡ' ],
+ [ 'f', 'ৢ' ],
+ [ 'r', 'ৣ' ],
+ [ '\\.', '৥' ],
+ [ 'x', '৺' ],
+ [ '\\<', '৲' ],
+ [ ',', '৳' ],
+ [ '\\!', '৴' ],
+ [ '\\@', '৵' ],
+ [ '\\#', '৶' ],
+ [ '\\$', '৷' ],
+ [ '\\%', '৸' ],
+ [ '\\^', '৹' ],
+ [ '\\?', '৻' ],
+ [ '4', '₹' ] ]
+
+ };
+
+ $.ime.register( asInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-inscript2.js
new file mode 100644
index 00000000..e44b49b4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-inscript2.js
@@ -0,0 +1,128 @@
+( function ( $ ) {
+ 'use strict';
+
+ var asInScript2 = {
+ id: 'as-inscript2',
+ name: 'ইনস্ক্ৰিপ্ট ২',
+ description: 'Enhanced InScript keyboard for Assamese language',
+ date: '2013-02-09',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\!', 'অ্যা' ],
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '\\#', '্ৰ' ],
+ [ '3', '৩' ],
+ [ '\\$', 'ৰ্' ],
+ [ '4', '৪' ],
+ [ '\\%', 'জ্ঞ' ],
+ [ '5', '৫' ],
+ [ '\\^', 'ত্র' ],
+ [ '6', '৬' ],
+ [ '\\&', 'ক্ষ' ],
+ [ '7', '৭' ],
+ [ '\\*', 'শ্র' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '0', '০' ],
+ [ '"', 'ঠ' ],
+ [ '\'', 'ট' ],
+ [ ',', ',' ],
+ [ '-', '-' ],
+ [ '\\.', '.' ],
+ [ '/', 'য়' ],
+ [ ':', 'ছ' ],
+ [ ';', 'চ' ],
+ [ '\\<', 'ষ' ],
+ [ '\\=', 'ৃ' ],
+ [ '\\+', 'ঋ' ],
+ [ '\\>', '।' ],
+ [ '\\?', 'য' ],
+ [ 'A', 'ও' ],
+ [ 'C', 'ণ' ],
+ [ 'D', 'অ' ],
+ [ 'E', 'আ' ],
+ [ 'F', 'ই' ],
+ [ 'G', 'উ' ],
+ [ 'H', 'ফ' ],
+ [ 'I', 'ঘ' ],
+ [ 'K', 'খ' ],
+ [ 'L', 'থ' ],
+ [ 'M', 'শ' ],
+ [ 'O', 'ধ' ],
+ [ 'P', 'ঝ' ],
+ [ 'Q', 'ঔ' ],
+ [ 'R', 'ঈ' ],
+ [ 'S', 'এ' ],
+ [ 'T', 'ঊ' ],
+ [ 'U', 'ঙ' ],
+ [ 'W', 'ঐ' ],
+ [ 'X', 'ঁ' ],
+ [ 'Y', 'ভ' ],
+ [ '\\{', 'ঢ' ],
+ [ '\\[', 'ড' ],
+ [ '\\}', 'ঞ' ],
+ [ '\\]', '়' ],
+ [ '\\_', 'ঃ' ],
+ [ 'a', 'ো' ],
+ [ 'b', 'ৱ' ],
+ [ 'c', 'ম' ],
+ [ 'd', '্' ],
+ [ 'e', 'া' ],
+ [ 'f', 'ি' ],
+ [ 'g', 'ু' ],
+ [ 'h', 'প' ],
+ [ 'i', 'গ' ],
+ [ 'j', 'ৰ' ],
+ [ 'k', 'ক' ],
+ [ 'l', 'ত' ],
+ [ 'm', 'স' ],
+ [ 'n', 'ল' ],
+ [ 'o', 'দ' ],
+ [ 'p', 'জ' ],
+ [ 'q', 'ৌ' ],
+ [ 'r', 'ী' ],
+ [ 's', 'ে' ],
+ [ 't', 'ূ' ],
+ [ 'u', 'হ' ],
+ [ 'v', 'ন' ],
+ [ 'w', 'ৈ' ],
+ [ 'x', 'ং' ],
+ [ 'y', 'ব' ],
+ [ 'z', 'ʼ' ]
+ ],
+ patterns_x: [
+ [ '\\!', '৴' ],
+ [ '1', '\u200d' ],
+ [ '\\@', '৵' ],
+ [ '2', '\u200c' ],
+ [ '\\#', '৶' ],
+ [ '\\$', '৷' ],
+ [ '4', '₹' ],
+ [ '\\%', '৸' ],
+ [ '\\^', '৹' ],
+ [ ',', '৳' ],
+ [ '\\.', '॥' ],
+ [ '/', '্য' ],
+ [ '\\<', '৲' ],
+ [ '\\=', 'ৄ' ],
+ [ '\\+', 'ৠ' ],
+ [ '\\>', 'ঽ' ],
+ [ 'F', 'ঌ' ],
+ [ 'R', 'ৡ' ],
+ [ '\\{', 'ঢ়' ],
+ [ '\\[', 'ড়' ],
+ [ 'f', 'ৢ' ],
+ [ 'l', 'ৎ' ],
+ [ 'r', 'ৣ' ],
+ [ 'x', '৺' ]
+ ]
+ };
+
+ $.ime.register( asInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-phonetic.js b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-phonetic.js
new file mode 100644
index 00000000..966427c1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-phonetic.js
@@ -0,0 +1,112 @@
+( function ( $ ) {
+ 'use strict';
+
+ var asPhonetic = {
+ id: 'as-phonetic',
+ name: 'phonetic',
+ description: 'Phonetic keyboard for Assamese script',
+ date: '2013-02-09',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\!', '!' ],
+ [ '1', '১' ],
+ [ '\\@', '@' ],
+ [ '2', '২' ],
+ [ '\\#', '#' ],
+ [ '3', '৩' ],
+ [ '\\$', 'ৎ' ],
+ [ '4', '৪' ],
+ [ '\\%', '%' ],
+ [ '5', '৫' ],
+ [ '\\^', 'ঞ' ],
+ [ '6', '৬' ],
+ [ '\\&', '&' ],
+ [ '7', '৭' ],
+ [ '\\*', '*' ],
+ [ '8', '৮' ],
+ [ '\\(', '(' ],
+ [ '9', '৯' ],
+ [ '\\)', ')' ],
+ [ '0', '০' ],
+ [ '\\_', '_' ],
+ [ '\\-', '-' ],
+ [ '\\+', '+' ],
+ [ '\\=', '=' ],
+ [ 'Q', 'ধ' ],
+ [ 'q', 'দ' ],
+ [ 'W', 'ঊ' ],
+ [ 'w', 'ূ' ],
+ [ 'E', 'ঈ' ],
+ [ 'e', 'ী' ],
+ [ 'R', 'ড়' ],
+ [ 'r', 'ৰ' ],
+ [ 'T', 'ঠ' ],
+ [ 't', 'ট' ],
+ [ 'Y', 'ঐ' ],
+ [ 'y', 'এ' ],
+ [ 'U', 'উ' ],
+ [ 'u', 'ু' ],
+ [ 'I', 'ই' ],
+ [ 'i', 'ি' ],
+ [ 'O', 'ঔ' ],
+ [ 'o', 'ও' ],
+ [ 'P', 'ফ' ],
+ [ 'p', 'প' ],
+ [ '\\{', 'ৈ' ],
+ [ '\\[', 'ে' ],
+ [ '\\}', 'ৌ' ],
+ [ '\\]', 'ো' ],
+ [ 'A', 'অ' ],
+ [ 'a', 'া' ],
+ [ 'S', 'ষ' ],
+ [ 's', 'স' ],
+ [ 'D', 'ঢ' ],
+ [ 'd', 'ড' ],
+ [ 'F', 'থ' ],
+ [ 'f', 'ত' ],
+ [ 'G', 'ঘ' ],
+ [ 'g', 'গ' ],
+ [ 'H', 'ঃ' ],
+ [ 'h', 'হ' ],
+ [ 'J', 'ঝ' ],
+ [ 'j', 'জ' ],
+ [ 'K', 'খ' ],
+ [ 'k', 'ক' ],
+ [ 'L', 'ং' ],
+ [ 'l', 'ল' ],
+ [ ':', ':' ],
+ [ ';', ';' ],
+ [ '"', '"' ],
+ [ '\'', '\'' ],
+ [ '\\|', '৺' ],
+ [ '\\\\', 'ৱ' ],
+ [ '\\~', '\u200c' ],
+ [ '\\`', '\u200d' ],
+ [ 'Z', 'য' ],
+ [ 'z', 'য়' ],
+ [ 'X', 'ঢ়' ],
+ [ 'x', 'শ' ],
+ [ 'C', 'ছ' ],
+ [ 'c', 'চ' ],
+ [ 'V', 'ঋ' ],
+ [ 'v', 'আ' ],
+ [ 'B', 'ভ' ],
+ [ 'b', 'ব' ],
+ [ 'N', 'ণ' ],
+ [ 'n', 'ন' ],
+ [ 'M', 'ঙ' ],
+ [ 'm', 'ম' ],
+ [ '\\<', 'ৃ' ],
+ [ ',', ',' ],
+ [ '\\>', 'ঁ' ],
+ [ '\\.', '।' ],
+ [ '\\?', '?' ],
+ [ '/', '্' ]
+ ]
+ };
+
+ $.ime.register( asPhonetic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-rodali.js b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-rodali.js
new file mode 100644
index 00000000..b69dec6c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-rodali.js
@@ -0,0 +1,147 @@
+( function ( $ ) {
+ 'use strict';
+
+ var asRodali = {
+ id: 'as-rodali',
+ name: 'ৰ\'দালি',
+ description: 'Rodali Keyboard',
+ date: '2015-07-26',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Gunadeep Chetia, Subhashish Panigrahi',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 4,
+ maxKeyLength: 5,
+ patterns: [
+ [ '([ক-হড়ঢ়য়])্?ৰৰi', '[^a`]', '$1ৃ' ],
+ [ 'ৰৰi', '[^a`]', 'ঋ' ],
+ [ '(([ক-হড়ঢ়ৰৱয়]))a', '[^a`]', '$1' ],
+ [ '([ক-হড়ঢ়ৰৱয়])a', 'a', '$1া' ],
+ [ '([ক-হড়ঢ়ৰৱয়])i', '[^a`]', '$1ি' ],
+ [ '([ক-হড়ঢ়ৰৱয়])(িi|েe)', '[^a`]', '$1ী' ],
+ [ '([ক-হড়ঢ়ৰৱয়])u', '[^a`]', '$1ু' ],
+ [ '([ক-হড়ঢ়ৰৱয়])ুu', '[^a`]', '$1ূ' ],
+ [ '([ক-হড়ঢ়ৰৱয়])o', '[^a`]', '$1ো' ],
+ [ '([ক-হড়ঢ়ৰৱয়])e', '[^a`]', '$1ে' ],
+ [ '([ক-হড়ঢ়ৰৱয়])োi', '[^a`]', '$1ৈ' ],
+ [ '([ক-হড়ঢ়ৰৱয়])োu', '[^a`]', '$1ৌ' ],
+ [ '([কঙলষস])(k|K)', '[^a`]', '$1্ক' ],
+ [ '([গঙদল])(g)', '[^a`]', '$1্গ' ],
+ [ '([চশ])c', '[^a`]', '$1্চ' ],
+ [ '([জঞব])j', '[^a`]', '$1্জ' ],
+ [ 'নj', '[^a`]', 'ঞ্জ' ],
+ [ '([কটণনপলষস])T', '[^a`]', '$1্ট' ],
+ [ '([ডণনল])D', '[^a`]', '$1্ড' ],
+ [ '([গষহ])N', '[^a`]', '$1্ণ' ],
+ [ '([কতনপশসহ])t', '[^a`]', '$1্ত' ],
+ [ '([গদনব])d', '[^a`]', '$1্দ' ],
+ [ '([গঘণতধনপমশসহ])n', '[^a`]', '$1্ন' ],
+ [ '([পমলষস])p', '[^a`]', '$1্প' ],
+ [ '([মস])f', '[^a`]', '$1্ফ' ],
+ [ '([বমল])b', '[^a`]', '$1্ব' ],
+ [ '([কগঙটণতদধনমলশষসহ])m', '[^a`]', '$1্ম' ],
+ [ '([ক-ঘচ-ঝট-যলশ-হড়ঢ়য়])r', '[^a`]', '$1্ৰ' ],
+ [ '([কগপ-বমলশসহ])l', '[^a`]', '$1্ল' ],
+ [ '([কনপ])s', '[^a`]', '$1্স' ],
+ [ '([ক-হড়ঢ়য়])(w|b|v)', '[^a`]', '$1্ব' ],
+ [ '([ক-হড়ঢ়য়])y', '[^a`]', '$1্য' ],
+ [ 'নc', '[^a`]', 'ঞ্চ' ],
+ [ 'ৰk', 'r', 'ৰ্ক' ],
+ [ 'ৰg', 'r', 'ৰ্গ' ],
+ [ 'ৰc', 'r', 'ৰ্চ' ],
+ [ 'ৰj', 'r', 'ৰ্জ' ],
+ [ 'ৰT', 'r', 'ৰ্ট' ],
+ [ 'ৰD', 'r', 'ৰ্ড' ],
+ [ 'ৰN', 'r', 'ৰ্ণ' ],
+ [ 'ৰt', 'r', 'ৰ্ত' ],
+ [ 'ৰd', 'r', 'ৰ্দ' ],
+ [ 'ৰn', 'r', 'ৰ্ন' ],
+ [ 'ৰp', 'r', 'ৰ্প' ],
+ [ 'ৰf', 'r', 'ৰ্ফ' ],
+ [ 'ৰb', 'r', 'ৰ্ব' ],
+ [ 'ৰv', 'r', 'ৰ্ভ' ],
+ [ 'ৰm', 'r', 'ৰ্ম' ],
+ [ 'ৰz', 'r', 'ৰ্য' ],
+ [ 'ৰl', 'r', 'ৰ্ল' ],
+ [ 'ৰx', 'r', 'ৰ্শ' ],
+ [ 'ৰS', 'r', 'ৰ্ষ' ],
+ [ 'ৰs', 'r', 'ৰ্স' ],
+ [ 'ৰh', 'r', 'ৰ্হ' ],
+ [ 'ৰR', 'r', 'ৰ্ড়' ],
+ [ 'ৰy', 'r', 'ৰ্য়' ],
+ [ 'ত~', 't', 'ৎ' ],
+ [ 'অa', 'a', 'আ' ],
+ [ 'কh', 'k', 'খ' ],
+ [ 'গh', 'g', 'ঘ' ],
+ [ 'ণg', 'N', 'ঙ' ],
+ [ 'চh', 'c', 'ছ' ],
+ [ 'জh', 'j', 'ঝ' ],
+ [ 'নG', 'n', 'ঞ' ],
+ [ 'টh', 'T', 'ঠ' ],
+ [ 'ডh', 'D', 'ঢ' ],
+ [ 'তh', 't', 'থ' ],
+ [ 'দh', 'd', 'ধ' ],
+ [ 'পh', 'p', 'ফ' ],
+ [ 'বh', 'b', 'ভ' ],
+ [ 'সh', 's', 'শ' ],
+ [ 'ড়h', 'R', 'ঢ়' ],
+ [ 'নg', 'n', 'ং' ],
+ [ 'ওi', 'o', 'ঐ' ],
+ [ 'ওu', 'o', 'ঔ' ],
+ [ 'ইi', 'i', 'ঈ' ],
+ [ 'উu', 'u', 'ঊ' ],
+ [ '([kK])', 'ক' ],
+ [ 'g', 'গ' ],
+ [ 'G', 'জ্ঞ' ],
+ [ '(c|C)', 'চ' ],
+ [ '(j|J)', 'জ' ],
+ [ 'T', 'ট' ],
+ [ 'D', 'ড' ],
+ [ 'N', 'ণ' ],
+ [ 't', 'ত' ],
+ [ 'd', 'দ' ],
+ [ 'n', 'ন' ],
+ [ '(p|P)', 'প' ],
+ [ 'f', 'ফ' ],
+ [ '(b|B)', 'ব' ],
+ [ '(v|V)', 'ৱ' ],
+ [ '(m|M)', 'ম' ],
+ [ 'z|Z', 'য' ],
+ [ 'r', 'ৰ' ],
+ [ '(l|L)', 'ল' ],
+ [ 'S', 'ষ' ],
+ [ 's', 'স' ],
+ [ 'h', 'হ' ],
+ [ 'H', 'ঃ' ],
+ [ 'R', 'ড়' ],
+ [ '(w|W)', 'ৱ' ],
+ [ 'x', 'শ' ],
+ [ 'X', 'ক্ষ' ],
+ [ 'y', 'য়' ],
+ [ 'a', 'অ' ],
+ [ 'i', 'ই' ],
+ [ 'u', 'উ' ],
+ [ 'e', 'এ' ],
+ [ 'o', 'ও' ],
+ [ '0', '০' ],
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '3', '৩' ],
+ [ '4', '৪' ],
+ [ '5', '৫' ],
+ [ '6', '৬' ],
+ [ '7', '৭' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+ [ '<', 'ৃ' ],
+ [ '`', '্‌' ],
+ [ '\\^', 'ঁ' ],
+ [ '\\.', '।' ],
+ [ '~', '্' ],
+ [ '&', '°' ],
+ [ '\\*', '৺' ]
+ ]
+ };
+
+ $.ime.register( asRodali );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-transliteration.js
new file mode 100644
index 00000000..93221dc7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/as/as-transliteration.js
@@ -0,0 +1,114 @@
+( function ( $ ) {
+ 'use strict';
+
+ var asTransliteration = {
+ id: 'as-transliteration',
+ name: 'প্ৰতিৰূপান্তৰণ',
+ description: 'Assamese Transliteration input method',
+ date: '2012-10-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 8,
+ maxKeyLength: 0,
+ patterns: [
+ [ '([ক-হড়-য়ৰৱ])(্ড়্ড়্i|্q)', '$1ৃ' ], // <consonant>RRi or <consonant>q
+
+ [ '(ড়্ড়্i|q)', 'ঋ' ], // RRi or q
+
+ [ '([ক-হড়-য়ৰৱ])্o', '$1' ], // <consonant>o
+ [ '([ক-হড়-য়ৰৱ])্a', '$1া' ], // <consonant>a
+ [ '([ক-হড়-য়ৰৱ])্i', '$1ি' ], // <consonant>i
+ [ '([ক-হড়-য়ৰৱ])(িi|্I)', '$1ী' ], // <consonant>ii or <consonant>I
+ [ '([ক-হড়-য়ৰৱ])্u', '$1ু' ], // <consonant>u
+ [ '([ক-হড়-য়ৰৱ])(ুu|্U)', '$1ূ' ], // <consonant>uu or <consonant>U
+
+ [ '([ক-হড়-য়ৰৱ])্e', '$1ে' ], // <consonant>e
+ [ '([ক-হড়-য়ৰৱ])i', '$1ৈ' ], // <consonant>oi
+ [ '([ক-হড়-য়ৰৱ])্O', '$1ো' ], // <consonant>O
+ [ '([ক-হড়-য়ৰৱ])u', '$1ৌ' ], // <consonant>ou
+
+ [ '(খ্y|c)', 'ক্ষ্' ], // khy or c
+
+ [ 'ইi', 'ঈ' ], // ii
+ [ 'উu', 'ঊ' ], // uu
+ [ 'অi', 'ঐ' ], // oi
+ [ 'অu', 'ঔ' ], // ou
+ [ 'ত্~', 'ৎ' ], // t~
+
+ [ 'ক্h', 'খ্' ], // kh
+ [ 'গ্h', 'ঘ্' ], // gh
+ [ 'ন্g', 'ঙ্' ], // ng
+ [ 'জ্h', 'ঝ্' ], // jh
+ [ '(ন্~|Y)', 'ঞ্' ], // n~ or Y
+ [ 'ট্h', 'ঠ্' ], // Th
+ [ 'ড্h', 'ঢ্' ], // Dh
+ [ 'ত্h', 'থ্' ], // th
+ [ 'দ্h', 'ধ্' ], // dh
+ [ '(প্h|f)', 'ফ্' ], // ph or f
+ [ '(ব্h|v)', 'ভ্' ], // bh or v
+ [ 'শ্h', 'ষ্' ], // Xh
+ [ 'ড়্h', 'ঢ়্' ], // Rh
+
+ [ '(M|ন্G)', 'ং' ], // M or nG
+
+ [ 'o', 'অ' ],
+ [ 'a', 'আ' ],
+ [ 'i', 'ই' ],
+ [ 'I', 'ঈ' ],
+ [ 'u', 'উ' ],
+ [ 'U', 'ঊ' ],
+ [ 'e', 'এ' ],
+ [ 'O', 'ও' ],
+
+ [ 'H', 'ঃ' ],
+ [ '\\^', 'ঁ' ],
+ [ 'ণ্~', 'ঁ' ], // N~
+ [ 'C', '৺' ],
+
+ [ 'k', 'ক্' ],
+ [ 'g', 'গ্' ],
+ [ 's', 'চ্' ],
+ [ 'S', 'ছ্' ],
+ [ 'j', 'জ্' ],
+ [ 'T', 'ট্' ],
+ [ 'D', 'ড্' ],
+ [ 'N', 'ণ্' ],
+ [ 't', 'ত্' ],
+ [ 'd', 'দ্' ],
+ [ 'n', 'ন্' ],
+ [ 'p', 'প্' ],
+ [ 'b', 'ব্' ],
+ [ 'm', 'ম্' ],
+ [ 'z', 'য্' ],
+ [ 'r', 'ৰ্' ],
+ [ 'l', 'ল্' ],
+ [ 'w', 'ৱ্' ],
+ [ 'X', 'শ্' ],
+ [ 'x', 'স্' ],
+ [ 'h', 'হ্' ],
+ [ 'R', 'ড়্' ],
+ [ 'y', 'য়্' ],
+
+ [ '\\\\\\.', '.' ],
+ [ '।\\.', '॥' ],
+ [ '\\.', '।' ],
+
+ [ '0', '০' ],
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '3', '৩' ],
+ [ '4', '৪' ],
+ [ '5', '৫' ],
+ [ '6', '৬' ],
+ [ '7', '৭' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+
+ [ '(\u200C)*_', '\u200C' ],
+ [ '(\u200D)*`', '\u200D' ] ]
+ };
+
+ $.ime.register( asTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/azb/azb-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/azb/azb-kbd.js
new file mode 100644
index 00000000..8f776685
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/azb/azb-kbd.js
@@ -0,0 +1,108 @@
+( function ( $ ) {
+ 'use strict';
+
+ var azbKbd = {
+ id: 'azb-kbd',
+ name: 'تۆرکجه',
+ description: 'South Azerbaijani Keyboard Layout',
+ date: '2015-05-02',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Mjbmr',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', '\u200d' ],
+ [ '1', '۱' ],
+ [ '2', '۲' ],
+ [ '3', '۳' ],
+ [ '4', '۴' ],
+ [ '5', '۵' ],
+ [ '6', '۶' ],
+ [ '7', '۷' ],
+ [ '8', '۸' ],
+ [ '9', '۹' ],
+ [ '0', '۰' ],
+
+ [ 'q', 'ض' ],
+ [ 'w', 'ص' ],
+ [ 'e', 'ث' ],
+ [ 'r', 'ق' ],
+ [ 't', 'ف' ],
+ [ 'y', 'غ' ],
+ [ 'u', 'ع' ],
+ [ 'i', 'ه' ],
+ [ 'o', 'خ' ],
+ [ 'p', 'ح' ],
+ [ '\\[', 'ج' ],
+ [ '\\]', 'چ' ],
+
+ [ 'a', 'ش' ],
+ [ 's', 'س' ],
+ [ 'd', 'ی' ],
+ [ 'f', 'ب' ],
+ [ 'g', 'ل' ],
+ [ 'h', 'ا' ],
+ [ 'j', 'ت' ],
+ [ 'k', 'ن' ],
+ [ 'l', 'م' ],
+ [ ';', 'ک' ],
+ [ '\'', 'گ' ],
+
+ [ 'z', 'ظ' ],
+ [ 'x', 'ط' ],
+ [ 'c', 'ز' ],
+ [ 'v', 'ر' ],
+ [ 'b', 'ذ' ],
+ [ 'n', 'د' ],
+ [ 'm', 'پ' ],
+ [ ',', 'و' ],
+
+ [ '~', '\u200c' ],
+ [ '@', '٬' ],
+ [ '#', '٫' ],
+ [ '%', '٪' ],
+ [ '\\^', '×' ],
+ [ '&', '،' ],
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+ [ '_', 'ـ' ],
+
+ [ 'Q', 'ۇ' ],
+ [ 'W', 'ۆ' ],
+ [ 'E', 'وْ' ],
+ [ 'R', 'ً' ],
+ [ 'T', 'ُ' ],
+ [ 'Y', 'ِ' ],
+ [ 'U', 'َ' ],
+ [ 'I', 'ّ' ],
+ [ 'O', ']' ],
+ [ 'P', '[' ],
+ [ '\\{', '}' ],
+ [ '\\}', '{' ],
+
+ [ 'A', 'ؤ' ],
+ [ 'S', 'ئ' ],
+ [ 'D', 'ؽ' ],
+ [ 'F', 'إ' ],
+ [ 'G', 'أ' ],
+ [ 'H', 'آ' ],
+ [ 'J', 'ة' ],
+ [ 'K', '»' ],
+ [ 'L', '«' ],
+ [ '"', '؛' ],
+
+ [ 'Z', 'ك' ],
+ [ 'X', 'ط' ],
+ [ 'C', 'ژ' ],
+ [ 'V', 'ٰ' ],
+ [ 'B', 'ڭ' ],
+ [ 'N', 'ٔ' ],
+ [ 'M', 'ء' ],
+ [ '<', '>' ],
+ [ '>', '<' ],
+ [ '\\?', '؟' ]
+ ]
+ };
+
+ $.ime.register( azbKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bas/bas-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bas/bas-tilde.js
new file mode 100644
index 00000000..cb5cfc0b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bas/bas-tilde.js
@@ -0,0 +1,31 @@
+( function ( $ ) {
+ 'use strict';
+
+ var basTilde = {
+ id: 'bas-tilde',
+ name: 'bas-tilde',
+ description: 'Basaa tilde keyboard',
+ date: '2021-03-31',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~B', 'Ɓ' ],
+ [ '~b', 'ɓ' ],
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~-', '\u0304' ], // Combining macron
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( basTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bbc/batak-qwerty.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bbc/batak-qwerty.js
new file mode 100644
index 00000000..0ae5cffa
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bbc/batak-qwerty.js
@@ -0,0 +1,89 @@
+( function ( $ ) {
+ 'use strict';
+
+ var batakQwertyKbd = {
+ id: 'batak-qwerty',
+ name: 'Batak QWERTY',
+ description: 'QWERTY-based Batak keyboard',
+ date: '2014-04-20',
+ URL: 'http://evertype.com/fonts/batak/',
+ author: 'design by Michael Everson, implementation by Amir E. Aharoni',
+ version: '1.0',
+ patterns: [
+ [ 'q', 'ᯥ' ],
+ [ 'w', 'ᯋ' ],
+ [ 'e', 'ᯧ' ],
+ [ 'r', 'ᯒ' ],
+ [ 't', 'ᯖ' ],
+ [ 'y', 'ᯛ' ],
+ [ 'u', 'ᯮ' ],
+ [ 'i', 'ᯪ' ],
+ [ 'o', 'ᯬ' ],
+ [ 'p', 'ᯇ' ],
+
+ [ 'a', 'ᯀ' ],
+ [ 's', 'ᯘ' ],
+ [ 'd', 'ᯑ' ],
+ [ 'f', '᯲' ],
+ [ 'g', 'ᯎ' ],
+ [ 'h', 'ᯂ' ],
+ [ 'j', 'ᯐ' ],
+ [ 'k', 'ᯤ' ],
+ [ 'l', 'ᯞ' ],
+
+ [ 'z', 'ᯝ' ],
+ [ 'x', 'ᯢ' ],
+ [ 'c', 'ᯡ' ],
+ [ 'v', 'ᯣ' ],
+ [ 'b', 'ᯅ' ],
+ [ 'n', 'ᯉ' ],
+ [ 'm', 'ᯔ' ],
+
+ [ 'Q', 'ᯍ' ],
+ [ 'W', 'ᯌ' ],
+ [ 'E', 'ᯨ' ],
+ [ 'R', 'ᯓ' ],
+ [ 'T', 'ᯗ' ],
+ [ 'Y', 'ᯜ' ],
+ [ 'U', 'ᯯ' ],
+ [ 'I', 'ᯫ' ],
+ [ 'O', 'ᯭ' ],
+ [ 'P', 'ᯈ' ],
+
+ [ 'A', 'ᯁ' ],
+ [ 'S', 'ᯙ' ],
+
+ [ 'F', '᯳' ],
+ [ 'G', 'ᯏ' ],
+ [ 'H', 'ᯃ' ],
+ [ 'J', 'ᯄ' ],
+
+ [ 'L', 'ᯟ' ],
+
+ [ 'Z', 'ᯚ' ],
+
+ [ 'B', 'ᯆ' ],
+ [ 'N', 'ᯊ' ],
+ [ 'M', 'ᯕ' ],
+
+ [ '`', 'ᯠ' ],
+ [ '=', 'ᯱ' ],
+ [ '\\+', '᯦' ],
+ [ '-', '' ],
+ [ '_', 'ᯩ' ],
+
+ [ 'B', 'ᯆ' ]
+ ],
+ patterns_x: [
+ [ '4', '᯼' ],
+ [ '5', '᯽' ],
+ [ '6', '᯾' ],
+ [ '7', '᯿' ],
+
+ [ 'w', 'ᯍ' ],
+ [ '`', '`' ]
+ ]
+ };
+
+ $.ime.register( batakQwertyKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bci/bci-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bci/bci-tilde.js
new file mode 100644
index 00000000..271e00ff
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bci/bci-tilde.js
@@ -0,0 +1,28 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bciTilde = {
+ id: 'bci-tilde',
+ name: 'bci-tilde',
+ description: 'Baoulé tilde keyboard',
+ date: '2020-06-06',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~N', 'Ɲ' ],
+ [ '~n', 'ɲ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~\\^', '\u0302' ], // Combining caron
+ [ '~\\{', '\u0303' ] // Combining tilde
+ ]
+ };
+
+ $.ime.register( bciTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/be/be-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/be/be-kbd.js
new file mode 100644
index 00000000..c79341fd
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/be/be-kbd.js
@@ -0,0 +1,101 @@
+( function ( $ ) {
+ 'use strict';
+
+ var beKbd = {
+ id: 'be-kbd',
+ name: 'Belarusian kbd',
+ description: 'Belarusian keyboard layout',
+ date: '2013-02-09',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\`', 'ё' ],
+ [ 'q', 'й' ],
+ [ 'w', 'ц' ],
+ [ 'e', 'у' ],
+ [ 'r', 'к' ],
+ [ 't', 'е' ],
+ [ 'y', 'н' ],
+ [ 'u', 'г' ],
+ [ 'i', 'ш' ],
+ [ 'o', 'ў' ],
+ [ 'p', 'з' ],
+ [ '\\[', 'х' ],
+ [ '\\]', '\'' ],
+ [ 'a', 'ф' ],
+ [ 's', 'ы' ],
+ [ 'd', 'в' ],
+ [ 'f', 'а' ],
+ [ 'g', 'п' ],
+ [ 'h', 'р' ],
+ [ 'j', 'о' ],
+ [ 'k', 'л' ],
+ [ 'l', 'д' ],
+ [ ';', 'ж' ],
+ [ '\'', 'э' ],
+ [ '\\\\', '\\' ],
+ [ 'z', 'я' ],
+ [ 'x', 'ч' ],
+ [ 'c', 'с' ],
+ [ 'v', 'м' ],
+ [ 'b', 'і' ],
+ [ 'n', 'т' ],
+ [ 'm', 'ь' ],
+ [ ',', 'б' ],
+ [ '\\.', 'ю' ],
+ [ '/', '.' ],
+ [ '\\!', '!' ],
+ [ '\\@', '"' ],
+ [ '\\#', '№' ],
+ [ '\\$', ';' ],
+ [ '\\%', '%' ],
+ [ '\\^', ':' ],
+ [ '\\&', '?' ],
+ [ '\\*', '*' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '\\_', '_' ],
+ [ '\\+', '+' ],
+ [ '\\~', 'Ё' ],
+ [ 'Q', 'Й' ],
+ [ 'W', 'Ц' ],
+ [ 'E', 'У' ],
+ [ 'R', 'К' ],
+ [ 'T', 'Е' ],
+ [ 'Y', 'Н' ],
+ [ 'U', 'Г' ],
+ [ 'I', 'Ш' ],
+ [ 'O', 'Ў' ],
+ [ 'P', 'З' ],
+ [ '\\{', 'Х' ],
+ [ '\\}', '\'' ],
+ [ 'A', 'Ф' ],
+ [ 'S', 'Ы' ],
+ [ 'D', 'В' ],
+ [ 'F', 'А' ],
+ [ 'G', 'П' ],
+ [ 'H', 'Р' ],
+ [ 'J', 'О' ],
+ [ 'K', 'Л' ],
+ [ 'L', 'Д' ],
+ [ ':', 'Ж' ],
+ [ '"', 'Э' ],
+ [ '\\|', '|' ],
+ [ 'Z', 'Я' ],
+ [ 'X', 'Ч' ],
+ [ 'C', 'С' ],
+ [ 'V', 'М' ],
+ [ 'B', 'І' ],
+ [ 'N', 'Т' ],
+ [ 'M', 'Ь' ],
+ [ '\\<', 'Б' ],
+ [ '\\>', 'Ю' ],
+ [ '\\?', ',' ]
+ ]
+
+ };
+ $.ime.register( beKbd );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/be/be-latin.js b/UniversalLanguageSelector/lib/jquery.ime/rules/be/be-latin.js
new file mode 100644
index 00000000..ca6c9954
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/be/be-latin.js
@@ -0,0 +1,38 @@
+( function ( $ ) {
+ 'use strict';
+
+ var beLatin = {
+ id: 'be-latin',
+ name: 'Belarusian Łacinka',
+ description: 'Belarusian Latin alphabet input method',
+ date: '2012-11-06',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Pavel Selitskas',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 1,
+ patterns: [
+ [ '=S', 'Š' ],
+ [ '=U', 'Ŭ' ],
+ [ '-S', 'Ś' ],
+ [ '-L', 'Ł' ],
+ [ '-Z', 'Ź' ],
+ [ '=Z', 'Ž' ],
+ [ '-C', 'Ć' ],
+ [ '=C', 'Č' ],
+ [ '-N', 'Ń' ],
+ [ '=s', 'š' ],
+ [ '=u', 'ŭ' ],
+ [ '-s', 'ś' ],
+ [ '-l', 'ł' ],
+ [ '-z', 'ź' ],
+ [ '=z', 'ž' ],
+ [ '-c', 'ć' ],
+ [ '=c', 'č' ],
+ [ '-n', 'ń' ]
+ ]
+ };
+
+ $.ime.register( beLatin );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/be/be-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/be/be-transliteration.js
new file mode 100644
index 00000000..046b4c2d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/be/be-transliteration.js
@@ -0,0 +1,94 @@
+( function ( $ ) {
+ 'use strict';
+
+ var beTransliteration = {
+ id: 'be-transliteration',
+ name: 'Belarusian Transliteration',
+ description: 'Belarusian transliteration per Belarusian winkeys',
+ date: '2012-11-06',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Pavel Selitskas',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~', 'Ё' ],
+ [ 'Q', 'Й' ],
+ [ 'W', 'Ц' ],
+ [ 'E', 'У' ],
+ [ 'R', 'К' ],
+ [ 'T', 'Е' ],
+ [ 'Y', 'Н' ],
+ [ 'U', 'Г' ],
+ [ 'I', 'Ш' ],
+ [ 'O', 'Ў' ],
+ [ 'P', 'З' ],
+ [ '\\{', 'Х' ],
+ [ '\\}', '\'' ],
+ [ 'A', 'Ф' ],
+ [ 'S', 'Ы' ],
+ [ 'D', 'В' ],
+ [ 'F', 'А' ],
+ [ 'G', 'П' ],
+ [ 'H', 'Р' ],
+ [ 'J', 'О' ],
+ [ 'K', 'Л' ],
+ [ 'L', 'Д' ],
+ [ ':', 'Ж' ],
+ [ '"', 'Э' ],
+ [ 'Z', 'Я' ],
+ [ 'X', 'Ч' ],
+ [ 'C', 'С' ],
+ [ 'V', 'М' ],
+ [ 'B', 'І' ],
+ [ 'N', 'Т' ],
+ [ 'M', 'Ь' ],
+ [ '<', 'Б' ],
+ [ '>', 'Ю' ],
+ [ '\\?', ',' ],
+
+ [ '`', 'ё' ],
+ [ 'q', 'й' ],
+ [ 'w', 'ц' ],
+ [ 'e', 'у' ],
+ [ 'r', 'к' ],
+ [ 't', 'е' ],
+ [ 'y', 'н' ],
+ [ 'u', 'г' ],
+ [ 'i', 'ш' ],
+ [ 'o', 'ў' ],
+ [ 'p', 'з' ],
+ [ '\\[', 'х' ],
+ [ '\\]', '\'' ],
+ [ 'a', 'ф' ],
+ [ 's', 'ы' ],
+ [ 'd', 'в' ],
+ [ 'f', 'а' ],
+ [ 'g', 'п' ],
+ [ 'h', 'р' ],
+ [ 'j', 'о' ],
+ [ 'k', 'л' ],
+ [ 'l', 'д' ],
+ [ ';', 'ж' ],
+ [ '\'', 'э' ],
+ [ 'z', 'я' ],
+ [ 'x', 'ч' ],
+ [ 'c', 'с' ],
+ [ 'v', 'м' ],
+ [ 'b', 'і' ],
+ [ 'n', 'т' ],
+ [ 'm', 'ь' ],
+ [ ',', 'б' ],
+ [ '\\.', 'ю' ],
+ [ '/', '.' ],
+
+ [ '@', '"' ], // 2
+ [ '#', '№' ], // 3
+ [ '\\$', ';' ], // 4
+ // '%' is the same // 5
+ [ '^', ':' ], // 6
+ [ '&', '?' ] ] // 7
+ // '*', '(' and ')' are the same // 8, 9, 0
+ };
+
+ $.ime.register( beTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ber/ber-tfng.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ber/ber-tfng.js
new file mode 100644
index 00000000..470b6965
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ber/ber-tfng.js
@@ -0,0 +1,54 @@
+( function ( $ ) {
+ 'use strict';
+
+ var berTfng = {
+ id: 'ber-tfng',
+ name: 'Tifinagh Transliteration',
+ description: 'Transliteration input method for Tifinagh script',
+ date: '2012-10-10',
+ URL: 'http://www.ircam.ma/fr/index.php?soc=telec&rd=2',
+ author: '',
+ license: '',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 0,
+ patterns: [
+ [ 'a', 'ⴰ' ],
+ [ 'b', 'ⴱ' ],
+ [ 'c', 'ⵛ' ],
+ [ 'd', 'ⴷ' ],
+ [ 'D', 'ⴹ' ],
+ [ 'e', 'ⴻ' ],
+ [ 'f', 'ⴼ' ],
+ [ 'F', 'ⴼⵯ' ],
+ [ 'g', 'ⴳ' ],
+ [ 'G', 'ⴳⵯ' ],
+ [ 'h', 'ⵀ' ],
+ [ 'i', 'ⵉ' ],
+ [ 'j', 'ⵊ' ],
+ [ 'k', 'ⴽ' ],
+ [ 'K', 'ⴽⵯ' ],
+ [ 'l', 'ⵍ' ],
+ [ 'm', 'ⵎ' ],
+ [ 'n', 'ⵏ' ],
+ [ 'o', 'ⵄ' ],
+ [ 'p', 'ⵃ' ],
+ [ 'q', 'ⵇ' ],
+ [ 'Q', 'ⵈ' ],
+ [ 'r', 'ⵔ' ],
+ [ 'R', 'ⵕ' ],
+ [ 's', 'ⵙ' ],
+ [ 'S', 'ⵚ' ],
+ [ 't', 'ⵜ' ],
+ [ 'T', 'ⵟ' ],
+ [ 'v', 'ⵖ' ],
+ [ 'u', 'ⵓ' ],
+ [ 'w', 'ⵡ' ],
+ [ 'y', 'ⵢ' ],
+ [ 'x', 'ⵅ' ],
+ [ 'z', 'ⵣ' ],
+ [ 'Z', 'ⵥ' ] ]
+ };
+ $.ime.register( berTfng );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bgn/bgn-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bgn/bgn-kbd.js
new file mode 100644
index 00000000..1d1b322f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bgn/bgn-kbd.js
@@ -0,0 +1,108 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bgnKbd = {
+ id: 'bgn-kbd',
+ name: 'روچ کپتین بلوچی',
+ description: 'Western Baluchi Keyboard Layout',
+ date: '2015-03-11',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Mjbmr',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', '\u200c' ],
+ [ '1', '۱' ],
+ [ '2', '۲' ],
+ [ '3', '۳' ],
+ [ '4', '۴' ],
+ [ '5', '۵' ],
+ [ '6', '۶' ],
+ [ '7', '۷' ],
+ [ '8', '۸' ],
+ [ '9', '۹' ],
+ [ '0', '۰' ],
+
+ [ 'q', 'ض' ],
+ [ 'w', 'ص' ],
+ [ 'e', 'ث' ],
+ [ 'r', 'ق' ],
+ [ 't', 'ف' ],
+ [ 'y', 'غ' ],
+ [ 'u', 'ع' ],
+ [ 'i', 'ه' ],
+ [ 'o', 'خ' ],
+ [ 'p', 'ح' ],
+ [ '\\[', 'ج' ],
+ [ '\\]', 'چ' ],
+
+ [ 'a', 'ش' ],
+ [ 's', 'س' ],
+ [ 'd', 'ی' ],
+ [ 'f', 'ب' ],
+ [ 'g', 'ل' ],
+ [ 'h', 'ا' ],
+ [ 'j', 'ت' ],
+ [ 'k', 'ن' ],
+ [ 'l', 'م' ],
+ [ ';', 'ک' ],
+ [ '\'', 'گ' ],
+
+ [ 'z', 'ظ' ],
+ [ 'x', 'ط' ],
+ [ 'c', 'ز' ],
+ [ 'v', 'ر' ],
+ [ 'b', 'ڈ' ],
+ [ 'n', 'د' ],
+ [ 'm', 'پ' ],
+ [ ',', 'و' ],
+
+ [ '~', '÷' ],
+ [ '@', '٬' ],
+ [ '#', '٫' ],
+ [ '%', '٪' ],
+ [ '\\^', '×' ],
+ [ '&', '،' ],
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+ [ '_', 'ـ' ],
+
+ [ 'Q', 'ْ' ],
+ [ 'W', 'ٌ' ],
+ [ 'E', 'ٍ' ],
+ [ 'R', 'ً' ],
+ [ 'T', 'ُ' ],
+ [ 'Y', 'ِ' ],
+ [ 'U', 'َ' ],
+ [ 'I', 'ّ' ],
+ [ 'O', ']' ],
+ [ 'P', '[' ],
+ [ '\\{', '}' ],
+ [ '\\}', '{' ],
+
+ [ 'A', 'ؤ' ],
+ [ 'S', 'ئ' ],
+ [ 'D', 'ي' ],
+ [ 'F', 'إ' ],
+ [ 'G', 'أ' ],
+ [ 'H', 'آ' ],
+ [ 'J', 'ٹ' ],
+ [ 'K', '»' ],
+ [ 'L', '«' ],
+ [ '"', '؛' ],
+
+ [ 'Z', 'ێ' ],
+ [ 'X', 'ط' ],
+ [ 'C', 'ژ' ],
+ [ 'V', 'ڑ' ],
+ [ 'B', 'ۆ' ],
+ [ 'N', 'ٔ' ],
+ [ 'M', 'ء' ],
+ [ '<', '>' ],
+ [ '>', '<' ],
+ [ '\\?', '؟' ]
+ ]
+ };
+
+ $.ime.register( bgnKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bkm/bkm-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bkm/bkm-tilde.js
new file mode 100644
index 00000000..920c59f2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bkm/bkm-tilde.js
@@ -0,0 +1,41 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bkmTilde = {
+ id: 'bkm-tilde',
+ name: 'bkm-tilde',
+ description: 'Kom tilde keyboard',
+ date: '2021-03-31',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ 'AE', 'Æ' ],
+ [ 'Ae', 'Æ' ],
+ [ 'ae', 'æ' ],
+ [ 'A~E', 'AE' ],
+ [ 'A~e', 'Ae' ],
+ [ 'a~e', 'ae' ],
+ [ '~A', 'Æ' ],
+ [ '~a', 'æ' ],
+ [ '~I', 'Ɨ' ],
+ [ '~i', 'ɨ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ 'OE', 'Œ' ],
+ [ 'Oe', 'Œ' ],
+ [ 'oe', 'œ' ],
+ [ 'O~E', 'OE' ],
+ [ 'O~e', 'Oe' ],
+ [ 'o~e', 'oe' ],
+ [ '~O', 'Œ' ],
+ [ '~o', 'œ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~\\^', '\u0302' ] // Combining circumflex accent
+ ]
+ };
+
+ $.ime.register( bkmTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bm/bm-alt.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bm/bm-alt.js
new file mode 100644
index 00000000..791467b9
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bm/bm-alt.js
@@ -0,0 +1,32 @@
+( function ( $ ) {
+ 'use strict';
+
+ var defs = {
+ id: 'bm-alt',
+ name: 'Bamanankan Alt',
+ description: 'Bambara input method with Alt-H/B/E/J/N/O combinations',
+ date: '2017-05-29',
+ URL: 'http://www.mali-pense.net/Ressources-pour-la-pratique-du.html',
+ author: 'Amir E. Aharoni, based on mali-pense.net',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 1,
+ patterns_x: [
+ [ 'H', '̂' ], // Combining circumflex
+ [ 'h', '́' ], // Combining acute accent
+ [ 'B', '̌' ], // Combining caron
+ [ 'b', '̀' ], // Combining grave accent
+ [ 'E', 'Ɛ' ],
+ [ 'e', 'ɛ' ],
+ [ 'J', 'Ɲ' ],
+ [ 'j', 'ɲ' ],
+ [ 'N', 'Ŋ' ],
+ [ 'n', 'ŋ' ],
+ [ 'O', 'Ɔ' ],
+ [ 'o', 'ɔ' ]
+ ]
+ };
+
+ $.ime.register( defs );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bm/bm-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bm/bm-tilde.js
new file mode 100644
index 00000000..a3af6b2e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bm/bm-tilde.js
@@ -0,0 +1,31 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bmTilde = {
+ id: 'bm-tilde',
+ name: 'Bamanankan tilde',
+ description: 'Bamanankan tilde',
+ date: '2019-05-06',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 1,
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~N', 'Ɲ' ],
+ [ '~n', 'ɲ' ],
+ [ '~G', 'Ŋ' ],
+ [ '~g', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( bmTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-avro.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-avro.js
new file mode 100644
index 00000000..23772ee8
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-avro.js
@@ -0,0 +1,194 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bnAvro = {
+ id: 'bn-avro',
+ name: 'অভ্র',
+ description: 'Bengali Avro input method',
+ date: '2012-10-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 4,
+ maxKeyLength: 5,
+ patterns: [
+ [ '([ক-হড়ঢ়য়])্?ররi', '[^o`]', '$1ৃ' ],
+ [ 'ররi', '[^o`]', 'ঋ' ],
+ [ 'ঙহo', 'ঙ্ঘ' ],
+ [ '([ক-হড়ঢ়য়])াZ', '[^o`]', '$1্যা' ],
+ [ '(([ক-হড়ঢ়য়])|য়)o', '[^o`]', '$1' ], // য় cannot be included in the range, why? everywhere else it is OK!
+ [ '([ক-হড়ঢ়য়])a', '[^o`]', '$1া' ],
+ [ '([ক-হড়ঢ়য়])i', '[^o`]', '$1ি' ],
+ [ '([ক-হড়ঢ়য়])(I|েe)', '[^o`]', '$1ী' ],
+ [ '([ক-হড়ঢ়য়])u', '[^o`]', '$1ু' ],
+ [ '([ক-হড়ঢ়য়])U', '[^o`]', '$1ূ' ],
+ [ '([ক-হড়ঢ়য়])o', '[o`]', '$1ু' ],
+ [ '([ক-হড়ঢ়য়])e', '[^o`]', '$1ে' ],
+ [ '([ক-হড়ঢ়য়])োI', '[^o`]', '$1ৈ' ],
+ [ '([ক-হড়ঢ়য়])O', '[^o`]', '$1ো' ],
+ [ '([ক-হড়ঢ়য়])োU', '[^o`]', '$1ৌ' ],
+
+ [ '([ক-হড়ঢ়য়][িুেো]|[এইওউ])a', '[^o`]', '$1য়া' ],
+ [ '([ক-হড়ঢ়য়][াে]|[আএ])o', '[^o`]', '$1ও' ],
+
+ [ '([কঙলষস])(k|K)', '[^o`]', '$1্ক' ],
+ [ '([ঙদল])(g|G)', '[^o`]', '$1্গ' ],
+ [ 'গg', '[^o`]', 'জ্ঞ' ],
+ [ '([চশ])c', '[^o`]', '$1্চ' ],
+ [ '([জঞব])j', '[^o`]', '$1্জ' ],
+ [ 'নj', '[^o`]', 'ঞ্জ' ],
+ [ '([কটণনপলষস])T', '[^o`]', '$1্ট' ],
+ [ '([ডণনল])D', '[^o`]', '$1্ড' ],
+ [ '([গষহ])N', '[^o`]', '$1্ণ' ],
+ [ '([কতনপশসহ])t', '[^o`]', '$1্ত' ],
+ [ '([দনব])d', '[^o`]', '$1্দ' ],
+ [ '([গঘণতধনপমশসহ])n', '[^o`]', '$1্ন' ],
+ [ '([পমলষস])p', '[^o`]', '$1্প' ],
+ [ '([স])f', '[^o`]', '$1্ফ' ],
+ [ '([বমল])b', '[^o`]', '$1্ব' ],
+ [ '([দম])(v|V)', '[^o`]', '$1্ভ' ],
+ [ '([কগঙটণতদধনমলশষসহ])m', '[^o`]', '$1্ম' ],
+ [ '([ক-ঘচ-ঝট-যলশ-হড়ঢ়য়])r', '[^o`]', '$1্র' ],
+ [ '([কগপ-বমলশসহ])l', '[^o`]', '$1্ল' ],
+ [ '([কনপ])s', '[^o`]', '$1্স' ],
+ [ '([ক-হড়ঢ়য়])w', '[^o`]', '$1্ব' ],
+ [ '([ক-হড়ঢ়য়])y', '[^o`]', '$1্য' ],
+ [ 'নc', '[^o`]', 'ঞ্চ' ],
+
+ [ 'ত`', '`', 'ৎ' ],
+
+ [ 'ক্ক(h|H)', '[^o`]', 'ক্ষ' ],
+ [ 'কশ(h|H)', '[^o`]', 'ক্ষ' ],
+
+ [ 'ররk', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ক' ],
+ [ 'ররg', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্গ' ],
+ [ 'ররc', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্চ' ],
+ [ 'ররj', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্জ' ],
+ [ 'ররT', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ট' ],
+ [ 'ররD', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ড' ],
+ [ 'ররN', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ণ' ],
+ [ 'ররt', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ত' ],
+ [ 'ররd', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্দ' ],
+ [ 'ররn', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ন' ],
+ [ 'ররp', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্প' ],
+ [ 'ররf', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ফ' ],
+ [ 'ররb', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ব' ],
+ [ 'ররv', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ভ' ],
+ [ 'ররm', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ম' ],
+ [ 'ররz', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্য' ],
+ [ 'ররl', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ল' ],
+ [ 'ররS', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্শ' ],
+ [ 'ররs', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্স' ],
+ [ 'ররh', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্হ' ],
+ [ 'ররR', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্ড়' ],
+ [ 'রর(y|Y)', '(o|a|i|I|u|U|e|O|OI|OU|rri)rr', 'র্য়' ],
+
+ [ 'ংo', 'ঙ্গ' ],
+ [ 'ংi', 'ঙ্গি' ],
+ [ 'ংI', 'ঙ্গী' ],
+ [ '(ংu|ঙ্গo)', 'ঙ্গু' ],
+ [ 'ংU', 'ঙ্গূ' ],
+ [ 'ং', 'ঙ্গি' ],
+ [ 'ং', 'ঙ্গি' ],
+
+ [ 'শ(h|H)', 'S', 'ষ' ],
+
+ [ 'অo', '[^`]', 'উ' ],
+ [ 'এe', '[^o`]', 'ঈ' ],
+
+ [ 'ক(h|H)', '[^o`]', 'খ' ],
+ [ 'গ(h|H)', '[^o`]', 'ঘ' ],
+ [ 'ণg', '[^o`]', 'ঙ' ],
+ [ 'চ(h|H)', '[^o`]', 'ছ' ],
+ [ 'জ(h|H)', '[^o`]', 'ঝ' ],
+ [ 'ণG', '[^o`]', 'ঞ' ],
+ [ 'ট(h|H)', '[^o`]', 'ঠ' ],
+ [ 'ড(h|H)', '[^o`]', 'ঢ' ],
+ [ 'ত(h|H)', '[^o`]', 'থ' ],
+ [ 'দ(h|H)', '[^o`]', 'ধ' ],
+ [ 'প(h|H)', '[^o`]', 'ফ' ],
+ [ 'ব(h|H)', '[^o`]', 'ভ' ],
+ [ '(স(h|H))', '[^o`]', 'শ' ],
+ [ 'ড়(h|H)', '[^o`]', 'ঢ়' ],
+ [ 'ত্`', '[^o`]', 'ৎ' ],
+ [ 'নg', '[^o`]', 'ং' ],
+ [ 'ঃ`', '[^o`]', ':' ],
+ [ 'ররi', '[^o`]', 'ঋ' ],
+ [ 'ওI', '[^o`]', 'ঐ' ],
+ [ 'ওU', '[^o`]', 'ঔ' ],
+
+ [ 'আ`', 'া' ],
+ [ 'ই`', 'ি' ],
+ [ 'ঈ`', 'ী' ],
+ [ 'উ`', 'ু' ],
+ [ 'ঊ`', 'ূ' ],
+ [ 'এ`', 'ে' ],
+ [ 'আ`', 'া' ],
+ [ 'আ`', 'া' ],
+ [ 'আ`', 'া' ],
+ [ 'আ`', 'া' ],
+ [ 'আ`', 'া' ],
+ [ 'আ`', 'া' ],
+
+ [ '([kKqQ])', 'ক' ],
+ [ '(g|G)', 'গ' ],
+ [ '(c|C)', 'চ' ],
+ [ '(j|J)', 'জ' ],
+ [ 'T', 'ট' ],
+ [ 'D', 'ড' ],
+ [ 'N', 'ণ' ],
+ [ 't', 'ত' ],
+ [ 'd', 'দ' ],
+ [ 'n', 'ন' ],
+ [ '(p|P)', 'প' ],
+ [ 'f', 'ফ' ],
+ [ '(b|B)', 'ব' ],
+ [ '(v|V)', 'ভ' ],
+ [ '(m|M)', 'ম' ],
+ [ 'z', 'য' ],
+ [ 'r', 'র' ],
+ [ '(l|L)', 'ল' ],
+ [ 'S', 'শ' ],
+ [ 's', 'স' ],
+ [ '(h|H)', 'হ' ],
+ [ 'R', 'ড়' ],
+ [ 'w', 'ও' ],
+ [ 'x', 'ক্স' ],
+ [ '(y|Y)', 'য়' ],
+
+ [ 'Z', '্য' ],
+
+ [ 'o', 'অ' ],
+ [ '(a|A)', 'আ' ],
+ [ 'i', 'ই' ],
+ [ 'I', 'ঈ' ],
+ [ 'u', 'উ' ],
+ [ 'U', 'ঊ' ],
+ [ '(e|E)', 'এ' ],
+ [ 'O', 'ও' ],
+
+ [ '0', '০' ],
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '3', '৩' ],
+ [ '4', '৪' ],
+ [ '5', '৫' ],
+ [ '6', '৬' ],
+ [ '7', '৭' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+
+ [ '\\\\\\.', '.' ],
+
+ [ ',,', '্' ],
+ [ '\\:', 'ঃ' ],
+ [ '\\^', 'ঁ' ],
+ [ '\\.', '।' ],
+ [ '\\$', '৳' ],
+ [ 'ঃ`', ':' ],
+ [ '`', '' ] ]
+ };
+
+ $.ime.register( bnAvro );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-inscript.js
new file mode 100644
index 00000000..f2bcf9c6
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-inscript.js
@@ -0,0 +1,123 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bnInScript = {
+ id: 'bn-inscript',
+ name: 'ইনস্ক্ৰিপ্ট',
+ description: 'Bengali InScript input method',
+ date: '2012-10-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 0,
+ patterns: [
+ [ 'X', 'ঁ' ],
+ [ 'x', 'ং' ],
+ [ '_', 'ঃ' ],
+ [ 'D', 'অ' ],
+ [ 'E', 'আ' ],
+ [ 'F', 'ই' ],
+ [ 'R', 'ঈ' ],
+ [ 'G', 'উ' ],
+ [ 'T', 'ঊ' ],
+ [ '\\+', 'ঋ' ],
+ [ 'S', 'এ' ],
+ [ 'W', 'ঐ' ],
+ [ 'A', 'ও' ],
+ [ 'Q', 'ঔ' ],
+ [ 'k', 'ক' ],
+ [ 'K', 'খ' ],
+ [ 'i', 'গ' ],
+ [ 'I', 'ঘ' ],
+ [ 'U', 'ঙ' ],
+ [ ';', 'চ' ],
+ [ '\\:', 'ছ' ],
+ [ 'p', 'জ' ],
+ [ 'P', 'ঝ' ],
+ [ '\\}', 'ঞ' ],
+ [ '\'', 'ট' ],
+ [ '"', 'ঠ' ],
+ [ '\\[', 'ড' ],
+ [ '\\{', 'ঢ' ],
+ [ 'C', 'ণ' ],
+ [ 'l', 'ত' ],
+ [ 'L', 'থ' ],
+ [ 'o', 'দ' ],
+ [ 'O', 'ধ' ],
+ [ 'v', 'ন' ],
+ [ 'h', 'প' ],
+ [ 'H', 'ফ' ],
+ [ 'y', 'ব' ],
+ [ 'Y', 'ভ' ],
+ [ 'c', 'ম' ],
+ [ '\\?', 'য' ],
+ [ 'j', 'র' ],
+ [ 'J', 'ৎ' ],
+ [ 'n', 'ল' ],
+ [ 'M', 'শ' ],
+ [ '\\<', 'ষ' ],
+ [ 'm', 'স' ],
+ [ 'u', 'হ' ],
+ [ '\\]', '়' ],
+ [ 'e', 'া' ],
+ [ 'f', 'ি' ],
+ [ 'r', 'ী' ],
+ [ 'g', 'ু' ],
+ [ 't', 'ূ' ],
+ [ '\\=', 'ৃ' ],
+ [ 's', 'ে' ],
+ [ 'w', 'ৈ' ],
+ [ 'a', 'ো' ],
+ [ 'q', 'ৌ' ],
+ [ 'd', '্' ],
+ [ '/', 'য়' ],
+ [ '\\>', '৤' ],
+ [ '0', '০' ],
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '3', '৩' ],
+ [ '4', '৪' ],
+ [ '5', '৫' ],
+ [ '6', '৬' ],
+ [ '7', '৭' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+ [ 'z', 'ʼ' ],
+ [ '\\!', 'অ্যা' ],
+ [ '\\#', '্র' ],
+ [ '\\$', 'র্' ],
+ [ '\\%', 'জ্ঞ' ],
+ [ '\\^', 'ত্র' ],
+ [ '\\&', 'ক্ষ' ],
+ [ '\\*', 'শ্র' ],
+ [ '\\(', '\u200D' ],
+ [ '\\)', '\u200C' ] ],
+ patterns_x: [
+ [ 'F', 'ঌ' ],
+ [ '\\>', 'ঽ' ],
+ [ '\\=', 'ৠ' ],
+ [ 'l', 'ৎ' ],
+ [ '\\[', 'ড়' ],
+ [ '\\{', 'ঢ়' ],
+ [ '\\+', 'ৠ' ],
+ [ 'R', 'ৡ' ],
+ [ 'f', 'ৢ' ],
+ [ 'r', 'ৣ' ],
+ [ '\\.', '৥' ],
+ [ 'x', '৺' ],
+ [ '\\<', '৲' ],
+ [ ',', '৳' ],
+ [ '\\!', '৴' ],
+ [ '\\@', '৵' ],
+ [ '\\#', '৶' ],
+ [ '\\$', '৷' ],
+ [ '\\%', '৸' ],
+ [ '\\^', '৹' ],
+ [ '\\?', '৻' ],
+ [ '4', '₹' ] ]
+ };
+
+ $.ime.register( bnInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-inscript2.js
new file mode 100644
index 00000000..28573e1f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-inscript2.js
@@ -0,0 +1,128 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bnInScript2 = {
+ id: 'bn-inscript2',
+ name: 'ইনস্ক্ৰিপ্ট ২',
+ description: 'Enhanced InScript keyboard for Bengali language',
+ date: '2013-02-09',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\!', 'অ্যা' ],
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '\\#', '্র' ],
+ [ '3', '৩' ],
+ [ '\\$', 'র্' ],
+ [ '4', '৪' ],
+ [ '\\%', 'জ্ঞ' ],
+ [ '5', '৫' ],
+ [ '\\^', 'ত্র' ],
+ [ '6', '৬' ],
+ [ '\\&', 'ক্ষ' ],
+ [ '7', '৭' ],
+ [ '\\*', 'শ্র' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '0', '০' ],
+ [ '"', 'ঠ' ],
+ [ '\'', 'ট' ],
+ [ ',', ',' ],
+ [ '-', '-' ],
+ [ '\\.', '.' ],
+ [ '/', 'য়' ],
+ [ ':', 'ছ' ],
+ [ ';', 'চ' ],
+ [ '\\<', 'ষ' ],
+ [ '\\=', 'ৃ' ],
+ [ '\\+', 'ঋ' ],
+ [ '\\>', '।' ],
+ [ '\\?', 'য' ],
+ [ 'A', 'ও' ],
+ [ 'C', 'ণ' ],
+ [ 'D', 'অ' ],
+ [ 'E', 'আ' ],
+ [ 'F', 'ই' ],
+ [ 'G', 'উ' ],
+ [ 'H', 'ফ' ],
+ [ 'I', 'ঘ' ],
+ [ 'K', 'খ' ],
+ [ 'L', 'থ' ],
+ [ 'M', 'শ' ],
+ [ 'O', 'ধ' ],
+ [ 'P', 'ঝ' ],
+ [ 'Q', 'ঔ' ],
+ [ 'R', 'ঈ' ],
+ [ 'S', 'এ' ],
+ [ 'T', 'ঊ' ],
+ [ 'U', 'ঙ' ],
+ [ 'W', 'ঐ' ],
+ [ 'X', 'ঁ' ],
+ [ 'Y', 'ভ' ],
+ [ '\\{', 'ঢ' ],
+ [ '\\[', 'ড' ],
+ [ '\\}', 'ঞ' ],
+ [ '\\]', '়' ],
+ [ '\\_', 'ঃ' ],
+ [ 'a', 'ো' ],
+ [ 'c', 'ম' ],
+ [ 'd', '্' ],
+ [ 'e', 'া' ],
+ [ 'f', 'ি' ],
+ [ 'g', 'ু' ],
+ [ 'h', 'প' ],
+ [ 'i', 'গ' ],
+ [ 'j', 'র' ],
+ [ 'k', 'ক' ],
+ [ 'l', 'ত' ],
+ [ 'm', 'স' ],
+ [ 'n', 'ল' ],
+ [ 'o', 'দ' ],
+ [ 'p', 'জ' ],
+ [ 'q', 'ৌ' ],
+ [ 'r', 'ী' ],
+ [ 's', 'ে' ],
+ [ 't', 'ূ' ],
+ [ 'u', 'হ' ],
+ [ 'v', 'ন' ],
+ [ 'w', 'ৈ' ],
+ [ 'x', 'ং' ],
+ [ 'y', 'ব' ],
+ [ 'z', 'ʼ' ]
+ ],
+ patterns_x: [
+ [ '\\!', '৴' ],
+ [ '1', '\u200d' ],
+ [ '\\@', '৵' ],
+ [ '2', '\u200c' ],
+ [ '\\#', '৶' ],
+ [ '\\$', '৷' ],
+ [ '4', '₹' ],
+ [ '\\%', '৸' ],
+ [ '\\^', '৹' ],
+ [ ',', '৳' ],
+ [ '\\.', '॥' ],
+ [ '/', '্য' ],
+ [ '\\<', '৲' ],
+ [ '\\=', 'ৄ' ],
+ [ '\\+', 'ৠ' ],
+ [ '\\>', 'ঽ' ],
+ [ '\\?', '৻' ],
+ [ 'F', 'ঌ' ],
+ [ 'R', 'ৡ' ],
+ [ '\\{', 'ঢ়' ],
+ [ '\\[', 'ড়' ],
+ [ 'f', 'ৢ' ],
+ [ 'l', 'ৎ' ],
+ [ 'r', 'ৣ' ],
+ [ 'x', '৺' ]
+ ]
+ };
+
+ $.ime.register( bnInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-nkb.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-nkb.js
new file mode 100644
index 00000000..11e6db8d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-nkb.js
@@ -0,0 +1,133 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bnNkb = {
+ id: 'bn-nkb',
+ name: 'Jatiyo Keyboard',
+ description: 'Bengali Jatiyo Keyboard input method',
+ date: '2012-10-10',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 0,
+ patterns: [
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '3', '৩' ],
+ [ '4', '৪' ],
+ [ '5', '৫' ],
+ [ '6', '৬' ],
+ [ '7', '৭' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+ [ '0', '০' ],
+
+ [ 'q', 'ঙ' ],
+ [ 'w', 'য' ],
+ [ 'e', 'ড' ],
+ [ 'r', 'প' ],
+ [ 't', 'ট' ],
+ [ 'y', 'চ' ],
+ [ 'u', 'জ' ],
+ [ 'i', 'হ' ],
+ [ 'o', 'গ' ],
+ [ 'p', 'ড়' ],
+
+ [ 'a', 'ৃ' ],
+ [ 's', 'ু' ],
+ [ 'd', 'ি' ],
+ [ 'f', 'ব' ],
+ [ 'g', '্' ],
+ [ 'h', 'া' ],
+ [ 'j', 'ক' ],
+ [ 'k', 'ত' ],
+ [ 'l', 'দ' ],
+
+ [ 'z', 'ঁ' ],
+ [ 'x', 'ো' ],
+ [ 'c', 'ে' ],
+ [ 'v', 'র' ],
+ [ 'b', 'ন' ],
+ [ 'n', 'স' ],
+ [ 'm', 'ম' ],
+
+ [ 'Q', 'ং' ],
+ [ 'W', 'য়' ],
+ [ 'E', 'ঢ' ],
+ [ 'R', 'ফ' ],
+ [ 'T', 'ঠ' ],
+ [ 'Y', 'ছ' ],
+ [ 'U', 'ঝ' ],
+ [ 'I', 'ঞ' ],
+ [ 'O', 'ঘ' ],
+ [ 'P', 'ঢ়' ],
+
+ [ 'A', 'ৗ' ],
+ [ 'S', 'ূ' ],
+ [ 'D', 'ী' ],
+ [ 'F', 'ভ' ],
+ [ 'G', '।' ],
+ [ 'H', 'অ' ],
+ [ 'J', 'খ' ],
+ [ 'K', 'থ' ],
+ [ 'L', 'ধ' ],
+
+ [ 'Z', 'ঃ' ],
+ [ 'X', 'ৌ' ],
+ [ 'C', 'ৈ' ],
+ [ 'V', 'ল' ],
+ [ 'B', 'ণ' ],
+ [ 'N', 'ষ' ],
+ [ 'M', 'শ' ] ],
+ patterns_x: [
+ [ '1', '৴' ],
+ [ '2', '৵' ],
+ [ '3', '৶' ],
+ [ '4', '৳' ],
+ [ '5', '৷' ],
+ [ '6', '৸' ],
+ [ '7', 'ं' ],
+ [ '0', '৹' ],
+ [ '\\-', '\u200C' ],
+ [ '\\=', '\u200D' ],
+
+ [ 'q', 'ৢ' ],
+ [ 'w', '্য' ],
+ [ 'e', 'ৄ' ],
+ [ 'i', 'ঽ' ],
+
+ [ 'a', 'ঋ' ],
+ [ 's', 'উ' ],
+ [ 'd', 'ই' ],
+ [ 'f', 'ৰ' ],
+ [ 'g', '॥' ],
+ [ 'h', 'আ' ],
+ [ 'j', '঱' ],
+ [ 'k', 'ঢ' ],
+ [ 'l', 'ঌ' ],
+
+ [ 'z', '৺' ],
+ [ 'x', 'ও' ],
+ [ 'c', 'এ' ],
+ [ 'v', '্র' ],
+ [ '\\.', '়' ],
+
+ [ '\\$', '৲' ],
+ [ '\\^', '঳' ],
+
+ [ 'Q', 'ৣ' ],
+
+ [ 'A', 'ৠ' ],
+ [ 'S', 'ঊ' ],
+ [ 'D', 'ঈ' ],
+ [ 'F', 'ৱ' ],
+ [ 'L', 'ৡ' ],
+
+ [ 'X', 'ঔ' ],
+ [ 'C', 'ঐ' ] ]
+ };
+
+ $.ime.register( bnNkb );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-probhat.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-probhat.js
new file mode 100644
index 00000000..c0f14a38
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bn/bn-probhat.js
@@ -0,0 +1,102 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bnProbhat = {
+ id: 'bn-probhat',
+ name: 'Bengali Probhat',
+ description: 'Bengali Probhat input method for Bengali',
+ date: '2012-10-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Nasir Khan Saikat',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 0,
+ patterns: [
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '3', '৩' ],
+ [ '4', '৪' ],
+ [ '5', '৫' ],
+ [ '6', '৬' ],
+ [ '7', '৭' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+ [ '0', '০' ],
+
+ [ 'q', 'দ' ],
+ [ 'w', 'ূ' ],
+ [ 'e', 'ী' ],
+ [ 'r', 'র' ],
+ [ 't', 'ট' ],
+ [ 'y', 'এ' ],
+ [ 'u', 'ু' ],
+ [ 'i', 'ি' ],
+ [ 'o', 'ও' ],
+ [ 'p', 'প' ],
+
+ [ 'a', 'া' ],
+ [ 's', 'স' ],
+ [ 'd', 'ড' ],
+ [ 'f', 'ত' ],
+ [ 'g', 'গ' ],
+ [ 'h', 'হ' ],
+ [ 'j', 'জ' ],
+ [ 'k', 'ক' ],
+ [ 'l', 'ল' ],
+
+ [ 'z', 'য়' ],
+ [ 'x', 'শ' ],
+ [ 'c', 'চ' ],
+ [ 'v', 'আ' ],
+ [ 'b', 'ব' ],
+ [ 'n', 'ন' ],
+ [ 'm', 'ম' ],
+
+ [ 'Q', 'ধ' ],
+ [ 'W', 'ঊ' ],
+ [ 'E', 'ঈ' ],
+ [ 'R', 'ড়' ],
+ [ 'T', 'ঠ' ],
+ [ 'Y', 'ঐ' ],
+ [ 'U', 'উ' ],
+ [ 'I', 'ই' ],
+ [ 'O', 'ঔ' ],
+ [ 'P', 'ফ' ],
+
+ [ 'A', 'অ' ],
+ [ 'S', 'ষ' ],
+ [ 'D', 'ঢ' ],
+ [ 'F', 'থ' ],
+ [ 'G', 'ঘ' ],
+ [ 'H', 'ঃ' ],
+ [ 'J', 'ঝ' ],
+ [ 'K', 'খ' ],
+ [ 'L', 'ং' ],
+
+ [ 'Z', 'য' ],
+ [ 'X', 'ঢ়' ],
+ [ 'C', 'ছ' ],
+ [ 'V', 'ঋ' ],
+ [ 'B', 'ভ' ],
+ [ 'N', 'ণ' ],
+ [ 'M', 'ঙ' ],
+
+ [ '`', '\u200D' ],
+ [ '\\$', '৳' ],
+ [ '\\&', 'ঞ' ],
+ [ '\\*', 'ৎ' ],
+ [ '\\[', 'ে' ],
+ [ '\\]', 'ো' ],
+ [ '\\{', 'ৈ' ],
+ [ '\\}', 'ৌ' ],
+ [ '\\|', '॥' ],
+ [ '\\.', '।' ],
+ [ '/', '্' ],
+ [ '<', 'ৃ' ],
+ [ '>', 'ঁ' ],
+ [ '\\\\', '\u200C' ] ]
+ };
+
+ $.ime.register( bnProbhat );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bo/bo-ewts.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bo/bo-ewts.js
new file mode 100644
index 00000000..584d1c3b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bo/bo-ewts.js
@@ -0,0 +1,285 @@
+( function ( $ ) {
+ 'use strict';
+
+ var boEWTS = {
+ id: 'bo-ewts',
+ name: 'Tibetan EWTS transliteration',
+ description: 'Tibetan Extended Wylie Transliteration, based on the work of thdl.',
+ date: '2014-07-09',
+ URL: 'http://www.thlib.org/reference/transliteration/#!essay=/thl/ewts',
+ author: 'Elie Roux <elie.roux@telecom-bretagne.eu>',
+ license: 'GPLv3',
+ version: '1.1',
+ contextLength: 2,
+ maxKeyLength: 5,
+ patterns: [
+ // ambiguous cases with b as prefix
+ [ 'བྲk', 'r', 'བརྐ' ],
+ [ 'བྲg', 'r', 'བརྒ' ],
+ [ 'བྲl', 'r', 'བརླ' ],
+ [ 'བྲj', 'r', 'བརྗ' ],
+ [ 'བྲt', 'r', 'བརྟ' ],
+ [ 'བྲd', 'r', 'བརྡ' ],
+ [ 'བྲn', 'r', 'བརྣ' ],
+ [ 'བླt', 'l', 'བལྟ' ],
+ [ 'བླd', 'l', 'བལྡ' ],
+ // Standard Tibetan Stacks listed at <http://www.thlib.org/reference/transliteration/tibstacks.php>
+ // some are handled magically and don't need to appear here.
+ [ 'རྐy', 'k', 'རྐྱ' ],
+ [ 'རྒy', 'g', 'རྒྱ' ],
+ [ 'རྨy', 'm', 'རྨྱ' ],
+ [ 'རྒw', 'g', 'རྒྭ' ],
+ [ 'རྩw', 's', 'རྩྭ' ],
+ [ 'སྐy', 'k', 'སྐྱ' ],
+ [ 'སྒy', 'g', 'སྒྱ' ],
+ [ 'སྤy', 'p', 'སྤྱ' ],
+ [ 'སྦy', 'b', 'སྦྱ' ],
+ [ 'སྨy', 'm', 'སྨྱ' ],
+ [ 'སྐr', 'k', 'སྐྲ' ],
+ [ 'སྒr', 'g', 'སྒྲ' ],
+ [ 'སྣr', 'n', 'སྣྲ' ],
+ [ 'སྤr', 'p', 'སྤྲ' ],
+ [ 'སྦr', 'b', 'སྦྲ' ],
+ [ 'སྨr', 'm', 'སྨྲ' ],
+ [ 'གྲw', 'r', 'གྲྭ' ],
+ [ 'དྲw', 'r', 'དྲྭ' ],
+ [ 'ཕྱw', 'y', 'ཕྱྭ' ],
+ [ 'རk', 'r', 'རྐ' ],
+ [ 'རg', 'r', 'རྒ' ],
+ [ 'རj', 'r', 'རྗ' ],
+ [ 'རt', 'r', 'རྟ' ],
+ [ 'རd', 'r', 'རྡ' ],
+ [ 'རn', 'r', 'རྣ' ],
+ [ 'རb', 'r', 'རྦ' ],
+ [ 'རm', 'r', 'རྨ' ],
+ [ 'ལk', 'l', 'ལྐ' ],
+ [ 'ལg', 'l', 'ལྒ' ],
+ [ 'ལc', 'l', 'ལྕ' ],
+ [ 'ལj', 'l', 'ལྗ' ],
+ [ 'ལt', 'l', 'ལྟ' ],
+ [ 'ལd', 'l', 'ལྡ' ],
+ [ 'ལp', 'l', 'ལྤ' ],
+ [ 'ལb', 'l', 'ལྦ' ],
+ [ 'ལh', 'l', 'ལྷ' ],
+ [ 'སk', 's', 'སྐ' ],
+ [ 'སg', 's', 'སྒ' ],
+ [ 'སt', 's', 'སྟ' ],
+ [ 'སd', 's', 'སྡ' ],
+ [ 'སn', 's', 'སྣ' ],
+ [ 'སp', 's', 'སྤ' ],
+ [ 'སb', 's', 'སྦ' ],
+ [ 'སm', 's', 'སྨ' ],
+ [ 'སྟs', 't', 'སྩ' ],
+ [ 'ཀw', 'k', 'ཀྭ' ],
+ [ 'ཁw', 'h', 'ཁྭ' ],
+ [ 'གw', 'g', 'གྭ' ],
+ [ 'ཅw', 'c', 'ཅྭ' ],
+ [ 'ཉw', 'y', 'ཉྭ' ],
+ [ 'ཏw', 't', 'ཏྭ' ],
+ [ 'དw', 'd', 'དྭ' ],
+ [ 'ཙw', 's', 'ཙྭ' ],
+ [ 'ཚw', 'h', 'ཚྭ' ],
+ [ 'ཞw', 'h', 'ཞྭ' ],
+ [ 'ཟw', 'z', 'ཟྭ' ],
+ [ 'རw', 'r', 'རྭ' ],
+ [ 'ཤw', 'h', 'ཤྭ' ],
+ [ 'སw', 's', 'སྭ' ],
+ [ 'ཧw', 'h', 'ཧྭ' ],
+ [ 'ཀy', 'k', 'ཀྱ' ],
+ [ 'ཁy', 'h', 'ཁྱ' ],
+ [ 'གy', 'g', 'གྱ' ],
+ [ 'པy', 'p', 'པྱ' ],
+ [ 'ཕy', 'h', 'ཕྱ' ],
+ [ 'བy', 'b', 'བྱ' ],
+ [ 'མy', 'm', 'མྱ' ],
+ [ 'ཀr', 'k', 'ཀྲ' ],
+ [ 'ཁr', 'h', 'ཁྲ' ],
+ [ 'གr', 'g', 'གྲ' ],
+ [ 'ཏr', 't', 'ཏྲ' ],
+ [ 'ཐr', 'h', 'ཐྲ' ],
+ [ 'དr', 'd', 'དྲ' ],
+ [ 'པr', 'p', 'པྲ' ],
+ [ 'ཕr', 'h', 'ཕྲ' ],
+ [ 'བr', 'b', 'བྲ' ],
+ [ 'མr', 'm', 'མྲ' ],
+ [ 'ཤr', 'h', 'ཤྲ' ],
+ [ 'སr', 's', 'སྲ' ],
+ [ 'ཧr', 'h', 'ཧྲ' ],
+ [ 'ཀl', 'k', 'ཀླ' ],
+ [ 'གl', 'g', 'གླ' ],
+ [ 'བl', 'b', 'བླ' ],
+ [ 'ཟl', 'z', 'ཟླ' ],
+ [ 'རl', 'r', 'རླ' ],
+ [ 'སl', 's', 'སླ' ],
+ [ 'ཨོM', 'o', 'ༀ' ],
+ [ '\\.', '' ],
+ [ '\\+', '' ],
+ [ '-', '' ],
+ [ 'S', '' ],
+ // subjoined letters:
+ [ 'k', '\\+', 'ྐ' ],
+ [ 'g', '\\+', 'ྒ' ],
+ [ 'ྣg', 'ྔ' ],
+ [ 'c', '\\+', 'ྕ' ],
+ [ 'ྕh', 'ྖ' ],
+ [ 'j', '\\+', 'ྗ' ],
+ [ 'ྣy', 'ྙ' ],
+ [ 'T', '\\+', 'ྚ' ],
+ [ 'ྚh', 'ྛ' ],
+ [ 'D', '\\+', 'ྜ' ],
+ [ 'N', '\\+', 'ྞ' ],
+ [ 't', '\\+', 'ྟ' ],
+ [ 'ྟh', 'ྠ' ],
+ [ 'd', '\\+', 'ྡ' ],
+ [ 'n', '\\+', 'ྣ' ],
+ [ 'p', '\\+', 'ྤ' ],
+ [ 'ྤh', 'ྥ' ],
+ [ 'b', '\\+', 'ྦ' ],
+ [ 'm', '\\+', 'ྨ' ],
+ [ 'ྟs', 'ྩ' ],
+ [ 'ྩh', 'ྪ' ],
+ [ 'ྡz', 'ྫ' ],
+ [ 'w', '\\+', 'ྭ' ],
+ [ 'ྯh', 'ྮ' ],
+ [ 'z', '\\+', 'ྯ' ],
+ [ '\'', '\\+', 'ྰ' ],
+ [ 'y', '\\+', 'ྱ' ],
+ [ 'r', '\\+', 'ྲ' ],
+ [ 'l', '\\+', 'ླ' ],
+ [ 'ྶh', 'ྴ' ],
+ [ 'ཀh', '\\+S', 'ཀྵ' ],
+ [ 'ྐh', '\\+S', 'ྐྵ' ],
+ [ 'ྐh', 'ྑ' ],
+ [ 'h', '\\+S', 'ྵ' ],
+ [ 's', '\\+', 'ྶ' ],
+ [ 'གh', '\\+', 'གྷ' ],
+ [ 'ཌh', '\\+', 'ཌྷ' ],
+ [ 'དh', '\\+', 'དྷ' ],
+ [ 'བh', '\\+', 'བྷ' ],
+ [ 'ཛh', '\\+', 'ཛྷ' ],
+ [ 'ྒh', '\\+', 'ྒྷ' ],
+ [ 'ྜh', '\\+', 'ྜྷ' ],
+ [ 'ྡh', '\\+', 'ྡྷ' ],
+ [ 'ྦh', '\\+', 'ྦྷ' ],
+ [ 'ྫh', '\\+', 'ྫྷ' ],
+ [ 'h', '\\+', 'ྷ' ],
+ [ 'v', '\\+', 'ྦ༹' ],
+ [ 'f', '\\+', 'ྥ༹' ],
+ [ 'W', '\\+', 'ྺ' ],
+ [ 'Y', '\\+', 'ྻ' ],
+ [ 'R', '\\+', 'ྼ' ],
+ [ 'Z', '\\+', '༹' ],
+ // consonants
+ [ 'k', 'ཀ' ],
+ [ 'ཀh', 'k', 'ཁ' ],
+ [ 'ལནg', 'ln', 'ལྔ' ],
+ [ 'ནg', 'n', 'ང' ],
+ [ 'g', 'ག' ],
+ [ 'c', 'ཅ' ],
+ [ 'ཅh', 'c', 'ཆ' ],
+ [ 'j', 'ཇ' ],
+ [ 'ནy', 'n', 'ཉ' ],
+ [ 'T', 'ཊ' ],
+ [ 'ཊh', 'T', 'ཋ' ],
+ [ 'D', 'ཌ' ],
+ [ 'N', 'ཎ' ],
+ [ 't', 'ཏ' ],
+ [ 'ཏh', 't', 'ཐ' ],
+ [ 'd', 'ད' ],
+ [ 'n', 'ན' ],
+ [ 'p', 'པ' ],
+ [ 'པh', 'p', 'ཕ' ],
+ [ 'b', 'བ' ],
+ [ 'm', 'མ' ],
+ [ 'ཏs', 't', 'ཙ' ],
+ [ 'ཙh', 's', 'ཚ' ],
+ [ 'དz', 'd', 'ཛ' ],
+ [ 'w', 'ཝ' ],
+ [ 'ཟh', 'z', 'ཞ' ],
+ [ 'z', 'ཟ' ],
+ [ '\'', 'འ' ],
+ [ 'y', 'ཡ' ],
+ [ 'r', 'ར' ],
+ [ 'l', 'ལ' ],
+ [ 'སh', 's', 'ཤ' ],
+ [ 'h', 'S', 'ཥ' ],
+ [ 's', 'ས' ],
+ [ 'h', 'ཧ' ],
+ [ 'f', 'ཕ༹' ],
+ [ 'v', 'བ༹' ],
+ [ 'R', 'ཪ' ],
+ // vowels after consonnants or vowels
+ [ '([ཀ-ྼ])i', 'a', '$1ཻ' ],
+ [ '([ཀ-ྼ])u', 'a', '$1ཽ' ],
+ [ 'ྲi', '-', 'ྲྀ' ],
+ [ 'ླi', '-', 'ླྀ' ],
+ [ '([ཀ-ྼ])i', '-', '$1ྀ' ],
+ [ '([ཀ-ྼ])རI', 'r-', '$1ྲཱྀ' ],
+ [ '([ཀ-ྼ])ལI', 'l-', '$1ླཱྀ' ],
+ [ 'རI', 'r-', 'ཨྲཱྀ' ],
+ [ 'ལI', 'l-', 'ཨླཱྀ' ],
+ [ '([ཀ-ྼ])I', '-', '$1ཱྀ' ],
+ [ '([ཀ-ྼ])a', '$1' ],
+ [ '([ཀ-ྼ])i', '$1ི' ],
+ [ '([ཀ-ྼ])u', '$1ུ' ],
+ [ '([ཀ-ྼ])e', '$1ེ' ],
+ [ '([ཀ-ྼ])o', '$1ོ' ],
+ [ '([ཀ-ྼ])A', '$1ཱ' ],
+ [ '([ཀ-ྼ])I', '$1ཱི' ],
+ [ '([ཀ-ྼ])U', '$1ཱུ' ],
+ // vowels after something else
+ [ 'a', 'ཨ' ],
+ [ 'i', '-', 'ཨྀ' ],
+ [ 'A', 'ཨཱ' ],
+ [ 'I', '-', 'ཨཱྀ' ],
+ [ 'I', 'ཨཱི' ],
+ [ 'U', 'ཨཱུ' ],
+ [ 'i', 'ཨི' ],
+ [ 'u', 'ཨུ' ],
+ [ 'e', 'ཨེ' ],
+ [ 'o', 'ཨོ' ],
+ // numbers
+ [ '0', '༠' ],
+ [ '1', '༡' ],
+ [ '2', '༢' ],
+ [ '3', '༣' ],
+ [ '4', '༤' ],
+ [ '5', '༥' ],
+ [ '6', '༦' ],
+ [ '7', '༧' ],
+ [ '8', '༨' ],
+ [ '9', '༩' ],
+ // Sanskrit marks
+ [ 'H', 'ཿ' ],
+ [ 'M', 'ཾ' ],
+ [ '~M', 'ྃ' ],
+ [ '~M`', 'ྂ' ],
+ [ '\\?', '྄' ],
+ [ '&', '྅' ],
+ // punctuation
+ [ ' ', '་' ],
+ [ '\\*', '༌' ],
+ [ '\\/', '།' ],
+ [ '\\/\\/', '༎' ],
+ [ ';', '༏' ],
+ [ '\\|', '༑' ],
+ [ '\\!', '༈' ],
+ [ '\\:', '༔' ],
+ [ '_', ' ' ],
+ [ '\\=', '༴' ],
+ [ '@', '༄' ],
+ [ '#', '༅' ],
+ [ '\\$', '༆' ],
+ [ '%', '༇' ],
+ [ '<', '༺' ],
+ [ '>', '༻' ],
+ [ '\\(', '༼' ],
+ [ '\\)', '༽' ],
+ [ '~X', '༵' ],
+ [ 'X', '༷' ],
+ [ '\\^', '༹' ]
+ ]
+ };
+
+ $.ime.register( boEWTS );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bo/bo-sambhota.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bo/bo-sambhota.js
new file mode 100644
index 00000000..0b2a60a1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bo/bo-sambhota.js
@@ -0,0 +1,190 @@
+( function ( $ ) {
+ 'use strict';
+
+ var stackingState, boSAMBHOTA;
+
+ function changeStackingState( newState ) {
+ stackingState = newState;
+ }
+
+ function reinit() {
+ changeStackingState( 0 );
+ }
+
+ reinit();
+
+ // isOneChar is true for composed sanskrit characters (ex གྷ)
+ function normalOrSub( normal, sub, alwaysStacked, isOneChar ) {
+ switch ( stackingState ) {
+ case 0:
+ return normal;
+ case 1:
+ if ( !isOneChar ) {
+ changeStackingState( 2 );
+ }
+
+ return normal;
+ case 2:
+ if ( !isOneChar ) {
+ changeStackingState( 3 );
+ }
+
+ return sub;
+ default:
+ if ( alwaysStacked ) {
+ return sub;
+ }
+
+ changeStackingState( 0 );
+
+ return normal;
+ }
+ }
+
+ function switchStacking() {
+ if ( !stackingState ) {
+ changeStackingState( 1 );
+ } else {
+ changeStackingState( 0 );
+ }
+ }
+
+ boSAMBHOTA = {
+ id: 'bo-sambhota',
+ name: 'Tibetan Sambhota',
+ description: 'Tibetan Sambhota Input Method.',
+ date: '2015-08-04',
+ URL: 'https://github.com/tibetan-nlp/ttt/blob/master/source/Sambhota_keymap_one.rtf',
+ author: 'Elie Roux <elie.roux@telecom-bretagne.eu>',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 5,
+ patterns: [
+ /* eslint-disable max-statements-per-line */
+ [ ' ', function () { reinit(); return '་'; } ],
+ [ '\\.', function () { reinit(); return ' '; } ],
+ [ ',', function () { reinit(); return '།'; } ],
+ [ ';', function () { reinit(); return '༔'; } ],
+ [ 'f', function () { switchStacking(); return ''; } ],
+ [ 'a', function () { reinit(); return ''; } ],
+ [ 'k', function () { return normalOrSub( 'ཀ', 'ྐ' ); } ],
+ [ 'K', function () { return normalOrSub( 'ཁ', 'ྑ' ); } ],
+ [ 'g', function () { return normalOrSub( 'ག', 'ྒ' ); } ],
+ [ 'G', function () { return normalOrSub( 'ང', 'ྔ' ); } ],
+ [ 'c', function () { return normalOrSub( 'ཅ', 'ྕ' ); } ],
+ [ 'C', function () { return normalOrSub( 'ཆ', 'ྖ' ); } ],
+ [ 'j', function () { return normalOrSub( 'ཇ', 'ྗ' ); } ],
+ [ 'N', function () { return normalOrSub( 'ཉ', 'ྙ' ); } ],
+ [ 'q', function () { return normalOrSub( 'ཊ', 'ྚ' ); } ],
+ [ 'Q', function () { return normalOrSub( 'ཋ', 'ྛ' ); } ],
+ [ 'v', function () { return normalOrSub( 'ཌ', 'ྜ' ); } ],
+ [ 'V', function () { return normalOrSub( 'ཎ', 'ྞ' ); } ],
+ [ 't', function () { return normalOrSub( 'ཏ', 'ྟ' ); } ],
+ [ 'T', function () { return normalOrSub( 'ཐ', 'ྠ' ); } ],
+ [ 'd', function () { return normalOrSub( 'ད', 'ྡ' ); } ],
+ [ 'གྷn', function () { return normalOrSub( 'གྷན', 'གྷྣ' ); } ],
+ [ 'n', function () { return normalOrSub( 'ན', 'ྣ' ); } ],
+ [ 'p', function () { return normalOrSub( 'པ', 'ྤ' ); } ],
+ [ 'P', function () { return normalOrSub( 'ཕ', 'ྥ' ); } ],
+ [ 'b', function () { return normalOrSub( 'བ', 'ྦ' ); } ],
+ [ 'རྨm', function () { return normalOrSub( 'རྨམ', 'རྨྨ', true ); } ],
+ [ 'm', function () { return normalOrSub( 'མ', 'ྨ' ); } ],
+ [ 'x', function () { return normalOrSub( 'ཙ', 'ྩ' ); } ],
+ [ 'X', function () { return normalOrSub( 'ཚ', 'ྪ' ); } ],
+ [ 'D', function () { return normalOrSub( 'ཛ', 'ྫ' ); } ],
+ [ 'ྭw', function () { return normalOrSub( 'ྭཝ', 'ྭྭ' ); } ],
+ [ 'w', function () { return normalOrSub( 'ཝ', 'ྭ', true ); } ],
+ [ 'W', function () { return normalOrSub( 'ཝ', 'ྺ' ); } ],
+ [ 'Z', function () { return normalOrSub( 'ཞ', 'ྮ' ); } ],
+ [ 'z', function () { return normalOrSub( 'ཟ', 'ྯ' ); } ],
+ [ 'ཱ\'', function () { return normalOrSub( 'ཱ\'འ', 'ཱཱ' ); } ],
+ [ '\'', function () { return normalOrSub( 'འ', 'ཱ', true ); } ],
+ [ 'ྱy', function () { return normalOrSub( 'ྱཡ', 'ྱྱ' ); } ],
+ [ 'y', function () { return normalOrSub( 'ཡ', 'ྱ', true ); } ],
+ [ 'l', function () { return normalOrSub( 'ལ', 'ླ' ); } ],
+ [ 'i', function () { reinit(); return 'ི'; } ],
+ [ 'u', function () { reinit(); return 'ུ'; } ],
+ [ 'e', function () { reinit(); return 'ེ'; } ],
+ [ 'o', function () { reinit(); return 'ོ'; } ],
+ [ 'ལ([ྐ-ྷ]+)r', function ( _, capture ) { reinit(); return 'ལ' + capture + 'ར'; } ],
+ [ 'ྐr', function () { return normalOrSub( 'ྐར', 'ྐྲ', true ); } ],
+ [ 'ྒr', function () { return normalOrSub( 'ྒར', 'ྒྲ', true ); } ],
+ [ 'ྣr', function () { return normalOrSub( 'ྣར', 'ྣྲ', true ); } ],
+ [ 'ྤr', function () { return normalOrSub( 'ྤར', 'ྤྲ', true ); } ],
+ [ 'ྦr', function () { return normalOrSub( 'ྦར', 'ྦྲ', true ); } ],
+ [ 'ྨr', function () { return normalOrSub( 'ྨར', 'ྨྲ', true ); } ],
+ [ 'སྡr', function () { reinit(); return 'སྡར'; } ],
+ [ 'ྡr', function () { return normalOrSub( 'ྡར', 'ྡྲ', true ); } ],
+ [ 'ྦྷr', function () { return normalOrSub( 'ྦྷར', 'ྦྷྲ', true ); } ],
+ [ 'ྡྷr', function () { return normalOrSub( 'ྡྷར', 'ྡྷྲ', true ); } ],
+ [ 'ྒྷr', function () { return normalOrSub( 'ྒྷར', 'ྒྷྲ', true ); } ],
+ [ 'ྜྷr', function () { return normalOrSub( 'ྜྷར', 'ྜྷྲ', true ); } ],
+ [ 'ྟr', function () { return normalOrSub( 'ྟར', 'ྟྲ', true ); } ],
+ [ 'r', function () { return normalOrSub( 'ར', 'ྲ' ); } ],
+ [ 'S', function () { return normalOrSub( 'ཤ', 'ྴ' ); } ],
+ [ 'ཀB', function () { return normalOrSub( 'ཀཥ', 'ཀྵ', true, true ); } ],
+ [ 'ྐB', function () { return normalOrSub( 'ྐཥ', 'ྐྵ', true, true ); } ],
+ [ 'B', function () { return normalOrSub( 'ཥ', 'ྵ' ); } ],
+ [ 's', function () { return normalOrSub( 'ས', 'ྶ' ); } ],
+ [ 'གh', function () { return normalOrSub( 'གཧ', 'གྷ', true, true ); } ],
+ [ 'ཌh', function () { return normalOrSub( 'ཌཧ', 'ཌྷ', true, true ); } ],
+ [ 'དh', function () { return normalOrSub( 'དཧ', 'དྷ', true, true ); } ],
+ [ 'བh', function () { return normalOrSub( 'བཧ', 'བྷ', true, true ); } ],
+ [ 'ཛh', function () { return normalOrSub( 'ཛཧ', 'ཛྷ', true, true ); } ],
+ [ 'ྒh', function () { return normalOrSub( 'ྒཧ', 'ྒྷ', true, true ); } ],
+ [ 'ྜh', function () { return normalOrSub( 'ྜཧ', 'ྜྷ', true, true ); } ],
+ [ 'ྡh', function () { return normalOrSub( 'ྡཧ', 'ྡྷ', true, true ); } ],
+ [ 'ྦh', function () { return normalOrSub( 'ྦཧ', 'ྦྷ', true, true ); } ],
+ [ 'ྫh', function () { return normalOrSub( 'ྫཧ', 'ྫྷ', true, true ); } ],
+ [ 'ྷh', function () { return normalOrSub( 'ྷཧ', 'ྷྷ' ); } ],
+ [ 'h', function () { return normalOrSub( 'ཧ', 'ྷ', true ); } ],
+ [ 'A', function () { return normalOrSub( 'ཨ', 'ྸ' ); } ],
+ [ 'R', function () { return normalOrSub( 'ཪ', 'ྼ' ); } ],
+ [ 'Y', 'ྻ' ],
+ [ 'ྲI', function () { reinit(); return 'ྲྀ'; } ],
+ [ 'ླI', function () { reinit(); return 'ླྀ'; } ],
+ [ 'I', function () { reinit(); return 'ྀ'; } ],
+ [ 'E', function () { reinit(); return 'ཻ'; } ],
+ [ 'O', function () { reinit(); return 'ཽ'; } ],
+ [ 'J', function () { reinit(); return 'ིཾ'; } ],
+ [ 'U', function () { reinit(); return 'ྀཾ'; } ],
+ [ 'F', function () { reinit(); return 'ེཾ'; } ],
+ [ 'L', function () { reinit(); return 'ོཾ'; } ],
+ [ '`', function () { reinit(); return 'ཽཾ'; } ],
+ [ '~', function () { reinit(); return 'ཻཾ'; } ],
+ [ '\\^', function () { reinit(); return '྄'; } ],
+ [ '\\!', function () { reinit(); return '༄༅༅'; } ],
+ [ '\\#', function () { reinit(); return '༁ྃ'; } ],
+ [ '\\%', function () { reinit(); return 'ྃ'; } ],
+ [ '\\+', function () { reinit(); return 'ྂ'; } ],
+ [ '\\&', function () { reinit(); return 'ཾ'; } ],
+ [ '\\<', function () { reinit(); return 'ༀ'; } ],
+ [ '\\=', function () { reinit(); return 'ཨཱཿ'; } ],
+ [ '\\>', function () { reinit(); return 'ཧཱུྃ'; } ],
+ [ '\\:', function () { reinit(); return 'ཿ'; } ],
+ [ '"', function () { reinit(); return '༄༅'; } ],
+ [ '@', function () { reinit(); return '༄'; } ],
+ [ '\\$', function () { reinit(); return '༅'; } ],
+ [ '\\/', function () { reinit(); return '༴'; } ],
+ [ '\\?', function () { reinit(); return '༈'; } ],
+ [ '\\|', function () { reinit(); return '྅'; } ],
+ [ '-', function () { reinit(); return '༑'; } ],
+ [ '\\(', function () { reinit(); return '༼'; } ],
+ [ '\\)', function () { reinit(); return '༽'; } ],
+ // numbers
+ [ '0', function () { reinit(); return '༠'; } ],
+ [ '1', function () { reinit(); return '༡'; } ],
+ [ '2', function () { reinit(); return '༢'; } ],
+ [ '3', function () { reinit(); return '༣'; } ],
+ [ '4', function () { reinit(); return '༤'; } ],
+ [ '5', function () { reinit(); return '༥'; } ],
+ [ '6', function () { reinit(); return '༦'; } ],
+ [ '7', function () { reinit(); return '༧'; } ],
+ [ '8', function () { reinit(); return '༨'; } ],
+ [ '9', function () { reinit(); return '༩'; } ]
+ /* eslint-enable max-statements-per-line */
+ ]
+ };
+
+ $.ime.register( boSAMBHOTA );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/brx/brx-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/brx/brx-inscript.js
new file mode 100644
index 00000000..52c7e831
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/brx/brx-inscript.js
@@ -0,0 +1,112 @@
+( function ( $ ) {
+ 'use strict';
+
+ var brxInscript = {
+ id: 'brx-inscript',
+ name: 'Bodo Inscript',
+ description: 'Bodo Inscript input method',
+ date: '2012-10-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 0,
+ patterns: [
+ [ 'X', '\u0901' ],
+ [ 'x', '\u0902' ],
+ [ '_', '\u0903' ],
+ [ 'D', '\u0905' ],
+ [ 'E', '\u0906' ],
+ [ 'F', '\u0907' ],
+ [ 'R', '\u0908' ],
+ [ 'G', '\u0909' ],
+ [ 'T', '\u090A' ],
+ [ '\\+', '\u090B' ],
+ [ 'S', '\u090F' ],
+ [ 'W', '\u0910' ],
+ [ 'A', '\u0913' ],
+ [ 'Q', '\u0914' ],
+ [ 'k', '\u0915' ],
+ [ 'K', '\u0916' ],
+ [ 'i', '\u0917' ],
+ [ 'I', '\u0918' ],
+ [ 'U', '\u0919' ],
+ [ ';', '\u091A' ],
+ [ '\\:', '\u091B' ],
+ [ 'p', '\u091C' ],
+ [ 'P', '\u091D' ],
+ [ '\\}', '\u091E' ],
+ [ '\'', '\u091F' ],
+ [ '"', '\u0920' ],
+ [ '\\[', '\u0921' ],
+ [ '\\{', '\u0922' ],
+ [ 'C', '\u0923' ],
+ [ 'l', '\u0924' ],
+ [ 'L', '\u0925' ],
+ [ 'o', '\u0926' ],
+ [ 'O', '\u0927' ],
+ [ 'v', '\u0928' ],
+ [ 'h', '\u092A' ],
+ [ 'H', '\u092B' ],
+ [ 'y', '\u092C' ],
+ [ 'Y', '\u092D' ],
+ [ 'c', '\u092E' ],
+ [ '/', '\u092F' ],
+ [ 'j', '\u0930' ],
+ [ 'n', '\u0932' ],
+ [ 'b', '\u0935' ],
+ [ 'M', '\u0936' ],
+ [ '\\<', '\u0937' ],
+ [ 'm', '\u0938' ],
+ [ 'u', '\u0939' ],
+ [ '\\]', '\u093C' ],
+ [ 'e', '\u093E' ],
+ [ 'f', '\u093F' ],
+ [ 'r', '\u0940' ],
+ [ 'g', '\u0941' ],
+ [ 't', '\u0942' ],
+ [ '\\=', '\u0943' ],
+ [ 's', '\u0947' ],
+ [ 'w', '\u0948' ],
+ [ 'a', '\u094B' ],
+ [ 'q', '\u094C' ],
+ [ 'd', '\u094D' ],
+ [ '\\>', '\u0964' ],
+ [ '0', '\u0966' ],
+ [ '1', '\u0967' ],
+ [ '2', '\u0968' ],
+ [ '3', '\u0969' ],
+ [ '4', '\u096A' ],
+ [ '5', '\u096B' ],
+ [ '6', '\u096C' ],
+ [ '7', '\u096D' ],
+ [ '8', '\u096E' ],
+ [ '9', '\u096F' ],
+ [ '\\#', '\u094D\u0930' ],
+ [ '\\$', '\u0930\u094D' ],
+ [ '\\%', '\u091C\u094D\u091E' ],
+ [ '\\^', '\u0924\u094D\u0930' ],
+ [ '\\&', '\u0915\u094D\u0937' ],
+ [ '\\*', '\u0936\u094D\u0930' ],
+ [ '\\(', '\u200D' ],
+ [ '\\)', '\u200C' ] ],
+ patterns_x: [
+ [ 'F', '\u090C' ],
+ [ 'N', '\u0933' ],
+ [ '\\>', '\u093D' ],
+ [ '\\=', '\u0944' ],
+ [ 'X', '\u0950' ],
+ [ 'e', '\u0951' ],
+ [ 'd', '\u0952' ],
+ [ '\\+', '\u0960' ],
+ [ 'R', '\u0961' ],
+ [ 'f', '\u0962' ],
+ [ 'r', '\u0963' ],
+ [ '\\.', '\u0965' ],
+ [ ',', '\u0970' ],
+ [ '\\$', '\u20B9' ] ]
+ };
+
+ $.ime.register( brxInscript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/brx/brx-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/brx/brx-inscript2.js
new file mode 100644
index 00000000..4927e0a0
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/brx/brx-inscript2.js
@@ -0,0 +1,117 @@
+( function ( $ ) {
+ 'use strict';
+
+ var brxInScript2 = {
+ id: 'brx-inscript2',
+ name: 'बोडो इनस्क्रिप्ट २',
+ description: 'Enhanced InScript keyboard for Bodo language',
+ date: '2013-20-13',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '\\#", "्र' ],
+ [ '3', '३' ],
+ [ '\\$', 'र्' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\]', ']' ],
+ [ '0', '०' ],
+ [ '\\_", "ः' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ऋ' ],
+ [ '\\=', 'ृ' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ौ' ],
+ [ 'W', 'ऐ' ],
+ [ 'w', 'ै' ],
+ [ 'E', 'आ' ],
+ [ 'e', 'ा' ],
+ [ 'R', 'ई' ],
+ [ 'r', 'ी' ],
+ [ 'T', 'ऊ' ],
+ [ 't', 'ू' ],
+ [ 'Y', 'भ' ],
+ [ 'y', 'ब' ],
+ [ 'U', 'ङ' ],
+ [ 'u', 'ह' ],
+ [ 'I', 'घ' ],
+ [ 'i', 'ग' ],
+ [ 'O', 'ध' ],
+ [ 'o', 'द' ],
+ [ 'P', 'झ' ],
+ [ 'p', 'ज' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ञ' ],
+ [ '\\]', '़' ],
+ [ 'A', 'ओ' ],
+ [ 'a', 'ो' ],
+ [ 'S', 'ए' ],
+ [ 's', 'े' ],
+ [ 'D', 'अ' ],
+ [ 'd', '्' ],
+ [ 'F', 'इ' ],
+ [ 'f', 'ि' ],
+ [ 'G', 'उ' ],
+ [ 'g', 'ु' ],
+ [ 'H', 'फ' ],
+ [ 'h', 'प' ],
+ [ 'j', 'र' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'थ' ],
+ [ 'l', 'त' ],
+ [ ':', 'छ' ],
+ [ ';', 'च' ],
+ [ '"', 'ठ' ],
+ [ '\'', 'ट' ],
+ [ 'z', 'ʼ' ],
+ [ 'X', 'ँ' ],
+ [ 'x', 'ं' ],
+ [ 'C', 'ण' ],
+ [ 'c', 'म' ],
+ [ 'v', 'न' ],
+ [ 'b', 'व' ],
+ [ 'n', 'ल' ],
+ [ 'M', 'श' ],
+ [ 'm', 'स' ],
+ [ '\\<', 'ष' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'य' ],
+ [ '\\%', 'ज्ञ' ],
+ [ '\\^', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '\\+', 'ॠ' ],
+ [ '\\=', 'ॄ' ],
+ [ 'e', '॑' ],
+ [ 'i', 'ग़' ],
+ [ 'R', 'ॡ' ],
+ [ 'r', 'ॣ' ],
+ [ 'd', '॒' ],
+ [ 'F', 'ऌ' ],
+ [ 'f', 'ॢ' ],
+ [ 'X', 'ॐ' ],
+ [ 'N', 'ळ' ],
+ [ ',', '॰' ],
+ [ '\\>', 'ऽ' ],
+ [ '\\.', '॥' ] ]
+ };
+
+ $.ime.register( brxInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/bwr/bwr-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/bwr/bwr-tilde.js
new file mode 100644
index 00000000..af7b75b6
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/bwr/bwr-tilde.js
@@ -0,0 +1,27 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bwrTilde = {
+ id: 'bwr-tilde',
+ name: 'Bura tilde',
+ description: 'Bura tilde keyboard',
+ date: '2022-08-14',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.1',
+ maxKeyLength: 2,
+ patterns: [
+ [ '~B', 'Ɓ' ],
+ [ '~b', 'ɓ' ],
+ [ '~D', 'Ɗ' ],
+ [ '~d', 'ɗ' ],
+ [ '~E', 'Ə' ],
+ [ '~e', 'ə' ],
+ [ '~K', 'Ƙ' ],
+ [ '~k', 'ƙ' ]
+ ]
+ };
+
+ $.ime.register( bwrTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/byn/byn-geezim.js b/UniversalLanguageSelector/lib/jquery.ime/rules/byn/byn-geezim.js
new file mode 100644
index 00000000..7d30788e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/byn/byn-geezim.js
@@ -0,0 +1,421 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bynGeezim = {
+ id: 'byn-geezim',
+ name: 'Blin GeezIM',
+ description: 'Blin input method based on GeezIME scheme',
+ date: '2017-01-22',
+ URL: 'http://type.geezlab.com',
+ author: 'Fitsum Gaim, <fitsum@geezlab.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 2,
+ patterns: [
+ // consonants
+ [ 'h', 'ህ' ],
+ [ '(l|L)', 'ል' ],
+ [ 'H', 'ሕ' ],
+ [ '(m|M)', 'ም' ],
+ [ '(r|R)', 'ር' ],
+ [ 'ስs', 'ሥ' ],
+ [ 's', 'ስ' ],
+ [ 'S', 'ሽ' ],
+ [ 'q', 'ቅ' ],
+ [ 'Q', 'ቕ' ],
+ [ '(b|B)', 'ብ' ],
+ [ '(v|V)', 'ቭ' ],
+ [ 't', 'ት' ],
+ [ 'c', 'ች' ],
+ [ 'ህh', 'ኅ' ],
+ [ 'n', 'ን' ],
+ [ 'N', 'ኝ' ],
+ [ 'k', 'ክ' ],
+ [ 'K', 'ኽ' ],
+ [ 'w', 'ው' ],
+ [ 'z', 'ዝ' ],
+ [ 'Z', 'ዥ' ],
+ [ '(y|Y)', 'ይ' ],
+ [ '(d|D)', 'ድ' ],
+ [ '(j|J)', 'ጅ' ],
+ [ 'g', 'ግ' ],
+ [ 'G', 'ጝ' ], // Blin
+ [ 'T', 'ጥ' ],
+ [ 'C', 'ጭ' ],
+ [ 'P', 'ጵ' ],
+ [ '(x|X)', 'ጽ' ],
+ [ '(ጽx|ጽX)', 'ፅ' ],
+ [ '(f|F)', 'ፍ' ],
+ [ 'p', 'ፕ' ],
+
+ // consonant-vowel orders
+ [ 'ህe', 'ሀ' ],
+ [ 'ህu', 'ሁ' ],
+ [ 'ህi', 'ሂ' ],
+ [ 'ህa', 'ሃ' ],
+ [ '(ሂe|ህE)', 'ሄ' ],
+ [ 'ህo', 'ሆ' ],
+
+ [ 'ልe', 'ለ' ],
+ [ 'ልu', 'ሉ' ],
+ [ 'ልi', 'ሊ' ],
+ [ 'ልa', 'ላ' ],
+ [ '(ሊe|ልE)', 'ሌ' ],
+ [ 'ልo', 'ሎ' ],
+ [ 'ሉa', 'ሏ' ], // et
+
+ [ 'ሕe', 'ሐ' ],
+ [ 'ሕu', 'ሑ' ],
+ [ 'ሕi', 'ሒ' ],
+ [ 'ሕa', 'ሓ' ],
+ [ '(ሒe|ሕE)', 'ሔ' ],
+ [ 'ሕo', 'ሖ' ],
+ [ 'ሑa', 'ሗ' ], // et
+
+ [ 'ምe', 'መ' ],
+ [ 'ምu', 'ሙ' ],
+ [ 'ምi', 'ሚ' ],
+ [ 'ምa', 'ማ' ],
+ [ '(ሚe|ምE)', 'ሜ' ],
+ [ 'ምo', 'ሞ' ],
+ [ 'ሙa', 'ሟ' ], // et
+
+ [ 'ርe', 'ረ' ],
+ [ 'ርu', 'ሩ' ],
+ [ 'ርi', 'ሪ' ],
+ [ 'ርa', 'ራ' ],
+ [ '(ሪe|ርE)', 'ሬ' ],
+ [ 'ርo', 'ሮ' ],
+ [ 'ሩa', 'ሯ' ], // et
+
+ [ 'ሥe', 'ሠ' ],
+ [ 'ሥu', 'ሡ' ],
+ [ 'ሥi', 'ሢ' ],
+ [ 'ሥa', 'ሣ' ],
+ [ '(ሢe|ሥE)', 'ሤ' ],
+ [ 'ሥo', 'ሦ' ],
+ [ 'ሡa', 'ሧ' ], // et
+
+ [ 'ስe', 'ሰ' ],
+ [ 'ስu', 'ሱ' ],
+ [ 'ስi', 'ሲ' ],
+ [ 'ስa', 'ሳ' ],
+ [ '(ሲe|ስE)', 'ሴ' ],
+ [ 'ስo', 'ሶ' ],
+ [ 'ሱa', 'ሷ' ], // et
+
+ [ 'ሽe', 'ሸ' ],
+ [ 'ሽu', 'ሹ' ],
+ [ 'ሽi', 'ሺ' ],
+ [ 'ሽa', 'ሻ' ],
+ [ '(ሺe|ሽE)', 'ሼ' ],
+ [ 'ሽo', 'ሾ' ],
+ [ 'ሹa', 'ሿ' ], // et
+
+ [ 'ቅe', 'ቀ' ],
+ [ 'ቅu', 'ቁ' ],
+ [ 'ቅi', 'ቂ' ],
+ [ 'ቅa', 'ቃ' ],
+ [ '(ቂe|ቅE)', 'ቄ' ],
+ [ 'ቅo', 'ቆ' ],
+
+ [ 'ቁe', 'ቈ' ],
+ [ 'ቁi', 'ቊ' ],
+ [ 'ቁa', 'ቋ' ],
+ [ 'ቊe', 'ቌ' ],
+ [ 'ቅW', 'ቍ' ],
+
+ [ 'ቕe', 'ቐ' ],
+ [ 'ቕu', 'ቑ' ],
+ [ 'ቕi', 'ቒ' ],
+ [ 'ቕa', 'ቓ' ],
+ [ '(ቒe|ቕE)', 'ቔ' ],
+ [ 'ቕo', 'ቖ' ],
+
+ [ 'ቑe', 'ቘ' ],
+ [ 'ቑi', 'ቚ' ],
+ [ 'ቑa', 'ቛ' ],
+ [ 'ቚe', 'ቜ' ],
+ [ 'ቕW', 'ቝ' ],
+
+ [ 'ብe', 'በ' ],
+ [ 'ብu', 'ቡ' ],
+ [ 'ብi', 'ቢ' ],
+ [ 'ብa', 'ባ' ],
+ [ '(ቢe|ብE)', 'ቤ' ],
+ [ 'ብo', 'ቦ' ],
+ [ 'ቡa', 'ቧ' ], // et
+
+ [ 'ቭe', 'ቨ' ],
+ [ 'ቭu', 'ቩ' ],
+ [ 'ቭi', 'ቪ' ],
+ [ 'ቭa', 'ቫ' ],
+ [ '(ቪe|ቭE)', 'ቬ' ],
+ [ 'ቭo', 'ቮ' ],
+ [ 'ቩa', 'ቯ' ], // et
+
+ [ 'ትe', 'ተ' ],
+ [ 'ትu', 'ቱ' ],
+ [ 'ትi', 'ቲ' ],
+ [ 'ትa', 'ታ' ],
+ [ '(ቲe|ትE)', 'ቴ' ],
+ [ 'ትo', 'ቶ' ],
+ [ 'ቱa', 'ቷ' ], // et
+
+ [ 'ችe', 'ቸ' ],
+ [ 'ችu', 'ቹ' ],
+ [ 'ችi', 'ቺ' ],
+ [ 'ችa', 'ቻ' ],
+ [ '(ቺe|ችE)', 'ቼ' ],
+ [ 'ችo', 'ቾ' ],
+ [ 'ቹa', 'ቿ' ], // et
+
+ [ 'ኅe', 'ኀ' ],
+ [ 'ኅu', 'ኁ' ],
+ [ 'ኅi', 'ኂ' ],
+ [ 'ኅa', 'ኃ' ],
+ [ '(ኂe|ኅE)', 'ኄ' ],
+ [ 'ኅo', 'ኆ' ],
+
+ [ 'ኁe', 'ኈ' ],
+ [ 'ኈi', 'ኊ' ],
+ [ 'ኈa', 'ኋ' ],
+ [ 'ኊe', 'ኌ' ],
+ [ 'ኅW', 'ኍ' ],
+
+ [ 'ንe', 'ነ' ],
+ [ 'ንu', 'ኑ' ],
+ [ 'ንi', 'ኒ' ],
+ [ 'ንa', 'ና' ],
+ [ '(ኒe|ንE)', 'ኔ' ],
+ [ 'ንo', 'ኖ' ],
+ [ 'ኑa', 'ኗ' ], // et
+
+ [ 'ኝe', 'ኘ' ],
+ [ 'ኝu', 'ኙ' ],
+ [ 'ኝi', 'ኚ' ],
+ [ 'ኝa', 'ኛ' ],
+ [ '(ኚe|ኝE)', 'ኜ' ],
+ [ 'ኝo', 'ኞ' ],
+ [ 'ኙa', 'ኟ' ], // et
+
+ [ 'ክe', 'ከ' ],
+ [ 'ክu', 'ኩ' ],
+ [ 'ክi', 'ኪ' ],
+ [ 'ክa', 'ካ' ],
+ [ '(ኪe|ክE)', 'ኬ' ],
+ [ 'ክo', 'ኮ' ],
+
+ [ 'ኩe', 'ኰ' ],
+ [ 'ኩi', 'ኲ' ],
+ [ 'ኩa', 'ኳ' ],
+ [ 'ኲe', 'ኴ' ],
+ [ 'ክW', 'ኵ' ],
+
+ [ 'ኽe', 'ኸ' ],
+ [ 'ኽu', 'ኹ' ],
+ [ 'ኽi', 'ኺ' ],
+ [ 'ኽa', 'ኻ' ],
+ [ '(ኺe|ኽE)', 'ኼ' ],
+ [ 'ኽo', 'ኾ' ],
+
+ [ 'ኹe', 'ዀ' ],
+ [ 'ኹi', 'ዂ' ],
+ [ 'ኹa', 'ዃ' ],
+ [ 'ዂe', 'ዄ' ],
+ [ 'ኽW', 'ዅ' ],
+
+ [ 'ውe', 'ወ' ],
+ [ 'ውu', 'ዉ' ],
+ [ 'ውi', 'ዊ' ],
+ [ 'ውa', 'ዋ' ],
+ [ '(ዊe|ውE)', 'ዌ' ],
+ [ 'ውo', 'ዎ' ],
+
+ [ 'ዝe', 'ዘ' ],
+ [ 'ዝu', 'ዙ' ],
+ [ 'ዝi', 'ዚ' ],
+ [ 'ዝa', 'ዛ' ],
+ [ '(ዚe|ዝE)', 'ዜ' ],
+ [ 'ዝo', 'ዞ' ],
+ [ 'ዙa', 'ዟ' ], // et
+
+ [ 'ዥe', 'ዠ' ],
+ [ 'ዥu', 'ዡ' ],
+ [ 'ዥi', 'ዢ' ],
+ [ 'ዥa', 'ዣ' ],
+ [ '(ዢe|ዥE)', 'ዤ' ],
+ [ 'ዥo', 'ዦ' ],
+ [ 'ዡa', 'ዧ' ], // et
+
+ [ 'ይe', 'የ' ],
+ [ 'ይu', 'ዩ' ],
+ [ 'ይi', 'ዪ' ],
+ [ 'ይa', 'ያ' ],
+ [ '(ዪe|ይE)', 'ዬ' ],
+ [ 'ይo', 'ዮ' ],
+
+ [ 'ድe', 'ደ' ],
+ [ 'ድu', 'ዱ' ],
+ [ 'ድi', 'ዲ' ],
+ [ 'ድa', 'ዳ' ],
+ [ '(ዲe|ድE)', 'ዴ' ],
+ [ 'ድo', 'ዶ' ],
+ [ 'ዱa', 'ዷ' ], // et
+
+ [ 'ጅe', 'ጀ' ],
+ [ 'ጅu', 'ጁ' ],
+ [ 'ጅi', 'ጂ' ],
+ [ 'ጅa', 'ጃ' ],
+ [ '(ጂe|ጅE)', 'ጄ' ],
+ [ 'ጅo', 'ጆ' ],
+ [ 'ጁa', 'ጇ' ], // et
+
+ [ 'ግe', 'ገ' ],
+ [ 'ግu', 'ጉ' ],
+ [ 'ግi', 'ጊ' ],
+ [ 'ግa', 'ጋ' ],
+ [ '(ጊe|ግE)', 'ጌ' ],
+ [ 'ግo', 'ጎ' ],
+
+ [ 'ጉe', 'ጐ' ],
+ [ 'ጉi', 'ጒ' ],
+ [ 'ጉa', 'ጓ' ],
+ [ 'ጒe', 'ጔ' ],
+ [ 'ግW', 'ጕ' ],
+
+ [ 'ጝe', 'ጘ' ],
+ [ 'ጝu', 'ጙ' ],
+ [ 'ጝi', 'ጚ' ],
+ [ 'ጝa', 'ጛ' ],
+ [ '(ጚe|ጝE)', 'ጜ' ],
+ [ 'ጝo', 'ጞ' ],
+
+ [ 'ጙe', 'ⶓ' ],
+ [ 'ጙi', 'ⶔ' ],
+ [ 'ጙa', 'ጟ' ],
+ [ '(ⶔe|ⶔE)', 'ⶕ' ],
+ [ 'ጝW', 'ⶖ' ],
+
+ [ 'ጥe', 'ጠ' ],
+ [ 'ጥu', 'ጡ' ],
+ [ 'ጥi', 'ጢ' ],
+ [ 'ጥa', 'ጣ' ],
+ [ '(ጢe|ጥE)', 'ጤ' ],
+ [ 'ጥo', 'ጦ' ],
+ [ 'ጡa', 'ጧ' ], // et
+
+ [ 'ጭe', 'ጨ' ],
+ [ 'ጭu', 'ጩ' ],
+ [ 'ጭi', 'ጪ' ],
+ [ 'ጭa', 'ጫ' ],
+ [ '(ጪe|ጭE)', 'ጬ' ],
+ [ 'ጭo', 'ጮ' ],
+ [ 'ጩa', 'ጯ' ], // et
+
+ [ 'ጵe', 'ጰ' ],
+ [ 'ጵu', 'ጱ' ],
+ [ 'ጵi', 'ጲ' ],
+ [ 'ጵa', 'ጳ' ],
+ [ '(ጲe|ጵE)', 'ጴ' ],
+ [ 'ጵo', 'ጶ' ],
+ [ 'ጱa', 'ጷ' ],
+
+ [ 'ጽe', 'ጸ' ],
+ [ 'ጽu', 'ጹ' ],
+ [ 'ጽi', 'ጺ' ],
+ [ 'ጽa', 'ጻ' ],
+ [ '(ጺe|ጽE)', 'ጼ' ],
+ [ 'ጽo', 'ጾ' ],
+ [ 'ጹa', 'ጿ' ], // et
+
+ [ 'ፅe', 'ፀ' ],
+ [ 'ፅu', 'ፁ' ],
+ [ 'ፅi', 'ፂ' ],
+ [ 'ፅa', 'ፃ' ],
+ [ '(ፂe|ፅE)', 'ፄ' ],
+ [ 'ፅo', 'ፆ' ],
+
+ [ 'ፍe', 'ፈ' ],
+ [ 'ፍu', 'ፉ' ],
+ [ 'ፍi', 'ፊ' ],
+ [ 'ፍa', 'ፋ' ],
+ [ '(ፈe|ፍE)', 'ፌ' ],
+ [ 'ፍo', 'ፎ' ],
+ [ 'ፉa', 'ፏ' ], // et
+
+ [ 'ፕe', 'ፐ' ],
+ [ 'ፕu', 'ፑ' ],
+ [ 'ፕi', 'ፒ' ],
+ [ 'ፕa', 'ፓ' ],
+ [ '(ፒe|ፕE)', 'ፔ' ],
+ [ 'ፕo', 'ፖ' ],
+ [ 'ፑa', 'ፗ' ], // et
+
+ [ 'O', 'ዕ' ],
+ [ 'ዕe', 'ዐ' ],
+ [ 'ዕu', 'ዑ' ],
+ [ 'ዕi', 'ዒ' ],
+ [ 'ዕa', 'ዓ' ],
+ [ '(ዒe|ዕE)', 'ዔ' ],
+ [ 'ዕo', 'ዖ' ],
+
+ // vowels
+ [ 'A', 'እ' ],
+ [ '(እu|u)', 'ኡ' ],
+ [ '(እi|i)', 'ኢ' ],
+ [ '(እa|a)', 'ኣ' ],
+ [ '(ኢe|እE)', 'ኤ' ],
+ [ '(እe|e)', 'አ' ],
+ [ '(እo|o)', 'ኦ' ],
+ [ 'አa', 'ኧ' ], // et
+
+ // punctuations
+ [ ',', '፣' ],
+ [ '።\\.', '.' ],
+ [ '(\\.|፡;)', '።' ],
+ [ '\\;', '፡' ],
+ [ '\\?\\?', '፧' ],
+ [ '፡-', '፦' ],
+ [ '።-', '፨' ],
+ [ '\\:', '፤' ],
+
+ // Geez Numerals
+ [ '1^', '፩' ], // 1
+ [ '2^', '፪' ], // 2
+ [ '3^', '፫' ], // 3
+ [ '4^', '፬' ], // 4
+ [ '5^', '፭' ], // 5
+ [ '6^', '፮' ], // 6
+ [ '7^', '፯' ], // 7
+ [ '8^', '፰' ], // 8
+ [ '9^', '፱' ], // 9
+
+ [ '፩0', '፲' ], // 10
+ [ '፪0', '፳' ], // 20
+ [ '፫0', '፴' ], // 30
+ [ '፬0', '፵' ], // 40
+ [ '፭0', '፶' ], // 50
+ [ '፮0', '፷' ], // 60
+ [ '፯0', '፸' ], // 70
+ [ '፰0', '፹' ], // 80
+ [ '፱0', '፺' ], // 90
+
+ [ '፲0', '፻' ], // 100
+ [ '፳0', '፪፻' ], // 200
+ [ '፴0', '፫፻' ], // 300
+ [ '፵0', '፬፻' ], // 400
+ [ '፶0', '፭፻' ], // 500
+ [ '፷0', '፮፻' ], // 600
+ [ '፸0', '፯፻' ], // 700
+ [ '፹0', '፰፻' ], // 800
+ [ '፺0', '፱፻' ], // 900
+
+ [ '፻0', '፲፻' ], // 1000
+ [ '፲፻0', '፼' ] // 10,000
+ ]
+ };
+
+ $.ime.register( bynGeezim );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-arkbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-arkbd.js
new file mode 100644
index 00000000..37ad7e59
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-arkbd.js
@@ -0,0 +1,103 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ckbTransliterationArkbd = {
+ id: 'ckb-transliteration-arkbd',
+ name: 'باشووری',
+ description: 'Central Kurdish keyboard based on Arabic keyboard',
+ date: '2013-07-06',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Çalak',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', 'ژ' ],
+ [ '1', '١' ],
+ [ '2', '٢' ],
+ [ '3', '٣' ],
+ [ '4', '٤' ],
+ [ '5', '٥' ],
+ [ '6', '٦' ],
+ [ '7', '٧' ],
+ [ '8', '٨' ],
+ [ '9', '٩' ],
+ [ '0', '٠' ],
+
+ [ 'q', 'چ' ],
+ [ 'w', 'ص' ],
+ [ 'e', 'پ' ],
+ [ 'r', 'ق' ],
+ [ 't', 'ف' ],
+ [ 'y', 'غ' ],
+ [ 'u', 'ع' ],
+ [ 'i', 'ھ' ],
+ [ 'o', 'خ' ],
+ [ 'p', 'ح' ],
+ [ '\\[', 'ج' ],
+ [ '\\]', 'د' ],
+
+ [ 'a', 'ش' ],
+ [ 's', 'س' ],
+ [ 'd', 'ی' ],
+ [ 'f', 'ب' ],
+ [ 'g', 'ل' ],
+ [ 'h', 'ا' ],
+ [ 'j', 'ت' ],
+ [ 'k', 'ن' ],
+ [ 'l', 'م' ],
+ [ '\\;', 'ک' ],
+ [ '\'', 'گ' ],
+
+ [ 'z', 'ئ' ],
+ [ 'x', 'ء' ],
+ [ 'c', 'ۆ' ],
+ [ 'v', 'ر' ],
+ [ 'b', 'لا' ],
+ [ 'n', 'ى' ],
+ [ 'm', 'ە' ],
+ [ '\\,', 'و' ],
+ [ '\\.', 'ز' ],
+
+ [ '\\%', '٪' ],
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+
+ [ 'Q', 'ض' ],
+ [ 'W', '}' ],
+ [ 'E', 'ث' ],
+ [ 'R', '{' ],
+ [ 'T', 'ڤ' ],
+ [ 'Y', 'إ' ],
+ [ 'U', 'ۊ' ],
+ [ 'I', '\'' ],
+ [ 'O', '"' ],
+ [ 'P', '؛' ],
+ [ '\\{', '>' ],
+ [ '\\}', '<' ],
+
+ [ 'A', '[' ],
+ [ 'S', ']' ],
+ [ 'D', 'ێ' ],
+ [ 'F', '' ],
+ [ 'G', 'ڵ' ],
+ [ 'H', 'أ' ],
+ [ 'J', 'ـ' ],
+ [ 'K', '،' ],
+ [ 'L', '\\' ],
+ [ '"', 'ط' ],
+
+ [ 'Z', 'ڎ' ],
+ [ 'X', 'وو' ],
+ [ 'C', 'ؤ' ],
+ [ 'V', 'ڕ' ],
+ [ 'B', 'ڵا' ],
+ [ 'N', 'آ' ],
+ [ 'M', 'ة' ],
+ [ '\\<', '٫' ],
+ [ '\\>', '.' ],
+ [ '\\?', '؟' ]
+ ]
+ };
+
+ $.ime.register( ckbTransliterationArkbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-fakbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-fakbd.js
new file mode 100644
index 00000000..be44bd7a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-fakbd.js
@@ -0,0 +1,104 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ckbTransliterationFakbd = {
+ id: 'ckb-transliteration-fakbd',
+ name: 'ڕۆژھەڵاتی',
+ description: 'Central Kurdish keyboard based on Persian keyboard',
+ date: '2013-07-06',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Çalak',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', 'پ' ],
+ [ '1', '١' ],
+ [ '2', '٢' ],
+ [ '3', '٣' ],
+ [ '4', '٤' ],
+ [ '5', '٥' ],
+ [ '6', '٦' ],
+ [ '7', '٧' ],
+ [ '8', '٨' ],
+ [ '9', '٩' ],
+ [ '0', '٠' ],
+
+ [ 'q', 'ڵ' ],
+ [ 'w', 'ۆ' ],
+ [ 'e', 'ێ' ],
+ [ 'r', 'ق' ],
+ [ 't', 'ف' ],
+ [ 'y', 'غ' ],
+ [ 'u', 'ع' ],
+ [ 'i', 'ە' ],
+ [ 'o', 'خ' ],
+ [ 'p', 'ح' ],
+ [ '\\[', 'ج' ],
+ [ '\\]', 'چ' ],
+ [ '\\\\', 'ژ' ],
+
+ [ 'a', 'ش' ],
+ [ 's', 'س' ],
+ [ 'd', 'ی' ],
+ [ 'f', 'ب' ],
+ [ 'g', 'ل' ],
+ [ 'h', 'ا' ],
+ [ 'j', 'ت' ],
+ [ 'k', 'ن' ],
+ [ 'l', 'م' ],
+ [ '\\;', 'ک' ],
+ [ '\'', 'گ' ],
+
+ [ 'z', 'ڤ' ],
+ [ 'x', 'ھ' ],
+ [ 'c', 'ز' ],
+ [ 'v', 'ر' ],
+ [ 'b', 'ڕ' ],
+ [ 'n', 'د' ],
+ [ 'm', 'ئ' ],
+ [ '\\,', 'و' ],
+ [ '\\.', '.' ],
+ [ '/', '/' ],
+
+ [ '\\%', '٪' ],
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+
+ [ 'Q', 'ض' ],
+ [ 'W', 'ص' ],
+ [ 'E', 'ث' ],
+ [ 'R', 'ك' ],
+ [ 'T', '،' ],
+ [ 'Y', '؛' ],
+ [ 'U', '\\' ],
+ [ 'I', ']' ],
+ [ 'O', '[' ],
+ [ 'P', '\'' ],
+ [ '\\{', '}' ],
+ [ '\\}', '{' ],
+
+ [ 'A', 'ڎ' ],
+ [ 'S', 'إ' ],
+ [ 'D', 'ي' ],
+ [ 'F', 'ة' ],
+ [ 'G', 'ۀ' ],
+ [ 'H', 'آ' ],
+ [ 'J', 'ـ' ],
+ [ 'K', '»' ],
+ [ 'L', '«' ],
+
+ [ 'Z', 'ظ' ],
+ [ 'X', 'ط' ],
+ [ 'C', 'ژ' ],
+ [ 'V', 'ؤ' ],
+ [ 'B', 'ذ' ],
+ [ 'N', '\u200cأ' ],
+ [ 'M', 'ء' ],
+ [ '\\<', '>' ],
+ [ '\\>', '<' ],
+ [ '\\?', '؟' ]
+ ]
+ };
+
+ $.ime.register( ckbTransliterationFakbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-lakbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-lakbd.js
new file mode 100644
index 00000000..0a2000b1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ckb/ckb-transliteration-lakbd.js
@@ -0,0 +1,100 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ckbTransliterationLakbd = {
+ id: 'ckb-transliteration-lakbd',
+ name: 'لاتینی',
+ description: 'Central Kurdish keyboard based on Latin keyboard',
+ date: '2013-07-06',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Çalak',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '١' ],
+ [ '2', '٢' ],
+ [ '3', '٣' ],
+ [ '4', '٤' ],
+ [ '5', '٥' ],
+ [ '6', '٦' ],
+ [ '7', '٧' ],
+ [ '8', '٨' ],
+ [ '9', '٩' ],
+ [ '0', '٠' ],
+
+ [ 'q', 'ق' ],
+ [ 'w', 'و' ],
+ [ 'e', 'ە' ],
+ [ 'r', 'ر' ],
+ [ 't', 'ت' ],
+ [ 'y', 'ی' ],
+ [ 'u', 'ئ' ],
+ [ 'i', 'ح' ],
+ [ 'o', 'ۆ' ],
+ [ 'p', 'پ' ],
+ [ '\\[', ']' ],
+ [ '\\]', '[' ],
+
+ [ 'a', 'ا' ],
+ [ 's', 'س' ],
+ [ 'd', 'د' ],
+ [ 'f', 'ف' ],
+ [ 'g', 'گ' ],
+ [ 'h', 'ھ' ],
+ [ 'j', 'ژ' ],
+ [ 'k', 'ک' ],
+ [ 'l', 'ل' ],
+ [ '\\;', '؛' ],
+
+ [ 'z', 'ز' ],
+ [ 'x', 'خ' ],
+ [ 'c', 'ج' ],
+ [ 'v', 'ڤ' ],
+ [ 'b', 'ب' ],
+ [ 'n', 'ن' ],
+ [ 'm', 'م' ],
+ [ '\\,', '،' ],
+ [ '\\.', '.' ],
+
+ [ '\\%', '٪' ],
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+
+ [ 'Q', 'ڎ' ],
+ [ 'W', 'وو' ],
+ [ 'E', 'ێ' ],
+ [ 'R', 'ڕ' ],
+ [ 'T', 'ط' ],
+ [ 'Y', 'ي' ],
+ [ 'U', 'ء' ],
+ [ 'I', 'ع' ],
+ [ 'O', 'ؤ' ],
+ [ 'P', 'ث' ],
+ [ '\\{', '}' ],
+ [ '\\}', '{' ],
+
+ [ 'A', 'آ' ],
+ [ 'S', 'ش' ],
+ [ 'D', 'ذ' ],
+ [ 'F', 'إ' ],
+ [ 'G', 'غ' ],
+ [ 'H', 'ه' ],
+ [ 'J', 'أ' ],
+ [ 'K', 'ك' ],
+ [ 'L', 'ڵ' ],
+
+ [ 'Z', 'ض' ],
+ [ 'X', 'ص' ],
+ [ 'C', 'چ' ],
+ [ 'V', 'ظ' ],
+ [ 'B', 'ى' ],
+ [ 'N', 'ة' ],
+ [ 'M', 'ـ' ],
+ [ '\\<', '>' ],
+ [ '\\>', '<' ],
+ [ '\\?', '؟' ]
+ ]
+ };
+
+ $.ime.register( ckbTransliterationLakbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/cv/README.md b/UniversalLanguageSelector/lib/jquery.ime/rules/cv/README.md
new file mode 100644
index 00000000..069431a8
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/cv/README.md
@@ -0,0 +1,26 @@
+Chuvash keyboard layouts
+========================
+
+This directory contains different Chuvash keyboard layouts.
+
+The Chuvash alphabet contains all the 33 letters from the Russian alphabet and
+four additional letters: ӑ ӗ ҫ ӳ
+
+
+Chuvash AltGr — Чăвашла AltGr
+-----------------------------
+The default keyboard layout in [chuvash.org](http://chuvash.org) which uses
+the standard Russian keyboard layouts plus additional four Chuvash letters.
+They are typed using the AltGr button.
+
+Unfortunately only in firefox AltGr combinations work well.
+
+Chuvash Mercen — Căvašla Mercen
+-------------------------------
+This keyboard layout is based on [Mercen](https://sites.google.com/site/mercen77/)
+and comes from CVLat movement.
+
+"Chuvash Cyrillic"
+-----------------
+This keyboard layout is designed by Ikăruk and uses the number row buttons for
+adding the additional letters. No AltGr is needed.
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-cyr-altgr.js b/UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-cyr-altgr.js
new file mode 100644
index 00000000..761a2c3a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-cyr-altgr.js
@@ -0,0 +1,120 @@
+// This Chuvash keyboard layout is the "official" layout
+// in chuvash.org
+// This implementation is based on ru-jcuken ime rule
+// which supports both transliteration mode and the native jcuken
+// Along them there are four Chuvash letters ă ĕ ç ÿ
+// The keyboard layout is an agreement
+// of the Chuvash Language Committee 2009-03-12
+// http://comissi.chv.su/node/23
+// This layout differs from the agreement in that matter
+// that all letters are from the Cyrillic subset of Unicode
+
+( function ( $ ) {
+ 'use strict';
+
+ var cv = {
+ id: 'cv-cyr-altgr',
+ name: 'Чăвашла (AltGr)',
+ description: 'AltGr пускăчлă чăваш сарăмĕ',
+ date: '2013-03-24',
+ URL: 'http://comissi.chv.su/',
+ author: 'Anatoly Mironov, @mirontoli',
+ license: 'MIT',
+ version: '1.0',
+ patterns: [
+ [ 'Q', 'Й' ],
+ [ 'W', 'Ц' ],
+ [ 'E', 'У' ],
+ [ 'R', 'К' ],
+ [ 'T', 'Е' ],
+ [ 'Y', 'Н' ],
+ [ 'U', 'Г' ],
+ [ 'I', 'Ш' ],
+ [ 'O', 'Щ' ],
+ [ 'P', 'З' ],
+ [ '{', 'Х' ],
+ [ '}', 'Ъ' ],
+ [ 'A', 'Ф' ],
+ [ 'S', 'Ы' ],
+ [ 'D', 'В' ],
+ [ 'F', 'А' ],
+ [ 'G', 'П' ],
+ [ 'H', 'Р' ],
+ [ 'J', 'О' ],
+ [ 'K', 'Л' ],
+ [ 'L', 'Д' ],
+ [ ':', 'Ж' ],
+ [ '"', 'Э' ],
+ [ 'Z', 'Я' ],
+ [ 'X', 'Ч' ],
+ [ 'C', 'С' ],
+ [ 'V', 'М' ],
+ [ 'B', 'И' ],
+ [ 'N', 'Т' ],
+ [ 'M', 'Ь' ],
+ [ '<', 'Б' ],
+ [ '>', 'Ю' ],
+ [ '\\?', ',' ],
+
+ [ 'q', 'й' ],
+ [ 'w', 'ц' ],
+ [ 'e', 'у' ],
+ [ 'r', 'к' ],
+ [ 't', 'е' ],
+ [ 'y', 'н' ],
+ [ 'u', 'г' ],
+ [ 'i', 'ш' ],
+ [ 'o', 'щ' ],
+ [ 'p', 'з' ],
+ [ '\\[', 'х' ],
+ [ '\\]', 'ъ' ],
+ [ 'a', 'ф' ],
+ [ 's', 'ы' ],
+ [ 'd', 'в' ],
+ [ 'f', 'а' ],
+ [ 'g', 'п' ],
+ [ 'h', 'р' ],
+ [ 'j', 'о' ],
+ [ 'k', 'л' ],
+ [ 'l', 'д' ],
+ [ ';', 'ж' ],
+ [ '\'', 'э' ],
+ [ 'z', 'я' ],
+ [ 'x', 'ч' ],
+ [ 'c', 'с' ],
+ [ 'v', 'м' ],
+ [ 'b', 'и' ],
+ [ 'n', 'т' ],
+ [ 'm', 'ь' ],
+ [ ',', 'б' ],
+ [ '\\.', 'ю' ],
+ [ '/', '.' ],
+
+ [ '`', 'ё' ],
+ [ '~', 'Ё' ],
+
+ // ! is the same // 1
+ [ '@', '"' ], // 2
+ [ '#', '№' ], // 3
+ [ '\\$', ';' ], // 4
+ // '%' is the same // 5
+ [ '^', ':' ], // 6
+ [ '&', '?' ] // 7
+ // '*', '(' and ')' are the same // 8, 9, 0
+ ],
+ // support both qwerty and jcuken keyboards
+ patterns_x: [
+ [ 'f|а', 'ӑ' ],
+ [ 'F|А', 'Ӑ' ],
+ [ 't|е', 'ӗ' ],
+ [ 'T|Е', 'Ӗ' ],
+ [ 'c|с', 'ҫ' ],
+ [ 'C|С', 'Ҫ' ],
+ [ 'e|у', 'ӳ' ],
+ [ 'E|У', 'Ӳ' ]
+ ]
+ };
+
+ $.ime.register( cv );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-cyr-numbers.js b/UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-cyr-numbers.js
new file mode 100644
index 00000000..7a141624
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-cyr-numbers.js
@@ -0,0 +1,112 @@
+// This Chuvash keyboard layout is designed by Ikăruk
+// http://ru.wikipedia.org/wiki/Чувашские_раскладки_клавиатуры#Раскладка_«Chuvash_Cyrillic»
+// This uses the number row of the keyboard
+// as it is in Sakha keyboard layout, in Bashkir, Slovak and many more
+// Some other keys are added which are often used in wikipedia editing
+// all letters are from the Cyrillic subset of Unicode
+
+( function ( $ ) {
+ 'use strict';
+
+ var cv = {
+ id: 'cv-cyr-numbers',
+ name: 'Чăвашла (Цифрили)',
+ description: 'Икăрук туса хунă, цифрисене усă куракан сарăм',
+ date: '2013-03-24',
+ URL: 'http://comissi.chv.su/',
+ author: 'Anatoly Mironov, @mirontoli',
+ license: 'MIT',
+ version: '1.0',
+ patterns: [
+ [ 'Q', 'Й' ],
+ [ 'W', 'Ц' ],
+ [ 'E', 'У' ],
+ [ 'R', 'К' ],
+ [ 'T', 'Е' ],
+ [ 'Y', 'Н' ],
+ [ 'U', 'Г' ],
+ [ 'I', 'Ш' ],
+ [ 'O', 'Щ' ],
+ [ 'P', 'З' ],
+ [ '{', 'Х' ],
+ [ '}', 'Ъ' ],
+ [ 'A', 'Ф' ],
+ [ 'S', 'Ы' ],
+ [ 'D', 'В' ],
+ [ 'F', 'А' ],
+ [ 'G', 'П' ],
+ [ 'H', 'Р' ],
+ [ 'J', 'О' ],
+ [ 'K', 'Л' ],
+ [ 'L', 'Д' ],
+ [ ':', 'Ж' ],
+ [ '"', 'Э' ],
+ [ 'Z', 'Я' ],
+ [ 'X', 'Ч' ],
+ [ 'C', 'С' ],
+ [ 'V', 'М' ],
+ [ 'B', 'И' ],
+ [ 'N', 'Т' ],
+ [ 'M', 'Ь' ],
+ [ '<', 'Б' ],
+ [ '>', 'Ю' ],
+ [ '\\?', ',' ],
+
+ [ 'q', 'й' ],
+ [ 'w', 'ц' ],
+ [ 'e', 'у' ],
+ [ 'r', 'к' ],
+ [ 't', 'е' ],
+ [ 'y', 'н' ],
+ [ 'u', 'г' ],
+ [ 'i', 'ш' ],
+ [ 'o', 'щ' ],
+ [ 'p', 'з' ],
+ [ '\\[', 'х' ],
+ [ '\\]', 'ъ' ],
+ [ 'a', 'ф' ],
+ [ 's', 'ы' ],
+ [ 'd', 'в' ],
+ [ 'f', 'а' ],
+ [ 'g', 'п' ],
+ [ 'h', 'р' ],
+ [ 'j', 'о' ],
+ [ 'k', 'л' ],
+ [ 'l', 'д' ],
+ [ ';', 'ж' ],
+ [ '\'', 'э' ],
+ [ 'z', 'я' ],
+ [ 'x', 'ч' ],
+ [ 'c', 'с' ],
+ [ 'v', 'м' ],
+ [ 'b', 'и' ],
+ [ 'n', 'т' ],
+ [ 'm', 'ь' ],
+ [ ',', 'б' ],
+ [ '\\.', 'ю' ],
+ [ '/', '.' ],
+
+ [ '`', 'ё' ],
+ [ '~', 'Ё' ],
+ [ '1', '?' ], // 1
+ [ '2', '\'' ], // 2
+ [ '@', '"' ], // 2
+ [ '3', 'ҫ' ], // 3
+ [ '#|№', 'Ҫ' ], // 3
+ [ '4', '|' ], // 4
+ [ '\\$', ';' ], // 4
+ [ '5', 'ӳ' ], // 5
+ [ '%', 'Ӳ' ], // 5
+ [ '6', '—' ], // 6
+ [ '\\^', ':' ], // 6
+ [ '7', 'ӗ' ], // 7
+ [ '&|\\?', 'Ӗ' ], // 7
+ [ '8', 'ӑ' ], // 8
+ [ '\\*', 'Ӑ' ], // 8
+ [ '9', '[' ], // 9
+ [ '0', ']' ] // 0
+ ]
+ };
+
+ $.ime.register( cv );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-lat-altgr.js b/UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-lat-altgr.js
new file mode 100644
index 00000000..c1bcb8f5
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/cv/cv-lat-altgr.js
@@ -0,0 +1,34 @@
+// This Chuvash keyboard is a stripped version of latin Mercen
+// https://sites.google.com/site/mercen77/
+// http://cvlat.blogspot.com
+// Only Chuvash diacritics are used, no additional letters
+// for Turkish or dead keys implemented (for now?)
+
+( function ( $ ) {
+ 'use strict';
+
+ var cv = {
+ id: 'cv-lat-altgr',
+ name: 'Căvašla - Mercen',
+ description: 'CVLat usă kurakan Mercen',
+ date: '2013-03-21',
+ URL: 'https://sites.google.com/site/mercen77/',
+ author: 'Anatoly Mironov, @mirontoli',
+ license: 'MIT',
+ version: '1.0',
+ patterns_x: [
+ [ 'a', 'ă' ],
+ [ 'A', 'Ă' ],
+ [ 'e', 'ĕ' ],
+ [ 'E', 'Ĕ' ],
+ [ 's', 'ş' ],
+ [ 'S', 'Ş' ],
+ [ 'd|h', 'š' ],
+ [ 'D|H', 'Š' ],
+ [ 'w|u', 'ü' ],
+ [ 'W|U', 'Ü' ]
+ ]
+ };
+
+ $.ime.register( cv );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/cyrl/cyrl-palochka.js b/UniversalLanguageSelector/lib/jquery.ime/rules/cyrl/cyrl-palochka.js
new file mode 100644
index 00000000..a08d4975
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/cyrl/cyrl-palochka.js
@@ -0,0 +1,59 @@
+/**
+ * An input method for the Cyrillic alphabet with palochka, which is used by many languages in the
+ * North Caucasus region. Most keyboard layouts don't support this letter, so people frequently type
+ * other similarly looking characters instead, but this causes various problems, for example when
+ * automatically converting from uppercase to lowercase and vice-versa.
+ *
+ * This layout assumes that the standard Russian keyboard layout is used. All the rules produce the
+ * same character palochka, and the characters used are the same that are often used by the speakers
+ * of these languages online:
+ * 1. Latin small 'l'.
+ * 2. Latin capital 'I'.
+ * 3. Ukrainian capital 'І'.
+ * 4. Alt-1 (the digit one).
+ * 5. Alt-д (Cyrillic small 'de', on the same key as Latin 'l').
+ * 6. Alt-ш (Cyrillic small 'sha', on the same key as Latin 'i').
+ * 7. Alt-Ш (Cyrillic capital 'sha', on the same key as Latin 'I').
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ var cyrlPalochka,
+ // All the characters are very similar in appearance,
+ // so it's better to give them names to avoid confusion.
+ latinSmallL = 'l',
+ latinCapitalI = 'I',
+ ukrainianCapitalI = 'І',
+ palochka = 'Ӏ',
+ digitOne = '1';
+
+ cyrlPalochka = {
+ id: 'cyrl-palochka',
+ name: 'Cyrillic Palochka',
+ description: 'Palochka input method for Cyrillic',
+ date: '2012-10-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.1',
+ contextLength: 2,
+ maxKeyLength: 3,
+ patterns: [
+ [ '~~' + digitOne, '~~', '~1' ],
+ [ '~' + digitOne, palochka ],
+ [ latinSmallL, palochka ],
+ [ latinCapitalI, palochka ],
+ [ ukrainianCapitalI, palochka ]
+ ],
+ patterns_x: [
+ [ digitOne, palochka ],
+ [ 'д', palochka ],
+ [ 'ш', palochka ],
+ [ 'Ш', palochka ]
+ ]
+ };
+
+ $.ime.register( cyrlPalochka );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/da/da-normforms.js b/UniversalLanguageSelector/lib/jquery.ime/rules/da/da-normforms.js
new file mode 100644
index 00000000..382cd0f3
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/da/da-normforms.js
@@ -0,0 +1,49 @@
+( function ( $ ) {
+ 'use strict';
+
+ var defs = {
+ id: 'da-normforms',
+ name: 'Dansk',
+ description: 'Danish input method with most common form transliterated',
+ date: '2012-12-04',
+ URL: 'http://www.evertype.com/alphabets/danish.pdf',
+ author: 'John Erling Blad',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 3,
+ patterns: [
+ // The most common transliterations
+ [ 'aa', 'å' ],
+ [ 'AA', 'Å' ],
+ [ 'Aa', 'Å' ],
+ [ 'ae', 'æ' ],
+ [ 'AE', 'Æ' ],
+ [ 'Ae', 'Æ' ],
+ [ 'oe', 'ø' ],
+ [ 'OE', 'Ø' ],
+ [ 'Oe', 'Ø' ],
+ // The previous as negated transliterations, mostly for names
+ [ 'åa', 'a', 'aa' ],
+ [ 'ÅA', 'A', 'AA' ],
+ [ 'Åa', 'A', 'Aa' ],
+ [ 'åA', 'a', 'aA' ],
+ [ 'æe', 'e', 'ae' ],
+ [ 'ÆE', 'E', 'AE' ],
+ [ 'Æe', 'E', 'Ae' ],
+ [ 'æE', 'e', 'aE' ],
+ [ 'øe', 'e', 'oe' ],
+ [ 'ØE', 'E', 'OE' ],
+ [ 'Øe', 'E', 'Oe' ], // this fails for some names like "Øen"
+ [ 'øE', 'e', 'oE' ]
+ // historically similar forms
+ // "Å" is sometimes written as "Aa", and "å" as "aa", but in names
+ // it is not generally acceptable to use this transliteration. To
+ // handle those situations we need some oposite forms.
+ // There is a similar character "Å" for the length unit Angstrom,
+ // but this is not the upper case letter Å.
+ ]
+ };
+
+ $.ime.register( defs );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/dag/dag-alt.js b/UniversalLanguageSelector/lib/jquery.ime/rules/dag/dag-alt.js
new file mode 100644
index 00000000..0444c823
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/dag/dag-alt.js
@@ -0,0 +1,31 @@
+( function ( $ ) {
+ 'use strict';
+
+ var dagAlt = {
+ id: 'dag-alt',
+ name: 'Dagbani Alt',
+ description: 'Dagbani Alt',
+ date: '2017-05-27',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns_x: [
+ [ 'E', 'Ɛ' ],
+ [ 'e', 'ɛ' ],
+ // Both G and Y were requested by editors for Ɣ
+ [ 'G', 'Ɣ' ],
+ [ 'g', 'ɣ' ],
+ [ 'Y', 'Ɣ' ],
+ [ 'y', 'ɣ' ],
+ [ 'N', 'Ŋ' ],
+ [ 'n', 'ŋ' ],
+ [ 'O', 'Ɔ' ],
+ [ 'o', 'ɔ' ],
+ [ 'Z', 'Ʒ' ],
+ [ 'z', 'ʒ' ]
+ ]
+ };
+
+ $.ime.register( dagAlt );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/dag/dag-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/dag/dag-tilde.js
new file mode 100644
index 00000000..a1c57fbf
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/dag/dag-tilde.js
@@ -0,0 +1,32 @@
+( function ( $ ) {
+ 'use strict';
+
+ var dagTilde = {
+ id: 'dag-tilde',
+ name: 'Dagbani tilde',
+ description: 'Dagbani tilde',
+ date: '2019-05-07',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ // Both G and Y were requested by editors for Ɣ
+ [ '~G', 'Ɣ' ],
+ [ '~g', 'ɣ' ],
+ [ '~Y', 'Ɣ' ],
+ [ '~y', 'ɣ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~Z', 'Ʒ' ],
+ [ '~z', 'ʒ' ]
+ ]
+ };
+
+ $.ime.register( dagTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/de/de-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/de/de-transliteration.js
new file mode 100644
index 00000000..b4308196
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/de/de-transliteration.js
@@ -0,0 +1,27 @@
+( function ( $ ) {
+ 'use strict';
+
+ var de = {
+ id: 'de-transliteration',
+ name: 'Deutsch Tilde',
+ description: 'German input method',
+ date: '2012-11-20',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Erik Moeller',
+ license: 'Public domain',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 1,
+ patterns: [
+ [ '~A', 'Ä' ],
+ [ '~O', 'Ö' ],
+ [ '~U', 'Ü' ],
+ [ '~a', 'ä' ],
+ [ '~o', 'ö' ],
+ [ '~u', 'ü' ],
+ [ '~s', 'ß' ],
+ [ '~S', 'ß' ] ]
+ };
+
+ $.ime.register( de );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/din/din-fqsx.js b/UniversalLanguageSelector/lib/jquery.ime/rules/din/din-fqsx.js
new file mode 100644
index 00000000..a567d52d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/din/din-fqsx.js
@@ -0,0 +1,49 @@
+( function ( $ ) {
+ 'use strict';
+
+ var defs = {
+ id: 'din-fqsx',
+ name: 'FQSX replacement',
+ description: 'Dinka input method with F, Q, S and X replaced by Ɣ, Ŋ, Ɛ, and Ɔ',
+ date: '2017-04-26',
+ URL: 'https://keymanweb.com/#dib,Keyboard_dinkaweb11',
+ author: 'Amir E. Aharoni, based on Keyman',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 2,
+ maxKeyLength: 2,
+ patterns: [
+ [ '\\\\F', 'F' ],
+ [ '\\\\f', 'f' ],
+ [ '\\\\Q', 'Q' ],
+ [ '\\\\q', 'q' ],
+ [ '\\\\S', 'S' ],
+ [ '\\\\s', 's' ],
+ [ '\\\\X', 'X' ],
+ [ '\\\\x', 'x' ],
+ [ '\\\\;', ';' ],
+ [ 'A;', 'Ä' ],
+ [ 'a;', 'ä' ],
+ [ 'E;', 'Ë' ],
+ [ 'e;', 'ë' ],
+ [ 'Ɛ;', 'Ɛ̈' ],
+ [ 'ɛ;', 'ɛ̈' ],
+ [ 'I;', 'Ï' ],
+ [ 'i;', 'ï' ],
+ [ 'O;', 'Ö' ],
+ [ 'o;', 'ö' ],
+ [ 'Ɔ;', 'Ɔ̈' ],
+ [ 'ɔ;', 'ɔ̈' ],
+ [ 'F', 'Ɣ' ],
+ [ 'f', 'ɣ' ],
+ [ 'Q', 'Ŋ' ],
+ [ 'q', 'ŋ' ],
+ [ 'S', 'Ɛ' ],
+ [ 's', 'ɛ' ],
+ [ 'X', 'Ɔ' ],
+ [ 'x', 'ɔ' ]
+ ]
+ };
+
+ $.ime.register( defs );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/din/din-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/din/din-tilde.js
new file mode 100644
index 00000000..45230bb9
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/din/din-tilde.js
@@ -0,0 +1,28 @@
+( function ( $ ) {
+ 'use strict';
+
+ var dinTilde = {
+ id: 'din-tilde',
+ name: 'Dinka tilde',
+ description: 'Dinka tilde',
+ date: '2019-05-06',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~G', 'Ɣ' ],
+ [ '~g', 'ɣ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~:', '\u0308' ] // Combining diaeresis
+ ]
+ };
+
+ $.ime.register( dinTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/doi/doi-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/doi/doi-inscript2.js
new file mode 100644
index 00000000..56e5659f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/doi/doi-inscript2.js
@@ -0,0 +1,119 @@
+( function ( $ ) {
+ 'use strict';
+
+ var doiInScript2 = {
+ id: 'doi-inscript2',
+ name: 'डोगरी इनस्क्रिप्ट २',
+ description: 'Enhanced InScript keyboard for Dogri language',
+ date: '2013-02-13',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '\\#', '्र' ],
+ [ '3', '३' ],
+ [ '\\$', 'र्' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\]', ']' ],
+ [ '0', '०' ],
+ [ '\\_', 'ः' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ऋ' ],
+ [ '\\=', 'ृ' ],
+ [ 'Q', 'औ' ],
+ [ 'q", "ौ' ],
+ [ 'W', 'ऐ' ],
+ [ 'w', 'ै' ],
+ [ 'E', 'आ' ],
+ [ 'e', 'ा' ],
+ [ 'R', 'ई' ],
+ [ 'r', 'ी' ],
+ [ 'T', 'ऊ' ],
+ [ 't', 'ू' ],
+ [ 'Y', 'भ' ],
+ [ 'y', 'ब' ],
+ [ 'U', 'ङ' ],
+ [ 'u', 'ह' ],
+ [ 'I', 'घ' ],
+ [ 'i', 'ग' ],
+ [ 'O', 'ध' ],
+ [ 'o', 'द' ],
+ [ 'P', 'झ' ],
+ [ 'p', 'ज' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ञ' ],
+ [ '\\]', '़' ],
+ [ 'A', 'ओ' ],
+ [ 'a', 'ो' ],
+ [ 'S', 'ए' ],
+ [ 's', 'े' ],
+ [ 'D', 'अ' ],
+ [ 'd', '्' ],
+ [ 'F', 'इ' ],
+ [ 'f', 'ि' ],
+ [ 'G', 'उ' ],
+ [ 'g', 'ु' ],
+ [ 'H', 'फ' ],
+ [ 'h', 'प' ],
+ [ 'j', 'र' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'थ' ],
+ [ 'l', 'त' ],
+ [ ':', 'छ' ],
+ [ ';', 'च' ],
+ [ '"', 'ठ' ],
+ [ '\'', 'ट' ],
+ [ 'z', 'ʼ' ],
+ [ 'X', 'ँ' ],
+ [ 'C', 'ण' ],
+ [ 'c', 'म' ],
+ [ 'v', 'न' ],
+ [ 'b', 'व' ],
+ [ 'n', 'ल' ],
+ [ 'M', 'श' ],
+ [ 'm', 'स' ],
+ [ '\\<', 'ष' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'य' ],
+ [ '\\%', 'ज्ञ' ],
+ [ '\\^', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '\\+', 'ॠ' ],
+ [ '\\=', 'ृ' ],
+ [ 'e', '॑' ],
+ [ 'i', 'ग़' ],
+ [ 'R', 'ॡ' ],
+ [ 'r', 'ॣ' ],
+ [ 'p', 'ज़' ],
+ [ '\\{', 'ढ़' ],
+ [ '\\[', 'ड़' ],
+ [ 'd', '॒' ],
+ [ 'F', 'ऌ' ],
+ [ 'f', 'ॢ' ],
+ [ 'H', 'फ़' ],
+ [ 'X', 'ॐ' ],
+ [ 'N', 'ळ' ],
+ [ '\\>', 'ऽ' ],
+ [ '\\.', '॥' ] ]
+ };
+
+ $.ime.register( doiInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ee/ee-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ee/ee-tilde.js
new file mode 100644
index 00000000..8c80a5f7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ee/ee-tilde.js
@@ -0,0 +1,37 @@
+( function ( $ ) {
+ 'use strict';
+
+ var eeTilde = {
+ id: 'ee-tilde',
+ name: 'ee-tilde',
+ description: 'Ewe input keyboard',
+ date: '2018-11-30',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.1',
+ patterns: [
+ [ '~D', 'Ɖ' ],
+ [ '~d', 'ɖ' ],
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~F', 'Ƒ' ],
+ [ '~f', 'ƒ' ],
+ [ '~G', 'Ɣ' ],
+ [ '~g', 'ɣ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~V', 'Ʋ' ],
+ [ '~v', 'ʋ' ],
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~\\{', '\u0303' ], // Combining tilde
+ [ '~-', '\u0304' ], // Combining macron
+ [ '~\\^', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( eeTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/efi/efi-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/efi/efi-tilde.js
new file mode 100644
index 00000000..6bdae594
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/efi/efi-tilde.js
@@ -0,0 +1,30 @@
+( function ( $ ) {
+ 'use strict';
+
+ var efiTilde = {
+ id: 'efi-tilde',
+ name: 'efi-tilde',
+ description: 'Efik input keyboard',
+ date: '2022-05-23',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~E', 'Ẹ' ],
+ [ '~e', 'ẹ' ],
+ [ '~I', 'Ị' ],
+ [ '~i', 'ị' ],
+ [ '~N', 'N̄' ],
+ [ '~n', 'n̄' ],
+ [ '~O', 'Ọ' ],
+ [ '~o', 'ọ' ],
+ [ '~U', 'Ụ' ],
+ [ '~u', 'ụ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~/', '\u0301' ] // Combining acute
+ ]
+ };
+
+ $.ime.register( efiTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/el/el-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/el/el-kbd.js
new file mode 100644
index 00000000..223d1064
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/el/el-kbd.js
@@ -0,0 +1,96 @@
+( function ( $ ) {
+ 'use strict';
+
+ var elKbd = {
+ id: 'el-kbd',
+ name: 'Greek kbd',
+ description: 'Greek kbd keyboard layout',
+ date: '2013-02-11',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ '΄¨i', 'ΐ' ],
+ [ '¨΄i', 'ΐ' ],
+ [ '΄¨y', 'ΰ' ],
+ [ '¨΄y', 'ΰ' ],
+ [ '¨i', 'ϊ' ],
+ [ '¨y', 'ϋ' ],
+ [ '¨I', 'Ϊ' ],
+ [ '¨Y', 'Ϋ' ],
+ [ '΄a', 'ά' ],
+ [ '΄e', 'έ' ],
+ [ '΄h', 'ή' ],
+ [ '΄i', 'ί' ],
+ [ '΄o', 'ό' ],
+ [ '΄y', 'ύ' ],
+ [ '΄v', 'ώ' ],
+ [ '΄A', 'Ά' ],
+ [ '΄E', 'Έ' ],
+ [ '΄H', 'Ή' ],
+ [ '΄I', 'Ί' ],
+ [ '΄O', 'Ό' ],
+ [ '΄Y', 'Ύ' ],
+ [ '΄V', 'Ώ' ],
+ [ 'q', ';' ],
+ [ 'w', 'ς' ],
+ [ 'e', 'ε' ],
+ [ 'r', 'ρ' ],
+ [ 't', 'τ' ],
+ [ 'y', 'υ' ],
+ [ 'u', 'θ' ],
+ [ 'i', 'ι' ],
+ [ 'o', 'ο' ],
+ [ 'p', 'π' ],
+ [ '\\[', '[' ],
+ [ '\\]', ']' ],
+ [ 'a', 'α' ],
+ [ 's', 'σ' ],
+ [ 'd', 'δ' ],
+ [ 'f', 'φ' ],
+ [ 'g', 'γ' ],
+ [ 'h', 'η' ],
+ [ 'j', 'ξ' ],
+ [ 'k', 'κ' ],
+ [ 'l', 'λ' ],
+ [ ';', '΄' ],
+ [ 'z', 'ζ' ],
+ [ 'x', 'χ' ],
+ [ 'c', 'ψ' ],
+ [ 'v', 'ω' ],
+ [ 'b', 'β' ],
+ [ 'n', 'ν' ],
+ [ 'm', 'μ' ],
+ [ 'Q', ':' ],
+ [ 'W', 'Σ' ],
+ [ 'E', 'Ε' ],
+ [ 'R', 'Ρ' ],
+ [ 'T', 'Τ' ],
+ [ 'Y', 'Υ' ],
+ [ 'U', 'Θ' ],
+ [ 'I', 'Ι' ],
+ [ 'O', 'Ο' ],
+ [ 'P', 'Π' ],
+ [ 'A', 'Α' ],
+ [ 'S', 'Σ' ],
+ [ 'D', 'Δ' ],
+ [ 'F', 'Φ' ],
+ [ 'G', 'Γ' ],
+ [ 'H', 'Η' ],
+ [ 'J', 'Ξ' ],
+ [ 'K', 'Κ' ],
+ [ 'L', 'Λ' ],
+ [ ':', '¨' ],
+ [ 'Z', 'Ζ' ],
+ [ 'X', 'Χ' ],
+ [ 'C', 'Ψ' ],
+ [ 'V', 'Ω' ],
+ [ 'B', 'Β' ],
+ [ 'N', 'Ν' ],
+ [ 'M', 'Μ' ] ]
+ };
+
+ $.ime.register( elKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-h-f.js b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-h-f.js
new file mode 100644
index 00000000..0098b476
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-h-f.js
@@ -0,0 +1,59 @@
+( function ( $ ) {
+ 'use strict';
+
+ var eoHF = {
+ id: 'eo-h-f',
+ name: 'Espernto h-f',
+ description: 'writing Esperanto-letters using Zamenhof\'s fundamental system.',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'ĉh', 'ch' ],
+ [ 'ĝh', 'gh' ],
+ [ 'ĥh', 'hh' ],
+ [ 'ĵh', 'jh' ],
+ [ 'ŝh', 'sh' ],
+ [ 'aŭu', 'au' ],
+ [ 'eŭu', 'eu' ],
+ [ 'Ĉh', 'Ch' ],
+ [ 'Ĝh', 'Gh' ],
+ [ 'Ĥh', 'Hh' ],
+ [ 'Ĵh', 'Jh' ],
+ [ 'Ŝh', 'Sh' ],
+ [ 'Aŭu', 'Au' ],
+ [ 'Eŭu', 'Eu' ],
+ [ 'ĈH', 'CH' ],
+ [ 'ĜH', 'GH' ],
+ [ 'ĤH', 'HH' ],
+ [ 'ĴH', 'JH' ],
+ [ 'ŜH', 'SH' ],
+ [ 'AŬU', 'AU' ],
+ [ 'EŬU', 'EU' ],
+ [ 'ch', 'ĉ' ],
+ [ 'gh', 'ĝ' ],
+ [ 'hh', 'ĥ' ],
+ [ 'jh', 'ĵ' ],
+ [ 'sh', 'ŝ' ],
+ [ 'au', 'aŭ' ],
+ [ 'eu', 'eŭ' ],
+ [ 'Ch', 'Ĉ' ],
+ [ 'Gh', 'Ĝ' ],
+ [ 'Hh', 'Ĥ' ],
+ [ 'Jh', 'Ĵ' ],
+ [ 'Sh', 'Ŝ' ],
+ [ 'Au', 'Aŭ' ],
+ [ 'Eu', 'Eŭ' ],
+ [ 'CH', 'Ĉ' ],
+ [ 'GH', 'Ĝ' ],
+ [ 'HH', 'Ĥ' ],
+ [ 'JH', 'Ĵ' ],
+ [ 'SH', 'Ŝ' ],
+ [ 'AU', 'AŬ' ],
+ [ 'EU', 'EŬ' ] ]
+ };
+
+ $.ime.register( eoHF );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-h.js b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-h.js
new file mode 100644
index 00000000..fe6dcabf
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-h.js
@@ -0,0 +1,54 @@
+( function ( $ ) {
+ 'use strict';
+
+ var eoH = {
+ id: 'eo-h',
+ name: 'Esperanto h',
+ description: 'writing Esperanto-letters adding h\'s.',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'ĉh', 'ch' ],
+ [ 'ĝh', 'gh' ],
+ [ 'ĥh', 'hh' ],
+ [ 'ĵh', 'jh' ],
+ [ 'ŝh', 'sh' ],
+ [ 'ŭh', 'uh' ],
+ [ 'Ĉh', 'Ch' ],
+ [ 'Ĝh', 'Gh' ],
+ [ 'Ĥh', 'Hh' ],
+ [ 'Ĵh', 'Jh' ],
+ [ 'Ŝh', 'Sh' ],
+ [ 'Ŭh', 'Uh' ],
+ [ 'ĈH', 'CH' ],
+ [ 'ĜH', 'GH' ],
+ [ 'ĤH', 'HH' ],
+ [ 'ĴH', 'JH' ],
+ [ 'ŜH', 'SH' ],
+ [ 'ŬH', 'UH' ],
+
+ [ 'ch', 'ĉ' ],
+ [ 'gh', 'ĝ' ],
+ [ 'hh', 'ĥ' ],
+ [ 'jh', 'ĵ' ],
+ [ 'sh', 'ŝ' ],
+ [ 'uh', 'ŭ' ],
+ [ 'Ch', 'Ĉ' ],
+ [ 'Gh', 'Ĝ' ],
+ [ 'Hh', 'Ĥ' ],
+ [ 'Jh', 'Ĵ' ],
+ [ 'Sh', 'Ŝ' ],
+ [ 'Uh', 'Ŭ' ],
+ [ 'CH', 'Ĉ' ],
+ [ 'GH', 'Ĝ' ],
+ [ 'HH', 'Ĥ' ],
+ [ 'JH', 'Ĵ' ],
+ [ 'SH', 'Ŝ' ],
+ [ 'UH', 'Ŭ' ] ]
+ };
+
+ $.ime.register( eoH );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-plena.js b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-plena.js
new file mode 100644
index 00000000..8fe67a6c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-plena.js
@@ -0,0 +1,99 @@
+( function ( $ ) {
+ 'use strict';
+
+ var eoPlena = {
+ id: 'eo-plena',
+ name: 'Esperanto plena',
+ description: 'writing Esperanto-letters with the fundamental system and the X-system, like the default of EK.',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'ĉx', 'cx' ],
+ [ 'ĝx', 'gx' ],
+ [ 'ĥx', 'hx' ],
+ [ 'ĵx', 'jx' ],
+ [ 'ŝx', 'sx' ],
+ [ 'ŭx', 'ux' ],
+ [ 'Ĉx', 'Cx' ],
+ [ 'Ĝx', 'Gx' ],
+ [ 'Ĥx', 'Hx' ],
+ [ 'Ĵx', 'Jx' ],
+ [ 'Ŝx', 'Sx' ],
+ [ 'Ŭx', 'Ux' ],
+ [ 'ĈX', 'CX' ],
+ [ 'ĜX', 'GX' ],
+ [ 'ĤX', 'HX' ],
+ [ 'ĴX', 'JX' ],
+ [ 'ŜX', 'SX' ],
+ [ 'ŬX', 'UX' ],
+
+ [ 'ĉh', 'ch' ],
+ [ 'ĝh', 'gh' ],
+ [ 'ĥh', 'hh' ],
+ [ 'ĵh', 'jh' ],
+ [ 'ŝh', 'sh' ],
+ [ 'aŭu', 'au' ],
+ [ 'eŭu', 'eu' ],
+ [ 'Ĉh', 'Ch' ],
+ [ 'Ĝh', 'Gh' ],
+ [ 'Ĥh', 'Hh' ],
+ [ 'Ĵh', 'Jh' ],
+ [ 'Ŝh', 'Sh' ],
+ [ 'Aŭu', 'Au' ],
+ [ 'Eŭu', 'Eu' ],
+ [ 'ĈH', 'CH' ],
+ [ 'ĜH', 'GH' ],
+ [ 'ĤH', 'HH' ],
+ [ 'ĴH', 'JH' ],
+ [ 'ŜH', 'SH' ],
+ [ 'AŬU', 'AU' ],
+ [ 'EŬU', 'EU' ],
+
+ [ 'cx', 'ĉ' ],
+ [ 'gx', 'ĝ' ],
+ [ 'hx', 'ĥ' ],
+ [ 'jx', 'ĵ' ],
+ [ 'sx', 'ŝ' ],
+ [ 'ux', 'ŭ' ],
+ [ 'Cx', 'Ĉ' ],
+ [ 'Gx', 'Ĝ' ],
+ [ 'Hx', 'Ĥ' ],
+ [ 'Jx', 'Ĵ' ],
+ [ 'Sx', 'Ŝ' ],
+ [ 'Ux', 'Ŭ' ],
+ [ 'CX', 'Ĉ' ],
+ [ 'GX', 'Ĝ' ],
+ [ 'HX', 'Ĥ' ],
+ [ 'JX', 'Ĵ' ],
+ [ 'SX', 'Ŝ' ],
+ [ 'UX', 'Ŭ' ],
+
+ [ 'ch', 'ĉ' ],
+ [ 'gh', 'ĝ' ],
+ [ 'hh', 'ĥ' ],
+ [ 'jh', 'ĵ' ],
+ [ 'sh', 'ŝ' ],
+ [ 'au', 'aŭ' ],
+ [ 'eu', 'eŭ' ],
+ [ 'Ch', 'Ĉ' ],
+ [ 'Gh', 'Ĝ' ],
+ [ 'Hh', 'Ĥ' ],
+ [ 'Jh', 'Ĵ' ],
+ [ 'Sh', 'Ŝ' ],
+ [ 'Au', 'Aŭ' ],
+ [ 'Eu', 'Eŭ' ],
+ [ 'CH', 'Ĉ' ],
+ [ 'GH', 'Ĝ' ],
+ [ 'HH', 'Ĥ' ],
+ [ 'JH', 'Ĵ' ],
+ [ 'SH', 'Ŝ' ],
+ [ 'AU', 'AŬ' ],
+ [ 'EU', 'EŬ' ]
+ ]
+ };
+
+ $.ime.register( eoPlena );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-q.js b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-q.js
new file mode 100644
index 00000000..df721a5f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-q.js
@@ -0,0 +1,55 @@
+( function ( $ ) {
+ 'use strict';
+
+ var eoQ = {
+ id: 'eo-q',
+ name: 'Espernto q',
+ description: 'writing Esperanto-letters adding q\'s.',
+ date: '2013-02-09',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'ĉq', 'cq' ],
+ [ 'ĝq', 'gq' ],
+ [ 'ĥq', 'hq' ],
+ [ 'ĵq', 'jq' ],
+ [ 'ŝq', 'sq' ],
+ [ 'ŭq', 'uq' ],
+ [ 'Ĉq', 'Cq' ],
+ [ 'Ĝq', 'Gq' ],
+ [ 'Ĥq', 'Hq' ],
+ [ 'Ĵq', 'Jq' ],
+ [ 'Ŝq', 'Sq' ],
+ [ 'Ŭq', 'Uq' ],
+ [ 'ĈQ', 'CQ' ],
+ [ 'ĜQ', 'GQ' ],
+ [ 'ĤQ', 'HQ' ],
+ [ 'ĴQ', 'JQ' ],
+ [ 'ŜQ', 'SQ' ],
+ [ 'ŬQ', 'UQ' ],
+
+ [ 'cq', 'ĉ' ],
+ [ 'gq', 'ĝ' ],
+ [ 'hq', 'ĥ' ],
+ [ 'jq', 'ĵ' ],
+ [ 'sq', 'ŝ' ],
+ [ 'uq', 'ŭ' ],
+ [ 'Cq', 'Ĉ' ],
+ [ 'Gq', 'Ĝ' ],
+ [ 'Hq', 'Ĥ' ],
+ [ 'Jq', 'Ĵ' ],
+ [ 'Sq', 'Ŝ' ],
+ [ 'Uq', 'Ŭ' ],
+ [ 'CQ', 'Ĉ' ],
+ [ 'GQ', 'Ĝ' ],
+ [ 'HQ', 'Ĥ' ],
+ [ 'JQ', 'Ĵ' ],
+ [ 'SQ', 'Ŝ' ],
+ [ 'UQ', 'Ŭ' ] ]
+
+ };
+
+ $.ime.register( eoQ );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-transliteration.js
new file mode 100644
index 00000000..042c5347
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-transliteration.js
@@ -0,0 +1,49 @@
+( function ( $ ) {
+ 'use strict';
+
+ var eoTransliteration;
+
+ function prepareRules() {
+ var rules = [],
+ chars;
+
+ chars = {
+ C: 'Ĉ',
+ G: 'Ĝ',
+ H: 'Ĥ',
+ J: 'Ĵ',
+ S: 'Ŝ',
+ U: 'Ŭ',
+ c: 'ĉ',
+ g: 'ĝ',
+ h: 'ĥ',
+ j: 'ĵ',
+ s: 'ŝ',
+ u: 'ŭ'
+ };
+
+ // eslint-disable-next-line no-jquery/no-each-util
+ $.each( chars, function ( ascii, accented ) {
+ rules.push( [ ascii + '[Xx]', ascii, accented ] );
+ rules.push( [ accented + '([Xx])', '[Xx]', ascii + '$1' ] );
+ } );
+
+ return rules;
+ }
+
+ eoTransliteration = {
+ id: 'eo-transliteration',
+ name: 'Esperanto Transliteration',
+ description: 'Esperanto x-code transliteration',
+ date: '2012-10-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Brion Vibber',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 1,
+ patterns: prepareRules()
+ };
+
+ $.ime.register( eoTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-vi.js b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-vi.js
new file mode 100644
index 00000000..ce521b61
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-vi.js
@@ -0,0 +1,65 @@
+( function ( $ ) {
+ 'use strict';
+
+ var eoVi = {
+ id: 'eo-vi',
+ name: 'Esperanto vi',
+ description: 'writing Esperanto-letters using double key press (the X-system).',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'ĉc', 'cc' ],
+ [ 'ĝg', 'gg' ],
+ [ 'ĥh', 'hh' ],
+ [ 'ĵj', 'jj' ],
+ [ 'ŝs', 'ss' ],
+ [ 'ŭu', 'uu' ],
+ [ 'Ĉc', 'Cc' ],
+ [ 'Ĝg', 'Gg' ],
+ [ 'Ĥh', 'Hh' ],
+ [ 'Ĵj', 'Jj' ],
+ [ 'Ŝs', 'Ss' ],
+ [ 'Ŭu', 'Uu' ],
+ [ 'aŭu', 'au' ],
+ [ 'eŭu', 'eu' ],
+ [ 'Aŭu', 'Au' ],
+ [ 'Eŭu', 'Eu' ],
+ [ 'AŬU', 'AU' ],
+ [ 'EŬU', 'EU' ],
+ [ 'ĈC', 'CC' ],
+ [ 'ĜG', 'GG' ],
+ [ 'ĤH', 'HH' ],
+ [ 'ĴJ', 'JJ' ],
+ [ 'ŜS', 'SS' ],
+ [ 'ŬU', 'UU' ],
+ [ 'cc', 'ĉ' ],
+ [ 'gg', 'ĝ' ],
+ [ 'hh', 'ĥ' ],
+ [ 'jj', 'ĵ' ],
+ [ 'ss', 'ŝ' ],
+ [ 'uu', 'ŭ' ],
+ [ 'au', 'aŭ' ],
+ [ 'eu', 'eŭ' ],
+ [ 'Cc', 'Ĉ' ],
+ [ 'Gg', 'Ĝ' ],
+ [ 'Hh', 'Ĥ' ],
+ [ 'Jj', 'Ĵ' ],
+ [ 'Ss', 'Ŝ' ],
+ [ 'Uu', 'Ŭ' ],
+ [ 'Au', 'Aŭ' ],
+ [ 'Eu', 'Eŭ' ],
+ [ 'AU', 'AŬ' ],
+ [ 'EU', 'EŬ' ],
+ [ 'CC', 'Ĉ' ],
+ [ 'GG', 'Ĝ' ],
+ [ 'HH', 'Ĥ' ],
+ [ 'JJ', 'Ĵ' ],
+ [ 'SS', 'Ŝ' ],
+ [ 'UU', 'Ŭ' ] ]
+ };
+
+ $.ime.register( eoVi );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-x.js b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-x.js
new file mode 100644
index 00000000..7295be3e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/eo/eo-x.js
@@ -0,0 +1,53 @@
+( function ( $ ) {
+ 'use strict';
+
+ var eoX = {
+ id: 'eo-x',
+ name: 'Esperanto x',
+ description: 'writing Esperanto-letters adding x\'s (the X-system).',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'ĉx', 'cx' ],
+ [ 'ĝx', 'gx' ],
+ [ 'ĥx', 'hx' ],
+ [ 'ĵx', 'jx' ],
+ [ 'ŝx', 'sx' ],
+ [ 'ŭx', 'ux' ],
+ [ 'Ĉx', 'Cx' ],
+ [ 'Ĝx', 'Gx' ],
+ [ 'Ĥx', 'Hx' ],
+ [ 'Ĵx', 'Jx' ],
+ [ 'Ŝx', 'Sx' ],
+ [ 'Ŭx', 'Ux' ],
+ [ 'ĈX', 'CX' ],
+ [ 'ĜX', 'GX' ],
+ [ 'ĤX', 'HX' ],
+ [ 'ĴX', 'JX' ],
+ [ 'ŜX', 'SX' ],
+ [ 'ŬX', 'UX' ],
+ [ 'cx', 'ĉ' ],
+ [ 'gx', 'ĝ' ],
+ [ 'hx', 'ĥ' ],
+ [ 'jx', 'ĵ' ],
+ [ 'sx', 'ŝ' ],
+ [ 'ux', 'ŭ' ],
+ [ 'Cx', 'Ĉ' ],
+ [ 'Gx', 'Ĝ' ],
+ [ 'Hx', 'Ĥ' ],
+ [ 'Jx', 'Ĵ' ],
+ [ 'Sx', 'Ŝ' ],
+ [ 'Ux', 'Ŭ' ],
+ [ 'CX', 'Ĉ' ],
+ [ 'GX', 'Ĝ' ],
+ [ 'HX', 'Ĥ' ],
+ [ 'JX', 'Ĵ' ],
+ [ 'SX', 'Ŝ' ],
+ [ 'UX', 'Ŭ' ] ]
+ };
+
+ $.ime.register( eoX );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/fa/fa-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/fa/fa-kbd.js
new file mode 100644
index 00000000..6ebe3504
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/fa/fa-kbd.js
@@ -0,0 +1,167 @@
+( function ( $ ) {
+ 'use strict';
+
+ var faKbd = {
+ id: 'fa-kbd',
+ name: 'kbd',
+ description: 'Persian standard (ISIRI 9147) keyboard layout',
+ date: '2013-08-30',
+ URL: 'http://www.isiri.org/portal/files/std/9147.pdf',
+ author: 'Ebrahim Byagowi',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', '\u200d' ],
+ [ '1', '۱' ],
+ [ '2', '۲' ],
+ [ '3', '۳' ],
+ [ '4', '۴' ],
+ [ '5', '۵' ],
+ [ '6', '۶' ],
+ [ '7', '۷' ],
+ [ '8', '۸' ],
+ [ '9', '۹' ],
+ [ '0', '۰' ],
+
+ [ 'q', 'ض' ],
+ [ 'w', 'ص' ],
+ [ 'e', 'ث' ],
+ [ 'r', 'ق' ],
+ [ 't', 'ف' ],
+ [ 'y', 'غ' ],
+ [ 'u', 'ع' ],
+ [ 'i', 'ه' ],
+ [ 'o', 'خ' ],
+ [ 'p', 'ح' ],
+ [ '\\[', 'ج' ],
+ [ '\\]', 'چ' ],
+
+ [ 'a', 'ش' ],
+ [ 's', 'س' ],
+ [ 'd', 'ی' ],
+ [ 'f', 'ب' ],
+ [ 'g', 'ل' ],
+ [ 'h', 'ا' ],
+ [ 'j', 'ت' ],
+ [ 'k', 'ن' ],
+ [ 'l', 'م' ],
+ [ ';', 'ک' ],
+ [ '\'', 'گ' ],
+
+ [ 'z', 'ظ' ],
+ [ 'x', 'ط' ],
+ [ 'c', 'ز' ],
+ [ 'v', 'ر' ],
+ [ 'b', 'ذ' ],
+ [ 'n', 'د' ],
+ [ 'm', 'پ' ],
+ [ ',', 'و' ],
+ [ '\\.', '.' ],
+ [ '/', '/' ],
+
+ [ '~', '÷' ],
+ [ '\\!', '!' ],
+ [ '@', '٬' ],
+ [ '#', '٫' ],
+ [ '\\$', '﷼' ],
+ [ '%', '٪' ],
+ [ '\\^', '×' ],
+ [ '&', '،' ],
+ [ '\\*', '*' ],
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+ [ '_', 'ـ' ],
+
+ [ 'Q', 'ْ' ],
+ [ 'W', 'ٌ' ],
+ [ 'E', 'ٍ' ],
+ [ 'R', 'ً' ],
+ [ 'T', 'ُ' ],
+ [ 'Y', 'ِ' ],
+ [ 'U', 'َ' ],
+ [ 'I', 'ّ' ],
+ [ 'O', ']' ],
+ [ 'P', '[' ],
+ [ '\\{', '}' ],
+ [ '\\}', '{' ],
+
+ [ 'A', 'ؤ' ],
+ [ 'S', 'ئ' ],
+ [ 'D', 'ي' ],
+ [ 'F', 'إ' ],
+ [ 'G', 'أ' ],
+ [ 'H', 'آ' ],
+ [ 'J', 'ة' ],
+ [ 'K', '»' ],
+ [ 'L', '«' ],
+ [ '\\:', ':' ],
+ [ '"', '؛' ],
+
+ [ 'Z', 'ك' ],
+ [ 'X', 'ٓ' ],
+ [ 'C', 'ژ' ],
+ [ 'V', 'ٰ' ],
+ [ 'B', '\u200c' ],
+ [ 'N', 'ٔ' ],
+ [ 'M', 'ء' ],
+ [ '<', '>' ],
+ [ '>', '<' ],
+ [ '\\?', '؟' ]
+ ],
+ patterns_x: [
+ [ '`', '~' ],
+ [ '1', '`' ],
+ [ '2', '@' ],
+ [ '3', '#' ],
+ [ '4', '$' ],
+ [ '5', '%' ],
+ [ '6', '^' ],
+ [ '7', '&' ],
+ [ '8', '•' ],
+ [ '9', '\u200e' ],
+ [ '0', '\u200f' ],
+
+ [ 'q', '°' ],
+ [ 'w', '' ],
+ [ 'e', '€' ],
+ [ 'r', '' ],
+ [ 't', '' ],
+ [ 'y', '' ],
+ [ 'u', '' ],
+ [ 'i', '\u202d' ],
+ [ 'o', '\u202e' ],
+ [ 'p', '\u202c' ],
+ [ '\\[', '\u202a' ],
+ [ '\\]', '\u202b' ],
+
+ [ 'a', '' ],
+ [ 's', '' ],
+ [ 'd', 'ى' ],
+ [ 'f', '' ],
+ [ 'g', '' ],
+ [ 'h', 'ٱ' ],
+ [ 'j', '' ],
+ [ 'k', '﴾' ],
+ [ 'l', '﴿' ],
+ [ ';', ';' ],
+ [ '\'', '"' ],
+
+ [ 'z', '' ],
+ [ 'x', '' ],
+ [ 'c', '' ],
+ [ 'v', 'ٖ' ],
+ [ 'b', '\u200d' ],
+ [ 'n', 'ٕ' ],
+ [ 'm', '…' ],
+ [ ',', ',' ],
+ [ '\\.', '\'' ],
+ [ '/', '?' ],
+ [ ' ', '\xa0' ]
+ ],
+ patterns_shift: [
+ [ ' ', '\u200c' ]
+ ]
+ };
+
+ $.ime.register( faKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ff/ff-alt.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ff/ff-alt.js
new file mode 100644
index 00000000..e96535df
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ff/ff-alt.js
@@ -0,0 +1,38 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ffAlt = {
+ id: 'ff-alt',
+ name: 'Fulfulde Alt',
+ description: 'Fulfulde Alt',
+ date: '2017-05-30',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ 'n~', 'ñ' ],
+ [ 'N~', 'Ñ' ],
+ [ 'ñ~', 'n~' ],
+ [ 'Ñ~', 'N~' ]
+ ],
+ patterns_x: [
+ [ 'b', 'ɓ' ],
+ [ 'B', 'Ɓ' ],
+ [ 'd', 'ɗ' ],
+ [ 'D', 'Ɗ' ],
+ [ 'g', 'ɠ' ],
+ [ 'G', 'Ɠ' ],
+ [ 'j', 'ɲ' ],
+ [ 'J', 'Ɲ' ],
+ [ 'n', 'ŋ' ],
+ [ 'N', 'Ŋ' ],
+ [ 'y', 'ƴ' ],
+ [ 'Y', 'Ƴ' ]
+ ]
+ };
+
+ $.ime.register( ffAlt );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ff/ff-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ff/ff-tilde.js
new file mode 100644
index 00000000..357403ea
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ff/ff-tilde.js
@@ -0,0 +1,32 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ffTilde = {
+ id: 'ff-tilde',
+ name: 'Fulfulde tilde',
+ description: 'Fulfulde tilde',
+ date: '2019-05-07',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~b', 'ɓ' ],
+ [ '~B', 'Ɓ' ],
+ [ '~d', 'ɗ' ],
+ [ '~D', 'Ɗ' ],
+ [ '~g', 'ɠ' ],
+ [ '~G', 'Ɠ' ],
+ [ '~q', 'ŋ' ],
+ [ '~Q', 'Ŋ' ],
+ [ '~j', 'ɲ' ],
+ [ '~J', 'Ɲ' ],
+ [ '~n', 'ñ' ],
+ [ '~N', 'Ñ' ],
+ [ '~y', 'ƴ' ],
+ [ '~Y', 'Ƴ' ]
+ ]
+ };
+
+ $.ime.register( ffTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/fi/fi-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/fi/fi-transliteration.js
new file mode 100644
index 00000000..ab766439
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/fi/fi-transliteration.js
@@ -0,0 +1,32 @@
+( function ( $ ) {
+ 'use strict';
+
+ var fiTransliteration = {
+ id: 'fi-transliteration',
+ name: 'translitterointi',
+ description: 'Finnish transliteration',
+ date: '2012-11-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Niklas Laxström',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ '\\.a', 'å' ],
+ [ '\\.A', 'Å' ],
+ [ ':a', 'ä' ],
+ [ ':A', 'Ä' ],
+ [ ':o', 'ö' ],
+ [ ':O', 'Ö' ],
+ [ 'shh', 'š' ],
+ [ 'Shh', 'Š' ],
+ [ '\\.e', '€' ]
+ ],
+ patterns_x: [
+ [ 'e', '€' ]
+ ]
+ };
+
+ $.ime.register( fiTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/fo/fo-normforms.js b/UniversalLanguageSelector/lib/jquery.ime/rules/fo/fo-normforms.js
new file mode 100644
index 00000000..460cb227
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/fo/fo-normforms.js
@@ -0,0 +1,65 @@
+( function ( $ ) {
+ 'use strict';
+
+ var defs = {
+ id: 'fo-normforms',
+ name: 'Føroyskt',
+ description: 'Faroese input method with most common form transliterated',
+ date: '2012-12-04',
+ URL: 'http://www.evertype.com/alphabets/faroese.pdf',
+ author: 'John Erling Blad',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 3,
+ patterns: [
+ // Uses "'" as an accent
+ [ '\'a', 'á' ],
+ [ '\'A', 'Á' ],
+ [ '\'i', 'í' ],
+ [ '\'I', 'Í' ],
+ [ '\'o', 'ó' ],
+ [ '\'O', 'Ó' ],
+ [ '\'u', 'ú' ],
+ [ '\'U', 'Ú' ],
+ [ '\'y', 'ý' ],
+ [ '\'Y', 'Ý' ],
+ // Uses "~" as "approximatly similar to"
+ [ '~d', 'ð' ],
+ [ '~D', 'Ð' ],
+ [ '~o', 'ö' ],
+ [ '~O', 'Ö' ],
+ // The most common transliterations (also the Danish letters)
+ [ 'aa', 'å' ],
+ [ 'AA', 'Å' ],
+ [ 'Aa', 'Å' ],
+ [ 'ae', 'æ' ],
+ [ 'AE', 'Æ' ],
+ [ 'Ae', 'Æ' ],
+ [ 'oe', 'ø' ],
+ [ 'OE', 'Ø' ],
+ [ 'Oe', 'Ø' ],
+ // The previous as negated transliterations, mostly for names
+ [ 'åa', 'a', 'aa' ],
+ [ 'ÅA', 'A', 'AA' ],
+ [ 'Åa', 'A', 'Aa' ],
+ [ 'åA', 'a', 'aA' ],
+ [ 'æe', 'e', 'ae' ],
+ [ 'ÆE', 'E', 'AE' ],
+ [ 'Æe', 'E', 'Ae' ],
+ [ 'æE', 'e', 'aE' ],
+ [ 'øe', 'e', 'oe' ],
+ [ 'ØE', 'E', 'OE' ],
+ [ 'Øe', 'E', 'Oe' ], // this fails for some names like "Øen"
+ [ 'øE', 'e', 'oE' ]
+ // historically similar forms
+ // "Å" is sometimes written as "Aa", and "å" as "aa", but in names
+ // it is not generally acceptable to use this transliteration. To
+ // handle those situations we need some oposite forms.
+ // There is a similar character "Å" for the length unit Angstrom,
+ // but this is not the upper case letter Å.
+ ]
+ };
+
+ $.ime.register( defs );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/fon/fon-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/fon/fon-tilde.js
new file mode 100644
index 00000000..82536e67
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/fon/fon-tilde.js
@@ -0,0 +1,29 @@
+( function ( $ ) {
+ 'use strict';
+
+ var fonTilde = {
+ id: 'fon-tilde',
+ name: 'fon-tilde',
+ description: 'Fon input keyboard',
+ date: '2018-05-18',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Mahuton POSSOUPE, Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.1',
+ patterns: [
+ [ '~D', 'Ɖ' ],
+ [ '~d', 'ɖ' ],
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~-', '\u0304' ], // Combining macron
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( fonTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/fonipa/ipa-sil.js b/UniversalLanguageSelector/lib/jquery.ime/rules/fonipa/ipa-sil.js
new file mode 100644
index 00000000..0229de8a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/fonipa/ipa-sil.js
@@ -0,0 +1,240 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ipaSil = {
+ id: 'ipa-sil',
+ name: 'International Phonetic Alphabet - SIL',
+ description: 'International Phonetic Alphabet - SIL',
+ date: '2012-11-23',
+ URL: 'http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=UniIPAKeyboard',
+ author: 'mapping by Martin Hosken and Lorna A. Priest; implementation by Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ 'B=', 'ʙ' ],
+ [ 'f=', 'ɸ' ],
+ [ 'b=', 'β' ],
+
+ [ 'm>', 'ɱ' ],
+ [ 'v<', 'ⱱ' ],
+ [ 'v=', 'ʋ' ],
+
+ [ 't=', 'θ' ],
+ [ 'd=', 'ð' ],
+
+ [ 'r>', 'ɾ' ],
+ [ 'l=', 'ɬ' ],
+ [ 'l>', 'ɮ' ],
+ [ 'r=', 'ɹ' ],
+
+ [ 's=', 'ʃ' ],
+ [ 'z=', 'ʒ' ],
+
+ [ 't<', 'ʈ' ],
+ [ 'd<', 'ɖ' ],
+ [ 'n<', 'ɳ' ],
+ [ 'r<', 'ɽ' ],
+ [ 's<', 'ʂ' ],
+ [ 'z<', 'ʐ' ],
+ [ 'R<', 'ɻ' ],
+ [ 'l<', 'ɭ' ],
+
+ [ 'j=', 'ɟ' ],
+ [ 'n=', 'ɲ' ],
+ [ 'c=', 'ç' ],
+ [ 'j<', 'ʝ' ],
+ [ 'L<', 'ʎ' ],
+
+ [ 'g<', 'ɡ' ],
+ [ 'n>', 'ŋ' ],
+ [ 'g=', 'ɣ' ],
+ [ 'w>', 'ɰ' ],
+ [ 'L=', 'ʟ' ],
+
+ [ 'G=', 'ɢ' ],
+ [ 'N=', 'ɴ' ],
+ [ 'R=', 'ʀ' ],
+ [ 'x=', 'χ' ],
+ [ 'R>', 'ʁ' ],
+
+ [ 'h>', 'ħ' ],
+ [ '\\?<', 'ʕ' ],
+
+ [ '\\?=', 'ʔ' ],
+ [ 'h<', 'ɦ' ],
+
+ [ 'p=', 'ʘ' ],
+ [ 'ǃ<', 'ǀ' ], // This is not an exclamation mark
+ [ '!', 'ǃ' ],
+ [ 'ǃ=', 'ǂ' ], // This is not an exclamation mark
+ [ 'ǃ>', 'ǁ' ], // This is not an exclamation mark
+
+ [ 'b>', 'ɓ' ],
+ [ 'd>', 'ɗ' ],
+ [ 'j>', 'ʄ' ],
+ [ 'g>', 'ɠ' ],
+ [ 'G>', 'ʛ' ],
+
+ [ 'w=', 'ʍ' ],
+ [ 'y<', 'ɥ' ],
+ [ 'h=', 'ɥ' ],
+ [ 'H=', 'ʜ' ],
+ [ 'Q<', 'ʢ' ],
+ [ 'Q=', 'ʡ' ],
+ // TODO non-IPA retroflex hooks
+
+ [ 'c<', 'ɕ' ],
+ [ 'z>', 'ʑ' ],
+ [ 'L>', 'ɺ' ],
+ [ 'H<', 'ɧ' ],
+
+ [ 'i=', 'ɪ' ],
+ [ 'e<', 'ɛ' ],
+ [ 'a<', 'æ' ],
+
+ [ 'y=', 'ʏ' ],
+ [ 'o>', 'ø' ],
+ [ 'E<', 'œ' ],
+ [ 'E>', 'ɶ' ],
+
+ [ 'I=', 'ɨ' ],
+ [ 'E=', 'ɘ' ],
+ [ 'e=', 'ə' ],
+ [ 'e>', 'ɜ' ],
+ [ 'a>', 'ɐ' ],
+ [ 'U=', 'ʉ' ],
+ [ 'O=', 'ɵ' ],
+ [ 'O<', 'ɞ' ],
+
+ [ 'u=', 'ɯ' ],
+ [ 'O>', 'ɤ' ],
+ [ 'u>', 'ʌ' ],
+ [ 'a=', 'ɑ' ],
+ [ 'u', 'u' ],
+ [ 'u<', 'ʊ' ],
+ [ 'o<', 'ɔ' ],
+ [ 'o=', 'ɒ' ],
+
+ [ 'ˈ}', 'ˌ' ], // }}
+ [ '}', 'ˈ' ],
+ [ 'ː:', 'ˑ' ], // ::
+ [ 'ˑ:', 'ːː' ], // ::: // Not IPA sanctioned
+ [ ':', 'ː' ],
+ [ '\\*\\*\\*', '\u0306' ], // Combining breve
+ [ '\\.<', '|' ],
+ [ '\\.=', '‖' ],
+ [ '#=', '‿' ],
+
+ // Tones
+ [ '([˥-˩])4', '$1˥' ],
+ [ '([˥-˩])3', '$1˦' ],
+ [ '([˥-˩])2', '$1˧' ],
+ [ '([˥-˩])1', '$1˨' ],
+ [ '([˥-˩])0', '$1˩' ],
+ [ '#4', '˥' ],
+ [ '#3', '˦' ],
+ [ '#2', '˧' ],
+ [ '#1', '˨' ],
+ [ '#0', '˩' ],
+ [ '(?:\u0300)3', '\u030C' ], // @13 - Combining caron
+ [ '(?:\u0301)1', '\u0302' ], // @31 - Combining circumflex accent
+ [ '(?:\u0304)3', '\u1dc4' ], // @23 - Combining macron-acute
+ [ '(?:\u0300)2', '\u1dc5' ], // @12 - Combining grave-macron
+ [ '(?:\u030C)1', '\u1dc8' ], // @131 - Combining grave-acute-grave
+ [ '(?:\u0304)1', '\u1dc6' ], // @21 - Combining macron-grave // Not IPA sanctioned
+ [ '(?:\u0301)2', '\u1dc7' ], // @32 - Combining acute-macron // Not IPA sanctioned
+ [ '(?:\u0302)3', '\u1dc9' ], // @313 - Combining acute-grave-acute // Not IPA sanctioned
+ [ '(?:\u030a)4', '\u030b' ], // Combining double acute accent
+ [ '(?:\u030a)3', '\u0301' ], // Combining acute accent
+ [ '(?:\u030a)2', '\u0304' ], // Combining macron
+ [ '(?:\u030a)1', '\u0300' ], // Combining grave accent
+ [ '(?:\u030a)0', '\u030f' ], // Combining double grave accent
+
+ // Tone numbers (non-IPA)
+ [ '\\^0', '⁰' ], // Not IPA sanctioned
+ [ '\\^1', '¹' ], // Not IPA sanctioned
+ [ '\\^2', '²' ], // Not IPA sanctioned
+ [ '\\^3', '³' ], // Not IPA sanctioned
+ [ '\\^4', '⁴' ], // Not IPA sanctioned
+ [ '\\^5', '⁵' ], // Not IPA sanctioned
+ [ '\\^6', '⁶' ], // Not IPA sanctioned
+ [ '\\^7', '⁷' ], // Not IPA sanctioned
+ [ '\\^8', '⁸' ], // Not IPA sanctioned
+ [ '\\^9', '⁹' ], // Not IPA sanctioned
+ // This character is called "Superscript hyphen" in the layout document,
+ // and "Superscript minus" in Unicode
+ [ '\\^-', '⁻' ], // Not IPA sanctioned
+
+ [ 'ꜛ>', '↗' ], // #>>
+ [ 'ꜜ<', '↘' ], // #<<
+ [ '#<', 'ꜜ' ],
+ [ '#>', 'ꜛ' ],
+
+ // Diacritics and suprasegmentals
+ [ 'h\\^', 'ʰ' ],
+ [ 'w\\^', 'ʷ' ],
+ [ 'j\\^', 'ʲ' ],
+ [ 'ɣ\\^', 'ˠ' ], // g=
+ [ 'ʕ\\^', 'ˤ' ], // ?<
+ [ 'n\\^', 'ⁿ' ],
+ [ 'l\\^', 'ˡ' ],
+ // TODO non-IPA superscripts
+
+ [ 'ʽ\\[', '˞' ], // [[[
+ [ '\\[\\[', 'ʽ' ], // [[ // Not IPA sanctioned
+ [ '(?:\u031a)\\]', '‘' ], // ]]]] // Not IPA sanctioned
+ [ 'ʼ\\]', '\u031a' ], // ]]] // Combining left angle above
+ [ '\\]\\]', 'ʼ' ], // ]]
+
+ [ '(?:\u032f)\\$', '\u0330' ], // $$$ // Combining tilde below
+ [ '(?:\u0329)\\$', '\u032f' ], // $$ // Combining inverted breve below
+ [ '\\$', '\u0329' ], // $ // Combining vertical line below
+
+ // TODO non-IPA retroflex hooks
+
+ [ '(?:\u032c)%', '\u0324' ], // %%% // Combining diaeresis below
+ [ '(?:\u0325)%', '\u032c' ], // %% // Combining caron below
+ [ '%', '\u0325' ], // % // Combining ring below
+
+ // TODO non-IPA palatal hooks
+
+ [ '@', '\u030a' ], // Combining ring above
+
+ [ '(?:\u033c)\\{', '\u0323' ], // {{{{{ // Combining dot below
+ [ '(?:\u033b)\\{', '\u033c' ], // {{{{ // Combining seagull below
+ [ '(?:\u033a)\\{', '\u033b' ], // {{{ // Combining square below
+ [ '(?:\u032a)\\{', '\u033a' ], // {{ // Combining inverted bridge below
+ [ '\\{', '\u032a' ], // { // Combining bridge below
+
+ [ '(?:\u0303)~', '\u0334' ], // ~~ // Combining tilde overlay
+ [ '~', '\u0303' ], // ~ // Combining tilde
+
+ [ '(?:\u0306)\\*', '\u0307' ], // **** // Combining dot above
+ [ '(?:\u033d)\\*', '\u0306' ], // *** // Combining breve
+ [ '(?:\u0308)\\*', '\u033d' ], // ** // Combining x above
+ [ '\\*', '\u0308' ], // * // Combining diaeresis
+
+ // TODO Find out what the m with the five asterisks is.
+
+ [ '#&', '\u0361' ], // Combining double inverted breve
+ [ '(?:\u030a)&', '\u035c' ], // @& // Combining double breve below
+
+ [ '(?:\u0318)\\+', '\u0339' ], // ++++ // Combining right half ring below
+ [ '(?:\u0319)_', '\u031c' ], // ____ // Combining left half ring below
+ [ '(?:\u031d)\\+', '\u0318' ], // +++ // Combining left tack below
+ [ '(?:\u031e)_', '\u0319' ], // ___ // Combining right tack below
+ [ '(?:\u031f)\\+', '\u031d' ], // ++ // Combining up tack below
+ [ '(?:\u0320)_', '\u031e' ], // __ // Combining down tack below
+ [ '\\+', '\u031f' ], // + // Combining plus sign below
+ [ '_', '\u0320' ], // _ // Combining minus sign below
+
+ [ '=>', '→' ], // Not IPA sanctioned
+ [ 's>', 'σ' ], // Not IPA sanctioned
+ [ '=<', '\u200d' ] // Combining Grapheme Joiner
+ ]
+ };
+
+ $.ime.register( ipaSil );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/fonipa/ipa-x-sampa.js b/UniversalLanguageSelector/lib/jquery.ime/rules/fonipa/ipa-x-sampa.js
new file mode 100644
index 00000000..ee9d153d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/fonipa/ipa-x-sampa.js
@@ -0,0 +1,189 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ipaSil = {
+ id: 'ipa-x-sampa',
+ name: 'International Phonetic Alphabet - X-SAMPA',
+ description: 'International Phonetic Alphabet - X-SAMPA',
+ date: '2012-11-26',
+ URL: 'http://www.phon.ucl.ac.uk/home/sampa/x-sampa.htm',
+ author: 'mapping by John C. Wells; implementation by Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 4,
+ patterns: [
+ // Tones
+ [ '_/', '\u030C' ], // Combining caron
+ [ '_\\\\', '\u0302' ], // Combining circumflex accent
+ [ '_ɥ_T', '\u1dc4' ], // _H_T - Combining macron-acute
+ [ '_β_L', '\u1dc5' ], // _B_L - Combining grave-macron
+ [ '_ʁ_F', '\u1dc8' ], // _R_F - Combining grave-acute-grave
+
+ [ 'β\\\\', 'ʙ' ],
+ [ 'p\\\\', 'ɸ' ],
+ [ 'B', 'β' ],
+
+ [ 'F', 'ɱ' ],
+ // ⱱ is not in X-SAMPA
+ [ 'P', 'ʋ' ],
+ [ 'v\\\\', 'ʋ' ],
+
+ [ 'T', 'θ' ],
+ [ 'D', 'ð' ],
+
+ [ '4', 'ɾ' ],
+ [ 'K', 'ɬ' ],
+ [ 'ɬ\\\\', 'ɮ' ],
+ [ 'r\\\\', 'ɹ' ],
+
+ [ 'S', 'ʃ' ],
+ [ 'Z', 'ʒ' ],
+
+ [ 't`', 'ʈ' ],
+ [ 'd`', 'ɖ' ],
+ [ 'n`', 'ɳ' ],
+ [ 'r`', 'ɽ' ],
+ [ 's`', 'ʂ' ],
+ [ 'z`', 'ʐ' ],
+ [ 'ɹ`', 'ɻ' ],
+ [ 'l`', 'ɭ' ],
+
+ [ 'ɲ\\\\', 'ɟ' ],
+ [ 'J', 'ɲ' ],
+ [ 'C', 'ç' ],
+ [ 'j\\\\', 'ʝ' ],
+ [ 'L', 'ʎ' ],
+
+ [ 'g', 'ɡ' ],
+ [ '_N', '\u033c' ], // Combining seagull below
+ [ 'N', 'ŋ' ],
+ [ '_G', 'ˠ' ],
+ [ 'G', 'ɣ' ],
+ [ 'ɯ\\\\', 'ɰ' ],
+ [ 'ʎ\\\\', 'ʟ' ],
+
+ [ 'ɣ\\\\', 'ɢ' ],
+ [ 'ŋ\\\\', 'ɴ' ],
+ [ 'ʁ\\\\', 'ʀ' ],
+ [ '_X', '\u0306' ], // Combining breve
+ [ 'X', 'χ' ],
+ [ 'R', 'ʁ' ],
+
+ [ 'χ\\\\', 'ħ' ],
+ [ '_ʔ\\\\', 'ˤ' ],
+ [ 'ʔ\\\\', 'ʕ' ],
+
+ [ '\\?', 'ʔ' ],
+ [ 'h\\\\', 'ɦ' ],
+
+ [ 'ɔ\\\\', 'ʘ' ],
+ [ 'ǀ\\|\\\\', 'ǁ' ],
+ [ '\\|\\\\', 'ǀ' ],
+ [ 'ꜜ\\\\', 'ǃ' ], // !\ -> Retroflex (postalveolar) click
+ [ '_?=', '\u0329' ], // Combining vertical line below
+ [ '\u0329\\\\', 'ǂ' ],
+
+ [ 'b_<', 'ɓ' ],
+ [ 'd_<', 'ɗ' ],
+ [ 'ɟ_<', 'ʄ' ],
+ [ 'ɡ_<', 'ɠ' ],
+ [ 'ɢ_<', 'ʛ' ],
+
+ [ 'W', 'ʍ' ],
+ [ 'H', 'ɥ' ],
+ [ 'ɥ\\\\', 'ʜ' ],
+ [ '<\\\\', 'ʢ' ],
+ [ '>\\\\', 'ʡ' ],
+
+ [ 's\\\\', 'ɕ' ],
+ [ 'z\\\\', 'ʑ' ],
+ [ 'l\\\\', 'ɺ' ],
+ [ 'x\\\\', 'ɧ' ],
+
+ [ 'I', 'ɪ' ],
+ [ 'E', 'ɛ' ],
+ [ '\\{', 'æ' ],
+
+ [ 'Y', 'ʏ' ],
+ [ '2', 'ø' ],
+ [ '9', 'œ' ],
+ [ '&', 'ɶ' ],
+
+ [ '1', 'ɨ' ],
+ [ 'ə\\\\', 'ɘ' ],
+ [ '@', 'ə' ],
+ [ 'ɜ\\\\', 'ɞ' ],
+ [ '3', 'ɜ' ],
+ [ '6', 'ɐ' ],
+ [ '_\\}', '\u031a' ],
+ [ '\\}', 'ʉ' ],
+ [ '8', 'ɵ' ],
+
+ [ 'M', 'ɯ' ],
+ [ '7', 'ɤ' ],
+ [ 'V', 'ʌ' ],
+ [ '_A', '\u0318' ], // Combining right tack below
+ [ 'A', 'ɑ' ],
+ [ 'U', 'ʊ' ],
+ [ '_O', '\u0339' ], // ++++ // Combining right half ring below
+ [ 'O', 'ɔ' ],
+ [ 'Q', 'ɒ' ],
+
+ [ '%', 'ˌ' ],
+ [ '_"', '\u0308' ], // Combining diaeresis
+ [ '"', 'ˈ' ],
+ [ 'ː\\\\', 'ˑ' ],
+ [ ':', 'ː' ],
+ [ '\\.<', '|' ],
+ [ '\\|\\|', '‖' ],
+ [ '-\\\\', '‿' ],
+
+ [ '<ʁ>', '↗' ], // <R>
+ [ '<ɱ>', '↘' ], // <F>
+ [ '!', 'ꜜ' ],
+ [ '_\\^', '\u032f' ], // Combining inverted breve below
+ [ '\\^', 'ꜛ' ],
+
+ // Diacritics and suprasegmentals
+ [ '_h', 'ʰ' ],
+ [ '_w', 'ʷ' ],
+ [ '_j', 'ʲ' ],
+ // see above for ˠ
+ // see above for ˤ
+ [ '_n', 'ⁿ' ],
+ [ '_l', 'ˡ' ],
+
+ [ '`', '˞' ],
+ [ '_>', 'ʼ' ],
+ // See above for No audible release
+ // See above for Syllabic
+ // See above for Non-syllabic
+ [ '_k', '\u0330' ], // Combining tilde below
+
+ [ '([ɱɮɳɖʐɻɽɭɲɟʝjŋɡɣɰ])_0', '$1\u030a' ], // Combining ring above
+ [ '(.)_0', '$1\u0325' ], // Combining ring below
+ [ '_v', '\u032c' ], // Combining caron below
+ [ '_t', '\u0324' ], // Combining diaeresis below
+ [ '_d', '\u032a' ], // Combining bridge below
+ [ '_a', '\u033a' ], // Combining inverted bridge below
+ [ '_m', '\u033b' ], // Combining square below
+ // See above for linguolabial
+ [ '_?~', '\u0303' ], // Combining tilde
+ [ '_e', '\u0334' ], // Combining tilde overlay
+ // See above for centralised
+ [ '_x', '\u033d' ], // Combining x above
+ // See above for extra short
+ [ '_\\+', '\u031f' ], // Combining plus sign below
+ [ '_-', '\u0320' ], // Combining minus sign below
+ [ '_r', '\u031d' ], // Combining up tack below
+ [ '_o', '\u031e' ], // Combining down tack below
+ // See above for advanced tongue root
+ [ '_q', '\u0319' ], // Combining left tack below
+ // See above for more rounded
+ [ '_c', '\u031c' ]
+ ]
+ };
+
+ $.ime.register( ipaSil );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/gaa/gaa-cqx.js b/UniversalLanguageSelector/lib/jquery.ime/rules/gaa/gaa-cqx.js
new file mode 100644
index 00000000..d59cb8e3
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/gaa/gaa-cqx.js
@@ -0,0 +1,32 @@
+( function ( $ ) {
+ 'use strict';
+
+ var defs = {
+ id: 'gaa-cqx',
+ name: 'Ga - CQX replacement',
+ description: 'Ga input method with C, Q and X replaced by Ŋ, Ɛ and Ɔ',
+ date: '2016-06-23',
+ URL: 'https://www.kasahorow.org/node/260',
+ author: 'Amir E. Aharoni, based on Kasahorow Akan',
+ license: 'GPLv3',
+ version: '1.1',
+ contextLength: 1,
+ maxKeyLength: 1,
+ patterns: [
+ [ '\\\\C', 'C' ],
+ [ '\\\\c', 'c' ],
+ [ '\\\\Q', 'Q' ],
+ [ '\\\\q', 'q' ],
+ [ '\\\\X', 'X' ],
+ [ '\\\\x', 'x' ],
+ [ 'C', 'Ŋ' ],
+ [ 'c', 'ŋ' ],
+ [ 'Q', 'Ɛ' ],
+ [ 'q', 'ɛ' ],
+ [ 'X', 'Ɔ' ],
+ [ 'x', 'ɔ' ]
+ ]
+ };
+
+ $.ime.register( defs );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/gaa/gaa-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/gaa/gaa-tilde.js
new file mode 100644
index 00000000..d89d685c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/gaa/gaa-tilde.js
@@ -0,0 +1,28 @@
+( function ( $ ) {
+ 'use strict';
+
+ var gaaTilde = {
+ id: 'gaa-tilde',
+ name: 'Ga tilde',
+ description: 'Ga tilde',
+ date: '2019-05-06',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.1',
+ maxKeyLength: 2,
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\{', '\u0303' ] // Combining tilde
+ ]
+ };
+
+ $.ime.register( gaaTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/gom/gom-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/gom/gom-inscript2.js
new file mode 100644
index 00000000..7fe7363b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/gom/gom-inscript2.js
@@ -0,0 +1,119 @@
+( function ( $ ) {
+ 'use strict';
+
+ var gomInScript2 = {
+ id: 'gom-inscript2',
+ name: 'कोंकणी इनस्क्रिप्ट २',
+ description: 'Enhanced InScript keyboard for Kokani language',
+ date: '2012-11-06',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\!', 'ॲ' ],
+ [ '1', '१' ],
+ [ '\\@', 'ॅ' ],
+ [ '2', '२' ],
+ [ '\\#', '्र' ],
+ [ '3', '३' ],
+ [ '\\$', 'र्' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\]', ']' ],
+ [ '0', '०' ],
+ [ '\\_', 'ः' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ऋ' ],
+ [ '\\=', 'ृ' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ौ' ],
+ [ 'W', 'ऐ' ],
+ [ 'w', 'ै' ],
+ [ 'E', 'आ' ],
+ [ 'e', 'ा' ],
+ [ 'R', 'ई' ],
+ [ 'r', 'ी' ],
+ [ 'T', 'ऊ' ],
+ [ 't', 'ू' ],
+ [ 'Y', 'भ' ],
+ [ 'y', 'ब' ],
+ [ 'U', 'ङ' ],
+ [ 'u', 'ह' ],
+ [ 'I', 'घ' ],
+ [ 'i', 'ग' ],
+ [ 'O', 'ध' ],
+ [ 'o', 'द' ],
+ [ 'P', 'झ' ],
+ [ 'p', 'ज' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ञ' ],
+ [ '\\]', '़' ],
+ [ 'A', 'ओ' ],
+ [ 'a', 'ो' ],
+ [ 'S', 'ए' ],
+ [ 's', 'े' ],
+ [ 'D', 'अ' ],
+ [ 'd', '्' ],
+ [ 'F', 'इ' ],
+ [ 'f', 'ि' ],
+ [ 'G', 'उ' ],
+ [ 'g', 'ु' ],
+ [ 'H', 'फ' ],
+ [ 'h', 'प' ],
+ [ 'J', 'ऱ' ],
+ [ 'j', 'र' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'थ' ],
+ [ 'l', 'त' ],
+ [ ':', 'छ' ],
+ [ ';', 'च' ],
+ [ '"', 'ठ' ],
+ [ '\\\'', 'ट' ],
+ [ 'X', 'ँ' ],
+ [ 'x', 'ं' ],
+ [ 'C', 'ण' ],
+ [ 'c', 'म' ],
+ [ 'v', 'न' ],
+ [ 'b', 'व' ],
+ [ 'N', 'ळ' ],
+ [ 'n', 'ल' ],
+ [ 'M', 'श' ],
+ [ 'm', 'स' ],
+ [ '\\<', 'ष' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'य' ],
+ [ '\\%', 'ज्ञ' ],
+ [ '\\^', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '\\+', 'ॠ' ],
+ [ '\\=', 'ॄ' ],
+ [ 'e', '॑' ],
+ [ 'R', 'ॡ' ],
+ [ 'r', 'ॣ' ],
+ [ 'd', '॒' ],
+ [ 'F', 'ऌ' ],
+ [ 'f', 'ॢ' ],
+ [ 'X', 'ॐ' ],
+ [ ',', '॰' ],
+ [ '\\>', 'ऽ' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+
+ $.ime.register( gomInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/got/got-standard.js b/UniversalLanguageSelector/lib/jquery.ime/rules/got/got-standard.js
new file mode 100644
index 00000000..2e5bf861
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/got/got-standard.js
@@ -0,0 +1,45 @@
+( function ( $ ) {
+ 'use strict';
+
+ var gotStandard = {
+ id: 'got-standard',
+ name: '𐌲𐌿𐍄𐌹𐍃𐌺𐌰 𐍂𐌰𐌶𐌳𐌰',
+ description: 'Gothic keyboard layout',
+ date: '2016-06-27',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Bokareis',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'a', '𐌰' ],
+ [ 'b', '𐌱' ],
+ [ 'g', '𐌲' ],
+ [ 'd', '𐌳' ],
+ [ 'e', '𐌴' ],
+ [ 'q', '𐌵' ],
+ [ 'z', '𐌶' ],
+ [ 'h', '𐌷' ],
+ [ 'T', '𐌸' ],
+ [ 'i', '𐌹' ],
+ [ 'k', '𐌺' ],
+ [ 'l', '𐌻' ],
+ [ 'm', '𐌼' ],
+ [ 'n', '𐌽' ],
+ [ 'j', '𐌾' ],
+ [ 'u', '𐌿' ],
+ [ 'p', '𐍀' ],
+ [ 'c', '𐍁' ],
+ [ 'r', '𐍂' ],
+ [ 's', '𐍃' ],
+ [ 't', '𐍄' ],
+ [ 'w', '𐍅' ],
+ [ 'f', '𐍆' ],
+ [ 'x', '𐍇' ],
+ [ 'v', '𐍈' ],
+ [ 'o', '𐍉' ],
+ [ 'y', '𐍊' ]
+ ]
+ };
+
+ $.ime.register( gotStandard );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-inscript.js
new file mode 100644
index 00000000..ae87a8ec
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-inscript.js
@@ -0,0 +1,113 @@
+( function ( $ ) {
+ 'use strict';
+
+ var guInscript = {
+ id: 'gu-inscript',
+ name: 'ઇનસ્ક્રિપ્ટ',
+ description: 'Inscript keyboard for Gujarati script',
+ date: '2012-10-14',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'X', '\u0A81' ],
+ [ 'x', '\u0A82' ],
+ [ '_', '\u0A83' ],
+ [ 'D', '\u0A85' ],
+ [ 'E', '\u0A86' ],
+ [ 'F', '\u0A87' ],
+ [ 'R', '\u0A88' ],
+ [ 'G', '\u0A89' ],
+ [ 'T', '\u0A8A' ],
+ [ '\\+', '\u0A8B' ],
+ [ '!', '\u0A8D' ],
+ [ 'S', '\u0A8F' ],
+ [ 'W', '\u0A90' ],
+ [ '\\|', '\u0A91' ],
+ [ 'A', '\u0A93' ],
+ [ 'Q', '\u0A94' ],
+ [ 'k', '\u0A95' ],
+ [ 'K', '\u0A96' ],
+ [ 'i', '\u0A97' ],
+ [ 'I', '\u0A98' ],
+ [ 'U', '\u0A99' ],
+ [ ';', '\u0A9A' ],
+ [ '\\:', '\u0A9B' ],
+ [ 'p', '\u0A9C' ],
+ [ 'P', '\u0A9D' ],
+ [ '\\}', '\u0A9E' ],
+ [ '\'', '\u0A9F' ],
+ [ '"', '\u0AA0' ],
+ [ '\\[', '\u0AA1' ],
+ [ '\\{', '\u0AA2' ],
+ [ 'C', '\u0AA3' ],
+ [ 'l', '\u0AA4' ],
+ [ 'L', '\u0AA5' ],
+ [ 'o', '\u0AA6' ],
+ [ 'O', '\u0AA7' ],
+ [ 'v', '\u0AA8' ],
+ [ 'h', '\u0AAA' ],
+ [ 'H', '\u0AAB' ],
+ [ 'y', '\u0AAC' ],
+ [ 'Y', '\u0AAD' ],
+ [ 'c', '\u0AAE' ],
+ [ '/', '\u0AAF' ],
+ [ 'j', '\u0AB0' ],
+ [ 'n', '\u0AB2' ],
+ [ 'N', '\u0AB3' ],
+ [ 'b', '\u0AB5' ],
+ [ 'M', '\u0AB6' ],
+ [ '\\<', '\u0AB7' ],
+ [ 'm', '\u0AB8' ],
+ [ 'u', '\u0AB9' ],
+ [ '\\}', '\u0ABC' ],
+ [ 'e', '\u0ABE' ],
+ [ 'f', '\u0ABF' ],
+ [ 'r', '\u0AC0' ],
+ [ 'g', '\u0AC1' ],
+ [ 't', '\u0AC2' ],
+ [ '\\=', '\u0AC3' ],
+ [ '\\@', '\u0AC5' ],
+ [ 's', '\u0AC7' ],
+ [ 'w', '\u0AC8' ],
+ [ '\\\\', '\u0AC9' ],
+ [ 'a', '\u0ACB' ],
+ [ 'q', '\u0ACC' ],
+ [ 'd', '\u0ACD' ],
+ [ '\\>', '\u0AE4' ],
+ [ '0', '\u0AE6' ],
+ [ '1', '\u0AE7' ],
+ [ '2', '\u0AE8' ],
+ [ '3', '\u0AE9' ],
+ [ '4', '\u0AEA' ],
+ [ '5', '\u0AEB' ],
+ [ '6', '\u0AEC' ],
+ [ '7', '\u0AED' ],
+ [ '8', '\u0AEE' ],
+ [ '9', '\u0AEF' ],
+ [ '\\#', '\u0ACD\u0AB0' ],
+ [ '\\$', '\u0AB0\u0ACD' ],
+ [ '\\%', '\u0A9C\u0ACD\u0A9E' ],
+ [ '\\^', '\u0AA4\u0ACD\u0AB0' ],
+ [ '\\&', '\u0A95\u0ACD\u0AB7' ],
+ [ '\\*', '\u0AB6\u0ACD\u0AB0' ],
+ [ '\\(', '\u200D' ],
+ [ '\\)', '\u200C' ] ],
+
+ patterns_x: [
+ [ 'F', '\u0A8C' ],
+ [ '\\>', '\u0ABD' ],
+ [ '\\=', '\u0AC4' ],
+ [ 'X', '\u0AD0' ],
+ [ '\\+', '\u0AE0' ],
+ [ 'R', '\u0AE1' ],
+ [ 'f', '\u0AE2' ],
+ [ 'r', '\u0AE3' ],
+ [ '\\.', '\u0AE5' ],
+ [ '\\<', '\u0AF1' ],
+ [ '$', '\u20B9' ] ]
+
+ };
+
+ $.ime.register( guInscript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-inscript2.js
new file mode 100644
index 00000000..c2973000
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-inscript2.js
@@ -0,0 +1,118 @@
+( function ( $ ) {
+ 'use strict';
+
+ var guInScript2 = {
+ id: 'gu-inscript2',
+ name: 'ઇનસ્ક્રિપ્ટ ૨',
+ description: 'Enhanced InScript keyboard for Gujarati script',
+ date: '2013-11-15',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '!', 'ઍ' ],
+ [ '1', '૧' ],
+ [ '\\@', 'ૅ' ],
+ [ '2', '૨' ],
+ [ '\\#', '્ર' ],
+ [ '3', '૩' ],
+ [ '\\$', 'ર્' ],
+ [ '4', '૪' ],
+ [ '5', '૫' ],
+ [ '6', '૬' ],
+ [ '7', '૭' ],
+ [ '8', '૮' ],
+ [ '\\(', '(' ],
+ [ '9', '૯' ],
+ [ '\\)', ')' ],
+ [ '0', '૦' ],
+ [ '\\_', 'ઃ' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ઋ' ],
+ [ '\\=', 'ૃ' ],
+ [ 'Q', 'ઔ' ],
+ [ 'q', 'ૌ' ],
+ [ 'W', 'ઐ' ],
+ [ 'w', 'ૈ' ],
+ [ 'E', 'આ' ],
+ [ 'e', 'ા' ],
+ [ 'R', 'ઈ' ],
+ [ 'r', 'ી' ],
+ [ 'T', 'ઊ' ],
+ [ 't', 'ૂ' ],
+ [ 'Y', 'ભ' ],
+ [ 'y', 'બ' ],
+ [ 'U', 'ઙ' ],
+ [ 'u', 'હ' ],
+ [ 'I', 'ઘ' ],
+ [ 'i', 'ગ' ],
+ [ 'O', 'ધ' ],
+ [ 'o', 'દ' ],
+ [ 'P', 'ઝ' ],
+ [ 'p', 'જ' ],
+ [ '\\{', 'ઢ' ],
+ [ '\\[', 'ડ' ],
+ [ '\\}', 'ઞ' ],
+ [ '\\]', '઼' ],
+ [ 'A', 'ઓ' ],
+ [ 'a', 'ો' ],
+ [ 'S', 'એ' ],
+ [ 's', 'ે' ],
+ [ 'D', 'અ' ],
+ [ 'd', '્' ],
+ [ 'F', 'ઇ' ],
+ [ 'f', 'િ' ],
+ [ 'G', 'ઉ' ],
+ [ 'g', 'ુ' ],
+ [ 'H', 'ફ' ],
+ [ 'h', 'પ' ],
+ [ 'j', 'ર' ],
+ [ 'K', 'ખ' ],
+ [ 'k', 'ક' ],
+ [ 'L', 'થ' ],
+ [ 'l', 'ત' ],
+ [ ':', 'છ' ],
+ [ ';', 'ચ' ],
+ [ '"', 'ઠ' ],
+ [ '\\\'', 'ટ' ],
+ [ '\\|', 'ઑ' ],
+ [ '\\', 'ૉ' ],
+ [ 'X', 'ઁ' ],
+ [ 'x', 'ં' ],
+ [ 'C', 'ણ' ],
+ [ 'c', 'મ' ],
+ [ 'v', 'ન' ],
+ [ 'b', 'વ' ],
+ [ 'N', 'ળ' ],
+ [ 'n', 'લ' ],
+ [ 'M', 'શ' ],
+ [ 'm', 'સ' ],
+ [ '\\<', 'ષ' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'ય' ],
+ [ '\\%', 'જ્ઞ' ],
+ [ '\\^', 'ત્ર' ],
+ [ '\\&', 'ક્ષ' ],
+ [ '\\*', 'શ્ર' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '\\+', 'ૠ' ],
+ [ '\\=', 'ૄ' ],
+ [ 'R', 'ૡ' ],
+ [ 'r', 'ૣ' ],
+ [ 'F', 'ઌ' ],
+ [ 'f', 'ૢ' ],
+ [ 'X', 'ૐ' ],
+ [ ',', '૱' ],
+ [ '\\>', '૥' ],
+ [ '\\.', 'ઽ' ]
+ ]
+ };
+
+ $.ime.register( guInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-phonetic.js b/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-phonetic.js
new file mode 100644
index 00000000..2bc4ba24
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-phonetic.js
@@ -0,0 +1,110 @@
+( function ( $ ) {
+ 'use strict';
+
+ var guPhonetic = {
+ id: 'gu-phonetic',
+ name: 'ફોનૅટિક',
+ description: 'Phonetic keyboard for Gujarati script',
+ date: '2013-11-15',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\~', 'ઍ' ],
+ [ '\\`', 'ૅ' ],
+ [ '\\!', '!' ],
+ [ '1', '૧' ],
+ [ '\\@', '@' ],
+ [ '2', '૨' ],
+ [ '\\#', '#' ],
+ [ '3', '૩' ],
+ [ '\\$', '$' ],
+ [ '4', '૪' ],
+ [ '\\&', '૱' ],
+ [ '5', '૫' ],
+ [ '6', '૬' ],
+ [ '7', '૭' ],
+ [ '8', '૮' ],
+ [ '\\(', '(' ],
+ [ '9', '૯' ],
+ [ '\\)', ')' ],
+ [ '0', '૦' ],
+ [ '\\_', '_' ],
+ [ '\\-', '-' ],
+ [ '\\+', '+' ],
+ [ '\\=', '=' ],
+ [ 'Q', 'ઔ' ],
+ [ 'q', 'ઓ' ],
+ [ 'W', 'ઠ' ],
+ [ 'w', 'ટ' ],
+ [ 'E', 'ૈ' ],
+ [ 'e', 'ે' ],
+ [ 'R', 'ૃ' ],
+ [ 'r', 'ર' ],
+ [ 'T', 'થ' ],
+ [ 't', 'ત' ],
+ [ 'Y', 'ય઼' ],
+ [ 'y', 'ય' ],
+ [ 'U', 'ૂ' ],
+ [ 'u', 'ુ' ],
+ [ 'I', 'ી' ],
+ [ 'i', 'િ' ],
+ [ 'O', 'ૌ' ],
+ [ 'o', 'ો' ],
+ [ 'P', 'ફ' ],
+ [ 'p', 'પ' ],
+ [ '\\{', 'ઢ' ],
+ [ '\\[', 'ડ' ],
+ [ '\\}', 'ર઼' ],
+ [ '\\]', 'ઋ' ],
+ [ 'A', 'આ' ],
+ [ 'a', 'ા' ],
+ [ 'S', 'શ' ],
+ [ 's', 'સ' ],
+ [ 'D', 'ધ' ],
+ [ 'd', 'દ' ],
+ [ 'F', 'અ' ],
+ [ 'f', '્' ],
+ [ 'G', 'ઘ' ],
+ [ 'g', 'ગ' ],
+ [ 'H', 'ઃ' ],
+ [ 'h', 'હ' ],
+ [ 'J', 'ઝ' ],
+ [ 'j', 'જ' ],
+ [ 'K', 'ખ' ],
+ [ 'k', 'ક' ],
+ [ 'L', 'ળ' ],
+ [ 'l', 'લ' ],
+ [ ':', 'ઈ' ],
+ [ ';', 'ઇ' ],
+ [ '"', 'ઊ' ],
+ [ '\\\'', 'ઉ' ],
+ [ '\\|', 'ઑ' ],
+ [ '\\\\', 'ૉ' ],
+ [ 'Z', 'ઁ' ],
+ [ 'z', 'ઙ' ],
+ [ 'x', 'ષ' ],
+ [ 'C', 'છ' ],
+ [ 'c', 'ચ' ],
+ [ 'V', 'ઽ' ],
+ [ 'v', 'વ' ],
+ [ 'B', 'ભ' ],
+ [ 'b', 'બ' ],
+ [ 'N', 'ણ' ],
+ [ 'n', 'ન' ],
+ [ 'M', 'ં' ],
+ [ 'm', 'મ' ],
+ [ '\\<', 'ૐ' ],
+ [ ',', ',' ],
+ [ '\\>', '઼' ],
+ [ '\\.', '.' ],
+ [ '\\?', 'ઐ' ],
+ [ '/', 'એ' ],
+ [ 'X', 'ક્ષ' ],
+ [ '\\%', 'જ્ઞ' ],
+ [ '\\^', 'ત્ર' ],
+ [ '\\*', 'શ્ર' ] ]
+ };
+
+ $.ime.register( guPhonetic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-transliteration.js
new file mode 100644
index 00000000..ca1840e7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/gu/gu-transliteration.js
@@ -0,0 +1,156 @@
+( function ( $ ) {
+ 'use strict';
+
+ var guTransliteration = {
+ id: 'gu-transliteration',
+ name: 'લિપ્યંતરણ',
+ description: 'Gujarati transliteration',
+ date: '2012-10-14',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Jaldeep R Vasavada ([[User:JaldeepVasavada]]) / Amir E. Aharoni ([[User:Amire80]])',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 2,
+ maxKeyLength: 4,
+ patterns: [
+ [ 'ક્h', 'c', 'ચ' ],
+ [ '\\\\([A-Za-z\\>_~\\.0-9])', '\\\\', '$1' ],
+
+ [ '([ક-હ]઼?)્a', '$1' ],
+ [ '([ક-હ]઼?)્A', '$1ા' ],
+ [ '([ક-હ]઼?)a', '$1ા' ],
+ [ '([ક-હ]઼?)્i', '$1િ' ],
+ [ '([ક-હ]઼?)(્I|િi|ેe)', '$1ી' ],
+ [ '([ક-હ]઼?)્u', '$1ુ' ],
+ [ '([ક-હ]઼?)(ુu|્U|ોo)', '$1ૂ' ],
+ [ '([ક-હ]઼?)્R', '$1ૃ' ],
+ [ '([ક-હ]઼?)ૃR', '$1ૄ' ],
+ [ '([ક-હ]઼?)ે\\^', '$1ૅ' ],
+ [ '([ક-હ]઼?)્e', '$1ે' ],
+ [ '([ક-હ]઼?)્E', '$1ૅ' ],
+ [ '([ક-હ]઼?)ો\\^', '$1ૉ' ],
+ [ '([ક-હ]઼?)i', '$1ૈ' ],
+ [ '([ક-હ]઼?)્o', '$1ો' ],
+ [ '([ક-હ]઼?)્O', '$1ૉ' ],
+ [ '([ક-હ]઼?)u', '$1ૌ' ],
+
+ [ '([ક-હ]઼?)ૃa', '$1્ર' ],
+ [ '([ક-હ]઼?)ૃA', '$1્રા' ],
+ [ '([ક-હ]઼?)ૃi', '$1્રિ' ],
+ [ '([ક-હ]઼?)ૃI', '$1્રી' ],
+ [ '([ક-હ]઼?)ૃu', '$1્રુ' ],
+ [ '([ક-હ]઼?)ૃU', '$1્રૂ' ],
+ [ '([ક-હ]઼?)ૃ\\^', '$1્રૅ' ],
+ [ '([ક-હ]઼?)ૃe', '$1્રે' ],
+ [ '([ક-હ]઼?)ૃE', '$1્રૅ' ],
+ [ '([ક-હ]઼?)ૃo', '$1્રો' ],
+ [ '([ક-હ]઼?)ૃO', '$1્રો' ],
+ [ '([ક-હ]઼?)ૃ\\~', '$1્ર્' ],
+
+ [ '([ક-હ])્J', '$1઼્' ],
+
+ [ 'અa', 'આ' ],
+ [ '(ઑo|ઉu)', 'ઊ' ],
+ [ 'ઍ\\^', 'એ' ],
+ [ 'અi', 'ઐ' ],
+ [ 'અ\\^', 'ઍ' ],
+ [ '(ઇi|ઍe)', 'ઈ' ],
+ [ 'ઑ\\^', 'ઓ' ],
+ [ 'અu', 'ઔ' ],
+ [ 'ઋR', 'ૠ' ],
+ [ 'ળ્l', 'ઌ' ],
+ [ 'ઌl', 'ૡ' ],
+ [ 'ં\\^', 'ઁ' ],
+ [ 'ઑM', 'ૐ' ],
+
+ [ 'રY', 'ર્ય' ],
+
+ [ 'ક્h', 'ખ્' ], // kh
+ [ 'ગ્h', 'ઘ્' ], // gh
+ [ 'ન્g', 'ઙ્' ], // ng
+ [ 'ચ્h', 'છ્' ], // chh
+ [ 'જ્h', 'ઝ્' ], // jh
+ [ 'જ્n', 'જ્ઞ્' ], // jn
+ [ 'ગ્n', 'જ્ઞ્' ], // gn
+ [ 'ન્j', 'ઞ્' ], // ny
+ [ 'ટ્h', 'ઠ્' ], // Th
+ [ 'ડ્h', 'ઢ્' ], // Dh
+ [ 'ત્h', 'થ્' ], // th
+ [ 'દ્h', 'ધ્' ], // dh
+ [ 'પ્h', 'ફ્' ], // ph
+ [ 'બ્h', 'ભ્' ], // bh
+
+ [ 'ઋa', 'ર' ],
+ [ 'ઋA', 'રા' ],
+ [ 'ઋi', 'રિ' ],
+ [ 'ઋI', 'રી' ],
+ [ 'ઋu', 'રુ' ],
+ [ 'ઋU', 'રૂ' ],
+ [ 'ઋ\\^', 'રૅ' ],
+ [ 'ઋe', 'રે' ],
+ [ 'ઋE', 'રૅ' ],
+ [ 'ઋo', 'રો' ],
+ [ 'ઋ\\~', 'ર્' ],
+
+ [ 'સ્h', 'શ્' ],
+ [ 'ક઼્h', 'ખ' ],
+
+ [ 'a', 'અ' ],
+ [ 'b', 'બ્' ],
+ [ 'c', 'ચ્' ],
+ [ 'd', 'દ્' ],
+ [ 'e', 'એ' ],
+ [ 'f', 'ફ્' ],
+ [ 'g', 'ગ્' ],
+ [ 'h', 'હ્' ],
+ [ 'i', 'ઇ' ],
+ [ 'j', 'જ્' ],
+ [ 'k', 'ક્' ],
+ [ 'l', 'લ્' ],
+ [ 'm', 'મ્' ],
+ [ 'n', 'ન્' ],
+ [ 'o', 'ઓ' ],
+ [ 'p', 'પ્' ],
+ [ 'r', 'ર્' ],
+ [ 's', 'સ્' ],
+ [ 't', 'ત્' ],
+ [ 'u', 'ઉ' ],
+ [ '(v|w)', 'વ્' ],
+ [ 'x', 'ક્ષ્' ],
+ [ 'y', 'ય્' ],
+ [ '(z|Z)', 'ઝ્' ],
+ [ 'A', 'આ' ],
+ [ 'D', 'ડ્' ],
+ [ 'E', 'ઍ' ],
+ [ 'F', 'ફ્' ],
+ [ 'H', 'ઃ' ],
+ [ 'I', 'ઈ' ],
+ [ 'L', 'ળ્' ],
+ [ 'M', 'ં' ],
+ [ 'N', 'ણ્' ],
+ [ 'O', 'ઑ' ],
+ [ 'R', 'ઋ' ],
+ [ 'S', 'ષ્' ],
+ [ 'T', 'ટ્' ],
+ [ 'U', 'ઊ' ],
+ [ '0', '૦' ],
+ [ '1', '૧' ],
+ [ '2', '૨' ],
+ [ '3', '૩' ],
+ [ '4', '૪' ],
+ [ '5', '૫' ],
+ [ '6', '૬' ],
+ [ '7', '૭' ],
+ [ '8', '૮' ],
+ [ '9', '૯' ],
+
+ // Danda characters are only needed in some text, so '.' is not mapped to it.
+ [ '।K', '॥' ], // Double danda, must be before danda
+ [ 'K', '।' ], // Danda
+ [ '//', 'ઽ' ],
+ [ 'J', '઼' ], // Nukta
+ [ '(\u200C)*`', '\u200C' ] ] // ZWNJ
+ };
+
+ $.ime.register( guTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/gur/gur-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/gur/gur-tilde.js
new file mode 100644
index 00000000..c097fd25
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/gur/gur-tilde.js
@@ -0,0 +1,36 @@
+( function ( $ ) {
+ 'use strict';
+
+ var gurTilde = {
+ id: 'gur-tilde',
+ name: 'gur-tilde',
+ description: 'Farefare input keyboard',
+ date: '2021-09-25',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~G', 'Ɣ' ],
+ [ '~g', 'ɣ' ],
+ [ '~I', 'Ɩ' ],
+ [ '~i', 'ɩ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~U', 'Ʋ' ],
+ [ '~u', 'ʋ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~\\{', '\u0303' ], // Combining tilde
+ [ '~-', '\u0304' ], // Combining macron
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( gurTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ha/ha-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ha/ha-tilde.js
new file mode 100644
index 00000000..172ba419
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ha/ha-tilde.js
@@ -0,0 +1,33 @@
+( function ( $ ) {
+ 'use strict';
+
+ var haTilde = {
+ id: 'ha-tilde',
+ name: 'ha-tilde',
+ description: 'Hausa input keyboard',
+ date: '2018-11-30',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~B', 'Ɓ' ],
+ [ '~b', 'ɓ' ],
+ [ '~D', 'Ɗ' ],
+ [ '~d', 'ɗ' ],
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~K', 'Ƙ' ],
+ [ '~k', 'ƙ' ],
+ [ '~R', 'R̃' ],
+ [ '~r', 'r̃' ],
+ [ '~Y', 'Ƴ' ],
+ [ '~y', 'ƴ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\^', '\u0302' ] // Combining circumflex
+ ]
+ };
+
+ $.ime.register( haTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/he/he-standard-2012-extonly.js b/UniversalLanguageSelector/lib/jquery.ime/rules/he/he-standard-2012-extonly.js
new file mode 100644
index 00000000..693381c0
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/he/he-standard-2012-extonly.js
@@ -0,0 +1,68 @@
+( function ( $ ) {
+ 'use strict';
+
+ var heStandardExtOnly = {
+ id: 'he-standard-2012-extonly',
+ name: 'Hebrew 2012',
+ description: 'Hebrew keyboard according to Israeli Standard 1452',
+ date: '2012-10-15',
+ URL: 'http://www.lingnu.com/he/howto/78-si1452.html',
+ author: 'Amir E. Aharoni (אָמִיר אֱלִישָׁע אַהֲרוֹנִי, [[User:Amire80]])',
+ license: 'GPLv3',
+ version: '1.0',
+ // Empty, because the assumption is that
+ // the user is using a Hebrew keyboard already
+ patterns: [],
+ patterns_x: [
+ [ '\u05E9', 'ְ' ], // Sheva, ש
+
+ [ '\u05E7', 'ָ' ], // Qamats, ק
+ [ '\u05E8', 'ֳ' ], // Hataf qamats, ר
+ [ '\u05E4', 'ַ' ], // Patah, פ
+ [ '\\]', 'ֲ' ], // Hataf patah, ]
+
+ [ '\u05E6', 'ֵ' ], // Tsere, צ
+ [ '\u05E1', 'ֶ' ], // Segol, ס
+ [ '\u05D1', 'ֱ' ], // Hataf segol, ב
+
+ [ '\u05D7', 'ִ' ], // Hiriq, ח
+
+ [ '\u05D5', 'ֹ' ], // Holam, ו
+
+ [ '\\\\', 'ֻ' ], // Qubuts, \
+
+ [ '\u05D3', 'ּ' ], // Dagesh, ד
+
+ [ '/', 'ׂ' ], // Sin dot
+ [ '\'', 'ׁ' ], // Shin dot
+
+ [ '-', '\u05BE' ], // Maqaf
+ [ '=', '–' ], // Qav mafrid - en dash
+ [ '\\[', 'ֿ' ], // Rafe
+ [ '1', 'ֽ' ], // Meteg
+ [ '3', '€' ], // Euro sign
+ [ '4', '₪' ], // Sheqel sign
+ [ '5', '°' ], // Degree
+ [ '6', '֫' ], // Ole
+ [ '8', '×' ], // Multiplication
+ [ '9', '\u200e' ], // LRM
+ [ '0', '\u200f' ], // RLM
+ [ '\\.', '÷' ], // Division
+
+ [ '\u05D8', 'װ' ], // Double vav, ט
+ [ '\u05D9', 'ײ' ], // Double yod, י
+ [ '\u05E2', 'ױ' ], // Vav-yod, ע
+
+ // Some source code editors may show the next two lines
+ // in a weird way because of auto-directionality.
+ [ ';', '׳' ], // Geresh, ';'
+ [ ',', '״' ], // Gershayim, ','
+ [ '\u05E3', '„' ], // Opening double quote, ף
+ [ '\u05DA', '”' ], // Closing double quote, ך
+ [ '\u05E5', '‚' ], // Opening single quote, ץ
+ [ '\u05EA', '’' ] // Closing single quote, ת
+ ]
+ };
+
+ $.ime.register( heStandardExtOnly );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/he/he-standard-2012.js b/UniversalLanguageSelector/lib/jquery.ime/rules/he/he-standard-2012.js
new file mode 100644
index 00000000..5ee16598
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/he/he-standard-2012.js
@@ -0,0 +1,117 @@
+( function ( $ ) {
+ 'use strict';
+
+ var heStandard = {
+ id: 'he-standard-2012',
+ name: 'Hebrew 2012 (from English)',
+ description: 'Hebrew keyboard according to Israeli Standard 1452',
+ date: '2012-10-15',
+ URL: 'http://www.lingnu.com/he/howto/78-si1452.html',
+ author: 'Amir E. Aharoni (אָמִיר אֱלִישָׁע אַהֲרוֹנִי, [[User:Amire80]])',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 0,
+ patterns: [
+ [ 'q', '/' ],
+ [ 'w', '\'' ],
+ [ 'e', 'ק' ],
+ [ 'r', 'ר' ],
+ [ 't', 'א' ],
+ [ 'y', 'ט' ],
+ [ 'u', 'ו' ],
+ [ 'i', 'ן' ],
+ [ 'o', 'ם' ],
+ [ 'p', 'פ' ],
+
+ [ 'a', 'ש' ],
+ [ 's', 'ד' ],
+ [ 'd', 'ג' ],
+ [ 'f', 'כ' ],
+ [ 'g', 'ע' ],
+ [ 'h', 'י' ],
+ [ 'j', 'ח' ],
+ [ 'k', 'ל' ],
+ [ 'l', 'ך' ],
+ [ ';', 'ף' ],
+ [ '\'', ',' ],
+
+ [ 'z', 'ז' ],
+ [ 'x', 'ס' ],
+ [ 'c', 'ב' ],
+ [ 'v', 'ה' ],
+ [ 'b', 'נ' ],
+ [ 'n', 'מ' ],
+ [ 'm', 'צ' ],
+ [ ',', 'ת' ],
+ [ '\\.', 'ץ' ],
+ [ '/', '.' ],
+
+ [ '`', ';' ],
+
+ // These characters are mirrored in RTL languages
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+ [ '\\[', ']' ],
+ [ '\\]', '[' ],
+ [ '{', '}' ],
+ [ '}', '{' ],
+ [ '<', '>' ],
+ [ '>', '<' ]
+ ],
+
+ // Your text editor may show the resulting characters in
+ // the next lines as empty. These are diacritics.
+ patterns_x: [
+ [ 'a', 'ְ' ], // Sheva
+
+ [ 'e', 'ָ' ], // Qamats
+ [ 'r', 'ֳ' ], // Hataf qamats
+ [ 'p', 'ַ' ], // Patah
+ [ '\\[', 'ֲ' ], // Hataf patah
+
+ [ 'm', 'ֵ' ], // Tsere
+ [ 'x', 'ֶ' ], // Segol
+ [ 'c', 'ֱ' ], // Hataf segol
+
+ [ 'j', 'ִ' ], // Hiriq
+
+ [ 'u', 'ֹ' ], // Holam
+
+ [ '\\\\', 'ֻ' ], // Qubuts
+
+ [ 's', 'ּ' ], // Dagesh
+
+ [ 'q', 'ׂ' ], // Sin dot
+ [ 'w', 'ׁ' ], // Shin dot
+
+ [ '-', '־' ], // Maqaf
+ [ '=', '–' ], // Qav mafrid - en dash
+ [ '\\]', 'ֿ' ], // Rafe
+ [ '1', 'ֽ' ], // Meteg
+ [ '3', '€' ], // Euro sign
+ [ '4', '₪' ], // Sheqel sign
+ [ '5', '°' ], // Degree
+ [ '6', '֫' ], // Ole
+ [ '8', '×' ], // Multiplication
+ [ '9', '\u200e' ], // LRM
+ [ '0', '\u200f' ], // RLM
+ [ '/', '÷' ], // Division
+
+ [ 'y', 'װ' ], // Double vav
+ [ 'h', 'ײ' ], // Double yod
+ [ 'H', 'ײַ' ], // Yod yod patah
+ [ 'g', 'ױ' ], // Vav-yod
+
+ [ '`', '׳' ], // Geresh
+ [ '\'', '״' ], // Gershayim
+ [ ';', '„' ], // Opening double quote
+ [ 'l', '”' ], // Closing double quote
+ [ '\\.', '‚' ], // Opening single quote
+ [ ',', '’' ] // Closing single quote
+ ]
+ };
+
+ $.ime.register( heStandard );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-bolnagri.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-bolnagri.js
new file mode 100644
index 00000000..7ea921a4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-bolnagri.js
@@ -0,0 +1,108 @@
+( function ( $ ) {
+ 'use strict';
+
+ var hiBolNagri = {
+ id: 'hi-bolnagri',
+ name: 'बोलनागरी',
+ description: 'BolNagri phonetic keymap for Devanagari script',
+ date: '2012-03-28',
+ URL: 'http://www.indlinux.org/wiki/index.php/BolNagri',
+ author: 'G Karunakar',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 1,
+ patterns: [
+ [ 'a', 'ा' ],
+ [ 'b', 'ब' ],
+ [ 'c', 'च' ],
+ [ 'd', 'द' ],
+ [ 'e', 'े' ],
+ [ 'f', 'ट' ],
+ [ 'g', 'ग' ],
+ [ 'h', 'ह' ],
+ [ 'i', 'ि' ],
+ [ 'j', 'ज' ],
+ [ 'k', 'क' ],
+ [ 'l', 'ल' ],
+ [ 'm', 'म' ],
+ [ 'n', 'न' ],
+ [ 'o', 'ो' ],
+ [ 'p', 'प' ],
+ [ 'q', '\u200C' ], // ZWNJ
+ [ 'r', 'र' ],
+ [ 's', 'स' ],
+ [ 't', 'त' ],
+ [ 'u', 'ु' ],
+ [ 'v', 'ड' ],
+ [ 'w', 'व' ],
+ [ 'x', '्' ], // Halant
+ [ 'y', 'य' ],
+ [ 'z', 'श' ],
+ [ 'A', 'आ' ],
+ [ 'B', 'भ' ],
+ [ 'C', 'छ' ],
+ [ 'D', 'ध' ],
+ [ 'E', 'ै' ],
+ [ 'F', 'ठ' ],
+ [ 'G', 'घ' ],
+ [ 'H', 'ः' ], // Visarga
+ [ 'I', 'ी' ],
+ [ 'J', 'झ' ],
+ [ 'K', 'ख' ],
+ [ 'L', 'ळ' ],
+ [ 'M', 'ऽ' ],
+ [ 'N', 'ण' ],
+ [ 'O', 'ौ' ],
+ [ 'P', 'फ' ],
+ [ 'Q', '\u200D' ], // ZWJ
+ [ 'R', 'ृ' ],
+ [ 'S', 'ष' ],
+ [ 'T', 'थ' ],
+ [ 'U', 'ू' ],
+ [ 'V', 'ढ' ],
+ [ 'W', 'ॐ' ],
+ [ 'X', 'ॉ' ],
+ [ 'Y', 'ञ' ],
+ [ 'Z', 'ॅ' ],
+ [ '\\$', '₹' ],
+ [ '\\`', 'ं' ],
+ [ '\\~', 'ँ' ],
+ [ '\\\\', '।' ], // Danda
+ [ '\\|', '॥' ],
+ [ '\\.', '़' ],
+ [ '\\<', '॰' ] ],
+
+ patterns_x: [
+ [ 'a', 'अ' ],
+ [ 'A', 'आ' ],
+ [ 'i', 'इ' ],
+ [ 'I', 'ई' ],
+ [ 'u', 'उ' ],
+ [ 'U', 'ऊ' ], // altgr+U triggers file upload!
+ [ 'e', 'ए' ],
+ [ 'E', 'ऐ' ],
+ [ 'o', 'ओ' ],
+ [ 'O', 'औ' ],
+ [ 'r', 'ऱ' ],
+ [ 'R', 'ऋ' ],
+ [ 'Z', 'ऍ' ],
+ [ 'X', 'ऑ' ],
+ [ 'l', 'ॢ' ],
+ [ 'L', 'ऌ' ],
+ // Dev digits
+ [ '0', '०' ],
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '3', '३' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '9', '९' ] ]
+
+ };
+
+ $.ime.register( hiBolNagri );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-inscript.js
new file mode 100644
index 00000000..9e462769
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-inscript.js
@@ -0,0 +1,122 @@
+( function ( $ ) {
+ 'use strict';
+
+ var hiInScript = {
+ id: 'hi-inscript',
+ name: 'इनस्क्रिप्ट',
+ description: 'InScript keyboard for Devanagari script',
+ date: '2011-02-26',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 1,
+ patterns: [
+ [ 'X', '\u0901' ],
+ [ 'x', '\u0902' ],
+ [ '_', '\u0903' ],
+ [ 'D', '\u0905' ],
+ [ 'E', '\u0906' ],
+ [ 'F', '\u0907' ],
+ [ 'R', '\u0908' ],
+ [ 'G', '\u0909' ],
+ [ 'T', '\u090A' ],
+ [ '\\+', '\u090B' ],
+ [ '!', '\u090D' ],
+ [ 'S', '\u090F' ],
+ [ 'W', '\u0910' ],
+ [ '\\|', '\u0911' ],
+ [ 'A', '\u0913' ],
+ [ 'Q', '\u0914' ],
+ [ 'k', '\u0915' ],
+ [ 'K', '\u0916' ],
+ [ 'i', '\u0917' ],
+ [ 'I', '\u0918' ],
+ [ 'U', '\u0919' ],
+ [ ';', '\u091A' ],
+ [ '\\:', '\u091B' ],
+ [ 'p', '\u091C' ],
+ [ 'P', '\u091D' ],
+ [ '\\}', '\u091E' ],
+ [ '\'', '\u091F' ],
+ [ '"', '\u0920' ],
+ [ '\\[', '\u0921' ],
+ [ '\\{', '\u0922' ],
+ [ 'C', '\u0923' ],
+ [ 'l', '\u0924' ],
+ [ 'L', '\u0925' ],
+ [ 'o', '\u0926' ],
+ [ 'O', '\u0927' ],
+ [ 'v', '\u0928' ],
+ [ 'h', '\u092A' ],
+ [ 'H', '\u092B' ],
+ [ 'y', '\u092C' ],
+ [ 'Y', '\u092D' ],
+ [ 'c', '\u092E' ],
+ [ '/', '\u092F' ],
+ [ 'j', '\u0930' ],
+ [ 'n', '\u0932' ],
+ [ 'b', '\u0935' ],
+ [ 'M', '\u0936' ],
+ [ '\\<', '\u0937' ],
+ [ 'm', '\u0938' ],
+ [ 'u', '\u0939' ],
+ [ '\\]', '\u093C' ],
+ [ 'e', '\u093E' ],
+ [ 'f', '\u093F' ],
+ [ 'r', '\u0940' ],
+ [ 'g', '\u0941' ],
+ [ 't', '\u0942' ],
+ [ '\\=', '\u0943' ],
+ [ '\\@', '\u0945' ],
+ [ 's', '\u0947' ],
+ [ 'w', '\u0948' ],
+ [ '\\\\', '\u0949' ],
+ [ 'a', '\u094B' ],
+ [ 'q', '\u094C' ],
+ [ 'd', '\u094D' ],
+ [ '\\>', '\u0964' ],
+ [ '0', '\u0966' ],
+ [ '1', '\u0967' ],
+ [ '2', '\u0968' ],
+ [ '3', '\u0969' ],
+ [ '4', '\u096A' ],
+ [ '5', '\u096B' ],
+ [ '6', '\u096C' ],
+ [ '7', '\u096D' ],
+ [ '8', '\u096E' ],
+ [ '9', '\u096F' ],
+ [ '\\#', '\u094D\u0930' ],
+ [ '\\$', '\u0930\u094D' ],
+ [ '\\%', '\u091C\u094D\u091E' ],
+ [ '\\^', '\u0924\u094D\u0930' ],
+ [ '\\&', '\u0915\u094D\u0937' ],
+ [ '\\*', '\u0936\u094D\u0930' ],
+ [ '\\(', '\u200D' ],
+ [ '\\)', '\u200C' ] ],
+
+ patterns_x: [
+ [ 'F', '\u090C' ],
+ [ 'N', '\u0933' ],
+ [ '\\>', '\u093D' ],
+ [ '\\=', '\u0944' ],
+ [ 'X', '\u0950' ],
+ [ 'e', '\u0951' ],
+ [ 'd', '\u0952' ],
+ [ 'k', '\u0958' ],
+ [ 'K', '\u0959' ],
+ [ 'i', '\u095A' ],
+ [ 'p', '\u095B' ],
+ [ '\\[', '\u095C' ],
+ [ '\\+', '\u0960' ],
+ [ 'R', '\u0961' ],
+ [ 'f', '\u0962' ],
+ [ 'r', '\u0963' ],
+ [ '\\.', '\u0965' ],
+ [ ',', '\u0970' ],
+ [ '\\$', '\u20B9' ] ]
+
+ };
+
+ $.ime.register( hiInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-inscript2.js
new file mode 100644
index 00000000..2509000c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-inscript2.js
@@ -0,0 +1,127 @@
+( function ( $ ) {
+ 'use strict';
+
+ var hiInScript2 = {
+ id: 'hi-inscript2',
+ name: 'इनस्क्रिप्ट २',
+ description: 'Enhanced InScript keyboard for Hindi language',
+ date: '2013-20-13',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\!', 'ऍ' ],
+ [ '\\@', 'ॅ' ],
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '\\#', '्र' ],
+ [ '3', '३' ],
+ [ '\\$', 'र्' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\]', ']' ],
+ [ '0', '०' ],
+ [ '\\_', 'ः' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ऋ' ],
+ [ '\\=', 'ृ' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ौ' ],
+ [ 'W', 'ऐ' ],
+ [ 'w', 'ै' ],
+ [ 'E', 'आ' ],
+ [ 'e', 'ा' ],
+ [ 'R', 'ई' ],
+ [ 'r', 'ी' ],
+ [ 'T', 'ऊ' ],
+ [ 't', 'ू' ],
+ [ 'Y', 'भ' ],
+ [ 'y', 'ब' ],
+ [ 'U', 'ङ' ],
+ [ 'u', 'ह' ],
+ [ 'I', 'घ' ],
+ [ 'i', 'ग' ],
+ [ 'O', 'ध' ],
+ [ 'o', 'द' ],
+ [ 'P', 'झ' ],
+ [ 'p', 'ज' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ञ' ],
+ [ '\\]', '़' ],
+ [ 'A', 'ओ' ],
+ [ 'a', 'ो' ],
+ [ 'S', 'ए' ],
+ [ 's', 'े' ],
+ [ 'D', 'अ' ],
+ [ 'd', '्' ],
+ [ 'F', 'इ' ],
+ [ 'f', 'ि' ],
+ [ 'G', 'उ' ],
+ [ 'g', 'ु' ],
+ [ 'H', 'फ' ],
+ [ 'h', 'प' ],
+ [ 'j', 'र' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'थ' ],
+ [ 'l', 'त' ],
+ [ ':', 'छ' ],
+ [ ';', 'च' ],
+ [ '"', 'ठ' ],
+ [ '\'', 'ट' ],
+ [ '\\|', 'ऑ' ],
+ [ '\\\\', 'ॉ' ],
+ [ 'X', 'ँ' ],
+ [ 'x', 'ं' ],
+ [ 'C', 'ण' ],
+ [ 'c', 'म' ],
+ [ 'v', 'न' ],
+ [ 'b', 'व' ],
+ [ 'n', 'ल' ],
+ [ 'M', 'श' ],
+ [ 'm', 'स' ],
+ [ '\\<', 'ष' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'य' ],
+ [ '\\%', 'ज्ञ' ],
+ [ '\\^', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '\\+', 'ॠ' ],
+ [ '\\=', 'ॄ' ],
+ [ 'e', '॑' ],
+ [ 'i', 'ग़' ],
+ [ 'R', 'ॡ' ],
+ [ 'r', 'ॣ' ],
+ [ 'p', 'ज़' ],
+ [ '\\{', 'ढ़' ],
+ [ '\\[', 'ड़' ],
+ [ 'H', 'फ़' ],
+ [ 'K', 'ख़' ],
+ [ 'k', 'क़' ],
+ [ 'd', '॒' ],
+ [ 'F', 'ऌ' ],
+ [ 'f', 'ॢ' ],
+ [ 'X', 'ॐ' ],
+ [ 'N', 'ळ' ],
+ [ ',', '॰' ],
+ [ '\\>', 'ऽ' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+
+ $.ime.register( hiInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-phonetic.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-phonetic.js
new file mode 100644
index 00000000..41d99068
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-phonetic.js
@@ -0,0 +1,111 @@
+( function ( $ ) {
+ 'use strict';
+
+ var hiPhonetic = {
+ id: 'hi-phonetic',
+ name: 'फोनेटिक',
+ description: 'Phonetic keyboard for Hindi language',
+ date: '2013-02-09',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '्f', '्\u200c' ],
+ [ '\\~', 'ऎ' ],
+ [ '\\`', 'ॆ' ],
+ [ '\\!', 'ऍ' ],
+ [ '1', '१' ],
+ [ '\\@', 'ॅ' ],
+ [ '2', '२' ],
+ [ '\\#', 'ऑ' ],
+ [ '3', '३' ],
+ [ '\\$', 'ॉ' ],
+ [ '4', '४' ],
+ [ '\\%', 'ञ' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\)', ')' ],
+ [ '0', '०' ],
+ [ '\\_', '_' ],
+ [ '\\-', '-' ],
+ [ '\\+', '+' ],
+ [ '\\=', '=' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ओ' ],
+ [ 'W', 'ठ' ],
+ [ 'w', 'ट' ],
+ [ 'E', 'ै' ],
+ [ 'e', 'े' ],
+ [ 'R', 'ृ' ],
+ [ 'r', 'र' ],
+ [ 'T', 'थ' ],
+ [ 't', 'त' ],
+ [ 'Y', 'य़' ],
+ [ 'y', 'य' ],
+ [ 'U', 'ू' ],
+ [ 'u', 'ु' ],
+ [ 'I', 'ी' ],
+ [ 'i', 'ि' ],
+ [ 'O', 'ौ' ],
+ [ 'o', 'ो' ],
+ [ 'P', 'फ' ],
+ [ 'p', 'प' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ऱ' ],
+ [ '\\]', 'ऋ' ],
+ [ 'A', 'आ' ],
+ [ 'a', 'ा' ],
+ [ 'S', 'श' ],
+ [ 's', 'स' ],
+ [ 'D', 'ध' ],
+ [ 'd', 'द' ],
+ [ 'F', 'अ' ],
+ [ 'f', '्' ],
+ [ 'G', 'घ' ],
+ [ 'g', 'ग' ],
+ [ 'H', 'ः' ],
+ [ 'h', 'ह' ],
+ [ 'J', 'झ' ],
+ [ 'j', 'ज' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'ळ' ],
+ [ 'l', 'ल' ],
+ [ ':', 'ई' ],
+ [ ';', 'इ' ],
+ [ '"', 'ऊ' ],
+ [ '\'', 'उ' ],
+ [ '\\|', 'ऒ' ],
+ [ '\\\\', 'ो' ],
+ [ 'Z', 'ँ' ],
+ [ 'z', 'ङ' ],
+ [ 'x', 'ष' ],
+ [ 'C', 'छ' ],
+ [ 'c', 'च' ],
+ [ 'V', 'ऴ' ],
+ [ 'v', 'व' ],
+ [ 'B', 'भ' ],
+ [ 'b', 'ब' ],
+ [ 'N', 'ण' ],
+ [ 'n', 'न' ],
+ [ 'M', 'ं' ],
+ [ 'm', 'म' ],
+ [ '\\<', 'ऩ' ],
+ [ ',', ',' ],
+ [ '\\>', '़' ],
+ [ '\\.', '।' ],
+ [ '\\?', 'ऐ' ],
+ [ '/', 'ए' ],
+ [ '\\^', 'ज्ञ' ],
+ [ 'X', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ]
+ };
+
+ $.ime.register( hiPhonetic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-transliteration.js
new file mode 100644
index 00000000..442e650d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hi/hi-transliteration.js
@@ -0,0 +1,198 @@
+( function ( $ ) {
+ 'use strict';
+
+ var hiTransliteration = {
+ id: 'hi-transliteration',
+ name: 'लिप्यंतरण',
+ description: 'Transliteration keyboard for Devanagari script',
+ date: '2011-11-20',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 3,
+ patterns: [
+ [ '\\\\([A-Za-z\\>_~\\.0-9])', '\\\\', '$1' ],
+
+ [ '([क-ह]़?)्a', '$1' ],
+
+ // Bug 35990 - Schwa syncope rule in Devanagari transliteration
+ [ '([क-ह]़?)्\\~', '$1्' ],
+
+ // Translate full stop (.) to danda
+ [ '([क-ह]़?)्\\.', '\\~', '$1्।' ],
+ [ '([क-ह]़?)्\\.', '$1।' ],
+
+ // Translate digits
+ [ '([क-ह]़?)्0', '\\~', '$1्०' ],
+ [ '([क-ह]़?)्1', '\\~', '$1्१' ],
+ [ '([क-ह]़?)्2', '\\~', '$1्२' ],
+ [ '([क-ह]़?)्3', '\\~', '$1्३' ],
+ [ '([क-ह]़?)्4', '\\~', '$1्४' ],
+ [ '([क-ह]़?)्5', '\\~', '$1्५' ],
+ [ '([क-ह]़?)्6', '\\~', '$1्६' ],
+ [ '([क-ह]़?)्7', '\\~', '$1्७' ],
+ [ '([क-ह]़?)्8', '\\~', '$1्८' ],
+ [ '([क-ह]़?)्9', '\\~', '$1्९' ],
+ [ '([क-ह]़?)्\\r', '\\~', '$1्\r' ],
+
+ [ '([क-ह]़?)्0', '$1०' ],
+ [ '([क-ह]़?)्1', '$1१' ],
+ [ '([क-ह]़?)्2', '$1२' ],
+ [ '([क-ह]़?)्3', '$1३' ],
+ [ '([क-ह]़?)्4', '$1४' ],
+ [ '([क-ह]़?)्5', '$1५' ],
+ [ '([क-ह]़?)्6', '$1६' ],
+ [ '([क-ह]़?)्7', '$1७' ],
+ [ '([क-ह]़?)्8', '$1८' ],
+ [ '([क-ह]़?)्9', '$1९' ],
+ [ '([क-ह]़?)्\\r', '$1\r' ],
+
+ [ '([क-ह]़?)्A', '$1ा' ],
+ [ '([क-ह]़?)a', '$1ा' ],
+ [ '([क-ह]़?)्i', '$1ि' ],
+ [ '([क-ह]़?)(्I|िi|ेe)', '$1ी' ],
+ [ '([क-ह]़?)्u', '$1ु' ],
+ [ '([क-ह]़?)(ुu|्U|ोo)', '$1ू' ],
+ [ '([क-ह]़?)्R', '$1ृ' ],
+ [ '([क-ह]़?)ृR', '$1ॄ' ],
+ [ '([क-ह]़?)्ळ्l', '$1ॢ' ],
+ [ '([क-ह]़?)ॢl', '$1ॣ' ],
+ [ '([क-ह]़?)्e', '$1े' ],
+ [ '([क-ह]़?)्E', '$1ॅ' ],
+ [ '([क-ह]़?)i', '$1ै' ],
+ [ '([क-ह]़?)्o', '$1ो' ],
+ [ '([क-ह]़?)्O', '$1ॉ' ],
+ [ '([क-ह]़?)u', '$1ौ' ],
+ [ '([क-ह]़?)ृa', '$1्ऱ' ],
+ [ '([क-ह]़?)ृA', '$1्ऱा' ],
+ [ '([क-ह]़?)ृi', '$1्ऱि' ],
+ [ '([क-ह]़?)ृI', '$1्ऱी' ],
+ [ '([क-ह]़?)ृu', '$1्ऱु' ],
+ [ '([क-ह]़?)ृU', '$1्ऱू' ],
+ [ '([क-ह]़?)ृ\\^', '$1्ऱॅ' ],
+ [ '([क-ह]़?)ृe', '$1्ऱॆ' ],
+ [ '([क-ह]़?)ृE', '$1्ऱे' ],
+ [ '([क-ह]़?)ृo', '$1्ऱॊ' ],
+ [ '([क-ह]़?)ृO', '$1्ऱो' ],
+ [ '([क-ह]़?)ृ\\~', '$1्ऱ्' ],
+ [ '([अ-ह]़)(्?)\\`', '$1$2' ],
+ [ '([क-ह])(ा|ि|ी|ु|ू|े|ै|ॅ|ो|ौ|ॉ|ृ|्)\\`', '$1़$2' ],
+
+ [ 'अa', 'आ' ],
+ [ 'उu', 'ऊ' ],
+ [ 'अi', 'ऐ' ],
+ [ 'अ\\^', 'ॲ' ],
+ [ 'इi', 'ई' ],
+ [ 'अu', 'औ' ],
+ [ 'ऋR', 'ॠ' ],
+ [ 'ळ्l', 'ऌ' ],
+ [ 'ऌl', 'ॡ' ],
+ [ 'ं(m|M|\\^)', 'ँ' ], // Candrabindu
+ [ 'आऊM', 'ॐ' ], // AUM (OM)
+
+ [ 'क्h', 'ख्' ],
+ [ 'ग्h', 'घ्' ],
+ [ 'न्g', 'ङ्' ],
+ [ 'च्h', 'छ्' ],
+ [ 'ज्h', 'झ्' ],
+ [ 'न्j', 'ञ्' ],
+ [ 'ट्h', 'ठ्' ],
+ [ 'ड्h', 'ढ्' ],
+ [ 'त्h', 'थ्' ],
+ [ 'द्h', 'ध्' ],
+ [ 'प्h', 'फ्' ],
+ [ 'ब्h', 'भ्' ],
+ [ 'ऋa', 'ऱ' ],
+ [ 'ऋA', 'ऱा' ],
+ [ 'ऋi', 'ऱि' ],
+ [ 'ऋI', 'ऱी' ],
+ [ 'ऋu', 'ऱु' ],
+ [ 'ऋU', 'ऱू' ],
+ [ 'ऋ\\^', 'ऱॅ' ],
+ [ 'ऋe', 'ऱे' ],
+ [ 'ऋE', 'ऱे' ],
+ [ 'ऋo', 'ऱो' ],
+ [ 'ऋO', 'ऱो' ],
+ [ 'ऋ\\~', 'ऱ्' ],
+
+ [ 'स्h', 'श्' ],
+ [ 'श्h', 'ष्' ],
+ [ 'क़्h', 'ख़्' ],
+ [ 'ज़्h', 'ऴ्' ],
+ [ '।\\.', '॥' ], // Double danda
+ [ '([ग्|ज्]़?)्Y', 'ज्ञ्' ],
+
+ [ 'a', 'अ' ],
+ [ 'b', 'ब्' ],
+ [ 'c', 'च्' ],
+ [ 'd', 'द्' ],
+ [ 'e', 'ए' ],
+ [ 'f', 'फ्' ],
+ [ 'g', 'ग्' ],
+ [ 'h', 'ह्' ],
+ [ 'i', 'इ' ],
+ [ 'j', 'ज्' ],
+ [ 'k', 'क्' ],
+ [ 'l', 'ल्' ],
+ [ 'm', 'म्' ],
+ [ 'n', 'न्' ],
+ [ 'o', 'ओ' ],
+ [ 'p', 'प्' ],
+ [ 'q', 'क़्' ],
+ [ 'r', 'र्' ],
+ [ 's', 'स्' ],
+ [ 't', 'त्' ],
+ [ 'u', 'उ' ],
+ [ '(v|w)', 'व्' ],
+ [ 'x', 'क्ष्' ],
+ [ 'y', 'य्' ],
+ [ 'z', 'ज़्' ],
+ [ 'A', 'आ' ],
+ [ 'B', 'ब्ब्' ],
+ [ 'C', 'क्क्' ],
+ [ 'D', 'ड्' ],
+ [ 'E', 'ऍ' ],
+ [ 'F', 'फ़्' ],
+ [ 'G', 'ग्ग्' ],
+ [ 'H', 'ः' ], // Visarga
+ [ 'I', 'ई' ],
+ [ 'J', 'ज्ज्' ],
+ [ 'K', 'क्क्' ],
+ [ 'L', 'ळ्' ],
+ [ 'M', 'ं' ],
+ [ 'N', 'ण्' ],
+ [ 'O', 'ऑ' ],
+ [ 'P', 'प्प्' ],
+ [ 'R', 'ऋ' ],
+ [ 'S', 'श्' ],
+ [ 'T', 'ट्' ],
+ [ 'U', 'ऊ' ],
+ [ '(V|W)', 'व्व्' ],
+ [ 'X', 'क्ष्' ],
+ [ 'Y', 'ञ्' ],
+ [ 'Z', '.' ],
+ [ '0', '०' ],
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '3', '३' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '9', '९' ],
+ [ '~', '्' ], // Virama
+ [ '\\.', '।' ], // Danda
+ [ '//', 'ऽ' ],
+ [ '\\`', '़' ], // Nukta
+
+ // The last rules in the Schwa syncope rule section:
+ // If virama not added explicitly, catch all other characters from the US keyboard,
+ // remove virama and send the character itself ($2).
+ [ '([क-ह]़?)्(.)', '\\~', '$1्$2' ],
+ [ '([क-ह]़?)्(.)', '$1$2' ] ]
+ };
+
+ $.ime.register( hiTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hoc/hoc-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hoc/hoc-transliteration.js
new file mode 100644
index 00000000..005d2164
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hoc/hoc-transliteration.js
@@ -0,0 +1,105 @@
+( function ( $ ) {
+ 'use strict';
+
+ var hocTransliteration = {
+ id: 'hoc-transliteration',
+ name: 'ho transliteration',
+ description: 'Phonetic keyboard for Ho',
+ date: '2018-09-29',
+ author: 'Purty',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 3,
+ patterns: [
+ [ '\\\\([A-Za-z\\>_~\\.0-9@])', '\\\\', '$1' ],
+
+ [ 'a', '𑣁' ],
+ [ '𑣁i', '𑣆' ],
+ [ '𑣁u', '𑣇' ],
+ [ 'b', '𑣗' ],
+ [ 'c', 'c' ],
+ [ 'ch', '𑣏' ],
+ [ 'd', '𑣑' ],
+ [ '𑣑h', '𑣔' ],
+ [ 'e', '𑣈' ],
+
+ [ 'k', '𑣌' ],
+ [ 'l', '𑣚' ],
+ [ 'm', '𑣖' ],
+ [ '𑣓g', '𑣊' ],
+ [ '𑣓j', '𑣍' ],
+ [ '𑣓n', '𑣐' ],
+ [ 'o', '𑣉' ],
+ [ 'p', '𑣘' ],
+ [ 'q', '𑣄' ],
+ [ '𑣜r', '𑣛' ],
+ [ 's', '𑣞' ],
+ [ 't', '𑣒' ],
+ [ '𑣒h', '𑣕' ],
+ [ 'v', '𑣀' ],
+ [ 'w', '𑣟' ],
+ [ 'x', '𑣝' ],
+ [ 'y', '𑣅' ],
+
+ [ 'A', '𑢡' ],
+ [ '𑢡(i|I)', '𑢦' ],
+ [ '𑢡(U|u)', '𑢧' ],
+ [ 'B', '𑢷' ],
+ [ 'C', 'C' ],
+ [ 'C(H|h)', '𑢯' ],
+ [ 'D', '𑢱' ],
+ [ '𑢱(H|h)', '𑢴' ],
+ [ 'E', '𑢨' ],
+ [ 'I', '𑢢' ],
+
+ [ 'K', '𑢬' ],
+ [ 'L', '𑢺' ],
+ [ 'M', '𑢶' ],
+
+ [ '𑢳(G|g)', '𑢪' ],
+ [ '𑢳(J|j)', '𑢭' ],
+ [ '𑢳(N|n)', '𑢰' ],
+ [ 'O', '𑢩' ],
+ [ 'P', '𑢸' ],
+ [ 'Q', '𑢤' ],
+
+ [ '𑢼(R|r)', '𑢻' ],
+ [ 'S', '𑢾' ],
+ [ 'T', '𑢲' ],
+ [ '𑢲(H|h)', '𑢵' ],
+ [ 'U', '𑢣' ],
+ [ 'V', '𑢠' ],
+ [ 'W', '𑢿' ],
+ [ 'X', '𑢽' ],
+ [ 'Y', '𑢥' ],
+ [ 'G', '𑢫' ],
+ [ 'J', '𑢮' ],
+ [ 'N', '𑢳' ],
+ [ 'R', '𑢼' ],
+ [ 'H', '𑢹' ],
+
+ [ 'h', '𑣙' ],
+ [ 'g', '𑣋' ],
+ [ 'j', '𑣎' ],
+ [ '@', '𑣿' ],
+ [ 'r', '𑣜' ],
+ [ 'n', '𑣓' ],
+ [ 'i', '𑣂' ],
+ [ 'u', '𑣃' ],
+
+ [ '0', '𑣠' ],
+ [ '1', '𑣡' ],
+ [ '2', '𑣢' ],
+ [ '3', '𑣣' ],
+ [ '4', '𑣤' ],
+ [ '5', '𑣥' ],
+ [ '6', '𑣦' ],
+ [ '7', '𑣧' ],
+ [ '8', '𑣨' ],
+ [ '9', '𑣩' ]
+ ]
+ };
+
+ $.ime.register( hocTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hr/hr-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hr/hr-kbd.js
new file mode 100644
index 00000000..ea1ed6cf
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hr/hr-kbd.js
@@ -0,0 +1,60 @@
+( function ( $ ) {
+ 'use strict';
+
+ var hrKbd = {
+ id: 'hr-kbd',
+ name: 'Croatian kbd',
+ description: 'Croatian keyboard layout',
+ date: '2013-02-11',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '¸c', 'ç' ],
+ [ '¸C', 'Ç' ],
+ [ '¸s', 'ş' ],
+ [ '¸S', 'Ş' ],
+ [ '¨a', 'ä' ],
+ [ '¨A', 'Ä' ],
+ [ '¨e', 'ë' ],
+ [ '¨E', 'Ë' ],
+ [ '¨o', 'ö' ],
+ [ '¨O', 'Ö' ],
+ [ '¨u', 'ü' ],
+ [ '¨U', 'Ü' ],
+ [ '\\@', '"' ],
+ [ '\\^', '&' ],
+ [ '\\&', '/' ],
+ [ '\\*', '(' ],
+ [ '\\(', ')' ],
+ [ '\\)', '=' ],
+ [ '\\-', '\'' ],
+ [ '\\_', '?' ],
+ [ '\\=', '+' ],
+ [ '\\+', '*' ],
+ [ '\\`', '¸' ],
+ [ '\\~', '¨' ],
+ [ 'y', 'z' ],
+ [ 'Y', 'Z' ],
+ [ '\\[', 'š' ],
+ [ '\\{', 'Š' ],
+ [ '\\]', 'đ' ],
+ [ '\\}', 'Đ' ],
+ [ ';', 'č' ],
+ [ ':', 'Č' ],
+ [ '\'', 'ć' ],
+ [ '"', 'Ć' ],
+ [ '\\\\', 'ž' ],
+ [ '\\|', 'Ž' ],
+ [ 'z', 'y' ],
+ [ 'Z', 'Y' ],
+ [ '\\<', ';' ],
+ [ '\\>', ':' ],
+ [ '/', '-' ],
+ [ '\\?', '_' ]
+ ]
+ };
+
+ $.ime.register( hrKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-emslegacy.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-emslegacy.js
new file mode 100644
index 00000000..2b7bf520
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-emslegacy.js
@@ -0,0 +1,169 @@
+/**
+ * Eastern Armenian phonetic layout introduced by Microsoft in Windows 2000 and depreceated
+ * in Windows 8.
+ * Original layout was created in late 90-ies based on Unicode 3, and was never updated
+ * since release, causing it to be incompatible with Unicode.
+ *
+ * This layout version complies with Unicode 6.1, including all valid Armenian punctuation signs,
+ * mijaket (outside of main Armenian Unicode range) and Dram (AMD) sign under USD sign (Shift + 4).
+ * Please, double-check with Unicode before making any changes here.
+ *
+ * Layout supports extended keys, with AltGr (Alt or Alt+Ctrl on some systems) + key,
+ * producing digits and punctuation marks from standard US keyboard layout.
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ var hyEmslegacy = {
+ id: 'hy-emslegacy',
+ name: 'ՄՍ Արևելահայերեն (հնացած)',
+ description: 'Legacy keyboard layout for Eastern Armenian by Microsoft',
+ date: '2013-02-11',
+ URL: 'http://www.microsoft.com/resources/msdn/goglobal/keyboards/kbdarme.html',
+ author: 'Parag Nemade, Aleksey Chalabyan',
+ license: 'GPLv3',
+ version: '1.1',
+ patterns: [
+ [ '1', '։' ],
+ [ '\\!', '1' ],
+ [ '2', 'ձ' ],
+ [ '\\@', 'Ձ' ],
+ [ '3', 'յ' ],
+ [ '\\#', 'Յ' ],
+ [ '4', '՛' ],
+ [ '\\$', '֏' ],
+ [ '5', ',' ],
+ [ '\\%', '4' ],
+ [ '6', '-' ],
+ [ '\\^', '9' ],
+ [ '7', '․' ],
+ [ '\\&', 'և' ],
+ [ '8', '«' ],
+ [ '\\*', '(' ],
+ [ '9', '»' ],
+ [ '\\(', ')' ],
+ [ '0', 'օ' ],
+ [ '\\)', 'Օ' ],
+ [ '\\-', 'ռ' ],
+ [ '\\_', 'Ռ' ],
+ [ '\\=', 'ժ' ],
+ [ '\\+', 'Ժ' ],
+ [ '\\`', '՝' ],
+ [ '\\~', '՜' ],
+ [ 'q', 'խ' ],
+ [ 'Q', 'Խ' ],
+ [ 'w', 'ւ' ],
+ [ 'W', 'Ւ' ],
+ [ 'e', 'է' ],
+ [ 'E', 'Է' ],
+ [ 'r', 'ր' ],
+ [ 'R', 'Ր' ],
+ [ 't', 'տ' ],
+ [ 'T', 'Տ' ],
+ [ 'y', 'ե' ],
+ [ 'Y', 'Ե' ],
+ [ 'u', 'ը' ],
+ [ 'U', 'Ը' ],
+ [ 'i', 'ի' ],
+ [ 'I', 'Ի' ],
+ [ 'o', 'ո' ],
+ [ 'O', 'Ո' ],
+ [ 'p', 'պ' ],
+ [ 'P', 'Պ' ],
+ [ '\\[', 'չ' ],
+ [ '\\{', 'Չ' ],
+ [ '\\]', 'ջ' ],
+ [ '\\}', 'Ջ' ],
+ [ '\\\\', '\'' ],
+ [ '\\|', '՞' ],
+ [ 'a', 'ա' ],
+ [ 'A', 'Ա' ],
+ [ 's', 'ս' ],
+ [ 'S', 'Ս' ],
+ [ 'd', 'դ' ],
+ [ 'D', 'Դ' ],
+ [ 'f', 'ֆ' ],
+ [ 'F', 'Ֆ' ],
+ [ 'g', 'ք' ],
+ [ 'G', 'Ք' ],
+ [ 'h', 'հ' ],
+ [ 'H', 'Հ' ],
+ [ 'j', 'ճ' ],
+ [ 'J', 'Ճ' ],
+ [ 'k', 'կ' ],
+ [ 'K', 'Կ' ],
+ [ 'l', 'լ' ],
+ [ 'L', 'Լ' ],
+ [ ';', 'թ' ],
+ [ ':', 'Թ' ],
+ [ '\'', 'փ' ],
+ [ '"', 'Փ' ],
+ [ 'z', 'զ' ],
+ [ 'Z', 'Զ' ],
+ [ 'x', 'ց' ],
+ [ 'X', 'Ց' ],
+ [ 'c', 'գ' ],
+ [ 'C', 'Գ' ],
+ [ 'v', 'վ' ],
+ [ 'V', 'Վ' ],
+ [ 'b', 'բ' ],
+ [ 'B', 'Բ' ],
+ [ 'n', 'ն' ],
+ [ 'N', 'Ն' ],
+ [ 'm', 'մ' ],
+ [ 'M', 'Մ' ],
+ [ ',', 'շ' ],
+ [ '\\<', 'Շ' ],
+ [ '\\.', 'ղ' ],
+ [ '\\>', 'Ղ' ],
+ [ '/', 'ծ' ],
+ [ '\\?', 'Ծ' ]
+ ],
+ patterns_x: [
+ [ '1', '1' ],
+ [ '\\!', '!' ],
+ [ '2', '2' ],
+ [ '\\@', '@' ],
+ [ '3', '3' ],
+ [ '\\#', '#' ],
+ [ '4', '4' ],
+ [ '\\$', '$' ],
+ [ '5', '5' ],
+ [ '\\%', '%' ],
+ [ '6', '6' ],
+ [ '\\^', '^' ],
+ [ '7', '7' ],
+ [ '\\&', '&' ],
+ [ '8', '8' ],
+ [ '\\*', '*' ],
+ [ '9', '9' ],
+ [ '\\(', '(' ],
+ [ '0', '0' ],
+ [ '\\)', ')' ],
+ [ '\\-', '-' ],
+ [ '\\_', '_' ],
+ [ '\\=', '=' ],
+ [ '\\+', '+' ],
+ [ '\\`', '`' ],
+ [ '\\~', '~' ],
+ [ '\\[', '[' ],
+ [ '\\{', '{' ],
+ [ '\\]', ']' ],
+ [ '\\}', '}' ],
+ [ '\\\\', '\\' ],
+ [ '\\|', '|' ],
+ [ ';', ';' ],
+ [ '\\:', ':' ],
+ [ '\'', '\'' ],
+ [ '"', '"' ],
+ [ '\\<', '<' ],
+ [ '\\.', '.' ],
+ [ '\\>', '>' ],
+ [ '/', '/' ],
+ [ '\\?', '?' ]
+ ]
+ };
+
+ $.ime.register( hyEmslegacy );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-ephonetic.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-ephonetic.js
new file mode 100644
index 00000000..e0cd1ff2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-ephonetic.js
@@ -0,0 +1,173 @@
+/**
+ * This is a phonetic layout for the Armenian language (hy, arm, hye).
+ * The layout comes from DOS times, and was later popularised by KDWin and
+ * WinKeys keyboard "drivers".
+ * While not as efficient and well-thought as the official typewriter layout, it is very popular as
+ * it uses similary sounding Latin letters, which is very handy, as keyboards in Armenia
+ * don't come engraved with Armenian letters.
+ *
+ * This layout complies with Unicode 6.1, including all valid Armenian punctuation signs,
+ * mijaket (outside of main Armenian Unicode range) and Dram (AMD) sign.
+ * Please, double-check with Unicode before making any changes here.
+ *
+ * Layout supports extended keys, with AltGr (Alt or Alt+Ctrl on some systems) + key,
+ * producing digits and punctuation marks from standard US keyboard layout.
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ var hyEphonetic = {
+ id: 'hy-ephonetic',
+ name: 'Հայերեն Հնչյունային',
+ description: 'Armenian phonetic (Eastern) keyboard layout',
+ date: '2013-07-06',
+ URL: 'http://hy.am',
+ author: 'Aleksey Chalabyan Ալեքսեյ Չալաբյան a.k.a Xelgen',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 0,
+ patterns: [
+ [ '1', 'է' ],
+ [ '\\!', 'Է' ],
+ [ '2', 'թ' ],
+ [ '\\@', 'Թ' ],
+ [ '3', 'փ' ],
+ [ '\\#', 'Փ' ],
+ [ '4', 'ձ' ],
+ [ '\\$', 'Ձ' ],
+ [ '5', 'ջ' ],
+ [ '\\%', 'Ջ' ],
+ [ '6', '֏' ],
+ [ '\\^', '(' ],
+ [ '7', 'և' ],
+ [ '\\&', ')' ],
+ [ '8', 'ր' ],
+ [ '\\*', 'Ր' ],
+ [ '9', 'չ' ],
+ [ '\\(', 'Չ' ],
+ [ '0', 'ճ' ],
+ [ '\\)', 'Ճ' ],
+ [ '\\-', '–' ],
+ [ '\\_', '—' ],
+ [ '\\=', 'ժ' ],
+ [ '\\+', 'Ժ' ],
+ [ '\\`', '՝' ],
+ [ '\\~', '՜' ],
+ [ 'q', 'ք' ],
+ [ 'Q', 'Ք' ],
+ [ 'w', 'ո' ],
+ [ 'W', 'Ո' ],
+ [ 'e', 'ե' ],
+ [ 'E', 'Ե' ],
+ [ 'r', 'ռ' ],
+ [ 'R', 'Ռ' ],
+ [ 't', 'տ' ],
+ [ 'T', 'Տ' ],
+ [ 'y', 'ը' ],
+ [ 'Y', 'Ը' ],
+ [ 'u', 'ւ' ],
+ [ 'U', 'Ւ' ],
+ [ 'i', 'ի' ],
+ [ 'I', 'Ի' ],
+ [ 'o', 'օ' ],
+ [ 'O', 'Օ' ],
+ [ 'p', 'պ' ],
+ [ 'P', 'Պ' ],
+ [ '\\[', 'խ' ],
+ [ '\\{', 'Խ' ],
+ [ '\\]', 'ծ' ],
+ [ '\\}', 'Ծ' ],
+ [ '\\\\', 'շ' ],
+ [ '\\|', 'Շ' ],
+ [ 'a', 'ա' ],
+ [ 'A', 'Ա' ],
+ [ 's', 'ս' ],
+ [ 'S', 'Ս' ],
+ [ 'd', 'դ' ],
+ [ 'D', 'Դ' ],
+ [ 'f', 'ֆ' ],
+ [ 'F', 'Ֆ' ],
+ [ 'g', 'գ' ],
+ [ 'G', 'Գ' ],
+ [ 'h', 'հ' ],
+ [ 'H', 'Հ' ],
+ [ 'j', 'յ' ],
+ [ 'J', 'Յ' ],
+ [ 'k', 'կ' ],
+ [ 'K', 'Կ' ],
+ [ 'l', 'լ' ],
+ [ 'L', 'Լ' ],
+ [ ';', ';' ],
+ [ ':', '։' ],
+ [ '\'', '՛' ],
+ [ '"', '"' ],
+ [ 'z', 'զ' ],
+ [ 'Z', 'Զ' ],
+ [ 'x', 'ղ' ],
+ [ 'X', 'Ղ' ],
+ [ 'c', 'ց' ],
+ [ 'C', 'Ց' ],
+ [ 'v', 'վ' ],
+ [ 'V', 'Վ' ],
+ [ 'b', 'բ' ],
+ [ 'B', 'Բ' ],
+ [ 'n', 'ն' ],
+ [ 'N', 'Ն' ],
+ [ 'm', 'մ' ],
+ [ 'M', 'Մ' ],
+ [ ',', ',' ],
+ [ '\\<', '«' ],
+ [ '\\.', '․' ],
+ [ '\\>', '»' ],
+ [ '/', '…' ],
+ [ '\\?', '՞' ]
+ ],
+ patterns_x: [
+ [ '1', '1' ],
+ [ '\\!', '!' ],
+ [ '2', '2' ],
+ [ '\\@', '@' ],
+ [ '3', '3' ],
+ [ '\\#', '#' ],
+ [ '4', '4' ],
+ [ '\\$', '$' ],
+ [ '5', '5' ],
+ [ '\\%', '%' ],
+ [ '6', '6' ],
+ [ '\\^', '^' ],
+ [ '7', '7' ],
+ [ '\\&', '&' ],
+ [ '8', '8' ],
+ [ '\\*', '*' ],
+ [ '9', '9' ],
+ [ '\\(', '(' ],
+ [ '0', '0' ],
+ [ '\\)', ')' ],
+ [ '\\-', '-' ],
+ [ '\\_', '_' ],
+ [ '\\=', '=' ],
+ [ '\\+', '+' ],
+ [ '\\`', '`' ],
+ [ '\\~', '~' ],
+ [ '\\[', '[' ],
+ [ '\\{', '{' ],
+ [ '\\]', ']' ],
+ [ '\\}', '}' ],
+ [ '\\\\', '\\' ],
+ [ '\\|', '|' ],
+ [ ';', ';' ],
+ [ '\\:', ':' ],
+ [ '\'', '\'' ],
+ [ '"', '"' ],
+ [ '\\<', '<' ],
+ [ '\\.', '.' ],
+ [ '\\>', '>' ],
+ [ '/', '/' ],
+ [ '\\?', '?' ]
+ ]
+ };
+
+ $.ime.register( hyEphonetic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-ephoneticalt.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-ephoneticalt.js
new file mode 100644
index 00000000..b6db274f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-ephoneticalt.js
@@ -0,0 +1,171 @@
+/**
+ * This is alternative phonetic layout for Armenian language (hy, arm, hye).
+ * Based on Armenian phonetic layout, it improves few things, by placing ր under latin r,
+ * as ր is much more frequent in Armenian. ռ goes under 8, where ր is in standart phonetic.
+ * Another change, which is not yet in xkb, ( as of July 2013), is swapping ֆ and թ: Ֆ is
+ * placed under F, where left index finger is, but is the least used letter in Armenian,
+ * so much more used թ takes it place, comming down from 2.
+ *
+ * This layout complies with Unicode 6.1, including all valid Armenian punctuation signs,
+ * mijaket (outside of main Armenian Unicode range) and Dram (AMD) sign.
+ * Please, double-check with Unicode before making any changes here.
+ *
+ * Layout supports extended keys, with AltGr (Alt or Alt+Ctrl on some systems) + key,
+ * producing digits and punctuation marks from standard US keyboard layout.
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ var hyEphonetic = {
+ id: 'hy-ephoneticalt',
+ name: 'Հայերեն Հնչյունային (R->Ր, F->Թ)',
+ description: 'Eastern Armenian alternative phonetic keyboard layout',
+ date: '2013-07-08',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Aleksey Chalabyan Ալեքսեյ Չալաբյան a.k.a Xelgen',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', 'է' ],
+ [ '\\!', 'Է' ],
+ [ '2', 'ֆ' ],
+ [ '\\@', 'Ֆ' ],
+ [ '3', 'փ' ],
+ [ '\\#', 'Փ' ],
+ [ '4', 'ձ' ],
+ [ '\\$', 'Ձ' ],
+ [ '5', 'ջ' ],
+ [ '\\%', 'Ջ' ],
+ [ '6', '֏' ],
+ [ '\\^', '(' ],
+ [ '7', 'և' ],
+ [ '\\&', ')' ],
+ [ '8', 'ռ' ],
+ [ '\\*', 'Ռ' ],
+ [ '9', 'չ' ],
+ [ '\\(', 'Չ' ],
+ [ '0', 'ճ' ],
+ [ '\\)', 'Ճ' ],
+ [ '\\-', '–' ],
+ [ '\\_', '—' ],
+ [ '\\=', 'ժ' ],
+ [ '\\+', 'Ժ' ],
+ [ '\\`', '՝' ],
+ [ '\\~', '՜' ],
+ [ 'q', 'ք' ],
+ [ 'Q', 'Ք' ],
+ [ 'w', 'ո' ],
+ [ 'W', 'Ո' ],
+ [ 'e', 'ե' ],
+ [ 'E', 'Ե' ],
+ [ 'r', 'ր' ],
+ [ 'R', 'Ր' ],
+ [ 't', 'տ' ],
+ [ 'T', 'Տ' ],
+ [ 'y', 'ը' ],
+ [ 'Y', 'Ը' ],
+ [ 'u', 'ւ' ],
+ [ 'U', 'Ւ' ],
+ [ 'i', 'ի' ],
+ [ 'I', 'Ի' ],
+ [ 'o', 'օ' ],
+ [ 'O', 'Օ' ],
+ [ 'p', 'պ' ],
+ [ 'P', 'Պ' ],
+ [ '\\[', 'խ' ],
+ [ '\\{', 'Խ' ],
+ [ '\\]', 'ծ' ],
+ [ '\\}', 'Ծ' ],
+ [ '\\\\', 'շ' ],
+ [ '\\|', 'Շ' ],
+ [ 'a', 'ա' ],
+ [ 'A', 'Ա' ],
+ [ 's', 'ս' ],
+ [ 'S', 'Ս' ],
+ [ 'd', 'դ' ],
+ [ 'D', 'Դ' ],
+ [ 'f', 'թ' ],
+ [ 'F', 'Թ' ],
+ [ 'g', 'գ' ],
+ [ 'G', 'Գ' ],
+ [ 'h', 'հ' ],
+ [ 'H', 'Հ' ],
+ [ 'j', 'յ' ],
+ [ 'J', 'Յ' ],
+ [ 'k', 'կ' ],
+ [ 'K', 'Կ' ],
+ [ 'l', 'լ' ],
+ [ 'L', 'Լ' ],
+ [ ';', ';' ],
+ [ ':', '։' ],
+ [ '\'', '՛' ],
+ [ '"', '"' ],
+ [ 'z', 'զ' ],
+ [ 'Z', 'Զ' ],
+ [ 'x', 'ղ' ],
+ [ 'X', 'Ղ' ],
+ [ 'c', 'ց' ],
+ [ 'C', 'Ց' ],
+ [ 'v', 'վ' ],
+ [ 'V', 'Վ' ],
+ [ 'b', 'բ' ],
+ [ 'B', 'Բ' ],
+ [ 'n', 'ն' ],
+ [ 'N', 'Ն' ],
+ [ 'm', 'մ' ],
+ [ 'M', 'Մ' ],
+ [ ',', ',' ],
+ [ '\\<', '«' ],
+ [ '\\.', '․' ],
+ [ '\\>', '»' ],
+ [ '/', '…' ],
+ [ '\\?', '՞' ]
+ ],
+ patterns_x: [
+ [ '1', '1' ],
+ [ '\\!', '!' ],
+ [ '2', '2' ],
+ [ '\\@', '@' ],
+ [ '3', '3' ],
+ [ '\\#', '#' ],
+ [ '4', '4' ],
+ [ '\\$', '$' ],
+ [ '5', '5' ],
+ [ '\\%', '%' ],
+ [ '6', '6' ],
+ [ '\\^', '^' ],
+ [ '7', '7' ],
+ [ '\\&', '&' ],
+ [ '8', '8' ],
+ [ '\\*', '*' ],
+ [ '9', '9' ],
+ [ '\\(', '(' ],
+ [ '0', '0' ],
+ [ '\\)', ')' ],
+ [ '\\-', '-' ],
+ [ '\\_', '_' ],
+ [ '\\=', '=' ],
+ [ '\\+', '+' ],
+ [ '\\`', '`' ],
+ [ '\\~', '~' ],
+ [ '\\[', '[' ],
+ [ '\\{', '{' ],
+ [ '\\]', ']' ],
+ [ '\\}', '}' ],
+ [ '\\\\', '\\' ],
+ [ '\\|', '|' ],
+ [ ';', ';' ],
+ [ '\\:', ':' ],
+ [ '\'', '\'' ],
+ [ '"', '"' ],
+ [ '\\<', '<' ],
+ [ '\\.', '.' ],
+ [ '\\>', '>' ],
+ [ '/', '/' ],
+ [ '\\?', '?' ]
+ ]
+ };
+
+ $.ime.register( hyEphonetic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-typewriter.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-typewriter.js
new file mode 100644
index 00000000..a899eabe
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-typewriter.js
@@ -0,0 +1,168 @@
+/**
+ * Armenian typewriter layout
+ * Based on themonly official state standard for Armenian keyboard layout:
+ * http://www.sarm.am/en/standarts/view/5741
+ *
+ * This layout complies with Unicode 6.1, including all valid Armenian punctuation signs,
+ * mijaket (outside of main Armenian Unicode range) and Dram (AMD) sign.
+ * Please, double-check with Unicode before making any changes here.
+ *
+ * Layout supports extended keys, with AltGr (Alt or Alt+Ctrl on some systems) + key,
+ * producing digits and punctuation marks from standard US keyboard layout.
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ var hyTypewriter = {
+ id: 'hy-typewriter',
+ name: 'Հայերեն Գրամեքենա',
+ description: 'Armenian typewriter keyboard layout',
+ date: '2013-07-08',
+ URL: 'http://www.sarm.am/en/standarts/view/5741',
+ author: 'Aleksey Chalabyan Ալեքսեյ Չալաբյան a.k.a Xelgen',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', 'ֆ' ],
+ [ '\\!', 'Ֆ' ],
+ [ '2', 'ձ' ],
+ [ '\\@', 'Ձ' ],
+ [ '3', '-' ],
+ [ '\\#', '' ],
+ [ '4', ',' ],
+ [ '\\$', '֏' ],
+ [ '5', '։' ],
+ [ '\\%', '֊' ],
+ [ '6', '՞' ],
+ [ '\\^', '—' ],
+ [ '7', '․' ],
+ [ '\\&', 'և' ],
+ [ '8', '՛' ],
+ [ '\\*', '՚' ],
+ [ '9', ')' ],
+ [ '\\(', '(' ],
+ [ '0', 'օ' ],
+ [ '\\)', 'Օ' ],
+ [ '\\-', 'է' ],
+ [ '\\_', 'Է' ],
+ [ '\\=', 'ղ' ],
+ [ '\\+', 'Ղ' ],
+ [ '\\`', '՝' ],
+ [ '\\~', '՜' ],
+ [ 'q', 'ճ' ],
+ [ 'Q', 'Ճ' ],
+ [ 'w', 'փ' ],
+ [ 'W', 'Փ' ],
+ [ 'e', 'բ' ],
+ [ 'E', 'Բ' ],
+ [ 'r', 'ս' ],
+ [ 'R', 'Ս' ],
+ [ 't', 'մ' ],
+ [ 'T', 'Մ' ],
+ [ 'y', 'ո' ],
+ [ 'Y', 'Ո' ],
+ [ 'u', 'ւ' ],
+ [ 'U', 'Ւ' ],
+ [ 'i', 'կ' ],
+ [ 'I', 'Կ' ],
+ [ 'o', 'ը' ],
+ [ 'O', 'Ը' ],
+ [ 'p', 'թ' ],
+ [ 'P', 'Թ' ],
+ [ '\\[', 'ծ' ],
+ [ '\\{', 'Ծ' ],
+ [ '\\]', 'ց' ],
+ [ '\\}', 'Ց' ],
+ [ '\\\\', '»' ],
+ [ '\\|', '«' ],
+ [ 'a', 'ջ' ],
+ [ 'A', 'Ջ' ],
+ [ 's', 'վ' ],
+ [ 'S', 'Վ' ],
+ [ 'd', 'գ' ],
+ [ 'D', 'Գ' ],
+ [ 'f', 'ե' ],
+ [ 'F', 'Ե' ],
+ [ 'g', 'ա' ],
+ [ 'G', 'Ա' ],
+ [ 'h', 'ն' ],
+ [ 'H', 'Ն' ],
+ [ 'j', 'ի' ],
+ [ 'J', 'Ի' ],
+ [ 'k', 'տ' ],
+ [ 'K', 'Տ' ],
+ [ 'l', 'հ' ],
+ [ 'L', 'Հ' ],
+ [ ';', 'պ' ],
+ [ ':', 'Պ' ],
+ [ '\'', 'ր' ],
+ [ '"', 'Ր' ],
+ [ 'z', 'ժ' ],
+ [ 'Z', 'Ժ' ],
+ [ 'x', 'դ' ],
+ [ 'X', 'Դ' ],
+ [ 'c', 'չ' ],
+ [ 'C', 'Չ' ],
+ [ 'v', 'յ' ],
+ [ 'V', 'Յ' ],
+ [ 'b', 'զ' ],
+ [ 'B', 'Զ' ],
+ [ 'n', 'լ' ],
+ [ 'N', 'Լ' ],
+ [ 'm', 'ք' ],
+ [ 'M', 'Ք' ],
+ [ ',', 'խ' ],
+ [ '\\<', 'Խ' ],
+ [ '\\.', 'շ' ],
+ [ '\\>', 'Շ' ],
+ [ '/', 'ռ' ],
+ [ '\\?', 'Ռ' ]
+ ],
+ patterns_x: [
+ [ '1', '1' ],
+ [ '\\!', '!' ],
+ [ '2', '2' ],
+ [ '\\@', '@' ],
+ [ '3', '3' ],
+ [ '\\#', '#' ],
+ [ '4', '4' ],
+ [ '\\$', '$' ],
+ [ '5', '5' ],
+ [ '\\%', '%' ],
+ [ '6', '6' ],
+ [ '\\^', '^' ],
+ [ '7', '7' ],
+ [ '\\&', '&' ],
+ [ '8', '8' ],
+ [ '\\*', '*' ],
+ [ '9', '9' ],
+ [ '\\(', '(' ],
+ [ '0', '0' ],
+ [ '\\)', ')' ],
+ [ '\\-', '-' ],
+ [ '\\_', '_' ],
+ [ '\\=', '=' ],
+ [ '\\+', '+' ],
+ [ '\\`', '`' ],
+ [ '\\~', '~' ],
+ [ '\\[', '[' ],
+ [ '\\{', '{' ],
+ [ '\\]', ']' ],
+ [ '\\}', '}' ],
+ [ '\\\\', '\\' ],
+ [ '\\|', '|' ],
+ [ ';', ';' ],
+ [ '\\:', ':' ],
+ [ '\'', '\'' ],
+ [ '"', '"' ],
+ [ '\\<', '<' ],
+ [ '\\.', '.' ],
+ [ '\\>', '>' ],
+ [ '/', '/' ],
+ [ '\\?', '?' ]
+ ]
+ };
+
+ $.ime.register( hyTypewriter );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-wmslegacy.js b/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-wmslegacy.js
new file mode 100644
index 00000000..57fa71d7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/hy/hy-wmslegacy.js
@@ -0,0 +1,169 @@
+/**
+ * Western Armenian phonetic layout introduced by Microsoft in Windows 2000 and depreceated
+ * in Windows 8.
+ * Original layout was created in late 90-ies based on Unicode 3, and was never updated
+ * since release, causing it to be incompatible with Unicode.
+ *
+ * This layout version complies with Unicode 6.1, including all valid Armenian punctuation signs,
+ * mijaket (outside of main Armenian Unicode range) and Dram (AMD) sign under USD sign (Shift + 4).
+ * Please, double-check with Unicode before making any changes here.
+ *
+ * Layout supports extended keys, with AltGr (Alt or Alt+Ctrl on some systems) + key,
+ * producing digits and punctuation marks from standard US keyboard layout.
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ var hyWmslegacy = {
+ id: 'hy-wmslegacy',
+ name: 'ՄՍ Արևմտահայերեն (հնացած)',
+ description: 'Legacy keyboard layout for Western Armenian by Microsoft',
+ date: '2013-07-08',
+ URL: 'http://www.microsoft.com/resources/msdn/goglobal/keyboards/kbdarmw.html',
+ author: 'Aleksey Chalabyan Ալեքսեյ Չալաբյան a.k.a Xelgen',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '։' ],
+ [ '\\!', '1' ],
+ [ '2', 'ձ' ],
+ [ '\\@', 'Ձ' ],
+ [ '3', 'յ' ],
+ [ '\\#', 'Յ' ],
+ [ '4', '՛' ],
+ [ '\\$', '֏' ],
+ [ '5', ',' ],
+ [ '\\%', '4' ],
+ [ '6', '-' ],
+ [ '\\^', '9' ],
+ [ '7', '․' ],
+ [ '\\&', 'և' ],
+ [ '8', '«' ],
+ [ '\\*', '(' ],
+ [ '9', '»' ],
+ [ '\\(', ')' ],
+ [ '0', 'օ' ],
+ [ '\\)', 'Օ' ],
+ [ '\\-', 'ռ' ],
+ [ '\\_', 'Ռ' ],
+ [ '\\=', 'ժ' ],
+ [ '\\+', 'Ժ' ],
+ [ '\\`', '՝' ],
+ [ '\\~', '՜' ],
+ [ 'q', 'խ' ],
+ [ 'Q', 'Խ' ],
+ [ 'w', 'վ' ],
+ [ 'W', 'Վ' ],
+ [ 'e', 'է' ],
+ [ 'E', 'Է' ],
+ [ 'r', 'ր' ],
+ [ 'R', 'Ր' ],
+ [ 't', 'դ' ],
+ [ 'T', 'Դ' ],
+ [ 'y', 'ե' ],
+ [ 'Y', 'Ե' ],
+ [ 'u', 'ը' ],
+ [ 'U', 'Ը' ],
+ [ 'i', 'ի' ],
+ [ 'I', 'Ի' ],
+ [ 'o', 'ո' ],
+ [ 'O', 'Ո' ],
+ [ 'p', 'բ' ],
+ [ 'P', 'Բ' ],
+ [ '\\[', 'չ' ],
+ [ '\\{', 'Չ' ],
+ [ '\\]', 'ջ' ],
+ [ '\\}', 'Ջ' ],
+ [ '\\\\', '\'' ],
+ [ '\\|', '՞' ],
+ [ 'a', 'ա' ],
+ [ 'A', 'Ա' ],
+ [ 's', 'ս' ],
+ [ 'S', 'Ս' ],
+ [ 'd', 'տ' ],
+ [ 'D', 'Տ' ],
+ [ 'f', 'ֆ' ],
+ [ 'F', 'Ֆ' ],
+ [ 'g', 'կ' ],
+ [ 'G', 'Կ' ],
+ [ 'h', 'հ' ],
+ [ 'H', 'Հ' ],
+ [ 'j', 'ճ' ],
+ [ 'J', 'Ճ' ],
+ [ 'k', 'ք' ],
+ [ 'K', 'Ք' ],
+ [ 'l', 'լ' ],
+ [ 'L', 'Լ' ],
+ [ ';', 'թ' ],
+ [ ':', 'Թ' ],
+ [ '\'', 'փ' ],
+ [ '"', 'Փ' ],
+ [ 'z', 'զ' ],
+ [ 'Z', 'Զ' ],
+ [ 'x', 'ց' ],
+ [ 'X', 'Ց' ],
+ [ 'c', 'գ' ],
+ [ 'C', 'Գ' ],
+ [ 'v', 'ւ' ],
+ [ 'V', 'Ւ' ],
+ [ 'b', 'պ' ],
+ [ 'B', 'Պ' ],
+ [ 'n', 'ն' ],
+ [ 'N', 'Ն' ],
+ [ 'm', 'մ' ],
+ [ 'M', 'Մ' ],
+ [ ',', 'շ' ],
+ [ '\\<', 'Շ' ],
+ [ '\\.', 'ղ' ],
+ [ '\\>', 'Ղ' ],
+ [ '/', 'ծ' ],
+ [ '\\?', 'Ծ' ]
+ ],
+ patterns_x: [
+ [ '1', '1' ],
+ [ '\\!', '!' ],
+ [ '2', '2' ],
+ [ '\\@', '@' ],
+ [ '3', '3' ],
+ [ '\\#', '#' ],
+ [ '4', '4' ],
+ [ '\\$', '$' ],
+ [ '5', '5' ],
+ [ '\\%', '%' ],
+ [ '6', '6' ],
+ [ '\\^', '^' ],
+ [ '7', '7' ],
+ [ '\\&', '&' ],
+ [ '8', '8' ],
+ [ '\\*', '*' ],
+ [ '9', '9' ],
+ [ '\\(', '(' ],
+ [ '0', '0' ],
+ [ '\\)', ')' ],
+ [ '\\-', '-' ],
+ [ '\\_', '_' ],
+ [ '\\=', '=' ],
+ [ '\\+', '+' ],
+ [ '\\`', '`' ],
+ [ '\\~', '~' ],
+ [ '\\[', '[' ],
+ [ '\\{', '{' ],
+ [ '\\]', ']' ],
+ [ '\\}', '}' ],
+ [ '\\\\', '\\' ],
+ [ '\\|', '|' ],
+ [ ';', ';' ],
+ [ '\\:', ':' ],
+ [ '\'', '\'' ],
+ [ '"', '"' ],
+ [ '\\<', '<' ],
+ [ '\\.', '.' ],
+ [ '\\>', '>' ],
+ [ '/', '/' ],
+ [ '\\?', '?' ]
+ ]
+ };
+
+ $.ime.register( hyWmslegacy );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ig/ig-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ig/ig-tilde.js
new file mode 100644
index 00000000..cef3986d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ig/ig-tilde.js
@@ -0,0 +1,29 @@
+( function ( $ ) {
+ 'use strict';
+
+ var igTilde = {
+ id: 'ig-tilde',
+ name: 'ig-tilde',
+ description: 'Igbo input keyboard',
+ date: '2018-11-30',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~I', 'Ị' ],
+ [ '~i', 'ị' ],
+ [ '~N', 'Ṅ' ],
+ [ '~n', 'ṅ' ],
+ [ '~O', 'Ọ' ],
+ [ '~o', 'ọ' ],
+ [ '~U', 'Ụ' ],
+ [ '~u', 'ụ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\-', '\u0304' ] // Combining macron
+ ]
+ };
+
+ $.ime.register( igTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/is/is-normforms.js b/UniversalLanguageSelector/lib/jquery.ime/rules/is/is-normforms.js
new file mode 100644
index 00000000..a37c99b0
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/is/is-normforms.js
@@ -0,0 +1,78 @@
+( function ( $ ) {
+ 'use strict';
+
+ var defs = {
+ id: 'is-normforms',
+ name: 'Íslenska',
+ description: 'Islandic input method with most common form transliterated',
+ date: '2012-12-04',
+ URL: 'http://www.evertype.com/alphabets/icelandic.pdf',
+ author: 'John Erling Blad',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 3,
+ patterns: [
+ // Uses "'" as an accent
+ [ '\'a', 'á' ],
+ [ '\'A', 'Á' ],
+ [ '\'i', 'í' ],
+ [ '\'I', 'Í' ],
+ [ '\'e', 'é' ],
+ [ '\'E', 'É' ],
+ [ '\'o', 'ó' ],
+ [ '\'O', 'Ó' ],
+ [ '\'u', 'ú' ],
+ [ '\'U', 'Ú' ],
+ [ '\'y', 'ý' ],
+ [ '\'Y', 'Ý' ],
+ // Uses "~" as "approximatly similar to"
+ [ '~a', 'ä' ],
+ [ '~A', 'Ä' ],
+ [ '~e', 'ë' ],
+ [ '~E', 'Ë' ],
+ [ '~d', 'ð' ],
+ [ '~D', 'Ð' ],
+ [ '~o', 'ø' ],
+ [ '~O', 'Ø' ],
+ // The most common transliterations (also the Danish letters)
+ [ 'th', 'þ' ],
+ [ 'TH', 'Þ' ],
+ [ 'Th', 'Þ' ],
+ [ 'aa', 'å' ],
+ [ 'AA', 'Å' ],
+ [ 'Aa', 'Å' ],
+ [ 'ae', 'æ' ],
+ [ 'AE', 'Æ' ],
+ [ 'Ae', 'Æ' ],
+ [ 'oe', 'ö' ],
+ [ 'OE', 'Ö' ],
+ [ 'Oe', 'Ö' ],
+ // The previous as negated transliterations, mostly for names
+ [ 'þh', 'h', 'th' ],
+ [ 'ÞA', 'H', 'TH' ],
+ [ 'Þh', 'H', 'Th' ],
+ [ 'þA', 'h', 'tH' ],
+ [ 'åa', 'a', 'aa' ],
+ [ 'ÅA', 'A', 'AA' ],
+ [ 'Åa', 'A', 'Aa' ],
+ [ 'åA', 'a', 'aA' ],
+ [ 'æe', 'e', 'ae' ],
+ [ 'ÆE', 'E', 'AE' ],
+ [ 'Æe', 'E', 'Ae' ],
+ [ 'æE', 'e', 'aE' ],
+ [ 'öe', 'e', 'oe' ],
+ [ 'ÖE', 'E', 'OE' ],
+ [ 'Öe', 'E', 'Oe' ],
+ [ 'öE', 'e', 'oE' ]
+ // historically similar forms
+ // "Å" is sometimes written as "Aa", and "å" as "aa", but in names
+ // it is not generally acceptable to use this transliteration. To
+ // handle those situations we need some oposite forms.
+ // There is a similar character "Å" for the length unit Angstrom,
+ // but this is not the upper case letter Å.
+ ]
+ };
+
+ $.ime.register( defs );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ish/ish-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ish/ish-tilde.js
new file mode 100644
index 00000000..55c8d8db
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ish/ish-tilde.js
@@ -0,0 +1,22 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ishTilde = {
+ id: 'ish-tilde',
+ name: 'ish-tilde',
+ description: 'Esan input keyboard - tilde',
+ date: '2022-08-01',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~E', 'Ẹ' ],
+ [ '~e', 'ẹ' ],
+ [ '~O', 'Ọ' ],
+ [ '~o', 'ọ' ]
+ ]
+ };
+
+ $.ime.register( ishTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/jv/jv-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/jv/jv-transliteration.js
new file mode 100644
index 00000000..dd64c144
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/jv/jv-transliteration.js
@@ -0,0 +1,273 @@
+( function ( $ ) {
+ 'use strict';
+
+ var jvTransliteration = {
+ id: 'jv-transliteration',
+ name: 'Javanese',
+ description: 'Javanese transliteration',
+ date: '2013-08-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Bennylin',
+ license: 'GPLv3',
+ version: '1.1',
+ contextLength: 1,
+ maxKeyLength: 2,
+ patterns: [
+ [ '\\\\([A-Za-z\\>_~\\.0-9])', '\\\\', '$1' ],
+ [ 'ꦝ꧀q', '','ꦞ꧀' ], // Dha murda
+ [ 'ꦚ꧀q', '','ꦘ꧀' ], // Nya murda
+ [ 'ꦧ꧀q', '','ꦨ꧀' ], // Ba murda
+ [ 'ꦕ꧀q', '','ꦖ꧀' ], // Ca murda(?)
+ [ 'ꦒ꧀q', '','ꦓ꧀' ], // Ga murda
+ [ 'ꦗ꧀q', '','ꦙ꧀' ], // Ja Mahaprana
+ [ 'ꦏ꧀q', '','ꦑ꧀' ], // Ka murda
+ [ 'ꦤ꧀q', '','ꦟ꧀' ], // Na murda
+ [ 'ꦥ꧀q', '','ꦦ꧀' ], // Pa murda
+ [ 'ꦱ꧀q', '','ꦯ꧀' ], // Sa murda
+ [ 'ꦠ꧀q', '','ꦡ꧀' ], // Ta murda
+
+ // VII. Vocal ended with special pasangan followed by vocal = back to normal
+ [ 'ꦃa', '','ꦲ' ], // vocal ended with -h followed by a
+ [ 'ꦃe', '','ꦲꦺ' ], // vocal ended with -h followed by e
+ [ 'ꦃi', '','ꦲꦶ' ], // vocal ended with -h followed by i
+ [ 'ꦃo', '','ꦲꦺꦴ' ], // vocal ended with -h followed by o
+ [ 'ꦃu', '','ꦲꦸ' ], // vocal ended with -h followed by u
+
+ [ 'ꦂa', '','ꦫ' ], // vocal ended with -r followed by a
+ [ 'ꦂe', '','ꦫꦺ' ], // vocal ended with -r followed by e
+ [ 'ꦂi', '','ꦫꦶ' ], // vocal ended with -r followed by i
+ [ 'ꦂo', '','ꦫꦺꦴ' ], // vocal ended with -r followed by o
+ [ 'ꦂu', '','ꦫꦸ' ], // vocal ended with -r followed by u
+ [ 'ꦂy', '','ꦫꦾ' ], // vocal ended with -r followed by y (Special)
+
+ [ 'ꦁa', '','ꦔ' ], // vocal ended with -ng followed by a
+ [ 'ꦁe', '','ꦔꦺ' ], // vocal ended with -ng followed by e
+ [ 'ꦁi', '','ꦔꦶ' ], // vocal ended with -ng followed by i
+ [ 'ꦁo', '','ꦔꦺꦴ' ], // vocal ended with -ng followed by o
+ [ 'ꦁu', '','ꦔꦸ' ], // vocal ended with -ng followed by u
+
+ // VI. Vocal (lowercase, uppercase, extended) ended with h/r/ng = special pasangan (-h, -r, -ng)
+ [ '꧀​h', '','꧀ꦲ꧀' ],
+ // vocal a ended with h/r/ng
+ [ '(ꦲ|ꦤ|ꦕ|ꦫ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦪ|ꦚ|ꦩ|ꦒ|ꦧ|ꦛ|ꦔ|ꦘ|ꦿ|ꦾ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ|꦳)(h|H)', '','$1ꦃ' ], // hanacaraka + h = -h
+ [ '(ꦲ|ꦤ|ꦕ|ꦫ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦪ|ꦚ|ꦩ|ꦒ|ꦧ|ꦛ|ꦔ|ꦘ|ꦿ|ꦾ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ|꦳)(r|R)', '','$1ꦂ' ], // hanacaraka + r = -r
+ [ '(ꦲ|ꦤ|ꦕ|ꦫ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦪ|ꦚ|ꦩ|ꦒ|ꦧ|ꦛ|ꦔ|ꦘ|ꦿ|ꦾ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ|꦳)(ꦤ|ꦟ)꧀(g|G)', '','$1ꦁ' ], // hanacaraka + ng = -ng
+ // other vocals ended with h/r/ng
+ [ '(ꦴ|ꦻ|ꦍ|ꦺ|ꦼ|ꦶ|ꦷ|ꦸ|ꦹ|ꦄ|ꦌ|ꦆ|ꦎ|ꦈ)(h|H)', '','$1ꦃ' ], // other vocal ended with -h
+ [ '(ꦴ|ꦻ|ꦍ|ꦺ|ꦼ|ꦶ|ꦷ|ꦸ|ꦹ|ꦄ|ꦌ|ꦆ|ꦎ|ꦈ)(r|R)', '','$1ꦂ' ], // other vocal ended with -r
+ [ '(ꦴ|ꦻ|ꦍ|ꦺ|ꦼ|ꦶ|ꦷ|ꦸ|ꦹ|ꦄ|ꦌ|ꦆ|ꦎ|ꦈ)(ꦤ|ꦟ)꧀(g|G)', '','$1ꦁ' ], // other vocal ended with -ng
+
+ // V. Lower case consonant followed by lower case consonant: Basic
+ // Note: not all of these combination are valid in Javanese language, for example -hn-,
+ // so they are here only for logical reason, practically they should never be used.
+ // Obvious removal are noted (such as -yy-). th, dh, ny, ng, c, h, r, w, y are special cases:
+
+ // pasangan 'ha'(ꦲ/ꦃ) is considered final, exception: about 60 words can be found of "ha" followed by consonant y/r/l/w
+ // pasangan 'ra'(ꦫ/ꦂ) is considered final, exception: 5 words can be found of "ra" followed by consonant y/w
+ // pasangan bigraf nga(ꦔ/ꦁ) is considered final, exception: "nga" can only be found followed by consonant y/r/l/w
+ // (some problem may occur - see http://jv.wikipedia.org/wiki/Dhiskusi_Panganggo:Bennylin/Narayam#Ng)
+ // pasangan bigraf nya can only be found followed by consonant r/l/w, and
+ // although not found in Latin, it also found in Javanese script representation of nasal sounds ñ (see nyc and nyj)
+ // pasangan bigraf dha can only be found followed by consonant y/r/ w
+ // pasangan bigraf tha can only be found followed by consonant r
+ // the letter 'w' can only be found followed by consonant y/r/l/w (nasal for 'u')
+ // the letter 'c' can only be found followed by consonant r/l, and ch
+ // the letter 'y' can only be found followed by consonant w (nasal for 'i')
+
+ [ '꧀a', '','' ], // default vowel is a, so, remove the pangkon
+ [ '꧀A', '','ꦄ' ], // A
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀b', '','$1꧀ꦧ꧀' ],
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀B', '','$1꧀ꦨ꧀' ], // pasangan Ba murda
+ [ 'ꦤ꧀​(c|C)', '','ꦚ꧀ꦕ꧀' ], // n+zero-width-space+c
+ [ 'ꦤ꧀(c|C)', '','ꦚ꧀ꦕ꧀' ], // n followed by c became nasalized (nasal sound 'ny' + c)(REF:nyc)
+ [ '(ꦕ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀c', '','$1꧀ꦕ꧀' ],
+ [ '(ꦕ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀C', '','$1꧀ꦖ꧀' ], // pasangan Ca murda(?)
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀d', '','$1꧀ꦢ꧀' ],
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀D', '','$1꧀ꦣ꧀' ],
+ [ '꧀e', '','ꦺ' ], // é|è
+ [ '꧀E', '','ꦌ' ], // É|È
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀(f|v|F|V)', '','$1꧀ꦥ꦳꧀' ],
+ [ '(ꦕ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀g', '','$1꧀ꦒ꧀' ], // can't be started with n, reserved for bigraf ng
+ [ '(ꦕ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀G', '','$1꧀ꦓ꧀' ], // pasangan Ga murda (can't be started with n - see II. 2.)
+ [ '(ꦤ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀(h|H)', '','$1꧀ꦲ꧀' ], // can't be started with k/d/t/g, reserved for bigraf kh/dh/th/gh
+ [ '꧀i', '','ꦶ' ], // i
+ [ '꧀I', '','ꦆ' ], // I
+ [ 'ꦤ꧀​(j|J)', '','ꦤ꧀ꦗ꧀' ], // n+zero-width-space+j
+ [ 'ꦤ꧀(j|J)', '','ꦚ꧀ꦗ꧀' ], // n followed by j became nasalized (nasal sound 'ny' + j)(REF:nyj)
+ [ '(ꦕ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀(j|J)', '','$1꧀ꦗ꧀' ],
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀k', '','$1꧀ꦏ꧀' ],
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀K', '','$1꧀ꦑ꧀' ], // pasangan Ka murda
+ [ '(ꦲ|ꦃ|ꦤ|ꦕ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦗ|ꦚ|ꦩ|ꦒ|ꦧ|ꦔ|ꦁ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀(l|L)', '','$1꧀ꦭ꧀' ],
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀(m|M)', '','$1꧀ꦩ꧀' ],
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀n', '','$1꧀ꦤ꧀' ],
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀N', '','$1꧀ꦟ꧀' ], // pasangan Na murda
+ [ '꧀o', '','ꦺꦴ' ], // o
+ [ '꧀O', '','ꦎ' ], // O
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀p', '','$1꧀ꦥ꧀' ],
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀P', '','$1꧀ꦦ꧀' ], // pasangan Pa murda
+ // q
+ [ '(ꦲ|ꦃ|ꦤ|ꦕ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦚ|ꦩ|ꦒ|ꦧ|ꦛ|ꦔ|ꦁ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀​r', '','$1꧀ꦫ꧀' ], // consonant+zero-width-space+(r|R) doesn't make special biconsonant -ra
+ [ '(ꦲ|ꦃ|ꦤ|ꦕ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦚ|ꦩ|ꦒ|ꦧ|ꦛ|ꦔ|ꦁ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀​R', '','$1꧀ꦬ꧀' ], // consonant+zero-width-space+(r|R) doesn't make special biconsonant -ra
+ [ '(ꦲ|ꦃ|ꦤ|ꦕ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦚ|ꦩ|ꦒ|ꦧ|ꦛ|ꦔ|ꦁ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀(r|R)', '','$1ꦿ' ], // special biconsonant -ra
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀s', '','$1꧀ꦱ꧀' ],
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀S', '','$1꧀ꦯ꧀' ], // pasangan Sa murda
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀t', '','$1꧀ꦠ꧀' ],
+ [ '(ꦤ|ꦏ|ꦢ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀T', '','$1꧀ꦡ꧀' ], // pasangan Ta murda
+ [ '꧀u', '','ꦸ' ], // u
+ [ '꧀U', '','ꦈ' ], // U
+ // v = f
+ [ '(ꦲ|ꦃ|ꦤ|ꦫ|ꦂ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦪ|ꦚ|ꦩ|ꦒ|ꦧ|ꦔ|ꦁ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀(w|W)꧀', '','$1꧀ꦮ' ],
+ [ '(ꦲ|ꦃ|ꦫ|ꦂ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦩ|ꦒ|ꦧ|ꦔ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀​(y|Y)', '','$1꧀ꦪ꧀' ], // consonant+zero-width-space+(y|Y) doesn't make special biconsonant -ya
+
+ [ '(ꦲ|ꦃ|ꦫ|ꦂ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦩ|ꦒ|ꦧ|ꦔ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦦ|ꦯ|ꦡ)꧀(y|Y)', '','$1ꦾ' ], // special biconsonant -ya,
+ // can't be started with n or y, reserved for bigraf ny (REF:-yy-)
+ [ '(ꦤ|ꦏ|ꦠ|ꦱ|ꦭ|ꦥ|ꦗ|ꦩ|ꦒ|ꦧ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ)꧀(z|Z)', '','$1ꦾꦗ꦳꧀' ], // can't be started with d, reserved for bigraf dz
+
+ // IV. 1. Special consonant
+ [ '(ꦾ|ꦿ)a', '','$1' ],
+ [ 'ꦿx', '','ꦽ' ], // special biconsonant -rê
+ [ 'ꦊq', '','ꦋ' ], // special character lê Raswadi
+ [ 'ꦭ꧀x', '','ꦊ' ], // special character lê
+ [ 'ꦫ꧀x', '','ꦉ' ], // special character rê
+ [ 'ꦌx', '','ꦄꦼ' ], // Ê
+ [ '꧀x', '','ꦼ' ], // x is another way to write ê
+ [ '꧀X', '','ꦄꦼ' ], // X is another way to write Ê
+
+ // IV. 3. Extended vowel
+ // long a (aa) - see II.
+ [ '(ꦲ|ꦤ|ꦕ|ꦫ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦪ|ꦚ|ꦩ|ꦒ|ꦧ|ꦛ|ꦔ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ|꦳)i', '','$1ꦻ' ], // hanacaraka + i = -ai
+ [ '(ꦲ|ꦤ|ꦕ|ꦫ|ꦏ|ꦢ|ꦠ|ꦱ|ꦮ|ꦭ|ꦥ|ꦝ|ꦗ|ꦪ|ꦚ|ꦩ|ꦒ|ꦧ|ꦛ|ꦔ|ꦘ|ꦨ|ꦖ|ꦓ|ꦑ|ꦟ|ꦦ|ꦯ|ꦡ|꦳)u', '','$1ꦻꦴ' ], // hanacaraka + u = -au
+ [ 'ꦄi', '','ꦍ' ], // Ai
+ [ 'ꦄu', '','ꦎꦴ' ], // Au
+ [ 'ꦶi', '','ꦷ' ], // long i (ii)
+ [ 'ꦆi', '','ꦇ' ], // long i (Ii)
+ [ 'ꦸu', '','ꦹ' ], // long u (uu)
+ [ 'ꦈu', '','ꦈꦴ' ], // long u (Uu)
+ [ 'ꦺꦴo', '','ꦵ' ], // Sundanese -o
+
+ // IV. 2. Extended consonant
+ [ 'ꦱ꧀​(s|h)', '','ꦰ꧀' ], // s_s (with zero-width-space)
+ [ 'ꦏ꧀​h', '','ꦏ꧀ꦲ꧀' ], // k_h (with zero-width-space)
+ [ 'ꦒ꧀​h', '','ꦒ꧀ꦲ꧀' ], // g_h (with zero-width-space)
+ [ 'ꦢ꧀​z', '','ꦢ꧀ꦗ꦳꧀' ], // d_z (with zero-width-space)
+ [ 'ꦗ꧀​h', '','ꦙ' ], // j_h (with zero-width-space)
+ [ 'ꦱ꧀(s|h)', '','ꦰ꧀' ], // ss/sh
+ [ 'ꦏ꧀h', '','ꦏ꦳' ], // kh
+ [ 'ꦒ꧀h', '','ꦒ꦳' ], // gh
+ [ 'ꦢ꧀z', '','ꦢ꦳' ], // dz
+ [ 'ꦗ꧀h', '','ꦙ' ], // jh/Ja mahaprana
+
+ // III. Non-words
+ // q and Q are special characters for choosing less used characters by pressing q/Q multiple times (rotating back)
+ [ ' ', '','​' ], // zero-width-space, since javanese have no space
+ [ '꧅q', '','꧁' ], // rêrênggan kiwa
+ [ '꧄q', '','꧅' ], // pada luhur
+ [ '꧃q', '','꧄' ], // pada madya
+ [ '꧂q', '', '꧃' ],// pada andhap
+ [ '꧁q', '','꧂' ], // rêrênggan têngên
+ [ 'Q', '','꧁' ], // rêrênggan kiwa
+ [ '꧟[Q|q]', '','꧀' ], // pangkon
+ [ '꧞[Q|q]', '','꧟' ], // pada isen-isen
+ [ '꧆[Q|q]', '','꧞' ], // pada tirta tumetes
+ [ 'ꦀ[Q|q]', '', '꧆' ],// pada windu
+ [ '꦳[Q|q]', '','ꦀ' ], // panyangga
+ [ '꧀[Q|q]', '','꦳' ], // cecak telu
+ [ 'q', '','꧀' ], // pangkon - to cut off the default -a vowel
+
+ [ 'ꦫq', '','ꦿ' ], // another way to write -ra
+ [ 'ꦪq', '','ꦾ' ], // another way to write -ya
+
+ // II. 1. Alphabetical ha-na-ca-ra-ka
+ [ 'ꦠ꧀​h', '','ꦠ꧀ꦲ꧀' ], // t_h (with zero-width-space)
+ [ 'ꦢ꧀​h', '','ꦢ꧀ꦲ꧀' ], // d_h (with zero-width-space)
+ [ 'ꦤ꧀​y', '','ꦚ꧀ꦪ꧀' ], // n_y (with zero-width-space)
+ [ 'ꦤ꧀​g', '','ꦔ꧀ꦒ꧀' ], // n_g (with zero-width-space)
+ [ 'ꦠ꧀h', '','ꦛ꧀' ], // th
+ [ 'ꦢ꧀h', '','ꦝ꧀' ], // dh
+ [ 'ꦤ꧀y', '','ꦚ꧀' ], // ny
+ [ 'ꦤ꧀g', '','ꦁ' ], // ng
+ [ 'a', '','ꦲ' ],
+ [ 'b', '','ꦧ꧀' ],
+ [ 'c', '','ꦕ꧀' ],
+ [ 'd', '','ꦢ꧀' ],
+ [ 'e', '','ꦲꦺ' ], // é|è
+ [ '(f|v)', '','ꦥ꦳꧀' ],
+ [ 'g', '','ꦒ꧀' ],
+ [ 'h', '','ꦲ꧀' ],
+ [ 'i', '','ꦲꦶ' ],
+ [ 'j', '','ꦗ꧀' ],
+ [ 'k', '','ꦏ꧀' ],
+ [ 'l', '','ꦭ꧀' ],
+ [ 'm', '','ꦩ꧀' ],
+ [ 'n', '','ꦤ꧀' ],
+ [ 'o', '','ꦲꦺꦴ' ],
+ [ 'p', '','ꦥ꧀' ],
+ // q = special letters, see III.
+ [ 'r', '','ꦫ꧀' ],
+ [ 's', '','ꦱ꧀' ],
+ [ 't', '','ꦠ꧀' ],
+ [ 'u', '','ꦲꦸ' ],
+ // v = f
+ [ 'w', '','ꦮ꧀' ],
+ [ 'x', '','ꦲꦼ' ], // ê
+ [ 'y', '','ꦪ꧀' ],
+ [ 'z', '','ꦗ꦳꧀' ],
+
+ // II. Basic Letters:
+ // II. 2. Capital Ha-Na-Ca-Ra-Ka (Aksara Murda)
+ [ '(ꦠ|ꦡ)꧀(h|H)', '','ꦛ꧀' ],
+ [ 'ꦣ꧀h', '','ꦞ꧀' ], // Dha murda
+ [ '(ꦢ|ꦣ)꧀H', '','ꦞ꧀' ], // Dha murda
+ [ 'ꦟ꧀y', '','ꦘ꧀' ], // Nya murda
+ [ '(ꦤ|ꦟ)꧀Y', '','ꦘ꧀' ], // NYA murda
+ [ '(ꦤ|ꦟ)꧀(g|G)', '','ꦔ꧀' ],// nga
+ [ 'A', '','ꦄ' ], // A
+ [ 'B', '','ꦨ꧀' ], // Ba murda
+ [ 'C', '','ꦖ꧀' ], // Ca murda(?)
+ [ 'D', '','ꦣ꧀' ],
+ [ 'E', '','ꦌ' ], // É|È
+ [ '(F|V)', '','ꦥ꦳꧀' ],
+ [ 'G', '','ꦓ꧀' ], // Ga murda
+ [ 'H', '','ꦲ꧀' ],
+ [ 'I', '','ꦆ' ], // I
+ [ 'J', '','ꦙ꧀' ],// Ja Mahaprana
+ [ 'K', '','ꦑ꧀' ], // Ka murda
+ [ 'L', '','ꦭ꧀' ],
+ [ 'M', '','ꦩ꧀' ],
+ [ 'N', '','ꦟ꧀' ], // Na murda
+ [ 'O', '','ꦎ' ], // O
+ [ 'P', '','ꦦ꧀' ], // Pa murda
+ // Q = special letters, see III.
+ [ 'R', '','ꦬ꧀' ],
+ [ 'S', '','ꦯ꧀' ], // Sa murda
+ [ 'T', '','ꦡ꧀' ], // Ta murda
+ [ 'U', '','ꦈ' ], // U
+ // V = F
+ [ 'W', '','ꦮ꧀' ],
+ [ 'X', '','ꦄꦼ' ], // X is another way to write Ê
+ [ 'Y', '','ꦪ꧀' ],
+ [ 'Z', '','ꦗ꦳꧀' ],
+
+ // I. Number
+ [ '0', '','꧐' ],
+ [ '1', '','꧑' ],
+ [ '2', '','꧒' ],
+ [ '3', '','꧓' ],
+ [ '4', '','꧔' ],
+ [ '5', '','꧕' ],
+ [ '6', '','꧖' ],
+ [ '7', '','꧗' ],
+ [ '8', '','꧘' ],
+ [ '9', '','꧙' ],
+ [ ':', '','꧇' ], // 'enclose Javanese numbers, e.g. ":1:"'
+ [ ',', '','꧈' ], // 'comma'
+ [ '\\.', '','꧉' ], // 'period'
+ [ '꧊\\|', '','꧋' ], // 'opening paragraph character'
+ [ '\\|', '','꧊' ], // 'poem character'
+ [ '\\(', '','꧌' ], // 'Javanese opening bracket'
+ [ '\\)', '','꧍' ] // 'Javanese closing bracket'
+ ]
+ };
+
+ $.ime.register( jvTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ka/ka-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ka/ka-kbd.js
new file mode 100644
index 00000000..80a86a30
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ka/ka-kbd.js
@@ -0,0 +1,56 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kaKbd = {
+ id: 'ka-kbd',
+ name: 'Georgian kbd',
+ description: 'Georgian kbd keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '.k', 'კ' ],
+ [ '.p', 'პ' ],
+ [ '+z', 'ჟ' ],
+ [ '.t', 'ტ' ],
+ [ '.g', 'ღ' ],
+ [ '+s', 'შ' ],
+ [ '.+c', 'ჭ' ],
+ [ '+c', 'ჩ' ],
+ [ '.c', 'წ' ],
+ [ '+j', 'ჯ' ],
+ [ 'ყ1', 'ჴ' ],
+ [ 'ე0', 'ჱ' ],
+ [ 'ო1', 'ჵ' ],
+ [ 'ი1', 'ჲ' ],
+ [ 'a', 'ა' ],
+ [ 'b', 'ბ' ],
+ [ 'g', 'გ' ],
+ [ 'd', 'დ' ],
+ [ 'e', 'ე' ],
+ [ 'v', 'ვ' ],
+ [ 'z', 'ზ' ],
+ [ 't', 'თ' ],
+ [ 'i', 'ი' ],
+ [ 'l', 'ლ' ],
+ [ 'm', 'მ' ],
+ [ 'n', 'ნ' ],
+ [ 'o', 'ო' ],
+ [ 'r', 'რ' ],
+ [ 's', 'ს' ],
+ [ 'u', 'უ' ],
+ [ 'p', 'ფ' ],
+ [ 'k', 'ქ' ],
+ [ 'q', 'ყ' ],
+ [ 'c', 'ც' ],
+ [ 'j', 'ძ' ],
+ [ 'x', 'ხ' ],
+ [ 'h', 'ჰ' ],
+ [ 'w', 'ჳ' ],
+ [ 'f', 'ჶ' ] ]
+ };
+
+ $.ime.register( kaKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ka/ka-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ka/ka-transliteration.js
new file mode 100644
index 00000000..f9b5d796
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ka/ka-transliteration.js
@@ -0,0 +1,58 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kaTransliteration = {
+ id: 'ka-transliteration',
+ name: 'ტრანსლიტერაცია',
+ description: 'Georgian transliteration',
+ date: '2012-10-14',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Ioseb Dzmanashvili (http://www.code.ge), [[User:Hooman]], Srikanth L',
+ license: 'MIT',
+ version: '1.0',
+ contextLength: 3,
+ maxKeyLength: 1,
+ patterns: [
+ [ '\\\\([A-Za-z|\\~|\\`])', '\\\\', '$1' ],
+ [ '`', '„' ],
+ [ '~', '“' ],
+ [ 'q', 'ქ' ],
+ [ 'w', 'წ' ],
+ [ 'e', 'ე' ],
+ [ 'r', 'რ' ],
+ [ 't', 'ტ' ],
+ [ 'y', 'ყ' ],
+ [ 'u', 'უ' ],
+ [ 'i', 'ი' ],
+ [ 'o', 'ო' ],
+ [ 'p', 'პ' ],
+
+ [ 'a', 'ა' ],
+ [ 's', 'ს' ],
+ [ 'd', 'დ' ],
+ [ 'f', 'ფ' ],
+ [ 'g', 'გ' ],
+ [ 'h', 'ჰ' ],
+ [ 'j', 'ჯ' ],
+ [ 'k', 'კ' ],
+ [ 'l', 'ლ' ],
+
+ [ 'z', 'ზ' ],
+ [ 'x', 'ხ' ],
+ [ 'c', 'ც' ],
+ [ 'v', 'ვ' ],
+ [ 'b', 'ბ' ],
+ [ 'n', 'ნ' ],
+ [ 'm', 'მ' ],
+
+ [ 'W', 'ჭ' ],
+ [ 'R', 'ღ' ],
+ [ 'T', 'თ' ],
+ [ 'S', 'შ' ],
+ [ 'J', 'ჟ' ],
+ [ 'Z', 'ძ' ],
+ [ 'C', 'ჩ' ] ]
+ };
+
+ $.ime.register( kaTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/kab/kab-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/kab/kab-tilde.js
new file mode 100644
index 00000000..381af930
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/kab/kab-tilde.js
@@ -0,0 +1,41 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kabTilde = {
+ id: 'kab-tilde',
+ name: 'kab-tilde',
+ description: 'Kabyle Latin tilde keyboard',
+ date: '2018-11-30',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~C', 'C\u030C' ], // C with combining caron
+ [ '~c', 'c\u030C' ], // c with combining caron
+ [ '~D', 'D\u0323' ], // D with combining dot below
+ [ '~d', 'd\u0323' ], // d with combining dot below
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~G', 'G\u030C' ], // G with combining caron
+ [ '~g', 'g\u030C' ], // g with combining caron
+ [ '~Y', 'Ɣ' ],
+ [ '~y', 'ɣ' ],
+ [ '~H', 'H\u0323' ], // H with combining dot below
+ [ '~h', 'h\u0323' ], // h with combining dot below
+ // ~R is not provided to avoided confusion between caron and dot below
+ [ '~S', 'S\u0323' ], // S with combining dot below
+ [ '~s', 's\u0323' ], // s with combining dot below
+ [ '~T', 'T\u0323' ], // T with combining dot below
+ [ '~t', 't\u0323' ], // t with combining dot below
+ [ '~Z', 'Z\u0323' ], // Z with combining dot below
+ [ '~z', 'z\u0323' ], // z with combining dot below
+ [ '~w', 'ʷ' ],
+ [ '~v', '\u030C' ], // Combining caron
+ [ '~\\.', '\u0323' ], // Combining dot below
+ [ '~,', '\u0327' ] // Combining cedilla
+ ]
+ };
+
+ $.ime.register( kabTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/kbp/kbp-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/kbp/kbp-tilde.js
new file mode 100644
index 00000000..a5deaa55
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/kbp/kbp-tilde.js
@@ -0,0 +1,35 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kbpTilde = {
+ id: 'kbp-tilde',
+ name: 'Kabɩyɛ tilde',
+ description: 'Kabiye input keyboard',
+ date: '2018-12-18',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~D', 'Ɖ' ],
+ [ '~d', 'ɖ' ],
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~G', 'Ɣ' ],
+ [ '~g', 'ɣ' ],
+ [ '~I', 'Ɩ' ],
+ [ '~i', 'ɩ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~V', 'Ʋ' ],
+ [ '~v', 'ʋ' ],
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~\\{', '\u0303' ] // Combining tilde
+ ]
+ };
+
+ $.ime.register( kbpTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/kcg/kcg-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/kcg/kcg-tilde.js
new file mode 100644
index 00000000..ec9bbaab
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/kcg/kcg-tilde.js
@@ -0,0 +1,24 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kcgTilde = {
+ id: 'kcg-tilde',
+ name: 'kcg-tilde',
+ description: 'Tyap input keyboard',
+ date: '2020-12-04',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.1',
+ patterns: [
+ [ '~A', 'A\u0331' ],
+ [ '~a', 'a\u0331' ],
+ [ '~I', 'I\u0331' ],
+ [ '~i', 'i\u0331' ],
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~_', '\u0331' ] // Combining macron below
+ ]
+ };
+
+ $.ime.register( kcgTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ki/ki-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ki/ki-tilde.js
new file mode 100644
index 00000000..ca600971
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ki/ki-tilde.js
@@ -0,0 +1,22 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kiTilde = {
+ id: 'ki-tilde',
+ name: 'ki-tilde',
+ description: 'Kikuyu input keyboard - tilde',
+ date: '2019-01-22',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~I', 'Ĩ' ],
+ [ '~i', 'ĩ' ],
+ [ '~U', 'Ũ' ],
+ [ '~u', 'ũ' ]
+ ]
+ };
+
+ $.ime.register( kiTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/kk/kk-arabic.js b/UniversalLanguageSelector/lib/jquery.ime/rules/kk/kk-arabic.js
new file mode 100644
index 00000000..ce1ee0b7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/kk/kk-arabic.js
@@ -0,0 +1,62 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kkArabic = {
+ id: 'kk-arabic',
+ name: 'Kazak arabic',
+ description: 'Kazak arabic in Arabic script keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'a', 'ا' ],
+ [ 'A', 'ٵ' ],
+ [ 'b', 'ب' ],
+ [ 'v', 'ۆ' ],
+ [ 'g', 'گ' ],
+ [ 'R', 'ع' ],
+ [ 'd', 'د' ],
+ [ 'e', 'ە' ],
+ [ 'j', 'ج' ],
+ [ 'z', 'ز' ],
+ [ 'y', 'ي' ],
+ [ 'k', 'ك' ],
+ [ 'q', 'ق' ],
+ [ 'l', 'ل' ],
+ [ 'm', 'م' ],
+ [ 'n', 'ن' ],
+ [ 'N', 'ڭ' ],
+ [ 'o', 'و' ],
+ [ 'O', 'ٶ' ],
+ [ 'p', 'پ' ],
+ [ 'r', 'ر' ],
+ [ 's', 'س' ],
+ [ 't', 'ت' ],
+ [ 'w', 'ۋ' ],
+ [ 'u', 'ۇ' ],
+ [ 'U', 'ٷ' ],
+ [ 'f', 'ف' ],
+ [ 'H', 'ح' ],
+ [ 'h', 'ه' ],
+ [ 'c', 'چ' ],
+ [ 'S', 'ش' ],
+ [ 'I', 'ى' ],
+ [ 'i', 'ٸ' ],
+ [ ';', '؛' ],
+ [ ',', '،' ],
+ [ '\\?', '?' ],
+ [ '\\<', '>' ],
+ [ '\\>', '<' ],
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+ [ '\\[', ']' ],
+ [ '\\]', '[' ],
+ [ '\\{', '}' ],
+ [ '\\}', '{' ]
+ ]
+ };
+
+ $.ime.register( kkArabic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/kk/kk-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/kk/kk-kbd.js
new file mode 100644
index 00000000..8d6f846d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/kk/kk-kbd.js
@@ -0,0 +1,108 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kkKbd = {
+ id: 'kk-kbd',
+ name: 'Kazak kbd',
+ description: 'Kazak kbd in Cyrillic script keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', '(' ],
+ [ '\\~', ')' ],
+ [ '1', '"' ],
+ [ '2', 'ә' ],
+ [ '\\@', 'Ә' ],
+ [ '3', 'і' ],
+ [ '\\#', 'І' ],
+ [ '4', 'ӊ' ],
+ [ '\\$', 'Ӊ' ],
+ [ '5', 'ғ' ],
+ [ '\\%', 'Ғ' ],
+ [ '6', ',' ],
+ [ '\\^', ';' ],
+ [ '7', '.' ],
+ [ '\\&', ':' ],
+ [ '8', 'ү' ],
+ [ '\\*', 'Ү' ],
+ [ '9', 'ұ' ],
+ [ '\\(', 'Ұ' ],
+ [ '0', 'қ' ],
+ [ '\\)', 'Қ' ],
+ [ '\\-', 'ө' ],
+ [ '\\_', 'Ө' ],
+ [ '\\=', 'һ' ],
+ [ '\\+', 'Һ' ],
+ [ 'q', 'й' ],
+ [ 'Q', 'Й' ],
+ [ 'w', 'ц' ],
+ [ 'W', 'Ц' ],
+ [ 'e', 'у' ],
+ [ 'E', 'У' ],
+ [ 'r', 'к' ],
+ [ 'R', 'К' ],
+ [ 't', 'е' ],
+ [ 'T', 'Е' ],
+ [ 'y', 'н' ],
+ [ 'Y', 'Н' ],
+ [ 'u', 'г' ],
+ [ 'U', 'Г' ],
+ [ 'i', 'ш' ],
+ [ 'I', 'Ш' ],
+ [ 'o', 'щ' ],
+ [ 'O', 'Щ' ],
+ [ 'p', 'з' ],
+ [ 'P', 'З' ],
+ [ '\\[', 'х' ],
+ [ '\\{', 'Х' ],
+ [ '\\]', 'ъ' ],
+ [ '\\}', 'Ъ' ],
+ [ 'a', 'ф' ],
+ [ 'A', 'Ф' ],
+ [ 's', 'ы' ],
+ [ 'S', 'Ы' ],
+ [ 'd', 'в' ],
+ [ 'D', 'В' ],
+ [ 'f', 'а' ],
+ [ 'F', 'А' ],
+ [ 'g', 'п' ],
+ [ 'G', 'П' ],
+ [ 'h', 'р' ],
+ [ 'H', 'Р' ],
+ [ 'j', 'о' ],
+ [ 'J', 'О' ],
+ [ 'k', 'л' ],
+ [ 'K', 'Л' ],
+ [ 'l', 'д' ],
+ [ 'L', 'Д' ],
+ [ ';', 'ж' ],
+ [ ':', 'Ж' ],
+ [ '\'', 'э' ],
+ [ '"', 'Э' ],
+ [ 'z', 'я' ],
+ [ 'Z', 'Я' ],
+ [ 'x', 'ч' ],
+ [ 'X', 'Ч' ],
+ [ 'c', 'с' ],
+ [ 'C', 'С' ],
+ [ 'v', 'м' ],
+ [ 'V', 'М' ],
+ [ 'b', 'и' ],
+ [ 'B', 'И' ],
+ [ 'n', 'т' ],
+ [ 'N', 'Т' ],
+ [ 'm', 'ь' ],
+ [ 'M', 'Ь' ],
+ [ ',', 'б' ],
+ [ '\\<', 'Б' ],
+ [ '\\.', 'ю' ],
+ [ '\\>', 'Ю' ],
+ [ '/', '№' ]
+ ]
+ };
+
+ $.ime.register( kkKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/km/km-nidakyk.js b/UniversalLanguageSelector/lib/jquery.ime/rules/km/km-nidakyk.js
new file mode 100644
index 00000000..0eb25b8e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/km/km-nidakyk.js
@@ -0,0 +1,270 @@
+( function ( $ ) {
+ 'use strict';
+
+ // This is an implementation of NiDA standard Khmer Unicode keyboard v1.0,
+ // with some key combinations to normalize or correct combining sequences
+ var kmNIDA = {
+ id: 'km-nidakyk',
+ name: 'ក្តារ​ចុច​យូនីកូដ​ខ្មែរ (NiDA)',
+ description: 'NiDA Standard Khmer Unicode Keyboard',
+ date: '2016-07-07',
+ URL: 'http://www.nida.gov.kh/files/documents/How_to_type_Khmer_Unicode_ver1_1km.pdf',
+ author: 'Ang Iongchun',
+ license: 'Public domain',
+ version: '1.0',
+
+ // previous input keys to memory, for contextual rules
+ contextLength: 1, // default: 0
+
+ // previous output to memory, for normalization of consonant
+ // shifters
+ // maxKeyLength: 7, // default: 1
+
+ // Shift-Space has the same scan code with Space,
+ // hence the rule here
+ patterns_shift: [
+ [ ' ', ' ' ] // normal space
+ ],
+
+ patterns: [
+ // NOTE:
+ // Contextual rules must appear before rules
+ // without context to avoid collisions.
+ // Make sure contextLength is large enough for
+ // these rules.
+
+ // Khmer uses a lot of U+200B, zero width space,
+ // so ignore it in this file
+
+ /* eslint-disable no-irregular-whitespace */
+
+ // correction for two-part dependent vowels
+ [ '\u17c1a', 'e', '\u17c4' ], // ​េ + ​ា -> ​ោ (o)
+ [ '\u17b6e', 'a', '\u17c4' ], // ​ា + ​េ -> ​ោ (o)
+ [ '\u17c1I', 'e', '\u17be' ], // ​េ + ​ី -> ​ើ (;)
+ [ '\u17b8e', 'I', '\u17be' ], // ​ី + ​េ -> ​ើ (;)
+
+ // normalize common combination of dependent vowels and
+ // modifiers
+ [ '\u17c6a', 'M', '\u17b6\u17c6' ], // ​ាំ, Ma -> aM
+ [ '\u17c6u', 'M', '\u17bb\u17c6' ], // ​ុំ, Mu -> uM
+ [ '\u17c7e', 'H', '\u17c1\u17c7' ], // ​េះ, He -> eH
+ [ '\u17c7u', 'H', '\u17bb\u17c7' ], // ​ុះ, Hu -> uH
+ [ '\u17c7o', 'H', '\u17c4\u17c7' ], // ​ោះ, Ho -> oH
+
+ // Unicode 4.0: normalize consonant shifter before
+ // subscript consonants and their optional following
+ // robats: (SR?)+Z?C -> Z?C(SR?)+
+ // XXX:
+ // Not compatible with Unicode 3.0, which places
+ // consonant shifters after subscript consonants.
+ // Make sure maxKeyLength is large enough for this rule.
+ // [ '((?:\u17d2.\u17cc?)+)((:?\u200c|\u200d)?)/', '$2\u17ca$1' ], // ៊
+ // [ '((?:\u17d2.\u17cc?)+)((:?\u200c|\u200d)?)"', '$2\u17c9$1' ], // ​៉
+
+ // consonants
+ [ 'q', 'ឆ' ],
+ [ 'r', 'រ' ],
+ [ 't', 'ត' ],
+ [ 'y', 'យ' ],
+ [ 'p', 'ផ' ],
+ [ 's', 'ស' ],
+ [ 'd', 'ដ' ],
+ [ 'f', 'ថ' ],
+ [ 'g', 'ង' ],
+ [ 'h', 'ហ' ],
+ [ 'j', '\u17d2' ], // coeng
+ [ 'k', 'ក' ],
+ [ 'l', 'ល' ],
+ [ 'z', 'ឋ' ],
+ [ 'x', 'ខ' ],
+ [ 'c', 'ច' ],
+ [ 'v', 'វ' ],
+ [ 'b', 'ប' ],
+ [ 'n', 'ន' ],
+ [ 'm', 'ម' ],
+ [ 'Q', 'ឈ' ],
+ [ 'T', 'ទ' ],
+ [ 'P', 'ភ' ],
+ [ 'D', 'ឌ' ],
+ [ 'F', 'ធ' ],
+ [ 'G', 'អ' ],
+ [ 'J', 'ញ' ],
+ [ 'K', 'គ' ],
+ [ 'L', 'ឡ' ],
+ [ 'Z', 'ឍ' ],
+ [ 'X', 'ឃ' ],
+ [ 'C', 'ជ' ],
+ [ 'B', 'ព' ],
+ [ 'N', 'ណ' ],
+
+ // independent vowels
+ [ '-', 'ឥ' ],
+ [ '=', 'ឲ' ],
+ [ '\\]', 'ឪ' ],
+ [ '\\\\', 'ឮ' ],
+ [ 'R', 'ឬ' ],
+ [ '\\}', 'ឧ' ],
+ [ '\\|', 'ឭ' ],
+
+ // dependent vowels and modifiers
+ [ 'w', '\u17b9' ], // ​ឹ
+ [ 'e', '\u17c1' ], // ​េ
+ [ 'u', '\u17bb' ], // ​ុ
+ [ 'i', '\u17b7' ], // ​ិ
+ [ 'o', '\u17c4' ], // ​ោ
+ [ 'a', '\u17b6' ], // ​ា
+ [ 'W', '\u17ba' ], // ​ឺ
+ [ 'E', '\u17c2' ], // ​ែ
+ [ 'Y', '\u17bd' ], // ​ួ
+ [ 'U', '\u17bc' ], // ​ូ
+ [ 'I', '\u17b8' ], // ​ី
+ [ 'O', '\u17c5' ], // ​ៅ
+ [ 'A', '\u17b6\u17c6' ], // ​ាំ
+ [ 'S', '\u17c3' ], // ​ៃ
+ [ 'H', '\u17c7' ], // ​ះ
+ [ 'V', '\u17c1\u17c7' ], // ​េះ
+ [ 'M', '\u17c6' ], // ​ំ
+ [ '\\[', '\u17c0' ], // ​ៀ
+ [ ';', '\u17be' ], // ​ើ
+ [ '\'', '\u17cb' ], // ​់
+ [ ',', '\u17bb\u17c6' ], // ​ុា
+ [ '/', '\u17ca' ], // ​៊
+ [ ':', '\u17c4\u17c7' ], // ​ោះ
+ [ '"', '\u17c9' ], // ​៉
+ [ '<', '\u17bb\u17c7' ], // ​ុះ
+ [ '\\^', '\u17cd' ], // ​៍
+ [ '&', '\u17d0' ], // ​័
+ [ '\\*', '\u17cf' ], // ​៏
+ [ '_', '\u17cc' ], // ​៌
+ [ '\\{', '\u17bf' ], // ​ឿ
+
+ // digits
+ [ '1', '១' ],
+ [ '2', '២' ],
+ [ '3', '៣' ],
+ [ '4', '៤' ],
+ [ '5', '៥' ],
+ [ '6', '៦' ],
+ [ '7', '៧' ],
+ [ '8', '៨' ],
+ [ '9', '៩' ],
+ [ '0', '០' ],
+
+ // spaces
+ [ ' ', '\u200b' ], // ZWSP: zero-width space
+
+ // symbols
+ [ '`', '«' ],
+ [ '\\.', '។' ],
+ [ '>', '៕' ],
+ [ '~', '»' ],
+ [ '\\!', '!' ],
+ [ '@', 'ៗ' ],
+ [ '#', '"' ],
+ [ '\\$', '៛' ],
+ [ '%', '%' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '\\+', '=' ],
+ [ '\\?', '?' ]
+ ],
+
+ // AltGr patterns
+ patterns_x: [
+ // independent vowels
+ [ 'e', 'ឯ' ],
+ [ 'r', 'ឫ' ],
+ [ 'i', 'ឦ' ],
+ [ 'o', 'ឱ' ],
+ [ 'p', 'ឰ' ],
+ [ '\\[', 'ឩ' ],
+ [ '\\]', 'ឳ' ],
+
+ // modifiers
+ [ '3', '\u17d1' ], // ​៑
+ [ '=', '\u17ce' ], // ​៎
+ [ '\'', '\u17c8' ], // ​ៈ
+
+ // symbols
+ [ '2', '@' ],
+ [ '4', '$' ],
+ [ '5', '€' ],
+ [ '6', '៙' ],
+ [ '7', '៚' ],
+ [ '8', '*' ],
+ [ '9', '{' ],
+ [ '0', '}' ],
+ [ '-', 'x' ],
+ [ '\\\\', '\\' ],
+ [ ';', '៖' ],
+ [ ',', ',' ],
+ [ '\\.', '.' ],
+ [ '/', '/' ],
+
+ // spaces
+ [ ' ', '\u00a0' ], // NBSP: non-breakable space
+
+ // joiners
+ [ '`', '\u200d' ], // ZWJ: zero width joiner
+ [ '1', '\u200c' ], // ZWNJ: zero width non-joiner
+
+ // old Khmer, Sanskrit, Pali
+ [ 'b', 'ឞ' ],
+ [ 'k', 'ឝ' ],
+ [ 't', 'ឨ' ],
+ [ 'q', 'ៜ' ],
+ [ 'w', '\u17dd' ], // ​៝
+
+ /* eslint-enable no-irregular-whitespace */
+
+ // divination signs (digits)
+ [ '\\!', '៱' ], // shift-1
+ [ '@', '៲' ], // shift-2
+ [ '#', '៳' ], // shift-3
+ [ '\\$', '៴' ], // shift-4
+ [ '%', '៵' ], // shift-5
+ [ '\\^', '៶' ], // shift-6
+ [ '&', '៷' ], // shift-7
+ [ '\\*', '៸' ], // shift-8
+ [ '\\(', '៹' ], // shift-9
+ [ '\\)', '៰' ], // shift-0
+
+ // lunar dates
+ [ 'Q', '᧠' ], // shift-q
+ [ 'W', '᧡' ], // shift-w
+ [ 'E', '᧢' ], // shift-e
+ [ 'R', '᧣' ], // shift-r
+ [ 'T', '᧤' ], // shift-t
+ [ 'Y', '᧥' ], // shift-y
+ [ 'U', '᧦' ], // shift-u
+ [ 'I', '᧧' ], // shift-i
+ [ 'O', '᧨' ], // shift-o
+ [ 'P', '᧩' ], // shift-p
+ [ '\\{', '᧪' ], // shift-[
+ [ '\\}', '᧫' ], // shift-]
+ [ 'A', '᧬' ], // shift-a
+ [ 'S', '᧭' ], // shift-s
+ [ 'D', '᧮' ], // shift-d
+ [ 'F', '᧯' ], // shift-f
+ [ 'G', '᧰' ], // shift-g
+ [ 'H', '᧱' ], // shift-h
+ [ 'J', '᧲' ], // shift-j
+ [ 'K', '᧳' ], // shift-k
+ [ 'L', '᧴' ], // shift-l
+ [ ':', '᧵' ], // shift-;
+ [ '"', '᧶' ], // shift-'
+ [ 'Z', '᧷' ], // shift-z
+ [ 'X', '᧸' ], // shift-x
+ [ 'C', '᧹' ], // shift-c
+ [ 'V', '᧺' ], // shift-v
+ [ 'B', '᧻' ], // shift-b
+ [ 'N', '᧼' ], // shift-n
+ [ 'M', '᧽' ], // shift-m
+ [ '<', '᧾' ], // shift-,
+ [ '>', '᧿' ] // shift-.
+ ]
+ };
+
+ $.ime.register( kmNIDA );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-inscript.js
new file mode 100644
index 00000000..de15ba7e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-inscript.js
@@ -0,0 +1,111 @@
+( function ( $ ) {
+ 'use strict';
+
+ var knInscript = {
+ id: 'kn-inscript',
+ name: 'ಇನ್\u200cಸ್ಕ್ರಿಪ್ಟ್',
+ description: 'Inscript keyboard for Kannada script',
+ date: '2012-10-14',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'x', '\u0C82' ],
+ [ '_', '\u0C83' ],
+ [ 'D', '\u0C85' ],
+ [ 'E', '\u0C86' ],
+ [ 'F', '\u0C87' ],
+ [ 'R', '\u0C88' ],
+ [ 'G', '\u0C89' ],
+ [ 'T', '\u0C8A' ],
+ [ '\\+', '\u0C8B' ],
+ [ 'Z', '\u0C8E' ],
+ [ 'S', '\u0C8F' ],
+ [ 'W', '\u0C90' ],
+ [ '~', '\u0C92' ],
+ [ 'A', '\u0C93' ],
+ [ 'Q', '\u0C94' ],
+ [ 'k', '\u0C95' ],
+ [ 'K', '\u0C96' ],
+ [ 'i', '\u0C97' ],
+ [ 'I', '\u0C98' ],
+ [ 'U', '\u0C99' ],
+ [ ';', '\u0C9A' ],
+ [ '\\:', '\u0C9B' ],
+ [ 'p', '\u0C9C' ],
+ [ 'P', '\u0C9D' ],
+ [ '\\}', '\u0C9E' ],
+ [ '\'', '', '\u0C9F' ],
+ [ '"', '\u0CA0' ],
+ [ '\\[', '\u0CA1' ],
+ [ '\\{', '\u0CA2' ],
+ [ 'C', '\u0CA3' ],
+ [ 'l', '\u0CA4' ],
+ [ 'L', '\u0CA5' ],
+ [ 'o', '\u0CA6' ],
+ [ 'O', '\u0CA7' ],
+ [ 'v', '\u0CA8' ],
+ [ 'h', '\u0CAA' ],
+ [ 'H', '\u0CAB' ],
+ [ 'y', '\u0CAC' ],
+ [ 'Y', '\u0CAD' ],
+ [ 'c', '\u0CAE' ],
+ [ '/', '\u0CAF' ],
+ [ 'j', '\u0CB0' ],
+ [ 'J', '\u0CB1' ],
+ [ 'n', '\u0CB2' ],
+ [ 'N', '\u0CB3' ],
+ [ 'b', '\u0CB5' ],
+ [ 'M', '\u0CB6' ],
+ [ ',', '\u0CB7' ],
+ [ 'm', '\u0CB8' ],
+ [ 'u', '\u0CB9' ],
+ [ '\\]', '\u0CBC' ],
+ [ 'e', '\u0CBE' ],
+ [ 'f', '\u0CBF' ],
+ [ 'r', '\u0CC0' ],
+ [ 'g', '\u0CC1' ],
+ [ 't', '\u0CC2' ],
+ [ '\\=', '\u0CC3' ],
+ [ 'z', '\u0CC6' ],
+ [ 's', '\u0CC7' ],
+ [ 'w', '\u0CC8' ],
+ [ '`', '\u0CCA' ],
+ [ 'a', '\u0CCB' ],
+ [ 'q', '\u0CCC' ],
+ [ 'd', '\u0CCD' ],
+ [ 't', '\u0CC2' ],
+ [ '0', '\u0CE6' ],
+ [ '1', '\u0CE7' ],
+ [ '2', '\u0CE8' ],
+ [ '3', '\u0CE9' ],
+ [ '4', '\u0CEA' ],
+ [ '5', '\u0CEB' ],
+ [ '6', '\u0CEC' ],
+ [ '7', '\u0CED' ],
+ [ '8', '\u0CEE' ],
+ [ '9', '\u0CEF' ],
+ [ '\\#', '\u0CCD\u0CB0' ],
+ [ '\\%', '\u0C9C\u0CCD\u0C9E' ],
+ [ '\\^', '\u0CA4\u0CCD\u0CB0' ],
+ [ '\\&', '\u0C95\u0CCD\u0CB0' ],
+ [ '\\(', '\u200D' ],
+ [ '\\)', '\u200C' ] ],
+ patterns_x: [
+ [ 'F', '\uC88C' ],
+ [ '\\>', '\u0CBD' ],
+ [ '\\=', '\u0CC4' ],
+ [ 'H', '\u0CDE' ],
+ [ '\\+', '\u0CE0' ],
+ [ 'R', '\u0CE1' ],
+ [ 'f', '\u0CE2' ],
+ [ 'r', '\u0CE3' ],
+ [ '\\>', '\u0CE4' ],
+ [ '\\.', '\u0CE5' ],
+ [ 'u', '\u0CF1' ],
+ [ 'j', '\u0CF2' ],
+ [ '\\$', '\u20B9' ] ]
+ };
+
+ $.ime.register( knInscript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-inscript2.js
new file mode 100644
index 00000000..75b98ee2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-inscript2.js
@@ -0,0 +1,119 @@
+( function ( $ ) {
+ 'use strict';
+
+ var knInscript2 = {
+ id: 'kn-inscript2',
+ name: 'ಇನ್\u200cಸ್ಕ್ರಿಪ್ಟ್ ೨',
+ description: 'Enhanced InScript keyboard for Kannada script',
+ date: '2013-01-16',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '೧' ],
+ [ '2', '೨' ],
+ [ '\\#', '್ರ' ],
+ [ '3', '೩' ],
+ [ '\\$', 'ರ್' ],
+ [ '4', '೪' ],
+ [ '5', '೫' ],
+ [ '6', '೬' ],
+ [ '7', '೭' ],
+ [ '8', '೮' ],
+ [ '\\(', '(' ],
+ [ '9', '೯' ],
+ [ '\\)', ')' ],
+ [ '0', '೦' ],
+ [ '\\_', 'ಃ' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ಋ' ],
+ [ '\\=', 'ೃ' ],
+ [ 'Q', 'ಔ' ],
+ [ 'q', 'ೌ' ],
+ [ 'W', 'ಐ' ],
+ [ 'w', 'ೈ' ],
+ [ 'E', 'ಆ' ],
+ [ 'e', 'ಾ' ],
+ [ 'R', 'ಈ' ],
+ [ 'r', 'ೀ' ],
+ [ 'T', 'ಊ' ],
+ [ 't', 'ೂ' ],
+ [ 'Y', 'ಭ' ],
+ [ 'y', 'ಬ' ],
+ [ 'U', 'ಙ' ],
+ [ 'u', 'ಹ' ],
+ [ 'I', 'ಘ' ],
+ [ 'i', 'ಗ' ],
+ [ 'O', 'ಧ' ],
+ [ 'o', 'ದ' ],
+ [ 'P', 'ಝ' ],
+ [ 'p', 'ಜ' ],
+ [ '\\{', 'ಢ' ],
+ [ '\\[', 'ಡ' ],
+ [ '\\}', 'ಞ' ],
+ [ '\\]', '಼' ],
+ [ 'A', 'ಓ' ],
+ [ 'a', 'ೋ' ],
+ [ 'S', 'ಏ' ],
+ [ 's', 'ೇ' ],
+ [ 'D', 'ಅ' ],
+ [ 'd', '್' ],
+ [ 'F', 'ಇ' ],
+ [ 'f', 'ಿ' ],
+ [ 'G', 'ಉ' ],
+ [ 'g', 'ು' ],
+ [ 'H', 'ಫ' ],
+ [ 'h', 'ಪ' ],
+ [ 'J', 'ಱ' ],
+ [ 'j', 'ರ' ],
+ [ 'K', 'ಖ' ],
+ [ 'k', 'ಕ' ],
+ [ 'L', 'ಥ' ],
+ [ 'l', 'ತ' ],
+ [ ':', 'ಛ' ],
+ [ ';', 'ಚ' ],
+ [ '"', 'ಠ' ],
+ [ '\\\'', 'ಟ' ],
+ [ '\\~', 'ಒ' ],
+ [ '`\\', 'ೊ' ],
+ [ 'Z', 'ಎ' ],
+ [ 'z', 'ೆ' ],
+ [ 'x', 'ಂ' ],
+ [ 'C', 'ಣ' ],
+ [ 'c', 'ಮ' ],
+ [ 'v', 'ನ' ],
+ [ 'b', 'ವ' ],
+ [ 'N', 'ಳ' ],
+ [ 'n', 'ಲ' ],
+ [ 'M', 'ಶ' ],
+ [ 'm', 'ಸ' ],
+ [ '\\<', 'ಷ' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'ಯ' ],
+ [ '\\%', 'ಜ್ಞ' ],
+ [ '\\^', 'ತ್ರ' ],
+ [ '\\&', 'ಕ್ಷ' ],
+ [ '\\*', 'ಶ್ರ' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '\\+', 'ೠ' ],
+ [ '\\=', 'ೄ' ],
+ [ 'R', 'ೡ' ],
+ [ 'r', 'ೣ' ],
+ [ 'u', 'ೱ' ],
+ [ 'F', 'ಌ' ],
+ [ 'f', 'ೢ' ],
+ [ 'H', 'ೞ' ],
+ [ 'j', 'ೲ' ],
+ [ '\\>', 'ಽ' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+
+ $.ime.register( knInscript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-kgp.js b/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-kgp.js
new file mode 100644
index 00000000..c5c5dfd7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-kgp.js
@@ -0,0 +1,104 @@
+( function ( $ ) {
+ 'use strict';
+
+ var knKGP = {
+ id: 'kn-kgp',
+ name: 'ಕಗಪ/ನುಡಿ',
+ description: 'Kannada kgp/nudi/KP Rao layout',
+ date: '2012-11-09',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Aravinda VK<mail@aravindavk.in>',
+ license: 'GPLv3,MIT',
+ version: '1.0',
+ contextLength: 4,
+ maxKeyLength: 2,
+ patterns: [
+ [ '([ಕ-ಹೞ]಼?)f', '$1್' ],
+ [ '([ಕ-ಹೞ]಼?್)f', '$1' ],
+ [ '\\\\([A-Za-z\\>_~\\.0-9])', '\\\\', '$1' ],
+ [ '([ಕ-ಹೞ]಼?)A', '$1ಾ' ],
+ [ '([ಕ-ಹೞ]಼?)i', '$1ಿ' ],
+ [ '([ಕ-ಹೞ]಼?)I', '$1ೀ' ],
+ [ '([ಕ-ಹೞ]಼?)u', '$1ು' ],
+ [ '([ಕ-ಹೞ]಼?)U', '$1ೂ' ],
+ [ '([ಕ-ಹೞ]಼?)R', '$1ೃ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃX', '$1ೄ' ],
+ [ '([ಕ-ಹೞ]಼?)e', '$1ೆ' ],
+ [ '([ಕ-ಹೞ]಼?)E', '$1ೇ' ],
+ [ '([ಕ-ಹೞ]಼?)Y', '$1ೈ' ],
+ [ '([ಕ-ಹೞ]಼?)o', '$1ೊ' ],
+ [ '([ಕ-ಹೞ]಼?)O', '$1ೋ' ],
+ [ '([ಕ-ಹೞ]಼?)V', '$1ೌ' ],
+ [ 'ಸX', 'ಽ' ],
+ [ '([ಕ-ಹೞ]಼?\u200D)f', '$1್' ],
+ [ '(\u200D)F', '\u200C' ], // 0x200C Zero width non-joiner
+ [ 'F', '\u200D' ], // 0x200D Zero width joiner
+ [ 'k', 'ಕ' ],
+ [ 'K', 'ಖ' ],
+ [ 'g', 'ಗ' ],
+ [ 'G', 'ಘ' ],
+ [ 'Z', 'ಙ' ],
+ [ 'c', 'ಚ' ],
+ [ 'C', 'ಛ' ],
+ [ 'j', 'ಜ' ],
+ [ 'ಜX', 'ಜ಼' ],
+ [ 'J', 'ಝ' ],
+ [ 'z', 'ಞ' ],
+ [ 'q', 'ಟ' ],
+ [ 'Q', 'ಠ' ],
+ [ 'w', 'ಡ' ],
+ [ 'W', 'ಢ' ],
+ [ 'N', 'ಣ' ],
+ [ 't', 'ತ' ],
+ [ 'T', 'ಥ' ],
+ [ 'd', 'ದ' ],
+ [ 'D', 'ಧ' ],
+ [ 'n', 'ನ' ],
+ [ 'p', 'ಪ' ],
+ [ 'P', 'ಫ' ],
+ [ 'ಫX', 'ಫ಼' ],
+ [ 'b', 'ಬ' ],
+ [ 'B', 'ಭ' ],
+ [ 'm', 'ಮ' ],
+ [ 'y', 'ಯ' ],
+ [ 'r', 'ರ' ],
+ [ 'ರX', 'ಱ' ],
+ [ 'l', 'ಲ' ],
+ [ 'v', 'ವ' ],
+ [ 'S', 'ಶ' ],
+ [ 'x', 'ಷ' ],
+ [ 's', 'ಸ' ],
+ [ 'h', 'ಹ' ],
+ [ 'L', 'ಳ' ],
+ [ 'ಳX', 'ೞ' ],
+ [ 'a', 'ಅ' ],
+ [ 'A', 'ಆ' ],
+ [ 'i', 'ಇ' ],
+ [ 'I', 'ಈ' ],
+ [ 'u', 'ಉ' ],
+ [ 'U', 'ಊ' ],
+ [ 'R', 'ಋ' ],
+ [ 'ಋX', 'ೠ' ],
+ [ 'e', 'ಎ' ],
+ [ 'E', 'ಏ' ],
+ [ 'Y', 'ಐ' ],
+ [ 'o', 'ಒ' ],
+ [ 'O', 'ಓ' ],
+ [ 'V', 'ಔ' ],
+ [ 'M', 'ಂ' ],
+ [ 'H', 'ಃ' ],
+ [ '0', '೦' ],
+ [ '1', '೧' ],
+ [ '2', '೨' ],
+ [ '3', '೩' ],
+ [ '4', '೪' ],
+ [ '5', '೫' ],
+ [ '6', '೬' ],
+ [ '7', '೭' ],
+ [ '8', '೮' ],
+ [ '9', '೯' ]
+ ]
+ };
+
+ $.ime.register( knKGP );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-transliteration.js
new file mode 100644
index 00000000..95a8280d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/kn/kn-transliteration.js
@@ -0,0 +1,154 @@
+( function ( $ ) {
+ 'use strict';
+
+ var knTransliteration = {
+ id: 'kn-transliteration',
+ name: 'ಲಿಪ್ಯಂತರಣ',
+ description: 'Kannada transliteration',
+ date: '2012-10-14',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'M G Harish, HP Nadig ',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 5,
+ maxKeyLength: 3,
+ patterns: [
+ [ 'ಕ್h', 'c', 'ಚ್' ],
+ [ '\\\\([A-Za-z\\>_~\\.0-9])', '\\\\', '$1' ],
+ // For users accustomed to Baraha
+ [ 'ಜ್್j', 'ಜ್ಞ್' ],
+ [ '([ಕ-ಹೞ]಼?)್a', '$1' ],
+ [ '([ಕ-ಹೞ]಼?)್A', '$1ಾ' ],
+ [ '([ಕ-ಹೞ]಼?)a', '$1ಾ' ],
+ [ '([ಕ-ಹೞ]಼?)್i', '$1ಿ' ],
+ [ '([ಕ-ಹೞ]಼?)(್I|ಿi|ೆe)', '$1ೀ' ],
+ [ '([ಕ-ಹೞ]಼?)್u', '$1ು' ],
+ [ '([ಕ-ಹೞ]಼?)(ುu|್U|ೊo)', '$1ೂ' ],
+ [ '([ಕ-ಹೞ]಼?)್R', '$1ೃ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃR', '$1ೄ' ],
+ [ '([ಕ-ಹೞ]಼?)್e', '$1ೆ' ],
+ [ '([ಕ-ಹೞ]಼?)್E', '$1ೇ' ],
+ [ '([ಕ-ಹೞ]಼?)i', '$1ೈ' ],
+ [ '([ಕ-ಹೞ]಼?)್o', '$1ೊ' ],
+ [ '([ಕ-ಹೞ]಼?)್O', '$1ೋ' ],
+ [ '([ಕ-ಹೞ]಼?)u', '$1ೌ' ],
+ [ '([ಕ-ಹೞ])್\\`', '$1़್' ],
+ [ '([ಕ-ಹೞ]಼?)್W', '$1ೌ' ],
+ [ '([ಕ-ಹೞ]಼?)್Y', '$1ೈ' ],
+
+ [ 'ಅa', 'ಆ' ],
+ [ '(ಒo|ಉu)', 'ಊ' ],
+ [ 'ಅi', 'ಐ' ],
+ [ '(ಇi|ಎe)', 'ಈ' ],
+ [ 'ಅu', 'ಔ' ],
+ [ 'ಋR', 'ೠ' ],
+ [ 'ಓ~M', 'ॐ' ],
+
+ [ '~l', 'ೞ್' ],
+ [ '~h', 'ಹ್' ],
+ [ '~r', 'ಱ್' ],
+ [ 'q', 'ಱ್' ],
+ [ 'Q', 'ೞ್' ],
+ [ 'ಕ್h', 'ಖ್' ],
+ [ 'ಗ್h', 'ಘ್' ],
+ [ '~g', 'ಙ್' ],
+ [ '~N', 'ಙ್' ],
+ [ 'ಚ್h', 'ಛ್' ],
+ [ 'ಜ್h', 'ಝ್' ],
+ [ '~j', 'ಞ್' ],
+ [ '~n', 'ಞ್' ],
+ [ 'ಟ್h', 'ಠ್' ],
+ [ 'ಡ್h', 'ಢ್' ],
+ [ 'ತ್h', 'ಥ್' ],
+ [ 'ದ್h', 'ಧ್' ],
+ [ 'ಪ್h', 'ಫ್' ],
+ [ 'ಬ್h', 'ಭ್' ],
+ [ 'ಸ್h', 'ಶ್' ],
+ [ 'ಶ್h', 'ಷ್' ],
+
+ [ 'ಋa', 'ರ' ],
+ [ 'ಋA', 'ರಾ' ],
+ [ 'ಋi', 'ರಿ' ],
+ [ 'ಋI', 'ರೀ' ],
+ [ 'ಋu', 'ರು' ],
+ [ 'ಋU', 'ರೂ' ],
+ [ 'ಋe', 'ರೆ' ],
+ [ 'ಋE', 'ರೇ' ],
+
+ [ 'X', '\u200C' ], // 0x200C Zero width non-joiner
+ [ 'x', '\u200D' ], // 0x200D Zero width joiner
+
+ [ '([ಕ-ಹೞ]಼?)ೃa', '$1್ರ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃA', '$1್ರಾ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃi', '$1್ರಿ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃI', '$1್ರೀ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃu', '$1್ರು' ],
+ [ '([ಕ-ಹೞ]಼?)ೃU', '$1್ರೂ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃe', '$1್ರೆ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃE', '$1್ರೇ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃo', '$1್ರೊ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃO', '$1್ರೋ' ],
+ [ '([ಕ-ಹೞ]಼?)ೃ\\~', '$1್ರ್' ],
+
+ [ '।\\.', '॥' ],
+
+ [ 'a', 'ಅ' ],
+ [ 'b', 'ಬ್' ],
+ [ 'c', 'ಚ್' ],
+ [ 'd', 'ದ್' ],
+ [ 'e', 'ಎ' ],
+ [ 'g', 'ಗ್' ],
+ [ 'h', 'ಹ್' ],
+ [ 'i', 'ಇ' ],
+ [ 'j', 'ಜ್' ],
+ [ 'k', 'ಕ್' ],
+ [ 'l', 'ಲ್' ],
+ [ 'm', 'ಮ್' ],
+ [ 'n', 'ನ್' ],
+ [ 'o', 'ಒ' ],
+ [ 'p', 'ಪ್' ],
+ [ 'r', 'ರ್' ],
+ [ 's', 'ಸ್' ],
+ [ 't', 'ತ್' ],
+ [ 'u', 'ಉ' ],
+ [ '(v|w)', 'ವ್' ],
+ [ 'y', 'ಯ್' ],
+ [ 'A', 'ಆ' ],
+ [ 'B', 'ಭ್' ],
+ [ 'C', 'ಛ್' ],
+ [ 'D', 'ಡ್' ],
+ [ 'E', 'ಏ' ],
+ [ 'G', 'ಘ್' ],
+ [ 'H', 'ಃ' ],
+ [ 'I', 'ಈ' ],
+ [ 'J', 'ಝ್' ],
+ [ 'K', 'ಖ್' ],
+ [ 'L', 'ಳ್' ],
+ [ 'M', 'ಂ' ],
+ [ 'N', 'ಣ್' ],
+ [ 'O', 'ಓ' ],
+ [ 'P', 'ಫ್' ],
+ [ 'R', 'ಋ' ],
+ [ 'S', 'ಶ್' ],
+ [ 'T', 'ಟ್' ],
+ [ 'U', 'ಊ' ],
+ [ 'V', 'ವ್' ],
+ [ 'W', '', 'ಔ' ],
+ [ 'Y', 'ಐ' ],
+ [ '(z|Z)', 'ಜ಼್' ],
+ [ '(f|F)', 'ಫ಼್' ],
+ [ '0', '೦' ],
+ [ '1', '೧' ],
+ [ '2', '೨' ],
+ [ '3', '೩' ],
+ [ '4', '೪' ],
+ [ '5', '೫' ],
+ [ '6', '೬' ],
+ [ '7', '೭' ],
+ [ '8', '೮' ],
+ [ '9', '೯' ],
+ [ '//', 'ಽ' ] ]
+ };
+
+ $.ime.register( knTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/kr/kr-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/kr/kr-tilde.js
new file mode 100644
index 00000000..541d8212
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/kr/kr-tilde.js
@@ -0,0 +1,27 @@
+( function ( $ ) {
+ 'use strict';
+
+ var krTilde = {
+ id: 'kr-tilde',
+ name: 'Kanuri tilde',
+ description: 'Kanuri tilde keyboard',
+ date: '2022-06-11',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ '~E', 'Ǝ' ],
+ [ '~e', 'ǝ' ],
+ [ '~R', 'Ɍ' ],
+ [ '~r', 'ɍ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( krTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ks/ks-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ks/ks-inscript.js
new file mode 100644
index 00000000..e9bc021b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ks/ks-inscript.js
@@ -0,0 +1,129 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ksInScript = {
+ id: 'ks-inscript',
+ name: 'InScript',
+ description: 'InScript keyboard for Kashmiri language using Devanagari script',
+ date: '2013-02-09',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 3,
+ patterns: [
+ [ '्d', '्\u200c' ],
+ [ 'ग_', 'ॻ' ],
+ [ 'ज_', 'ॼ' ],
+ [ 'ड_', 'ॾ' ],
+ [ 'ब_', 'ॿ' ],
+ [ '\\!', 'ऍ' ],
+ [ '1', '१' ],
+ [ '\\@', 'ॅ' ],
+ [ '2', '२' ],
+ [ '\\#', '#' ],
+ [ '3', '३' ],
+ [ '\\$', '$' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\)', ')' ],
+ [ '0', '०' ],
+ [ '\\_', 'ः' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ऋ' ],
+ [ '\\=', 'ृ' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ौ' ],
+ [ 'W', 'ऐ' ],
+ [ 'w', 'ै' ],
+ [ 'E', 'आ' ],
+ [ 'e', 'ा' ],
+ [ 'R', 'ई' ],
+ [ 'r', 'ी' ],
+ [ 'T', 'ऊ' ],
+ [ 't', 'ू' ],
+ [ 'Y', 'भ' ],
+ [ 'y', 'ब' ],
+ [ 'U', 'ङ' ],
+ [ 'u', 'ह' ],
+ [ 'I', 'घ' ],
+ [ 'i', 'ग' ],
+ [ 'O', 'ध' ],
+ [ 'o', 'द' ],
+ [ 'P', 'झ' ],
+ [ 'p', 'ज' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ञ' ],
+ [ '\\]', '़' ],
+ [ 'A', 'ओ' ],
+ [ 'a', 'ो' ],
+ [ 'S', 'ए' ],
+ [ 's', 'े' ],
+ [ 'D', 'अ' ],
+ [ 'd', '्' ],
+ [ 'F', 'इ' ],
+ [ 'f', 'ि' ],
+ [ 'H', 'फ' ],
+ [ 'h', 'प' ],
+ [ 'J', 'ऱ' ],
+ [ 'j', 'र' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'थ' ],
+ [ 'l', 'त' ],
+ [ ':', 'छ' ],
+ [ ';', 'च' ],
+ [ '"', 'ठ' ],
+ [ '\'', 'ट' ],
+ [ '\\|', 'ऑ' ],
+ [ '\\\\', 'ॉ' ],
+ [ '\\~', 'ऒ' ],
+ [ '\\`', 'ॊ' ],
+ [ 'Z', 'ऎ' ],
+ [ 'z', 'ॆ' ],
+ [ 'X', 'ँ' ],
+ [ 'x', 'ं' ],
+ [ 'C', 'ण' ],
+ [ 'c', 'म' ],
+ [ 'V', 'ऩ' ],
+ [ 'v', 'न' ],
+ [ 'B', 'ऴ' ],
+ [ 'b', 'व' ],
+ [ 'N', 'ळ' ],
+ [ 'n', 'ल' ],
+ [ 'M', 'श' ],
+ [ 'm', 'स' ],
+ [ '\\<', 'ष' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '\\?', 'य़' ],
+ [ '/', 'य' ],
+ [ '\\%', 'ज्ञ' ],
+ [ '\\^', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ],
+ patterns_x: [
+ [ '4', '₹' ],
+ [ 'Q', 'ॵ' ],
+ [ 'q', 'ॏ' ],
+ [ 'T', 'ॷ' ],
+ [ 't', 'ॗ' ],
+ [ 'A', 'ॴ' ],
+ [ 'a', 'ऻ' ],
+ [ 'G', 'ॶ' ],
+ [ 'g', 'ॖ' ],
+ [ 'Z', 'ॳ' ],
+ [ 'z', 'ऺ' ]
+ ]
+ };
+
+ $.ime.register( ksInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ks/ks-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ks/ks-kbd.js
new file mode 100644
index 00000000..44065ac9
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ks/ks-kbd.js
@@ -0,0 +1,98 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ksKbd = {
+ id: 'ks-kbd',
+ name: 'Kashmiri kbd',
+ description: 'Kbd keyboard for Kashmiri language using Arabic script',
+ date: '2013-02-09',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\~', '\u0653' ], // Hamza above
+ [ '1', '۱' ],
+ [ '2', '۲' ],
+ [ '3', '۳' ],
+ [ '4', '۴' ],
+ [ '5', '۵' ],
+ [ '6', '۶' ],
+ [ '7', '۷' ],
+ [ '8', '۸' ],
+ [ '9', '۹' ],
+ [ '0', '۰' ],
+ [ '\\(', ')' ], // RTL mirroring
+ [ '\\)', '(' ], // RTL mirroring
+ [ '\\[', ']' ], // RTL mirroring
+ [ '\\]', '[' ], // RTL mirroring
+ [ '\\{', '\u0670' ], // Superscript Alef
+ [ '\\}', '\u0670' ], // Superscript Alef
+ [ '\\_', '\u0651' ], // Shadda
+ [ 'Q', 'ﷺ' ],
+ [ 'q', 'ق' ],
+ [ 'W', 'ؤ' ],
+ [ 'w', 'و' ],
+ [ 'E', 'ئ' ],
+ [ 'e', 'ع' ],
+ [ 'R', 'ڑ' ],
+ [ 'r', 'ر' ],
+ [ 'T', 'ٹ' ],
+ [ 't', 'ت' ],
+ [ 'Y', '\u0601' ], // Sanah
+ [ 'y', 'ے' ],
+ [ 'U', '،' ],
+ [ 'u', 'ء' ],
+ [ 'I', 'ۆ' ],
+ [ 'i', 'ی' ],
+ [ 'O', 'ۃ' ],
+ [ 'o', 'ہ' ], // Heh goal
+ [ 'P', 'إ' ],
+ [ 'p', 'پ' ],
+ [ 'A', 'آ' ],
+ [ 'a', 'ا' ],
+ [ 'S', 'ش' ],
+ [ 's', 'س' ],
+ [ 'D', 'ڈ' ],
+ [ 'd', 'د' ],
+ [ 'F', '\u064F' ], // Damma
+ [ 'f', 'ف' ],
+ [ 'G', 'غ' ],
+ [ 'g', 'گ' ],
+ [ 'H', 'ح' ],
+ [ 'h', 'ھ' ],
+ [ 'J', 'ژ' ],
+ [ 'j', 'ج' ],
+ [ 'K', 'خ' ],
+ [ 'k', 'ک' ],
+ [ 'L', '\u0613' ], // Radi Allahou anhu
+ [ 'l', 'ل' ],
+ [ ';', '؛' ],
+ [ '\'', '\u0670' ], // Superscript Alef
+ [ '\\|', 'أ' ],
+ [ '\\\\', '؎' ],
+ [ '\\~', '\u064B' ], // Fathatan / FIXME This cannot actually work
+ [ '`', '\u064D' ], // Kasratan
+ [ 'Z', 'ذ' ],
+ [ 'z', 'ز' ],
+ [ 'X', 'ض' ],
+ [ 'x', 'ص' ],
+ [ 'C', 'ث' ],
+ [ 'c', 'چ' ],
+ [ 'V', 'ظ' ],
+ [ 'v', 'ط' ],
+ [ 'B', 'أ' ],
+ [ 'b', 'ب' ],
+ [ 'N', 'ں' ],
+ [ 'n', 'ن' ],
+ [ 'M', '\u0654' ], // Hamza above
+ [ 'm', 'م' ],
+ [ '\\>', '\u064E' ], // Fatha
+ [ ',', '،' ],
+ [ '\\<', '\u0650' ], // Kasra
+ [ '\\.', '۔' ], // Arabic Full stop
+ [ '\\?', '؟' ]
+ ]
+ };
+
+ $.ime.register( ksKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ku/ku-h.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ku/ku-h.js
new file mode 100644
index 00000000..7c649436
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ku/ku-h.js
@@ -0,0 +1,47 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kuH = {
+ id: 'ku-h',
+ name: 'Kurdî-h',
+ description: 'writing Kurdish-letters adding h\'s',
+ date: '2013-06-26',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Ghybu',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ patterns: [
+ [ 'çh', 'h', 'ch' ],
+ [ 'şh', 'h', 'sh' ],
+ [ 'ḧh', 'h', 'hh' ],
+ [ 'ẍh', 'h', 'xh' ],
+ [ 'êe', 'e', 'ee' ],
+ [ 'îi', 'i', 'ii' ],
+ [ 'ûu', 'u', 'uu' ],
+ [ 'Ç(H|h)', '(H|h)', 'C$1' ],
+ [ 'Ş(H|h)', '(H|h)', 'S$1' ],
+ [ 'Ḧ(H|h)', '(H|h)', 'H$1' ],
+ [ 'Ẍ(H|h)', '(H|h)', 'X$1' ],
+ [ 'Ê(E|e)', '(E|e)', 'E$1' ],
+ [ 'Î(I|i)', '(I|i)', 'I$1' ],
+ [ 'Û(U|u)', '(U|u)', 'U$1' ],
+
+ [ 'ch', 'ç' ],
+ [ 'sh', 'ş' ],
+ [ 'hh', 'ḧ' ],
+ [ 'xh', 'ẍ' ],
+ [ 'ee', 'ê' ],
+ [ 'ii', 'î' ],
+ [ 'uu', 'û' ],
+ [ 'C(H|h)', 'Ç' ],
+ [ 'S(H|h)', 'Ş' ],
+ [ 'H(H|h)', 'Ḧ' ],
+ [ 'X(H|h)', 'Ẍ' ],
+ [ 'E(E|e)', 'Ê' ],
+ [ 'I(I|i)', 'Î' ],
+ [ 'U(U|u)', 'Û' ] ]
+ };
+
+ $.ime.register( kuH );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ku/ku-tr.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ku/ku-tr.js
new file mode 100644
index 00000000..7ec9ef87
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ku/ku-tr.js
@@ -0,0 +1,32 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kuTr = {
+ id: 'ku-tr',
+ name: 'Kurdî-tr',
+ description: 'writing Kurdish-letters using the TR keyboard',
+ date: '2013-06-26',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Ghybu',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ patterns: [
+ [ 'ḧh', 'h', 'hh' ],
+ [ 'Ḧ(H|h)', '(H|h)', 'H$1' ],
+
+ [ 'ğ', 'ẍ' ],
+ [ 'ı', 'i' ],
+ [ 'i', 'î' ],
+ [ 'ö', 'ê' ],
+ [ 'ü', 'û' ],
+ [ 'hh', 'ḧ' ],
+ [ 'Ğ', 'Ẍ' ],
+ [ 'İ', 'Î' ],
+ [ 'Ö', 'Ê' ],
+ [ 'Ü', 'Û' ],
+ [ 'H(H|h)', 'Ḧ' ] ]
+ };
+
+ $.ime.register( kuTr );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ky/ky-cyrl-alt.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ky/ky-cyrl-alt.js
new file mode 100644
index 00000000..9bf036d1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ky/ky-cyrl-alt.js
@@ -0,0 +1,25 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kyCyrlAlt = {
+ id: 'ky-cyrl-alt',
+ name: 'Кыргыз Alt',
+ description: 'Кыргыз Alt',
+ date: '2013-08-10',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Amir (Алексей) Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [],
+ patterns_x: [
+ [ 'н', 'ң' ],
+ [ 'Н', 'Ң' ],
+ [ 'о', 'ө' ],
+ [ 'О', 'Ө' ],
+ [ 'у', 'ү' ],
+ [ 'У', 'Ү' ]
+ ]
+ };
+
+ $.ime.register( kyCyrlAlt );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/lg/lg-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/lg/lg-tilde.js
new file mode 100644
index 00000000..27ae3643
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/lg/lg-tilde.js
@@ -0,0 +1,20 @@
+( function ( $ ) {
+ 'use strict';
+
+ var lgTilde = {
+ id: 'lg-tilde',
+ name: 'lg-tilde',
+ description: 'Luganda tilde keyboard',
+ date: '2019-03-28',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ]
+ ]
+ };
+
+ $.ime.register( lgTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ln/ln-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ln/ln-tilde.js
new file mode 100644
index 00000000..52199f64
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ln/ln-tilde.js
@@ -0,0 +1,25 @@
+( function ( $ ) {
+ 'use strict';
+
+ var lnTilde = {
+ id: 'ln-tilde',
+ name: 'ln-tilde',
+ description: 'Lingala tilde keyboard',
+ date: '2019-03-28',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\^', '\u0302' ], // Combining circumflex
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( lnTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/lo/lo-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/lo/lo-kbd.js
new file mode 100644
index 00000000..bf149d15
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/lo/lo-kbd.js
@@ -0,0 +1,122 @@
+( function ( $ ) {
+ 'use strict';
+
+ var loKbd = {
+ id: 'lo-kbd',
+ name: 'Lao kbd',
+ description: 'Lao kbd keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\!', '1' ],
+ [ '"', '=' ],
+ [ '\\#', '3' ],
+ [ '\\$', '4' ],
+ [ '\\&', '5' ],
+ [ '\\%', '໌' ],
+ [ '\'', 'ງ' ],
+ [ '\\(', '7' ],
+ [ '\\)', '8' ],
+ [ '\\*', '6' ],
+ [ '\\+', 'ໍ' ],
+ [ ',', 'ມ' ],
+ [ '\\-', 'ຊ' ],
+ [ '\\.', 'ໃ' ],
+ [ '/', 'ຝ' ],
+ [ '0', 'ຂ' ],
+ [ '1', 'ຢ' ],
+ [ '2', 'ຟ' ],
+ [ '3', 'ໂ' ],
+ [ '4', 'ຖ' ],
+ [ '5', 'ຸ' ],
+ [ '6', 'ູ' ],
+ [ '7', 'ຄ' ],
+ [ '8', 'ຕ' ],
+ [ '9', 'ຈ' ],
+ [ ':', '%' ],
+ [ ';', 'ວ' ],
+ [ '\\<', 'ໝ' ],
+ [ '\\=', 'ໍ' ],
+ [ '\\>', '$' ],
+ [ '\\?', ')' ],
+ [ '\\@', '2' ],
+ [ 'A', 'ັ' ],
+ [ 'B', 'ຶ' ],
+ [ 'C', 'ຯ' ],
+ [ 'D', '.' ],
+ [ 'E', 'ຳ' ],
+ [ 'F', ',' ],
+ [ 'G', ':' ],
+ [ 'H', '໊' ],
+ [ 'I', 'ຮ' ],
+ [ 'J', '໋' ],
+ [ 'K', '!' ],
+ [ 'L', '?' ],
+ [ 'M', 'ໆ' ],
+ [ 'N', 'ື' ],
+ [ 'O', 'ໜ' ],
+ [ 'P', 'ຽ' ],
+ [ 'Q', 'ົ' ],
+ [ 'R', '_' ],
+ [ 'S', ';' ],
+ [ 'T', '+' ],
+ [ 'U', 'ີ' ],
+ [ 'V', 'x' ],
+ [ 'W', '0' ],
+ [ 'X', '(' ],
+ [ 'Y', 'ິ' ],
+ [ 'Z', '"' ],
+ [ '\\[', 'ບ' ],
+ [ '\\]', 'ລ' ],
+ [ '\\^', 'ຼ' ],
+ [ '\\_', '9' ],
+ [ '`', '*' ],
+ [ 'a', 'ັ' ],
+ [ 'b', 'ຶ' ],
+ [ 'c', 'ແ' ],
+ [ 'd', 'ກ' ],
+ [ 'e', 'ຳ' ],
+ [ 'f', 'ດ' ],
+ [ 'g', 'ເ' ],
+ [ 'h', '້' ],
+ [ 'i', 'ຣ' ],
+ [ 'j', '່' ],
+ [ 'k', 'າ' ],
+ [ 'l', 'ສ' ],
+ [ 'm', 'ທ' ],
+ [ 'n', 'ື' ],
+ [ 'o', 'ນ' ],
+ [ 'p', 'ຍ' ],
+ [ 'q', 'ົ' ],
+ [ 'r', 'ພ' ],
+ [ 's', 'ຫ' ],
+ [ 't', 'ະ' ],
+ [ 'u', 'ີ' ],
+ [ 'v', 'ອ' ],
+ [ 'w', 'ໄ' ],
+ [ 'x', 'ປ' ],
+ [ 'y', 'ິ' ],
+ [ 'z', 'ຜ' ],
+ [ '\\{', '-' ],
+ [ '\\|', 'ຫຼ' ],
+ [ '\\}', '/' ],
+ [ '~', '໌' ],
+ [ '\\\\', '\\' ],
+ [ '0', '໐' ],
+ [ '1', '໑' ],
+ [ '2', '໒' ],
+ [ '3', '໓' ],
+ [ '4', '໔' ],
+ [ '5', '໕' ],
+ [ '6', '໖' ],
+ [ '7', '໗' ],
+ [ '8', '໘' ],
+ [ '9', '໙' ]
+ ]
+ };
+
+ $.ime.register( loKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/lrc/lrc-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/lrc/lrc-kbd.js
new file mode 100644
index 00000000..fb5bc7a0
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/lrc/lrc-kbd.js
@@ -0,0 +1,108 @@
+( function ( $ ) {
+ 'use strict';
+
+ var lrcKbd = {
+ id: 'lrc-kbd',
+ name: 'لۊری شومالی',
+ description: 'Northern Luri Keyboard Layout',
+ date: '2015-05-11',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Mjbmr',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', '\u200c' ],
+ [ '1', '۱' ],
+ [ '2', '۲' ],
+ [ '3', '۳' ],
+ [ '4', '۴' ],
+ [ '5', '۵' ],
+ [ '6', '۶' ],
+ [ '7', '۷' ],
+ [ '8', '۸' ],
+ [ '9', '۹' ],
+ [ '0', '۰' ],
+
+ [ 'q', 'ض' ],
+ [ 'w', 'ص' ],
+ [ 'e', 'ث' ],
+ [ 'r', 'ق' ],
+ [ 't', 'ف' ],
+ [ 'y', 'غ' ],
+ [ 'u', 'ع' ],
+ [ 'i', 'ھ' ],
+ [ 'o', 'خ' ],
+ [ 'p', 'ح' ],
+ [ '\\[', 'ج' ],
+ [ '\\]', 'چ' ],
+
+ [ 'a', 'ش' ],
+ [ 's', 'س' ],
+ [ 'd', 'ی' ],
+ [ 'f', 'ب' ],
+ [ 'g', 'ل' ],
+ [ 'h', 'ا' ],
+ [ 'j', 'ت' ],
+ [ 'k', 'ن' ],
+ [ 'l', 'م' ],
+ [ ';', 'ک' ],
+ [ '\'', 'گ' ],
+
+ [ 'z', 'ظ' ],
+ [ 'x', 'ط' ],
+ [ 'c', 'ز' ],
+ [ 'v', 'ر' ],
+ [ 'b', 'ذ' ],
+ [ 'n', 'د' ],
+ [ 'm', 'پ' ],
+ [ ',', 'ڤ' ],
+
+ [ '~', '÷' ],
+ [ '@', '٬' ],
+ [ '#', '٫' ],
+ [ '%', '٪' ],
+ [ '\\^', '×' ],
+ [ '&', '،' ],
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+ [ '_', 'ـ' ],
+
+ [ 'Q', 'ۊ' ],
+ [ 'W', 'ۉ' ],
+ [ 'E', 'وٙ' ],
+ [ 'R', 'ً' ],
+ [ 'T', 'و' ],
+ [ 'Y', 'أ' ],
+ [ 'U', 'ە' ],
+ [ 'I', 'ؤ' ],
+ [ 'O', ']' ],
+ [ 'P', '[' ],
+ [ '\\{', '}' ],
+ [ '\\}', '{' ],
+
+ [ 'A', 'اٛ' ],
+ [ 'S', 'ئ' ],
+ [ 'D', 'ئو' ],
+ [ 'F', 'ئی' ],
+ [ 'G', 'لٛ' ],
+ [ 'H', 'آ' ],
+ [ 'J', 'او' ],
+ [ 'K', '»' ],
+ [ 'L', '«' ],
+ [ '"', '؛' ],
+
+ [ 'Z', 'نٛ' ],
+ [ 'X', 'گٛ' ],
+ [ 'C', 'ژ' ],
+ [ 'V', 'ؽ' ],
+ [ 'B', 'دٙ' ],
+ [ 'N', 'ٔ' ],
+ [ 'M', 'ء' ],
+ [ '<', '>' ],
+ [ '>', '<' ],
+ [ '\\?', '؟' ]
+ ]
+ };
+
+ $.ime.register( lrcKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/lud/lud-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/lud/lud-transliteration.js
new file mode 100644
index 00000000..53faece4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/lud/lud-transliteration.js
@@ -0,0 +1,29 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mapping = {
+ id: 'lud-transliteration',
+ name: 'lud',
+ description: 'Ludic transliteration',
+ date: '2014-06-14',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Niklas Laxström',
+ license: 'MIT',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ 'ch', 'č' ],
+ [ 'C[hH]', 'Č' ],
+ [ 'sh', 'š' ],
+ [ 'S[hH]', 'Š' ],
+ [ 'zh', 'ž' ],
+ [ 'Z[hH]', 'Ž' ],
+ [ 'y', 'ü' ],
+ [ 'Y', 'Ü' ],
+ [ '\'', '’' ]
+ ]
+ };
+
+ $.ime.register( mapping );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/lut/lut-tulalip.js b/UniversalLanguageSelector/lib/jquery.ime/rules/lut/lut-tulalip.js
new file mode 100644
index 00000000..2ac3eff1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/lut/lut-tulalip.js
@@ -0,0 +1,55 @@
+( function ( $ ) {
+ 'use strict';
+
+ var lutTulalip = {
+ id: 'lut-tulalip',
+ name: 'Lushootseed Tulalip',
+ description: 'Lushootseed Keyboard with Tulalip Layout',
+ date: '2014-03-01',
+ URL: 'https://github.com/jcrowgey/jquery.ime',
+ author: 'Joshua Crowgey, jcrowgey@u.washington.edu',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'e', 'ə' ], // U+0259
+ [ 'r', 'š' ], // U+0161
+ [ 'o', 'ʷ' ], // U+02B7
+ [ 'f', 'ʔ' ], // U+0294
+ [ 'j', 'ǰ' ], // U+01F0
+ [ ';', 'ɬ' ], // U+026C
+ [ 'z', 'x̌' ], // U+0078 U+030C
+ [ 'v', 'č' ], // U+010D
+ // shifted
+ [ 'Q', 'q̓' ], // U+0071 U+0313
+ [ 'W', 'w̓' ], // U+0077 U+0313
+ [ 'E', 'q̓ʷ' ], // U+0071 U+0313 U+02B7
+ [ 'R', '√' ], // U+221A
+ [ 'T', 't̕' ], // U+0074 U+0315
+ [ 'Y', 'y̓' ], // U+0079 U+0313
+ [ 'U', '' ], // nul
+ [ 'I', 'kʷ' ], // U+006B U+02B7
+ [ 'O', '' ], // nul
+ [ 'P', 'p̓' ], // U+0070 U+0313
+ // middle row shifted
+ [ 'A', 'qʷ' ], // U+0071 U+02B7
+ [ 'S', '' ], // nul
+ [ 'D', 'dᶻ' ], // U+0064 U+1DBB
+ [ 'F', '' ], // nul
+ [ 'G', 'gʷ' ], // U+0067 U+02B7
+ [ 'H', '' ], // nul
+ [ 'J', 'k̓ʷ' ], // U+006B U+0313 U+02B7
+ [ 'K', 'k̓' ], // U+006B U+0313
+ [ 'L', 'l̕' ], // U+006C U+0315
+ [ ':', 'ƛ̕' ], // U+019B U+0315
+ // bottom row shifted
+ [ 'Z', 'x̌ʷ' ], // U+0078 U+030C U+02B7
+ [ 'X', 'xʷ' ], // U+0078 U+02B7
+ [ 'C', 'c̓' ], // U+0063 U+0313
+ [ 'V', 'č̓' ], // U+010D U+0313
+ [ 'B', 'b̓' ], // U+0062 U+0313
+ [ 'N', 'n̓' ], // U+006E U+0313
+ [ 'M', 'm̓' ] // U+006D U+0313
+ ]
+ };
+ $.ime.register( lutTulalip );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mad/mad-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mad/mad-tilde.js
new file mode 100644
index 00000000..44bdd4d5
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mad/mad-tilde.js
@@ -0,0 +1,26 @@
+( function ( $ ) {
+ 'use strict';
+
+ var madTilde = {
+ id: 'mad-tilde',
+ name: 'mad-tilde',
+ description: 'Madurese tilde keyboard',
+ date: '2020-12-06',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1',
+ patterns: [
+ [ '~A', 'Â' ],
+ [ '~a', 'â' ],
+ [ '~D', 'Ḍ' ],
+ [ '~d', 'ḍ' ],
+ [ '~E', 'È' ],
+ [ '~e', 'è' ],
+ [ '~T', 'Ṭ' ],
+ [ '~t', 'ṭ' ]
+ ]
+ };
+
+ $.ime.register( madTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mai/mai-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mai/mai-inscript.js
new file mode 100644
index 00000000..b9b5f6a1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mai/mai-inscript.js
@@ -0,0 +1,22 @@
+( function ( $ ) {
+ 'use strict';
+
+ var hiInScript, maithiliPatterns, maithiliInScript;
+ hiInScript = $.ime.inputmethods[ 'hi-inscript' ];
+ maithiliPatterns = $.extend( hiInScript.patterns, [ [ 'z', '\u02BC' ] ] ); // apostrophe
+
+ maithiliInScript = {
+ id: 'mai-inscript',
+ name: 'इनस्क्रिप्ट',
+ description: 'InScript keyboard for Maithili',
+ date: '2011-02-26',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 1,
+ patterns: maithiliPatterns,
+ patterns_x: hiInScript.patterns_x
+ };
+
+ $.ime.register( maithiliInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mai/mai-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mai/mai-inscript2.js
new file mode 100644
index 00000000..6654b937
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mai/mai-inscript2.js
@@ -0,0 +1,25 @@
+( function ( $ ) {
+ 'use strict';
+
+ var hiInScript2, maithiliPatterns2, maithiliInScript2;
+
+ hiInScript2 = $.ime.inputmethods[ 'hi-inscript2' ];
+ maithiliPatterns2 = $.extend( hiInScript2.patterns,
+ [ [ 'z', '\u02BC' ] ]
+ ); // apostrophe
+
+ maithiliInScript2 = {
+ id: 'mai-inscript2',
+ name: 'इनस्क्रिप्ट २',
+ description: 'InScript2 keyboard for Maithili',
+ date: '2013-02-13',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 1,
+ patterns: maithiliPatterns2,
+ patterns_x: hiInScript2.patterns_x
+ };
+
+ $.ime.register( maithiliInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mg/mg-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mg/mg-tilde.js
new file mode 100644
index 00000000..ec215dd8
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mg/mg-tilde.js
@@ -0,0 +1,25 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mgTilde = {
+ id: 'mg-tilde',
+ name: 'mg-tilde',
+ description: 'Malagasy tilde keyboard',
+ date: '2019-03-28',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~n', 'n̈' ],
+ [ '~N', 'N̈' ],
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\^', '\u0302' ], // Combining circumflex
+ [ '~\\:', '\u0308' ], // Combining diaeresis
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( mgTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mh/mh.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mh/mh.js
new file mode 100644
index 00000000..79dfa01b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mh/mh.js
@@ -0,0 +1,43 @@
+/**
+ * Businesses and government offices in the Republic of the Marshall Islands typically use
+ * a font to replace eight letters that are typically unused in the Marshallese language
+ * with Marshallese letters.
+ * Sample English translations: http://mapmeld.github.com/olpc-rmi/laptops.html
+ * Pronunciation: http://www.rmiembassyus.org/Marshallese%20Phrasebook.htm
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ var mh = {
+ id: 'mh',
+ name: 'Kajin M̧ajeļ',
+ description: 'Marshallese Language',
+ date: '2013-03-29',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Nick Doiron, <ndoiron@mapmeld.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Y', 'Ū' ],
+ [ 'S', 'Ā' ],
+ [ 'F', 'Ņ' ],
+ [ 'G', 'N̄' ],
+ [ 'H', 'M̧' ],
+ [ 'X', 'O̧' ],
+ [ 'C', 'Ō' ],
+ [ 'V', 'Ļ' ],
+
+ [ 'y', 'ū' ],
+ [ 's', 'ā' ],
+ [ 'f', 'ņ' ],
+ [ 'g', 'n̄' ],
+ [ 'h', 'm̧' ],
+ [ 'x', 'o̧' ],
+ [ 'c', 'ō' ],
+ [ 'v', 'ļ' ]
+ ]
+ };
+
+ $.ime.register( mh );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-inscript.js
new file mode 100644
index 00000000..6a722618
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-inscript.js
@@ -0,0 +1,90 @@
+( function ( $ ) {
+ 'use strict';
+
+ var inscript = {
+ id: 'ml-inscript',
+ name: 'ഇൻസ്ക്രിപ്റ്റ്',
+ description: 'Malayalam InScript',
+ date: '2012-10-03',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ '`', 'ൊ' ],
+ [ '~', 'ഒ' ],
+ [ '_', 'ഃ' ],
+ [ '=', 'ൃ' ],
+ [ '\\+', 'ഋ' ],
+ [ '\\\\', '\u200C' ],
+ [ 'q', 'ൗ' ],
+ [ 'Q', 'ഔ' ],
+ [ 'w', 'ൈ' ],
+ [ 'W', 'ഐ' ],
+ [ 'e', 'ാ' ],
+ [ 'E', 'ആ' ],
+ [ 'r', 'ീ' ],
+ [ 'R', 'ഈ' ],
+ [ 't', 'ൂ' ],
+ [ 'T', 'ഊ' ],
+ [ 'y', 'ബ' ],
+ [ 'Y', 'ഭ' ],
+ [ 'u', 'ഹ' ],
+ [ 'U', 'ങ' ],
+ [ 'i', 'ഗ' ],
+ [ 'I', 'ഘ' ],
+ [ 'o', 'ദ' ],
+ [ 'O', 'ധ' ],
+ [ 'p', 'ജ' ],
+ [ 'P', 'ഝ' ],
+ [ '\\[', 'ഡ' ],
+ [ '\\{', 'ഢ' ],
+ [ 'ണ്\\]', 'ൺ' ],
+ [ 'ന്\\]', 'ൻ' ],
+ [ 'ര്\\]', 'ർ' ],
+ [ 'ല്\\]', 'ൽ' ],
+ [ 'ള്\\]', 'ൾ' ],
+ [ 'ക്\\]', 'ൿ' ],
+ [ '\\}', 'ഞ' ],
+ [ 'a', 'ോ' ],
+ [ 'A', 'ഓ' ],
+ [ 's', 'േ' ],
+ [ 'S', 'ഏ' ],
+ [ 'd', '്' ],
+ [ 'D', 'അ' ],
+ [ 'f', 'ി' ],
+ [ 'F', 'ഇ' ],
+ [ 'g', 'ു' ],
+ [ 'G', 'ഉ' ],
+ [ 'h', 'പ' ],
+ [ 'H', 'ഫ' ],
+ [ 'j', 'ര' ],
+ [ 'J', 'റ' ],
+ [ 'k', 'ക' ],
+ [ 'K', 'ഖ' ],
+ [ 'l', 'ത' ],
+ [ 'L', 'ഥ' ],
+ [ ';', 'ച' ],
+ [ ':', 'ഛ' ],
+ [ '\'', 'ട' ],
+ [ '"', 'ഠ' ],
+ [ 'z', 'െ' ],
+ [ 'Z', 'എ' ],
+ [ 'x', 'ം' ],
+ [ 'c', 'മ' ],
+ [ 'C', 'ണ' ],
+ [ 'v', 'ന' ],
+ [ 'b', 'വ' ],
+ [ 'B', 'ഴ' ],
+ [ 'n', 'ല' ],
+ [ 'N', 'ള' ],
+ [ 'm', 'സ' ],
+ [ 'M', 'ശ' ],
+ [ '<', 'ഷ' ],
+ [ '/', 'യ' ] ]
+ };
+
+ $.ime.register( inscript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-inscript2.js
new file mode 100644
index 00000000..cc298203
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-inscript2.js
@@ -0,0 +1,132 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mlInScript2 = {
+ id: 'ml-inscript2',
+ name: 'ഇൻസ്ക്രിപ്റ്റ് 2',
+ description: 'Enhanced InScript for Malayalam InScript',
+ date: '2013-01-16',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ '1', '൧' ],
+ [ '2', '൨' ],
+ [ '3', '൩' ],
+ [ '\\#', '്ര' ],
+ [ '4', '൪' ],
+ [ '5', '൫' ],
+ [ '6', '൬' ],
+ [ '7', '൭' ],
+ [ '\\&', 'ക്ഷ' ],
+ [ '8', '൮' ],
+ [ '\\*', 'ൾ' ],
+ [ '\\(', '(' ],
+ [ '9', '൯' ],
+ [ '\\)', ')' ],
+ [ '0', '൦' ],
+ [ '\\_', 'ഃ' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ഋ' ],
+ [ '\\=', 'ൃ' ],
+ [ 'Q', 'ഔ' ],
+ [ 'q', 'ൗ' ],
+ [ 'W', 'ഐ' ],
+ [ 'w', 'ൈ' ],
+ [ 'E', 'ആ' ],
+ [ 'e', 'ാ' ],
+ [ 'R', 'ഈ' ],
+ [ 'r', 'ീ' ],
+ [ 'T', 'ഊ' ],
+ [ 't', 'ൂ' ],
+ [ 'Y', 'ഭ' ],
+ [ 'y', 'ബ' ],
+ [ 'U', 'ങ' ],
+ [ 'u', 'ഹ' ],
+ [ 'I', 'ഘ' ],
+ [ 'i', 'ഗ' ],
+ [ 'O', 'ധ' ],
+ [ 'o', 'ദ' ],
+ [ 'P', 'ഝ' ],
+ [ 'p', 'ജ' ],
+ [ '\\{', 'ഢ' ],
+ [ '\\[', 'ഡ' ],
+ [ '\\}', 'ഞ' ],
+ [ '\\\\', 'ർ' ],
+ [ 'A', 'ഓ' ],
+ [ 'a', 'ോ' ],
+ [ 'S', 'ഏ' ],
+ [ 's', 'േ' ],
+ [ 'D', 'അ' ],
+ [ 'd', '്' ],
+ [ 'F', 'ഇ' ],
+ [ 'f', 'ി' ],
+ [ 'G', 'ഉ' ],
+ [ 'g', 'ു' ],
+ [ 'H', 'ഫ' ],
+ [ 'h', 'പ' ],
+ [ 'J', 'റ' ],
+ [ 'j', 'ര' ],
+ [ 'K', 'ഖ' ],
+ [ 'k', 'ക' ],
+ [ 'L', 'ഥ' ],
+ [ 'l', 'ത' ],
+ [ ':', 'ഛ' ],
+ [ ';', 'ച' ],
+ [ '"', 'ഠ' ],
+ [ '\\\'', 'ട' ],
+ [ '\\~', 'ഒ' ],
+ [ '\\`', 'ൊ' ],
+ [ 'Z', 'എ' ],
+ [ 'z', 'െ' ],
+ [ 'X', 'ൺ' ],
+ [ 'x', 'ം' ],
+ [ 'C', 'ണ' ],
+ [ 'c', 'മ' ],
+ [ 'V', 'ൻ' ],
+ [ 'v', 'ന' ],
+ [ 'B', 'ഴ' ],
+ [ 'b', 'വ' ],
+ [ 'N', 'ള' ],
+ [ 'n', 'ല' ],
+ [ 'M', 'ശ' ],
+ [ 'm', 'സ' ],
+ [ '\\<', 'ഷ' ],
+ [ ',', ',' ],
+ [ '\\>', 'ൽ' ],
+ [ '\\.', '.' ],
+ [ '/', 'യ' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '\\!', '൰' ],
+ [ '2', '\u200c' ],
+ [ '\\@', '൱' ],
+ [ '\\#', '൲' ],
+ [ '\\$', '൳' ],
+ [ '4', '₹' ],
+ [ '\\%', '൴' ],
+ [ '\\^', '൵' ],
+ [ '\\+', 'ൠ' ],
+ [ '\\=', 'ൄ' ],
+ [ 'q', 'ൌ' ],
+ [ 'R', 'ൡ' ],
+ [ 'r', 'ൣ' ],
+ [ 'F', 'ഌ' ],
+ [ 'f', 'ൢ' ],
+ [ 'j', 'ർ' ],
+ [ 'k', 'ൿ' ],
+ [ 'c', 'ൺ' ],
+ [ 'v', '൹' ],
+ [ 'N', 'ൾ' ],
+ [ 'n', 'ൽ' ],
+ [ '\\>', 'ഽ' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+
+ $.ime.register( mlInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-transliteration.js
new file mode 100644
index 00000000..ee0f803f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ml/ml-transliteration.js
@@ -0,0 +1,338 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mltransliteration = {
+ id: 'ml-transliteration',
+ name: 'ലിപ്യന്തരണം',
+ description: 'Malayalam Transliteration based input method',
+ date: '2012-10-03',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 2,
+ maxKeyLength: 4,
+ patterns: [
+ [ '(\u200c)+a', 'അ' ],
+ [ '(\u200c)+A', 'ആ' ],
+ [ '(\u200c)+i', 'ഇ' ],
+ [ '(\u200c)+u', 'ഉ' ],
+ [ '(\u200c)+U', 'ഊ' ],
+ [ '(\u200c)+R', 'ഋ' ],
+ [ '(\u200c)+e', 'എ' ],
+ [ '(\u200c)+E', 'ഏ' ],
+ [ '(\u200c)+I', 'ഐ' ],
+ [ '(\u200c)+o', 'ഒ' ],
+ [ '(\u200c)+O', 'ഓ' ],
+ [ '(\u200c)+H', 'ഃ' ],
+ [ 'ൻൿh', 'nc', 'ഞ്ച്' ],
+ [ 'ൿh', 'c', 'ച്' ],
+ [ 'ക്ക്h', 'cc', 'ച്ച്' ],
+ [ 'ല്പ്p', 'lp', 'ൽപ്പ്' ],
+
+ [ '\\\\([A-Za-z\\>_~])', '\\\\', '$1' ],
+
+ [ '([ക-ഹ])്R', '$1ൃ' ],
+ [ 'ന്ന്j', 'ഞ്ഞ്' ],
+ [ 'ന്ന്g', 'ങ്ങ്' ],
+ [ 'റ്റ്h', 'ത്' ],
+ [ 'റ്റ്t', 'ട്ട്' ],
+ [ 'ന്റ്h', 'ന്ത്' ],
+ [ '([ക-ഹ])്ല്l', 'L', '$1\u0d62' ],
+ [ '([ക-ഹ])\u0d62l', '$1\u0d63' ],
+ [ '([അ-ഊഌഎ-ഐഒ-ഹ])([ഽ-ൂെ-ൌൗ])+R', '$1$2റ്' ],
+ [ '([ക-ഹ])ൃa', '$1്ര' ],
+ [ '([ക-ഹ])ൃA', '$1്രാ' ],
+ [ '([ക-ഹ])ൃi', '$1്രി' ],
+ [ '([ക-ഹ])ൃI', '$1്രീ' ],
+ [ '([ക-ഹ])ൃu', '$1്രു' ],
+ [ '([ക-ഹ])ൃU', '$1്രൂ' ],
+ [ '([ക-ഹ])ൃe', '$1്രെ' ],
+ [ '([ക-ഹ])ൃE', '$1്രേ' ],
+ [ '([ക-ഹ])ൃo', '$1്രൊ' ],
+ [ '([ക-ഹ])ൃO', '$1്രോ' ],
+ [ '([ക-ഹ])്(l|L)', '$1്ല്' ],
+ [ 'അa', 'ആ' ],
+ [ 'അi', 'ഐ' ],
+ [ 'അu', 'ഔ' ],
+ [ 'ഇi', 'ഈ' ],
+ [ 'ഉu', 'ഊ' ],
+ [ 'ഊo', 'ഊഊ' ],
+ [ 'ഋR', 'ൠ' ],
+ [ 'ഋa', 'റ' ],
+ [ 'ഋA', 'റാ' ],
+ [ 'ഋi', 'റി' ],
+ [ 'ഋI', 'റീ' ],
+ [ 'ഋu', 'റു' ],
+ [ 'ഋU', 'റൂ' ],
+ [ 'ഋe', 'റെ' ],
+ [ 'ഋE', 'റേ' ],
+ [ 'ഋo', 'റൊ' ],
+ [ 'ഋO', 'റോ' ],
+ [ 'ഋ~', 'റ്' ],
+ [ 'ഌl', 'ൡ' ],
+ [ 'എe', 'ഈ' ],
+ [ 'ഒo', 'ഊ' ],
+ [ 'ാa', 'ാാ' ],
+ [ 'ീi', 'ീീ' ],
+ [ 'ൂu', 'ൂൂ' ],
+ [ 'ൂo', 'ൂൂ' ],
+ [ 'ൄR', 'ൄൄ' ],
+ [ 'േE', 'േേ' ],
+ [ 'ോO', 'ോോ' ],
+ [ 'ൗu', 'ൗൗ' ],
+ [ '\u0d62\\^', '\u0d63' ],
+ [ '\u0d63\\^', '\u0d63\u0d63' ],
+ [ 'ക്h', 'ഖ്' ],
+ [ 'ഗ്h', 'ഘ്' ],
+ [ 'ൻg', 'ങ്' ],
+ [ 'ച്h', 'ഛ്' ],
+ [ 'ജ്h', 'ഝ്' ],
+ [ 'ട്h', 'ഠ്' ],
+ [ 'ഡ്h', 'ഢ്' ],
+ [ 'ത്h', 'ഥ്' ],
+ [ 'ദ്h', 'ധ്' ],
+ [ 'പ്h', 'ഫ്' ],
+ [ 'ബ്h', 'ഭ്' ],
+ [ 'ംa', 'മ' ],
+ [ 'ംA', 'മാ' ],
+ [ 'ംi', 'മി' ],
+ [ 'ംI', 'മീ' ],
+ [ 'ംu', 'മു' ],
+ [ 'ംU', 'മൂ' ],
+ [ 'ംR', 'മൃ' ],
+ [ 'ംe', 'മെ' ],
+ [ 'ംE', 'മേ' ],
+ [ 'ംo', 'മൊ' ],
+ [ 'ംO', 'മോ' ],
+ [ 'ംm', 'മ്മ്' ],
+ [ '([^സ])ംr', '$1മ്ര്' ],
+ [ 'ംp', 'മ്പ്' ],
+ [ '([^സ])ം(l|L)', '$1മ്ല്' ],
+ [ 'ം~', 'മ്' ],
+ [ '([^സ])ംn', '$1മ്ന്' ],
+ [ '([^സ])ംy', '$1മ്യ്' ],
+ [ 'സ്h', 'ഷ്' ],
+ [ 'ശ്h', 'ഴ്' ],
+ [ 'ൺ\\\\\\\\', 'ണ്\u200d' ], // old style chillu N
+ [ 'ൺ~', 'ണ്' ],
+ [ 'ൺR', 'ണൃ' ],
+ [ 'ൺN', 'ണ്ണ്' ],
+ [ 'ൺT', 'ണ്ട്' ],
+ [ 'ൺD', 'ണ്ഡ്' ],
+ [ 'ൺy', 'ണ്യ്' ],
+ [ 'ൺv', 'ണ്വ്' ],
+ [ 'ൺm', 'ണ്മ്' ],
+ [ 'ൻ\\\\\\\\', 'ന്\u200d' ], // old style chillu n
+ [ 'ൻ~', 'ന്' ],
+ [ 'ൻr', 'ന്ര്' ],
+ [ 'ൻR', 'നൃ' ],
+ [ 'ൻk', 'ങ്ക്' ],
+ [ 'ൻj', 'ഞ്' ],
+ [ 'ൻn', 'ന്ന്' ],
+ [ 'ൻd', 'ന്ദ്' ],
+ [ 'ൻt', 'ന്റ്' ],
+ [ 'ൻm', 'ന്മ്' ],
+ [ 'ൻL', 'ന്ല്' ],
+ [ 'ൻv', 'ന്വ്' ],
+ [ 'ൻy', 'ന്യ്' ],
+ [ 'ർ\\\\\\\\', 'ര്\u200d' ], // old style chill r
+ [ 'ർ~', 'ര്' ],
+ [ 'ർ#', 'ൎ' ], // dot repha
+ [ 'ർr', 'റ്' ],
+ [ 'ർR', 'രൃ' ],
+ [ 'ർy', 'ര്യ്' ],
+ [ 'ൽ\\\\\\\\', 'ല്\u200d' ], // old style chillu l
+ [ 'ൽ~', 'ല്' ],
+ [ 'ൽR', 'ലൃ' ],
+ [ 'ൽ(l|L)', 'ല്ല്' ],
+ [ 'ൽp', 'ല്പ്' ],
+ [ 'ൽy', 'ല്യ്' ],
+ [ 'ൽv', 'ല്വ്' ],
+ [ 'ൾ\\\\\\\\', 'ള്\u200d' ], // old style chillu L
+ [ 'ൾ~', 'ള്' ],
+ [ 'ൾR', 'ളൃ' ],
+ [ 'ൾL', 'ള്ള്' ],
+ [ 'ൾy', 'ള്യ്' ],
+ [ 'ൾl', 'ഌ' ],
+ [ 'ൿ\\\\\\\\', 'ക്\u200d' ], // old style chillu k
+ [ 'ൿR', 'കൃ' ],
+ [ 'ൿy', 'ക്യ്' ],
+ [ 'ൿ(l|L)', 'ക്ല്' ],
+ [ 'ൿv', 'ക്വ്' ],
+ [ 'ൿ(k|c)', 'ക്ക്' ],
+ [ '([ക-ഹ])a', '$1ാ' ],
+ [ '([ക-ഹ])്a', '$1' ],
+ [ 'ൺa', 'ണ' ],
+ [ 'ൻa', 'ന' ],
+ [ 'ർa', 'ര' ],
+ [ 'ൽa', 'ല' ],
+ [ 'ൾa', 'ള' ],
+ [ 'ൿa', 'ക' ],
+ [ '([ക-ഹ])്A', '$1ാ' ],
+ [ 'ൺA', 'ണാ' ],
+ [ 'ൻA', 'നാ' ],
+ [ 'ർA', 'രാ' ],
+ [ 'ൽA', 'ലാ' ],
+ [ 'ൾA', 'ളാ' ],
+ [ 'ൿA', 'കാ' ],
+ [ '([ക-ഹ])്i', '$1ി' ],
+ [ 'ൺi', 'ണി' ],
+ [ 'ൻi', 'നി' ],
+ [ 'ർi', 'രി' ],
+ [ 'ൽi', 'ലി' ],
+ [ 'ൾi', 'ളി' ],
+ [ 'ൿi', 'കി' ],
+ [ '([ക-ഹ])്I', '$1ീ' ],
+ [ 'ൺI', 'ണീ' ],
+ [ 'ൻI', 'നീ' ],
+ [ 'ർI', 'രീ' ],
+ [ 'ൽI', 'ലീ' ],
+ [ 'ൾI', 'ളീ' ],
+ [ 'ൿI', 'കീ' ],
+ [ '([ക-ഹ])ിi', '$1ീ' ],
+ [ '([ക-ഹ])െe', '$1ീ' ],
+ [ '([ക-ഹ])്u', '$1ു' ],
+ [ 'ൺu', 'ണു' ],
+ [ 'ൻu', 'നു' ],
+ [ 'ർu', 'രു' ],
+ [ 'ൽu', 'ലു' ],
+ [ 'ൾu', 'ളു' ],
+ [ 'ൿu', 'കു' ],
+ [ '([ക-ഹ])്U', '$1ൂ' ],
+ [ '([ക-ഹ])ുu', '$1ൂ' ],
+ [ 'ൺU', 'ണൂ' ],
+ [ 'ൻU', 'നൂ' ],
+ [ 'ർU', 'രൂ' ],
+ [ 'ൽU', 'ലൂ' ],
+ [ 'ൾU', 'ളൂ' ],
+ [ 'ൿU', 'കൂ' ],
+ [ '([ക-ഹ])ൊo', '$1ൂ' ],
+ [ '([ക-ഹ])ൃR', '$1ൄ' ],
+ [ '([ക-ഹ])്e', '$1െ' ],
+ [ 'ൺe', 'ണെ' ],
+ [ 'ൻe', 'നെ' ],
+ [ 'ർe', 'രെ' ],
+ [ 'ൽe', 'ലെ' ],
+ [ 'ൾe', 'ളെ' ],
+ [ 'ൿe', 'കെ' ],
+ [ '([ക-ഹ])്E', '$1േ' ],
+ [ 'ൺE', 'ണേ' ],
+ [ 'ൻE', 'നേ' ],
+ [ 'ർE', 'രേ' ],
+ [ 'ൽE', 'ലേ' ],
+ [ 'ൾE', 'ളേ' ],
+ [ 'ൿE', 'കേ' ],
+ [ '([ക-ഹ])i', '$1ൈ' ],
+ [ '([ക-ഹ])്o', '$1ൊ' ],
+ [ 'ൺo', 'ണൊ' ],
+ [ 'ൻo', 'നൊ' ],
+ [ 'ർo', 'രൊ' ],
+ [ 'ൽo', 'ലൊ' ],
+ [ 'ൾo', 'ളൊ' ],
+ [ 'ൿo', 'കൊ' ],
+ [ '([ക-ഹ])്O', '$1ോ' ],
+ [ 'ൺO', 'ണോ' ],
+ [ 'ൻO', 'നോ' ],
+ [ 'ർO', 'രോ' ],
+ [ 'ൽO', 'ലോ' ],
+ [ 'ൾO', 'ളോ' ],
+ [ 'ൿO', 'കോ' ],
+ [ '([ക-ഹ])u', '$1ൗ' ],
+ [ '([ക-ഹ])U', '$1ൌ' ],
+ [ '([അ-്])m', '$1ം' ],
+ [ '\\\\0', '൦' ], // escape to ml digit 0 by \0
+ [ '\\\\1', '൧' ], // escape to ml digit 1 by \1
+ [ '\\\\2', '൨' ], // escape to ml digit 2 by \2
+ [ '\\\\3', '൩' ], // escape to ml digit 3 by \3
+ [ '\\\\4', '൪' ], // escape to ml digit 4 by \4
+ [ '\\\\5', '൫' ], // escape to ml digit 5 by \5
+ [ '\\\\6', '൬' ], // escape to ml digit 6 by \6
+ [ '\\\\7', '൭' ], // escape to ml digit 7 by \7
+ [ '\\\\8', '൮' ], // escape to ml digit 8 by \8
+ [ '\\\\9', '൯' ], // escape to ml digit 9 by \9
+ [ 'മ്\\\\', 'ം' ],
+ [ 'ആ\\\\', 'ാ' ],
+ [ 'ഇ\\\\', 'ി' ],
+ [ 'ഈ\\\\', 'ീ' ],
+ [ 'ഉ\\\\', 'ു' ],
+ [ 'ഊ\\\\', 'ൂ' ],
+ [ 'ഋ\\\\', 'ൃ' ],
+ [ 'ൠ\\\\', 'ൄ' ],
+ [ 'എ\\\\', 'െ' ],
+ [ 'ഏ\\\\', 'േ' ],
+ [ 'ഐ\\\\', 'ൈ' ],
+ [ 'ഒ\\\\', 'ൊ' ],
+ [ 'ഓ\\\\', 'ോ' ],
+ [ 'ഔ\\\\', 'ൗ' ],
+ [ 'ൗ\\\\', 'ൌ' ],
+ [ 'ഌ\\\\', 'ൢ' ],
+ [ 'ൡ\\\\', 'ൣ' ],
+ [ '(([ൺ-ൿം])\u200c+)?A', '$2ആ' ],
+ [ '(([ൺ-ൿം])\u200c+)?B', '$2ബ്ബ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?C', '$2ച്ച്' ],
+ [ '(([ൺ-ൿം])\u200c+)?D', '$2ഡ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?E', '$2ഏ' ],
+ [ '(([ൺ-ൿം])\u200c+)?F', '$2ഫ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?G', '$2ഗ്ഗ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?H', '$2ഃ' ],
+ [ '(([ൺ-ൿം])\u200c+)?I', '$2ഐ' ],
+ [ '(([ൺ-ൿം])\u200c+)?J', '$2ജ്ജ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?K', '$2ക്ക്' ],
+ [ '(([ൺ-ൿം])\u200c+)?L', '$2ൾ' ],
+ [ '(([ൺ-ൿം])\u200c+)?M', '$2മ്മ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?N', '$2ൺ' ],
+ [ '(([ൺ-ൿം])\u200c+)?O', '$2ഓ' ],
+ [ '(([ൺ-ൿം])\u200c+)?P', '$2പ്പ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?Q', '$2ക്യ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?R', '$2ഋ' ],
+ [ '(([ൺ-ൿം])\u200c+)?(S|z)', '$2ശ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?T', '$2ട്' ],
+ [ '(([ൺ-ൿം])\u200c+)?U', '$2ഊ' ],
+ [ '(([ൺ-ൿം])\u200c+)?(V|W)', '$2വ്വ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?X', '$2ക്ഷ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?Y', '$2യ്യ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?Z', '$2ശ്ശ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?a', '$2അ' ],
+ [ '(([ൺ-ൿം])\u200c+)?b', '$2ബ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?c', '$2ൿ' ],
+ [ '(([ൺ-ൿം])\u200c+)?d', '$2ദ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?e', '$2എ' ],
+ [ '(([ൺ-ൿം])\u200c+)?f', '$2ഫ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?g', '$2ഗ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?h', '$2ഹ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?i', '$2ഇ' ],
+ [ '(([ൺ-ൿം])\u200c+)?j', '$2ജ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?k', '$2ക്' ],
+ [ '(([ൺ-ൿം])\u200c+)?l', '$2ൽ' ],
+ [ '(([ൺ-ൿം])\u200c+)?m', '$2മ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?n', '$2ൻ' ],
+ [ '(([ൺ-ൿം])\u200c+)?o', '$2ഒ' ],
+ [ '(([ൺ-ൿം])\u200c+)?p', '$2പ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?q', '$2ക്ക്' ],
+ [ '(([ൺ-ൿം])\u200c+)?r', '$2ർ' ],
+ [ '(([ൺ-ൿം])\u200c+)?s', '$2സ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?t', '$2റ്റ്' ], // tta according to 5.1
+ [ '(([ൺ-ൿം])\u200c+)?u', '$2ഉ' ],
+ [ '(([ൺ-ൿം])\u200c+)?(v|w)', '$2വ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?x', '$2ക്ഷ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?y', '$2യ്' ],
+ [ '(([ൺ-ൿം])\u200c+)?~', '$2്' ],
+ [ '(\u200C)*_', '\u200c' ],
+ [ '//', 'ഽ' ],
+ [ '1/4\\\\', '൳' ],
+ [ '1/2\\\\', '൴' ],
+ [ '3/4\\\\', '൵' ],
+ [ '10\\\\', '\u0D70' ],
+ [ '100\\\\', '\u0D71' ],
+ [ '1000\\\\', '\u0D72' ],
+ [ '\\-\\-\\-\\\\', '—' ], // em dash
+ [ '\\-\\-\\\\', '–' ], // en dash
+ [ '\\\\\\-', '−' ],
+ [ '\\\\\\*', '×' ],
+ [ '\\\\/', '÷' ] ]
+
+ };
+
+ $.ime.register( mltransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-cyrl.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-cyrl.js
new file mode 100644
index 00000000..f3f750d7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-cyrl.js
@@ -0,0 +1,118 @@
+/**
+ * This is my work based on Git for the very first time, which is an input method for the Mongolian
+ * Cyrillic script. If the program has any errors, please understand that and contact me. I will
+ * change the errors in a few days.
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ var mncyrl = {
+ id: 'mn-cyrl',
+ name: 'Mongolian Cyrillic',
+ description: 'Mongolian Cyrillic Input Method',
+ date: '2012-10-25',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Kevin K.S. Leung, <sprconan@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', 'Ф' ],
+ [ 'W', 'Ц' ],
+ [ 'E', 'У' ],
+ [ 'R', 'Ж' ],
+ [ 'T', 'Э' ],
+ [ 'Y', 'Н' ],
+ [ 'U', 'Г' ],
+ [ 'I', 'Ш' ],
+ [ 'O', 'Ү' ],
+ [ 'P', 'З' ],
+ [ '{', 'К' ],
+ [ '}', 'Ъ' ],
+ [ 'A', 'Й' ],
+ [ 'S', 'Ы' ],
+ [ 'D', 'Б' ],
+ [ 'F', 'Ө' ],
+ [ 'G', 'А' ],
+ [ 'H', 'Х' ],
+ [ 'J', 'Р' ],
+ [ 'K', 'О' ],
+ [ 'L', 'Л' ],
+ [ ':', 'Д' ],
+ [ '"', 'П' ],
+ [ 'Z', 'Я' ],
+ [ 'X', 'Ч' ],
+ [ 'C', 'Ё' ],
+ [ 'V', 'С' ],
+ [ 'B', 'М' ],
+ [ 'N', 'И' ],
+ [ 'M', 'Т' ],
+ [ '<', 'Ь' ],
+ [ '>', 'В' ],
+ [ '\\?', 'Ю' ],
+ [ '_', 'Е' ],
+ [ '\\+', 'Щ' ],
+
+ [ 'q', 'ф' ],
+ [ 'w', 'ц' ],
+ [ 'e', 'у' ],
+ [ 'r', 'ж' ],
+ [ 't', 'э' ],
+ [ 'y', 'н' ],
+ [ 'u', 'г' ],
+ [ 'i', 'ш' ],
+ [ 'o', 'ү' ],
+ [ 'p', 'з' ],
+ [ '\\[', 'к' ],
+ [ '\\]', 'ъ' ],
+ [ 'a', 'й' ],
+ [ 's', 'ы' ],
+ [ 'd', 'б' ],
+ [ 'f', 'ө' ],
+ [ 'g', 'а' ],
+ [ 'h', 'х' ],
+ [ 'j', 'р' ],
+ [ 'k', 'о' ],
+ [ 'l', 'л' ],
+ [ ';', 'д' ],
+ [ '\'', 'п' ],
+ [ 'z', 'я' ],
+ [ 'x', 'ч' ],
+ [ 'c', 'ё' ],
+ [ 'v', 'с' ],
+ [ 'b', 'м' ],
+ [ 'n', 'и' ],
+ [ 'm', 'т' ],
+ [ ',', 'ь' ],
+ [ '\\.', 'в' ],
+ [ '/', 'ю' ],
+ [ '\\-', 'е' ],
+ [ '=', 'щ' ],
+
+ [ '`', '=' ],
+ [ '~', '+' ],
+ [ '1', '№' ],
+ [ '2', '-' ],
+ [ '3', '"' ],
+ [ '4', '₮' ],
+ [ '5', ':' ],
+ [ '6', '.' ],
+ [ '7', '_' ],
+ [ '8', ',' ],
+ [ '9', '%' ],
+ [ '0', '?' ],
+ [ '!', '1' ],
+ [ '@', '2' ],
+ [ '#', '3' ],
+ [ '\\$', '4' ],
+ [ '%', '5' ],
+ [ '^', '6' ],
+ [ '&', '7' ],
+ [ '*', '8' ],
+ [ '\\(', '9' ],
+ [ '\\)', '0' ]
+ ]
+ };
+
+ $.ime.register( mncyrl );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-todo.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-todo.js
new file mode 100644
index 00000000..e5529353
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-todo.js
@@ -0,0 +1,112 @@
+( function ( $ ) {
+ 'use strict';
+
+ var todoMongolian = {
+ id: 'mn-todo',
+ name: 'Mongolian Todo Scripts',
+ description: 'Mongolian Todo Scripts',
+ date: '2014-4-22',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Feilong Huang, <huangfeilong@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', '\u1800' ],
+ [ 'W', '\u1856' ],
+ [ 'E', '\u1843' ],
+ [ 'R', '' ],
+ [ 'T', '' ],
+ [ 'Y', '' ],
+ [ 'U', '' ],
+ [ 'I', '' ],
+ [ 'O', '' ],
+ [ 'P', '' ],
+ [ '{', '〈' ],
+ [ '}', '〉' ],
+ [ 'A', '\u1806' ],
+ [ 'S', '' ],
+ [ 'D', '᠅' ],
+ [ 'F', '' ],
+ [ 'G', '\u1858' ],
+ [ 'H', '\u1859' ],
+ [ 'J', '\u1834' ],
+ [ 'K', '' ],
+ [ 'L', '\u1840' ],
+ [ ':', '\u1804' ],
+ [ '"', '\u180c' ],
+ [ 'Z', '\u185a' ],
+ [ 'X', '' ],
+ [ 'C', '\u1854' ],
+ [ 'V', '' ],
+ [ 'B', '' ],
+ [ 'N', '\u184a' ],
+ [ 'M', '\u185b' ],
+ [ '<', '《' ],
+ [ '>', '》' ],
+ [ '\\?', '?' ],
+ [ '_', '\u180e' ],
+ [ '\\+', '+' ],
+
+ [ 'q', '\u184d' ],
+ [ 'w', '\u1846' ],
+ [ 'e', '\u1844' ],
+ [ 'r', '\u1837' ],
+ [ 't', '\u1850' ],
+ [ 'y', '\u1855' ],
+ [ 'u', '\u1849' ],
+ [ 'i', '\u1845' ],
+ [ 'o', '\u1848' ],
+ [ 'p', '\u184c' ],
+ [ '\\[', '〔' ],
+ [ '\\]', '〕' ],
+ [ 'a', '\u1820' ],
+ [ 's', '\u1830' ],
+ [ 'd', '\u1851' ],
+ [ 'f', '\u1838' ],
+ [ 'g', '\u184e' ],
+ [ 'h', '\u184d' ],
+ [ 'j', '\u1853' ],
+ [ 'k', '\u1857' ],
+ [ 'l', '\u182f' ],
+ [ ';', ';' ],
+ [ '\'', '\u180b' ],
+ [ 'z', '\u185c' ],
+ [ 'x', '\u1831' ],
+ [ 'c', '\u1852' ],
+ [ 'v', '\u1847' ],
+ [ 'b', '\u184b' ],
+ [ 'n', '\u1828' ],
+ [ 'm', '\u184f' ],
+ [ ',', '\u1802' ],
+ [ '\\.', '\u1803' ],
+ [ '/', '.' ],
+ [ '\\-', '\u202f' ],
+ [ '=', '=' ],
+
+ [ '`', '\u180d' ],
+ [ '~', '~' ],
+ [ '1', '1' ],
+ [ '2', '2' ],
+ [ '3', '3' ],
+ [ '4', '4' ],
+ [ '5', '5' ],
+ [ '6', '6' ],
+ [ '7', '7' ],
+ [ '8', '8' ],
+ [ '9', '9' ],
+ [ '0', '0' ],
+ [ '!', '!' ],
+ [ '@', '\u2048' ],
+ [ '#', '\u2049' ],
+ [ '\\$', '—' ],
+ [ '%', '%' ],
+ [ '\\^', '\u200c' ],
+ [ '&', '\u180a' ],
+ [ '\\*', '\u200d' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ]
+ ]
+ };
+
+ $.ime.register( todoMongolian );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-todoali.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-todoali.js
new file mode 100644
index 00000000..024ed506
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-todoali.js
@@ -0,0 +1,112 @@
+( function ( $ ) {
+ 'use strict';
+
+ var todoMongolianAli = {
+ id: 'mn-todoali',
+ name: 'Mongolian Todo Ali-gali Scripts',
+ description: 'Mongolian Todo Ali-gali Scripts',
+ date: '2014-4-22',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Feilong Huang, <huangfeilong@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', '' ],
+ [ 'W', '' ],
+ [ 'E', '' ],
+ [ 'R', '' ],
+ [ 'T', '' ],
+ [ 'Y', '' ],
+ [ 'U', '' ],
+ [ 'I', '' ],
+ [ 'O', '' ],
+ [ 'P', '' ],
+ [ '{', '〈' ],
+ [ '}', '〉' ],
+ [ 'A', '' ],
+ [ 'S', '' ],
+ [ 'D', '\u18a9' ],
+ [ 'F', '' ],
+ [ 'G', '' ],
+ [ 'H', '' ],
+ [ 'J', '' ],
+ [ 'K', '' ],
+ [ 'L', '' ],
+ [ ':', '\u1804' ],
+ [ '"', '\u180c' ],
+ [ 'Z', '' ],
+ [ 'X', '' ],
+ [ 'C', '' ],
+ [ 'V', '' ],
+ [ 'B', '' ],
+ [ 'N', '' ],
+ [ 'M', '' ],
+ [ '<', '《' ],
+ [ '>', '》' ],
+ [ '\\?', '?' ],
+ [ '_', '\u180e' ],
+ [ '\\+', '+' ],
+
+ [ 'q', '\u1880' ],
+ [ 'w', '\u1881' ],
+ [ 'e', '\u1882' ],
+ [ 'r', '\u1883' ],
+ [ 't', '\u1884' ],
+ [ 'y', '\u1885' ],
+ [ 'u', '\u1886' ],
+ [ 'i', '\u1887' ],
+ [ 'o', '\u1888' ],
+ [ 'p', '\u1889' ],
+ [ '\\[', '〔' ],
+ [ '\\]', '〕' ],
+ [ 'a', '\u188a' ],
+ [ 's', '\u188b' ],
+ [ 'd', '\u188c' ],
+ [ 'f', '\u188d' ],
+ [ 'g', '\u188e' ],
+ [ 'h', '\u188f' ],
+ [ 'j', '\u1898' ],
+ [ 'k', '\u1891' ],
+ [ 'l', '\u1892' ],
+ [ ';', '\u1893' ],
+ [ '\'', '\u180b' ],
+ [ 'z', '\u1894' ],
+ [ 'x', '\u1899' ],
+ [ 'c', '\u1896' ],
+ [ 'v', '\u1897' ],
+ [ 'b', '\u1898' ],
+ [ 'n', '\u18a6' ],
+ [ 'm', '\u18a7' ],
+ [ ',', '\u1802' ],
+ [ '\\.', '\u1803' ],
+ [ '/', '.' ],
+ [ '\\-', '\u202f' ],
+ [ '=', '=' ],
+
+ [ '`', '\u180d' ],
+ [ '~', '~' ],
+ [ '1', '\u1811' ],
+ [ '2', '\u1812' ],
+ [ '3', '\u1813' ],
+ [ '4', '\u1814' ],
+ [ '5', '\u1815' ],
+ [ '6', '\u1816' ],
+ [ '7', '\u1817' ],
+ [ '8', '\u1818' ],
+ [ '9', '\u1819' ],
+ [ '0', '\u1810' ],
+ [ '!', '!' ],
+ [ '@', '\u2048' ],
+ [ '#', '\u2049' ],
+ [ '\\$', '—' ],
+ [ '%', '%' ],
+ [ '\\^', '\u200c' ],
+ [ '&', '\u180a' ],
+ [ '\\*', '\u200d' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ]
+ ]
+ };
+
+ $.ime.register( todoMongolianAli );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-trad.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-trad.js
new file mode 100644
index 00000000..a4e21edf
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-trad.js
@@ -0,0 +1,112 @@
+( function ( $ ) {
+ 'use strict';
+
+ var tradMongolian = {
+ id: 'mn-trad',
+ name: 'Traditional Mongolian Scripts',
+ description: 'Traditional Mongolian Scripts',
+ date: '2014-4-22',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Feilong Huang, <huangfeilong@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', '\u1805' ],
+ [ 'W', '\u1838' ],
+ [ 'E', '\u1827' ],
+ [ 'R', '\u183f' ],
+ [ 'T', '' ],
+ [ 'Y', '' ],
+ [ 'U', '' ],
+ [ 'I', '' ],
+ [ 'O', '' ],
+ [ 'P', '' ],
+ [ '{', '〈' ],
+ [ '}', '〉' ],
+ [ 'A', '\u1800' ],
+ [ 'S', '' ],
+ [ 'D', '' ],
+ [ 'F', '' ],
+ [ 'G', '' ],
+ [ 'H', '\u183e' ],
+ [ 'J', '' ],
+ [ 'K', '\u183b' ],
+ [ 'L', '\u1840' ],
+ [ ':', '\u1804' ],
+ [ '"', '\u180c' ],
+ [ 'Z', '\u1841' ],
+ [ 'X', '' ],
+ [ 'C', '\u1842' ],
+ [ 'V', '' ],
+ [ 'B', '' ],
+ [ 'N', '\u1829' ],
+ [ 'M', '' ],
+ [ '<', '《' ],
+ [ '>', '》' ],
+ [ '\\?', '?' ],
+ [ '_', '\u180e' ],
+ [ '\\+', '+' ],
+ [ '\\\\', '\u1801' ],
+ [ 'q', '\u1834' ],
+ [ 'w', '\u1823' ],
+ [ 'e', '\u1821' ],
+ [ 'r', '\u1837' ],
+ [ 't', '\u1832' ],
+ [ 'y', '\u1836' ],
+ [ 'u', '\u1826' ],
+ [ 'i', '\u1822' ],
+ [ 'o', '\u1825' ],
+ [ 'p', '\u182b' ],
+ [ '\\[', '〔' ],
+ [ '\\]', '〕' ],
+ [ 'a', '\u1820' ],
+ [ 's', '\u1830' ],
+ [ 'd', '\u1833' ],
+ [ 'f', '\u1839' ],
+ [ 'g', '\u182d' ],
+ [ 'h', '\u182c' ],
+ [ 'j', '\u1835' ],
+ [ 'k', '\u183a' ],
+ [ 'l', '\u182f' ],
+ [ ';', ';' ],
+ [ '\'', '\u180b' ],
+ [ 'z', '\u183d' ],
+ [ 'x', '\u1831' ],
+ [ 'c', '\u183c' ],
+ [ 'v', '\u1824' ],
+ [ 'b', '\u182a' ],
+ [ 'n', '\u1828' ],
+ [ 'm', '\u182e' ],
+ [ ',', '\u1802' ],
+ [ '\\.', '\u1803' ],
+ [ '/', '.' ],
+ [ '\\-', '\u202f' ],
+ [ '=', '=' ],
+
+ [ '`', '\u180d' ],
+ [ '~', '~' ],
+ [ '1', '\u1811' ],
+ [ '2', '\u1812' ],
+ [ '3', '\u1813' ],
+ [ '4', '\u1814' ],
+ [ '5', '\u1815' ],
+ [ '6', '\u1816' ],
+ [ '7', '\u1817' ],
+ [ '8', '\u1818' ],
+ [ '9', '\u1819' ],
+ [ '0', '\u1810' ],
+ [ '!', '!' ],
+ [ '@', '\u2048' ],
+ [ '#', '\u2049' ],
+ [ '\\$', '—' ],
+ [ '%', '%' ],
+ [ '\\^', '\u200c' ],
+ [ '&', '\u180a' ],
+ [ '\\*', '\u200d' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ]
+ ]
+ };
+
+ $.ime.register( tradMongolian );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-tradali.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-tradali.js
new file mode 100644
index 00000000..77a8174d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/mn-tradali.js
@@ -0,0 +1,111 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mongolianAli = {
+ id: 'mn-tradali',
+ name: 'Traditional Mongolian Ali-gali Scripts',
+ description: 'Traditional Mongolian Ali-gali Scripts',
+ date: '2014-4-22',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Feilong Huang, <huangfeilong@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', '' ],
+ [ 'E', '' ],
+ [ 'R', '' ],
+ [ 'T', '' ],
+ [ 'Y', '' ],
+ [ 'U', '' ],
+ [ 'I', '' ],
+ [ 'O', '' ],
+ [ 'P', '' ],
+ [ '{', '〈' ],
+ [ '}', '〉' ],
+ [ 'A', '' ],
+ [ 'S', '' ],
+ [ 'D', '' ],
+ [ 'F', '' ],
+ [ 'G', '' ],
+ [ 'H', '' ],
+ [ 'J', '' ],
+ [ 'K', '' ],
+ [ 'L', '' ],
+ [ ':', '\u1804' ],
+ [ '"', '\u180c' ],
+ [ 'Z', '' ],
+ [ 'X', '' ],
+ [ 'C', '' ],
+ [ 'V', '' ],
+ [ 'B', '' ],
+ [ 'N', '' ],
+ [ 'M', '' ],
+ [ '<', '《' ],
+ [ '>', '》' ],
+ [ '\\?', '?' ],
+ [ '_', '\u180e' ],
+ [ '\\+', '+' ],
+
+ [ 'q', '\u1880' ],
+ [ 'w', '\u1881' ],
+ [ 'e', '\u1882' ],
+ [ 'r', '\u1883' ],
+ [ 't', '\u1884' ],
+ [ 'y', '\u1885' ],
+ [ 'u', '\u1886' ],
+ [ 'i', '\u1887' ],
+ [ 'o', '\u1888' ],
+ [ 'p', '\u1889' ],
+ [ '\\[', '〔' ],
+ [ '\\]', '〕' ],
+ [ 'a', '\u188a' ],
+ [ 's', '\u188b' ],
+ [ 'd', '\u188c' ],
+ [ 'f', '\u188d' ],
+ [ 'g', '\u188e' ],
+ [ 'h', '\u188f' ],
+ [ 'j', '\u1890' ],
+ [ 'k', '\u1891' ],
+ [ 'l', '\u1892' ],
+ [ ';', '\u1893' ],
+ [ '\'', '\u180b' ],
+ [ 'z', '\u1894' ],
+ [ 'x', '\u1895' ],
+ [ 'c', '\u1896' ],
+ [ 'v', '\u1897' ],
+ [ 'b', '\u18a6' ],
+ [ 'n', '\u18a7' ],
+ [ 'm', '\u18a9' ],
+ [ ',', '᠂' ],
+ [ '\\.', '᠃' ],
+ [ '/', '.' ],
+ [ '\\-', '\u202f' ],
+ [ '=', '=' ],
+
+ [ '`', '\u180d' ],
+ [ '~', '~' ],
+ [ '1', '\u1811' ],
+ [ '2', '\u1812' ],
+ [ '3', '\u1813' ],
+ [ '4', '\u1814' ],
+ [ '5', '\u1815' ],
+ [ '6', '\u1816' ],
+ [ '7', '\u1817' ],
+ [ '8', '\u1818' ],
+ [ '9', '\u1819' ],
+ [ '0', '\u1810' ],
+ [ '!', '!' ],
+ [ '@', '\u2048' ],
+ [ '#', '\u2049' ],
+ [ '\\$', '—' ],
+ [ '%', '%' ],
+ [ '\\^', '\u200c' ],
+ [ '&', '\u180a' ],
+ [ '\\*', '\u200d' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ]
+ ]
+ };
+
+ $.ime.register( mongolianAli );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mn/phagspa.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/phagspa.js
new file mode 100644
index 00000000..14f5d076
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mn/phagspa.js
@@ -0,0 +1,112 @@
+( function ( $ ) {
+ 'use strict';
+
+ var phagsPa = {
+ id: 'phagspa',
+ name: 'PhagsPa Scripts',
+ description: 'PhagsPa Scripts',
+ date: '2014-4-22',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Feilong Huang, <huangfeilong@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', '\ua869' ],
+ [ 'W', '\ua867' ],
+ [ 'E', '\ua866' ],
+ [ 'R', '\ua871' ],
+ [ 'T', '\ua849' ],
+ [ 'Y', '\ua868' ],
+ [ 'U', '\ua86b' ],
+ [ 'I', '\ua86d' ],
+ [ 'O', '' ],
+ [ 'P', '\ua84d' ],
+ [ '{', '〈' ],
+ [ '}', '〉' ],
+ [ 'A', '\ua85d' ],
+ [ 'S', '\ua85a' ],
+ [ 'D', '\ua852' ],
+ [ 'F', '\ua870' ],
+ [ 'G', '\ua865' ],
+ [ 'H', '\ua86f' ],
+ [ 'J', '\ua86e' ],
+ [ 'K', '\ua841' ],
+ [ 'L', '\ua86c' ],
+ [ ':', '\u1804' ],
+ [ '"', '' ],
+ [ 'Z', '\ua854' ],
+ [ 'X', '\ua86a' ],
+ [ 'C', '\ua845' ],
+ [ 'V', '\ua872' ],
+ [ 'B', '\ua873' ],
+ [ 'N', '\ua843' ],
+ [ 'M', '' ],
+ [ '<', '《' ],
+ [ '>', '》' ],
+ [ '\\?', '?' ],
+ [ '_', '\ua874' ],
+ [ '\\+', '+' ],
+
+ [ 'q', '\ua862' ],
+ [ 'w', '\ua853' ],
+ [ 'e', '\ua860' ],
+ [ 'r', '\ua858' ],
+ [ 't', '\ua848' ],
+ [ 'y', '\ua857' ],
+ [ 'u', '\ua85f' ],
+ [ 'i', '\ua85e' ],
+ [ 'o', '\ua861' ],
+ [ 'p', '\ua84c' ],
+ [ '\\[', '〔' ],
+ [ '\\]', '〕' ],
+ [ 'a', '\ua856' ],
+ [ 's', '\ua85b' ],
+ [ 'd', '\ua84a' ],
+ [ 'f', '\ua864' ],
+ [ 'g', '\ua842' ],
+ [ 'h', '\ua85c' ],
+ [ 'j', '\ua846' ],
+ [ 'k', '\ua840' ],
+ [ 'l', '\ua859' ],
+ [ ';', ';' ],
+ [ '\'', '\ua877' ],
+ [ 'z', '\ua855' ],
+ [ 'x', '\ua863' ],
+ [ 'c', '\ua844' ],
+ [ 'v', '' ],
+ [ 'b', '\ua84e' ],
+ [ 'n', '\ua84b' ],
+ [ 'm', '\ua84f' ],
+ [ ',', '' ],
+ [ '\\.', '' ],
+ [ '/', '\ua876' ],
+ [ '\\-', '\ua875' ],
+ [ '=', '=' ],
+
+ [ '`', '\u180d' ],
+ [ '~', '~' ],
+ [ '1', '\u1811' ],
+ [ '2', '\u1812' ],
+ [ '3', '\u1813' ],
+ [ '4', '\u1814' ],
+ [ '5', '\u1815' ],
+ [ '6', '\u1816' ],
+ [ '7', '\u1817' ],
+ [ '8', '\u1818' ],
+ [ '9', '\u1819' ],
+ [ '0', '\u1810' ],
+ [ '!', '!' ],
+ [ '@', '\ua847' ],
+ [ '#', '\ua850' ],
+ [ '\\$', '\ua851' ],
+ [ '%', '\ua85a' ],
+ [ '\\^', '' ],
+ [ '&', '' ],
+ [ '\\*', '' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ]
+ ]
+ };
+
+ $.ime.register( phagsPa );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mnc/mnc-ali.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mnc/mnc-ali.js
new file mode 100644
index 00000000..635a89f2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mnc/mnc-ali.js
@@ -0,0 +1,112 @@
+( function ( $ ) {
+ 'use strict';
+
+ var manchuAli = {
+ id: 'mnc-ali',
+ name: 'Manchu Ali-gali Scripts',
+ description: 'Manchu Ali-gali Scripts',
+ date: '2014-4-22',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Feilong Huang, <huangfeilong@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', '\u189a' ],
+ [ 'W', '\u189b' ],
+ [ 'E', '\u189c' ],
+ [ 'R', '\u189d' ],
+ [ 'T', '\u189e' ],
+ [ 'Y', '\u189f' ],
+ [ 'U', '\u18a0' ],
+ [ 'I', '\u18a1' ],
+ [ 'O', '\u18a2' ],
+ [ 'P', '\u18a3' ],
+ [ '{', '〈' ],
+ [ '}', '〉' ],
+ [ 'A', '\u18a4' ],
+ [ 'S', '\u18a5' ],
+ [ 'D', '\u18a9' ],
+ [ 'F', '\u18a8' ],
+ [ 'G', '\u18aa' ],
+ [ 'H', '' ],
+ [ 'J', '' ],
+ [ 'K', '' ],
+ [ 'L', '' ],
+ [ ':', '\u1804' ],
+ [ '"', '\u180c' ],
+ [ 'Z', '' ],
+ [ 'X', '' ],
+ [ 'C', '' ],
+ [ 'V', '' ],
+ [ 'B', '' ],
+ [ 'N', '' ],
+ [ 'M', '' ],
+ [ '<', '《' ],
+ [ '>', '》' ],
+ [ '\\?', '?' ],
+ [ '_', '\u180e' ],
+ [ '\\+', '+' ],
+
+ [ 'q', '\u1880' ],
+ [ 'w', '\u1881' ],
+ [ 'e', '\u1882' ],
+ [ 'r', '\u1883' ],
+ [ 't', '\u1884' ],
+ [ 'y', '\u1885' ],
+ [ 'u', '\u1886' ],
+ [ 'i', '\u1887' ],
+ [ 'o', '\u1888' ],
+ [ 'p', '\u1889' ],
+ [ '\\[', '〔' ],
+ [ '\\]', '〕' ],
+ [ 'a', '\u188a' ],
+ [ 's', '\u188b' ],
+ [ 'd', '\u188c' ],
+ [ 'f', '\u188d' ],
+ [ 'g', '\u188e' ],
+ [ 'h', '\u188f' ],
+ [ 'j', '\u1898' ],
+ [ 'k', '\u1891' ],
+ [ 'l', '\u1892' ],
+ [ ';', '\u1893' ],
+ [ '\'', '\u180b' ],
+ [ 'z', '\u1894' ],
+ [ 'x', '\u1899' ],
+ [ 'c', '\u1896' ],
+ [ 'v', '\u1897' ],
+ [ 'b', '\u1898' ],
+ [ 'n', '\u18a6' ],
+ [ 'm', '\u18a7' ],
+ [ ',', '\u1808' ],
+ [ '\\.', '\u1809' ],
+ [ '/', '.' ],
+ [ '\\-', '\u202f' ],
+ [ '=', '=' ],
+
+ [ '`', '\u180d' ],
+ [ '~', '~' ],
+ [ '1', '\u1811' ],
+ [ '2', '\u1812' ],
+ [ '3', '\u1813' ],
+ [ '4', '\u1814' ],
+ [ '5', '\u1815' ],
+ [ '6', '\u1816' ],
+ [ '7', '\u1817' ],
+ [ '8', '\u1818' ],
+ [ '9', '\u1819' ],
+ [ '0', '\u1810' ],
+ [ '!', '!' ],
+ [ '@', '\u2048' ],
+ [ '#', '\u2049' ],
+ [ '\\$', '—' ],
+ [ '%', '%' ],
+ [ '\\^', '\u200c' ],
+ [ '&', '\u180a' ],
+ [ '\\*', '\u200d' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ]
+ ]
+ };
+
+ $.ime.register( manchuAli );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mnc/mnc.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mnc/mnc.js
new file mode 100644
index 00000000..8f2e52ee
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mnc/mnc.js
@@ -0,0 +1,112 @@
+( function ( $ ) {
+ 'use strict';
+
+ var manchu = {
+ id: 'mnc',
+ name: 'Manchu Scripts',
+ description: 'Manchu Scripts',
+ date: '2014-4-22',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Feilong Huang, <huangfeilong@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', '' ],
+ [ 'W', '\u1838' ],
+ [ 'E', '\u1827' ],
+ [ 'R', '\u1870' ],
+ [ 'T', '' ],
+ [ 'Y', '' ],
+ [ 'U', '' ],
+ [ 'I', '\u185f' ],
+ [ 'O', '' ],
+ [ 'P', '' ],
+ [ '{', '〈' ],
+ [ '}', '〉' ],
+ [ 'A', '' ],
+ [ 'S', '' ],
+ [ 'D', '' ],
+ [ 'F', '' ],
+ [ 'G', '\u186c' ],
+ [ 'H', '\u186d' ],
+ [ 'J', '' ],
+ [ 'K', '\u183b' ],
+ [ 'L', '\u1840' ],
+ [ ':', '\u1804' ],
+ [ '"', '\u180c' ],
+ [ 'Z', '\u1877' ],
+ [ 'X', '\u1871' ],
+ [ 'C', '\u1842' ],
+ [ 'V', '' ],
+ [ 'B', '' ],
+ [ 'N', '\u1862' ],
+ [ 'M', '' ],
+ [ '<', '《' ],
+ [ '>', '》' ],
+ [ '\\?', '?' ],
+ [ '_', '\u180e' ],
+ [ '\\+', '+' ],
+
+ [ 'q', '\u1834' ],
+ [ 'w', '\u1823' ],
+ [ 'e', '\u185d' ],
+ [ 'r', '\u1875' ],
+ [ 't', '\u1868' ],
+ [ 'y', '\u1836' ],
+ [ 'u', '\u1860' ],
+ [ 'i', '\u1873' ],
+ [ 'o', '\u1825' ],
+ [ 'p', '\u1866' ],
+ [ '\\[', '〔' ],
+ [ '\\]', '〕' ],
+ [ 'a', '\u1820' ],
+ [ 's', '\u1830' ],
+ [ 'd', '\u1869' ],
+ [ 'f', '\u1876' ],
+ [ 'g', '\u1864' ],
+ [ 'h', '\u1865' ],
+ [ 'j', '\u186a' ],
+ [ 'k', '\u1874' ],
+ [ 'l', '\u182f' ],
+ [ ';', ';' ],
+ [ '\'', '\u180b' ],
+ [ 'z', '\u186f' ],
+ [ 'x', '\u1867' ],
+ [ 'c', '\u186e' ],
+ [ 'v', '\u1861' ],
+ [ 'b', '\u182a' ],
+ [ 'n', '\u1828' ],
+ [ 'm', '\u182e' ],
+ [ ',', '\u1808' ],
+ [ '\\.', '\u1809' ],
+ [ '/', '.' ],
+ [ '\\-', '\u202f' ],
+ [ '=', '=' ],
+
+ [ '`', '\u180d' ],
+ [ '~', '~' ],
+ [ '1', '1' ],
+ [ '2', '2' ],
+ [ '3', '3' ],
+ [ '4', '4' ],
+ [ '5', '5' ],
+ [ '6', '6' ],
+ [ '7', '7' ],
+ [ '8', '8' ],
+ [ '9', '9' ],
+ [ '0', '0' ],
+ [ '!', '!' ],
+ [ '@', '\u2048' ],
+ [ '#', '\u2049' ],
+ [ '\\$', '—' ],
+ [ '%', '%' ],
+ [ '\\^', '\u200c' ],
+ [ '&', '\u180a' ],
+ [ '\\*', '\u200d' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ]
+ ]
+ };
+
+ $.ime.register( manchu );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mni/mni-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mni/mni-inscript2.js
new file mode 100644
index 00000000..5dde4168
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mni/mni-inscript2.js
@@ -0,0 +1,125 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mniInScript2 = {
+ id: 'mni-inscript2',
+ name: 'ইনস্ক্ৰিপ্ট ২',
+ description: 'Enhanced InScript keyboard for Manipuri language using Bengali script',
+ date: '2013-02-13',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\!', 'অ্যা' ],
+ [ '1', '১' ],
+ [ '2', '২' ],
+ [ '\\#', '্র' ],
+ [ '3', '৩' ],
+ [ '\\$', 'র্' ],
+ [ '4', '৪' ],
+ [ '\\%', 'জ্ঞ' ],
+ [ '5', '৫' ],
+ [ '\\^', 'ত্র' ],
+ [ '6', '৬' ],
+ [ '\\&', 'ক্ষ' ],
+ [ '7', '৭' ],
+ [ '\\*', 'শ্র' ],
+ [ '8', '৮' ],
+ [ '9', '৯' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '0', '০' ],
+ [ '"', 'ঠ' ],
+ [ '\'', 'ট' ],
+ [ ',', ',' ],
+ [ '-', '-' ],
+ [ '\\.', '.' ],
+ [ '/', 'য়' ],
+ [ ':', 'ছ' ],
+ [ ';', 'চ' ],
+ [ '\\<', 'ষ' ],
+ [ '\\=', 'ৃ' ],
+ [ '\\+', 'ঋ' ],
+ [ '\\>', '।' ],
+ [ '\\?', 'য' ],
+ [ 'A', 'ও' ],
+ [ 'C', 'ণ' ],
+ [ 'D', 'অ' ],
+ [ 'E', 'আ' ],
+ [ 'F', 'ই' ],
+ [ 'G', 'উ' ],
+ [ 'H', 'ফ' ],
+ [ 'I', 'ঘ' ],
+ [ 'K', 'খ' ],
+ [ 'L', 'থ' ],
+ [ 'M', 'শ' ],
+ [ 'O', 'ধ' ],
+ [ 'P', 'ঝ' ],
+ [ 'Q', 'ঔ' ],
+ [ 'R', 'ঈ' ],
+ [ 'S', 'এ' ],
+ [ 'T', 'ঊ' ],
+ [ 'U', 'ঙ' ],
+ [ 'W', 'ঐ' ],
+ [ 'X', 'ঁ' ],
+ [ 'Y', 'ভ' ],
+ [ '\\{', 'ঢ' ],
+ [ '\\[', 'ড' ],
+ [ '\\}', 'ঞ' ],
+ [ '\\]', '়' ],
+ [ '\\_', 'ঃ' ],
+ [ 'a', 'ো' ],
+ [ 'c', 'ম' ],
+ [ 'd', '্' ],
+ [ 'e', 'া' ],
+ [ 'f', 'ি' ],
+ [ 'g', 'ু' ],
+ [ 'h', 'প' ],
+ [ 'i', 'গ' ],
+ [ 'j', 'র' ],
+ [ 'k', 'ক' ],
+ [ 'l', 'ত' ],
+ [ 'm', 'স' ],
+ [ 'n', 'ল' ],
+ [ 'o', 'দ' ],
+ [ 'p', 'জ' ],
+ [ 'q', 'ৌ' ],
+ [ 'r', 'ী' ],
+ [ 's', 'ে' ],
+ [ 't', 'ূ' ],
+ [ 'u', 'হ' ],
+ [ 'v', 'ন' ],
+ [ 'w', 'ৈ' ],
+ [ 'x', 'ং' ],
+ [ 'y', 'ব' ]
+ ],
+ patterns_x: [
+ [ '\\!', '৴' ],
+ [ '1', '\u200d' ],
+ [ '\\@', '৵' ],
+ [ '2', '\u200c' ],
+ [ '\\#', '৶' ],
+ [ '\\$', '৷' ],
+ [ '4', '₹' ],
+ [ '\\%', '৸' ],
+ [ '\\^', '৹' ],
+ [ ',', '৳' ],
+ [ '\\.', '॥' ],
+ [ '/', '্য' ],
+ [ '\\<', '৲' ],
+ [ '\\=', 'ৄ' ],
+ [ '\\+', 'ৠ' ],
+ [ '\\>', 'ঽ' ],
+ [ 'F', 'ঌ' ],
+ [ 'R', 'ৡ' ],
+ [ '\\{', 'ঢ়' ],
+ [ '\\[', 'ড়' ],
+ [ 'f', 'ৢ' ],
+ [ 'l', 'ৎ' ],
+ [ 'r', 'ৣ' ],
+ [ 'x', '৺' ] ]
+ };
+
+ $.ime.register( mniInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mnw/mnw-simplified-anonta.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mnw/mnw-simplified-anonta.js
new file mode 100644
index 00000000..78461980
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mnw/mnw-simplified-anonta.js
@@ -0,0 +1,105 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mnwAnonta = {
+ id: 'mnw-simplified-anonta',
+ name: 'Mon Simplified Anonta',
+ description: 'Mon Simplified Anonta keyboard layout',
+ date: '2021-11-08',
+ URL: 'https://help.keyman.com/keyboard/mon_anonta/1.0.1/mon_anonta',
+ author: 'Amir E. Aharoni, based on Keyman',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', 'ၝ' ],
+ [ '~', 'ဎ' ],
+ [ '1', '၁' ],
+ [ '!', 'ဍ' ],
+ [ '2', '၂' ],
+ [ '@', 'ဏ္ဍ' ],
+ [ '3', '၃' ],
+ [ '#', 'ဋ' ],
+ [ '4', '၄' ],
+ [ '\\$', '\u102D\u1032' ], // SIGN I and SIGN AI
+ [ '5', '၅' ],
+ [ '6', '၆' ],
+ [ '\\^', '\u1035' ], // SIGN E ABOVE
+ [ '7', '၇' ],
+ [ '&', 'ရ' ],
+ [ '8', '၈' ],
+ [ '\\*', 'ဂ' ],
+ [ '9', '၉' ],
+ [ '0', '၀' ],
+ [ '_', '×' ],
+
+ [ 'q', 'ဆ' ],
+ [ 'Q', 'ၛ' ],
+ [ 'w', 'တ' ],
+ [ 'W', 'ဝ' ],
+ [ 'e', 'န' ],
+ [ 'E', 'ဣ' ],
+ [ 'r', 'မ' ],
+ [ 'R', '\u105F' ], // MON MON MEDIAL MA
+ [ 't', 'အ' ],
+ [ 'T', '\u1033' ], // MON II
+ [ 'y', 'ပ' ],
+ [ 'Y', '\u1060' ], // MON MEDIAL LA
+ [ 'u', 'က' ],
+ [ 'U', 'ဥ' ],
+ [ 'i', 'ၚ' ],
+ [ 'I', '၎' ],
+ [ 'o', 'သ' ],
+ [ 'O', 'ဿ' ],
+ [ 'p', 'စ' ],
+ [ 'P', 'ဏ' ],
+ [ '\\[', 'ဟ' ],
+ [ '\\{', 'ဨ' ],
+ [ '\\]', 'ဩ' ],
+ [ '\\}', 'အဴ' ], // A and SIGN MON O
+ [ '\\\\', 'ၑ' ],
+ [ '\\|', 'ဋ္ဌ' ], // TTA and VIRAMA and TTHA
+
+ [ 'a', '\u1031' ], // SIGN E
+ [ 'A', 'ဗ' ],
+ [ 's', '\u103B' ], // SIGN MEDIAL YA
+ [ 'S', '\u103E' ], // SIGN MEDIAL HA
+ [ 'd', '\u102D' ], // SIGN I
+ [ 'D', '\u102E' ], // SIGN II
+ [ 'f', '\u103A' ], // ASAT
+ [ 'F', '\u1039' ], // VIRAMA
+ [ 'g', '\u102B' ], // TALL AA
+ [ 'G', '\u103D' ], // MEDIAL WA
+ [ 'h', '\u1034' ], // SIGN MON O
+ [ 'H', '\u1036' ], // ANUSVARA
+ [ 'j', '\u103C' ], // SIGN MEDIAL RA
+ [ 'J', '\u1032' ], // SIGN AI
+ [ 'k', '\u102F' ], // SIGN U
+ [ 'K', 'ဒ' ],
+ [ 'l', '\u1030' ], // SIGN UU
+ [ 'L', 'ဓ' ],
+ [ ';', '\u1038' ], // VISARGA
+
+ [ 'z', 'ဖ' ],
+ [ 'Z', 'ဇ' ],
+ [ 'x', 'ထ' ],
+ [ 'X', 'ဌ' ],
+ [ 'c', 'ခ' ],
+ [ 'C', 'ဃ' ],
+ [ 'v', 'လ' ],
+ [ 'V', 'ဠ' ],
+ [ 'b', 'ဘ' ],
+ [ 'B', 'ၐ' ],
+ [ 'n', 'ည' ],
+ [ 'N', 'ဉ' ],
+ [ 'm', '\u102C' ], // SIGN AA
+ [ 'M', '÷' ],
+ [ ',', 'ယ' ],
+ [ '\\<', '\u105E' ], // MON MEDIAL NA
+ [ '\\.', 'ၜ' ],
+ [ '/', '။' ],
+ [ '\\?', '၊' ]
+ ]
+ };
+
+ $.ime.register( mnwAnonta );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-inscript.js
new file mode 100644
index 00000000..125be12a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-inscript.js
@@ -0,0 +1,115 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mrInScript = {
+ id: 'mr-inscript',
+ name: 'मराठी लिपी',
+ description: 'InScript keyboard for Marathi script',
+ date: '2012-10-14',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'X', '\u0901' ],
+ [ 'x', '\u0902' ],
+ [ '_', '\u0903' ],
+ [ 'D', '\u0905' ],
+ [ 'E', '\u0906' ],
+ [ 'F', '\u0907' ],
+ [ 'R', '\u0908' ],
+ [ 'G', '\u0909' ],
+ [ 'T', '\u090A' ],
+ [ '\\+', '\u090B' ],
+ [ '!', '\u090D' ],
+ [ 'S', '\u090F' ],
+ [ 'W', '\u0910' ],
+ [ '\\|', '\u0911' ],
+ [ 'A', '\u0913' ],
+ [ 'Q', '\u0914' ],
+ [ 'k', '\u0915' ],
+ [ 'K', '\u0916' ],
+ [ 'i', '\u0917' ],
+ [ 'I', '\u0918' ],
+ [ 'U', '\u0919' ],
+ [ ';', '\u091A' ],
+ [ '\\:', '\u091B' ],
+ [ 'p', '\u091C' ],
+ [ 'P', '\u091D' ],
+ [ '\\}', '\u091E' ],
+ [ '\'', '', '\u091F' ],
+ [ '"', '\u0920' ],
+ [ '\\[', '\u0921' ],
+ [ '\\{', '\u0922' ],
+ [ 'C', '\u0923' ],
+ [ 'l', '\u0924' ],
+ [ 'L', '\u0925' ],
+ [ 'o', '\u0926' ],
+ [ 'O', '\u0927' ],
+ [ 'v', '\u0928' ],
+ [ 'h', '\u092A' ],
+ [ 'H', '\u092B' ],
+ [ 'y', '\u092C' ],
+ [ 'Y', '\u092D' ],
+ [ 'c', '\u092E' ],
+ [ '/', '\u092F' ],
+ [ 'j', '\u0930' ],
+ [ 'J', '\u0931' ],
+ [ 'n', '\u0932' ],
+ [ 'N', '\u0933' ],
+ [ 'b', '\u0935' ],
+ [ 'M', '\u0936' ],
+ [ '\\<', '\u0937' ],
+ [ 'm', '\u0938' ],
+ [ 'u', '\u0939' ],
+ [ '\\]', '\u093C' ],
+ [ 'e', '\u093E' ],
+ [ 'f', '\u093F' ],
+ [ 'r', '\u0940' ],
+ [ 'g', '\u0941' ],
+ [ 't', '\u0942' ],
+ [ '\\=', '\u0943' ],
+ [ '\\@', '\u0945' ],
+ [ 's', '\u0947' ],
+ [ 'w', '\u0948' ],
+ [ '\\\\', '\u0949' ],
+ [ 'a', '\u094B' ],
+ [ 'q', '\u094C' ],
+ [ 'd', '\u094D' ],
+ [ '\\>', '\u0964' ],
+ [ '0', '\u0966' ],
+ [ '1', '\u0967' ],
+ [ '2', '\u0968' ],
+ [ '3', '\u0969' ],
+ [ '4', '\u096A' ],
+ [ '5', '\u096B' ],
+ [ '6', '\u096C' ],
+ [ '7', '\u096D' ],
+ [ '8', '\u096E' ],
+ [ '9', '\u096F' ],
+ [ '\\!', '\u0972' ],
+ [ '\\#', '\u094D\u0930' ],
+ [ '\\$', '\u0930\u094D' ],
+ [ '\\%', '\u091C\u094D\u091E' ],
+ [ '\\^', '\u0924\u094D\u0930' ],
+ [ '\\&', '\u0915\u094D\u0937' ],
+ [ '\\*', '\u0936\u094D\u0930' ],
+ [ '\\(', '\u200D' ],
+ [ '\\)', '\u200C' ] ],
+ patterns_x: [
+ [ 'F', '\u090C' ],
+ [ '\\>', '\u093D' ],
+ [ '\\=', '\u0944' ],
+ [ 'X', '\u0950' ],
+ [ 'e', '\u0951' ],
+ [ 'd', '\u0952' ],
+ [ '\\+', '\u0960' ],
+ [ 'R', '\u0961' ],
+ [ 'f', '\u0962' ],
+ [ 'r', '\u0963' ],
+ [ '\\.', '\u0965' ],
+ [ ',', '\u0970' ],
+ [ '\\$', '\u20B9' ] ]
+ };
+
+ $.ime.register( mrInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-inscript2.js
new file mode 100644
index 00000000..97b19773
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-inscript2.js
@@ -0,0 +1,121 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mrInScript2 = {
+ id: 'mr-inscript2',
+ name: 'मराठी इनस्क्रिप्ट २',
+ description: 'Enhanced InScript keyboard for Marathi language',
+ date: '2012-11-06',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\!', 'ॲ' ],
+ [ '1', '१' ],
+ [ '\\@', 'ॅ' ],
+ [ '2', '२' ],
+ [ '\\#', '्र' ],
+ [ '3', '३' ],
+ [ '\\$', 'र्' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\]', ']' ],
+ [ '0', '०' ],
+ [ '\\_', 'ः' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ऋ' ],
+ [ '\\=', 'ृ' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ौ' ],
+ [ 'W', 'ऐ' ],
+ [ 'w', 'ै' ],
+ [ 'E', 'आ' ],
+ [ 'e', 'ा' ],
+ [ 'R', 'ई' ],
+ [ 'r', 'ी' ],
+ [ 'T', 'ऊ' ],
+ [ 't', 'ू' ],
+ [ 'Y', 'भ' ],
+ [ 'y', 'ब' ],
+ [ 'U', 'ङ' ],
+ [ 'u', 'ह' ],
+ [ 'I', 'घ' ],
+ [ 'i', 'ग' ],
+ [ 'O', 'ध' ],
+ [ 'o', 'द' ],
+ [ 'P', 'झ' ],
+ [ 'p', 'ज' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ञ' ],
+ [ '\\]', '़' ],
+ [ 'A', 'ओ' ],
+ [ 'a', 'ो' ],
+ [ 'S', 'ए' ],
+ [ 's', 'े' ],
+ [ 'D', 'अ' ],
+ [ 'd', '्' ],
+ [ 'F', 'इ' ],
+ [ 'f', 'ि' ],
+ [ 'G', 'उ' ],
+ [ 'g', 'ु' ],
+ [ 'H', 'फ' ],
+ [ 'h', 'प' ],
+ [ 'J', 'ऱ' ],
+ [ 'j', 'र' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'थ' ],
+ [ 'l', 'त' ],
+ [ ':', 'छ' ],
+ [ ';', 'च' ],
+ [ '"', 'ठ' ],
+ [ '\\\'', 'ट' ],
+ [ '\\~', 'ऒ' ],
+ [ '\\`', 'ॊ' ],
+ [ 'X', 'ँ' ],
+ [ 'x', 'ं' ],
+ [ 'C', 'ण' ],
+ [ 'c', 'म' ],
+ [ 'v', 'न' ],
+ [ 'b', 'व' ],
+ [ 'N', 'ळ' ],
+ [ 'n', 'ल' ],
+ [ 'M', 'श' ],
+ [ 'm', 'स' ],
+ [ '\\<', 'ष' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'य' ],
+ [ '\\%', 'ज्ञ' ],
+ [ '\\^', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '\\+', 'ॠ' ],
+ [ '\\=', 'ॄ' ],
+ [ 'e', '॑' ],
+ [ 'R', 'ॡ' ],
+ [ 'r', 'ॣ' ],
+ [ 'd', '॒' ],
+ [ 'F', 'ऌ' ],
+ [ 'f', 'ॢ' ],
+ [ 'X', 'ॐ' ],
+ [ ',', '॰' ],
+ [ '\\>', 'ऽ' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+
+ $.ime.register( mrInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-phonetic.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-phonetic.js
new file mode 100644
index 00000000..221d81ea
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-phonetic.js
@@ -0,0 +1,110 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mrPhonetic = {
+ id: 'mr-phonetic',
+ name: 'फोनेटिक',
+ description: 'Phonetic keyboard for Marathi language',
+ date: '2013-02-09',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '्f', '्\u200c' ],
+ [ '~', 'ऎ' ],
+ [ '`', 'ॆ' ],
+ [ '!', 'ऍ' ],
+ [ '1', '१' ],
+ [ '\\@","ॅ' ],
+ [ '2', '२' ],
+ [ '\\#', 'ऑ' ],
+ [ '3', '३' ],
+ [ '\\$', 'ॉ' ],
+ [ '4', '४' ],
+ [ '\\%', 'ञ' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\)', ')' ],
+ [ '0', '०' ],
+ [ '\\_', '_' ],
+ [ '\\-', '-' ],
+ [ '\\+', '+' ],
+ [ '\\=', '=' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ओ' ],
+ [ 'W', 'ठ' ],
+ [ 'w', 'ट' ],
+ [ 'E', 'ै' ],
+ [ 'e', 'े' ],
+ [ 'R', 'ृ' ],
+ [ 'r', 'र' ],
+ [ 'T', 'थ' ],
+ [ 't', 'त' ],
+ [ 'Y', 'य़' ],
+ [ 'y', 'य' ],
+ [ 'U', 'ू' ],
+ [ 'u', 'ु' ],
+ [ 'I', 'ी' ],
+ [ 'i', 'ि' ],
+ [ 'O', 'ौ' ],
+ [ 'o', 'ो' ],
+ [ 'P', 'फ' ],
+ [ 'p', 'प' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ऱ' ],
+ [ '\\]', 'ऋ' ],
+ [ 'A', 'आ' ],
+ [ 'a', 'ा' ],
+ [ 'S', 'श' ],
+ [ 's', 'स' ],
+ [ 'D', 'ध' ],
+ [ 'd', 'द' ],
+ [ 'F', 'अ' ],
+ [ 'f', '्' ],
+ [ 'G', 'घ' ],
+ [ 'g', 'ग' ],
+ [ 'H', 'ः' ],
+ [ 'h', 'ह' ],
+ [ 'J', 'झ' ],
+ [ 'j', 'ज' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'ळ' ],
+ [ 'l', 'ल' ],
+ [ ':', 'ई' ],
+ [ ';', 'इ' ],
+ [ '"', 'ऊ' ],
+ [ '\'', 'उ' ],
+ [ '\\|', 'ऒ' ],
+ [ '\\\\', 'ॊ' ],
+ [ 'Z', 'ँ' ],
+ [ 'z', 'ङ' ],
+ [ 'x', 'ष' ],
+ [ 'C', 'छ' ],
+ [ 'c', 'च' ],
+ [ 'V', 'ऴ' ],
+ [ 'v', 'व' ],
+ [ 'B', 'भ' ],
+ [ 'b', 'ब' ],
+ [ 'N', 'ण' ],
+ [ 'n', 'न' ],
+ [ 'M', 'ं' ],
+ [ 'm', 'म' ],
+ [ '\\<', 'ऩ' ],
+ [ ',', ',' ],
+ [ '\\>', '़' ],
+ [ '\\?', 'ऐ' ],
+ [ '/', 'ए' ],
+ [ '\\^', 'ज्ञ' ],
+ [ 'X', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ]
+ };
+
+ $.ime.register( mrPhonetic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-transliteration.js
new file mode 100644
index 00000000..2ddfc7e8
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mr/mr-transliteration.js
@@ -0,0 +1,147 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mrTransliteration = {
+ id: 'mr-transliteration',
+ name: 'अक्षरांतरण',
+ description: 'Transliteration keyboard for Marathi script',
+ date: '2012-10-14',
+ author: 'Pathak A B',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 2,
+ maxKeyLength: 4,
+ patterns: [
+ [ 'च्h', 'c', 'च्' ], // ch
+ [ 'च्h', 'ch', 'छ्' ], // chh
+
+ [ '\\\\([A-Za-z\\>_~0-9])', '\\\\', '$1' ],
+
+ [ '([क-ह]़?)्a', '$1' ],
+ [ '([क-ह]़?)्A', '$1ा' ],
+ [ '([क-ह]़?)a', '$1ा' ],
+ [ '([क-ह]़?)्i', '$1ि' ],
+ [ '([क-ह]़?)(्I|िi|ेe)', '$1ी' ],
+ [ '([क-ह]़?)्u', '$1ु' ],
+ [ '([क-ह]़?)(ुu|्U|ोo)', '$1ू' ],
+ [ '([क-ह]़?)्R', '$1ृ' ],
+ [ '([क-ह]़?)ृR', '$1ॄ' ],
+ [ '([क-ह]़?)्ळ्l', '$1ॢ' ],
+ [ '([क-ह]़?)ॢl', '$1ॣ' ],
+ [ '([क-ह]़?)े\\^', '$1ॅ' ],
+ [ '([क-ह]़?)्e', '$1े' ],
+ [ '([क-ह]़?)्E', '$1ॅ' ],
+ [ '([क-ह]़?)ो\\^', '$1ॉ' ],
+ [ '([क-ह]़?)i', '$1ै' ],
+ [ '([क-ह]़?)्o', '$1ो' ],
+ [ '([क-ह]़?)्O', '$1ॉ' ],
+ [ '([क-ह]़?)u', '$1ौ' ],
+ [ '([क-ह])्\\`', '$1़्' ],
+ [ '([क-ह])ॉM', '$1ाँ' ],
+
+ [ 'आऊM', 'ॐ' ], // AUM (OM)
+
+ [ '(द्न्y|ग्ग्y|ज्ज्n)', 'ज्ञ्' ], // dny, ggy or jjn
+
+ [ 'र्र्y', 'ऱ्य्' ], // rry
+ [ 'र्र्h', 'ऱ्ह्' ], // rrh
+
+ [ 'अa', 'आ' ],
+ [ '(ऒo|उu)', 'ऊ' ],
+ [ 'ए\\^', 'ऍ' ],
+ [ 'अi', 'ऐ' ],
+ [ '(अ\\^|E)', 'ॲ' ],
+ [ '(इi|एe)', 'ई' ],
+ [ 'ऒ\\^', 'ऑ' ],
+ [ 'अu', 'औ' ],
+ [ 'ऋR', 'ॠ' ],
+ [ 'ळ्l', 'ऌ' ],
+ [ 'ऌl', 'ॡ' ],
+ [ 'ंM', 'ँ' ],
+
+ [ 'र्Y', 'ऱ्य्' ],
+
+ [ 'क्h', 'ख्' ], // kh
+ [ 'ग्h', 'घ्' ],
+ [ 'न्g', 'ङ्' ],
+ [ 'ज्h', 'झ्' ],
+ [ 'न्j', 'ञ्' ],
+ [ 'ट्h', 'ठ्' ],
+ [ 'ड्h', 'ढ्' ],
+ [ 'त्h', 'थ्' ],
+ [ 'द्h', 'ध्' ],
+ [ '(f|प्h)', 'फ्' ],
+ [ 'ब्h', 'भ्' ],
+ [ 'ऋi', 'ॠ' ], // Ri
+ [ 'ऋl', 'ॡ' ], // Rl
+
+ [ 'स्h', 'श्' ],
+ [ 'श्h', 'ष्' ],
+ [ 'क़्h', 'ख़्' ],
+ [ 'ज़्h', 'ऴ्' ],
+ [ '।\\\\', '॥' ],
+
+ [ 'a', 'अ' ],
+ [ 'b', 'ब्' ],
+ [ 'c', 'च्' ],
+ [ 'd', 'द्' ],
+ [ 'e', 'ए' ],
+ [ 'g', 'ग्' ],
+ [ 'h', 'ह्' ],
+ [ 'i', 'इ' ],
+ [ 'j', 'ज्' ],
+ [ 'k', 'क्' ],
+ [ 'l', 'ल्' ],
+ [ 'm', 'म्' ],
+ [ 'n', 'न्' ],
+ [ 'o', 'ओ' ],
+ [ 'p', 'प्' ],
+ [ 'q', 'क़्' ],
+ [ 'r', 'र्' ],
+ [ 's', 'स्' ],
+ [ 't', 'त्' ],
+ [ 'u', 'उ' ],
+ [ '(v|w)', 'व्' ],
+ [ 'x', 'क्ष्' ],
+ [ 'y', 'य्' ],
+ [ '(z|Z)', 'झ्' ],
+ [ 'A', 'आ' ],
+ [ 'B', 'ब्ब्' ],
+ [ 'C', 'क्क्' ],
+ [ 'D', 'ड्' ],
+ [ 'G', 'ग्ग्' ],
+ [ 'H', 'ः' ],
+ [ 'I', 'ई' ],
+ [ 'J', 'ज्ज्' ],
+ [ 'K', 'क्क्' ],
+ [ 'L', 'ळ्' ],
+ [ 'M', 'ं' ],
+ [ 'N', 'ण्' ],
+ [ 'O', 'ऑ' ],
+ [ 'P', 'प्प्' ],
+ [ 'R', 'ऋ' ],
+ [ 'S', 'श्' ],
+ [ 'T', 'ट्' ],
+ [ 'U', 'ऊ' ],
+ [ '(V|W)', 'व्व्' ],
+ [ 'X', 'क्ष्' ],
+ [ 'Y', 'य्य्' ],
+ [ '0', '०' ],
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '3', '३' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '9', '९' ],
+ [ '~', '्' ],
+ [ '\\\\.', '।' ], // Danda
+ [ '//', 'ऽ' ],
+ [ '\\`', '़' ],
+ [ '(\u200C)*_', '\u200c' ] ]
+ };
+
+ $.ime.register( mrTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mul-bf/mul-bf.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mul-bf/mul-bf.js
new file mode 100644
index 00000000..f0928ce1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mul-bf/mul-bf.js
@@ -0,0 +1,48 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mulBf = {
+ id: 'mul-bf',
+ name: 'Burkina Faso tilde',
+ description: 'Burkina Faso tilde keyboard',
+ date: '2022-02-14',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ '~B', 'Ɓ' ],
+ [ '~b', 'ɓ' ],
+ [ '~C', 'Ç' ],
+ [ '~c', 'ç' ],
+ [ '~D', 'Ɗ' ],
+ [ '~d', 'ɗ' ],
+ [ '~A', 'Ǝ' ],
+ [ '~a', 'ǝ' ],
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~I', 'Ɩ' ],
+ [ '~i', 'ɩ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~U', 'Ʋ' ],
+ [ '~u', 'ʋ' ],
+ [ '~W', 'Ⱳ' ],
+ [ '~w', 'ⱳ' ],
+ [ '~Y', 'Ƴ' ],
+ [ '~y', 'ƴ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~\\{', '\u0303' ], // Combining tilde
+ [ '~-', '\u0304' ], // Combining macron
+ [ '~:', '\u0308' ], // Combining diaeresis
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( mulBf );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/mul-cm/mul-cm.js b/UniversalLanguageSelector/lib/jquery.ime/rules/mul-cm/mul-cm.js
new file mode 100644
index 00000000..186ba668
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/mul-cm/mul-cm.js
@@ -0,0 +1,65 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mulCm = {
+ id: 'mul-cm',
+ name: 'Cameroon Languages tilde',
+ description: 'General Alphabet of Cameroon Languages tilde keyboard',
+ date: '2022-02-07',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ '~A', 'Ɑ' ],
+ [ '~a', 'ɑ' ],
+ [ 'AE', 'Æ' ],
+ [ 'Ae', 'Æ' ],
+ [ 'ae', 'æ' ],
+ [ 'A~E', 'AE' ],
+ [ 'A~e', 'Ae' ],
+ [ 'a~e', 'ae' ],
+ [ 'OE', 'Œ' ],
+ [ 'Oe', 'Œ' ],
+ [ 'oe', 'œ' ],
+ [ 'O~E', 'OE' ],
+ [ 'O~e', 'Oe' ],
+ [ 'o~e', 'oe' ],
+ [ '~B', 'Ɓ' ],
+ [ '~b', 'ɓ' ],
+ [ '~c', 'ə' ],
+ [ '~C', 'Ə' ],
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~D', 'Ɗ' ],
+ [ '~d', 'ɗ' ],
+ [ '~I', 'Ɨ' ],
+ [ '~i', 'ɨ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~J', 'Ø' ],
+ [ '~j', 'ø' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~U', 'Ʉ' ],
+ [ '~u', 'ʉ' ],
+ [ '~X', 'ɤ' ], // There's no uppercase ɤ ("ram's horns") in Unicode
+ [ '~x', 'ɤ' ],
+ [ '~W', 'Ẅ' ],
+ [ '~w', 'ẅ' ],
+ [ '~Y', 'Ƴ' ],
+ [ '~y', 'ƴ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~-', '\u0304' ], // Combining macron
+ [ '~v', '\u030C' ], // Combining caron
+ [ '~\\|', '\u030D' ], // Combining vertical line above
+ [ '~\\.', '\u0323' ], // Combining dot below
+ [ '~,', '\u0327' ] // Combining cedilla
+ ]
+ };
+
+ $.ime.register( mulCm );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/my/my-mm3.js b/UniversalLanguageSelector/lib/jquery.ime/rules/my/my-mm3.js
new file mode 100644
index 00000000..4f985258
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/my/my-mm3.js
@@ -0,0 +1,155 @@
+( function ( $ ) {
+ 'use strict';
+
+ var mymm3 = {
+ id: 'my-mm3',
+ name: 'မြန်မာ၃ လက်ကွက်',
+ description: 'Myanmar3 keyboard layout',
+ date: '2014-10-28',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Lionslayer',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'ေu', 'a', 'ကေ' ],
+ [ 'ေc', 'a', 'ခေ' ],
+ [ 'ေ:', 'a', 'ဂေ' ],
+ [ 'ေC', 'a', 'ဃေ' ],
+ [ 'ေi', 'a', 'ငေ' ],
+ [ 'ေp', 'a', 'စေ' ],
+ [ 'ေq', 'a', 'ဆေ' ],
+ [ 'ေZ', 'a', 'ဇေ' ],
+ [ 'ေQ', 'a', 'ဈေ' ],
+ [ 'ေn', 'a', 'ညေ' ],
+ [ 'ေN', 'a', 'ဉေ' ],
+ [ 'ေ!', 'a', 'ဍေ' ],
+ [ 'ေX', 'a', 'ဌေ' ],
+ [ 'ေ#', 'a', 'ဋေ' ],
+ [ 'ေ~', 'a', 'ဎေ' ],
+ [ 'ေP', 'a', 'ဏေ' ],
+ [ 'ေw', 'a', 'တေ' ],
+ [ 'ေx', 'a', 'ထေ' ],
+ [ 'ေK', 'a', 'ဒေ' ],
+ [ 'ေL', 'a', 'ဓေ' ],
+ [ 'ေe', 'a', 'နေ' ],
+ [ 'ေy', 'a', 'ပေ' ],
+ [ 'ေz', 'a', 'ဖေ' ],
+ [ 'ေA', 'a', 'ဗေ' ],
+ [ 'ေb', 'a', 'ဘေ' ],
+ [ 'ေr', 'a', 'မေ' ],
+ [ 'ေB', 'a', 'ယေ' ],
+ [ 'ေ&', 'a', 'ရေ' ],
+ [ 'ေv', 'a', 'လေ' ],
+ [ 'ေW', 'a', 'ဝေ' ],
+ [ 'ေo', 'a', 'သေ' ],
+ [ 'ေ\\[', 'a', 'ဟေ' ],
+ [ 'ေV', 'a', 'ဠေ' ],
+ [ 'ေt', 'a', 'အေ' ],
+
+ [ 'ေG', '', 'ွေ' ],
+ [ 'ေj', '', 'ြေ' ],
+ [ 'ေs', '', 'ျေ' ],
+ [ 'ေS', '', 'ှေ' ],
+ [ 'ေြG', '', 'ြွေ' ],
+ [ 'ေျG', '', 'ျွေ' ],
+ [ 'ေြS', '', 'ြှေ' ],
+ [ 'ေျS', '', 'ျှေ' ],
+
+ [ 'စs', '', 'ဈ' ],
+ [ 'သj', '', 'ဩ' ],
+ [ 'ဥf', '', 'ဉ်' ],
+ [ 'ဥD', '', 'ဦ' ],
+ [ 'ုd', '', 'ို' ],
+ [ '်h', '', '့်' ],
+ [ 'ွs', '', 'ျွ' ],
+ [ 'ွj', '', 'ြွ' ],
+ [ 'ှG', '', 'ွှ' ],
+ [ 'ှs', '', 'ျှ' ],
+ [ 'ှj', '', 'ြှ' ],
+ [ '(ှွs)|(ွှs)|(ှျG)|(ျှG)|(ျွS)|(ွျS)', '', 'ျွှ' ],
+ [ '(ှွj)|(ွှj)|(ှြG)|(ြှG)|(ြွS)|(ွြS)', '', 'ြွှ' ],
+
+ [ 'u', '', 'က' ],
+ [ 'c', '', 'ခ' ],
+ [ ':', '', 'ဂ' ],
+ [ 'C', '', 'ဃ' ],
+ [ 'i', '', 'င' ],
+ [ 'p', '', 'စ' ],
+ [ 'q', '', 'ဆ' ],
+ [ 'Z', '', 'ဇ' ],
+ [ 'Q', '', 'ဈ' ],
+ [ 'n', '', 'ည' ],
+ [ 'N', '', 'ဉ' ],
+ [ '!', '', 'ဍ' ],
+ [ 'X', '', 'ဌ' ],
+ [ '#', '', 'ဋ' ],
+ [ '~', '', 'ဎ' ],
+ [ 'P', '', 'ဏ' ],
+ [ 'w', '', 'တ' ],
+ [ 'x', '', 'ထ' ],
+ [ 'K', '', 'ဒ' ],
+ [ 'L', '', 'ဓ' ],
+ [ 'e', '', 'န' ],
+ [ 'y', '', 'ပ' ],
+ [ 'z', '', 'ဖ' ],
+ [ 'A', '', 'ဗ' ],
+ [ 'b', '', 'ဘ' ],
+ [ 'r', '', 'မ' ],
+ [ 'B', '', 'ယ' ],
+ [ '&', '', 'ရ' ],
+ [ 'v', '', 'လ' ],
+ [ 'W', '', 'ဝ' ],
+ [ 'o', '', 'သ' ],
+ [ '\\[', '', 'ဟ' ],
+ [ 'V', '', 'ဠ' ],
+ [ 't', '', 'အ' ],
+
+ [ 'm', '', 'ာ' ],
+ [ 'g', '', 'ါ' ],
+ [ 'd', '', 'ိ' ],
+ [ 'D', '', 'ီ' ],
+ [ 'k', '', 'ု' ],
+ [ 'l', '', 'ူ' ],
+ [ 'a', '', 'ေ' ],
+ [ 'J', '', 'ဲ' ],
+ [ 'H', '', 'ံ' ],
+ [ 'h', '', '့' ],
+ [ '\\;', '', 'း' ],
+ [ 'f', '', '်' ],
+ [ 'F', '', '္' ],
+ [ '\\>', '', '။' ],
+ [ '\\<', '', '၊' ],
+
+ [ 's', '', 'ျ' ],
+ [ 'j', '', 'ြ' ],
+ [ 'G', '', 'ွ' ],
+ [ 'S', '', 'ှ' ],
+ [ 'E', '', 'ဣ' ],
+ [ 'R', '', '၎' ],
+ [ 'T', '', 'ဤ' ],
+ [ 'Y', '', '၌' ],
+ [ 'I', '', '၍' ],
+ [ 'O', '', 'ဿ' ],
+ [ '\\{', '', 'ဧ' ],
+ [ '\\]', '', 'ဩ' ],
+ [ '\\}', '', 'ဪ' ],
+ [ '\\\\', '', '၏' ],
+ [ 'u', '', 'က' ],
+ [ 'U', '', 'ဥ' ],
+ [ 'M', '', 'ဦ' ],
+
+ [ '0', '', '၀' ],
+ [ '1', '', '၁' ],
+ [ '2', '', '၂' ],
+ [ '3', '', '၃' ],
+ [ '4', '', '၄' ],
+ [ '5', '', '၅' ],
+ [ '6', '', '၆' ],
+ [ '7', '', '၇' ],
+ [ '8', '', '၈' ],
+ [ '9', '', '၉' ]
+ ]
+ };
+
+ $.ime.register( mymm3 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/my/my-xkb.js b/UniversalLanguageSelector/lib/jquery.ime/rules/my/my-xkb.js
new file mode 100644
index 00000000..60e1906d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/my/my-xkb.js
@@ -0,0 +1,105 @@
+( function ( $ ) {
+ 'use strict';
+
+ var myXkb = {
+ id: 'my-xkb',
+ name: 'မြန်မာဘာသာ xkb',
+ description: 'Myanmar xkb keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.01',
+ patterns: [
+ [ '`', '\u1050' ], // ၐ SHA
+ [ '\\~', '\u100e' ], // ဎ DDHA
+ [ '1', '\u1041' ], // ၁ DIGIT ONE
+ [ '\\!', '\u100D' ], // ဍ DDA
+ [ '2', '\u1042' ], // ၂ DIGIT TWO
+ [ '\\@', '\u1052' ], // VOCALIC R
+ [ '3', '\u1043' ], // ၃ DIGIT THREE
+ [ '\\#', '\u100B' ], // TTA
+ [ '4', '\u1044' ], // ၄ DIGIT FOUR
+ [ '\\$', '\u1053' ], // VOCALIC RR
+ [ '5', '\u1045' ], // ၅ DIGIT FIVE
+ [ '\\%', '\u1054' ], // VOCALIC L
+ [ '6', '\u1046' ], // ၆ DIGIT SIX
+ [ '\\^', '\u1055' ], // ၕ VOL
+ [ '7', '\u1047' ], // ၇ DIGIT SEVEN
+ [ '\\&', '\u101B' ], // ရ RA
+ [ '8', '\u1048' ], // ၇ DIGIT EIGHT
+ [ '9', '\u1049' ], // ၉ DIGIT NINE
+ [ '0', '\u1040' ], // ၀ DIGIT ZERO
+
+ [ 'q', '\u1006' ], // ဆ CHA
+ [ 'Q', '\u1008' ], // ဈ JHA
+ [ 'w', '\u1010' ], // တ TA
+ [ 'W', '\u101D' ], // ဝ WA
+ [ 'e', '\u1014' ], // န NA
+ [ 'E', '\u1023' ], // ဣ I
+ [ 'r', '\u1019' ], // မ MA
+ [ 'R', '\u104E' ], // ၎ AFOREMENTIONED
+ [ 't', '\u1021' ], // အ A
+ [ 'T', '\u1024' ], // ဤ II
+ [ 'y', '\u1015' ], // ပ PA
+ [ 'Y', '\u104C' ], // ၌ LOCATIVE
+ [ 'u', '\u1000' ], // က KA
+ [ 'U', '\u1025' ], // ဥ U
+ [ 'i', '\u1004' ], // င NGA
+ [ 'I', '\u104D' ], // ၍ COMPLETED
+ [ 'o', '\u101E' ], // သ SA
+ [ 'O', '\u103F' ], // ဿ GREAT SA
+ [ 'p', '\u1005' ], // စ CA
+ [ 'P', '\u100F' ], // ဏ NNA
+ [ '\\[', '\u101F' ], // ဟ HA
+ [ '\\{', '\u1027' ], // ဧ E
+ [ '\\]', '\u1029' ], // ဩ O
+ [ '\\}', '\u102A' ], // ဪ AU
+
+ [ '\\\\', '\u104F' ], // ၏ GENITIVE
+ [ '\\|', '\u1051' ], // ၑ SSA
+
+ [ 'a', '\u1031' ], // ေSIGN E
+ [ 'A', '\u1017' ], // ဗ BA
+ [ 's', '\u103B' ], // ျ SIGN MEDIAL YA
+ [ 'S', '\u103E' ], // ှ SIGN MEDIAL HA
+ [ 'd', '\u102D' ], // ိ SIGN I
+ [ 'D', '\u102E' ], // ီ SIGN II
+ [ 'f', '\u103A' ], // ် ASAT
+ [ 'F', '\u1039' ], // ္ VIRAMA
+ [ 'g', '\u102B' ], // ါ SIGN TALL A
+ [ 'G', '\u103D' ], // ွ SIGN MEDIAL WA
+ [ 'h', '\u1037' ], // ့ SIGN DOT BELOW
+ [ 'H', '\u1036' ], // ံ ANUSVARA
+ [ 'j', '\u103C' ], // ြ MEDIAL RA
+ [ 'J', '\u1032' ], // ဲ SIGN AI
+ [ 'k', '\u102F' ], // ု SIGN U
+ [ 'K', '\u1012' ], // ဒ DA
+ [ 'l', '\u1030' ], // ူ SIGN UU
+ [ 'L', '\u1013' ], // ဓ DHA
+
+ [ ';', '\u1038' ], // း VISARGA
+ [ ':', '\u1002' ], // ဂ GA
+
+ [ 'z', '\u1016' ], // ဖ PHA
+ [ 'Z', '\u1007' ], // ဇ JA
+ [ 'x', '\u1011' ], // ထ THA
+ [ 'X', '\u100C' ], // ဌ TTHA
+ [ 'c', '\u1001' ], // ခ KHA
+ [ 'C', '\u1003' ], // ဃ GHA
+ [ 'v', '\u101C' ], // လ LA
+ [ 'V', '\u1020' ], // ဠ LLA
+ [ 'b', '\u1018' ], // ဘ BHA
+ [ 'B', '\u101A' ], // ယ YA
+ [ 'n', '\u100A' ], // ည NNYA
+ [ 'N', '\u1009' ], // ဉ NYA
+ [ 'm', '\u102C' ], // ာ SIGN AA
+ [ 'M', '\u1026' ], // ဦ UU
+
+ [ '\\<', '\u104A' ], // ၊ SIGN LITTLE SECTION
+ [ '\\>', '\u104B' ] // ။ SIGN SECTION
+ ]
+ };
+
+ $.ime.register( myXkb );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/nb/nb-normforms.js b/UniversalLanguageSelector/lib/jquery.ime/rules/nb/nb-normforms.js
new file mode 100644
index 00000000..eb1c56a2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/nb/nb-normforms.js
@@ -0,0 +1,50 @@
+( function ( $ ) {
+ 'use strict';
+
+ var defs = {
+ id: 'nb-normforms',
+ name: 'Norsk normal transliterasjon',
+ description: 'Norwegian input method with most common form transliterated',
+ date: '2012-12-04',
+ URL: 'http://www.evertype.com/alphabets/bokmaal-norwegian.pdf',
+ // URL: 'http://www.evertype.com/alphabets/nynorsk-norwegian.pdf',
+ author: 'John Erling Blad',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 3,
+ patterns: [
+ // The most common transliterations
+ [ 'aa', 'å' ],
+ [ 'AA', 'Å' ],
+ [ 'Aa', 'Å' ],
+ [ 'ae', 'æ' ],
+ [ 'AE', 'Æ' ],
+ [ 'Ae', 'Æ' ],
+ [ 'oe', 'ø' ],
+ [ 'OE', 'Ø' ],
+ [ 'Oe', 'Ø' ],
+ // The previous as negated transliterations, mostly for names
+ [ 'åa', 'a', 'aa' ],
+ [ 'ÅA', 'A', 'AA' ],
+ [ 'Åa', 'A', 'Aa' ],
+ [ 'åA', 'a', 'aA' ],
+ [ 'æe', 'e', 'ae' ],
+ [ 'ÆE', 'E', 'AE' ],
+ [ 'Æe', 'E', 'Ae' ],
+ [ 'æE', 'e', 'aE' ],
+ [ 'øe', 'e', 'oe' ],
+ [ 'ØE', 'E', 'OE' ],
+ [ 'Øe', 'E', 'Oe' ], // this fails for some names like "Øen"
+ [ 'øE', 'e', 'oE' ]
+ // historically similar forms
+ // "Å" is sometimes written as "Aa", and "å" as "aa", but in names
+ // it is not generally acceptable to use this transliteration. To
+ // handle those situations we need some oposite forms.
+ // There is a similar character "Å" for the length unit Angstrom,
+ // but this is not the upper case letter Å.
+ ]
+ };
+
+ $.ime.register( defs );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/nb/nb-tildeforms.js b/UniversalLanguageSelector/lib/jquery.ime/rules/nb/nb-tildeforms.js
new file mode 100644
index 00000000..392a8de4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/nb/nb-tildeforms.js
@@ -0,0 +1,35 @@
+( function ( $ ) {
+ 'use strict';
+
+ var defs = {
+ id: 'nb-tildeforms',
+ name: 'Norsk tildemerket transliterasjon',
+ description: 'Norwegian input method with initial tilde triggering transliteration',
+ date: '2012-12-04',
+ URL: 'http://www.evertype.com/alphabets/bokmaal-norwegian.pdf',
+ // URL: 'http://www.evertype.com/alphabets/nynorsk-norwegian.pdf',
+ author: 'John Erling Blad',
+ license: 'GPLv3',
+ version: '1.0',
+ // contextLength: 1,
+ maxKeyLength: 3,
+ patterns: [
+ // Uses "~" as "approximatly similar to"
+ [ '°a', 'å' ], // The simple ~a does not work as there is a "ã"
+ [ '°A', 'Å' ], // The simple ~A does not work as there is a "Ã"
+ [ '~ae', 'æ' ], // The simple ~a does not work as there is a "ã"
+ [ '~AE', 'Æ' ], // The simple ~A does not work as there is a "Ã"
+ [ '~oe', 'ø' ], // The simple ~o does not work as there is a "õ"
+ [ '~OE', 'Ø' ], // The simple ~O does not work as there is a "Õ"
+ [ '~aa', 'å' ], // The simple ~a does not work as there is a "ã"
+ [ '~AA', 'Å' ] // The simple ~A does not work as there is a "Ã"
+ // historically similar forms
+ // "Å" is sometimes written as "Aa", and "å" as "aa", but in names
+ // it is not generally acceptable to use this transliteration.
+ // There is a similar character "Å" for the length unit Angstrom,
+ // but this is not the upper case letter Å.
+ ]
+ };
+
+ $.ime.register( defs );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-inscript.js
new file mode 100644
index 00000000..492652e1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-inscript.js
@@ -0,0 +1,113 @@
+( function ( $ ) {
+ 'use strict';
+
+ var neInScript = {
+ id: 'ne-inscript',
+ name: 'इनस्क्रिप्ट',
+ description: 'InScript keyboard for Nepali script',
+ date: '2012-10-14',
+ author: 'Bhawani Gautam',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'X', 'ँ' ],
+ [ 'x', 'ं' ],
+ [ '_', 'ः' ],
+ [ 'D', 'अ' ],
+ [ 'E', 'आ' ],
+ [ 'F', 'इ' ],
+ [ 'R', 'ई' ],
+ [ 'G', 'उ' ],
+ [ 'T', 'ऊ' ],
+ [ '\\+', 'ृ' ],
+ [ 'S', 'ए' ],
+ [ 'W', 'ऐ' ],
+ [ 'A', 'ओ' ],
+ [ 'Q', 'औ' ],
+ [ 'k', 'क' ],
+ [ 'K', 'ख' ],
+ [ 'i', 'ग' ],
+ [ 'I', 'घ' ],
+ [ 'U', 'ङ' ],
+ [ '\\;', 'च' ],
+ [ '\\:', 'छ' ],
+ [ 'p', 'ज' ],
+ [ 'P', 'झ' ],
+ [ '\\}', 'ञ' ],
+ [ '\'', 'ट' ],
+ [ '"', 'ठ' ],
+ [ '\\[', '', 'ड' ],
+ [ '\\{', '', 'ढ' ],
+ [ 'C', 'ण' ],
+ [ 'l', 'त' ],
+ [ 'L', 'थ' ],
+ [ 'o', 'द' ],
+ [ 'O', 'ध' ],
+ [ 'v', 'न' ],
+ [ 'h', 'प' ],
+ [ 'H', 'फ' ],
+ [ 'y', 'ब' ],
+ [ 'Y', 'भ' ],
+ [ 'c', 'म' ],
+ [ '\\?', '', 'य' ],
+ [ 'j', 'र' ],
+ [ 'J', 'द्य' ],
+ [ 'n', 'ल' ],
+ [ 'N', 'ळ' ],
+ [ 'b', 'व' ],
+ [ 'M', 'श' ],
+ [ '\\<', '', 'ष' ],
+ [ 'm', 'स' ],
+ [ 'u', 'ह' ],
+ [ '\\]', '', '़' ],
+ [ 'e', 'ा' ],
+ [ 'f', 'ि' ],
+ [ 'r', 'ी' ],
+ [ 'g', 'ु' ],
+ [ 't', 'ू' ],
+ [ '\\=', '', 'ृ' ],
+ [ '\\\\', 'ॄ' ],
+ [ 's', 'े' ],
+ [ 'w', 'ै' ],
+ [ 'a', 'ो' ],
+ [ 'q', 'ौ' ],
+ [ 'd', '्' ],
+ [ '\\|', 'ॠ' ],
+ [ '/', 'य' ],
+ [ '\\>', '।' ],
+ [ '0', '', '०' ],
+ [ '1', '', '१' ],
+ [ '2', '२' ],
+ [ '3', '३' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '9', '९' ],
+ [ '\\@', 'ॅ' ],
+ [ '\\#', '', '्र' ],
+ [ '\\$', '', 'र्' ],
+ [ '\\%', '', 'ज्ञ' ],
+ [ '\\^', '', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ],
+ [ '\\(', '\u200D' ],
+ [ '\\)', '\u200C' ] ],
+
+ patterns_x: [
+ [ 'F', 'ऌ' ],
+ [ '\\>', '', 'ऽ' ],
+ [ 'X', 'ॐ' ],
+ [ 'e', '\u0951' ],
+ [ 'd', '\u0952' ],
+ [ 'R', 'ॡ' ],
+ [ 'f', 'ॢ' ],
+ [ 'r', 'ॣ' ],
+ [ '\\.', '॥' ],
+ [ '\\@', '', 'ॅ' ],
+ [ '4', '₹' ] ]
+ };
+
+ $.ime.register( neInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-inscript2.js
new file mode 100644
index 00000000..d08f8030
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-inscript2.js
@@ -0,0 +1,116 @@
+( function ( $ ) {
+ 'use strict';
+
+ var neInScript2 = {
+ id: 'ne-inscript2',
+ name: 'नेपाळी इनस्क्रिप्ट २',
+ description: 'Enhanced InScript keyboard for Nepali language',
+ date: '2012-11-06',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '\\#', '्र' ],
+ [ '3', '३' ],
+ [ '\\$', 'र्' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\]', ']' ],
+ [ '0', '०' ],
+ [ '\\_', 'ः' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ऋ' ],
+ [ '\\=', 'ृ' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ौ' ],
+ [ 'W', 'ऐ' ],
+ [ 'w', 'ै' ],
+ [ 'E', 'आ' ],
+ [ 'e', 'ा' ],
+ [ 'R', 'ई' ],
+ [ 'r', 'ी' ],
+ [ 'T', 'ऊ' ],
+ [ 't', 'ू' ],
+ [ 'Y', 'भ' ],
+ [ 'y', 'ब' ],
+ [ 'U', 'ङ' ],
+ [ 'u', 'ह' ],
+ [ 'I', 'घ' ],
+ [ 'i', 'ग' ],
+ [ 'O', 'ध' ],
+ [ 'o', 'द' ],
+ [ 'P', 'झ' ],
+ [ 'p', 'ज' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ञ' ],
+ [ '\\]', '़' ],
+ [ 'A', 'ओ' ],
+ [ 'a', 'ो' ],
+ [ 'S', 'ए' ],
+ [ 's', 'े' ],
+ [ 'D', 'अ' ],
+ [ 'd', '्' ],
+ [ 'F', 'इ' ],
+ [ 'f', 'ि' ],
+ [ 'G', 'उ' ],
+ [ 'g', 'ु' ],
+ [ 'H', 'फ' ],
+ [ 'h', 'प' ],
+ [ 'J', 'ऱ' ],
+ [ 'j', 'र' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'थ' ],
+ [ 'l', 'त' ],
+ [ ':', 'छ' ],
+ [ ';', 'च' ],
+ [ '"', 'ठ' ],
+ [ '\\\'', 'ट' ],
+ [ 'X', 'ँ' ],
+ [ 'x', 'ं' ],
+ [ 'C', 'ण' ],
+ [ 'c', 'म' ],
+ [ 'v', 'न' ],
+ [ 'b', 'व' ],
+ [ 'N', 'ळ' ],
+ [ 'n', 'ल' ],
+ [ 'M', 'श' ],
+ [ 'm', 'स' ],
+ [ '\\<', 'ष' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'य' ],
+ [ '\\%', 'ज्ञ' ],
+ [ '\\^', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ] ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '\\+', 'ॠ' ],
+ [ '\\=', 'ॄ' ],
+ [ 'e', '॑' ],
+ [ 'R', 'ॡ' ],
+ [ 'r', 'ॣ' ],
+ [ 'd', '॒' ],
+ [ 'F', 'ऌ' ],
+ [ 'f', 'ॢ' ],
+ [ 'X', 'ॐ' ],
+ [ 'x', 'ॱ' ],
+ [ ',', '॰' ],
+ [ '\\>', 'ऽ' ],
+ [ '\\.', '॥' ] ]
+ };
+
+ $.ime.register( neInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-rom.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-rom.js
new file mode 100644
index 00000000..2cbfdaa9
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-rom.js
@@ -0,0 +1,106 @@
+( function ( $ ) {
+ 'use strict';
+
+ var neRom = {
+ id: 'ne-rom',
+ name: 'Nepali Romanized',
+ description: 'Nepali Romanized keyboard layout',
+ date: '2013-02-12',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\!', '!' ],
+ [ '"', '"' ],
+ [ '\\#', '#' ],
+ [ '\\$', 'रु' ],
+ [ '\'', '\'' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '\\+', '+' ],
+ [ ',', ',' ],
+ [ '\\-', '-' ],
+ [ '\\.', '।' ],
+ [ '/', '्' ],
+ [ '0', '०' ],
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '3', '३' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '9', '९' ],
+ [ ':', ':' ],
+ [ ';', ';' ],
+ [ '\\<', 'ङ' ],
+ [ '\\=', '=' ],
+ [ '\\>', '॥' ],
+ [ '\\?', '?' ],
+ [ '\\@', '@' ],
+ [ 'A', 'आ' ],
+ [ 'B', 'भ' ],
+ [ 'C', 'च' ],
+ [ 'D', 'ध' ],
+ [ 'E', 'ै' ],
+ [ 'F', 'ऊ' ],
+ [ 'G', 'घ' ],
+ [ 'H', 'अ' ],
+ [ 'I', 'ी' ],
+ [ 'J', 'झ' ],
+ [ 'K', 'ख' ],
+ [ 'L', 'ळ' ],
+ [ 'M', 'ं' ],
+ [ 'N', 'ण' ],
+ [ 'O', 'ओ' ],
+ [ 'P', 'फ' ],
+ [ 'Q', 'ठ' ],
+ [ 'R', 'ृ' ],
+ [ 'S', 'श' ],
+ [ 'T', 'थ' ],
+ [ 'U', 'ू' ],
+ [ 'V', 'ँ' ],
+ [ 'W', 'औ' ],
+ [ 'X', 'ढ' ],
+ [ 'Y', 'ञ' ],
+ [ 'Z', 'ऋ' ],
+ [ '\\[', 'इ' ],
+ [ '\\\\', 'ॐ' ],
+ [ '\\]', 'ए' ],
+ [ '\\_', '_' ],
+ [ '`', '़' ],
+ [ 'a', 'ा' ],
+ [ 'b', 'ब' ],
+ [ 'c', 'छ' ],
+ [ 'd', 'द' ],
+ [ 'e', 'े' ],
+ [ 'f', 'उ' ],
+ [ 'g', 'ग' ],
+ [ 'h', 'ह' ],
+ [ 'i', 'ि' ],
+ [ 'j', 'ज' ],
+ [ 'k', 'क' ],
+ [ 'l', 'ल' ],
+ [ 'm', 'म' ],
+ [ 'n', 'न' ],
+ [ 'o', 'ो' ],
+ [ 'p', 'प' ],
+ [ 'q', 'ट' ],
+ [ 'r', 'र' ],
+ [ 's', 'स' ],
+ [ 't', 'त' ],
+ [ 'u', 'ु' ],
+ [ 'v', 'व' ],
+ [ 'w', 'ौ' ],
+ [ 'x', 'ड' ],
+ [ 'y', 'य' ],
+ [ 'z', 'ष' ],
+ [ '\\{', 'ई' ],
+ [ '\\|', 'ः' ],
+ [ '\\}', 'ऐ' ],
+ [ '\\~', 'ऽ' ] ]
+ };
+
+ $.ime.register( neRom );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-trad.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-trad.js
new file mode 100644
index 00000000..72ca6686
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-trad.js
@@ -0,0 +1,106 @@
+( function ( $ ) {
+ 'use strict';
+
+ var neTrad = {
+ id: 'ne-trad',
+ name: 'Nepali Traditional',
+ description: 'Nepali Traditional keyboard layout',
+ date: '2013-02-12',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '"', 'ू' ],
+ [ '\\#', 'घ' ],
+ [ '\'', 'ु' ],
+ [ '\\(', 'ढ' ],
+ [ '\\)', 'ण' ],
+ [ '\\+', 'ं' ],
+ [ ',', 'ऽ' ],
+ [ '\\-', 'औ' ],
+ [ '\\.', '।' ],
+ [ '/', 'र' ],
+ [ '0', '०' ],
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '3', '३' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '9', '९' ],
+ [ ';', 'स' ],
+ [ '\\<', 'ङ' ],
+ [ '\\=', '=' ],
+ [ '\\?', 'रु' ],
+ [ '\\@', 'ई' ],
+ [ 'A', 'आ' ],
+ [ 'B', 'ौ' ],
+ [ 'C', 'ऋ' ],
+ [ 'E', 'ऐ' ],
+ [ 'F', 'ँ' ],
+ [ 'H', 'झ' ],
+ [ 'J', 'ो' ],
+ [ 'K', 'फ' ],
+ [ 'L', 'ी' ],
+ [ 'O', 'इ' ],
+ [ 'P', 'ए' ],
+ [ 'U', 'ऊ' ],
+ [ 'V', 'ॐ' ],
+ [ '\\\\', '्' ],
+ [ '\\]', 'े' ],
+ [ '\\_', 'ओ' ],
+ [ '`', 'ञ' ],
+ [ 'a', 'ब' ],
+ [ 'b', 'द' ],
+ [ 'c', 'अ' ],
+ [ 'd', 'म' ],
+ [ 'e', 'भ' ],
+ [ 'f', 'ा' ],
+ [ 'g', 'न' ],
+ [ 'h', 'ज' ],
+ [ 'i', 'ष' ],
+ [ 'j', 'व' ],
+ [ 'k', 'प' ],
+ [ 'l', 'ि' ],
+ [ 'm', 'ः' ],
+ [ 'n', 'ल' ],
+ [ 'o', 'य' ],
+ [ 'p', 'उ' ],
+ [ 'r', 'च' ],
+ [ 's', 'क' ],
+ [ 't', 'त' ],
+ [ 'u', 'ग' ],
+ [ 'v', 'ख' ],
+ [ 'w', 'ध' ],
+ [ 'x', 'ह' ],
+ [ 'y', 'थ' ],
+ [ 'z', 'श' ],
+ [ '\\{', 'ृ' ],
+ [ '\\|', '|' ],
+ [ '\\}', 'ै' ],
+ [ '\\~', '॥' ],
+ [ '\\!', 'ज्ञ' ],
+ [ '\\$', 'द्ध' ],
+ [ ':', 'ट्ठ' ],
+ [ '\\>', 'श्र' ],
+ [ 'D', 'ङ्ग' ],
+ [ 'G', 'द्द' ],
+ [ 'I', 'क्ष' ],
+ [ 'M', 'ड्ड' ],
+ [ 'N', 'द्य' ],
+ [ 'Q', 'त्त' ],
+ [ 'R', 'द्ब' ],
+ [ 'S', 'ङ्क' ],
+ [ 'T', 'ट्ट' ],
+ [ 'W', 'ड्ढ' ],
+ [ 'X', 'ह्य' ],
+ [ 'Y', 'ठ्ठ' ],
+ [ 'Z', 'क्क' ],
+ [ '\\[', 'र्' ],
+ [ 'q', 'त्र' ] ]
+ };
+
+ $.ime.register( neTrad );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-transliteration.js
new file mode 100644
index 00000000..70cca143
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ne/ne-transliteration.js
@@ -0,0 +1,165 @@
+( function ( $ ) {
+ 'use strict';
+
+ var neTransliteration = {
+ id: 'ne-transliteration',
+ name: 'लिप्यंतरण',
+ description: 'Nepali transliteration',
+ date: '2012-10-14',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V ([[user:Junaidpv]]) and Bhawani Gautam ([[user:Bhawani Gautam]])',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 4,
+ maxKeyLength: 1,
+ patterns: [
+ [ 'क्h', 'c', 'च्' ],
+ [ '\\\\([A-Za-z\\>_~\\.0-9])', '\\\\', '$1' ],
+
+ [ '([क-ह]़?)्a', '$1' ],
+ [ '([क-ह]़?)्A', '$1ा' ],
+ [ '([क-ह]़?)a', '$1ा' ],
+ [ '([क-ह]़?)्i', '$1ि' ],
+ [ '([क-ह]़?)(्I|िi|ेe)', '$1ी' ],
+ [ '([क-ह]़?)्u', '$1ु' ],
+ [ '([क-ह]़?)(ुu|्U|ोo)', '$1ू' ],
+ [ '([क-ह]़?)्R', '$1ृ' ],
+ [ '([क-ह]़?)ृR', '$1ॄ' ],
+ [ '([क-ह]़?)्ळ्l', '$1ॢ' ],
+ [ '([क-ह]़?)ॢl', '$1ॣ' ],
+ [ '([क-ह]़?)ॆ\\^', '$1ॅ' ],
+ [ '([क-ह]़?)्e', '$1े' ],
+ [ '([क-ह]़?)्E', '$1े' ],
+ [ '([क-ह]़?)ॊ\\^', '$1ॉ' ],
+ [ '([क-ह]़?)i', '$1ै' ],
+ [ '([क-ह]़?)्o', '$1ो' ],
+ [ '([क-ह]़?)्O', '$1ो' ],
+ [ '([क-ह]़?)u', '$1ौ' ],
+ [ '([क-ह]़?)ृa', '$1्ऱ' ],
+ [ '([क-ह]़?)ृA', '$1्ऱा' ],
+ [ '([क-ह]़?)ृi', '$1्ऱि' ],
+ [ '([क-ह]़?)ृI', '$1्ऱी' ],
+ [ '([क-ह]़?)ृu', '$1्ऱु' ],
+ [ '([क-ह]़?)ृU', '$1्ऱू' ],
+ [ '([क-ह]़?)ृ\\^', '$1्ऱॅ' ],
+ [ '([क-ह]़?)ृe', '$1्ऱे' ],
+ [ '([क-ह]़?)ृE', '$1्ऱे' ],
+ [ '([क-ह]़?)ृo', '$1्ऱो' ],
+ [ '([क-ह]़?)ृO', '$1्ऱो' ],
+ [ '([क-ह]़?)ृ\\~', '$1्ऱ्' ],
+ [ '([क-ह])्\\`', '$1़्' ],
+
+ [ 'अa', 'आ' ],
+ [ '(ओo|उu)', 'ऊ' ],
+ [ 'ऎ\\^', 'ए' ],
+ [ 'अi', 'ऐ' ],
+ [ 'अ\\^', 'अ' ],
+ [ '(इi|एe)', 'ई' ],
+ [ 'ऒ\\^', 'ओ' ],
+ [ 'अu', 'औ' ],
+ [ 'र्र्r', '\u0930\u094D\u200D' ],
+ [ 'ड़्h', 'ढ्' ],
+ [ 'ऋR', 'ॠ' ],
+ [ 'ळ्l', 'ऌ' ],
+ [ 'ऌl', 'ॡ' ],
+ [ 'ं\\^', 'ँ' ],
+ [ 'ंM', 'ँ' ],
+ [ 'ओM', 'ॐ' ],
+ [ 'ड्D', 'ड्' ],
+ [ 'क्h', 'ख्' ],
+ [ 'ग्h', 'घ्' ],
+ [ 'G', 'ङ्' ],
+ [ 'च्h', 'छ्' ],
+ [ 'ज्h', 'झ्' ],
+ [ 'न्j', 'ञ्' ],
+ [ 'ट्h', 'ठ्' ],
+ [ 'ड्h', 'ढ्' ],
+ [ 'त्h', 'थ्' ],
+ [ 'द्h', 'ध्' ],
+ [ 'प्h', 'फ्' ],
+ [ 'ब्h', 'भ्' ],
+ [ 'ऋa', 'र' ],
+ [ 'ऋA', 'रा' ],
+ [ 'ऋi', 'रि' ],
+ [ 'ऋI', 'री' ],
+ [ 'ऋu', 'रु' ],
+ [ 'ऋU', 'रू' ],
+ [ 'ऋ\\^', 'ऋ' ],
+ [ 'ऋe', 'रे' ],
+ [ 'ऋE', 'रे' ],
+ [ 'ऋo', 'रो' ],
+ [ 'ऋO', 'रो' ],
+ [ 'ऋ\\~', 'र्' ],
+
+ [ 'स्h', 'श्' ],
+ [ 'श्h', 'ष्' ],
+ [ 'क़्h', 'ख्' ],
+ [ 'ज़्h', 'ऴ्' ],
+ [ '।\\.', '॥' ],
+
+ [ 'a', 'अ' ],
+ [ 'b', 'ब्' ],
+ [ 'c', 'क्' ],
+ [ 'd', 'द्' ],
+ [ 'e', 'ए' ],
+ [ '(f|F)', 'फ्' ],
+ [ 'g', 'ग्' ],
+ [ 'h', 'ह्' ],
+ [ 'i', 'इ' ],
+ [ 'j', 'ज्' ],
+ [ 'k', 'क्' ],
+ [ 'l', 'ल्' ],
+ [ 'm', 'म्' ],
+ [ 'n', 'न्' ],
+ [ 'o', 'ओ' ],
+ [ 'p', 'प्' ],
+ [ 'q', 'क़्' ],
+ [ 'r', 'र्' ],
+ [ 's', 'स्' ],
+ [ 't', 'त्' ],
+ [ 'u', 'उ' ],
+ [ 'v', 'भ्' ],
+ [ 'w', 'व्' ],
+ [ 'x', 'क्ष्' ],
+ [ 'y', 'य्' ],
+ [ '(z|Z)', 'ज़्' ],
+ [ 'A', 'आ' ],
+ [ 'B', 'ब्ब्' ],
+ [ 'C', 'क्क्' ],
+ [ 'D', 'ड्' ],
+ [ 'E', 'ए' ],
+ [ 'H', 'ः' ],
+ [ 'I', 'ई' ],
+ [ 'J', 'ज्ज्' ],
+ [ 'K', 'क्क्' ],
+ [ 'L', 'ळ्' ],
+ [ 'M', 'ं' ],
+ [ 'N', 'ण्' ],
+ [ 'O', 'ओ' ],
+ [ 'P', 'प्प्' ],
+ [ 'Q', 'अ' ],
+ [ 'R', 'ऋ' ],
+ [ 'S', 'श्' ],
+ [ 'T', 'ट्' ],
+ [ 'U', 'ऊ' ],
+ [ 'V', 'झ्' ],
+ [ 'W', 'औ' ],
+ [ 'X', 'क्ष्' ],
+ [ 'Y', 'य्य्' ],
+ [ '0', '०' ],
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '3', '३' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '9', '९' ],
+ [ '\\.', '।' ],
+ [ '//', 'ऽ' ],
+ [ '\\`', '्' ] ]
+ };
+
+ $.ime.register( neTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/nia/nia-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/nia/nia-tilde.js
new file mode 100644
index 00000000..1c717e05
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/nia/nia-tilde.js
@@ -0,0 +1,22 @@
+( function ( $ ) {
+ 'use strict';
+
+ var niaTilde = {
+ id: 'nia-tilde',
+ name: 'nia-tilde',
+ description: 'Nias tilde keyboard',
+ date: '2021-01-13',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1',
+ patterns: [
+ [ '~O', 'Ö' ],
+ [ '~o', 'ö' ],
+ [ '~W', 'Ŵ' ],
+ [ '~w', 'ŵ' ]
+ ]
+ };
+
+ $.ime.register( niaTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/nmz/nmz-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/nmz/nmz-tilde.js
new file mode 100644
index 00000000..513d3582
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/nmz/nmz-tilde.js
@@ -0,0 +1,29 @@
+( function ( $ ) {
+ 'use strict';
+
+ var nmzTilde = {
+ id: 'nmz-tilde',
+ name: 'nmz-tilde',
+ description: 'Nawdm tilde keyboard',
+ date: '2021-11-01',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~H', 'Ĥ' ],
+ [ '~h', 'ɦ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~:', '\u0308' ] // Combining diaeresis
+ ]
+ };
+
+ $.ime.register( nmzTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/nqo/nqo-standard-qwerty.js b/UniversalLanguageSelector/lib/jquery.ime/rules/nqo/nqo-standard-qwerty.js
new file mode 100644
index 00000000..fcc47bbb
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/nqo/nqo-standard-qwerty.js
@@ -0,0 +1,93 @@
+( function ( $ ) {
+ 'use strict';
+
+ var nqoStandardQwerty = {
+ id: 'nqo-standard-qwerty',
+ name: "N'Ko standard qwerty",
+ description: "N'Ko standard qwerty",
+ date: '2019-04-26',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 1,
+ patterns: [
+ [ '`', '߷' ],
+ [ '1', '߁' ],
+ [ '2', '߂' ],
+ [ '3', '߃' ],
+ [ '4', '߄' ],
+ [ '5', '߅' ],
+ [ '6', '߆' ],
+ [ '7', '߇' ],
+ [ '8', '߈' ],
+ [ '9', '߉' ],
+ [ '0', '߀' ],
+
+ [ 'Q', 'ߩ' ],
+ [ 'W', 'ߨ' ],
+ [ 'Y', 'ߚ' ],
+ [ 'I', '÷' ],
+ [ 'O', '×' ],
+ [ 'P', 'ߪ' ],
+
+ [ 'A', '߶' ],
+ [ 'D', '[' ],
+ [ 'F', ']' ],
+ [ 'G', '(' ],
+ [ 'H', ')' ],
+ [ 'J', 'ߺ' ],
+ [ 'L', '/' ],
+
+ [ 'Z', '\u07F3' ],
+ [ 'X', '\u07F1' ],
+ [ 'C', '\u07ED' ],
+ [ 'V', '\u07EE' ],
+ [ 'B', '\u07F0' ],
+ [ 'N', '\u07EF' ],
+ [ 'M', '߸' ], // Comma
+ [ '<', 'ߑ' ],
+ [ '\\?', '؟' ],
+
+ [ 'q', 'ߔ' ],
+ [ 'w', 'ߧ' ],
+ [ 'e', 'ߠ' ],
+ [ 'r', 'ߥ' ],
+ [ 't', 'ߦ' ],
+ [ 'y', 'ߙ' ],
+ [ 'u', 'ߗ' ],
+ [ 'i', 'ߜ' ],
+ [ 'o', 'ߢ' ],
+ [ 'p', 'ߡ' ],
+ [ '\\[', 'ߤ' ],
+ [ '\\]', 'ߒ' ],
+
+ [ 'a', 'ߏ' ],
+ [ 's', 'ߎ' ],
+ [ 'd', 'ߍ' ],
+ [ 'f', 'ߌ' ],
+ [ 'g', 'ߋ' ],
+ [ 'h', 'ߊ' ],
+ [ 'k', 'ߝ' ],
+ [ 'j', 'ߖ' ],
+ [ 'k', 'ߞ' ],
+ [ 'l', 'ߣ' ],
+ [ 'm', 'ߟ' ],
+ [ ';', 'ߕ' ],
+ [ "'", 'ߓ' ],
+
+ [ 'z', 'ߐ' ],
+ [ 'x', '\u07F2' ],
+ [ 'v', 'ߴ' ],
+ [ 'c', 'ߵ' ],
+ [ 'b', '\u07EC' ],
+ [ 'n', '\u07EB' ],
+ [ '!', '߹' ],
+ [ ',', 'ߛ' ],
+ [ '\\.', 'ߘ' ],
+ [ '/', 'ߞ' ]
+ ]
+ };
+
+ $.ime.register( nqoStandardQwerty );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/nqo/nqo-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/nqo/nqo-transliteration.js
new file mode 100644
index 00000000..4ceb8c0b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/nqo/nqo-transliteration.js
@@ -0,0 +1,102 @@
+( function ( $ ) {
+ 'use strict';
+
+ var nqoTransliteration = {
+ id: 'nqo-transliteration',
+ name: "N'Ko transliteration",
+ description: "N'Ko transliteration",
+ date: '2019-04-26',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 3,
+ patterns: [
+ // Sequences
+ [ 'ߣn', 'ߠ' ], // nn
+ [ 'ߢw', 'ߧ' ], // nyw
+ [ 'ߣy', 'ߢ' ], // ny
+ [
+ 'ߖ\\/',
+ 'ߨ'
+ ], // j/
+ [
+ 'ߗ\\/',
+ 'ߩ'
+ ], // c/
+ [
+ 'ߙ\\/',
+ 'ߪ'
+ ], // r/
+ [ '\u07F2\u07F2\\.', '߷' ], // ...
+ [ '\u07EB-', '-' ], // --
+ [ '\u07EC~', '~' ], // ~~
+ [ '\\\\\\?', '?' ], // \?
+ [ '\\?', '؟' ],
+
+ // Unshifted
+
+ [ '`', 'ߑ' ],
+ [ '1', '߁' ],
+ [ '2', '߂' ],
+ [ '3', '߃' ],
+ [ '4', '߄' ],
+ [ '5', '߅' ],
+ [ '6', '߆' ],
+ [ '7', '߇' ],
+ [ '8', '߈' ],
+ [ '9', '߉' ],
+ [ '0', '߀' ],
+
+ [ 'w', 'ߥ' ],
+ [ 'e', 'ߍ' ],
+ [ 'r', 'ߙ' ],
+ [ 't', 'ߕ' ],
+ [ 'y', 'ߦ' ],
+ [ 'u', 'ߎ' ],
+ [ 'i', 'ߌ' ],
+ [ 'o', 'ߐ' ],
+ [ 'p', 'ߔ' ],
+
+ [ 'a', 'ߊ' ],
+ [ 's', 'ߛ' ],
+ [ 'd', 'ߘ' ],
+ [ 'f', 'ߝ' ],
+ [ 'g', 'ߜ' ],
+ [ 'h', 'ߤ' ],
+ [ 'j', 'ߖ' ],
+ [ 'k', 'ߞ' ],
+ [ 'l', 'ߟ' ],
+
+ [ 'c', 'ߗ' ],
+ [ 'b', 'ߓ' ],
+ [ 'n', 'ߣ' ],
+ [ 'm', 'ߡ' ],
+
+ // Shifted
+
+ [ '~', '\u07EC' ],
+ [ '!', '߹' ],
+ [ '#', '\u07F0' ],
+ [ '%', '\u07F3' ],
+
+ [ 'E', 'ߋ' ],
+ [ 'R', 'ߚ' ],
+ [ 'O', 'ߏ' ],
+ [ 'N', 'ߒ' ],
+ [ '<', '\u07F1' ],
+ [ '>', '\u07EF' ],
+ [ '\u07EE\\.', '\u07ED' ], // ^.
+ [ '\\^', '\u07EE' ], // ^
+ [ '߸\\/', 'ߺ' ], // ,/
+ [ '\\.', '\u07F2' ], // Combining nasalization mark ("dot below")
+ [ ',', '߸' ], // Comma
+ [ '/', '߶' ],
+ [ "'", 'ߴ' ], // High tone apostrophe
+ [ '"', 'ߵ' ], // Low tone apostrophe
+ [ '-', '\u07EB' ] // Combining short high tone ("macron")
+ ]
+ };
+
+ $.ime.register( nqoTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/nso/nso-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/nso/nso-tilde.js
new file mode 100644
index 00000000..7942f4fb
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/nso/nso-tilde.js
@@ -0,0 +1,24 @@
+( function ( $ ) {
+ 'use strict';
+
+ var nsoTilde = {
+ id: 'nso-tilde',
+ name: 'nso-tilde',
+ description: 'Northern Sotho input keyboard',
+ date: '2018-12-02',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~S', 'Š' ],
+ [ '~s', 'š' ],
+ [ '~E', 'Ê' ],
+ [ '~e', 'ê' ],
+ [ '~O', 'Ô' ],
+ [ '~o', 'ô' ]
+ ]
+ };
+
+ $.ime.register( nsoTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/nus/nus-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/nus/nus-tilde.js
new file mode 100644
index 00000000..e2c6e8fc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/nus/nus-tilde.js
@@ -0,0 +1,28 @@
+( function ( $ ) {
+ 'use strict';
+
+ var nusTilde = {
+ id: 'nus-tilde',
+ name: 'nus-tilde',
+ description: 'Nuer input keyboard',
+ date: '2021-01-18',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~G', 'Ɣ' ],
+ [ '~g', 'ɣ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~:', '\u0308' ], // Combining diaeresis
+ [ '~_', '\u0331' ] // Combining macron below
+ ]
+ };
+
+ $.ime.register( nusTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ny/ny-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ny/ny-tilde.js
new file mode 100644
index 00000000..8e6720b9
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ny/ny-tilde.js
@@ -0,0 +1,21 @@
+( function ( $ ) {
+ 'use strict';
+
+ var nyTilde = {
+ id: 'ny-tilde',
+ name: 'ny-tilde',
+ description: 'Chichewa / Nyanja tilde keyboard',
+ date: '2022-06-16',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~W', 'Ŵ' ],
+ [ '~w', 'ŵ' ],
+ [ '~/', '\u0301' ] // Combining acute
+ ]
+ };
+
+ $.ime.register( nyTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-OdiScript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-OdiScript.js
new file mode 100644
index 00000000..280d8278
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-OdiScript.js
@@ -0,0 +1,115 @@
+( function ( $ ) {
+ 'use strict';
+
+ var orOdiScript = {
+ id: 'or-OdiScript',
+ name: 'ଓଡ଼ିସ୍କ୍ରିପ୍ଟ',
+ description: 'Odia OdiScript input method',
+ date: '2015-7-28',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Manoj Sahukar and Subhashish Panigrahi',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 6,
+ maxKeyLength: 4,
+ patterns: [
+ [ '/([A-Za-z\\>_\\-\\!@#\\$\\^\\&\\%\\*\\~\\.\\|\\\\0-9])', '$1' ],
+ [ '\'([\'])', '"' ], // '' to "
+ [ '"([\'])', '\'\'\'' ], // '''
+ [ '([କ-ହ]୍[କ-ହ])@@', 'ର୍$1' ], // reph
+ [ '([କ-ହ])@@', 'ର୍$1' ], // reph
+ [ '%%', 'ଙ୍କ' ], // Anka
+ [ '"', 'ଁ' ], // chanda bindu
+ [ '([ର])}', 'ର‍୍ୟ' ], // special case: Ja phala (ର + ZWJ + ୍ୟ)
+ [ '\\}', '୍ୟ' ], // Ja phala
+ [ '୍ ', '୍‌ ' ], // ending with halant+zwnj
+ [ '{', 'ୃ' ], // Ru kara
+ [ 'େk', 'ୋ' ], // l= ekar, lk = okar
+ [ 'ାl', 'ୋ' ], // l= ekar, kl = okar
+ [ 'େp', 'ୈ' ], //
+ [ 'ୈk', 'ୌ' ], //
+ [ '\\]', '୍ର' ], // Ra phala
+ [ '\\[', 'ଅ' ], // Type ଅ
+ [ 'ଅk', 'ଆ' ], // ଅ + ା = ଆ
+ [ 'ଓ##', 'ୱ' ],
+ [ '([ର])##', 'ର‍୍ୱ' ], // special case ର + ZWJ + ୍ୱ
+ [ '([କ-ହ])##', '$1୍ୱ' ], //
+ [ 'ଦQ', 'ହ' ],
+ [ '([କନପସମ])Q', 'ତ୍$1' ],
+ [ '([ଖଥଧ])Q', '$1ି' ],
+ [ '([ନସ])_', '$1୍ତ୍ର' ], // ନ୍ତ୍ର , ସ୍ତ୍ର
+ [ '\\$', 'କ୍ଷ' ],
+ [ '\\&&', 'ଏବଂ' ],
+ [ '\\^', 'ଋ' ],
+ [ '\\|', 'ଞ' ],
+ [ '\\\\', 'ୟ' ],
+ [ '<', 'ଏ' ],
+ [ '>', 'ଐ' ],
+ [ '0', '୦' ],
+ [ '1', '୧' ],
+ [ '2', '୨' ],
+ [ '3', '୩' ],
+ [ '4', '୪' ],
+ [ '5', '୫' ],
+ [ '6', '୬' ],
+ [ '7', '୭' ],
+ [ '8', '୮' ],
+ [ '9', '୯' ],
+ [ 'a', 'ମ' ],
+ [ 'A', 'ଢ଼' ],
+ [ 'b', 'ୁ' ],
+ [ 'B', 'ଉ' ],
+ [ 'c', 'ଜ' ],
+ [ 'C', 'ଝ' ],
+ [ 'd', '୍' ],
+ [ 'D', '‌' ], // zwnj
+ [ 'e', 'ନ' ],
+ [ 'E', 'ଡ଼' ],
+ [ 'f', 'ତ' ],
+ [ 'F', 'ଥ' ],
+ [ 'G', 'ଇ' ],
+ [ 'g', 'ି' ],
+ [ 'H', 'ଈ' ],
+ [ 'h', 'ୀ' ],
+ [ 'i', 'ଂ' ],
+ [ 'I', 'ଠ' ],
+ [ 'j', 'ର' ],
+ [ 'J', 'ଣ' ],
+ [ 'k', 'ା' ],
+ [ 'K', 'ଶ' ],
+ [ 'l', 'େ' ],
+ [ 'L', 'ଷ' ],
+ [ 'm', 'ଳ' ],
+ [ 'M', 'ଲ' ],
+ [ 'n', 'ୂ' ],
+ [ 'N', 'ଊ' ],
+ [ 'o', 'ହ' ],
+ [ 'O', 'ଡ' ],
+ [ 'p', 'ୈ' ],
+ [ 'P', 'ଢ' ],
+ [ 'q', 'ବ' ],
+ [ 'r', 'ଦ' ],
+ [ 'R', 'ଧ' ],
+ [ 's', 'କ' ],
+ [ 'S', 'ଖ' ],
+ [ 't', 'ସ' ],
+ [ 'T', 'ଓ' ],
+ [ 'u', 'ଯ' ],
+ [ 'U', 'ଟ' ],
+ [ 'v', 'ଚ' ],
+ [ 'V', 'ଛ' ],
+ [ 'w', 'ପ' ],
+ [ 'W', 'ଫ' ],
+ [ 'x', 'ଗ' ],
+ [ 'X', 'ଘ' ],
+ [ 'y', 'ୌ' ],
+ [ 'Y', 'ଔ' ],
+ [ 'z', 'ଭ' ],
+ [ 'Z', 'ଙ' ],
+ [ '`', '।' ],
+ [ '~', 'ଃ' ]
+ ]
+ };
+
+ $.ime.register( orOdiScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript.js
new file mode 100644
index 00000000..dba733a8
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript.js
@@ -0,0 +1,106 @@
+( function ( $ ) {
+ 'use strict';
+
+ var orInScript = {
+ id: 'or-inscript',
+ name: 'ଇନସ୍କ୍ରିପ୍ଟ',
+ description: 'InScript keyboard for Odia script',
+ date: '2012-10-14',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'X', '\u0B01' ],
+ [ 'x', '\u0B02' ],
+ [ '_', '\u0B03' ],
+ [ 'D', '\u0B05' ],
+ [ 'E', '\u0B06' ],
+ [ 'F', '\u0B07' ],
+ [ 'R', '\u0B08' ],
+ [ 'G', '\u0B09' ],
+ [ 'T', '\u0B0A' ],
+ [ '\\+', '\u0B0B' ],
+ [ 'S', '\u0B0F' ],
+ [ 'W', '\u0B10' ],
+ [ 'A', '\u0B13' ],
+ [ 'Q', '\u0B14' ],
+ [ 'k', '\u0B15' ],
+ [ 'K', '\u0B16' ],
+ [ 'i', '\u0B17' ],
+ [ 'I', '\u0B18' ],
+ [ 'U', '\u0B19' ],
+ [ ';', '\u0B1A' ],
+ [ '\\:', '\u0B1B' ],
+ [ 'p', '\u0B1C' ],
+ [ 'P', '\u0B1D' ],
+ [ '\\}', '\u0B1E' ],
+ [ '\'', '\u0B1F' ],
+ [ '"', '\u0B20' ],
+ [ '\\[', '\u0B21' ],
+ [ '\\{', '\u0B22' ],
+ [ 'C', '\u0B23' ],
+ [ 'l', '\u0B24' ],
+ [ 'L', '\u0B25' ],
+ [ 'o', '\u0B26' ],
+ [ 'O', '\u0B27' ],
+ [ 'v', '\u0B28' ],
+ [ 'h', '\u0B2A' ],
+ [ 'H', '\u0B2B' ],
+ [ 'y', '\u0B2C' ],
+ [ 'Y', '\u0B2D' ],
+ [ 'c', '\u0B2E' ],
+ [ '\\?', '\u0B2F' ],
+ [ 'j', '\u0B30' ],
+ [ 'n', '\u0B32' ],
+ [ 'N', '\u0B33' ],
+ [ 'M', '\u0B36' ],
+ [ '\\<', '\u0B37' ],
+ [ 'm', '\u0B38' ],
+ [ 'u', '\u0B39' ],
+ [ '\\]', '\u0B3C' ],
+ [ 'e', '\u0B3E' ],
+ [ 'f', '\u0B3F' ],
+ [ 'r', '\u0B40' ],
+ [ 'g', '\u0B41' ],
+ [ 't', '\u0B42' ],
+ [ '\\=', '\u0B43' ],
+ [ 's', '\u0B47' ],
+ [ 'w', '\u0B48' ],
+ [ 'a', '\u0B4B' ],
+ [ 'q', '\u0B4C' ],
+ [ 'd', '\u0B4D' ],
+ [ '/', '\u0B5F' ],
+ [ '\\>', '\u0964' ],
+ [ '0', '\u0B66' ],
+ [ '1', '\u0B67' ],
+ [ '2', '\u0B68' ],
+ [ '3', '\u0B69' ],
+ [ '4', '\u0B6A' ],
+ [ '5', '\u0B6B' ],
+ [ '6', '\u0B6C' ],
+ [ '7', '\u0B6D' ],
+ [ '8', '\u0B6E' ],
+ [ '9', '\u0B6F' ],
+ [ 'b', '\u0B71' ],
+ [ '\\(', '\u200D' ],
+ [ '\\)', '\u200C' ] ],
+
+ patterns_x: [
+ [ 'F', '\u0B0C' ],
+ [ 'b', '\u0B35' ],
+ [ '\\>', '\u0B3D' ],
+ [ '\\=', '\u0B44' ],
+ [ '\\[', '\u0B5C' ],
+ [ '\\{', '\u0B5D' ],
+ [ '\\+', '\u0B60' ],
+ [ 'R', '\u0B61' ],
+ [ 'f', '\u0B62' ],
+ [ 'r', '\u0B63' ],
+ [ '\\.', '\u0B65' ],
+ [ 'x', '\u0B70' ],
+ [ '\\$', '\u20B9' ] ]
+
+ };
+
+ $.ime.register( orInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript2.js
new file mode 100644
index 00000000..288c0aff
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript2.js
@@ -0,0 +1,116 @@
+( function ( $ ) {
+ 'use strict';
+
+ var orInScript2 = {
+ id: 'or-inscript2',
+ name: 'ଇନସ୍କ୍ରିପ୍ଟ2',
+ description: 'Enhanced InScript keyboard for Odia language',
+ date: '2013-02-09',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '୧' ],
+ [ '2', '୨' ],
+ [ '\\#', '୍ର' ],
+ [ '3', '୩' ],
+ [ '\\$', 'ର୍' ],
+ [ '4', '୪' ],
+ [ '5', '୫' ],
+ [ '6', '୬' ],
+ [ '7', '୭' ],
+ [ '8', '୮' ],
+ [ '\\(', '(' ],
+ [ '9', '୯' ],
+ [ '\\)', ')' ],
+ [ '0', '୦' ],
+ [ '\\_', 'ଃ' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ଋ' ],
+ [ '\\=', 'ୃ' ],
+ [ 'Q', 'ଔ' ],
+ [ 'q', 'ୌ' ],
+ [ 'W', 'ଐ' ],
+ [ 'w', 'ୈ' ],
+ [ 'E', 'ଆ' ],
+ [ 'e', 'ା' ],
+ [ 'R', 'ଈ' ],
+ [ 'r', 'ୀ' ],
+ [ 'T', 'ଊ' ],
+ [ 't', 'ୂ' ],
+ [ 'Y', 'ଭ' ],
+ [ 'y', 'ବ' ],
+ [ 'U', 'ଙ' ],
+ [ 'u', 'ହ' ],
+ [ 'I', 'ଘ' ],
+ [ 'i', 'ଗ' ],
+ [ 'O', 'ଧ' ],
+ [ 'o', 'ଦ' ],
+ [ 'P', 'ଝ' ],
+ [ 'p', 'ଜ' ],
+ [ '\\{', 'ଢ' ],
+ [ '\\[', 'ଡ' ],
+ [ '\\}', 'ଞ' ],
+ [ '\\]', '଼' ],
+ [ 'A', 'ଓ' ],
+ [ 'a', 'ୋ' ],
+ [ 'S', 'ଏ' ],
+ [ 's', 'େ' ],
+ [ 'D', 'ଅ' ],
+ [ 'd', '୍' ],
+ [ 'F', 'ଇ' ],
+ [ 'f', 'ି' ],
+ [ 'G', 'ଉ' ],
+ [ 'g', 'ୁ' ],
+ [ 'H', 'ଫ' ],
+ [ 'h', 'ପ' ],
+ [ 'j', 'ର' ],
+ [ 'K', 'ଖ' ],
+ [ 'k', 'କ' ],
+ [ 'L', 'ଥ' ],
+ [ 'l', 'ତ' ],
+ [ ':', 'ଛ' ],
+ [ ';', 'ଚ' ],
+ [ '"', 'ଠ' ],
+ [ '\'', 'ଟ' ],
+ [ 'X', 'ଁ' ],
+ [ 'x', 'ଂ' ],
+ [ 'C', 'ଣ' ],
+ [ 'c', 'ମ' ],
+ [ 'v', 'ନ' ],
+ [ 'b', 'ୱ' ],
+ [ 'N', 'ଳ' ],
+ [ 'n', 'ଲ' ],
+ [ 'M', 'ଶ' ],
+ [ 'm', 'ସ' ],
+ [ '\\<', 'ଷ' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '\\?', 'ଯ' ],
+ [ '/', 'ୟ' ],
+ [ '\\%', 'ଜ୍ଞ' ],
+ [ '\\^', 'ତ୍ର' ],
+ [ '\\&', 'କ୍ଷ' ],
+ [ '\\*', 'ଶ୍ର' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '\\+', 'ୠ' ],
+ [ '\\=', 'ୄ' ],
+ [ 'R', 'ୡ' ],
+ [ 'r', 'ୣ' ],
+ [ '\\{', 'ଢ଼' ],
+ [ '\\[', 'ଡ଼' ],
+ [ 'F', 'ଌ' ],
+ [ 'f', 'ୢ' ],
+ [ 'b', 'ଵ' ],
+ [ '\\>', 'ଽ' ],
+ [ '\\.', '॥' ],
+ [ 'x', '୰' ] ]
+ };
+
+ $.ime.register( orInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-lekhani.js b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-lekhani.js
new file mode 100644
index 00000000..a8b6ddf8
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-lekhani.js
@@ -0,0 +1,172 @@
+( function ( $ ) {
+ 'use strict';
+
+ var orLekhani = {
+ id: 'or-lekhani',
+ name: 'ଫୋନେଟିକ',
+ description: 'Odia Lekhani phonetic input method',
+ date: '2012-10-14',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V, Subhashish Panigrahi and Jnanaranjan Sahu',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 4,
+ maxKeyLength: 2,
+ patterns: [
+ [ '\\\\([A-Za-z\\>_~\\.0-9])', '\\\\', '$1' ],
+
+ [ '([କ-ହୟୱଡ଼ଢ଼ଙ୍କଙ୍ଖଙ୍ଗଙ୍ଘଞ୍ଚଞ୍ଛଞ୍ଝଣ୍ଟଣ୍ଠଣ୍ଡଣ୍ଢନ୍ତନ୍ଥନ୍ଦନ୍ଧମ୍ପମ୍ଫମ୍ବମ୍ଭଞ୍ଜ])a', '$1ା' ],
+ [ '([କ-ଳଲନ୍ଧଥଡ଼ଢ଼ହୟୱରକ୍ଷଶସଷଙ୍କଙ୍ଖଙ୍ଗଙ୍ଘଞ୍ଚଞ୍ଛଞ୍ଝଣ୍ଟଣ୍ଠଣ୍ଡଣ୍ଢନ୍ତନ୍ଥନ୍ଦନ୍ଧମ୍ପମ୍ଫମ୍ବମ୍ଭଞ୍ଜ])i', '$1\u0b3f' ],
+ [ '([କ-ହୟୱଡ଼ଢ଼ଙ୍କଙ୍ଖଙ୍ଗଙ୍ଘଞ୍ଚଞ୍ଛଞ୍ଝଣ୍ଟଣ୍ଠଣ୍ଡଣ୍ଢନ୍ତନ୍ଥନ୍ଦନ୍ଧମ୍ପମ୍ଫମ୍ବମ୍ଭଞ୍])I', '$1ୀ' ],
+ [ '([କ-ହୟୱଡ଼ଢ଼ଙ୍କଙ୍ଖଙ୍ଗଙ୍ଘଞ୍ଚଞ୍ଛଞ୍ଝଣ୍ଟଣ୍ଠଣ୍ଡଣ୍ଢନ୍ତନ୍ଥନ୍ଦନ୍ଧମ୍ପମ୍ଫମ୍ବମ୍ଭଞ୍])u', '$1\u0b41' ],
+ [ '([କ-ହୟୱ])(U|\u0b41u)', '$1\u0b42' ],
+ [ '([କ-ହୟୱ])R', '$1\u0b43' ],
+ [ '([କ-ହୟୱ])\u0b43R', '$1\u0b44' ],
+ [ '([କ-ହୟୱ])୍ଳ୍l', '$1ୢ' ],
+ [ '([କ-ହୟୱ])ୢl', '$1ୣ' ],
+ [ '([କ-ହୟୱଡ଼ଢ଼ଙ୍କଙ୍ଖଙ୍ଗଙ୍ଘଞ୍ଚଞ୍ଛଞ୍ଝଣ୍ଟଣ୍ଠଣ୍ଡଣ୍ଢନ୍ତନ୍ଥନ୍ଦନ୍ଧମ୍ପମ୍ଫମ୍ବମ୍ଭଞ୍])e', '$1େ' ],
+ [ '([କ-ହୟୱଡ଼ଢ଼ଙ୍କଙ୍ଖଙ୍ଗଙ୍ଘଞ୍ଚଞ୍ଛଞ୍ଝଣ୍ଟଣ୍ଠଣ୍ଡଣ୍ଢନ୍ତନ୍ଥନ୍ଦନ୍ଧମ୍ପମ୍ଫମ୍ବମ୍ଭଞ୍])o', '$1ୋ' ],
+ [ '([କ-ହୟୱଡ଼ଢ଼ଙ୍କଙ୍ଖଙ୍ଗଙ୍ଘଞ୍ଚଞ୍ଛଞ୍ଝଣ୍ଟଣ୍ଠଣ୍ଡଣ୍ଢନ୍ତନ୍ଥନ୍ଦନ୍ଧମ୍ପମ୍ଫମ୍ବମ୍ଭଞ୍])(ାu|ୋu)', '$1ୌ' ],
+ [ '([କ-ହୟୱ])E', '$1\u0B48' ],
+ [ '([କ-ହୟୱ])(w|v)', '$1୍ୱ' ],
+ [ '([କ-ହୟୱ])~', '$1\u200C' ],
+
+ [ '([କ-ହୱ])y', '$1୍ୟ' ], // <consonant>y
+
+ [ 'z', '୍' ], // halanta
+ [ '\\.', '।' ], // purnacheda
+ [ 'ଅa', 'ଆ' ],
+ [ 'ଏe', 'ଐ' ],
+ [ '(ଅu|O)', 'ଔ' ],
+ [ 'ଋR', 'ୠ' ], // RR
+ [ 'ଳl', 'ଌ' ], // Ll
+ [ 'ଌl', 'ୡ' ], // Lll
+ [ 'ଞ୍ଚh', 'ଞ୍ଛ' ], // nch
+ [ 'ଞ୍ଜh', 'ଞ୍ଝ' ], // njh
+ [ 'ଙ୍କh', 'ଙ୍ଖ' ], // nkh
+ [ 'ଙ୍ଗh', 'ଙ୍ଘ' ], // ngh
+ [ 'ମ୍ବh', 'ମ୍ଭ' ], // mbh or nbh
+ [ 'ଣ୍ଡai', 'ଣ୍ଡାଇ' ], // NDai
+ [ 'ଜ୍ଜh', 'ଜ୍ଝ' ], // jjh
+ [ 'ଚ୍ଚh', 'ଚ୍ଛ' ], // cch
+
+ [ 'ଣG', 'ଙ' ], // NG
+ [ 'ଣg', 'ଞ' ], // Ng
+ [ 'କh', 'ଖ' ], // kh
+ [ 'ଗh', 'ଘ' ], // gh
+ [ 'ନc', 'ଞ୍ଚ' ], // nc
+ [ 'ନg', 'ଙ୍ଗ' ], // ng
+ [ 'ଚh', 'ଛ' ], // ch
+ [ 'C', 'ଛ' ], // ch
+ [ 'ଜh', 'ଝ' ], // jh
+ [ 'ନj', 'ଞ୍ଜ' ], // nj
+ [ 'ନk', 'ଙ୍କ' ], // nk
+ [ 'ନd', 'ନ୍ଦ' ], // nd
+ [ 'ନD|ଣD', 'ଣ୍ଡ' ], // nd
+ [ 'ଣDh', 'ଣ୍ଢ' ], // ndh
+ [ 'ନdh', 'ନ୍ଧ' ], // ndht
+ [ 'ଟh', 'ଠ' ], // Th
+ [ 'ଡh', 'ଢ' ], // Dh
+ [ 'ତh', 'ଥ' ], // th
+ [ 'ଦh', 'ଧ' ], // dh
+ [ '(f|ପh|P)', 'ଫ' ], // ph or f
+ [ 'ବh', 'ଭ' ], // bh
+ [ 'ସh', 'ଷ' ], // sh
+ [ 'ମb', 'ମ୍ବ' ], // mb or nb
+ [ 'ଣT', 'ଣ୍ଟ' ], // NT
+ [ 'ଣTh', 'ଣ୍ଠ' ], // NTh
+ [ '(ଷ|ମ)p', '$1୍ପ' ], // sp/shp
+ [ 'shp', 'ଷ୍ପ' ], // sp
+ [ 'ଂM', 'ଁ' ], // MM
+
+ [ 'କk', 'କ୍କ' ], // kk
+ [ 'ଗg', 'ଗ୍ଗ' ], // gg
+ [ 'ଚc', 'ଚ୍ଚ' ], // cc
+ [ 'ଜj', 'ଜ୍ଜ' ], // jj
+ [ 'ଦd', 'ଦ୍ଦ' ], // dd
+ [ 'ଟT', 'ଟ୍ଟ' ], // TT
+ [ 'ଡD', 'ଡ୍ଡ' ], // DD
+ [ 'ତt', 'ତ୍ତ' ], // tt
+ [ 'ଲl', 'ଲ୍ଲ' ], // ll
+ [ 'ପp', 'ପ୍ପ' ], // pp
+ [ '_', '\u200c' ],
+
+ [ 'ଆ\\\\', '\u0B3E' ], // aa sign
+ [ 'ଇ\\\\', '\u0B3F' ], // i sign
+ [ 'ଈ\\\\', '\u0B40' ], // I sign
+ [ 'ଉ\\\\', '\u0B41' ], // u sign
+ [ 'ଉ\\\\', '\u0B42' ], // U sign
+ [ 'ଋ\\\\', '\u0B43' ], // R sign
+ [ 'ୠ\\\\', '\u0B44' ], // RR sign
+ [ 'ଌ\\\\', '\u0B62' ], // L sign
+ [ 'ୡ\\\\', '\u0B63' ], // LL sign
+ [ 'ଏ\\\\', '\u0B47' ], // e sign
+ [ 'ଐ\\\\', '\u0B48' ], // ai sign
+ [ 'ଓ\\\\', '\u0B4B' ], // o sign
+ [ 'ଔ\\\\', '\u0B4C' ], // au sign
+
+ [ '\u200c?a', 'ଅ' ],
+ [ 'b', 'ବ' ],
+ [ 'c', '', 'ଚ' ],
+ [ 'd', 'ଦ' ],
+ [ '\u200c?e', 'ଏ' ],
+ [ 'g', 'ଗ' ],
+ [ 'G', 'ଘ' ],
+ [ 'h', 'ହ' ],
+ [ '\u200c?i', 'ଇ' ],
+ [ 'j', 'ଜ' ],
+ [ 'k', 'କ' ],
+ [ 'l', 'ଲ' ],
+ [ 'm', 'ମ' ],
+ [ 'n', 'ନ' ],
+ [ '\u200c?o', 'ଓ' ],
+ [ 'p', 'ପ' ],
+ [ 'q', 'ଡ଼' ],
+ [ 'r', 'ର' ],
+ [ 's', 'ସ' ],
+ [ 't', 'ତ' ],
+ [ '\u200c?u', 'ଉ' ],
+ [ '[vwVW]', 'ୱ' ],
+ [ 'x', 'କ୍ଷ' ],
+ [ '[Y]', 'ୟ' ],
+ [ '[y]', 'ଯ' ],
+ [ '\u200c?A', 'ଆ' ],
+ [ 'B', 'ବ' ],
+ [ 'C', 'ଛ' ],
+ [ 'D', 'ଡ' ],
+ [ '\u200c?E', 'ଐ' ],
+ [ 'F', 'ଫ' ],
+ [ 'G', 'ଗ' ],
+ [ 'H', 'ଃ' ],
+ [ '\u200c?I', 'ଈ' ],
+ [ 'J', 'ଯ' ],
+ [ 'K', 'ଖ' ],
+ [ 'L', 'ଳ' ],
+ [ 'M', 'ଂ' ],
+ [ 'N', 'ଣ' ],
+ [ '\u200c?O', 'ଔ' ],
+ [ 'P', 'ଫ' ],
+ [ 'Q', 'ଢ଼' ],
+ [ 'R', 'ଋ' ],
+ [ 'S', 'ଶ' ],
+ [ 'T', 'ଟ' ],
+ [ '\u200c?U', 'ଊ' ],
+ [ 'X', 'ଁ' ],
+ [ 'Z', 'ଜ୍ଞ' ],
+ [ '//', '୍ର' ],
+
+ [ '0', '୦' ],
+ [ '1', '୧' ],
+ [ '2', '୨' ],
+ [ '3', '୩' ],
+ [ '4', '୪' ],
+ [ '5', '୫' ],
+ [ '6', '୬' ],
+ [ '7', '୭' ],
+ [ '8', '୮' ],
+ [ '9', '୯' ]
+ ]
+ };
+
+ $.ime.register( orLekhani );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-phonetic.js b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-phonetic.js
new file mode 100644
index 00000000..ce4e93fd
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-phonetic.js
@@ -0,0 +1,110 @@
+( function ( $ ) {
+ 'use strict';
+
+ var orPhonetic = {
+ id: 'or-phonetic',
+ name: 'ଫୋନେଟିକ',
+ description: 'Phonetic keyboard for Odia script',
+ date: '2013-02-09',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\~', 'ଐ' ],
+ [ '\\`', ' ୈ' ],
+ [ '\\!', 'ଏ' ],
+ [ '1', '୧' ],
+ [ '\\@', '@' ],
+ [ '2', '୨' ],
+ [ '\\#', 'ତ୍ର' ],
+ [ '3', '୩' ],
+ [ '\\$', '$' ],
+ [ '4', '୪' ],
+ [ '\\%', 'ଞ' ],
+ [ '5', '୫' ],
+ [ '6', '୬' ],
+ [ '7', '୭' ],
+ [ '8', '୮' ],
+ [ '\\(', '(' ],
+ [ '9', '୯' ],
+ [ '\\)', ')' ],
+ [ '0', '୦' ],
+ [ '\\_', '_' ],
+ [ '\\-', '-' ],
+ [ '\\+', '+' ],
+ [ '\\=', '=' ],
+ [ 'Q', 'ଔ' ],
+ [ 'q', 'ଓ' ],
+ [ 'W', 'ଠ' ],
+ [ 'w', 'ଟ' ],
+ [ 'E', 'ୈ' ],
+ [ 'e', 'େ' ],
+ [ 'R', 'ୃ ' ],
+ [ 'r', 'ର' ],
+ [ 'T', 'ଥ' ],
+ [ 't', 'ତ' ],
+ [ 'Y', 'ୟ' ],
+ [ 'y', 'ଯ' ],
+ [ 'U', 'ୂ' ],
+ [ 'u', 'ୁ' ],
+ [ 'I', 'ୀ' ],
+ [ 'i', 'ି' ],
+ [ 'O', 'ୌ' ],
+ [ 'o', 'ୋ' ],
+ [ 'P', 'ଫ' ],
+ [ 'p', 'ପ' ],
+ [ '\\{', 'ଢ' ],
+ [ '\\[', 'ଡ' ],
+ [ '\\}', 'ର୍' ],
+ [ '\\]', 'ଋ' ],
+ [ 'A', 'ଆ' ],
+ [ 'a', 'ା' ],
+ [ 'S', 'ଶ' ],
+ [ 's', 'ସ' ],
+ [ 'D', 'ଧ' ],
+ [ 'd', 'ଦ' ],
+ [ 'F', 'ଅ' ],
+ [ 'f', '୍' ],
+ [ 'G', 'ଘ' ],
+ [ 'g', 'ଗ' ],
+ [ 'H', 'ଃ' ],
+ [ 'h', 'ହ' ],
+ [ 'J', 'ଝ' ],
+ [ 'j', 'ଜ' ],
+ [ 'K', 'ଖ' ],
+ [ 'k', 'କ' ],
+ [ 'L', 'ଳ' ],
+ [ 'l', 'ଲ' ],
+ [ ':', 'ଈ' ],
+ [ ';', 'ଇ' ],
+ [ '"', 'ଊ' ],
+ [ '\'', 'ଉ' ],
+ [ '\\|', '|' ],
+ [ '\\\\', '\\' ],
+ [ 'Z', 'ଁ' ],
+ [ 'z', 'ଙ' ],
+ [ 'x', 'ଷ' ],
+ [ 'C', 'ଛ' ],
+ [ 'c', 'ଚ' ],
+ [ 'V', 'ଵ' ],
+ [ 'v', 'ୱ' ],
+ [ 'B', 'ଭ' ],
+ [ 'b', 'ବ' ],
+ [ 'N', 'ଣ' ],
+ [ 'n', 'ନ' ],
+ [ 'M', 'ଂ' ],
+ [ 'm', 'ମ' ],
+ [ '\\<', '<' ],
+ [ ',', ',' ],
+ [ '\\>', '>' ],
+ [ '\\.', '।' ],
+ [ '\\?', 'ଐ' ],
+ [ '/', 'ଏ' ],
+ [ '\\^', 'ଜ୍ଞ' ],
+ [ 'X', 'କ୍ଷ' ],
+ [ '\\*', 'ଶ୍ର' ] ]
+ };
+
+ $.ime.register( orPhonetic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-transliteration.js
new file mode 100644
index 00000000..8972a4dd
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-transliteration.js
@@ -0,0 +1,149 @@
+( function ( $ ) {
+ 'use strict';
+
+ var orTransliteration = {
+ id: 'or-transliteration',
+ name: 'ଟ୍ରାନ୍ସଲିଟରେସନ',
+ description: 'Odia Transliteration',
+ date: '2012-10-14',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V, Subhashish Panigrahi and Shitikantha Dash',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 4,
+ maxKeyLength: 2,
+ patterns: [
+ [ '\\\\([A-Za-z\\>_~\\.0-9])', '\\\\', '$1' ],
+
+ [ 'ଞ୍ଜ୍h', 'ଞ୍ଝ୍' ], // njh
+ [ 'ଙ୍ଗ୍h', 'ଙ୍ଘ୍' ], // ngh
+ [ '୍z', '଼୍' ],
+
+ [ '([କ-ହୟୱ\u0B3C])୍a', '$1' ],
+ [ '([କ-ହୟୱ\u0B3C])(a|୍A)', '$1ା' ],
+ [ '([କ-ହୟୱ\u0B3C])୍i', '$1\u0b3f' ],
+ [ '([କ-ହୟୱ\u0B3C])୍I', '$1ୀ' ],
+ [ '([କ-ହୟୱ\u0B3C])୍u', '$1\u0b41' ],
+ [ '([କ-ହୟୱ\u0B3C])(୍U|\u0b41u)', '$1\u0b42' ],
+ [ '([କ-ହୟୱ\u0B3C])୍R', '$1\u0b43' ],
+ [ '([କ-ହୟୱ\u0B3C])\u0b43R', '$1\u0b44' ],
+ [ '([କ-ହୟୱ\u0B3C])୍ଳ୍l', '$1ୢ' ],
+ [ '([କ-ହୟୱ\u0B3C])ୢl', '$1ୣ' ],
+ [ '([କ-ହୟୱ\u0B3C])୍e', '$1େ' ],
+ [ '([କ-ହୟୱ\u0B3C])i', '$1ୈ' ],
+ [ '([କ-ହୟୱ\u0B3C])୍o', '$1ୋ' ],
+ [ '([କ-ହୟୱ\u0B3C])u', '$1ୌ' ],
+ // [ '([କ-ହୟୱ\u0B3C])ୋu', '$1ୌ' ],
+ [ '([କ-ହୟୱ\u0B3C])୍E', '$1\u0B48' ],
+
+ [ 'ଅa', 'ଆ' ], // a
+ [ '(ଅi|ଏe)', 'ଐ' ], // ai
+ [ '(ଓo|ଓO)', 'ଔ' ], // ou
+ [ 'ଋR', 'ୠ' ], // ru
+ [ 'ଳ୍l', 'ଌ' ], // lu
+ [ 'ଌl', 'ୡ' ], // llu
+ [ 'ଞ୍ଚ୍h', 'ଞ୍ଛ୍' ], // nch
+
+ [ 'ଣ୍G', 'ଙ୍' ], // NG
+ [ 'ଣ୍g', 'ଞ୍' ], // Ng
+ [ 'କ୍h', 'ଖ୍' ], // kh
+ [ 'ଗ୍h', 'ଘ୍' ], // gh
+ [ 'ନ୍c', 'ଞ୍ଚ୍' ], // nc
+ [ 'ନ୍g', 'ଙ୍ଗ୍' ], // ng
+ [ 'ଚ୍h', 'ଛ୍' ], // ch
+ [ 'ଜ୍h', 'ଝ୍' ], // jh
+ [ 'ନ୍j', 'ଞ୍ଜ୍' ], // nj
+ [ 'ନ୍k', 'ଙ୍କ୍' ], // nk
+ [ 'ଟ୍h', 'ଠ୍' ], // halanta
+ [ 'ଡ୍h', 'ଢ୍' ], // Dh
+ [ 'ତ୍h', 'ଥ୍' ], // th
+ [ 'ଦ୍h', 'ଧ୍' ], // dh
+ [ 'ପ୍h', 'ଫ୍' ], // ph
+ [ 'ବ୍h', 'ଭ୍' ], // bh
+ [ 'ସ୍h', 'ଷ୍' ], // sh
+ [ '।Z', '॥' ],
+
+ [ 'ଆ\\\\', '\u0B3E' ], // aa sign
+ [ 'ଇ\\\\', '\u0B3F' ], // i sign
+ [ 'ଈ\\\\', '\u0B40' ], // I sign
+ [ 'ଉ\\\\', '\u0B41' ], // u sign
+ [ 'ଉ\\\\', '\u0B42' ], // U sign
+ [ 'ଋ\\\\', '\u0B43' ], // R sign
+ [ 'ୠ\\\\', '\u0B44' ], // RR sign
+ [ 'ଌ\\\\', '\u0B62' ], // L sign
+ [ 'ୡ\\\\', '\u0B63' ], // LL sign
+ [ 'ଏ\\\\', '\u0B47' ], // e sign
+ [ 'ଐ\\\\', '\u0B48' ], // ai sign
+ [ 'ଓ\\\\', '\u0B4B' ], // o sign
+ [ 'ଔ\\\\', '\u0B4C' ], // au sign
+
+ [ '\u200c?a', 'ଅ' ],
+ [ 'b', 'ବ୍' ],
+ [ 'c', '', 'ଚ୍' ],
+ [ 'd', 'ଦ୍' ],
+ [ '\u200c?e', 'ଏ' ],
+ [ 'f', 'ଫ୍' ],
+ [ 'g', 'ଗ୍' ],
+ [ 'h', 'ହ୍' ],
+ [ '\u200c?i', 'ଇ' ],
+ [ 'j', 'ଜ୍' ],
+ [ 'k', 'କ୍' ],
+ [ 'l', 'ଲ୍' ],
+ [ 'm', 'ମ୍' ],
+ [ 'n', 'ନ୍' ],
+ [ '\u200c?o', 'ଓ' ],
+ [ 'p', 'ପ୍' ],
+ [ 'q', 'ଜ୍ଞ୍' ],
+ [ 'r', 'ର୍' ],
+ [ 'ର୍y', 'ର‍୍ୟ' ],
+ [ 's', 'ସ୍' ],
+ [ 't', 'ତ୍' ],
+ [ '\u200c?u', 'ଉ' ],
+ [ 'v', 'ୱ୍' ],
+ [ 'w', 'ୱ୍' ],
+ [ 'x', 'କ୍ଷ୍' ],
+ [ 'y', 'ୟ୍' ],
+ [ 'z', '\u0B3C' ],
+ [ '\u200c?A', 'ଆ' ],
+ [ 'B', 'ବ୍' ],
+ [ 'C', 'ଛ୍' ],
+ [ 'D', 'ଡ୍' ],
+ [ '\u200c?E', 'ଐ' ],
+ [ 'F', 'ଫ୍' ],
+ [ 'G', 'ଗ୍' ],
+ [ 'H', '', 'ଃ' ],
+ [ '\u200c?I', 'ଈ' ],
+ [ 'J', 'ଝ୍' ],
+ [ 'K', 'କ୍' ],
+ [ 'L', 'ଳ୍' ],
+ [ 'M', '', 'ଂ' ],
+ [ 'N', 'ଣ୍' ],
+ [ '\u200c?O', 'ଔ' ],
+ [ 'P', 'ଫ୍' ],
+ [ 'Q', 'ଜ୍ଞ୍' ],
+ [ 'R', 'ଋ' ],
+ [ 'S', 'ଶ୍' ],
+ [ 'T', 'ଟ୍' ],
+ [ '\u200c?U', 'ଊ' ],
+ [ 'V', 'ଵ୍' ],
+ [ 'W', 'ଵ୍ଵ୍' ],
+ [ 'X', 'ଁ' ],
+ [ 'Y', 'ଯ୍' ],
+ [ '\\.', '।' ],
+ [ '\\~', '', '୍' ],
+ [ '//', 'ଽ' ],
+ [ '_', '\u200c' ],
+ [ '0', '୦' ],
+ [ '1', '୧' ],
+ [ '2', '୨' ],
+ [ '3', '୩' ],
+ [ '4', '୪' ],
+ [ '5', '୫' ],
+ [ '6', '୬' ],
+ [ '7', '୭' ],
+ [ '8', '୮' ],
+ [ '9', '୯' ] ]
+ };
+
+ $.ime.register( orTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-inscript.js
new file mode 100644
index 00000000..3ab2f559
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-inscript.js
@@ -0,0 +1,97 @@
+( function ( $ ) {
+ 'use strict';
+
+ var paInScript = {
+ id: 'pa-inscript',
+ name: 'Punjabi InScript',
+ description: 'InScript keyboard for Punjabi script',
+ date: '2012-10-16',
+ author: '',
+ license: '',
+ version: '1.0',
+ patterns: [
+ [ '1', '੧' ],
+ [ '2', '੨' ],
+ [ '3', '੩' ],
+ [ '4', '੪' ],
+ [ '5', '੫' ],
+ [ '6', '੬' ],
+ [ '7', '੭' ],
+ [ '8', '੮' ],
+ [ '9', '੯' ],
+ [ '0', '੦' ],
+ [ '\\_', '_' ],
+ [ '\\-', '-' ],
+ [ '\\+', '+' ],
+ [ '\\=', '=' ],
+ [ 'Q', 'ਔ' ],
+ [ 'q', 'ੌ' ],
+ [ 'W', 'ਐ' ],
+ [ 'w', 'ੈ' ],
+ [ 'E', 'ਆ' ],
+ [ 'e', 'ਾ' ],
+ [ 'R', 'ਈ' ],
+ [ 'r', 'ੀ' ],
+ [ 'T', 'ਊ' ],
+ [ 't', 'ੂ' ],
+ [ 'Y', 'ਭ' ],
+ [ 'y', 'ਬ' ],
+ [ 'U', 'ਙ' ],
+ [ 'u', 'ਹ' ],
+ [ 'I', 'ਘ' ],
+ [ 'i', 'ਗ' ],
+ [ 'O', 'ਧ' ],
+ [ 'o', 'ਦ' ],
+ [ 'P', 'ਝ' ],
+ [ 'p', 'ਜ' ],
+ [ '\\{', 'ਢ' ],
+ [ '\\[', 'ਡ' ],
+ [ '\\}', 'ਞ' ],
+ [ '\\]', '਼' ],
+ [ 'A', 'ਓ' ],
+ [ 'a', 'ੋ' ],
+ [ 'S', 'ਏ' ],
+ [ 's', 'ੇ' ],
+ [ 'D', 'ਅ' ],
+ [ 'd', '੍' ],
+ [ 'F', 'ਇ' ],
+ [ 'f', 'ਿ' ],
+ [ 'G', 'ਉ' ],
+ [ 'g', 'ੁ' ],
+ [ 'H', 'ਫ' ],
+ [ 'h', 'ਪ' ],
+ [ 'J', 'ੜ' ],
+ [ 'j', 'ਰ' ],
+ [ 'K', 'ਖ' ],
+ [ 'k', 'ਕ' ],
+ [ 'L', 'ਥ' ],
+ [ 'l', 'ਤ' ],
+ [ '\\:', 'ਛ' ],
+ [ '\\;', 'ਚ' ],
+ [ '"', 'ਠ' ],
+ [ '\'', 'ਟ' ],
+ [ 'Z', 'ੱ' ],
+ [ 'z', 'ੰ' ],
+ [ 'X', 'ਫ਼' ],
+ [ 'x', 'ਜ਼' ],
+ [ 'C', 'ਣ' ],
+ [ 'c', 'ਮ' ],
+ [ 'V', 'ਂ' ],
+ [ 'v', 'ਨ' ],
+ [ 'B', 'ਞ' ],
+ [ 'b', 'ਵ' ],
+ [ 'N', 'ਲ਼' ],
+ [ 'n', 'ਲ' ],
+ [ 'M', 'ਸ਼' ],
+ [ 'm', 'ਸ' ],
+ [ '\\<', 'ੳ' ],
+ [ ',', ',' ],
+ [ '\\>', 'ੲ' ],
+ [ '\\.', '.' ],
+ [ '\\?', '?' ],
+ [ '/', 'ਯ' ] ]
+
+ };
+
+ $.ime.register( paInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-inscript2.js
new file mode 100644
index 00000000..709cc5fc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-inscript2.js
@@ -0,0 +1,111 @@
+( function ( $ ) {
+ 'use strict';
+
+ var paInScript2 = {
+ id: 'pa-inscript2',
+ name: 'Punjabi InScript2',
+ description: 'Enhanced InScript keyboard for Punjabi script',
+ date: '2013-11-14',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '੧' ],
+ [ '2', '੨' ],
+ [ '3', '੩' ],
+ [ '4', '੪' ],
+ [ '5', '੫' ],
+ [ '6', '੬' ],
+ [ '7', '੭' ],
+ [ '8', '੮' ],
+ [ '9', '੯' ],
+ [ '0', '੦' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '\\_', 'ਃ' ],
+ [ '\\-', '-' ],
+ [ 'Q', 'ਔ' ],
+ [ 'q', 'ੌ' ],
+ [ 'W', 'ਐ' ],
+ [ 'w', 'ੈ' ],
+ [ 'E', 'ਆ' ],
+ [ 'e', 'ਾ' ],
+ [ 'R', 'ਈ' ],
+ [ 'r', 'ੀ' ],
+ [ 'T', 'ਊ' ],
+ [ 't', 'ੂ' ],
+ [ 'Y', 'ਭ' ],
+ [ 'y', 'ਬ' ],
+ [ 'U', 'ਙ' ],
+ [ 'u', 'ਹ' ],
+ [ 'I', 'ਘ' ],
+ [ 'i', 'ਗ' ],
+ [ 'O', 'ਧ' ],
+ [ 'o', 'ਦ' ],
+ [ 'P', 'ਝ' ],
+ [ 'p', 'ਜ' ],
+ [ '\\{', 'ਢ' ],
+ [ '\\[', 'ਡ' ],
+ [ '\\}', 'ਞ' ],
+ [ '\\]', '਼' ],
+ [ 'A', 'ਓ' ],
+ [ 'a', 'ੋ' ],
+ [ 'S', 'ਏ' ],
+ [ 's', 'ੇ' ],
+ [ 'D', 'ਅ' ],
+ [ 'd', '੍' ],
+ [ 'F', 'ਇ' ],
+ [ 'f', 'ਿ' ],
+ [ 'G', 'ਉ' ],
+ [ 'g', 'ੁ' ],
+ [ 'H', 'ਫ' ],
+ [ 'h', 'ਪ' ],
+ [ 'J', 'ੜ' ],
+ [ 'j', 'ਰ' ],
+ [ 'K', 'ਖ' ],
+ [ 'k', 'ਕ' ],
+ [ 'L', 'ਥ' ],
+ [ 'l', 'ਤ' ],
+ [ ':', 'ਛ' ],
+ [ ';', 'ਚ' ],
+ [ '"', 'ਠ' ],
+ [ '\\\'', 'ਟ' ],
+ [ 'X', 'ਂ' ],
+ [ 'x', 'ੰ' ],
+ [ 'C', 'ਣ' ],
+ [ 'c', 'ਮ' ],
+ [ 'v', 'ਨ' ],
+ [ 'B', 'ਞ' ],
+ [ 'b', 'ਵ' ],
+ [ 'N', 'N' ],
+ [ 'n', 'ਲ' ],
+ [ 'M', 'ਸ਼' ],
+ [ 'm', 'ਸ' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'ਯ' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ 'i', 'ਗ਼' ],
+ [ 'p', 'ਜ਼' ],
+ [ '\\[', 'ੜ' ],
+ [ 'D', '☬' ],
+ [ 'd', 'ੑ' ],
+ [ 'F', 'ੲ' ],
+ [ 'G', 'ੳ' ],
+ [ 'H', 'ਫ਼' ],
+ [ 'K', 'ਖ਼' ],
+ [ 'X', 'ੴ' ],
+ [ 'x', 'ਁ' ],
+ [ 'N', 'ਲ਼' ],
+ [ '\\.', '॥' ],
+ [ '/', 'ੵ' ]
+ ]
+ };
+
+ $.ime.register( paInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-jhelum.js b/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-jhelum.js
new file mode 100644
index 00000000..45f47294
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-jhelum.js
@@ -0,0 +1,131 @@
+( function ( $ ) {
+ 'use strict';
+
+ var paJhelum = {
+ id: 'pa-jhelum',
+ name: 'Punjabi Jhelum',
+ description: 'Jhelum keyboard for Punjabi script',
+ date: '2013-11-14',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\~', '~' ],
+ [ '\\`', '`' ],
+ [ '\\!', '!' ],
+ [ '1', '1' ],
+ [ '\\@', '@' ],
+ [ '2', '2' ],
+ [ '\\#', '#' ],
+ [ '3', '3' ],
+ [ '\\$', '$' ],
+ [ '4', '4' ],
+ [ '\\%', '%' ],
+ [ '5', '5' ],
+ [ '\\^', 'ੳ' ],
+ [ '6', '6' ],
+ [ '\\&', 'ੲ' ],
+ [ '7', '7' ],
+ [ '8', '8' ],
+ [ '\\(', '(' ],
+ [ '9', '9' ],
+ [ '\\)', ')' ],
+ [ '0', '0' ],
+ [ '\\_', '_' ],
+ [ '\\-', '-' ],
+ [ '\\+', '+' ],
+ [ '\\=', '=' ],
+ [ 'Q', 'ਔ' ],
+ [ 'q', 'ੌ' ],
+ [ 'W', 'ਐ' ],
+ [ 'w', 'ੈ' ],
+ [ 'E', 'ਆ' ],
+ [ 'e', 'ਾ' ],
+ [ 'R', 'ਈ' ],
+ [ 'r', 'ੀ' ],
+ [ 'T', 'ਊ' ],
+ [ 't', 'ੂ' ],
+ [ 'Y', 'ੜ' ],
+ [ 'y', 'ਰ' ],
+ [ 'U', 'ਧ' ],
+ [ 'u', 'ਦ' ],
+ [ 'I', 'ਘ' ],
+ [ 'i', 'ਗ' ],
+ [ 'O', 'ਟ' ],
+ [ 'o', 'ਤ' ],
+ [ 'P', 'ਫ' ],
+ [ 'p', 'ਪ' ],
+ [ '\\{', 'ਢ' ],
+ [ '\\[', 'ਡ' ],
+ [ '\\}', 'ਞ' ],
+ [ '\\]', 'ਙ' ],
+ [ 'A', 'ਓ' ],
+ [ 'a', 'ੋ' ],
+ [ 'S', 'ਏ' ],
+ [ 's', 'ੇ' ],
+ [ 'D', 'ਅ' ],
+ [ 'd', '੍' ],
+ [ 'F', 'ਇ' ],
+ [ 'f', 'ਿ' ],
+ [ 'G', 'ਉ' ],
+ [ 'g', 'ੁ' ],
+ [ 'H', 'ਠ' ],
+ [ 'h', 'ਹ' ],
+ [ 'J', 'ਝ' ],
+ [ 'j', 'ਜ' ],
+ [ 'K', 'ਖ' ],
+ [ 'k', 'ਕ' ],
+ [ 'L', 'ਥ' ],
+ [ 'l', 'ਲ' ],
+ [ ':', ':' ],
+ [ ';', 'ਸ' ],
+ [ '"', '"' ],
+ [ '\\\'', '\'' ],
+ [ '\\|', '।' ],
+ [ '\\', '\\' ],
+ [ 'Z', '਼' ],
+ [ 'z', 'ੱ' ],
+ [ 'X', 'ੰ' ],
+ [ 'x', 'ਂ' ],
+ [ 'C', 'ਛ' ],
+ [ 'c', 'ਚ' ],
+ [ 'V', 'ਯ' ],
+ [ 'v', 'ਵ' ],
+ [ 'B', 'ਭ' ],
+ [ 'b', 'ਬ' ],
+ [ 'N', 'ਣ' ],
+ [ 'n', 'ਨ' ],
+ [ 'M', 'ਠ' ],
+ [ 'm', 'ਮ' ],
+ [ '\\<', '<' ],
+ [ ',', ',' ],
+ [ '\\>', '>' ],
+ [ '\\.', '.' ],
+ [ '\\?', '?' ],
+ [ '/', '/' ],
+ [ '\\*', '*' ]
+ ],
+ patterns_x: [
+ [ '1', '੧' ],
+ [ '2', '੨' ],
+ [ '3', '੩' ],
+ [ '4', '੪' ],
+ [ '5', '੫' ],
+ [ '6', '੬' ],
+ [ '7', '੭' ],
+ [ '8', '੮' ],
+ [ '9', '੯' ],
+ [ '0', '੦' ],
+ [ 'y', '੍ਰ' ],
+ [ 'i', 'ਗ਼' ],
+ [ 'P', 'ਫ਼' ],
+ [ 'h', '੍ਹ' ],
+ [ 'j', 'ਜ਼' ],
+ [ 'K', 'ਖ਼' ],
+ [ 'l', 'ਲ਼' ],
+ [ ';', 'ਸ਼' ]
+ ]
+ };
+
+ $.ime.register( paJhelum );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-phonetic.js b/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-phonetic.js
new file mode 100644
index 00000000..16223731
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-phonetic.js
@@ -0,0 +1,98 @@
+( function ( $ ) {
+ 'use strict';
+
+ var paPhonetic = {
+ id: 'pa-phonetic',
+ name: 'Punjabi Phonetic',
+ description: 'Punjabi Phonetic',
+ date: '2022-08-08',
+ URL: 'https://fedoraproject.org/wiki/I18N/Indic/PunjabiKeyboardLayouts',
+ author: '',
+ license: '',
+ version: '2.0',
+ patterns: [
+ [ '!', '੧' ],
+ [ '1', '1' ],
+ [ '@', '੨' ],
+ [ '2', '2' ],
+ [ '#', '੩' ],
+ [ '3', '3' ],
+ [ '\\$', '੪' ],
+ [ '4', '4' ],
+ [ '5', '5' ],
+ [ '6', '6' ],
+ [ '7', '7' ],
+ [ '8', '8' ],
+ [ '\\(', '੯' ],
+ [ '9', '9' ],
+ [ '\\)', '੦' ],
+ [ '0', '0' ],
+ [ 'Q', 'ਥ' ],
+ [ 'q', 'ਤ' ],
+ [ 'w', 'ਾ' ],
+ [ 'E', 'ਓ' ],
+ [ 'e', 'ੲ' ],
+ [ 'r', 'ਰ' ],
+ [ 'T', 'ਠ' ],
+ [ 't', 'ਟ' ],
+ [ 'Y', 'ੈ' ],
+ [ 'y', 'ੇ' ],
+ [ 'U', 'ੂ' ],
+ [ 'u', 'ੁ' ],
+ [ 'I', 'ੀ' ],
+ [ 'i', 'ਿ' ],
+ [ 'O', 'ੌ' ],
+ [ 'o', 'ੋ' ],
+ [ 'P', 'ਫ' ],
+ [ 'p', 'ਪ' ],
+ [ '\\|', '।' ],
+ [ '\\\\', 'ਙ' ],
+ [ 'A', 'ਅ' ],
+ [ 'a', 'ੳ' ],
+ [ 'S', 'ਸ਼' ],
+ [ 's', 'ਸ' ],
+ [ 'D', 'ਧ' ],
+ [ 'd', 'ਦ' ],
+ [ 'F', 'ਢ' ],
+ [ 'f', 'ਡ' ],
+ [ 'G', 'ਘ' ],
+ [ 'g', 'ਗ' ],
+ [ 'h', 'ਹ' ],
+ [ 'J', 'ਝ' ],
+ [ 'j', 'ਜ' ],
+ [ 'K', 'ਖ' ],
+ [ 'k', 'ਕ' ],
+ [ 'L', 'ਲ਼' ],
+ [ 'l', 'ਲ' ],
+ [ '\\~', 'ੱ' ],
+ [ '\\`', '੍' ],
+ [ 'Z', 'ਗ਼' ],
+ [ 'z', 'ਜ਼' ],
+ [ 'X', 'ਯ' ],
+ [ 'x', 'ਣ' ],
+ [ 'C', 'ਛ' ],
+ [ 'c', 'ਚ' ],
+ [ 'V', 'ੜ' ],
+ [ 'v', 'ਵ' ],
+ [ 'B', 'ਭ' ],
+ [ 'b', 'ਬ' ],
+ [ 'N', 'ਂ' ],
+ [ 'n', 'ਨ' ],
+ [ 'M', 'ੰ' ],
+ [ 'm', 'ਮ' ],
+ [ '\\<', 'ਖ਼' ],
+ [ '\\>', 'ੴ' ],
+ [ '\\.', '਼' ],
+ [ '\\?', '?' ],
+ [ '\\/', 'ਞ' ],
+ [ '%', '੫' ],
+ [ '\\^', '੬' ],
+ [ '&', '੭' ],
+ [ '\\*', '੮' ],
+ [ 'R', '੍ਰ' ],
+ [ 'H', '੍ਹ' ],
+ [ 'W', 'ਾਂ' ] ]
+ };
+
+ $.ime.register( paPhonetic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-transliteration.js
new file mode 100644
index 00000000..33bbf4f1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/pa/pa-transliteration.js
@@ -0,0 +1,119 @@
+( function ( $ ) {
+ 'use strict';
+
+ var paTransliteration = {
+ id: 'pa-transliteration',
+ name: 'Punjabi Transliteration',
+ description: 'Punjabi transliteration',
+ date: '2012-10-16',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni, inputs from Saurabh Choudhary and Surinder Wadhawan',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 2,
+ maxKeyLength: 4,
+ /* Semi-automatically created from the Hindi transliteration mapping using
+ * the following Perl substitution:
+ * s{(?<deva_letter>[ऀ-ॿ])}{chr(ord($+{deva_letter}) + 0x100)}xmsge;
+ */
+ patterns: [
+ [ 'ਕ੍h', 'c', 'ਚ੍' ],
+ [ '\\\\([A-Za-z\\>_~\\.0-9])', '\\\\', '$1' ],
+
+ // ਕ-ਹ is the main range of Indic letters.
+ // ੜ is an additional unique Gurmukhi letter.
+ [ '([ਕ-ਹੜ]਼?)੍a', '$1' ], // Short [a] after a consonant with virama removes the virama
+ [ '([ਕ-ਹੜ]਼?)੍A', '$1ਾ' ], // Long [a] after a consonant with virama removes the virama and adds long [a]
+ [ '([ਕ-ਹੜ]਼?)a', '$1ਾ' ], // 'aa' gives long [a] - short [a] after a consonant without virama adds long [a]
+ [ '([ਕ-ਹੜ]਼?)੍i', '$1ਿ' ],
+ [ '([ਕ-ਹੜ]਼?)(ਿi|੍I|ੇe)', '$1ੀ' ], // 'ii', 'I' and 'ee' give long [i].
+ [ '([ਕ-ਹੜ]਼?)੍u', '$1ੁ' ],
+ [ '([ਕ-ਹੜ]਼?)(ੁu|੍U|ੋo)', '$1ੂ' ], // 'uu', 'U' and 'oo' give long [u].
+ [ '([ਕ-ਹੜ]਼?)੍e', '$1ੇ' ],
+ [ '([ਕ-ਹੜ]਼?)(i|੍E)', '$1ੈ' ], // 'i' after a consonant without virama or 'E' after a consonant with Virama gives "ai"
+ [ '([ਕ-ਹੜ]਼?)੍[oO]', '$1ੋ' ],
+ [ '([ਕ-ਹੜ]਼?)u', '$1ੌ' ], // 'u' after a consonant without virama gives "au"
+ [ '([ਕ-ਹੜ])੍\\`', '$1਼੍' ], // '`' (backtick) after a consonant with virama adds a nukta before the virama
+
+ [ 'ਅa', 'ਆ' ], // aa
+ [ '(ਓo|ਉu)', 'ਊ' ], // oo, uu
+ [ 'ਅi', 'ਐ' ], // ai
+ [ 'ਅ\\^', 'ੲ' ], // a^ (iri - base for vowels)
+ [ 'ਉ\\^', 'ੳ' ], // u^ (ura - base for vowels)
+ [ '(ਏe|ਇi)', 'ਈ' ], // ee, ii
+ [ 'ਅu', 'ਔ' ], // au
+ [ 'ਂ[Mm^]', 'ਁ' ], // bindi + 'm', 'M', or '^' -> Adak bindi
+ [ 'ਣ੍N', 'ੰ' ], // Tippi - nasalization
+
+ [ 'ਕ੍h', 'ਖ੍' ], // kh
+ [ 'ਗ੍h', 'ਘ੍' ], // gh
+ [ 'ਨ੍g', 'ਙ੍' ], // ng
+ [ 'ਚ੍h', 'ਛ੍' ], // ch
+ [ 'ਜ੍h', 'ਝ੍' ], // jh
+ [ 'ਨ੍j', 'ਞ੍' ], // nj
+ [ 'ਟ੍h', 'ਠ੍' ], // Th
+ [ 'ਡ੍h', 'ਢ੍' ], // Dh
+ [ 'ਤ੍h', 'ਥ੍' ], // th
+ [ 'ਦ੍h', 'ਧ੍' ], // dh
+ [ 'ਪ੍h', 'ਫ੍' ], // ph
+ [ 'ਬ੍h', 'ਭ੍' ], // bh
+
+ [ 'ਸ੍h', 'ਸ਼੍' ], // sh
+ [ 'ਕ਼੍h', 'ਖ਼੍' ], // k + nukta + h
+
+ [ 'a', 'ਅ' ],
+ [ 'b', 'ਬ੍' ],
+ [ 'c', 'ਚ੍' ],
+ [ 'd', 'ਦ੍' ],
+ [ 'e', 'ਏ' ],
+ [ 'f', 'ਫ੍' ],
+ [ 'F', 'ਫ਼੍' ], // With nukta
+ [ 'g', 'ਗ੍' ],
+ [ 'h', 'ਹ੍' ],
+ [ 'i', 'ਇ' ],
+ [ 'j', 'ਜ੍' ],
+ [ 'k', 'ਕ੍' ],
+ [ 'l', 'ਲ੍' ],
+ [ 'm', 'ਮ੍' ],
+ [ 'n', 'ਨ੍' ],
+ [ 'o', 'ਓ' ],
+ [ 'p', 'ਪ੍' ],
+ [ 'q', 'ੑ' ], // Udaat
+ [ 'r', 'ਰ੍' ],
+ [ 's', 'ਸ੍' ],
+ [ 't', 'ਤ੍' ],
+ [ 'u', 'ਉ' ],
+ [ '(v|w)', 'ਵ੍' ],
+ [ 'y', 'ਯ੍' ],
+ [ 'z', 'ੱ' ], // Addak - gemination
+ [ 'A', 'ਆ' ],
+ [ 'D', 'ਡ੍' ],
+ [ 'H', 'ਃ' ], // Visarga
+ [ 'I', 'ਈ' ],
+ [ 'M', 'ਂ' ], // Bindi
+ [ 'N', 'ਣ੍' ],
+ [ 'R', 'ੜ੍' ], // Rra
+ [ 'S', 'ਸ਼੍' ],
+ [ 'T', 'ਟ੍' ],
+ [ 'U', 'ਊ' ],
+ [ 'X', 'ੴ' ], // Ek onkar
+ [ 'Y', 'ੵ' ], // Yakash
+ [ '0', '੦' ],
+ [ '1', '੧' ],
+ [ '2', '੨' ],
+ [ '3', '੩' ],
+ [ '4', '੪' ],
+ [ '5', '੫' ],
+ [ '6', '੬' ],
+ [ '7', '੭' ],
+ [ '8', '੮' ],
+ [ '9', '੯' ],
+ [ '~', '੍' ], // Virama
+ [ '\\`', '਼' ], // Nukta
+
+ [ '।\\.', '॥' ], // Double danda, must be before single danda
+ [ '\\.', '।' ] ] // Danda
+ };
+
+ $.ime.register( paTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/pms/pms.js b/UniversalLanguageSelector/lib/jquery.ime/rules/pms/pms.js
new file mode 100644
index 00000000..c4023574
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/pms/pms.js
@@ -0,0 +1,38 @@
+( function ( $ ) {
+ 'use strict';
+
+ var pms = {
+ id: 'pms',
+ name: 'Piemontèis',
+ description: 'Piedmontese input method.',
+ date: '2014-02-27',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'pms.wiki community',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 1,
+ patterns: [
+ [ ':e', 'ë' ],
+ [ ',o', 'ó' ],
+ [ '\\\\A', 'À' ],
+ [ '\\\\E', 'È' ],
+ [ '\\\\I', 'Ì' ],
+ [ '\\\\O', 'Ò' ],
+ [ '\\\\U', 'Ù' ],
+ [ ',E', 'É' ],
+ [ ':E', 'Ë' ],
+ [ ',O', 'Ó' ],
+ [ '\\^g', 'ĝ' ],
+ [ '\\^l', 'l̂' ],
+ [ '\\^r', 'r̂' ],
+ [ ':a', 'ä' ],
+ [ '\\^G', 'Ĝ' ],
+ [ '\\^L', 'L̂' ],
+ [ '\\^R', 'R̂' ],
+ [ ':A', 'Ä' ]
+ ]
+ };
+
+ $.ime.register( pms );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/roa-tara/roa-tara.js b/UniversalLanguageSelector/lib/jquery.ime/rules/roa-tara/roa-tara.js
new file mode 100644
index 00000000..acfe869f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/roa-tara/roa-tara.js
@@ -0,0 +1,24 @@
+( function ( $ ) {
+ 'use strict';
+
+ var roaTara = {
+ id: 'roa-tara-GVU',
+ name: 'Tarandine',
+ description: 'Tarandine input method.',
+ date: '2013-09-01',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'roa-tara.wiki community',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ 'a§', 'á' ],
+ [ 'o§', 'ó' ],
+ [ 'A§', 'Á' ],
+ [ 'O§', 'Ó' ]
+ ]
+ };
+
+ $.ime.register( roaTara );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-jcuken.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-jcuken.js
new file mode 100644
index 00000000..18509262
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-jcuken.js
@@ -0,0 +1,96 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ruJcuken = {
+ id: 'ru-jcuken',
+ name: 'Русский - ЙЦУКЕН',
+ description: 'Стандартная русская раскладка',
+ date: '2012-10-16',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Amir (Алексей) Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', 'Й' ],
+ [ 'W', 'Ц' ],
+ [ 'E', 'У' ],
+ [ 'R', 'К' ],
+ [ 'T', 'Е' ],
+ [ 'Y', 'Н' ],
+ [ 'U', 'Г' ],
+ [ 'I', 'Ш' ],
+ [ 'O', 'Щ' ],
+ [ 'P', 'З' ],
+ [ '{', 'Х' ],
+ [ '}', 'Ъ' ],
+ [ 'A', 'Ф' ],
+ [ 'S', 'Ы' ],
+ [ 'D', 'В' ],
+ [ 'F', 'А' ],
+ [ 'G', 'П' ],
+ [ 'H', 'Р' ],
+ [ 'J', 'О' ],
+ [ 'K', 'Л' ],
+ [ 'L', 'Д' ],
+ [ ':', 'Ж' ],
+ [ '"', 'Э' ],
+ [ 'Z', 'Я' ],
+ [ 'X', 'Ч' ],
+ [ 'C', 'С' ],
+ [ 'V', 'М' ],
+ [ 'B', 'И' ],
+ [ 'N', 'Т' ],
+ [ 'M', 'Ь' ],
+ [ '<', 'Б' ],
+ [ '>', 'Ю' ],
+ [ '\\?', ',' ],
+
+ [ 'q', 'й' ],
+ [ 'w', 'ц' ],
+ [ 'e', 'у' ],
+ [ 'r', 'к' ],
+ [ 't', 'е' ],
+ [ 'y', 'н' ],
+ [ 'u', 'г' ],
+ [ 'i', 'ш' ],
+ [ 'o', 'щ' ],
+ [ 'p', 'з' ],
+ [ '\\[', 'х' ],
+ [ '\\]', 'ъ' ],
+ [ 'a', 'ф' ],
+ [ 's', 'ы' ],
+ [ 'd', 'в' ],
+ [ 'f', 'а' ],
+ [ 'g', 'п' ],
+ [ 'h', 'р' ],
+ [ 'j', 'о' ],
+ [ 'k', 'л' ],
+ [ 'l', 'д' ],
+ [ ';', 'ж' ],
+ [ '\'', 'э' ],
+ [ 'z', 'я' ],
+ [ 'x', 'ч' ],
+ [ 'c', 'с' ],
+ [ 'v', 'м' ],
+ [ 'b', 'и' ],
+ [ 'n', 'т' ],
+ [ 'm', 'ь' ],
+ [ ',', 'б' ],
+ [ '\\.', 'ю' ],
+ [ '/', '.' ],
+
+ [ '`', 'ё' ],
+ [ '~', 'Ё' ],
+
+ // ! is the same // 1
+ [ '@', '"' ], // 2
+ [ '#', '№' ], // 3
+ [ '\\$', ';' ], // 4
+ // '%' is the same // 5
+ [ '^', ':' ], // 6
+ [ '&', '?' ] ] // 7
+ // '*', '(' and ')' are the same // 8, 9, 0
+ };
+
+ $.ime.register( ruJcuken );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-kbd.js
new file mode 100644
index 00000000..82f3860a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-kbd.js
@@ -0,0 +1,100 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ruKbd = {
+ id: 'ru-kbd',
+ name: 'Russian kbd',
+ description: 'Russian kbd keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', 'ё' ],
+ [ 'q', 'й' ],
+ [ 'w', 'ц' ],
+ [ 'e', 'у' ],
+ [ 'r', 'к' ],
+ [ 't', 'е' ],
+ [ 'y', 'н' ],
+ [ 'u', 'г' ],
+ [ 'i', 'ш' ],
+ [ 'o', 'щ' ],
+ [ 'p', 'з' ],
+ [ '\\[', 'х' ],
+ [ '\\]', 'ъ' ],
+ [ 'a', 'ф' ],
+ [ 's', 'ы' ],
+ [ 'd', 'в' ],
+ [ 'f', 'а' ],
+ [ 'g', 'п' ],
+ [ 'h', 'р' ],
+ [ 'j', 'о' ],
+ [ 'k', 'л' ],
+ [ 'l', 'д' ],
+ [ ';', 'ж' ],
+ [ '\'', 'э' ],
+ [ '\\\\', '\\' ],
+ [ 'z', 'я' ],
+ [ 'x', 'ч' ],
+ [ 'c', 'с' ],
+ [ 'v', 'м' ],
+ [ 'b', 'и' ],
+ [ 'n', 'т' ],
+ [ 'm', 'ь' ],
+ [ ',', 'б' ],
+ [ '\\.', 'ю' ],
+ [ '/', '.' ],
+ [ '\\!', '!' ],
+ [ '\\@', '"' ],
+ [ '\\#', '№' ],
+ [ '\\$', ';' ],
+ [ '\\%', '%' ],
+ [ '\\^', ':' ],
+ [ '\\&', '?' ],
+ [ '\\*', '*' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '\\_', '_' ],
+ [ '\\+', '+' ],
+ [ '\\~', 'Ё' ],
+ [ 'Q', 'Й' ],
+ [ 'W', 'Ц' ],
+ [ 'E', 'У' ],
+ [ 'R', 'К' ],
+ [ 'T', 'Е' ],
+ [ 'Y', 'Н' ],
+ [ 'U', 'Г' ],
+ [ 'I', 'Ш' ],
+ [ 'O', 'Щ' ],
+ [ 'P', 'З' ],
+ [ '\\{', 'Х' ],
+ [ '\\}', 'Ъ' ],
+ [ 'A', 'Ф' ],
+ [ 'S', 'Ы' ],
+ [ 'D', 'В' ],
+ [ 'F', 'А' ],
+ [ 'G', 'П' ],
+ [ 'H', 'Р' ],
+ [ 'J', 'О' ],
+ [ 'K', 'Л' ],
+ [ 'L', 'Д' ],
+ [ ':', 'Ж' ],
+ [ '"', 'Э' ],
+ [ '\\|', '|' ],
+ [ 'Z', 'Я' ],
+ [ 'X', 'Ч' ],
+ [ 'C', 'С' ],
+ [ 'V', 'М' ],
+ [ 'B', 'И' ],
+ [ 'N', 'Т' ],
+ [ 'M', 'Ь' ],
+ [ '\\<', 'Б' ],
+ [ '\\>', 'Ю' ],
+ [ '\\?', ',' ]
+ ]
+ };
+
+ $.ime.register( ruKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-phonetic.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-phonetic.js
new file mode 100644
index 00000000..4df95642
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-phonetic.js
@@ -0,0 +1,83 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ruPhonetic = {
+ id: 'ru-phonetic',
+ name: 'Russian phonetic',
+ description: 'Russian phonetic keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\\#', 'ё' ],
+ [ '\\$', 'Ё' ],
+ [ '\\%', 'ъ' ],
+ [ '\\^', 'Ъ' ],
+ [ '\\=', 'ч' ],
+ [ '\\+', 'Ч' ],
+ [ '`', 'ю' ],
+ [ '\\~', 'Ю' ],
+ [ 'q', 'я' ],
+ [ 'Q', 'Я' ],
+ [ 'w', 'в' ],
+ [ 'W', 'В' ],
+ [ 'e', 'е' ],
+ [ 'E', 'Е' ],
+ [ 'r', 'р' ],
+ [ 'R', 'Р' ],
+ [ 't', 'т' ],
+ [ 'T', 'Т' ],
+ [ 'y', 'ы' ],
+ [ 'Y', 'Ы' ],
+ [ 'u', 'у' ],
+ [ 'U', 'У' ],
+ [ 'i', 'и' ],
+ [ 'I', 'И' ],
+ [ 'o', 'о' ],
+ [ 'O', 'О' ],
+ [ 'p', 'п' ],
+ [ 'P', 'П' ],
+ [ '\\[', 'ш' ],
+ [ '\\{', 'Ш' ],
+ [ '\\]', 'щ' ],
+ [ '\\}', 'Щ' ],
+ [ 'a', 'а' ],
+ [ 'A', 'А' ],
+ [ 's', 'с' ],
+ [ 'S', 'С' ],
+ [ 'd', 'д' ],
+ [ 'D', 'Д' ],
+ [ 'f', 'ф' ],
+ [ 'F', 'Ф' ],
+ [ 'g', 'г' ],
+ [ 'G', 'Г' ],
+ [ 'h', 'х' ],
+ [ 'H', 'Х' ],
+ [ 'j', 'й' ],
+ [ 'J', 'Й' ],
+ [ 'k', 'к' ],
+ [ 'K', 'К' ],
+ [ 'l', 'л' ],
+ [ 'L', 'Л' ],
+ [ '\\\\', 'э' ],
+ [ '\\|', 'Э' ],
+ [ 'z', 'з' ],
+ [ 'Z', 'З' ],
+ [ 'x', 'ь' ],
+ [ 'X', 'Ь' ],
+ [ 'c', 'ц' ],
+ [ 'C', 'Ц' ],
+ [ 'v', 'ж' ],
+ [ 'V', 'Ж' ],
+ [ 'b', 'б' ],
+ [ 'B', 'Б' ],
+ [ 'n', 'н' ],
+ [ 'N', 'Н' ],
+ [ 'm', 'м' ],
+ [ 'M', 'М' ] ]
+ };
+
+ $.ime.register( ruPhonetic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-yawerty.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-yawerty.js
new file mode 100644
index 00000000..e4b6ada2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ru/ru-yawerty.js
@@ -0,0 +1,109 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ruYawerty = {
+ id: 'ru-yawerty',
+ name: 'Russian YAWERTY',
+ description: 'Russian YAWERTY keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '/q', 'ђ' ],
+ [ '/w', 'ѓ' ],
+ [ '/e', 'є' ],
+ [ '/r', 'ѕ' ],
+ [ '/t', 'і' ],
+ [ '/y', 'ї' ],
+ [ '/u', 'ј' ],
+ [ '/i', 'љ' ],
+ [ '/o', 'њ' ],
+ [ '/p', 'ћ' ],
+ [ '/a', 'ќ' ],
+ [ '/s', 'ў' ],
+ [ '/d', 'џ' ],
+ [ '/Q', 'Ђ' ],
+ [ '/W', 'Ѓ' ],
+ [ '/E', 'Є' ],
+ [ '/R', 'Ѕ' ],
+ [ '/T', 'І' ],
+ [ '/Y', 'Ї' ],
+ [ '/U', 'Ј' ],
+ [ '/I', 'Љ' ],
+ [ '/O', 'Њ' ],
+ [ '/P', 'Ћ' ],
+ [ '/A', 'Ќ' ],
+ [ '/S', 'Ў' ],
+ [ '/D', 'Џ' ],
+
+ [ '\\=', 'ч' ],
+ [ '`', 'ю' ],
+ [ 'q', 'я' ],
+ [ 'w', 'в' ],
+ [ 'e', 'е' ],
+ [ 'r', 'р' ],
+ [ 't', 'т' ],
+ [ 'y', 'ы' ],
+ [ 'u', 'у' ],
+ [ 'i', 'и' ],
+ [ 'o', 'о' ],
+ [ 'p', 'п' ],
+ [ '\\[', 'ш' ],
+ [ '\\]', 'щ' ],
+ [ 'a', 'а' ],
+ [ 's', 'с' ],
+ [ 'd', 'д' ],
+ [ 'f', 'ф' ],
+ [ 'g', 'г' ],
+ [ 'h', 'х' ],
+ [ 'j', 'й' ],
+ [ 'k', 'к' ],
+ [ 'l', 'л' ],
+ [ '\\\\', 'э' ],
+ [ 'z', 'з' ],
+ [ 'x', 'ь' ],
+ [ 'c', 'ц' ],
+ [ 'v', 'ж' ],
+ [ 'b', 'б' ],
+ [ 'n', 'н' ],
+ [ 'm', 'м' ],
+ [ '\\@', 'ё' ],
+ [ '\\#', 'ъ' ],
+ [ '\\$', 'Ё' ],
+ [ '\\+', 'Ч' ],
+ [ '\\~', 'Ю' ],
+ [ 'Q', 'Я' ],
+ [ 'W', 'В' ],
+ [ 'E', 'Е' ],
+ [ 'R', 'Р' ],
+ [ 'T', 'Т' ],
+ [ 'Y', 'Ы' ],
+ [ 'U', 'У' ],
+ [ 'I', 'И' ],
+ [ 'O', 'О' ],
+ [ 'P', 'П' ],
+ [ '\\{', 'Ш' ],
+ [ '\\}', 'Щ' ],
+ [ 'A', 'А' ],
+ [ 'S', 'С' ],
+ [ 'D', 'Д' ],
+ [ 'F', 'Ф' ],
+ [ 'G', 'Г' ],
+ [ 'H', 'Х' ],
+ [ 'J', 'Й' ],
+ [ 'K', 'К' ],
+ [ 'L', 'Л' ],
+ [ '\\|', 'Э' ],
+ [ 'Z', 'З' ],
+ [ 'X', 'Ь' ],
+ [ 'C', 'Ц' ],
+ [ 'V', 'Ж' ],
+ [ 'B', 'Б' ],
+ [ 'N', 'Н' ],
+ [ 'M', 'М' ] ]
+ };
+
+ $.ime.register( ruYawerty );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-iast.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-iast.js
new file mode 100644
index 00000000..3d62920f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-iast.js
@@ -0,0 +1,59 @@
+( function ( $ ) {
+ 'use strict';
+
+ var saIast = {
+ id: 'sa-iast',
+ name: 'Romanized',
+ description: 'Romanized input method for Sanskrit with IAST/ISO 15919 convention. Original author William Giddings <wjgiddings@googlemail.com>',
+ date: '2013-03-18',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Runa Bhattacharjee',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ 'aa', 'ā' ],
+ [ 'AA', 'Ā' ],
+ [ '\\^a', 'â' ],
+ [ '\\^A', 'Â' ],
+ [ 'ii', 'ī' ],
+ [ 'II', 'Ī' ],
+ [ 'uu', 'ū' ],
+ [ 'UU', 'Ū' ],
+ [ '\\.r', 'ṛ' ],
+ [ '\\.R', 'Ṛ' ],
+ [ 'ṛr', 'ṝ' ],
+ [ 'ṚR', 'Ṝ' ],
+ [ '\\.l', 'ḷ' ],
+ [ '\\.L', 'Ḷ' ],
+ [ 'ḷl', 'ḹ' ],
+ [ 'ḶL', 'Ḹ' ],
+ [ '\\.M', 'Ṃ' ],
+ [ '\\.m', 'ṃ' ],
+ [ '\\.h', 'ḥ' ],
+ [ '\\.H', 'Ḥ' ],
+ [ ';n', 'ṅ' ],
+ [ ';N', 'Ṅ' ],
+ [ '~n', 'ñ' ],
+ [ '~N', 'Ñ' ],
+ [ '\\.t', 'ṭ' ],
+ [ '\\.T', 'Ṭ' ],
+ [ '\\.d', 'ḍ' ],
+ [ '\\.D', 'Ḍ' ],
+ [ '\\.n', 'ṇ' ],
+ [ '\\.N', 'Ṇ' ],
+ [ ';s', 'ś' ],
+ [ ';S', 'Ś' ],
+ [ '\\.s', 'ṣ' ],
+ [ '\\.S', 'Ṣ' ],
+ [ 'ee', 'ē' ],
+ [ 'oo', 'ō' ],
+ [ ';m', 'ṁ' ],
+ [ ',r', 'r̥' ],
+ [ 'r̥r', 'r̥̄' ]
+ ]
+ };
+
+ $.ime.register( saIast );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-inscript.js
new file mode 100644
index 00000000..ebb31b3d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-inscript.js
@@ -0,0 +1,113 @@
+( function ( $ ) {
+ 'use strict';
+
+ var saInScript = {
+ id: 'sa-inscript',
+ name: 'Sanskrit InScript',
+ description: 'Inscript keyboard for Sanskrit script',
+ date: '2012-10-16',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'X', 'ँ' ],
+ [ 'x', 'ं' ],
+ [ '_', 'ः' ],
+ [ 'D', 'अ' ],
+ [ 'E', 'आ' ],
+ [ 'F', 'इ' ],
+ [ 'R', 'ई' ],
+ [ 'G', 'उ' ],
+ [ 'T', 'ऊ' ],
+ [ '\\+', 'ृ' ],
+ [ 'S', 'ए' ],
+ [ 'W', 'ऐ' ],
+ [ 'A', 'ओ' ],
+ [ 'Q', 'औ' ],
+ [ 'k', 'क' ],
+ [ 'K', 'ख' ],
+ [ 'i', 'ग' ],
+ [ 'I', 'घ' ],
+ [ 'U', 'ङ' ],
+ [ '\\;', 'च' ],
+ [ '\\:', 'छ' ],
+ [ 'p', 'ज' ],
+ [ 'P', 'झ' ],
+ [ '\\}', 'ञ' ],
+ [ '\'', '', 'ट' ],
+ [ '"', 'ठ' ],
+ [ '\\[', '', 'ड' ],
+ [ '\\{', '', 'ढ' ],
+ [ 'C', 'ण' ],
+ [ 'l', 'त' ],
+ [ 'L', 'थ' ],
+ [ 'o', 'द' ],
+ [ 'O', 'ध' ],
+ [ 'v', 'न' ],
+ [ 'h', 'प' ],
+ [ 'H', 'फ' ],
+ [ 'y', 'ब' ],
+ [ 'Y', 'भ' ],
+ [ 'c', 'म' ],
+ [ '\\?', '', 'य' ],
+ [ 'j', 'र' ],
+ [ 'n', 'ल' ],
+ [ 'N', 'ळ' ],
+ [ 'b', 'व' ],
+ [ 'M', 'श' ],
+ [ '\\<', '', 'ष' ],
+ [ 'm', 'स' ],
+ [ 'u', 'ह' ],
+ [ '\\]', '', '़' ],
+ [ 'e', 'ा' ],
+ [ 'f', 'ि' ],
+ [ 'r', 'ी' ],
+ [ 'g', 'ु' ],
+ [ 't', 'ू' ],
+ [ '\\=', '', 'ृ' ],
+ [ '\\\\', 'ॄ' ],
+ [ 's', 'े' ],
+ [ 'w', 'ै' ],
+ [ 'a', 'ो' ],
+ [ 'q', 'ौ' ],
+ [ 'd', '्' ],
+ [ '\\|', 'ॠ' ],
+ [ '/', 'य' ],
+ [ '\\>', '।' ],
+ [ '0', '', '०' ],
+ [ '1', '', '१' ],
+ [ '2', '२' ],
+ [ '3', '३' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '9', '९' ],
+ [ '\\@', 'ॅ' ],
+ [ '\\#', '', '्र' ],
+ [ '\\$', '', 'र्' ],
+ [ '\\%', '', 'ज्ञ' ],
+ [ '\\^', '', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ],
+ [ '\\(', '\u200D' ],
+ [ '\\)', '\u200C' ] ],
+
+ patterns_x: [
+ [ 'F', 'ऌ' ],
+ [ '\\>', 'ऽ' ],
+ [ 'X', 'ॐ' ],
+ [ 'e', '\u0951' ],
+ [ 'd', '\u0952' ],
+ [ 'R', 'ॡ' ],
+ [ 'f', 'ॢ' ],
+ [ 'r', 'ॣ' ],
+ [ '\\.', '॥' ],
+ [ '\\@', '', 'ॅ' ],
+ [ '4', '₹' ] ]
+
+ };
+
+ $.ime.register( saInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-inscript2.js
new file mode 100644
index 00000000..83390d18
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-inscript2.js
@@ -0,0 +1,117 @@
+( function ( $ ) {
+ 'use strict';
+
+ var saInScript2 = {
+ id: 'sa-inscript2',
+ name: 'संस्कृत इनस्क्रिप्ट २',
+ description: 'Enhanced InScript keyboard for Sanskrit language',
+ date: '2012-11-06',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '१' ],
+ [ '\\@', 'ॅ' ],
+ [ '2', '२' ],
+ [ '\\#', '्र' ],
+ [ '3', '३' ],
+ [ '\\$', 'र्' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\]', ']' ],
+ [ '0', '०' ],
+ [ '\\_', 'ः' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ऋ' ],
+ [ '\\=', 'ृ' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ौ' ],
+ [ 'W', 'ऐ' ],
+ [ 'w', 'ै' ],
+ [ 'E', 'आ' ],
+ [ 'e', 'ा' ],
+ [ 'R', 'ई' ],
+ [ 'r', 'ी' ],
+ [ 'T', 'ऊ' ],
+ [ 't', 'ू' ],
+ [ 'Y', 'भ' ],
+ [ 'y', 'ब' ],
+ [ 'U', 'ङ' ],
+ [ 'u', 'ह' ],
+ [ 'I', 'घ' ],
+ [ 'i', 'ग' ],
+ [ 'O', 'ध' ],
+ [ 'o', 'द' ],
+ [ 'P', 'झ' ],
+ [ 'p', 'ज' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ञ' ],
+ [ '\\]', '़' ],
+ [ '\\|', 'ॠ' ],
+ [ '\\\\', 'ॄ' ],
+ [ 'A', 'ओ' ],
+ [ 'a', 'ो' ],
+ [ 'S', 'ए' ],
+ [ 's', 'े' ],
+ [ 'D', 'अ' ],
+ [ 'd', '्' ],
+ [ 'F', 'इ' ],
+ [ 'f', 'ि' ],
+ [ 'G', 'उ' ],
+ [ 'g', 'ु' ],
+ [ 'H', 'फ' ],
+ [ 'h', 'प' ],
+ [ 'j', 'र' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'थ' ],
+ [ 'l', 'त' ],
+ [ ':', 'छ' ],
+ [ ';', 'च' ],
+ [ '"', 'ठ' ],
+ [ '\\\'', 'ट' ],
+ [ 'X', 'ँ' ],
+ [ 'x', 'ं' ],
+ [ 'C', 'ण' ],
+ [ 'c', 'म' ],
+ [ 'v', 'न' ],
+ [ 'b', 'व' ],
+ [ 'N', 'ळ' ],
+ [ 'n', 'ल' ],
+ [ 'M', 'श' ],
+ [ 'm', 'स' ],
+ [ '\\<', 'ष' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'य' ],
+ [ '\\%', 'ज्ञ' ],
+ [ '\\^', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ 'e', '॑' ],
+ [ 'R', 'ॡ' ],
+ [ 'r', 'ॣ' ],
+ [ 'd', '॒' ],
+ [ 'F', 'ऌ' ],
+ [ 'f', 'ॢ' ],
+ [ 'H', 'फ़' ],
+ [ 'X', 'ॐ' ],
+ [ '\\>', 'ऽ' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+
+ $.ime.register( saInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-transliteration.js
new file mode 100644
index 00000000..67a218d4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sa/sa-transliteration.js
@@ -0,0 +1,165 @@
+( function ( $ ) {
+ 'use strict';
+
+ var saTransliteration = {
+ id: 'sa-transliteration',
+ name: 'Sanskrit Transliteration',
+ description: 'Sanskrit transliteration',
+ date: '2012-10-16',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V and Naveen Shankar',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 4,
+ maxKeyLength: 2,
+ patterns: [
+ [ 'क्h', 'c', 'च्' ],
+ [ '\\\\([A-Za-z\\>_~\\.0-9])', '\\\\', '$1' ],
+
+ [ '([क-ह]़?)्a', '$1' ],
+ [ '([क-ह]़?)्A', '$1ा' ],
+ [ '([क-ह]़?)a', '$1ा' ],
+ [ '([क-ह]़?)्i', '$1ि' ],
+ [ '([क-ह]़?)(्I|िi|ॆe)', '$1ी' ],
+ [ '([क-ह]़?)्u', '$1ु' ],
+ [ '([क-ह]़?)(ुu|्U|ॊo)', '$1ू' ],
+ [ '([क-ह]़?)्R', '$1ृ' ],
+ [ '([क-ह]़?)ृR', '$1ॄ' ],
+ [ '([क-ह]़?)्ळ्l', '$1ॢ' ],
+ [ '([क-ह]़?)ॢl', '$1ॣ' ],
+ [ '([क-ह]़?)ॆ\\^', '$1ॅ' ],
+ [ '([क-ह]़?)्e', '$1े' ],
+ [ '([क-ह]़?)्E', '$1ॅ' ],
+ [ '([क-ह]़?)ॊ\\^', '$1ॉ' ],
+ [ '([क-ह]़?)i', '$1ै' ],
+ [ '([क-ह]़?)्o', '$1ो' ],
+ [ '([क-ह]़?)्O', '$1ॉ' ],
+ [ '([क-ह]़?)u', '$1ौ' ],
+ [ '([क-ह]़?)ृa', '$1्ऱ' ],
+ [ '([क-ह]़?)ृA', '$1्ऱा' ],
+ [ '([क-ह]़?)ृi', '$1्ऱि' ],
+ [ '([क-ह]़?)ृI', '$1्ऱी' ],
+ [ '([क-ह]़?)ृu', '$1्ऱु' ],
+ [ '([क-ह]़?)ृU', '$1्ऱू' ],
+ [ '([क-ह]़?)ृ\\^', '$1्ऱॅ' ],
+ [ '([क-ह]़?)ृe', '$1्ऱे' ],
+ [ '([क-ह]़?)ृE', '1्ऱॅ' ],
+ [ '([क-ह]़?)ृo', '$1्ऱो' ],
+ [ '([क-ह]़?)ृO', '$1्ऱौ' ],
+ [ '([क-ह]़?)ृ\\~', '$1्ऱ्' ],
+ [ '([क-ह])्\\`', '$1़्' ],
+
+ [ 'अa', 'आ' ],
+ [ '(ऒo|उu)', 'ऊ' ],
+ [ 'ऎ\\^', 'ऍ' ],
+ [ 'अi', 'ऐ' ],
+ [ 'अ\\^', 'ॲ' ],
+ [ '(इi|ऎe)', 'ई' ],
+ [ 'ऒ\\^', 'ऑ' ],
+ [ 'अu', 'औ' ],
+ [ 'ऋR', 'ॠ' ],
+ [ 'ळ्l', 'ऌ' ],
+ [ 'ऌl', 'ॡ' ],
+ [ 'ं\\^', 'ँ' ],
+ [ 'ंm', 'ँ' ],
+ [ 'ओM', 'ॐ' ],
+
+ [ 'क्h', 'ख्' ],
+ [ 'ग्h', 'घ्' ],
+ [ 'न्g', 'ङ्' ],
+ [ 'च्h', 'छ्' ],
+ [ 'ज्h', 'झ्' ],
+ [ 'न्j', 'ञ्' ],
+ [ 'ट्h', 'ठ्' ],
+ [ 'ड्h', 'ढ्' ],
+ [ 'त्h', 'थ्' ],
+ [ 'द्h', 'ध्' ],
+ [ 'प्h', 'फ्' ],
+ [ 'ब्h', 'भ्' ],
+ [ 'ऋa', 'ऱ' ],
+ [ 'ऋA', 'ऱा' ],
+ [ 'ऋi', 'ऱि' ],
+ [ 'ऋI', 'ऱी' ],
+ [ 'ऋu', 'ऱु' ],
+ [ 'ऋU', 'ऱू' ],
+ [ 'ऋ\\^', 'ऱॅ' ],
+ [ 'ऋe', 'ऱे' ],
+ [ 'ऋE', 'ऱै' ],
+ [ 'ऋo', 'ऱो' ],
+ [ 'ऋO', 'ऱौ' ],
+ [ 'ऋ\\~', 'ऱ्' ],
+
+ [ 'स्h', 'ष्' ],
+ [ 'क़्h', 'ख़्' ],
+ [ 'ज़्h', 'ऴ्' ],
+ [ '।\\.', '॥' ],
+
+ [ 'a', 'अ' ],
+ [ 'b', 'ब्' ],
+ [ 'c', 'क्' ],
+ [ 'd', 'द्' ],
+ [ 'e', 'ए' ],
+ [ '(f|F)', 'फ़्' ],
+ [ 'g', 'ग्' ],
+ [ 'h', 'ह्' ],
+ [ 'i', 'इ' ],
+ [ 'j', 'ज्' ],
+ [ 'k', 'क्' ],
+ [ 'l', 'ल्' ],
+ [ 'm', 'म्' ],
+ [ 'n', 'न्' ],
+ [ 'o', 'ओ' ],
+ [ 'p', 'प्' ],
+ [ 'q', 'क़्' ],
+ [ 'r', 'र्' ],
+ [ 's', 'स्' ],
+ [ 't', 'त्' ],
+ [ 'u', 'उ' ],
+ [ '(v|w)', 'व्' ],
+ [ 'x', 'क्ष्' ],
+ [ 'y', 'य्' ],
+ [ '(z|Z)', 'ज़्' ],
+ [ 'A', 'आ' ],
+ [ 'B', 'ब्ब्' ],
+ [ 'C', 'क्क्' ],
+ [ 'D', 'ड्' ],
+ [ 'E', 'ऍ' ],
+ // 'F','फ्'],
+ [ 'G', 'ग्ग्' ],
+ [ 'H', 'ः' ],
+ [ 'I', 'ई' ],
+ [ 'J', 'ज्ज्' ],
+ [ 'K', 'क्क्' ],
+ [ 'L', 'ळ्' ],
+ [ 'M', 'ं' ],
+ [ 'N', 'ण्' ],
+ [ 'O', 'ऑ' ],
+ [ 'P', 'प्प्' ],
+ // 'Q','अ'],
+ [ 'R', 'ऋ' ],
+ [ 'S', 'श्' ],
+ [ 'T', 'ट्' ],
+ [ 'U', 'ऊ' ],
+ [ '(V|W)', 'व्व्' ],
+ [ 'X', 'क्ष्' ],
+ [ 'Y', 'य्य्' ],
+ // 'z','अ'
+ [ '0', '०' ],
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '3', '३' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '9', '९' ],
+ [ '~', '्' ],
+ [ '\\.', '।' ],
+ [ '//', 'ऽ' ],
+ [ '\\`', '़' ],
+ [ '(\u200C)*_', '\u200c' ] ]
+ };
+ $.ime.register( saTransliteration );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sah/sah-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sah/sah-transliteration.js
new file mode 100644
index 00000000..6eaea993
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sah/sah-transliteration.js
@@ -0,0 +1,103 @@
+( function ( $ ) {
+ 'use strict';
+
+ var sahTransliteration = {
+ id: 'sah-transliteration',
+ name: 'Sakha Transliteration',
+ description: 'Sakha transliteration',
+ date: '2012-10-16',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Amir (Алексей) Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', 'Й' ],
+ [ 'W', 'Ц' ],
+ [ 'E', 'У' ],
+ [ 'R', 'К' ],
+ [ 'T', 'Е' ],
+ [ 'Y', 'Н' ],
+ [ 'U', 'Г' ],
+ [ 'I', 'Ш' ],
+ [ 'O', 'Щ' ],
+ [ 'P', 'З' ],
+ [ '{', 'Х' ],
+ [ '}', 'Ъ' ],
+ [ 'A', 'Ф' ],
+ [ 'S', 'Ы' ],
+ [ 'D', 'В' ],
+ [ 'F', 'А' ],
+ [ 'G', 'П' ],
+ [ 'H', 'Р' ],
+ [ 'J', 'О' ],
+ [ 'K', 'Л' ],
+ [ 'L', 'Д' ],
+ [ ':', 'Ж' ],
+ [ '"', 'Э' ],
+ [ 'Z', 'Я' ],
+ [ 'X', 'Ч' ],
+ [ 'C', 'С' ],
+ [ 'V', 'М' ],
+ [ 'B', 'И' ],
+ [ 'N', 'Т' ],
+ [ 'M', 'Ь' ],
+ [ '<', 'Б' ],
+ [ '>', 'Ю' ],
+ [ '\\?', ',' ],
+
+ [ 'q', 'й' ],
+ [ 'w', 'ц' ],
+ [ 'e', 'у' ],
+ [ 'r', 'к' ],
+ [ 't', 'е' ],
+ [ 'y', 'н' ],
+ [ 'u', 'г' ],
+ [ 'i', 'ш' ],
+ [ 'o', 'щ' ],
+ [ 'p', 'з' ],
+ [ '\\[', 'х' ],
+ [ '\\]', 'ъ' ],
+ [ 'a', 'ф' ],
+ [ 's', 'ы' ],
+ [ 'd', 'в' ],
+ [ 'f', 'а' ],
+ [ 'g', 'п' ],
+ [ 'h', 'р' ],
+ [ 'j', 'о' ],
+ [ 'k', 'л' ],
+ [ 'l', 'д' ],
+ [ ';', 'ж' ],
+ [ '\'', 'э' ],
+ [ 'z', 'я' ],
+ [ 'x', 'ч' ],
+ [ 'c', 'с' ],
+ [ 'v', 'м' ],
+ [ 'b', 'и' ],
+ [ 'n', 'т' ],
+ [ 'm', 'ь' ],
+ [ ',', 'б' ],
+ [ '\\.', 'ю' ],
+ [ '/', '.' ],
+
+ [ '`', '"' ],
+ [ '~', '№' ],
+
+ [ '1', '!' ], // 1
+ [ '!', '?' ], // 1
+ // 2, 3 - ?
+ [ '4', 'ҥ' ], // 4
+ [ '\\$', 'Ҥ' ], // 4
+ [ '5', 'ҕ' ], // 5
+ [ '%', 'Ҕ' ], // 5
+ [ '6', 'ө' ], // 6
+ [ '\\^', 'Ө' ], // 6
+ [ '7', 'һ' ], // 7
+ [ '&', 'Һ' ], // 7
+ [ '8', 'ү' ], // 8
+ [ '\\*', 'Ү' ], // 8
+ [ '9', ';' ], // 9
+ [ '0', ':' ] ] // 0
+ };
+
+ $.ime.register( sahTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-inscript2-ol-chiki.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-inscript2-ol-chiki.js
new file mode 100644
index 00000000..18cf5365
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-inscript2-ol-chiki.js
@@ -0,0 +1,64 @@
+( function ( $ ) {
+ 'use strict';
+
+ var satInScript2OlChiki = {
+ id: 'sat-inscript2-ol-chiki',
+ name: 'InScript2',
+ description: 'Enhanced Ol Chiki InScript keyboard for Santali language',
+ date: '2016-03-29',
+ author: 'Jnanaranjan Sahu',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '0', '᱐' ],
+ [ '1', '᱑' ],
+ [ '2', '᱒' ],
+ [ '3', '᱓' ],
+ [ '4', '᱔' ],
+ [ '5', '᱕' ],
+ [ '6', '᱖' ],
+ [ '7', '᱗' ],
+ [ '8', '᱘' ],
+ [ '9', '᱙' ],
+
+ [ 'e', 'ᱟ' ],
+ [ 'y', 'ᱵ' ],
+ [ 'U', 'ᱝ' ],
+ [ 'u', 'ᱦ' ],
+ [ 'i', 'ᱜ' ],
+ [ 'o', 'ᱫ' ],
+ [ 'p', 'ᱡ' ],
+ [ '\\{', 'ᱲ' ],
+ [ '\\[', 'ᱰ' ],
+ [ '\\}', 'ᱧ' ],
+ [ '\\]', 'ᱹ' ],
+ [ 'a', 'ᱳ' ],
+ [ 's', 'ᱮ' ],
+ [ 'd', 'ᱚ' ],
+ [ 'f', 'ᱤ' ],
+ [ 'g', 'ᱩ' ],
+ [ 'h', 'ᱯ' ],
+ [ 'j', 'ᱨ' ],
+ [ 'k', 'ᱠ' ],
+ [ 'l', 'ᱛ' ],
+ [ '\\;', 'ᱪ' ],
+ [ '\\:', 'ᱺ' ],
+ [ '\\', 'ᱴ' ],
+ [ 'Z', 'ᱽ' ],
+ [ 'z', 'ᱷ' ],
+ [ 'x', 'ᱸ' ],
+ [ 'C', 'ᱬ' ],
+ [ 'c', 'ᱢ' ],
+ [ 'v', 'ᱱ' ],
+ [ 'B', 'ᱶ' ],
+ [ 'b', 'ᱣ' ],
+ [ 'n', 'ᱞ' ],
+ [ 'm', 'ᱥ' ],
+ [ '\\,', '᱿' ],
+ [ '\\.', '᱾' ],
+ [ '\\/', 'ᱭ' ]
+ ]
+ };
+ $.ime.register( satInScript2OlChiki );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-inscript2.js
new file mode 100644
index 00000000..56cc7986
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-inscript2.js
@@ -0,0 +1,107 @@
+( function ( $ ) {
+ 'use strict';
+
+ var satInScript2 = {
+ id: 'sat-inscript2',
+ name: 'संताली इनस्क्रिप्ट २',
+ description: 'Enhanced InScript Devanagari keyboard for Santali language',
+ date: '2013-20-13',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '\\#', '्र' ],
+ [ '3', '३' ],
+ [ '\\$', 'र्' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\]', ']' ],
+ [ '0', '०' ],
+ [ '\\_', 'ः' ],
+ [ '\\-', '-' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ौ' ],
+ [ 'W', 'ऐ' ],
+ [ 'w', 'ै' ],
+ [ 'E', 'आ' ],
+ [ 'e', 'ा' ],
+ [ 'R', 'ई' ],
+ [ 'r', 'ी' ],
+ [ 'T', 'ऊ' ],
+ [ 't', 'ू' ],
+ [ 'Y', 'भ' ],
+ [ 'y', 'ब' ],
+ [ 'U', 'ङ' ],
+ [ 'u', 'ह' ],
+ [ 'I', 'घ' ],
+ [ 'i', 'ग' ],
+ [ 'O', 'ध' ],
+ [ 'o', 'द' ],
+ [ 'P', 'झ' ],
+ [ 'p', 'ज' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ञ' ],
+ [ '\\]', '़' ],
+ [ 'A', 'ओ' ],
+ [ 'a', 'ो' ],
+ [ 'S', 'ए' ],
+ [ 's', 'े' ],
+ [ 'D', 'अ' ],
+ [ 'd', '्' ],
+ [ 'F', 'इ' ],
+ [ 'f', 'ि' ],
+ [ 'G', 'उ' ],
+ [ 'g', 'ु' ],
+ [ 'H', 'फ' ],
+ [ 'h', 'प' ],
+ [ 'j', 'र' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'थ' ],
+ [ 'l', 'त' ],
+ [ ':', 'छ' ],
+ [ ';', 'च' ],
+ [ '"', 'ठ' ],
+ [ '\'', 'ट' ],
+ [ 'z', 'ʼ' ],
+ [ 'X', 'ँ' ],
+ [ 'x', 'ं' ],
+ [ 'C', 'ण' ],
+ [ 'c', 'म' ],
+ [ 'v', 'न' ],
+ [ 'b', 'व' ],
+ [ 'n', 'ल' ],
+ [ 'm', 'स' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '\\?', '?' ],
+ [ '/', 'य' ],
+ [ '\\%', 'ज्ञ' ],
+ [ '\\^', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ 'F', 'ऌ' ],
+ [ 'X', 'ॐ' ],
+ [ 'N', 'ळ' ],
+ [ ',', '॰' ],
+ [ '\\>', 'ऽ' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+ $.ime.register( satInScript2 );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-sarjom-baha.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-sarjom-baha.js
new file mode 100644
index 00000000..d2606efa
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sat/sat-sarjom-baha.js
@@ -0,0 +1,83 @@
+( function ( $ ) {
+ 'use strict';
+
+ var satSarjomBaha = {
+ id: 'sat-sarjom-baha',
+ name: 'Sarjom Baha',
+ description: 'Phonetic Ol Chiki keyboard, Sarjom Baha for Santali language',
+ date: '2016-03-29',
+ author: 'Jnanaranjan Sahu',
+ license: 'GPLv3',
+ version: '1.01',
+ patterns: [
+ [ 'a', 'ᱟ' ],
+ [ 'b', 'ᱵ' ],
+ [ 'c', 'ᱪ' ],
+ [ 'd', 'ᱰ' ],
+ [ 'e', 'ᱮ' ],
+ [ 'f', 'ᱝ' ],
+ [ 'g', 'ᱜ' ],
+ [ 'h', 'ᱦ' ],
+ [ 'i', 'ᱤ' ],
+ [ 'j', 'ᱡ' ],
+ [ 'k', 'ᱠ' ],
+ [ 'l', 'ᱞ' ],
+ [ 'm', 'ᱢ' ],
+ [ 'n', 'ᱱ' ],
+ [ 'o', 'ᱚ' ],
+ [ 'p', 'ᱯ' ],
+ [ 'q', 'ᱧ' ],
+ [ 'r', 'ᱨ' ],
+ [ 's', 'ᱥ' ],
+ [ 't', 'ᱴ' ],
+ [ 'u', 'ᱩ' ],
+ [ 'v', 'ᱶ' ],
+ [ 'w', 'ᱣ' ],
+ [ 'x', 'ᱽ' ],
+ [ 'y', 'ᱭ' ],
+ [ 'z', 'ᱲ' ],
+ [ 'A', 'ᱟ' ],
+ [ 'B', 'ᱵ' ],
+ [ 'C', 'ᱪ' ],
+ [ 'D', 'ᱫ' ],
+ [ 'E', 'ᱮ' ],
+ [ 'F', 'ᱝ' ],
+ [ 'G', 'ᱜ' ],
+ [ 'H', 'ᱷ' ],
+ [ 'I', '᱾' ],
+ [ 'J', 'ᱡ' ],
+ [ 'K', 'ᱠ' ],
+ [ 'L', '᱿' ],
+ [ 'M', 'ᱬ' ],
+ [ 'N', 'ᱸ' ],
+ [ 'O', 'ᱳ' ],
+ [ 'P', 'ᱯ' ],
+ [ 'Q', 'ᱻ' ],
+ [ 'R', 'ᱨ' ],
+ [ 'S', 'ᱥ' ],
+ [ 'T', 'ᱛ' ],
+ [ 'U', 'ᱩ' ],
+ [ 'V', 'ᱶ' ],
+ [ 'W', 'ᱣ' ],
+ [ 'X', 'ᱽ' ],
+ [ 'Y', 'ᱭ' ],
+ [ 'Z', 'ᱼ' ],
+ [ '\\.', 'ᱹ' ],
+ [ '\\;', ';' ],
+ [ '\\:', 'ᱺ' ],
+
+ [ '0', '᱐' ],
+ [ '1', '᱑' ],
+ [ '2', '᱒' ],
+ [ '3', '᱓' ],
+ [ '4', '᱔' ],
+ [ '5', '᱕' ],
+ [ '6', '᱖' ],
+ [ '7', '᱗' ],
+ [ '8', '᱘' ],
+ [ '9', '᱙' ]
+ ]
+ };
+ $.ime.register( satSarjomBaha );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sd/sd-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sd/sd-inscript2.js
new file mode 100644
index 00000000..24f849b8
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sd/sd-inscript2.js
@@ -0,0 +1,124 @@
+( function ( $ ) {
+ 'use strict';
+
+ var sdInScript2 = {
+ id: 'sd-inscript2',
+ name: 'सिंधी इनस्क्रिप्ट २',
+ description: 'Enhanced InScript keyboard for Sindhi language',
+ date: '2013-20-13',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '१' ],
+ [ '2', '२' ],
+ [ '\\#', '्र' ],
+ [ '3', '३' ],
+ [ '\\$', 'र्' ],
+ [ '4', '४' ],
+ [ '5', '५' ],
+ [ '6', '६' ],
+ [ '7', '७' ],
+ [ '8', '८' ],
+ [ '\\(', '(' ],
+ [ '9', '९' ],
+ [ '\\]', ']' ],
+ [ '0', '०' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ऋ' ],
+ [ '\\=', 'ृ' ],
+ [ 'Q', 'औ' ],
+ [ 'q', 'ौ' ],
+ [ 'W', 'ऐ' ],
+ [ 'w', 'ै' ],
+ [ 'E', 'आ' ],
+ [ 'e', 'ा' ],
+ [ 'R', 'ई' ],
+ [ 'r', 'ी' ],
+ [ 'T', 'ऊ' ],
+ [ 't', 'ू' ],
+ [ 'Y', 'भ' ],
+ [ 'y', 'ब' ],
+ [ 'U', 'ङ' ],
+ [ 'u', 'ह' ],
+ [ 'I', 'घ' ],
+ [ 'i', 'ग' ],
+ [ 'O', 'ध' ],
+ [ 'o', 'द' ],
+ [ 'P', 'झ' ],
+ [ 'p', 'ज' ],
+ [ '\\{', 'ढ' ],
+ [ '\\[', 'ड' ],
+ [ '\\}', 'ञ' ],
+ [ '\\]', '़' ],
+ [ 'A', 'ओ' ],
+ [ 'a', 'ो' ],
+ [ 'S', 'ए' ],
+ [ 's', 'े' ],
+ [ 'D', 'अ' ],
+ [ 'd', '्' ],
+ [ 'F', 'इ' ],
+ [ 'f', 'ि' ],
+ [ 'G', 'उ' ],
+ [ 'g', 'ु' ],
+ [ 'H', 'फ' ],
+ [ 'h', 'प' ],
+ [ 'j', 'र' ],
+ [ 'K', 'ख' ],
+ [ 'k', 'क' ],
+ [ 'L', 'थ' ],
+ [ 'l', 'त' ],
+ [ ':', 'छ' ],
+ [ ';', 'च' ],
+ [ '"', 'ठ' ],
+ [ '\'', 'ट' ],
+ [ 'X', 'ँ' ],
+ [ 'C', 'ण' ],
+ [ 'c', 'म' ],
+ [ 'v', 'न' ],
+ [ 'b', 'व' ],
+ [ 'n', 'ल' ],
+ [ 'M', 'श' ],
+ [ 'm', 'स' ],
+ [ '\\<', 'ष' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'य' ],
+ [ '\\%', 'ज्ञ' ],
+ [ '\\^', 'त्र' ],
+ [ '\\&', 'क्ष' ],
+ [ '\\*', 'श्र' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '\\+', 'ॠ' ],
+ [ '\\=', 'ृ' ],
+ [ 'e', '॑' ],
+ [ 'i', 'ग़' ],
+ [ 'R', 'ॡ' ],
+ [ 'r', 'ॣ' ],
+ [ 'p', 'ज़' ],
+ [ '\\{', 'ढ़' ],
+ [ '\\[', 'ड़' ],
+ [ 'H', 'फ़' ],
+ [ 'J', 'ॻ' ],
+ [ 'K', 'ख़' ],
+ [ 'k', 'क़' ],
+ [ 'd', '॒' ],
+ [ 'F', 'ऌ' ],
+ [ 'f', 'ॢ' ],
+ [ 'x', 'ॐ' ],
+ [ 'V', 'ॾ' ],
+ [ 'B', 'ॿ' ],
+ [ 'N', 'ॼ' ],
+ [ ',', '॰' ],
+ [ '\\>', 'ऽ' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+
+ $.ime.register( sdInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sdh/sdh-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sdh/sdh-kbd.js
new file mode 100644
index 00000000..20455801
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sdh/sdh-kbd.js
@@ -0,0 +1,108 @@
+( function ( $ ) {
+ 'use strict';
+
+ var sdhKbd = {
+ id: 'sdh-kbd',
+ name: 'کوردی خوارگ',
+ description: 'Southern Kurdish Keyboard Layout',
+ date: '2015-05-03',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Mjbmr',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', '\u200c' ],
+ [ '1', '١' ],
+ [ '2', '٢' ],
+ [ '3', '٣' ],
+ [ '4', '٤' ],
+ [ '5', '٥' ],
+ [ '6', '۶' ],
+ [ '7', '٧' ],
+ [ '8', '٨' ],
+ [ '9', '٩' ],
+ [ '0', '٠' ],
+
+ [ 'q', 'ض' ],
+ [ 'w', 'ص' ],
+ [ 'e', 'ث' ],
+ [ 'r', 'ق' ],
+ [ 't', 'ف' ],
+ [ 'y', 'غ' ],
+ [ 'u', 'ع' ],
+ [ 'i', 'ھ' ],
+ [ 'o', 'خ' ],
+ [ 'p', 'ح' ],
+ [ '\\[', 'ج' ],
+ [ '\\]', 'چ' ],
+
+ [ 'a', 'ش' ],
+ [ 's', 'س' ],
+ [ 'd', 'ی' ],
+ [ 'f', 'ب' ],
+ [ 'g', 'ل' ],
+ [ 'h', 'ا' ],
+ [ 'j', 'ت' ],
+ [ 'k', 'ن' ],
+ [ 'l', 'م' ],
+ [ ';', 'ک' ],
+ [ '\'', 'گ' ],
+
+ [ 'z', 'ظ' ],
+ [ 'x', 'ط' ],
+ [ 'c', 'ز' ],
+ [ 'v', 'ر' ],
+ [ 'b', 'ذ' ],
+ [ 'n', 'د' ],
+ [ 'm', 'پ' ],
+ [ ',', 'و' ],
+
+ [ '~', '÷' ],
+ [ '@', '٬' ],
+ [ '#', '٫' ],
+ [ '%', '٪' ],
+ [ '\\^', '×' ],
+ [ '&', '،' ],
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+ [ '_', 'ـ' ],
+
+ [ 'Q', 'ْ' ],
+ [ 'W', 'وو' ],
+ [ 'E', 'ڤ' ],
+ [ 'R', 'ً' ],
+ [ 'T', 'ۊ' ],
+ [ 'Y', 'ئ' ],
+ [ 'U', 'ە' ],
+ [ 'I', 'ّ' ],
+ [ 'O', ']' ],
+ [ 'P', '[' ],
+ [ '\\{', '}' ],
+ [ '\\}', '{' ],
+
+ [ 'A', 'ؤ' ],
+ [ 'S', 'ئ' ],
+ [ 'D', 'ێ' ],
+ [ 'F', 'إ' ],
+ [ 'G', 'أ' ],
+ [ 'H', 'آ' ],
+ [ 'J', 'ة' ],
+ [ 'K', '»' ],
+ [ 'L', '«' ],
+ [ '"', '؛' ],
+
+ [ 'Z', 'ۆ' ],
+ [ 'X', 'ط' ],
+ [ 'C', 'ژ' ],
+ [ 'V', 'ڕ' ],
+ [ 'B', 'ڵ' ],
+ [ 'N', 'ٔ' ],
+ [ 'M', 'ء' ],
+ [ '<', '>' ],
+ [ '>', '<' ],
+ [ '\\?', '؟' ]
+ ]
+ };
+
+ $.ime.register( sdhKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/se/se-normforms.js b/UniversalLanguageSelector/lib/jquery.ime/rules/se/se-normforms.js
new file mode 100644
index 00000000..0d358a71
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/se/se-normforms.js
@@ -0,0 +1,38 @@
+( function ( $ ) {
+ 'use strict';
+
+ var defs = {
+ id: 'se-normforms',
+ name: 'Davvisámegiella',
+ description: 'Northern Sami input method',
+ date: '2012-12-04',
+ URL: 'http://giellatekno.uit.no/doc/infra/samihtml.html',
+ author: 'John Erling Blad',
+ license: 'GPLv3',
+ version: '1.0',
+ // contextLength: 1,
+ maxKeyLength: 3,
+ patterns: [
+ // Uses "~" as "approximatly similar to"
+ [ '\'a', 'á' ], // The simple ~a does not work as there is a "ã"
+ [ '\'A', 'Á' ], // The simple ~A does not work as there is a "Ã"
+ [ '~c', 'č' ],
+ [ '~C', 'Č' ],
+ [ '~d', 'đ' ],
+ [ '~D', 'Đ' ],
+ // [ '~ng', 'ŋ' ], // The simple ~n does not work as there is a "ñ"
+ // [ '~NG', 'Ŋ' ], // The simple ~N does not work as there is a "Ñ"
+ [ '~g', 'ŋ' ],
+ [ '~G', 'Ŋ' ],
+ [ '~s', 'š' ],
+ [ '~S', 'Š' ],
+ [ '~t', 'ŧ' ],
+ [ '~T', 'Ŧ' ],
+ [ '~z', 'ž' ],
+ [ '~Z', 'Ž' ]
+ // historically similar forms
+ ]
+ };
+
+ $.ime.register( defs );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ses/ses-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ses/ses-tilde.js
new file mode 100644
index 00000000..2e4c608b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ses/ses-tilde.js
@@ -0,0 +1,40 @@
+( function ( $ ) {
+ 'use strict';
+
+ var sesTilde = {
+ id: 'ses-tilde',
+ name: 'ses-tilde',
+ description: 'Koyraboro Senni Songhay input keyboard - tilde',
+ date: '2019-01-22',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~A', 'Ã' ],
+ [ '~a', 'ã' ],
+ [ '~E', 'Ẽ' ],
+ [ '~e', 'ẽ' ],
+ [ '~I', 'Ĩ' ],
+ [ '~i', 'ĩ' ],
+ [ '~O', 'Õ' ],
+ [ '~o', 'õ' ],
+ [ '~U', 'Ũ' ],
+ [ '~u', 'ũ' ],
+ [ '~G', 'Ŋ' ],
+ [ '~g', 'ŋ' ],
+ [ '~Y', 'Ɲ' ],
+ [ '~y', 'ɲ' ],
+ [ '~S', 'Š' ],
+ [ '~s', 'š' ],
+ [ '~Z', 'Ž' ],
+ [ '~z', 'ž' ],
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\^', '\u0302' ], // Combining circumflex
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( sesTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sg/sg-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sg/sg-tilde.js
new file mode 100644
index 00000000..4c130f51
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sg/sg-tilde.js
@@ -0,0 +1,24 @@
+( function ( $ ) {
+ 'use strict';
+
+ var sgTilde = {
+ id: 'sg-tilde',
+ name: 'sg-tilde',
+ description: 'Sango tilde keyboard',
+ date: '2019-03-28',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\^', '\u0302' ], // Combining circumflex
+ [ '~\\-', '\u0304' ], // Combining macron
+ [ '~\\:', '\u0308' ], // Combining diaeresis
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( sgTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/si/si-singlish.js b/UniversalLanguageSelector/lib/jquery.ime/rules/si/si-singlish.js
new file mode 100644
index 00000000..d7febd52
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/si/si-singlish.js
@@ -0,0 +1,110 @@
+( function ( $ ) {
+ 'use strict';
+
+ var siSinglish = {
+ id: 'si-singlish',
+ name: 'Sinhalese Singlish',
+ description: 'Singlish',
+ date: '2012-10-16',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V and Nishantha Anuruddha',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 5,
+ maxKeyLength: 5,
+ patterns: [
+ // ['ඬ්හ්a', 'ඳ'], // nndha
+ [ 'ඬ්h', 'ඳ්' ], // nndh
+ [ 'න්න්d', 'ඬ්' ], // nnd
+ [ 'න්න්g', 'ඟ්' ], // nng
+ [ '\\u0DC1\\u0DCA\\u200D\\u0DBB\\u0DD2i', '\u0DC1\u0DCA\u200D\u0DBB\u0DD3' ], // shrii
+ [ '\\u0DC1\\u0DCA\\u200D\\u0DBBi', '\u0DC1\u0DCA\u200D\u0DBB\u0DD2' ], // shri
+ [ 'ශ්r', '\u0DC1\u0DCA\u200D\u0DBB' ], // shr
+
+ [ '([\\u0D9A-\\u0DC6])්\\u200Dර්u', '$1ෘ' ], // <consonant>ru
+ [ '([\\u0D9A-\\u0DC6])ෘu', '$1ෲ' ], // <consonant>ruu
+
+ [ '([\\u0D9A-\\u0DC6])්a', '$1' ], // <consonant>a
+ [ '([\\u0D9A-\\u0DC6])a', '$1ා' ], // <consonant>aa
+ [ '([\\u0D9A-\\u0DC6])්A', '$1ැ' ], // <consonant>A
+ [ '([\\u0D9A-\\u0DC6])ැa', '$1ෑ' ], // <consonant>Aa
+ [ '([\\u0D9A-\\u0DC6])්i', '$1ි' ], // <consonant>i
+ [ '([\\u0D9A-\\u0DC6])ි[ei]', '$1ී' ], // <consonant>ie
+ [ '([\\u0D9A-\\u0DC6])්u', '$1ු' ], // <consonant>u
+ [ '([\\u0D9A-\\u0DC6])ුu', '$1ූ' ], // <consonant>u
+ [ '([\\u0D9A-\\u0DC6])්e', '$1ෙ' ], // <consonant>e
+ [ '([\\u0D9A-\\u0DC6])ෙ[ai]', '$1ේ' ], // <consonant>ei
+ [ '([\\u0D9A-\\u0DC6])්o', '$1ො' ], // <consonant>o
+ [ '([\\u0D9A-\\u0DC6])ොe', '$1ෝ' ], // <consonant>oe
+ [ '([\\u0D9A-\\u0DC6])u', '$1ෞ' ], // <consonant>au
+ [ '([\\u0D9A-\\u0DC6])්I', '$1ෛ' ], // <consonant>I
+
+ [ '([\\u0D9A-\\u0DC6]්)r', '$1\u200Dර්' ], // <consonant>r
+
+ [ 'ළුu', 'ළුු' ], // Luu
+
+ [ '(ක්h|K)', 'ඛ්' ], // kh K
+ [ '(ග්h|G)', 'ඝ්' ], // gh G
+ [ 'ස්h', 'ශ්' ], // sh
+ [ 'ch', 'ච්' ],
+ [ 'Ch', 'ඡ්' ],
+ [ 'Sh', 'ෂ්' ],
+ [ 'ඝ්N', 'ඥ්' ], // GN
+ [ 'ඨ්h', 'ථ්' ], // Th
+ [ 'ඛ්N', 'ඤ්' ], // KN
+ [ 'ට්h', 'ත්' ], // th
+ [ 'ඪ්h', 'ධ්' ], // Dh
+ [ 'ඩ්h', 'ද්' ], // dh
+ [ '(ප්h|P)', 'ඵ්' ], // ph P
+ [ 'ළ්u', 'ළු' ], // Lu
+ [ 'බ්h', 'භ්' ], // bh
+
+ [ '(\\\\r|R)', '\u0DBB\u0DCA\u200D' ], // \r R
+ [ '(\\\\y|Y)', '\u200D\u0DBA\u0DCA' ], // \y Y
+
+ [ 'අ(a|\\))', 'ආ' ], // aa a)
+ [ 'ඇ(a|\\))', 'ඈ' ], // Aa A) ae
+ [ '(ඉ[i\\)e]|එe)', 'ඊ' ], // ii i) ie ee
+ [ 'එ[a\\)i]', 'ඒ' ], // ea e) ei
+ [ 'ඔ[e\\)]', 'ඕ' ], // oe o)
+ [ '(උ[u\\)]|ඔo)', 'ඌ' ], // uu u) oo
+ [ 'අu', 'ඖ' ], // au
+
+ [ '\\\\n', 'ං' ],
+ [ '\\\\h', 'ඃ' ],
+ [ '\\\\N', 'ඞ' ],
+ [ '\\\\R', 'ඍ' ],
+
+ [ 'a', 'අ' ],
+ [ 'A', 'ඇ' ],
+ [ 'i', 'ඉ' ],
+ [ 'e', 'එ' ],
+ [ 'o', 'ඔ' ],
+ [ 'u', 'උ' ],
+
+ [ 'k', 'ක්' ],
+ [ 'b', 'බ්' ],
+ [ 'B', 'ඹ්' ],
+ [ 'g', 'ග්' ],
+ [ 'm', 'ම්' ],
+ [ 'y', 'ය්' ],
+ [ 'j', 'ජ්' ],
+ [ 'r', 'ර්' ],
+ [ 'T', 'ඨ්' ],
+ [ 'f', 'ෆ්' ],
+ [ 't', 'ට්' ],
+ [ 'l', 'ල්' ],
+ [ 'D', 'ඪ්' ],
+ [ 'd', 'ඩ්' ],
+ [ '(w|v)', 'ව්' ],
+ [ 's', 'ස්' ],
+ [ 'q', 'ඣ්' ],
+ [ 'h', 'හ්' ],
+ [ 'n', 'න්' ],
+ [ 'N', 'ණ්' ],
+ [ 'p', 'ප්' ],
+ [ 'L', 'ළ්' ] ]
+ };
+
+ $.ime.register( siSinglish );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/si/si-wijesekara.js b/UniversalLanguageSelector/lib/jquery.ime/rules/si/si-wijesekara.js
new file mode 100644
index 00000000..9c6e531b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/si/si-wijesekara.js
@@ -0,0 +1,105 @@
+( function ( $ ) {
+ 'use strict';
+
+ var siWijesekara = {
+ id: 'si-wijesekara',
+ name: 'Sinhalese Wijesekara',
+ description: 'Wijesekara layout for Sinhalese',
+ date: '2012-10-16',
+ URL: 'http://www.ucsc.lk/ltrl/services/layout/',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ '`', '\u0DCA\u200D\u0DBB' ],
+ [ '~', '\u0DBB\u0DCA\u200D' ],
+ [ 'q', 'ු' ],
+ [ 'w', 'අ' ],
+ [ 'අe', 'ඇ' ],
+ [ 'e', 'ැ' ],
+ [ 'r', 'ර' ],
+ [ 'ෙt', 'ඓ' ],
+ [ 't', 'එ' ],
+ [ 'y', 'හ' ],
+ [ 'u', 'ම' ],
+ [ 'i', 'ස' ],
+ [ 'o', 'ද' ],
+ [ 'p', 'ච' ],
+ [ '\\[', 'ඤ' ],
+ [ '\\]', ';' ],
+ [ 'එa', 'ඒ' ],
+ [ 'ඔa', 'ඕ' ],
+ [ 'a', '්' ],
+ [ 's', 'ි' ],
+ [ 'අd', 'ආ' ],
+ [ 'd', 'ා' ],
+ [ 'f', 'ෙ' ],
+ [ 'g', 'ට' ],
+ [ 'h', 'ය' ],
+ [ 'j', 'ව' ],
+ [ 'k', 'න' ],
+ [ 'l', 'ක' ],
+ [ ';', 'ත' ],
+ [ '\'', '.' ],
+ [ 'z', '\'' ],
+ [ 'x', 'ං' ],
+ [ 'c', 'ජ' ],
+ [ 'v', 'ඩ' ],
+ [ 'b', 'ඉ' ],
+ [ 'n', 'බ' ],
+ [ 'm', 'ප' ],
+ [ '\\,', 'ල' ],
+ [ '\\.', 'ග' ],
+
+ [ 'Q', 'ූ' ],
+ [ 'W', 'උ' ],
+ [ 'අE', 'ඈ' ],
+ [ 'E', 'ෑ' ],
+ [ 'R', 'ඍ' ],
+ [ 'T', 'ඔ' ],
+ [ 'Y', 'ශ' ],
+ [ 'U', 'ඹ' ],
+ [ 'I', 'ෂ' ],
+ [ 'O', 'ධ' ],
+ [ 'P', 'ඡ' ],
+ [ '\\{', 'ඥ' ],
+ [ '\\}', ':' ],
+ [ 'උA', 'ඌ' ],
+ [ 'ඏA', 'ඐ' ],
+ [ 'ඔA', 'ඖ' ],
+ [ 'A', 'ෟ' ],
+ [ 'S', 'ී' ],
+ [ 'ඍD', 'ඎ' ],
+ [ 'ෘD', 'ෲ' ],
+ [ 'D', 'ෘ' ],
+ [ 'F', 'ෆ' ],
+ [ 'G', 'ඨ' ],
+ [ 'H', 'ය' ],
+ [ 'J', 'ළ' ],
+ [ 'K', 'ණ' ],
+ [ 'L', 'ඛ' ],
+ [ '\\:', 'ථ' ],
+ [ '"', ',' ],
+ [ 'Z', '"' ],
+ [ 'X', 'ඃ' ],
+ [ 'C', 'ඣ' ],
+ [ 'V', 'ඪ' ],
+ [ 'B', 'ඊ' ],
+ [ 'N', 'භ' ],
+ [ 'M', 'ඵ' ],
+ [ '\\<', 'ළ' ],
+ [ '\\>', 'ඝ' ] ],
+ patterns_x: [
+ [ 'o', 'ඳ' ],
+ [ 'v', 'ඬ' ],
+ [ '\'', '෴' ],
+ [ 'a', 'ෳ' ],
+ [ '\\.', 'ඟ' ],
+ [ 'x', 'ඦ' ],
+ [ ',', 'ඏ' ] ]
+ };
+
+ $.ime.register( siWijesekara );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sjo/sjo.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sjo/sjo.js
new file mode 100644
index 00000000..11869757
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sjo/sjo.js
@@ -0,0 +1,112 @@
+( function ( $ ) {
+ 'use strict';
+
+ var sibe = {
+ id: 'sjo',
+ name: 'Sibe Scripts',
+ description: 'Sibe Scripts',
+ date: '2014-4-22',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Feilong Huang, <huangfeilong@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', '' ],
+ [ 'W', '\u1838' ],
+ [ 'E', '\u1827' ],
+ [ 'R', '\u1870' ],
+ [ 'T', '' ],
+ [ 'Y', '' ],
+ [ 'U', '' ],
+ [ 'I', '\u185f' ],
+ [ 'O', '' ],
+ [ 'P', '' ],
+ [ '{', '〈' ],
+ [ '}', '〉' ],
+ [ 'A', '' ],
+ [ 'S', '' ],
+ [ 'D', '' ],
+ [ 'F', '' ],
+ [ 'G', '\u186c' ],
+ [ 'H', '\u186d' ],
+ [ 'J', '' ],
+ [ 'K', '\u183b' ],
+ [ 'L', '\u1840' ],
+ [ ':', '\u1804' ],
+ [ '"', '\u180c' ],
+ [ 'Z', '\u1872' ],
+ [ 'X', '\u1871' ],
+ [ 'C', '\u1842' ],
+ [ 'V', '' ],
+ [ 'B', '' ],
+ [ 'N', '\u1862' ],
+ [ 'M', '' ],
+ [ '<', '《' ],
+ [ '>', '》' ],
+ [ '\\?', '?' ],
+ [ '_', '\u180e' ],
+ [ '\\+', '+' ],
+
+ [ 'q', '\u1834' ],
+ [ 'w', '\u1823' ],
+ [ 'e', '\u185d' ],
+ [ 'r', '\u1837' ],
+ [ 't', '\u1868' ],
+ [ 'y', '\u1836' ],
+ [ 'u', '\u1860' ],
+ [ 'i', '\u185e' ],
+ [ 'o', '\u1825' ],
+ [ 'p', '\u1866' ],
+ [ '\\[', '〔' ],
+ [ '\\]', '〕' ],
+ [ 'a', '\u1820' ],
+ [ 's', '\u1830' ],
+ [ 'd', '\u1869' ],
+ [ 'f', '\u186b' ],
+ [ 'g', '\u1864' ],
+ [ 'h', '\u1865' ],
+ [ 'j', '\u186a' ],
+ [ 'k', '\u1863' ],
+ [ 'l', '\u182f' ],
+ [ ';', ';' ],
+ [ '\'', '\u180b' ],
+ [ 'z', '\u186f' ],
+ [ 'x', '\u1867' ],
+ [ 'c', '\u186e' ],
+ [ 'v', '\u1861' ],
+ [ 'b', '\u182a' ],
+ [ 'n', '\u1828' ],
+ [ 'm', '\u182e' ],
+ [ ',', '\u1808' ],
+ [ '\\.', '\u1809' ],
+ [ '/', '.' ],
+ [ '\\-', '\u202f' ],
+ [ '=', '=' ],
+
+ [ '`', '\u180d' ],
+ [ '~', '~' ],
+ [ '1', '1' ],
+ [ '2', '2' ],
+ [ '3', '3' ],
+ [ '4', '4' ],
+ [ '5', '5' ],
+ [ '6', '6' ],
+ [ '7', '7' ],
+ [ '8', '8' ],
+ [ '9', '9' ],
+ [ '0', '0' ],
+ [ '!', '!' ],
+ [ '@', '\u2048' ],
+ [ '#', '\u2049' ],
+ [ '\\$', '—' ],
+ [ '%', '%' ],
+ [ '\\^', '\u200c' ],
+ [ '&', '\u180a' ],
+ [ '\\*', '\u200d' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ]
+ ]
+ };
+
+ $.ime.register( sibe );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sk/sk-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sk/sk-kbd.js
new file mode 100644
index 00000000..b8ad3000
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sk/sk-kbd.js
@@ -0,0 +1,105 @@
+( function ( $ ) {
+ 'use strict';
+
+ var skKbd = {
+ id: 'sk-kbd',
+ name: 'Slovak kbd',
+ description: 'Slovak kbd keyboard layout',
+ date: '2013-06-26',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.1',
+ patterns: [
+ [ '1', '+' ],
+ [ '2', 'ľ' ],
+ [ '3', 'š' ],
+ [ '4', 'č' ],
+ [ '5', 'ť' ],
+ [ '6', 'ž' ],
+ [ '7', 'ý' ],
+ [ '8', 'á' ],
+ [ '9', 'í' ],
+ [ '0', 'é' ],
+ [ '!', '1' ],
+ [ '@', '2' ],
+ [ '#', '3' ],
+ [ '\\$', '4' ],
+ [ '%', '5' ],
+ [ '\\^', '6' ],
+ [ '&', '7' ],
+ [ '\\*', '8' ],
+ [ '\\(', '9' ],
+ [ '\\)', '0' ],
+ [ '-', '=' ],
+ [ '_', '%' ],
+ [ '=', '´' ],
+ [ '\\+', 'ˇ' ],
+ [ '\\[', 'ú' ],
+ [ '\\{', '/' ],
+ [ '\\]', 'ä' ],
+ [ '\\}', '(' ],
+ [ '\\\\', 'ň' ],
+ [ '\\|', ')' ],
+ [ ';', 'ô' ],
+ [ ':', '"' ],
+ [ '\'', '§' ],
+ [ '"', '!' ],
+ [ '\\<', '?' ],
+ [ '\\>', ':' ],
+ [ '/', '-' ],
+ [ '\\?', '_' ],
+ [ '`', ';' ],
+ [ '~', '°' ],
+
+ [ '´a', 'á' ],
+ [ '´A', 'Á' ],
+ [ '´e', 'é' ],
+ [ '´E', 'É' ],
+ [ '´i', 'í' ],
+ [ '´I', 'Í' ],
+ [ '´l', 'ĺ' ],
+ [ '´L', 'Ĺ' ],
+ [ '´o', 'ó' ],
+ [ '´O', 'Ó' ],
+ [ '´r', 'ŕ' ],
+ [ '´R', 'Ŕ' ],
+ [ '´u', 'ú' ],
+ [ '´U', 'Ú' ],
+ [ '´y', 'ý' ],
+ [ '´Y', 'Ý' ],
+
+ [ '¨a', 'ä' ],
+ [ '¨A', 'Ä' ],
+ [ '\\^o', 'ô' ],
+ [ '\\^O', 'Ô' ],
+
+ [ 'ˇc', 'č' ],
+ [ 'ˇC', 'Č' ],
+ [ 'ˇd', 'ď' ],
+ [ 'ˇD', 'Ď' ],
+ [ 'ˇl', 'ľ' ],
+ [ 'ˇL', 'Ľ' ],
+ [ 'ˇn', 'ň' ],
+ [ 'ˇN', 'Ň' ],
+ [ 'ˇs', 'š' ],
+ [ 'ˇS', 'Š' ],
+ [ 'ˇt', 'ť' ],
+ [ 'ˇT', 'Ť' ],
+ [ 'ˇz', 'ž' ],
+ [ 'ˇZ', 'Ž' ],
+
+ // It's QWERTZ
+ [ 'y', 'z' ],
+ [ 'z', 'y' ],
+ [ 'Y', 'Z' ],
+ [ 'Z', 'Y' ]
+ ],
+ patterns_x: [
+ [ '3', '^' ],
+ [ '=', '¨' ]
+ ]
+ };
+
+ $.ime.register( skKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sr/sr-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sr/sr-kbd.js
new file mode 100644
index 00000000..890aa996
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sr/sr-kbd.js
@@ -0,0 +1,98 @@
+( function ( $ ) {
+ 'use strict';
+
+ var srKbd = {
+ id: 'sr-kbd',
+ name: 'Serbian keyboard',
+ description: 'Serbian keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '\'g', 'ѓ' ],
+ [ '\'G', 'Ѓ' ],
+ [ '\'k', 'ќ' ],
+ [ '\'K', 'Ќ' ],
+ [ '\\@', '"' ],
+ [ '\\^', '&' ],
+ [ '\\&', '/' ],
+ [ '\\*', '(' ],
+ [ '\\(', ')' ],
+ [ '\\)', '=' ],
+ [ '\\-', '\'' ],
+ [ '\\_', '?' ],
+ [ '\\=', '+' ],
+ [ '\\+', '*' ],
+ [ 'q', 'љ' ],
+ [ 'Q', 'Љ' ],
+ [ 'w', 'њ' ],
+ [ 'W', 'Њ' ],
+ [ 'e', 'е' ],
+ [ 'E', 'Е' ],
+ [ 'r', 'р' ],
+ [ 'R', 'Р' ],
+ [ 't', 'т' ],
+ [ 'T', 'Т' ],
+ [ 'y', 'з' ],
+ [ 'Y', 'З' ],
+ [ 'u', 'у' ],
+ [ 'U', 'У' ],
+ [ 'i', 'и' ],
+ [ 'I', 'И' ],
+ [ 'o', 'о' ],
+ [ 'O', 'О' ],
+ [ 'p', 'п' ],
+ [ 'P', 'П' ],
+ [ '\\[', 'ш' ],
+ [ '\\{', 'Ш' ],
+ [ '\\]', 'ђ' ],
+ [ '\\}', 'Ђ' ],
+ [ 'a', 'а' ],
+ [ 'A', 'А' ],
+ [ 's', 'с' ],
+ [ 'S', 'С' ],
+ [ 'd', 'д' ],
+ [ 'D', 'Д' ],
+ [ 'f', 'ф' ],
+ [ 'F', 'Ф' ],
+ [ 'g', 'г' ],
+ [ 'G', 'Г' ],
+ [ 'h', 'х' ],
+ [ 'H', 'Х' ],
+ [ 'j', 'ј' ],
+ [ 'J', 'Ј' ],
+ [ 'k', 'к' ],
+ [ 'K', 'К' ],
+ [ 'l', 'л' ],
+ [ 'L', 'Л' ],
+ [ ';', 'ч' ],
+ [ ':', 'Ч' ],
+ [ '\'', 'ћ' ],
+ [ '"', 'Ћ' ],
+ [ '\\\\', 'ж' ],
+ [ '\\|', 'Ж' ],
+ [ 'z', 'ѕ' ],
+ [ 'Z', 'Ѕ' ],
+ [ 'x', 'џ' ],
+ [ 'X', 'Џ' ],
+ [ 'c', 'ц' ],
+ [ 'C', 'Ц' ],
+ [ 'v', 'в' ],
+ [ 'V', 'В' ],
+ [ 'b', 'б' ],
+ [ 'B', 'Б' ],
+ [ 'n', 'н' ],
+ [ 'N', 'Н' ],
+ [ 'm', 'м' ],
+ [ 'M', 'М' ],
+ [ '\\<', ';' ],
+ [ '\\>', ':' ],
+ [ '/', '-' ],
+ [ '\\?', '_' ]
+ ]
+ };
+
+ $.ime.register( srKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/st/st-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/st/st-tilde.js
new file mode 100644
index 00000000..d1dd6e5e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/st/st-tilde.js
@@ -0,0 +1,22 @@
+( function ( $ ) {
+ 'use strict';
+
+ var stTilde = {
+ id: 'st-tilde',
+ name: 'st-tilde',
+ description: 'Sotho tilde keyboard',
+ date: '2019-03-28',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~S', 'Š' ],
+ [ '~s', 'š' ],
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~\\-', '\u0304' ] // Combining macron
+ ]
+ };
+
+ $.ime.register( stTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/sv/sv-normforms.js b/UniversalLanguageSelector/lib/jquery.ime/rules/sv/sv-normforms.js
new file mode 100644
index 00000000..0f111d9e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/sv/sv-normforms.js
@@ -0,0 +1,50 @@
+( function ( $ ) {
+ 'use strict';
+
+ var defs = {
+ id: 'sv-normforms',
+ name: 'Svenska',
+ description: 'Swedish input method with most common form transliterated',
+ date: '2012-12-04',
+ URL: 'http://www.evertype.com/alphabets/swedish.pdf',
+ author: 'John Erling Blad',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 3,
+ patterns: [
+ // The most common transliterations
+ [ 'aa', 'å' ],
+ [ 'AA', 'Å' ],
+ [ 'Aa', 'Å' ],
+ [ 'ae', 'ä' ],
+ [ 'AE', 'Ä' ],
+ [ 'Ae', 'Ä' ],
+ [ 'oe', 'ö' ],
+ [ 'OE', 'Ö' ],
+ [ 'Oe', 'Ö' ],
+ // The previous as negated transliterations, mostly for names
+ [ 'åa', 'a', 'aa' ],
+ [ 'ÅA', 'A', 'AA' ],
+ [ 'Åa', 'A', 'Aa' ],
+ [ 'åA', 'a', 'aA' ],
+ [ 'äe', 'e', 'ae' ],
+ [ 'ÄE', 'E', 'AE' ],
+ [ 'Äe', 'E', 'Ae' ],
+ [ 'äE', 'e', 'aE' ],
+ [ 'öe', 'e', 'oe' ],
+ [ 'ÖE', 'E', 'OE' ],
+ [ 'Öe', 'E', 'Oe' ], // this fails for some names like "Øen"
+ [ 'öE', 'e', 'oE' ]
+ // historically similar forms
+ // "Å" is sometimes written as "Aa", and "å" as "aa", but in names
+ // it is not generally acceptable to use this transliteration. The
+ // same is the case for "Ô" vs "Oe". To
+ // handle those situations we need some oposite forms.
+ // There is a similar character "Å" for the length unit Angstrom,
+ // but this is not the upper case letter Å.
+ ]
+ };
+
+ $.ime.register( defs );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-99.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-99.js
new file mode 100644
index 00000000..8a53f2bc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-99.js
@@ -0,0 +1,190 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ta99 = {
+ id: 'ta-99',
+ name: 'தமிழ்99',
+ description: 'Tamil 99 Keyboard',
+ date: '2012-11-20',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 4,
+ patterns: [
+ [ '([க-ஹ])h', 'a', '$1க' ],
+ [ '([க-ஹ])b', 'a', '$1ங' ],
+ [ '([க-ஹ])\\[', 'a', '$1ச' ],
+ [ '([க-ஹ])E', 'a', '$1ஜ' ],
+ [ '([க-ஹ])\\]', 'a', '$1ஞ' ],
+ [ '([க-ஹ])o', 'a', '$1ட' ],
+ [ '([க-ஹ])p', 'a', '$1ண' ],
+ [ '([க-ஹ])l', 'a', '$1த' ],
+ [ '([க-ஹ]);', 'a', '$1ந' ],
+ [ '([க-ஹ])i', 'a', '$1ன' ],
+ [ '([க-ஹ])j', 'a', '$1ப' ],
+ [ '([க-ஹ])k', 'a', '$1ம' ],
+ [ '([க-ஹ])\'', 'a', '$1ய' ],
+ [ '([க-ஹ])m', 'a', '$1ர' ],
+ [ '([க-ஹ])u', 'a', '$1ற' ],
+ [ '([க-ஹ])n', 'a', '$1ல' ],
+ [ '([க-ஹ])y', 'a', '$1ள' ],
+ [ '([க-ஹ])/', 'a', '$1ழ' ],
+ [ '([க-ஹ])v', 'a', '$1வ' ],
+ // void
+ [ '([க-ஹ])W', 'a', '$1ஷ' ],
+ [ '([க-ஹ])Q', 'a', '$1ஸ' ],
+ [ '([க-ஹ])R', 'a', '$1ஹ' ],
+
+ [ 'க்கh', 'க்கக' ],
+ [ 'ங்ஙb', 'ங்ஙங' ],
+ [ 'ச்ச\\[', 'ச்சச' ],
+ [ 'ஜ்ஜE', 'ஜ்ஜஜ' ],
+ [ 'ஞ்ஞ\\]', 'ஞ்ஞஞ' ],
+ [ 'ட்டo', 'ட்டட' ],
+ [ 'ண்ணp', 'ண்ணண' ],
+ [ 'த்தl', 'த்தத' ],
+ [ 'ந்ந;', 'ந்நந' ],
+ [ 'ன்னi', 'ன்னன' ],
+ [ 'ப்பj', 'ப்பப' ],
+ [ 'ம்மk', 'ம்மம' ],
+ [ 'ய்ய\'', 'ய்யய' ],
+ [ 'ர்ரm', 'ர்ரர' ],
+ [ 'ற்றu', 'ற்றற' ],
+ [ 'ல்லn', 'ல்லல' ],
+ [ 'ள்ளy', 'ள்ளள' ],
+ [ 'ழ்ழ/', 'ழ்ழழ' ],
+ [ 'வ்வv', 'வ்வவ' ],
+ // void
+ [ 'ஷ்ஷW', 'ஷ்ஷஷ' ],
+ [ 'ஸ்ஸQ', 'ஸ்ஸஸ' ],
+ [ 'ஹ்ஹR', 'ஹ்ஹஹ' ],
+
+ [ '([க-ஹ])q', '$1ா' ],
+ [ '([க-ஹ])s', '$1ி' ],
+ [ '([க-ஹ])w', '$1ீ' ],
+ [ '([க-ஹ])d', '$1ு' ],
+ [ '([க-ஹ])e', '$1ூ' ],
+ [ '([க-ஹ])g', '$1ெ' ],
+ [ '([க-ஹ])t', '$1ே' ],
+ [ '([க-ஹ])r', '$1ை' ],
+ [ '([க-ஹ])c', '$1ொ' ],
+ [ '([க-ஹ])x', '$1ோ' ],
+ [ '([க-ஹ])z', '$1ௌ' ],
+
+ [ '([க-ஹ])a', '$1' ],
+
+ [ 'கh', 'க்க' ],
+ [ 'ஙb', 'ங்ங' ],
+ [ 'ச\\[', 'ச்ச' ],
+ [ 'ஜE', 'ஜ்ஜ' ],
+ [ 'ஞ\\]', 'ஞ்ஞ' ],
+ [ 'டo', 'ட்ட' ],
+ [ 'ணp', 'ண்ண' ],
+ [ 'தl', 'த்த' ],
+ [ 'ந;', 'ந்ந' ],
+ [ 'னi', 'ன்ன' ],
+ [ 'பj', 'ப்ப' ],
+ [ 'மk', 'ம்ம' ],
+ [ 'ய\'', 'ய்ய' ],
+ [ 'ரm', 'ர்ர' ],
+ [ 'றu', 'ற்ற' ],
+ [ 'லn', 'ல்ல' ],
+ [ 'ளy', 'ள்ள' ],
+ [ 'ழ/', 'ழ்ழ' ],
+ [ 'வv', 'வ்வ' ],
+ // void
+ [ 'ஷW', 'ஷ்ஷ' ],
+ [ 'ஸQ', 'ஸ்ஸ' ],
+ [ 'ஹR', 'ஹ்ஹ' ],
+
+ [ 'நl', 'ந்த' ],
+ [ 'ஙh', 'ங்க' ],
+ [ 'னu', 'ன்ற' ],
+ [ 'ணo', 'ண்ட' ],
+ [ 'ஞ\\[', 'ஞ்ச' ],
+ [ 'மj', 'ம்ப' ],
+
+ [ 'q', 'ஆ' ],
+ [ 'w', 'ஈ' ],
+ [ 'e', 'ஊ' ],
+ [ 'r', 'ஐ' ],
+ [ 't', 'ஏ' ],
+ [ 'y', 'ள' ],
+ [ 'u', 'ற' ],
+ [ 'i', 'ன' ],
+ [ 'o', 'ட' ],
+ [ 'p', 'ண' ],
+ [ '\\[', 'ச' ],
+ [ '\\]', 'ஞ' ],
+
+ [ 'a', 'அ' ],
+ [ 's', 'இ' ],
+ [ 'd', 'உ' ],
+ [ 'f', '்' ],
+ [ 'g', 'எ' ],
+ [ 'h', 'க' ],
+ [ 'j', 'ப' ],
+ [ 'k', 'ம' ],
+ [ 'l', 'த' ],
+ [ ';', 'ந' ],
+ [ '\'', 'ய' ],
+
+ [ 'z', 'ஔ' ],
+ [ 'x', 'ஓ' ],
+ [ 'c', 'ஒ' ],
+ [ 'v', 'வ' ],
+ [ 'b', 'ங' ],
+ [ 'n', 'ல' ],
+ [ 'm', 'ர' ],
+ [ '/', 'ழ' ],
+
+ // ksha in non-conjunct form with ZWNJ.
+ [ 'க்W', 'க்\u200Cஷ' ],
+ [ 'Q', 'ஸ' ],
+ [ 'W', 'ஷ' ],
+ [ 'E', 'ஜ' ],
+ [ 'R', 'ஹ' ],
+ [ 'T', 'க்ஷ' ],
+ [ 'Y', 'ஸ்ரீ' ],
+ [ 'U', 'ற' ],
+ [ 'I', ':' ],
+ [ 'O', '[' ],
+ [ 'P', ']' ],
+
+ [ 'A', '௹' ],
+ [ 'S', '௺' ],
+ [ 'D', '௸' ],
+ [ 'F', 'ஃ' ],
+ [ 'G', '⚪' ],
+ [ 'H', '⚫' ],
+ [ 'J', '★' ],
+ [ 'K', '"' ],
+ [ 'L', '௱' ],
+ [ ':', ';' ],
+ [ '"', "'" ],
+
+ [ 'Z', '௳' ],
+ [ 'X', '௴' ],
+ [ 'C', '௵' ],
+ [ 'V', '௶' ],
+ [ 'B', '௷' ],
+ [ 'N', 'ௐ' ],
+ [ 'M', '/' ],
+
+ [ '\\\\0', '\u0be6' ],
+ [ '\\\\1', '௧' ],
+ [ '\\\\2', '௨' ],
+ [ '\\\\3', '௩' ],
+ [ '\\\\4', '௪' ],
+ [ '\\\\5', '௫' ],
+ [ '\\\\6', '௬' ],
+ [ '\\\\7', '௭' ],
+ [ '\\\\8', '௮' ],
+ [ '\\\\9', '௯' ]
+ ]
+ };
+
+ $.ime.register( ta99 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-bamini.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-bamini.js
new file mode 100644
index 00000000..500e729d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-bamini.js
@@ -0,0 +1,90 @@
+( function ( $ ) {
+ 'use strict';
+
+ var taBamini = {
+ id: 'ta-bamini',
+ name: 'பாமினி',
+ description: 'Tamil Bamini input method',
+ date: '2012-10-03',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ '`', 'ஹ' ],
+ [ 'q', 'ங' ],
+ [ 'w', 'ற' ],
+ [ 'e', 'ந' ],
+ [ 'r', 'ச' ],
+ [ 't', 'வ' ],
+ [ 'y', 'ல' ],
+ [ 'u', 'ர' ],
+ [ 'i', 'ை' ],
+ [ 'o', 'ழ' ],
+ [ 'p', 'ி' ],
+ [ '\\[', 'ஜ' ],
+ [ '\\]', 'ஸ' ],
+ [ '\\\\', 'ஷ' ],
+ [ 'a', 'ய' ],
+ [ 's', 'ள' ],
+ [ 'd', 'ன' ],
+ [ 'f', 'க' ],
+ [ 'g', 'ப' ],
+ [ 'h', 'ா' ],
+ [ 'j', 'த' ],
+ [ 'k', 'ம' ],
+ [ 'l', 'ட' ],
+ [ ';', '்' ],
+ [ 'z', 'ண' ],
+ [ 'x', 'ஒ' ],
+ [ 'c', 'உ' ],
+ [ 'v', 'எ' ],
+ [ 'b', 'டி' ],
+ [ 'n', 'ெ' ],
+ [ 'N', 'ே' ],
+ [ 'm', 'அ' ],
+ [ ',', 'இ' ],
+ [ '/', 'ஃ' ],
+ [ '@', ';' ],
+ [ '#', 'சூ' ],
+ [ '\\$', 'கூ' ],
+ [ '%', 'மூ' ],
+ [ '\\^', 'டூ' ],
+ [ '&', 'ரூ' ],
+ [ '\\*', 'ழூ' ],
+ [ '=', 'ஸ்ரீ' ],
+ [ 'Q', 'ஞ' ],
+ [ 'W', 'று' ],
+ [ 'E', 'நு' ],
+ [ 'R', 'சு' ],
+ [ 'T', 'வு' ],
+ [ 'Y', 'லு' ],
+ [ 'U', 'ரு' ],
+ [ 'I', 'ஐ' ],
+ [ 'O', 'ழு' ],
+ [ 'P', 'ீ' ],
+ [ '\\|', '\'' ],
+ [ 'A', 'யு' ],
+ [ 'S', 'ளு' ],
+ [ 'D', 'னு' ],
+ [ 'F', 'கு' ],
+ [ 'G', 'பு' ],
+ [ 'H', 'ர்' ],
+ [ 'J', 'து' ],
+ [ 'K', 'மு' ],
+ [ 'L', 'டு' ],
+ [ 'Z', 'ணு' ],
+ [ 'X', 'ஓ' ],
+ [ 'C', 'ஊ' ],
+ [ 'V', 'ஏ' ],
+ [ 'B', 'டீ' ],
+ [ 'M', 'ஆ' ],
+ [ '\\<', 'ஈ' ],
+ [ '\\>', ',' ],
+ [ '([ஜஷஸஹ])\\{', '$1ு' ],
+ [ '([ஜஷஸஹ])\\_', '$1ூ' ] ]
+ };
+ $.ime.register( taBamini );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-inscript.js
new file mode 100644
index 00000000..f3a3ee91
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-inscript.js
@@ -0,0 +1,103 @@
+( function ( $ ) {
+ 'use strict';
+
+ var taInScript = {
+ id: 'ta-inscript',
+ name: 'இன்ஸ்கிரிப்ட்',
+ description: 'Tamil InScript Keyboard',
+ date: '2012-11-20',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 4,
+ patterns: [
+ [ '`', 'ொ' ],
+ [ '~', 'ஒ' ],
+
+ [ '&', 'க்ஷ' ],
+ [ '\\*', 'ஷ்ர' ],
+
+ // ['\\(', '\u200D'], // ZWJ is not used in Tamil.
+ [ '\\)', '\u200C' ], // ZWNJ
+
+ [ '_', 'ஃ' ],
+
+ [ 'q', 'ௌ' ],
+ [ 'Q', 'ஔ' ],
+ [ 'w', 'ை' ],
+ [ 'W', 'ஐ' ],
+ [ 'e', 'ா' ],
+ [ 'E', 'ஆ' ],
+ [ 'r', 'ீ' ],
+ [ 'R', 'ஈ' ],
+ [ 't', 'ூ' ],
+ [ 'T', 'ஊ' ],
+ [ 'u', 'ஹ' ],
+ [ 'U', 'ங' ],
+ [ 'p', 'ஜ' ],
+ [ '\\}', 'ஞ' ],
+
+ [ 'a', 'ோ' ],
+ [ 'A', 'ஓ' ],
+ [ 's', 'ே' ],
+ [ 'S', 'ஏ' ],
+ [ 'd', '்' ],
+ [ 'D', 'அ' ],
+ [ 'f', 'ி' ],
+ [ 'F', 'இ' ],
+ [ 'g', 'ு' ],
+ [ 'G', 'உ' ],
+ [ 'h', 'ப' ],
+ [ 'j', 'ர' ],
+ [ 'J', 'ற' ],
+ [ 'k', 'க' ],
+ [ 'l', 'த' ],
+ [ ';', 'ச' ],
+ [ '\'', 'ட' ],
+
+ [ 'z', 'ெ' ],
+ [ 'Z', 'எ' ],
+ // ['x', 'ஂ'], -- Anusvara is not used in Tamil.
+ [ 'c', 'ம' ],
+ [ 'C', 'ண' ],
+ [ 'v', 'ந' ],
+ [ 'V', 'ன' ],
+ [ 'b', 'வ' ],
+ [ 'B', 'ழ' ],
+ [ 'n', 'ல' ],
+ [ 'N', 'ள' ],
+ [ 'm', 'ஸ' ],
+ [ 'M', 'ஶ' ],
+ [ '<', 'ஷ' ],
+ [ '/', 'ய' ],
+
+ [ '1', '௧' ],
+ [ '2', '௨' ],
+ [ '3', '௩' ],
+ [ '4', '௪' ],
+ [ '5', '௫' ],
+ [ '6', '௬' ],
+ [ '7', '௭' ],
+ [ '8', '௮' ],
+ [ '9', '௯' ],
+ [ '0', '௦' ] ],
+
+ patterns_x: [
+ [ 'X', 'ௐ' ],
+ [ '\\)', '௰' ],
+ [ '-', '௱' ],
+ [ '=', '௲' ],
+ [ 'n', '௳' ],
+ [ 'c', '௴' ],
+ [ 'b', '௵' ],
+ [ 'h', '௶' ],
+ [ 'y', '௷' ],
+ [ 'C', '௸' ],
+ [ ',', '௹' ],
+ [ 'V', '௺' ],
+ [ '4', '₹' ] ]
+ };
+ $.ime.register( taInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-inscript2.js
new file mode 100644
index 00000000..e6910790
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-inscript2.js
@@ -0,0 +1,107 @@
+( function ( $ ) {
+ 'use strict';
+
+ var taInScript2 = {
+ id: 'ta-inscript2',
+ name: 'இன்ஸ்கிரிப்ட் 2',
+ description: 'Enhanced InScript Keyboard for Tamil',
+ date: '2013-01-16',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '௧' ],
+ [ '2', '௨' ],
+ [ '3', '௩' ],
+ [ '4', '௪' ],
+ [ '5', '௫' ],
+ [ '\\^', 'த்ர' ],
+ [ '6', '௬' ],
+ [ '\\&', 'க்ஷ' ],
+ [ '7', '௭' ],
+ [ '\\*', 'ஷ்ர' ],
+ [ '8', '௮' ],
+ [ '\\(', '(' ],
+ [ '9', '௯' ],
+ [ '\\)', ')' ],
+ [ '0', '௦' ],
+ [ '\\_', 'ஃ' ],
+ [ '\\-', '-' ],
+ [ '\\=', '=' ],
+ [ 'Q', 'ஔ' ],
+ [ 'q', 'ௌ' ],
+ [ 'W', 'ஐ' ],
+ [ 'w', 'ை' ],
+ [ 'E', 'ஆ' ],
+ [ 'e', 'ா' ],
+ [ 'R', 'ஈ' ],
+ [ 'r', 'ீ' ],
+ [ 'T', 'ஊ' ],
+ [ 't', 'ூ' ],
+ [ 'y', 'y' ],
+ [ 'U', 'ங' ],
+ [ 'u', 'ஹ' ],
+ [ 'p', 'ஜ' ],
+ [ '\\}', 'ஞ' ],
+ [ 'A', 'ஓ' ],
+ [ 'a', 'ோ ' ],
+ [ 'S', 'ஏ' ],
+ [ 's', 'ே' ],
+ [ 'D', 'அ' ],
+ [ 'd', '்' ],
+ [ 'F', 'இ' ],
+ [ 'f', 'ி' ],
+ [ 'G', 'உ' ],
+ [ 'g', 'ு' ],
+ [ 'h', 'ப' ],
+ [ 'J', 'ற' ],
+ [ 'j', 'ர' ],
+ [ 'k', 'க' ],
+ [ 'l', 'த' ],
+ [ ';', 'ச' ],
+ [ '\\\'', 'ட' ],
+ [ '\\~', 'ஒ' ],
+ [ '\\`', 'ொ' ],
+ [ 'Z', 'எ' ],
+ [ 'z', 'ெ' ],
+ [ 'x', 'ஂ' ],
+ [ 'X', 'X' ],
+ [ 'C', 'ண' ],
+ [ 'c', 'ம' ],
+ [ 'V', 'ன' ],
+ [ 'v', 'ந' ],
+ [ 'B', 'ழ' ],
+ [ 'b', 'வ' ],
+ [ 'N', 'ள' ],
+ [ 'n', 'ல' ],
+ [ 'M', 'ஶ' ],
+ [ 'm', 'ஸ' ],
+ [ '\\<', 'ஷ' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'ய' ]
+ ],
+ patterns_x: [
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '4', '₹' ],
+ [ '0', '௰' ],
+ [ '\\-', '௱' ],
+ [ '\\=', '௲' ],
+ [ 'y', '௷' ],
+ [ 'h', '௶' ],
+ [ 'X', 'ௐ' ],
+ [ 'C', '௸' ],
+ [ 'c', '௴' ],
+ [ 'V', '௺' ],
+ [ 'v', '௳' ],
+ [ 'b', '௵' ],
+ [ ',', '௹' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+
+ $.ime.register( taInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-transliteration.js
new file mode 100644
index 00000000..a000d5af
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ta/ta-transliteration.js
@@ -0,0 +1,120 @@
+( function ( $ ) {
+ 'use strict';
+
+ var taTransliteration = {
+ id: 'ta-transliteration',
+ name: 'எழுத்துப்பெயர்ப்பு',
+ description: 'Tamil Transliteration based input method',
+ date: '2012-10-03',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Junaid P V',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 4,
+ patterns: [
+ [ 'ச்h', 'h', 'ச்ஹ்' ],
+ [ 'ழ்h', 'h', 'ழ்ஹ்' ],
+
+ // '(ஸ்ரிi|ஸ்ர்I)',
+ [ 'ஸ்ர்i', 'ஸ்ரீ' ],
+
+ [ 'க்(ச்|ஸ்)h', 'க்\u200Cஷ்' ], // with ZWNJ
+ [ 'க்(ச்|ஸ்)H', 'க்ஷ்' ],
+
+ [ '([க-ஹ])்a', '$1' ],
+ [ '([க-ஹ])(்A|a)', '$1ா' ],
+ [ '([க-ஹ])்i', '$1ி' ],
+ [ '([க-ஹ])(்I|ிi)', '$1ீ' ],
+ [ '([க-ஹ])்u', '$1ு' ],
+ [ '([க-ஹ])(்U|ுu)', '$1ூ' ],
+ [ '([க-ஹ])்e', '$1ெ' ],
+ [ '([க-ஹ])(்E|ெe)', '$1ே' ],
+ [ '([க-ஹ])i', '$1ை' ],
+ [ '([க-ஹ])்o', '$1ொ' ],
+ [ '([க-ஹ])(்O|ொo)', '$1ோ' ],
+ [ '([க-ஹ])u', '$1ௌ' ],
+
+ [ '([அ-ஹ][ெ-்]?)n', '$1ன்' ],
+
+ [ 'அa', 'ஆ' ],
+ [ 'இi', 'ஈ' ],
+ [ 'உu', 'ஊ' ],
+ [ 'எe', 'ஏ' ],
+ [ 'அi', 'ஐ' ],
+ [ 'ஒo', 'ஓ' ],
+ [ 'அu', 'ஔ' ],
+
+ [ '(ந்|ன்)g', 'ங்' ],
+ [ '(ந்|ன்)j', 'ஞ்' ],
+ [ 'ச்h', 'ஷ்' ],
+ [ 'ழ்h', 'ழ்' ],
+ [ 'ட்h', 'த்' ],
+ [ 'ஸ்h', 'ஷ்' ],
+
+ [ 'a', 'அ' ],
+ [ 'b', 'ப்' ],
+ [ 'c', 'ச்' ],
+ [ 'd', 'ட்' ],
+ [ 'e', 'எ' ],
+ [ 'f', 'ஃப்' ],
+ [ 'g', 'க்' ],
+ [ 'h', 'ஹ்' ],
+ [ 'i', 'இ' ],
+ [ 'j', 'ஜ்' ],
+ [ 'k', 'க்' ],
+ [ 'l', 'ல்' ],
+ [ 'm', 'ம்' ],
+ [ 'n', 'ன்' ],
+ [ 'o', 'ஒ' ],
+ [ 'p', 'ப்' ],
+ [ 'q', 'ஃ' ],
+ [ 'r', 'ர்' ],
+ [ 's', 'ச்' ],
+ [ 't', 'ட்' ],
+ [ 'u', 'உ' ],
+ [ 'v', 'வ்' ],
+ [ 'w', 'ந்' ],
+ [ 'y', 'ய்' ],
+ [ 'z', 'ழ்' ],
+ [ 'A', 'ஆ' ],
+ [ 'B', 'ப்' ],
+ [ 'C', 'க்க்' ],
+ [ 'E', 'ஏ' ],
+ [ 'F', 'ஃப்' ],
+ [ 'G', 'க்' ],
+ [ 'H', 'ஃ' ],
+ [ 'I', 'ஈ' ],
+ [ 'J', 'ஜ்ஜ்' ],
+ [ 'K', 'க்' ],
+ [ 'L', 'ள்' ],
+ [ 'M', 'ம்ம்' ],
+ [ 'N', 'ண்' ],
+ [ 'O', 'ஓ' ],
+ [ 'P', 'ப்ப்' ],
+ [ 'Q', 'ஃ' ],
+ [ 'R', 'ற்' ],
+ [ 'S', 'ஸ்' ],
+ [ 'T', 'ட்' ],
+ [ 'U', 'ஊ' ],
+ [ '(V|W)', 'வ்வ்' ],
+ [ 'Y', 'ய்ய்' ],
+ [ 'Z', 'ஶ்' ],
+
+ [ '\\\\0', '\u0be6' ],
+ [ '\\\\1', '௧' ],
+ [ '\\\\2', '௨' ],
+ [ '\\\\3', '௩' ],
+ [ '\\\\4', '௪' ],
+ [ '\\\\5', '௫' ],
+ [ '\\\\6', '௬' ],
+ [ '\\\\7', '௭' ],
+ [ '\\\\8', '௮' ],
+ [ '\\\\9', '௯' ],
+ [ '10\\\\', '\u0BF0' ],
+ [ '100\\\\', '\u0BF1' ],
+ [ '1000\\\\', '\u0BF2' ] ]
+ };
+
+ $.ime.register( taTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-apple.js b/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-apple.js
new file mode 100644
index 00000000..ef488365
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-apple.js
@@ -0,0 +1,159 @@
+( function ( $ ) {
+ 'use strict';
+
+ var teApple = {
+ id: 'te-apple',
+ name: 'ఆపిల్',
+ description: 'Apple keyboard layout for Telugu',
+ date: '2014-12-27',
+ author: 'Praveen Illa',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+
+ [ '1', '1' ],
+ [ '2', '2' ],
+ [ '3', '3' ],
+ [ '4', '4' ],
+ [ '5', '5' ],
+ [ '6', '6' ],
+ [ '7', '7' ],
+ [ '8', '8' ],
+ [ '\\(', '(' ],
+ [ '9', '9' ],
+ [ '\\)', ')' ],
+ [ '0', '0' ],
+ [ '\\_', '÷' ],
+ [ '\\-', '×' ],
+ [ '\\+', '+' ],
+ [ '\\=', '=' ],
+
+ [ '\\!', '!' ],
+ [ '\\@', '\'' ],
+ [ '\\#', '%' ],
+ [ '\\$', '్పు' ],
+ [ '\\%', '్ర' ],
+ [ '\\^', '-' ],
+ [ '\\&', '|' ],
+ [ '\\*', '`' ],
+
+ [ '([క-హ])e', '$1ా' ],
+ [ '([క-హ])E', '$1ౄ' ],
+ [ '([క-హ])r', '$1ి' ],
+ [ '([క-హ])w', '$1ీ' ],
+ [ '([క-హ])W', '$1ృ' ],
+ [ '([క-హ])t', '$1ొ' ],
+ [ '([క-హ])y', '$1ో' ],
+ [ '([క-హ])u', '$1ె' ],
+ [ '([క-హ])i', '$1ు' ],
+ [ '([క-హ])o', '$1ే' ],
+ [ '([క-హ])p', '$1ూ' ],
+ [ '([క-హ])\\[', '$1ై' ],
+ [ '([క-హ])\\]', '$1ౌ' ],
+
+ [ 'Q', 'క్ష్మి' ],
+ [ 'q', 'అ' ],
+ [ 'W', 'ఋ' ],
+ [ 'w', 'ఈ' ],
+ [ 'E', 'ౠ' ],
+ [ 'e', 'ఆ' ],
+ [ 'R', 'ఙ' ],
+ [ 'r', 'ఇ' ],
+ [ 'T', 'ఞ' ],
+ [ 't', 'ఒ' ],
+ [ 'Y', 'క్ష' ],
+ [ 'y', 'ఓ' ],
+ [ 'U', 'శ్రీ' ],
+ [ 'u', 'ఎ' ],
+ [ 'I', '/' ],
+ [ 'i', 'ఉ' ],
+ [ 'O', 'స్త్ర' ],
+ [ 'o', 'ఏ' ],
+ [ 'P', 'ష్ట్ర' ],
+ [ 'p', 'ఊ' ],
+ [ '\\{', 'క్ష్మ' ],
+ [ '\\[', 'ఐ' ],
+ [ '\\}', '!' ],
+ [ '\\]', 'ఔ' ],
+ [ '\\|', 'ఁ' ],
+ [ '\\\\', 'ః' ],
+ [ 'A', 'ళ' ],
+ [ 'a', 'ల' ],
+ [ 'S', 'థ' ],
+ [ 's', 'త' ],
+ [ 'D', 'ధ' ],
+ [ 'd', 'ద' ],
+ [ 'F', 'శ' ],
+ [ 'f', 'వ' ],
+ [ 'G', ':' ],
+ [ 'g', 'ం' ],
+ [ 'H', '్' ],
+ [ 'h', '్' ],
+ [ 'J', 'ఖ' ],
+ [ 'j', 'క' ],
+ [ 'K', 'ఱ' ],
+ [ 'k', 'ర' ],
+ [ 'L', 'ణ' ],
+ [ 'l', 'న' ],
+ [ ':', 'ఫ' ],
+ [ ';', 'ప' ],
+ [ '"', 'ష' ],
+ [ '\\\'', 'స' ],
+ [ '\\~', '~' ],
+ [ '\\`', '`' ],
+ [ 'Z', 'ఠ' ],
+ [ 'z', 'ట' ],
+ [ 'X', 'ఘ' ],
+ [ 'x', 'గ' ],
+ [ 'C', 'ఢ' ],
+ [ 'c', 'డ' ],
+ [ 'V', 'భ' ],
+ [ 'v', 'బ' ],
+ [ 'B', 'హ' ],
+ [ 'b', 'మ' ],
+ [ 'N', 'క్ష్మీ' ],
+ [ 'n', 'య' ],
+ [ 'M', 'ఛ' ],
+ [ 'm', 'చ' ],
+ [ '\\<', ';' ],
+ [ ',', ',' ],
+ [ '\\>', '?' ],
+ [ '\\.', '.' ],
+ [ '/', 'జ' ],
+ [ '\\?', 'ఝ' ]
+
+ ],
+ patterns_x: [
+
+ /*
+ * Some characters originally not there
+ * in original layout but for accessibility
+ * kept these based on inscript.
+ */
+
+ [ '\\!', '౹' ],
+ [ '\\@', '౼' ],
+ [ '\\#', '౺' ],
+ [ '\\$', '౽' ],
+ [ '4', '₹' ],
+ [ '\\%', '౻' ],
+ [ '\\^', '౾' ],
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '0', '౸' ],
+ [ '\\-', '౿' ],
+ [ 'R', 'ౣ' ],
+ [ 'r', 'ౡ' ],
+ [ 'p', 'ౙ' ],
+ [ 'F', 'ఌ' ],
+ [ 'f', 'ౢ' ],
+ [ ';', 'ౘ' ],
+ [ 'Z', 'ౖ' ],
+ [ 'z', 'ౕ' ],
+ [ '\\>', 'ఽ' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+
+ $.ime.register( teApple );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-inscript.js b/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-inscript.js
new file mode 100644
index 00000000..a8f8aeec
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-inscript.js
@@ -0,0 +1,122 @@
+( function ( $ ) {
+ 'use strict';
+
+ var teInScript = {
+ id: 'te-inscript',
+ name: 'ఇన్\u200dస్క్రిప్ట్',
+ description: 'Inscript keyboard for Telugu script',
+ date: '2012-10-16',
+ author: 'Veeven',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'D', 'అ' ],
+ [ 'E', 'ఆ' ],
+ [ 'F', 'ఇ' ],
+ [ 'R', 'ఈ' ],
+ [ 'G', 'ఉ' ],
+ [ 'T', 'ఊ' ],
+ [ '\\+', 'ఋ' ],
+ [ 'Z', 'ఎ' ],
+ [ 'S', 'ఏ' ],
+ [ 'W', 'ఐ' ],
+ [ '~', 'ఒ' ],
+ [ 'A', 'ఓ' ],
+ [ 'Q', 'ఔ' ],
+
+ [ 'k', 'క' ],
+ [ 'K', 'ఖ' ],
+ [ 'i', 'గ' ],
+ [ 'I', 'ఘ' ],
+ [ 'U', 'ఙ' ],
+
+ [ '\\;', 'చ' ],
+ [ '\\:', 'ఛ' ],
+ [ 'p', 'జ' ],
+ [ 'P', 'ఝ' ],
+ [ '\\}', 'ఞ' ],
+
+ [ '\'', 'ట' ],
+ [ '"', 'ఠ' ],
+ [ '\\[', '', 'డ' ],
+ [ '\\{', '', 'ఢ' ],
+ [ 'C', 'ణ' ],
+
+ [ 'l', 'త' ],
+ [ 'L', 'థ' ],
+ [ 'o', 'ద' ],
+ [ 'O', 'ధ' ],
+ [ 'v', 'న' ],
+
+ [ 'h', 'ప' ],
+ [ 'H', 'ఫ' ],
+ [ 'y', 'బ' ],
+ [ 'Y', 'భ' ],
+ [ 'c', 'మ' ],
+
+ [ '/', 'య' ],
+ [ 'j', 'ర' ],
+ [ 'J', 'ఱ' ],
+ [ 'n', 'ల' ],
+ [ 'N', 'ళ' ],
+ [ 'b', 'వ' ],
+
+ [ 'M', 'శ' ],
+ [ '\\<', '', 'ష' ],
+ [ 'm', 'స' ],
+ [ 'u', 'హ' ],
+
+ [ 'e', 'ా' ],
+ [ 'f', 'ి' ],
+ [ 'r', 'ీ' ],
+ [ 'g', 'ు' ],
+ [ 't', 'ూ' ],
+ [ '\\=', 'ృ' ],
+ [ 'z', 'ె' ],
+ [ 's', 'ే' ],
+ [ 'w', 'ై' ],
+ [ '`', 'ొ' ],
+ [ 'a', 'ో' ],
+ [ 'q', 'ౌ' ],
+ [ 'x', 'ం' ],
+ [ '\\-', 'ః' ],
+ [ 'X', 'ఁ' ],
+ [ 'd', '్' ],
+
+ [ '0', '', '౦' ],
+ [ '1', '', '౧' ],
+ [ '2', '౨' ],
+ [ '3', '౩' ],
+ [ '4', '౪' ],
+ [ '5', '౫' ],
+ [ '6', '౬' ],
+ [ '7', '౭' ],
+ [ '8', '౮' ],
+ [ '9', '౯' ],
+
+ [ '\\@', '\u200C' ], // In cases where extended rules do not work
+ [ '\\#', '్ర' ],
+ [ '\\$', 'ర్' ],
+ [ '\\%', 'జ్ఞ' ],
+ [ '\\^', 'త్ర' ],
+ [ '\\&', 'క్ష' ],
+ [ '\\*', 'శ్ర' ],
+ [ '\\>', '।' ] ],
+
+ patterns_x: [
+ [ 'X', 'ॐ' ],
+ [ '\\;', 'ౘ' ],
+ [ 'p', 'ౙ' ],
+ [ 'f', '\u0C62' ], // vowel sign of alu (volic l)
+ [ 'r', '\u0C63' ], // vowel sign of aluu (volic ll)
+ [ 'F', 'ఌ' ],
+ [ 'R', 'ౡ' ],
+ [ '\\.', '॥' ],
+ [ '\\>', 'ఽ' ],
+ [ '2', '\u200C' ], // ZWNJ
+ [ '4', '₹' ],
+ [ '\\=', 'ౄ' ],
+ [ '\\+', 'ౠ' ] ]
+ };
+ $.ime.register( teInScript );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-inscript2.js b/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-inscript2.js
new file mode 100644
index 00000000..c7ddd1f5
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-inscript2.js
@@ -0,0 +1,126 @@
+( function ( $ ) {
+ 'use strict';
+
+ var teInScript2 = {
+ id: 'te-inscript2',
+ name: 'ఇన్\u200dస్క్రిప్ట్ 2',
+ description: 'Enhanced InScript keyboard for Telugu script',
+ date: '2013-01-16',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '1', '౧' ],
+ [ '2', '౨' ],
+ [ '3', '౩' ],
+ [ '4', '౪' ],
+ [ '5', '౫' ],
+ [ '6', '౬' ],
+ [ '7', '౭' ],
+ [ '8', '౮' ],
+ [ '\\(', '(' ],
+ [ '9', '౯' ],
+ [ '\\)', ')' ],
+ [ '0', '౦' ],
+ [ '\\_', 'ః' ],
+ [ '\\-', '-' ],
+ [ '\\+', 'ఋ' ],
+ [ '\\=', 'ృ' ],
+ [ 'Q', 'ఔ' ],
+ [ 'q', 'ౌ' ],
+ [ 'W', 'ఐ' ],
+ [ 'w', 'ై' ],
+ [ 'E', 'ఆ' ],
+ [ 'e', 'ా' ],
+ [ 'R', 'ఈ' ],
+ [ 'r', 'ీ' ],
+ [ 'T', 'ఊ' ],
+ [ 't', 'ూ' ],
+ [ 'Y', 'భ' ],
+ [ 'y', 'బ' ],
+ [ 'U', 'ఙ' ],
+ [ 'u', 'హ' ],
+ [ 'I', 'ఘ' ],
+ [ 'i', 'గ' ],
+ [ 'O', 'ధ' ],
+ [ 'o', 'ద' ],
+ [ 'P', 'ఝ' ],
+ [ 'p', 'జ' ],
+ [ '\\{', 'ఢ' ],
+ [ '\\[', 'డ' ],
+ [ '\\}', 'ఞ' ],
+ [ 'A', 'ఓ' ],
+ [ 'a', 'ో' ],
+ [ 'S', 'ఏ' ],
+ [ 's', 'ే' ],
+ [ 'D', 'అ' ],
+ [ 'd', '్' ],
+ [ 'F', 'ఇ' ],
+ [ 'f', 'ి' ],
+ [ 'G', 'ఉ' ],
+ [ 'g', 'ు' ],
+ [ 'H', 'ఫ' ],
+ [ 'h', 'ప' ],
+ [ 'J', 'ఱ' ],
+ [ 'j', 'ర' ],
+ [ 'K', 'ఖ' ],
+ [ 'k', 'క' ],
+ [ 'L', 'థ' ],
+ [ 'l', 'త' ],
+ [ ':', 'ఛ' ],
+ [ ';', 'చ' ],
+ [ '"', 'ఠ' ],
+ [ '\\\'', 'ట' ],
+ [ '\\~', 'ఒ' ],
+ [ '\\`', 'ొ' ],
+ [ 'Z', 'ఎ' ],
+ [ 'z', 'ె' ],
+ [ 'X', 'ఁ' ],
+ [ 'x', 'ం' ],
+ [ 'C', 'ణ' ],
+ [ 'c', 'మ' ],
+ [ 'v', 'న' ],
+ [ 'b', 'వ' ],
+ [ 'N', 'ళ' ],
+ [ 'n', 'ల' ],
+ [ 'M', 'శ' ],
+ [ 'm', 'స' ],
+ [ '\\<', 'ష' ],
+ [ ',', ',' ],
+ [ '\\>', '।' ],
+ [ '\\.', '.' ],
+ [ '/', 'య' ],
+ [ '\\%', 'జ్ఞ' ],
+ [ '\\^', 'త్ర' ],
+ [ '\\&', 'క్ష' ],
+ [ '\\*', 'శ్ర' ]
+ ],
+ patterns_x: [
+ [ '\\!', '౹' ],
+ [ '\\@', '౼' ],
+ [ '\\#', '౺' ],
+ [ '\\$', '౽' ],
+ [ '4', '₹' ],
+ [ '\\%', '౻' ],
+ [ '\\^', '౾' ],
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '0', '౸' ],
+ [ '\\-', '౿' ],
+ [ '\\+', 'ౠ' ],
+ [ '\\=', 'ౄ' ],
+ [ 'R', 'ౣ' ],
+ [ 'r', 'ౡ' ],
+ [ 'p', 'ౙ' ],
+ [ 'F', 'ఌ' ],
+ [ 'f', 'ౢ' ],
+ [ ';', 'ౘ' ],
+ [ 'Z', 'ౖ' ],
+ [ 'z', 'ౕ' ],
+ [ '\\>', 'ఽ' ],
+ [ '\\.', '॥' ]
+ ]
+ };
+
+ $.ime.register( teInScript2 );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-modular.js b/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-modular.js
new file mode 100644
index 00000000..8a74ce89
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-modular.js
@@ -0,0 +1,179 @@
+( function ( $ ) {
+ 'use strict';
+
+ var teModular = {
+ id: 'te-modular',
+ name: 'మాడ్యులర్',
+ description: 'Modular keyboard layout for Telugu',
+ date: '2014-12-31',
+ author: 'Praveen Illa',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+
+ // numbers
+
+ [ '\\`', 'ే' ],
+ [ '1', '1' ],
+ [ '2', '2' ],
+ [ '3', '3' ],
+ [ '4', '4' ],
+ [ '5', '5' ],
+ [ '6', '6' ],
+ [ '7', '7' ],
+ [ '8', '8' ],
+ [ '9', '9' ],
+ [ '0', '0' ],
+ [ '\\-', '-' ],
+ [ '\\=', '=' ],
+
+ // shift num
+
+ [ '\\~', 'ఏ' ],
+ [ '\\!', '!' ],
+ [ '\\@', '\'' ],
+ [ '\\#', '\'' ],
+ [ '\\$', 'ఊ' ],
+ [ '\\%', '%' ],
+ [ '\\^', 'క్ష' ],
+ [ '\\&', 'ౄ' ],
+ [ '\\*', '్ర' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '\\_', 'ఙ' ],
+ [ '\\+', '+' ],
+
+ // qwerty order
+ // 1st row
+
+ [ 'Q', 'అ' ],
+ [ 'q', 'ష' ],
+ [ 'W', 'ఘ' ],
+ [ 'w', 'గ' ],
+ [ 'E', 'ఖ' ],
+ [ 'e', 'క' ],
+ [ 'R', 'ఠ' ],
+ [ 'r', 'ట' ],
+ [ 'T', 'ఢ' ],
+ [ 't', 'డ' ],
+ [ 'Y', 'ఫ' ],
+ [ 'y', 'ప' ],
+ [ 'U', 'బ' ],
+ [ 'u', 'మ' ],
+ [ 'I', 'ళ' ],
+ [ 'i', 'ల' ],
+ [ 'O', 'శ' ],
+ [ 'o', 'వ' ],
+ [ 'P', 'ఒ' ],
+ [ 'p', 'ొ' ],
+ [ '\\{', 'ఓ' ],
+ [ '\\[', 'ో' ],
+ [ '\\}', 'ఞ' ],
+ [ '\\]', 'ూ' ],
+ [ '\\|', 'శ్రీ' ],
+ [ '\\\\', '్ర' ],
+
+ // 2nd row
+ [ 'A', 'ఆ' ],
+ [ 'a', 'ా' ],
+ [ 'S', 'ఇ' ],
+ [ 's', 'ి' ],
+ [ 'D', '్' ],
+ [ 'd', '్' ],
+ [ 'F', 'ణ' ],
+ [ 'f', 'య' ],
+ [ 'G', 'థ' ],
+ [ 'g', 'త' ],
+ [ 'H', 'ధ' ],
+ [ 'h', 'ద' ],
+ [ 'J', 'భ' ],
+ [ 'j', 'న' ],
+ [ 'K', 'ఱ' ],
+ [ 'k', 'ర' ],
+ [ 'L', 'హ' ],
+ [ 'l', 'స' ],
+ [ ':', ':' ],
+ [ ';', ';' ],
+ [ '"', 'ఔ' ],
+ [ '\\\'', 'ౌ' ],
+
+ // 3rd row
+
+ [ 'Z', 'ఋ' ],
+ [ 'z', 'ృ' ],
+ [ 'X', 'ఝ' ],
+ [ 'x', 'జ' ],
+ [ 'C', 'ఛ' ],
+ [ 'c', 'చ' ],
+ [ 'V', 'ఈ' ],
+ [ 'v', 'ీ' ],
+ [ 'B', 'ఎ' ],
+ [ 'b', 'ె' ],
+ [ 'N', 'ఉ' ],
+ [ 'n', 'ు' ],
+ [ 'M', 'ఐ' ],
+ [ 'm', 'ై' ],
+ [ '\\<', 'ం' ],
+ [ ',', ',' ],
+ [ '\\>', 'ః' ],
+ [ '\\.', '.' ],
+ [ '\\?', '?' ],
+ [ '\\/', '/' ]
+
+ ],
+ patterns_x: [
+
+ /*
+ * Some characters originally not there
+ * in original layout but for accessibility
+ * kept these based on inscript.
+ */
+
+ [ '\\!', '౹' ],
+ [ '\\@', '౼' ],
+ [ '\\#', '౺' ],
+ [ '\\$', '౽' ],
+ [ '4', '₹' ],
+ [ '\\%', '౻' ],
+ [ '\\^', '౾' ],
+ [ '1', '\u200d' ],
+ [ '2', '\u200c' ],
+ [ '0', '౸' ],
+ [ '\\-', '౿' ],
+ [ 'R', 'ౣ' ],
+ [ 'r', 'ౡ' ],
+ [ 'p', 'ౙ' ],
+ [ 'F', 'ఌ' ],
+ [ 'f', 'ౢ' ],
+ [ ';', 'ౘ' ],
+
+ [ '\\>', 'ఽ' ],
+ [ '\\.', '॥' ],
+
+ [ '\\_', 'ఁ' ],
+ [ '=', 'ః' ],
+
+ [ 'q', 'ష్ట్ర' ],
+ [ 'w', '÷' ],
+ [ 'e', 'క్ష్మ' ],
+ [ 'y', '్పు' ],
+ [ 'i', 'క్ష్మి' ],
+ [ '\\[', 'క్ష్మీ' ],
+ [ '\\]', '×' ],
+
+ [ 'g', 'ఁ' ],
+ [ 'k', '్ర' ],
+ [ 'l', 'స్త్ర' ],
+ [ '\\\'', '్పు' ],
+
+ [ 'z', 'ౠ' ],
+ [ 'c', 'ఁ' ],
+ [ 'v', '|' ],
+ [ 'n', '-' ],
+ [ '/', '÷' ]
+
+ ]
+ };
+
+ $.ime.register( teModular );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-transliteration.js
new file mode 100644
index 00000000..ffe1efd7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/te/te-transliteration.js
@@ -0,0 +1,221 @@
+( function ( $ ) {
+ 'use strict';
+
+ var teTransliteration = {
+ id: 'te-transliteration',
+ name: 'లిప్యంతరీకరణ',
+ description: 'Telugu Transliteration based on RTS',
+ date: '2012-10-16',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Veeven, Junaid P V, Rahimanuddin Shaik',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 4,
+ patterns: [
+ [ '(మ్|న్)b', 'ంబ్' ],
+ [ '(మ్|న్)B', 'ంభ్' ],
+ [ '(మ్|న్)c', 'ంచ్' ],
+ [ '(మ్|న్)C', 'ంఛ్' ],
+ [ '(మ్|న్)d', 'ంద్' ],
+ [ '(మ్|న్)D', 'ండ్' ],
+ [ '(మ్|న్)[fFP]', 'ంఫ్' ],
+ [ '(మ్|న్)g', 'ంగ్' ],
+ [ '(మ్|న్)h', 'ంహ్' ],
+ [ '(మ్|న్)j', 'ంజ్' ],
+ [ '(మ్|న్)J', 'ంఝ్' ],
+ [ '(మ్|న్)k', 'ంక్' ],
+ [ '(మ్|న్)L', 'ంళ్' ],
+ [ '(మ్|న్)p', 'ంప్' ],
+ [ '(మ్|న్)r', 'ంర్' ],
+ [ '(మ్|న్)s', 'ంస్' ],
+ [ '(మ్|న్)t', 'ంత్' ],
+ [ '(మ్|న్)T', 'ంట్' ],
+ [ '(మ్|న్)[vwVW]', 'ంవ్' ],
+ [ '(మ్|న్)[xX]', 'ంక్ష్' ],
+
+ // & for forcing combination
+ [ '(మ్|న్)&b', '$1బ్' ],
+ [ '(మ్|న్)&B', '$1బ్' ],
+ [ '(మ్|న్)&c', '$1చ్' ],
+ [ '(మ్|న్)&C', '$1ఛ్' ],
+ [ '(మ్|న్)&d', '$1ద్' ],
+ [ '(మ్|న్)&D', '$1డ్' ],
+ [ '(మ్|న్)&[fFP]', '$1ఫ్' ],
+ [ '(మ్|న్)&g', '$1గ్' ],
+ [ '(మ్|న్)&h', '$1హ్' ],
+ [ '(మ్|న్)&j', '$1జ్' ],
+ [ '(మ్|న్)&J', '$1ఝ్' ],
+ [ '(మ్|న్)&k', '$1క్' ],
+ [ '(మ్|న్)&L', '$1ళ్' ],
+ [ '(మ్|న్)&p', '$1ప్' ],
+ [ '(మ్|న్)&r', '$1ర్' ],
+ [ '(మ్|న్)&s', '$1స్' ],
+ [ '(మ్|న్)&t', '$1త్' ],
+ [ '(మ్|న్)&T', '$1ట్' ],
+ [ '(మ్|న్)&[vwVW]', '$1వ్' ],
+ [ '(మ్|న్)&[xX]', '$1క్ష్' ],
+ [ '(మ్|న్)&(\\s|\\.|\\, |\\))', '$1$2' ],
+ // అ
+ [ '([క-హ]|ౘ|ౙ)్a', '$1' ],
+ // ఆ
+ [ '([క-హ])(్A|a|\')', '$1ా' ],
+ // ఇ
+ [ '([క-హ])్i', '$1ి' ],
+ // ఈ
+ [ '([క-హ])(్I|ిi|ి\'|ెe)', '$1ీ' ],
+ // ఉ
+ [ '([క-హ])్u', '$1ు' ],
+ // ఊ
+ [ '([క-హ])(ుu|ు\'|ుa|్U)', '$1ూ' ],
+ [ '([క-హ])ొo', 'o', '$1ూ' ],
+ // ఋ
+ [ '([క-హ])్R', '$1ృ' ],
+ [ '([క-హ])్ర్\'', '$1ృ' ],
+ // ౠ
+ [ '([క-హ])ృu', '$1ౄ' ],
+ // ఌ
+ [ '([క-హ])్~l', '$1ౢ' ],
+ // ౡ
+ [ '([క-హ])ౢ(l|\')', '$1ౣ' ],
+ // ఎ
+ [ '([క-హ])్e', '$1ె' ],
+ // ఏ
+ [ '([క-హ])(్E|ెa|ె\')', '$1ే' ],
+ [ '([క-హ])e', 'a', '$1ే' ],
+ // ఐ
+ [ '([క-హ])ెi', '$1ై' ],
+ [ '([క-హ])i', 'a', '$1ై' ],
+ // ఒ
+ [ '([క-హ])్o', '$1ొ' ],
+ // ఓ
+ [ '([క-హ])(్O|ొa|ొ\')', '$1ో' ],
+ // ఔ
+ [ '([క-హ])(ొu|ొw)', '$1ౌ' ],
+ [ '([క-హ])u', 'a', '$1ౌ' ],
+
+ // TODO: handle back corrections
+ /* not working ['([క-హ])u', '$1ు'],
+ ['([క-హ])U', '$1ూ'],
+ ['([క-హ])E', '$1ే'],
+ */
+
+ // zwnj
+ [ '(్)\\^', '$1\u200c' ],
+
+ // sunna ending
+ [ 'మ్(\\s|\\.|\\, |\\))', 'ం$1' ],
+
+ // standalone vowels
+ [ 'అ(a|\')', 'ఆ' ],
+ [ 'ఇ(i|\')', 'ఈ' ],
+ [ 'ఎe', 'ఈ' ],
+ [ 'ఉ(u|\')', 'ఊ' ],
+ [ 'ఒo', 'ఊ' ],
+ [ 'ఎ(a|\')', 'ఏ' ],
+ [ 'అe', 'a', 'ఏ' ],
+ [ 'ఎi', 'ఐ' ],
+ [ 'అi', 'a', 'ఐ' ],
+ [ 'ఒ(a|\')', '', 'ఓ' ],
+ [ 'అo', 'a', 'ఓ' ],
+ [ 'ఒ(u|w)', 'ఔ' ],
+ [ 'అu', 'a', 'ఔ' ],
+ [ 'ఋ(u|\')', 'ౠ' ],
+ [ 'ర్\'', 'ఋ' ],
+
+ // mahaa prana
+ [ 'క్h', 'ఖ్' ],
+ [ 'గ్h', 'ఘ్' ],
+ [ 'జ్h', 'ఝ్' ],
+ [ 'చ్\'', 'ఛ్' ],
+ [ 'చ్h', 'చ్' ],
+ [ 'స్h', 'ష్' ],
+ [ 'స్\'', 'శ్' ],
+ [ 'త్\'', 'ట్' ],
+ [ 'ట్h', 'ఠ్' ],
+ [ 'ద్\'', 'డ్' ],
+ [ 'డ్h', 'ఢ్' ],
+ [ 'న్\'', 'ణ్' ],
+ [ 'త్h', 'థ్' ],
+ [ 'ద్h', 'ధ్' ],
+ [ 'ప్h', 'ఫ్' ],
+ [ 'బ్h', 'భ్' ],
+ [ 'ల్\'', 'ళ్' ],
+
+ // basic
+ [ 'a', 'అ' ],
+ [ 'b', 'బ్' ],
+ [ '~c', 'ౘ్' ],
+ [ 'c', 'చ్' ],
+ [ 'd', 'ద్' ],
+ [ 'e', 'ఎ' ],
+ [ '(f|F|P)', 'ఫ్' ],
+ [ 'g', 'గ్' ],
+ [ '@h', 'ః' ],
+ [ 'h', 'హ్' ],
+ [ 'i', 'ఇ' ],
+ [ '~j', 'ౙ్' ],
+ [ 'j', 'జ్' ],
+ [ 'k', 'క్' ],
+ [ '~l', 'ఌ' ],
+ [ 'l', 'ల్' ],
+ [ '@m', 'ఁ' ],
+ [ '~m', 'ఙ్' ],
+ [ 'm', 'మ్' ],
+ [ '~n', 'ఞ్' ],
+ [ 'n', 'న్' ],
+ [ 'o', 'ఒ' ],
+ [ 'p', 'ప్' ],
+ [ 'q', 'క్వ్' ],
+ [ '~r', 'ఱ్' ],
+ [ 'r', 'ర్' ],
+ [ 's', 'స్' ],
+ [ 't', 'త్' ],
+ [ 'u', 'ఉ' ],
+ [ '(v|w|V|W)', 'వ్' ],
+ [ '(x|X)', 'క్ష్' ],
+ [ '(y|Y)', 'య్' ],
+ [ '(z|Z)', 'జ్' ],
+ [ 'A', 'ఆ' ],
+ [ 'B', 'భ్' ],
+ [ 'C', 'ఛ్' ],
+ [ 'D', 'డ్' ],
+ [ 'E', 'ఏ' ],
+ [ 'G', 'ఘ్' ],
+ [ 'H', 'ః' ],
+ [ 'I', 'ఈ' ],
+ [ 'J', 'ఝ్' ],
+ [ 'K', 'ఖ్' ],
+ [ 'L', 'ళ్' ],
+ [ 'M', 'ం' ],
+ [ 'N', 'ణ్' ],
+ [ 'O', 'ఓ' ],
+ [ 'Q', 'క్వ్' ],
+ [ 'R', 'ఋ' ],
+ [ 'S', 'శ్' ],
+ [ 'T', 'ట్' ],
+ [ 'U', 'ఊ' ],
+
+ /**
+ * Telugu numbers
+ */
+ [ '~0', '౦' ],
+ [ '~1', '౧' ],
+ [ '~2', '౨' ],
+ [ '~3', '౩' ],
+ [ '~4', '౪' ],
+ [ '~5', '౫' ],
+ [ '~6', '౬' ],
+ [ '~7', '౭' ],
+ [ '~8', '౮' ],
+ [ '~9', '౯' ],
+
+ // others
+ [ '।~\\.', '॥' ], // double danda
+ [ '~\\.', '।' ], // danda
+ [ '//', 'ఽ' ], // avagraha
+ [ '~\\$', '₹' ] ] // rupee
+ };
+
+ $.ime.register( teTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/th/th-kedmanee.js b/UniversalLanguageSelector/lib/jquery.ime/rules/th/th-kedmanee.js
new file mode 100644
index 00000000..7af9ab62
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/th/th-kedmanee.js
@@ -0,0 +1,115 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kedmanee = {
+ id: 'th-kedmanee',
+ name: 'Thai Kedmanee',
+ description: 'Thai Kedmanee Input Method',
+ date: '2012-10-25',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Kevin K.S. Leung, <sprconan@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', '๐' ],
+ [ 'W', '"' ],
+ [ 'E', 'ฎ' ],
+ [ 'R', 'ฑ' ],
+ [ 'T', 'ธ' ],
+ [ 'Y', 'ํ' ],
+ [ 'U', '๊' ],
+ [ 'I', 'ณ' ],
+ [ 'O', 'ฯ' ],
+ [ 'P', 'ญ' ],
+ [ '{', 'ฐ' ],
+ [ '}', ',' ],
+ [ '\\|', 'ฅ' ],
+ [ 'A', 'ฤ' ],
+ [ 'S', 'ฆ' ],
+ [ 'D', 'ฏ' ],
+ [ 'F', 'โ' ],
+ [ 'G', 'ฌ' ],
+ [ 'H', '็' ],
+ [ 'J', '๋' ],
+ [ 'K', 'ษ' ],
+ [ 'L', 'ศ' ],
+ [ ':', 'ซ' ],
+ [ '"', '.' ],
+ [ 'Z', '(' ],
+ [ 'X', ')' ],
+ [ 'C', 'ฉ' ],
+ [ 'V', 'ฮ' ],
+ [ 'B', 'ฺ' ],
+ [ 'N', '์' ],
+ [ 'M', '?' ],
+ [ '<', 'ฒ' ],
+ [ '>', 'ฬ' ],
+ [ '\\?', 'ฦ' ],
+
+ [ 'q', 'ๆ' ],
+ [ 'w', 'ไ' ],
+ [ 'e', 'ำ' ],
+ [ 'r', 'พ' ],
+ [ 't', 'ะ' ],
+ [ 'y', 'ั' ],
+ [ 'u', 'ี' ],
+ [ 'i', 'ร' ],
+ [ 'o', 'น' ],
+ [ 'p', 'ย' ],
+ [ '\\[', 'บ' ],
+ [ '\\]', 'ล' ],
+ [ '\\\\', 'ฃ' ],
+ [ 'a', 'ฟ' ],
+ [ 's', 'ห' ],
+ [ 'd', 'ก' ],
+ [ 'f', 'ด' ],
+ [ 'g', 'เ' ],
+ [ 'h', '้' ],
+ [ 'j', '่' ],
+ [ 'k', 'า' ],
+ [ 'l', 'ส' ],
+ [ ';', 'ว' ],
+ [ '\'', 'ง' ],
+ [ 'z', 'ผ' ],
+ [ 'x', 'ป' ],
+ [ 'c', 'แ' ],
+ [ 'v', 'อ' ],
+ [ 'b', 'ิ' ],
+ [ 'n', 'ื' ],
+ [ 'm', 'ท' ],
+ [ ',', 'ม' ],
+ [ '\\.', 'ใ' ],
+ [ '/', 'ฝ' ],
+
+ [ '`', '_' ],
+ [ '1', 'ๅ' ],
+ [ '2', '/' ],
+ [ '3', '-' ],
+ [ '4', 'ภ' ],
+ [ '5', 'ถ' ],
+ [ '6', 'ุ' ],
+ [ '7', 'ึ' ],
+ [ '8', 'ค' ],
+ [ '9', 'ต' ],
+ [ '0', 'จ' ],
+ [ '\\-', 'ข' ],
+ [ '=', 'ช' ],
+ [ '~', '%' ],
+ [ '!', '+' ],
+ [ '@', '๑' ],
+ [ '#', '๒' ],
+ [ '\\$', '๓' ],
+ [ '%', '๔' ],
+ [ '\\^', 'ู' ],
+ [ '&', '฿' ],
+ [ '\\*', '๕' ],
+ [ '\\(', '๖' ],
+ [ '\\)', '๗' ],
+ [ '_', '๘' ],
+ [ '\\+', '๙' ]
+ ]
+ };
+
+ $.ime.register( kedmanee );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/th/th-pattachote.js b/UniversalLanguageSelector/lib/jquery.ime/rules/th/th-pattachote.js
new file mode 100644
index 00000000..48385466
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/th/th-pattachote.js
@@ -0,0 +1,115 @@
+( function ( $ ) {
+ 'use strict';
+
+ var pattachote = {
+ id: 'th-pattachote',
+ name: 'Thai Pattachote',
+ description: 'Thai Pattachote Input Method',
+ date: '2012-10-25',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Kevin K.S. Leung, <sprconan@gmail.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'Q', '๊' ],
+ [ 'W', 'ฤ' ],
+ [ 'E', 'ๆ' ],
+ [ 'R', 'ญ' ],
+ [ 'T', 'ษ' ],
+ [ 'Y', 'ึ' ],
+ [ 'U', 'ฝ' ],
+ [ 'I', 'ซ' ],
+ [ 'O', 'ถ' ],
+ [ 'P', 'ฒ' ],
+ [ '{', 'ฯ' ],
+ [ '}', 'ฦ' ],
+ [ '\\|', 'ํ' ],
+ [ 'A', '๋' ],
+ [ 'S', 'ธ' ],
+ [ 'D', 'ำ' ],
+ [ 'F', 'ณ' ],
+ [ 'G', '์' ],
+ [ 'H', 'ื' ],
+ [ 'J', 'ผ' ],
+ [ 'K', 'ช' ],
+ [ 'L', 'โ' ],
+ [ ':', 'ฆ' ],
+ [ '"', 'ฑ' ],
+ [ 'Z', 'ฎ' ],
+ [ 'X', 'ฏ' ],
+ [ 'C', 'ฐ' ],
+ [ 'V', 'ภ' ],
+ [ 'B', 'ั' ],
+ [ 'N', 'ศ' ],
+ [ 'M', 'ฮ' ],
+ [ '<', 'ฟ' ],
+ [ '>', 'ฉ' ],
+ [ '\\?', 'ฬ' ],
+
+ [ 'q', '็' ],
+ [ 'w', 'ต' ],
+ [ 'e', 'ย' ],
+ [ 'r', 'อ' ],
+ [ 't', 'ร' ],
+ [ 'y', '่' ],
+ [ 'u', 'ด' ],
+ [ 'i', 'ม' ],
+ [ 'o', 'ว' ],
+ [ 'p', 'แ' ],
+ [ '\\[', 'ใ' ],
+ [ '\\]', 'ฌ' ],
+ [ '\\\\', '' ],
+ [ 'a', '้' ],
+ [ 's', 'ท' ],
+ [ 'd', 'ง' ],
+ [ 'f', 'ก' ],
+ [ 'g', 'ั' ],
+ [ 'h', 'ี' ],
+ [ 'j', 'า' ],
+ [ 'k', 'น' ],
+ [ 'l', 'เ' ],
+ [ ';', 'ไ' ],
+ [ '\'', 'ข' ],
+ [ 'z', 'บ' ],
+ [ 'x', 'ป' ],
+ [ 'c', 'ล' ],
+ [ 'v', 'ห' ],
+ [ 'b', 'ิ' ],
+ [ 'n', 'ค' ],
+ [ 'm', 'ส' ],
+ [ ',', 'ะ' ],
+ [ '\\.', 'จ' ],
+ [ '/', 'พ' ],
+
+ [ '`', '_' ],
+ [ '1', '=' ],
+ [ '2', '๒' ],
+ [ '3', '๓' ],
+ [ '4', '๔' ],
+ [ '5', '๕' ],
+ [ '6', 'ู' ],
+ [ '7', '๗' ],
+ [ '8', '๘' ],
+ [ '9', '๙' ],
+ [ '0', '๐' ],
+ [ '\\-', '๑' ],
+ [ '=', '๖' ],
+ [ '~', '฿' ],
+ [ '!', '+' ],
+ [ '@', '"' ],
+ [ '#', '/' ],
+ [ '\\$', ',' ],
+ [ '%', '?' ],
+ [ '\\^', 'ุ' ],
+ [ '&', '_' ],
+ [ '\\*', '.' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '_', '-' ],
+ [ '\\+', '%' ]
+ ]
+ };
+
+ $.ime.register( pattachote );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ti/ti-geezim.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ti/ti-geezim.js
new file mode 100644
index 00000000..852333a6
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ti/ti-geezim.js
@@ -0,0 +1,421 @@
+( function ( $ ) {
+ 'use strict';
+
+ var tiGeezim = {
+ id: 'ti-geezim',
+ name: 'Tigrinya GeezIM',
+ description: 'Tigrinya input method based on GeezIME scheme',
+ date: '2017-01-22',
+ URL: 'http://type.geezlab.com',
+ author: 'Fitsum Gaim, <fitsum@geezlab.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 2,
+ patterns: [
+ // consonants
+ [ 'h', 'ህ' ],
+ [ '(l|L)', 'ል' ],
+ [ 'H', 'ሕ' ],
+ [ '(m|M)', 'ም' ],
+ [ '(r|R)', 'ር' ],
+ [ 'ስs', 'ሥ' ],
+ [ 's', 'ስ' ],
+ [ 'S', 'ሽ' ],
+ [ 'q', 'ቅ' ],
+ [ 'Q', 'ቕ' ],
+ [ '(b|B)', 'ብ' ],
+ [ '(v|V)', 'ቭ' ],
+ [ 't', 'ት' ],
+ [ 'c', 'ች' ],
+ [ 'ህh', 'ኅ' ],
+ [ 'n', 'ን' ],
+ [ 'N', 'ኝ' ],
+ [ 'k', 'ክ' ],
+ [ 'K', 'ኽ' ],
+ [ 'w', 'ው' ],
+ [ 'z', 'ዝ' ],
+ [ 'Z', 'ዥ' ],
+ [ '(y|Y)', 'ይ' ],
+ [ '(d|D)', 'ድ' ],
+ [ '(j|J)', 'ጅ' ],
+ [ 'g', 'ግ' ],
+ [ 'G', 'ጝ' ], // Blin
+ [ 'T', 'ጥ' ],
+ [ 'C', 'ጭ' ],
+ [ 'P', 'ጵ' ],
+ [ '(x|X)', 'ጽ' ],
+ [ '(ጽx|ጽX)', 'ፅ' ],
+ [ '(f|F)', 'ፍ' ],
+ [ 'p', 'ፕ' ],
+
+ // consonant-vowel orders
+ [ 'ህe', 'ሀ' ],
+ [ 'ህu', 'ሁ' ],
+ [ 'ህi', 'ሂ' ],
+ [ 'ህa', 'ሃ' ],
+ [ '(ሂe|ህE)', 'ሄ' ],
+ [ 'ህo', 'ሆ' ],
+
+ [ 'ልe', 'ለ' ],
+ [ 'ልu', 'ሉ' ],
+ [ 'ልi', 'ሊ' ],
+ [ 'ልa', 'ላ' ],
+ [ '(ሊe|ልE)', 'ሌ' ],
+ [ 'ልo', 'ሎ' ],
+ [ 'ሉa', 'ሏ' ], // et
+
+ [ 'ሕe', 'ሐ' ],
+ [ 'ሕu', 'ሑ' ],
+ [ 'ሕi', 'ሒ' ],
+ [ 'ሕa', 'ሓ' ],
+ [ '(ሒe|ሕE)', 'ሔ' ],
+ [ 'ሕo', 'ሖ' ],
+ [ 'ሑa', 'ሗ' ], // et
+
+ [ 'ምe', 'መ' ],
+ [ 'ምu', 'ሙ' ],
+ [ 'ምi', 'ሚ' ],
+ [ 'ምa', 'ማ' ],
+ [ '(ሚe|ምE)', 'ሜ' ],
+ [ 'ምo', 'ሞ' ],
+ [ 'ሙa', 'ሟ' ], // et
+
+ [ 'ርe', 'ረ' ],
+ [ 'ርu', 'ሩ' ],
+ [ 'ርi', 'ሪ' ],
+ [ 'ርa', 'ራ' ],
+ [ '(ሪe|ርE)', 'ሬ' ],
+ [ 'ርo', 'ሮ' ],
+ [ 'ሩa', 'ሯ' ], // et
+
+ [ 'ሥe', 'ሠ' ],
+ [ 'ሥu', 'ሡ' ],
+ [ 'ሥi', 'ሢ' ],
+ [ 'ሥa', 'ሣ' ],
+ [ '(ሢe|ሥE)', 'ሤ' ],
+ [ 'ሥo', 'ሦ' ],
+ [ 'ሡa', 'ሧ' ], // et
+
+ [ 'ስe', 'ሰ' ],
+ [ 'ስu', 'ሱ' ],
+ [ 'ስi', 'ሲ' ],
+ [ 'ስa', 'ሳ' ],
+ [ '(ሲe|ስE)', 'ሴ' ],
+ [ 'ስo', 'ሶ' ],
+ [ 'ሱa', 'ሷ' ], // et
+
+ [ 'ሽe', 'ሸ' ],
+ [ 'ሽu', 'ሹ' ],
+ [ 'ሽi', 'ሺ' ],
+ [ 'ሽa', 'ሻ' ],
+ [ '(ሺe|ሽE)', 'ሼ' ],
+ [ 'ሽo', 'ሾ' ],
+ [ 'ሹa', 'ሿ' ], // et
+
+ [ 'ቅe', 'ቀ' ],
+ [ 'ቅu', 'ቁ' ],
+ [ 'ቅi', 'ቂ' ],
+ [ 'ቅa', 'ቃ' ],
+ [ '(ቂe|ቅE)', 'ቄ' ],
+ [ 'ቅo', 'ቆ' ],
+
+ [ 'ቁe', 'ቈ' ],
+ [ 'ቁi', 'ቊ' ],
+ [ 'ቁa', 'ቋ' ],
+ [ 'ቊe', 'ቌ' ],
+ [ 'ቅW', 'ቍ' ],
+
+ [ 'ቕe', 'ቐ' ],
+ [ 'ቕu', 'ቑ' ],
+ [ 'ቕi', 'ቒ' ],
+ [ 'ቕa', 'ቓ' ],
+ [ '(ቒe|ቕE)', 'ቔ' ],
+ [ 'ቕo', 'ቖ' ],
+
+ [ 'ቑe', 'ቘ' ],
+ [ 'ቑi', 'ቚ' ],
+ [ 'ቑa', 'ቛ' ],
+ [ 'ቚe', 'ቜ' ],
+ [ 'ቕW', 'ቝ' ],
+
+ [ 'ብe', 'በ' ],
+ [ 'ብu', 'ቡ' ],
+ [ 'ብi', 'ቢ' ],
+ [ 'ብa', 'ባ' ],
+ [ '(ቢe|ብE)', 'ቤ' ],
+ [ 'ብo', 'ቦ' ],
+ [ 'ቡa', 'ቧ' ], // et
+
+ [ 'ቭe', 'ቨ' ],
+ [ 'ቭu', 'ቩ' ],
+ [ 'ቭi', 'ቪ' ],
+ [ 'ቭa', 'ቫ' ],
+ [ '(ቪe|ቭE)', 'ቬ' ],
+ [ 'ቭo', 'ቮ' ],
+ [ 'ቩa', 'ቯ' ], // et
+
+ [ 'ትe', 'ተ' ],
+ [ 'ትu', 'ቱ' ],
+ [ 'ትi', 'ቲ' ],
+ [ 'ትa', 'ታ' ],
+ [ '(ቲe|ትE)', 'ቴ' ],
+ [ 'ትo', 'ቶ' ],
+ [ 'ቱa', 'ቷ' ], // et
+
+ [ 'ችe', 'ቸ' ],
+ [ 'ችu', 'ቹ' ],
+ [ 'ችi', 'ቺ' ],
+ [ 'ችa', 'ቻ' ],
+ [ '(ቺe|ችE)', 'ቼ' ],
+ [ 'ችo', 'ቾ' ],
+ [ 'ቹa', 'ቿ' ], // et
+
+ [ 'ኅe', 'ኀ' ],
+ [ 'ኅu', 'ኁ' ],
+ [ 'ኅi', 'ኂ' ],
+ [ 'ኅa', 'ኃ' ],
+ [ '(ኂe|ኅE)', 'ኄ' ],
+ [ 'ኅo', 'ኆ' ],
+
+ [ 'ኁe', 'ኈ' ],
+ [ 'ኈi', 'ኊ' ],
+ [ 'ኈa', 'ኋ' ],
+ [ 'ኊe', 'ኌ' ],
+ [ 'ኅW', 'ኍ' ],
+
+ [ 'ንe', 'ነ' ],
+ [ 'ንu', 'ኑ' ],
+ [ 'ንi', 'ኒ' ],
+ [ 'ንa', 'ና' ],
+ [ '(ኒe|ንE)', 'ኔ' ],
+ [ 'ንo', 'ኖ' ],
+ [ 'ኑa', 'ኗ' ], // et
+
+ [ 'ኝe', 'ኘ' ],
+ [ 'ኝu', 'ኙ' ],
+ [ 'ኝi', 'ኚ' ],
+ [ 'ኝa', 'ኛ' ],
+ [ '(ኚe|ኝE)', 'ኜ' ],
+ [ 'ኝo', 'ኞ' ],
+ [ 'ኙa', 'ኟ' ], // et
+
+ [ 'ክe', 'ከ' ],
+ [ 'ክu', 'ኩ' ],
+ [ 'ክi', 'ኪ' ],
+ [ 'ክa', 'ካ' ],
+ [ '(ኪe|ክE)', 'ኬ' ],
+ [ 'ክo', 'ኮ' ],
+
+ [ 'ኩe', 'ኰ' ],
+ [ 'ኩi', 'ኲ' ],
+ [ 'ኩa', 'ኳ' ],
+ [ 'ኲe', 'ኴ' ],
+ [ 'ክW', 'ኵ' ],
+
+ [ 'ኽe', 'ኸ' ],
+ [ 'ኽu', 'ኹ' ],
+ [ 'ኽi', 'ኺ' ],
+ [ 'ኽa', 'ኻ' ],
+ [ '(ኺe|ኽE)', 'ኼ' ],
+ [ 'ኽo', 'ኾ' ],
+
+ [ 'ኹe', 'ዀ' ],
+ [ 'ኹi', 'ዂ' ],
+ [ 'ኹa', 'ዃ' ],
+ [ 'ዂe', 'ዄ' ],
+ [ 'ኽW', 'ዅ' ],
+
+ [ 'ውe', 'ወ' ],
+ [ 'ውu', 'ዉ' ],
+ [ 'ውi', 'ዊ' ],
+ [ 'ውa', 'ዋ' ],
+ [ '(ዊe|ውE)', 'ዌ' ],
+ [ 'ውo', 'ዎ' ],
+
+ [ 'ዝe', 'ዘ' ],
+ [ 'ዝu', 'ዙ' ],
+ [ 'ዝi', 'ዚ' ],
+ [ 'ዝa', 'ዛ' ],
+ [ '(ዚe|ዝE)', 'ዜ' ],
+ [ 'ዝo', 'ዞ' ],
+ [ 'ዙa', 'ዟ' ], // et
+
+ [ 'ዥe', 'ዠ' ],
+ [ 'ዥu', 'ዡ' ],
+ [ 'ዥi', 'ዢ' ],
+ [ 'ዥa', 'ዣ' ],
+ [ '(ዢe|ዥE)', 'ዤ' ],
+ [ 'ዥo', 'ዦ' ],
+ [ 'ዡa', 'ዧ' ], // et
+
+ [ 'ይe', 'የ' ],
+ [ 'ይu', 'ዩ' ],
+ [ 'ይi', 'ዪ' ],
+ [ 'ይa', 'ያ' ],
+ [ '(ዪe|ይE)', 'ዬ' ],
+ [ 'ይo', 'ዮ' ],
+
+ [ 'ድe', 'ደ' ],
+ [ 'ድu', 'ዱ' ],
+ [ 'ድi', 'ዲ' ],
+ [ 'ድa', 'ዳ' ],
+ [ '(ዲe|ድE)', 'ዴ' ],
+ [ 'ድo', 'ዶ' ],
+ [ 'ዱa', 'ዷ' ], // et
+
+ [ 'ጅe', 'ጀ' ],
+ [ 'ጅu', 'ጁ' ],
+ [ 'ጅi', 'ጂ' ],
+ [ 'ጅa', 'ጃ' ],
+ [ '(ጂe|ጅE)', 'ጄ' ],
+ [ 'ጅo', 'ጆ' ],
+ [ 'ጁa', 'ጇ' ], // et
+
+ [ 'ግe', 'ገ' ],
+ [ 'ግu', 'ጉ' ],
+ [ 'ግi', 'ጊ' ],
+ [ 'ግa', 'ጋ' ],
+ [ '(ጊe|ግE)', 'ጌ' ],
+ [ 'ግo', 'ጎ' ],
+
+ [ 'ጉe', 'ጐ' ],
+ [ 'ጉi', 'ጒ' ],
+ [ 'ጉa', 'ጓ' ],
+ [ 'ጒe', 'ጔ' ],
+ [ 'ግW', 'ጕ' ],
+
+ [ 'ጝe', 'ጘ' ],
+ [ 'ጝu', 'ጙ' ],
+ [ 'ጝi', 'ጚ' ],
+ [ 'ጝa', 'ጛ' ],
+ [ '(ጚe|ጝE)', 'ጜ' ],
+ [ 'ጝo', 'ጞ' ],
+
+ [ 'ጙe', 'ⶓ' ],
+ [ 'ጙi', 'ⶔ' ],
+ [ 'ጙa', 'ጟ' ],
+ [ '(ⶔe|ⶔE)', 'ⶕ' ],
+ [ 'ጝW', 'ⶖ' ],
+
+ [ 'ጥe', 'ጠ' ],
+ [ 'ጥu', 'ጡ' ],
+ [ 'ጥi', 'ጢ' ],
+ [ 'ጥa', 'ጣ' ],
+ [ '(ጢe|ጥE)', 'ጤ' ],
+ [ 'ጥo', 'ጦ' ],
+ [ 'ጡa', 'ጧ' ], // et
+
+ [ 'ጭe', 'ጨ' ],
+ [ 'ጭu', 'ጩ' ],
+ [ 'ጭi', 'ጪ' ],
+ [ 'ጭa', 'ጫ' ],
+ [ '(ጪe|ጭE)', 'ጬ' ],
+ [ 'ጭo', 'ጮ' ],
+ [ 'ጩa', 'ጯ' ], // et
+
+ [ 'ጵe', 'ጰ' ],
+ [ 'ጵu', 'ጱ' ],
+ [ 'ጵi', 'ጲ' ],
+ [ 'ጵa', 'ጳ' ],
+ [ '(ጲe|ጵE)', 'ጴ' ],
+ [ 'ጵo', 'ጶ' ],
+ [ 'ጱa', 'ጷ' ],
+
+ [ 'ጽe', 'ጸ' ],
+ [ 'ጽu', 'ጹ' ],
+ [ 'ጽi', 'ጺ' ],
+ [ 'ጽa', 'ጻ' ],
+ [ '(ጺe|ጽE)', 'ጼ' ],
+ [ 'ጽo', 'ጾ' ],
+ [ 'ጹa', 'ጿ' ], // et
+
+ [ 'ፅe', 'ፀ' ],
+ [ 'ፅu', 'ፁ' ],
+ [ 'ፅi', 'ፂ' ],
+ [ 'ፅa', 'ፃ' ],
+ [ '(ፂe|ፅE)', 'ፄ' ],
+ [ 'ፅo', 'ፆ' ],
+
+ [ 'ፍe', 'ፈ' ],
+ [ 'ፍu', 'ፉ' ],
+ [ 'ፍi', 'ፊ' ],
+ [ 'ፍa', 'ፋ' ],
+ [ '(ፈe|ፍE)', 'ፌ' ],
+ [ 'ፍo', 'ፎ' ],
+ [ 'ፉa', 'ፏ' ], // et
+
+ [ 'ፕe', 'ፐ' ],
+ [ 'ፕu', 'ፑ' ],
+ [ 'ፕi', 'ፒ' ],
+ [ 'ፕa', 'ፓ' ],
+ [ '(ፒe|ፕE)', 'ፔ' ],
+ [ 'ፕo', 'ፖ' ],
+ [ 'ፑa', 'ፗ' ], // et
+
+ [ 'O', 'ዕ' ],
+ [ 'ዕe', 'ዐ' ],
+ [ 'ዕu', 'ዑ' ],
+ [ 'ዕi', 'ዒ' ],
+ [ 'ዕa', 'ዓ' ],
+ [ '(ዒe|ዕE)', 'ዔ' ],
+ [ 'ዕo', 'ዖ' ],
+
+ // vowels
+ [ 'A', 'እ' ],
+ [ '(እu|u)', 'ኡ' ],
+ [ '(እi|i)', 'ኢ' ],
+ [ '(እa|a)', 'ኣ' ],
+ [ '(ኢe|እE)', 'ኤ' ],
+ [ '(እe|e)', 'አ' ],
+ [ '(እo|o)', 'ኦ' ],
+ [ 'አa', 'ኧ' ], // et
+
+ // punctuations
+ [ ',', '፣' ],
+ [ '።\\.', '.' ],
+ [ '(\\.|፡;)', '።' ],
+ [ '\\;', '፡' ],
+ [ '\\?\\?', '፧' ],
+ [ '፡-', '፦' ],
+ [ '።-', '፨' ],
+ [ '\\:', '፤' ],
+
+ // Geez Numerals
+ [ '1^', '፩' ], // 1
+ [ '2^', '፪' ], // 2
+ [ '3^', '፫' ], // 3
+ [ '4^', '፬' ], // 4
+ [ '5^', '፭' ], // 5
+ [ '6^', '፮' ], // 6
+ [ '7^', '፯' ], // 7
+ [ '8^', '፰' ], // 8
+ [ '9^', '፱' ], // 9
+
+ [ '፩0', '፲' ], // 10
+ [ '፪0', '፳' ], // 20
+ [ '፫0', '፴' ], // 30
+ [ '፬0', '፵' ], // 40
+ [ '፭0', '፶' ], // 50
+ [ '፮0', '፷' ], // 60
+ [ '፯0', '፸' ], // 70
+ [ '፰0', '፹' ], // 80
+ [ '፱0', '፺' ], // 90
+
+ [ '፲0', '፻' ], // 100
+ [ '፳0', '፪፻' ], // 200
+ [ '፴0', '፫፻' ], // 300
+ [ '፵0', '፬፻' ], // 400
+ [ '፶0', '፭፻' ], // 500
+ [ '፷0', '፮፻' ], // 600
+ [ '፸0', '፯፻' ], // 700
+ [ '፹0', '፰፻' ], // 800
+ [ '፺0', '፱፻' ], // 900
+
+ [ '፻0', '፲፻' ], // 1000
+ [ '፲፻0', '፼' ] // 10,000
+ ]
+ };
+
+ $.ime.register( tiGeezim );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/tig/tig-geezim.js b/UniversalLanguageSelector/lib/jquery.ime/rules/tig/tig-geezim.js
new file mode 100644
index 00000000..6a7a0edc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/tig/tig-geezim.js
@@ -0,0 +1,421 @@
+( function ( $ ) {
+ 'use strict';
+
+ var tigGeezim = {
+ id: 'tig-geezim',
+ name: 'Tigre GeezIM',
+ description: 'Tigre input method based on GeezIME scheme',
+ date: '2017-01-22',
+ URL: 'http://type.geezlab.com',
+ author: 'Fitsum Gaim, <fitsum@geezlab.com>',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 1,
+ maxKeyLength: 2,
+ patterns: [
+ // consonants
+ [ 'h', 'ህ' ],
+ [ '(l|L)', 'ል' ],
+ [ 'H', 'ሕ' ],
+ [ '(m|M)', 'ም' ],
+ [ '(r|R)', 'ር' ],
+ [ 'ስs', 'ሥ' ],
+ [ 's', 'ስ' ],
+ [ 'S', 'ሽ' ],
+ [ 'q', 'ቅ' ],
+ [ 'Q', 'ቕ' ],
+ [ '(b|B)', 'ብ' ],
+ [ '(v|V)', 'ቭ' ],
+ [ 't', 'ት' ],
+ [ 'c', 'ች' ],
+ [ 'ህh', 'ኅ' ],
+ [ 'n', 'ን' ],
+ [ 'N', 'ኝ' ],
+ [ 'k', 'ክ' ],
+ [ 'K', 'ኽ' ],
+ [ 'w', 'ው' ],
+ [ 'z', 'ዝ' ],
+ [ 'Z', 'ዥ' ],
+ [ '(y|Y)', 'ይ' ],
+ [ '(d|D)', 'ድ' ],
+ [ '(j|J)', 'ጅ' ],
+ [ 'g', 'ግ' ],
+ [ 'G', 'ጝ' ], // Blin
+ [ 'T', 'ጥ' ],
+ [ 'C', 'ጭ' ],
+ [ 'P', 'ጵ' ],
+ [ '(x|X)', 'ጽ' ],
+ [ '(ጽx|ጽX)', 'ፅ' ],
+ [ '(f|F)', 'ፍ' ],
+ [ 'p', 'ፕ' ],
+
+ // consonant-vowel orders
+ [ 'ህe', 'ሀ' ],
+ [ 'ህu', 'ሁ' ],
+ [ 'ህi', 'ሂ' ],
+ [ 'ህa', 'ሃ' ],
+ [ '(ሂe|ህE)', 'ሄ' ],
+ [ 'ህo', 'ሆ' ],
+
+ [ 'ልe', 'ለ' ],
+ [ 'ልu', 'ሉ' ],
+ [ 'ልi', 'ሊ' ],
+ [ 'ልa', 'ላ' ],
+ [ '(ሊe|ልE)', 'ሌ' ],
+ [ 'ልo', 'ሎ' ],
+ [ 'ሉa', 'ሏ' ], // et
+
+ [ 'ሕe', 'ሐ' ],
+ [ 'ሕu', 'ሑ' ],
+ [ 'ሕi', 'ሒ' ],
+ [ 'ሕa', 'ሓ' ],
+ [ '(ሒe|ሕE)', 'ሔ' ],
+ [ 'ሕo', 'ሖ' ],
+ [ 'ሑa', 'ሗ' ], // et
+
+ [ 'ምe', 'መ' ],
+ [ 'ምu', 'ሙ' ],
+ [ 'ምi', 'ሚ' ],
+ [ 'ምa', 'ማ' ],
+ [ '(ሚe|ምE)', 'ሜ' ],
+ [ 'ምo', 'ሞ' ],
+ [ 'ሙa', 'ሟ' ], // et
+
+ [ 'ርe', 'ረ' ],
+ [ 'ርu', 'ሩ' ],
+ [ 'ርi', 'ሪ' ],
+ [ 'ርa', 'ራ' ],
+ [ '(ሪe|ርE)', 'ሬ' ],
+ [ 'ርo', 'ሮ' ],
+ [ 'ሩa', 'ሯ' ], // et
+
+ [ 'ሥe', 'ሠ' ],
+ [ 'ሥu', 'ሡ' ],
+ [ 'ሥi', 'ሢ' ],
+ [ 'ሥa', 'ሣ' ],
+ [ '(ሢe|ሥE)', 'ሤ' ],
+ [ 'ሥo', 'ሦ' ],
+ [ 'ሡa', 'ሧ' ], // et
+
+ [ 'ስe', 'ሰ' ],
+ [ 'ስu', 'ሱ' ],
+ [ 'ስi', 'ሲ' ],
+ [ 'ስa', 'ሳ' ],
+ [ '(ሲe|ስE)', 'ሴ' ],
+ [ 'ስo', 'ሶ' ],
+ [ 'ሱa', 'ሷ' ], // et
+
+ [ 'ሽe', 'ሸ' ],
+ [ 'ሽu', 'ሹ' ],
+ [ 'ሽi', 'ሺ' ],
+ [ 'ሽa', 'ሻ' ],
+ [ '(ሺe|ሽE)', 'ሼ' ],
+ [ 'ሽo', 'ሾ' ],
+ [ 'ሹa', 'ሿ' ], // et
+
+ [ 'ቅe', 'ቀ' ],
+ [ 'ቅu', 'ቁ' ],
+ [ 'ቅi', 'ቂ' ],
+ [ 'ቅa', 'ቃ' ],
+ [ '(ቂe|ቅE)', 'ቄ' ],
+ [ 'ቅo', 'ቆ' ],
+
+ [ 'ቁe', 'ቈ' ],
+ [ 'ቁi', 'ቊ' ],
+ [ 'ቁa', 'ቋ' ],
+ [ 'ቊe', 'ቌ' ],
+ [ 'ቅW', 'ቍ' ],
+
+ [ 'ቕe', 'ቐ' ],
+ [ 'ቕu', 'ቑ' ],
+ [ 'ቕi', 'ቒ' ],
+ [ 'ቕa', 'ቓ' ],
+ [ '(ቒe|ቕE)', 'ቔ' ],
+ [ 'ቕo', 'ቖ' ],
+
+ [ 'ቑe', 'ቘ' ],
+ [ 'ቑi', 'ቚ' ],
+ [ 'ቑa', 'ቛ' ],
+ [ 'ቚe', 'ቜ' ],
+ [ 'ቕW', 'ቝ' ],
+
+ [ 'ብe', 'በ' ],
+ [ 'ብu', 'ቡ' ],
+ [ 'ብi', 'ቢ' ],
+ [ 'ብa', 'ባ' ],
+ [ '(ቢe|ብE)', 'ቤ' ],
+ [ 'ብo', 'ቦ' ],
+ [ 'ቡa', 'ቧ' ], // et
+
+ [ 'ቭe', 'ቨ' ],
+ [ 'ቭu', 'ቩ' ],
+ [ 'ቭi', 'ቪ' ],
+ [ 'ቭa', 'ቫ' ],
+ [ '(ቪe|ቭE)', 'ቬ' ],
+ [ 'ቭo', 'ቮ' ],
+ [ 'ቩa', 'ቯ' ], // et
+
+ [ 'ትe', 'ተ' ],
+ [ 'ትu', 'ቱ' ],
+ [ 'ትi', 'ቲ' ],
+ [ 'ትa', 'ታ' ],
+ [ '(ቲe|ትE)', 'ቴ' ],
+ [ 'ትo', 'ቶ' ],
+ [ 'ቱa', 'ቷ' ], // et
+
+ [ 'ችe', 'ቸ' ],
+ [ 'ችu', 'ቹ' ],
+ [ 'ችi', 'ቺ' ],
+ [ 'ችa', 'ቻ' ],
+ [ '(ቺe|ችE)', 'ቼ' ],
+ [ 'ችo', 'ቾ' ],
+ [ 'ቹa', 'ቿ' ], // et
+
+ [ 'ኅe', 'ኀ' ],
+ [ 'ኅu', 'ኁ' ],
+ [ 'ኅi', 'ኂ' ],
+ [ 'ኅa', 'ኃ' ],
+ [ '(ኂe|ኅE)', 'ኄ' ],
+ [ 'ኅo', 'ኆ' ],
+
+ [ 'ኁe', 'ኈ' ],
+ [ 'ኈi', 'ኊ' ],
+ [ 'ኈa', 'ኋ' ],
+ [ 'ኊe', 'ኌ' ],
+ [ 'ኅW', 'ኍ' ],
+
+ [ 'ንe', 'ነ' ],
+ [ 'ንu', 'ኑ' ],
+ [ 'ንi', 'ኒ' ],
+ [ 'ንa', 'ና' ],
+ [ '(ኒe|ንE)', 'ኔ' ],
+ [ 'ንo', 'ኖ' ],
+ [ 'ኑa', 'ኗ' ], // et
+
+ [ 'ኝe', 'ኘ' ],
+ [ 'ኝu', 'ኙ' ],
+ [ 'ኝi', 'ኚ' ],
+ [ 'ኝa', 'ኛ' ],
+ [ '(ኚe|ኝE)', 'ኜ' ],
+ [ 'ኝo', 'ኞ' ],
+ [ 'ኙa', 'ኟ' ], // et
+
+ [ 'ክe', 'ከ' ],
+ [ 'ክu', 'ኩ' ],
+ [ 'ክi', 'ኪ' ],
+ [ 'ክa', 'ካ' ],
+ [ '(ኪe|ክE)', 'ኬ' ],
+ [ 'ክo', 'ኮ' ],
+
+ [ 'ኩe', 'ኰ' ],
+ [ 'ኩi', 'ኲ' ],
+ [ 'ኩa', 'ኳ' ],
+ [ 'ኲe', 'ኴ' ],
+ [ 'ክW', 'ኵ' ],
+
+ [ 'ኽe', 'ኸ' ],
+ [ 'ኽu', 'ኹ' ],
+ [ 'ኽi', 'ኺ' ],
+ [ 'ኽa', 'ኻ' ],
+ [ '(ኺe|ኽE)', 'ኼ' ],
+ [ 'ኽo', 'ኾ' ],
+
+ [ 'ኹe', 'ዀ' ],
+ [ 'ኹi', 'ዂ' ],
+ [ 'ኹa', 'ዃ' ],
+ [ 'ዂe', 'ዄ' ],
+ [ 'ኽW', 'ዅ' ],
+
+ [ 'ውe', 'ወ' ],
+ [ 'ውu', 'ዉ' ],
+ [ 'ውi', 'ዊ' ],
+ [ 'ውa', 'ዋ' ],
+ [ '(ዊe|ውE)', 'ዌ' ],
+ [ 'ውo', 'ዎ' ],
+
+ [ 'ዝe', 'ዘ' ],
+ [ 'ዝu', 'ዙ' ],
+ [ 'ዝi', 'ዚ' ],
+ [ 'ዝa', 'ዛ' ],
+ [ '(ዚe|ዝE)', 'ዜ' ],
+ [ 'ዝo', 'ዞ' ],
+ [ 'ዙa', 'ዟ' ], // et
+
+ [ 'ዥe', 'ዠ' ],
+ [ 'ዥu', 'ዡ' ],
+ [ 'ዥi', 'ዢ' ],
+ [ 'ዥa', 'ዣ' ],
+ [ '(ዢe|ዥE)', 'ዤ' ],
+ [ 'ዥo', 'ዦ' ],
+ [ 'ዡa', 'ዧ' ], // et
+
+ [ 'ይe', 'የ' ],
+ [ 'ይu', 'ዩ' ],
+ [ 'ይi', 'ዪ' ],
+ [ 'ይa', 'ያ' ],
+ [ '(ዪe|ይE)', 'ዬ' ],
+ [ 'ይo', 'ዮ' ],
+
+ [ 'ድe', 'ደ' ],
+ [ 'ድu', 'ዱ' ],
+ [ 'ድi', 'ዲ' ],
+ [ 'ድa', 'ዳ' ],
+ [ '(ዲe|ድE)', 'ዴ' ],
+ [ 'ድo', 'ዶ' ],
+ [ 'ዱa', 'ዷ' ], // et
+
+ [ 'ጅe', 'ጀ' ],
+ [ 'ጅu', 'ጁ' ],
+ [ 'ጅi', 'ጂ' ],
+ [ 'ጅa', 'ጃ' ],
+ [ '(ጂe|ጅE)', 'ጄ' ],
+ [ 'ጅo', 'ጆ' ],
+ [ 'ጁa', 'ጇ' ], // et
+
+ [ 'ግe', 'ገ' ],
+ [ 'ግu', 'ጉ' ],
+ [ 'ግi', 'ጊ' ],
+ [ 'ግa', 'ጋ' ],
+ [ '(ጊe|ግE)', 'ጌ' ],
+ [ 'ግo', 'ጎ' ],
+
+ [ 'ጉe', 'ጐ' ],
+ [ 'ጉi', 'ጒ' ],
+ [ 'ጉa', 'ጓ' ],
+ [ 'ጒe', 'ጔ' ],
+ [ 'ግW', 'ጕ' ],
+
+ [ 'ጝe', 'ጘ' ],
+ [ 'ጝu', 'ጙ' ],
+ [ 'ጝi', 'ጚ' ],
+ [ 'ጝa', 'ጛ' ],
+ [ '(ጚe|ጝE)', 'ጜ' ],
+ [ 'ጝo', 'ጞ' ],
+
+ [ 'ጙe', 'ⶓ' ],
+ [ 'ጙi', 'ⶔ' ],
+ [ 'ጙa', 'ጟ' ],
+ [ '(ⶔe|ⶔE)', 'ⶕ' ],
+ [ 'ጝW', 'ⶖ' ],
+
+ [ 'ጥe', 'ጠ' ],
+ [ 'ጥu', 'ጡ' ],
+ [ 'ጥi', 'ጢ' ],
+ [ 'ጥa', 'ጣ' ],
+ [ '(ጢe|ጥE)', 'ጤ' ],
+ [ 'ጥo', 'ጦ' ],
+ [ 'ጡa', 'ጧ' ], // et
+
+ [ 'ጭe', 'ጨ' ],
+ [ 'ጭu', 'ጩ' ],
+ [ 'ጭi', 'ጪ' ],
+ [ 'ጭa', 'ጫ' ],
+ [ '(ጪe|ጭE)', 'ጬ' ],
+ [ 'ጭo', 'ጮ' ],
+ [ 'ጩa', 'ጯ' ], // et
+
+ [ 'ጵe', 'ጰ' ],
+ [ 'ጵu', 'ጱ' ],
+ [ 'ጵi', 'ጲ' ],
+ [ 'ጵa', 'ጳ' ],
+ [ '(ጲe|ጵE)', 'ጴ' ],
+ [ 'ጵo', 'ጶ' ],
+ [ 'ጱa', 'ጷ' ],
+
+ [ 'ጽe', 'ጸ' ],
+ [ 'ጽu', 'ጹ' ],
+ [ 'ጽi', 'ጺ' ],
+ [ 'ጽa', 'ጻ' ],
+ [ '(ጺe|ጽE)', 'ጼ' ],
+ [ 'ጽo', 'ጾ' ],
+ [ 'ጹa', 'ጿ' ], // et
+
+ [ 'ፅe', 'ፀ' ],
+ [ 'ፅu', 'ፁ' ],
+ [ 'ፅi', 'ፂ' ],
+ [ 'ፅa', 'ፃ' ],
+ [ '(ፂe|ፅE)', 'ፄ' ],
+ [ 'ፅo', 'ፆ' ],
+
+ [ 'ፍe', 'ፈ' ],
+ [ 'ፍu', 'ፉ' ],
+ [ 'ፍi', 'ፊ' ],
+ [ 'ፍa', 'ፋ' ],
+ [ '(ፈe|ፍE)', 'ፌ' ],
+ [ 'ፍo', 'ፎ' ],
+ [ 'ፉa', 'ፏ' ], // et
+
+ [ 'ፕe', 'ፐ' ],
+ [ 'ፕu', 'ፑ' ],
+ [ 'ፕi', 'ፒ' ],
+ [ 'ፕa', 'ፓ' ],
+ [ '(ፒe|ፕE)', 'ፔ' ],
+ [ 'ፕo', 'ፖ' ],
+ [ 'ፑa', 'ፗ' ], // et
+
+ [ 'O', 'ዕ' ],
+ [ 'ዕe', 'ዐ' ],
+ [ 'ዕu', 'ዑ' ],
+ [ 'ዕi', 'ዒ' ],
+ [ 'ዕa', 'ዓ' ],
+ [ '(ዒe|ዕE)', 'ዔ' ],
+ [ 'ዕo', 'ዖ' ],
+
+ // vowels
+ [ 'A', 'እ' ],
+ [ '(እu|u)', 'ኡ' ],
+ [ '(እi|i)', 'ኢ' ],
+ [ '(እa|a)', 'ኣ' ],
+ [ '(ኢe|እE)', 'ኤ' ],
+ [ '(እe|e)', 'አ' ],
+ [ '(እo|o)', 'ኦ' ],
+ [ 'አa', 'ኧ' ], // et
+
+ // punctuations
+ [ ',', '፣' ],
+ [ '።\\.', '.' ],
+ [ '(\\.|፡;)', '።' ],
+ [ '\\;', '፡' ],
+ [ '\\?\\?', '፧' ],
+ [ '፡-', '፦' ],
+ [ '።-', '፨' ],
+ [ '\\:', '፤' ],
+
+ // Geez Numerals
+ [ '1^', '፩' ], // 1
+ [ '2^', '፪' ], // 2
+ [ '3^', '፫' ], // 3
+ [ '4^', '፬' ], // 4
+ [ '5^', '፭' ], // 5
+ [ '6^', '፮' ], // 6
+ [ '7^', '፯' ], // 7
+ [ '8^', '፰' ], // 8
+ [ '9^', '፱' ], // 9
+
+ [ '፩0', '፲' ], // 10
+ [ '፪0', '፳' ], // 20
+ [ '፫0', '፴' ], // 30
+ [ '፬0', '፵' ], // 40
+ [ '፭0', '፶' ], // 50
+ [ '፮0', '፷' ], // 60
+ [ '፯0', '፸' ], // 70
+ [ '፰0', '፹' ], // 80
+ [ '፱0', '፺' ], // 90
+
+ [ '፲0', '፻' ], // 100
+ [ '፳0', '፪፻' ], // 200
+ [ '፴0', '፫፻' ], // 300
+ [ '፵0', '፬፻' ], // 400
+ [ '፶0', '፭፻' ], // 500
+ [ '፷0', '፮፻' ], // 600
+ [ '፸0', '፯፻' ], // 700
+ [ '፹0', '፰፻' ], // 800
+ [ '፺0', '፱፻' ], // 900
+
+ [ '፻0', '፲፻' ], // 1000
+ [ '፲፻0', '፼' ] // 10,000
+ ]
+ };
+
+ $.ime.register( tigGeezim );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/tn/tn-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/tn/tn-tilde.js
new file mode 100644
index 00000000..0380515f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/tn/tn-tilde.js
@@ -0,0 +1,24 @@
+( function ( $ ) {
+ 'use strict';
+
+ var tnTilde = {
+ id: 'tn-tilde',
+ name: 'tn-tilde',
+ description: 'Setswana input keyboard',
+ date: '2022-07-19',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~S', 'Š' ],
+ [ '~s', 'š' ],
+ [ '~E', 'Ê' ],
+ [ '~e', 'ê' ],
+ [ '~O', 'Ô' ],
+ [ '~o', 'ô' ]
+ ]
+ };
+
+ $.ime.register( tnTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/tum/tum-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/tum/tum-tilde.js
new file mode 100644
index 00000000..07eaf270
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/tum/tum-tilde.js
@@ -0,0 +1,21 @@
+( function ( $ ) {
+ 'use strict';
+
+ var tumTilde = {
+ id: 'tum-tilde',
+ name: 'tum-tilde',
+ description: 'ChiTumbuka tilde keyboard',
+ date: '2022-06-16',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~W', 'Ŵ' ],
+ [ '~w', 'ŵ' ],
+ [ '~\\^', '\u0302' ] // Combining circumflex
+ ]
+ };
+
+ $.ime.register( tumTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/udm/udm-alt.js b/UniversalLanguageSelector/lib/jquery.ime/rules/udm/udm-alt.js
new file mode 100644
index 00000000..1ead7b0c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/udm/udm-alt.js
@@ -0,0 +1,40 @@
+( function ( $ ) {
+ 'use strict';
+
+ var udmAlt = {
+ id: 'udm-alt',
+ name: 'Удмурт ALT',
+ description: 'Удмурт ALT',
+ date: '2013-03-17',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Amir (Алексей) Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'ц', 'ӵ' ],
+ [ 'Ц', 'Ӵ' ],
+ [ 'щ', 'ӥ' ],
+ [ 'Щ', 'Ӥ' ],
+ [ 'х', 'ӟ' ],
+ [ 'Х', 'Ӟ' ],
+ [ 'ф', 'ӝ' ],
+ [ 'Ф', 'Ӝ' ]
+ ],
+ patterns_x: [
+ [ 'ё', 'ӧ' ],
+ [ 'Ё', 'Ӧ' ],
+
+ // Allow typing the Russian letters using Alt
+ [ 'ц', 'ц' ],
+ [ 'Ц', 'Ц' ],
+ [ 'щ', 'щ' ],
+ [ 'Щ', 'Щ' ],
+ [ 'х', 'х' ],
+ [ 'Х', 'Х' ],
+ [ 'ф', 'ф' ],
+ [ 'Ф', 'Ф' ]
+ ]
+ };
+
+ $.ime.register( udmAlt );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ug/ug-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ug/ug-kbd.js
new file mode 100644
index 00000000..b6c908dc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ug/ug-kbd.js
@@ -0,0 +1,79 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ugKbd = {
+ id: 'ug-kbd',
+ name: 'Uyghur kbd',
+ description: 'Uyghur kbd keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'q', '\u0686' ],
+ [ 'w', '\u06CB' ],
+ [ 'e', '\u06D0' ],
+ [ 'r', '\u0631' ],
+ [ 't', '\u062A' ],
+ [ 'y', '\u064A' ],
+ [ 'u', '\u06C7' ],
+ [ 'i', '\u06AD' ],
+ [ 'o', '\u0648' ],
+ [ 'p', '\u067E' ],
+ [ 'a', '\u06BE' ],
+ [ 's', '\u0633' ],
+ [ 'd', '\u062F' ],
+ [ 'f', '\u0627' ],
+ [ 'g', '\u06D5' ],
+ [ 'h', '\u0649' ],
+ [ 'j', '\u0642' ],
+ [ 'k', '\u0643' ],
+ [ 'l', '\u0644' ],
+ [ ';', '\u061B' ],
+ [ 'z', '\u0632' ],
+ [ 'x', '\u0634' ],
+ [ 'c', '\u063A' ],
+ [ 'v', '\u06C8' ],
+ [ 'b', '\u0628' ],
+ [ 'n', '\u0646' ],
+ [ 'm', '\u0645' ],
+ [ ',', '\u060C' ],
+ [ '/', '\u0626' ],
+ [ 'Q', '\u0686' ],
+ [ 'W', '\u06CB' ],
+ [ 'E', '\u06D0' ],
+ [ 'R', '\u0631' ],
+ [ 'T', '\u062A' ],
+ [ 'Y', '\u064A' ],
+ [ 'U', '\u06C7' ],
+ [ 'I', '\u06AD' ],
+ [ 'O', '\u0648' ],
+ [ 'P', '\u067E' ],
+ [ '\\{', '\u00AB' ],
+ [ '\\}', '\u00BB' ],
+ [ 'A', '\u06BE' ],
+ [ 'S', '\u0633' ],
+ [ 'D', '\u0698' ],
+ [ 'F', '\u0641' ],
+ [ 'G', '\u06AF' ],
+ [ 'H', '\u062E' ],
+ [ 'J', '\u062C' ],
+ [ 'K', '\u06C6' ],
+ [ 'L', '\u0644' ],
+ [ 'Z', '\u0632' ],
+ [ 'X', '\u0634' ],
+ [ 'C', '\u063A' ],
+ [ 'V', '\u06C8' ],
+ [ 'B', '\u0628' ],
+ [ 'N', '\u0646' ],
+ [ 'M', '\u0645' ],
+ [ '\\?', '\u061F' ],
+ [ '\\<', '\u2039' ],
+ [ '\\>', '\u203A' ],
+ [ '\\_', '\u2014' ]
+ ]
+ };
+
+ $.ime.register( ugKbd );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/uk/uk-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/uk/uk-kbd.js
new file mode 100644
index 00000000..b47a07d2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/uk/uk-kbd.js
@@ -0,0 +1,101 @@
+( function ( $ ) {
+ 'use strict';
+
+ var ukKbd = {
+ id: 'uk-kbd',
+ name: 'Українська',
+ description: 'Ukrainian kbd keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', 'ґ' ],
+ [ 'q', 'й' ],
+ [ 'w', 'ц' ],
+ [ 'e', 'у' ],
+ [ 'r', 'к' ],
+ [ 't', 'е' ],
+ [ 'y', 'н' ],
+ [ 'u', 'г' ],
+ [ 'i', 'ш' ],
+ [ 'o', 'щ' ],
+ [ 'p', 'з' ],
+ [ '\\[', 'х' ],
+ [ '\\]', 'ї' ],
+ [ 'a', 'ф' ],
+ [ 's', 'і' ],
+ [ 'd', 'в' ],
+ [ 'f', 'а' ],
+ [ 'g', 'п' ],
+ [ 'h', 'р' ],
+ [ 'j', 'о' ],
+ [ 'k', 'л' ],
+ [ 'l', 'д' ],
+ [ ';', 'ж' ],
+ [ '\'', 'є' ],
+ [ '\\\\', '\\' ],
+ [ 'z', 'я' ],
+ [ 'x', 'ч' ],
+ [ 'c', 'с' ],
+ [ 'v', 'м' ],
+ [ 'b', 'и' ],
+ [ 'n', 'т' ],
+ [ 'm', 'ь' ],
+ [ ',', 'б' ],
+ [ '\\.', 'ю' ],
+ [ '/', '.' ],
+ [ '\\!', '!' ],
+ [ '\\@', '"' ],
+ [ '\\#', '№' ],
+ [ '\\$', ';' ],
+ [ '\\%', '%' ],
+ [ '\\^', ':' ],
+ [ '\\&', '?' ],
+ [ '\\*', '*' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '\\_', '_' ],
+ [ '\\+', '+' ],
+ [ '\\~', 'Ґ' ],
+ [ 'Q', 'Й' ],
+ [ 'W', 'Ц' ],
+ [ 'E', 'У' ],
+ [ 'R', 'К' ],
+ [ 'T', 'Е' ],
+ [ 'Y', 'Н' ],
+ [ 'U', 'Г' ],
+ [ 'I', 'Ш' ],
+ [ 'O', 'Щ' ],
+ [ 'P', 'З' ],
+ [ '\\{', 'Х' ],
+ [ '\\}', 'Ї' ],
+ [ 'A', 'Ф' ],
+ [ 'S', 'І' ],
+ [ 'D', 'В' ],
+ [ 'F', 'А' ],
+ [ 'G', 'П' ],
+ [ 'H', 'Р' ],
+ [ 'J', 'О' ],
+ [ 'K', 'Л' ],
+ [ 'L', 'Д' ],
+ [ ':', 'Ж' ],
+ [ '"', 'Є' ],
+ [ '\\|', '|' ],
+ [ 'Z', 'Я' ],
+ [ 'X', 'Ч' ],
+ [ 'C', 'С' ],
+ [ 'V', 'М' ],
+ [ 'B', 'И' ],
+ [ 'N', 'Т' ],
+ [ 'M', 'Ь' ],
+ [ '\\<', 'Б' ],
+ [ '\\>', 'Ю' ],
+ [ '\\?', ',' ]
+ ]
+
+ };
+ $.ime.register( ukKbd );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ur/ur-phonetic.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ur/ur-phonetic.js
new file mode 100644
index 00000000..ee16e3df
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ur/ur-phonetic.js
@@ -0,0 +1,98 @@
+( function ( $ ) {
+ 'use strict';
+
+ var urPhonetic = {
+ id: 'ur-phonetic',
+ name: 'صوتی',
+ description: 'Phonetic keyboard for Urdu script',
+ date: '2013-02-18',
+ URL: 'http://cvs.savannah.gnu.org/viewvc/m17n-contrib/im/ur-phonetic.mim?root=m17n&view=markup',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '!', '!' ],
+ [ '\\#', '/' ],
+ /* Yeh with hamza above */ [ '\\$', 'ئ' ],
+ [ '\\(', ')' ],
+ [ '\\)', '(' ],
+ /* Shadda */ [ '_', 'ّ' ],
+ /* Alef with hamza above */ [ '\\-', 'أ' ],
+ /* Alef with madda above */ [ '\\+', 'آ' ],
+ /* Waw with hamza above */ [ '\\=', 'ؤ' ],
+ /* Sukun */ [ 'Q', 'ْ' ],
+ [ 'q', 'ق' ],
+ [ 'W', 'ﷺ' ],
+ [ 'w', 'و' ],
+ [ 'E', '¥' ],
+ [ 'e', 'ع' ],
+ [ 'R', 'ڑ' ],
+ [ 'r', 'ر' ],
+ [ 'T', 'ٹ' ],
+ [ 't', 'ت' ],
+ [ 'Y', '\u0601' ],
+ [ 'y', 'ے' ],
+ [ 'U', '،' ],
+ [ 'u', 'ء' ],
+ /* superscript alef */ [ 'I', 'ٰ' ],
+ [ 'i', 'ی' ],
+ /* Teh marbuta goal */ [ 'O', 'ۃ' ],
+ [ 'o', 'ہ' ],
+ /* damma */ [ 'P', 'ُ' ],
+ [ 'p', 'پ' ],
+ /* superscript alef */ [ '\\{', 'ٰ' ],
+ [ '\\[', ']' ],
+ /* double superscript alef */ [ '\\}', 'ٰٰ' ],
+ [ '\\]', '[' ],
+ /* madda */ [ 'A', 'ٓ' ],
+ [ 'a', 'ا' ],
+ [ 'S', 'ص' ],
+ [ 's', 'س' ],
+ [ 'D', 'ڈ' ],
+ [ 'd', 'د' ],
+ /* Empty */ [ 'F', '' ],
+ [ 'f', 'ف' ],
+ [ 'G', 'غ' ],
+ [ 'g', 'گ' ],
+ [ 'H', 'ح' ],
+ [ 'h', 'ھ' ],
+ [ 'J', 'ض' ],
+ [ 'j', 'ج' ],
+ [ 'K', 'خ' ],
+ [ 'k', 'ک' ],
+ [ 'L', '\u0613' ],
+ [ 'l', 'ل' ],
+ [ ':', ':' ],
+ /* Arabic semicolon */ [ ';', '؛' ],
+ /* verse sign */ [ '"', '؎' ],
+ /* superscript alef */ [ '\'', 'ٰ' ],
+ /* takhallus */ [ '\\|', 'ؔ' ],
+ /* verse sign */ [ '\\', '؎' ],
+ /* fathatan */ [ '\\~', 'ً' ],
+ /* kasratan */ [ '\\`', 'ٍ' ],
+ [ 'Z', 'ذ' ],
+ [ 'z', 'ز' ],
+ [ 'X', 'ژ' ],
+ [ 'x', 'ش' ],
+ [ 'C', 'ث' ],
+ [ 'c', 'چ' ],
+ [ 'V', 'ظ' ],
+ [ 'v', 'ط' ],
+ /* rakhmatullah */ [ 'B', 'ؒ' ],
+ [ 'b', 'ب' ],
+ [ 'N', 'ں' ],
+ [ 'n', 'ن' ],
+ /* Empty */ [ 'M', '' ],
+ [ 'm', 'م' ],
+ /* kasra */ [ '\\<', 'ِ' ],
+ [ ',', '،' ],
+ /* fatha */ [ '\\>', 'َ' ],
+ /* Arabic full stop */ [ '\\.', '۔' ],
+ /* Arabic question mark */ [ '\\?', '؟' ],
+ /* sla */ [ '\\^', 'ۖ' ],
+ /* hamza above */ [ '\\&', 'ٔ' ],
+ /* dammatan */ [ '\\*', 'ٌ' ] ]
+ };
+
+ $.ime.register( urPhonetic );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ur/ur-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ur/ur-transliteration.js
new file mode 100644
index 00000000..dc3d173a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ur/ur-transliteration.js
@@ -0,0 +1,98 @@
+( function ( $ ) {
+ 'use strict';
+
+ var urTransliteration = {
+ id: 'ur-transliteration',
+ name: 'Urdu Transliteration',
+ description: 'Urdu Transliteration based on RTS',
+ date: '2012-10-16',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Mohammed Imran Tabani',
+ license: '',
+ version: '1.0',
+ patterns: [
+ [ 'x', 'ف' ],
+ [ '_', '_' ],
+ [ 'D', 'ڑ' ],
+ [ 'E', 'ذ' ],
+ [ 'F', 'ں' ],
+ [ 'R', 'ڈ' ],
+ [ 'G', 'ۂ' ],
+ [ 'T', 'ث' ],
+ [ '\\+', '+' ],
+ [ 'S', 'ز' ],
+ [ 'W', 'ض' ],
+ [ 'A', 'ژ' ],
+ [ 'Q', 'ظ' ],
+ [ 'k', 'ک' ],
+ [ 'K', 'گ' ],
+ [ 'i', 'ب' ],
+ [ 'I', 'ـ' ],
+ [ 'U', 'ۃ' ],
+ /* Arabic semicolon */ [ '\\;', '؛' ],
+ [ '\\:', ':' ],
+ [ 'p', 'ح' ],
+ [ 'P', 'خ' ],
+ [ '\\}', '{' ],
+ [ '\'', '\'' ],
+ [ '"', '"' ],
+ [ '\\[', ']' ],
+ [ '\\{', '{' ],
+ [ 'C', 'ۓ' ],
+ [ 'l', 'ی' ],
+ [ 'L', 'ي' ],
+ [ 'o', 'ج' ],
+ [ 'O', 'چ' ],
+ [ 'v', 'س' ],
+ [ 'h', 'ہ' ],
+ [ 'H', 'ء' ],
+ [ 'y', 'پ' ],
+ [ 'Y', '\u0651\u00AD' ],
+ [ 'c', 'ے' ],
+ /* Arabic question mark */ [ '\\?', '؟' ],
+ [ 'j', 'ا' ],
+ [ 'n', 'غ' ],
+ [ 'N', 'ئ' ],
+ [ 'b', 'ش' ],
+ [ '\\<', '', '>' ],
+ [ 'm', 'ع' ],
+ [ 'u', 'ت' ],
+ [ '\\]', '', '[' ],
+ [ 'e', 'ھ' ],
+ [ 'f', 'ن' ],
+ [ 'r', 'د' ],
+ [ 'g', 'ل' ],
+ [ 't', 'ٹ' ],
+ [ '\\=', '', '=' ],
+ [ '\\\\', '\\' ],
+ [ 's', 'و' ],
+ [ 'w', 'ص' ],
+ [ 'a', 'م' ],
+ [ 'q', 'ط' ],
+ [ 'd', 'ر' ],
+ [ '\\|', '|' ],
+ [ '/', '/' ],
+ [ '\\>', '<' ],
+ [ '0', '0' ],
+ [ '1', '1' ],
+ [ '2', '2' ],
+ [ '3', '3' ],
+ [ '4', '4' ],
+ [ '5', '5' ],
+ [ '6', '6' ],
+ [ '7', '7' ],
+ [ '8', '8' ],
+ [ '9', '9' ],
+ [ '\\@', '@' ],
+ [ '\\#', '', '#' ],
+ [ '\\$', '', '$' ],
+ [ '\\%', '', '٪' ],
+ [ '\\^', '', '^' ],
+ [ '\\&', 'ۖ' ],
+ /* Arabic star */ [ '\\*', '٭' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ] ]
+ };
+
+ $.ime.register( urTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/uz/uz-kbd.js b/UniversalLanguageSelector/lib/jquery.ime/rules/uz/uz-kbd.js
new file mode 100644
index 00000000..af368e1e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/uz/uz-kbd.js
@@ -0,0 +1,102 @@
+( function ( $ ) {
+ 'use strict';
+
+ var uzKbd = {
+ id: 'uz-kbd',
+ name: 'Uzbek keyboard',
+ description: 'Uzbek input method with Russian keyboard layout',
+ date: '2013-02-12',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Parag Nemade',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '`', 'ё' ],
+ [ 'q', 'й' ],
+ [ 'w', 'ц' ],
+ [ 'e', 'у' ],
+ [ 'r', 'к' ],
+ [ 't', 'е' ],
+ [ 'y', 'н' ],
+ [ 'u', 'г' ],
+ [ 'i', 'ш' ],
+ [ 'o', 'ў' ],
+ [ 'p', 'з' ],
+ [ '\\[', 'х' ],
+ [ '\\]', 'ъ' ],
+ [ 'a', 'ф' ],
+ [ 's', 'қ' ],
+ [ 'd', 'в' ],
+ [ 'f', 'а' ],
+ [ 'g', 'п' ],
+ [ 'h', 'р' ],
+ [ 'j', 'о' ],
+ [ 'k', 'л' ],
+ [ 'l', 'д' ],
+ [ ';', 'ж' ],
+ [ '\'', 'э' ],
+ [ '\\\\', '\\' ],
+ [ 'z', 'я' ],
+ [ 'x', 'ч' ],
+ [ 'c', 'с' ],
+ [ 'v', 'м' ],
+ [ 'b', 'и' ],
+ [ 'n', 'т' ],
+ [ 'm', 'ь' ],
+ [ ',', 'б' ],
+ [ '\\.', 'ю' ],
+ [ '/', '.' ],
+ [ '\\!', '!' ],
+ [ '\\@', '"' ],
+ [ '\\#', '№' ],
+ [ '\\$', ';' ],
+ [ '\\%', '%' ],
+ [ '\\^', ':' ],
+ [ '\\&', '?' ],
+ [ '\\*', '*' ],
+ [ '\\(', '(' ],
+ [ '\\)', ')' ],
+ [ '\\-', 'ғ' ],
+ [ '\\_', 'Ғ' ],
+ [ '\\=', 'ҳ' ],
+ [ '\\+', 'Ҳ' ],
+ [ '\\~', 'Ё' ],
+ [ 'Q', 'Й' ],
+ [ 'W', 'Ц' ],
+ [ 'E', 'У' ],
+ [ 'R', 'К' ],
+ [ 'T', 'Е' ],
+ [ 'Y', 'Н' ],
+ [ 'U', 'Г' ],
+ [ 'I', 'Ш' ],
+ [ 'O', 'Ў' ],
+ [ 'P', 'З' ],
+ [ '\\{', 'Х' ],
+ [ '\\}', 'Ъ' ],
+ [ 'A', 'Ф' ],
+ [ 'S', 'Қ' ],
+ [ 'D', 'В' ],
+ [ 'F', 'А' ],
+ [ 'G', 'П' ],
+ [ 'H', 'Р' ],
+ [ 'J', 'О' ],
+ [ 'K', 'Л' ],
+ [ 'L', 'Д' ],
+ [ ':', 'Ж' ],
+ [ '"', 'Э' ],
+ [ '\\|', '|' ],
+ [ 'Z', 'Я' ],
+ [ 'X', 'Ч' ],
+ [ 'C', 'С' ],
+ [ 'V', 'М' ],
+ [ 'B', 'И' ],
+ [ 'N', 'Т' ],
+ [ 'M', 'Ь' ],
+ [ '\\<', 'Б' ],
+ [ '\\>', 'Ю' ],
+ [ '\\?', ',' ]
+ ]
+ };
+ $.ime.register( uzKbd );
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/vai/vai-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/vai/vai-transliteration.js
new file mode 100644
index 00000000..61cef3db
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/vai/vai-transliteration.js
@@ -0,0 +1,322 @@
+( function ( $ ) {
+ 'use strict';
+
+ var vaiTransliteration = {
+ id: 'vai-transliteration',
+ name: 'Vai Transliteration',
+ description: 'Vai Transliteration, based on the SIL Keyman layout found at https://github.com/keymanapp/keyboards/tree/master/release/sil/sil_vai/source, with extensions',
+ date: '2019-05-08',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 3,
+ maxKeyLength: 4,
+ patterns: [
+ // N.B.: Each series doesn't go exactly according to the sequential
+ // Unicode order because this way 'he' would override 'bhe', etc.
+
+ // Punctuation, additional letters, and logograms
+ [ '[XN]', '\uA60B' ], // X, N ꘋ - syllable-final ng
+ [ '\uA60C=', '=' ], // An equals sign
+ [ '=', '\uA60C' ], // Syllable lengthener ꘌ
+ [ '\uA60D,', ',' ], // Latin comma
+ [ ',', '\uA60D' ], // Vai comma
+ [ '\uA60E\\.', '.' ], // Latin full stop
+ [ '\\.', '\uA60E' ], // Vai full stop
+ [ '\uA60E\uA60E!', '!' ], // Latin exclamation mark
+ [ '!', '\uA60E\uA60E' ], // Exclamation mark (double Vai full stop)
+ [ '\uA60F\\?', '?' ], // Latin question mark
+ [ '\\?', '\uA60F' ], // Vai question mark
+ [ 'F\uA5E1\uA60BG', 'FEN', '\uA613' ], // Feeng logogram ꘓ
+ [ 'FAH?A', '\uA618' ], // Faa logogram ꘘ
+
+ // Syllables in -ee (e)
+ [ 'we', '\uA503' ], // we ꔃ
+ [ '\uA503~', '\uA504' ], // we~ ꔄ
+ [ 'bhe', '\uA506' ], // bhe ꔆ
+ [ 'mbe', '\uA508' ], // mbe ꔈ
+ [ 'kpe', '\uA509' ], // kpe ꔉ
+ [ 'mgbe', '\uA50A' ], // mgbe ꔊ
+ [ 'gbe', '\uA50B' ], // gbe ꔋ
+ [ 'fe', '\uA50C' ], // fe ꔌ
+ [ 've', '\uA50D' ], // ve ꔍ
+ [ 'te', '\uA50E' ], // te ꔎ
+ [ 'the', '\uA50F' ], // the ꔏ
+ [ 'dhe', '\uA511' ], // dhe ꔑ
+ [ 're', '\uA513' ], // re ꔓ
+ [ 'n[dD]e', '\uA515' ], // nde, nDe ꔕ
+ [ '(dl|D)e', '\uA514' ], // dle, De ꔔ
+ [ 'se', '\uA516' ], // se ꔖ
+ [ 'she', '\uA517' ], // she ꔗ
+ [ 'ze', '\uA518' ], // ze ꔘ
+ [ 'zhe', '\uA519' ], // zhe ꔙ
+ [ 'ce', '\uA51A' ], // ce ꔚ
+ [ 'nje', '\uA51C' ], // nje ꔜ
+ [ 'ke', '\uA51E' ], // ke ꔞ
+ [ 'nge', '\uA51F' ], // nge ꔟ
+ [ 'me', '\uA521' ], // me ꔡ
+ [ 'ne', '\uA522' ], // ne ꔢ
+ [ 'nye', '\uA523' ], // nye ꔣ
+ [ 'he', '\uA502' ], // he ꔂ
+ [ 'pe', '\uA505' ], // pe ꔅ
+ [ 'be', '\uA507' ], // be ꔇ
+ [ 'de', '\uA510' ], // de ꔐ
+ [ 'le', '\uA512' ], // le ꔒ
+ [ 'je', '\uA51B' ], // je ꔛ
+ [ 'ye', '\uA51D' ], // ye ꔝ
+ [ 'ge', '\uA520' ], // ge ꔠ
+
+ // Syllables in -i
+ [ 'wi', '\uA528' ], // wi ꔨ
+ [ '\uA528~', '\uA529' ], // wi~ ꔩ
+ [ 'bhi', '\uA52B' ], // bhi ꔫ
+ [ '\uA526~', '\uA527' ], // hi~ ꔩ
+ [ 'mbi', '\uA52D' ], // mbi ꔭ
+ [ 'kpi', '\uA52E' ], // kpi ꔮ
+ [ 'mgbi', '\uA52F' ], // mgbi ꔯ
+ [ 'gbi', '\uA530' ], // gbi ꔰ
+ [ 'fi', '\uA531' ], // fi ꔱ
+ [ 'vi', '\uA532' ], // vi ꔲ
+ [ 'ti', '\uA533' ], // ti ꔳ
+ [ 'thi', '\uA534' ], // thi ꔳ
+ [ 'dhi', '\uA536' ], // dhi ꔶ
+ [ 'ri', '\uA538' ], // ri ꔸ
+ [ 'n[dD]i', '\uA53A' ], // ndi, nDi ꔺ
+ [ '(dl|D)i', '\uA539' ], // dli, Di ꔹ
+ [ 'si', '\uA53B' ], // si ꔻ
+ [ 'shi', '\uA53C' ], // shi ꔼ
+ [ 'zi', '\uA53D' ], // zi ꔽ
+ [ 'zhi', '\uA53E' ], // zhi ꔾ
+ [ 'ci', '\uA53F' ], // ci ꔿ
+ [ 'nji', '\uA541' ], // nji ꕁ
+ [ 'ki', '\uA543' ], // ki ꕃ
+ [ 'ngi', '\uA544' ], // ngi ꕄ
+ [ 'mi', '\uA546' ], // mi ꕆ
+ [ 'ni', '\uA547' ], // ni ꕇ
+ [ 'nyi', '\uA548' ], // nyi ꕈ
+ [ 'hi', '\uA526' ], // hi ꔦ
+ [ 'pi', '\uA52A' ], // pi ꔪ
+ [ 'bi', '\uA52C' ], // bi ꔬ
+ [ 'di', '\uA535' ], // di ꔵ
+ [ 'li', '\uA537' ], // li ꔷ
+ [ 'ji', '\uA540' ], // ji ꕀ
+ [ 'yi', '\uA542' ], // yi ꕂ
+ [ 'gi', '\uA545' ], // gi ꕅ
+
+ // Syllables in -a
+ [ '\uA56C~', '\uA54B' ], // nga~ ꕋ
+ [ 'wa', '\uA54E' ], // wi ꕎ
+ [ '\uA54E~', '\uA54F' ], // wa~ ꕏ
+ [ 'bha', '\uA551' ], // bha ꕑ
+ [ '\uA54C~', '\uA54D' ], // ha~ ꕍ
+ [ 'mba', '\uA553' ], // mba ꕓ
+ [ 'kpa', '\uA554' ], // kpa ꕔ
+ [ '\uA554~', '\uA555' ], // kpa ꕕ
+ [ 'mgba', '\uA556' ], // mgba ꕖ
+ [ 'gba', '\uA557' ], // gba ꕗ
+ [ 'fa', '\uA558' ], // fa ꕘ
+ [ 'va', '\uA559' ], // va ꕙ
+ [ 'ta', '\uA55A' ], // ta ꕚ
+ [ 'tha', '\uA55B' ], // tha ꕛ
+ [ 'dha', '\uA55D' ], // dha ꕝ
+ [ 'ra', '\uA55F' ], // ra ꕟ
+ [ 'n[dD]a', '\uA561' ], // nda, nDa ꕡ
+ [ '(dl|D)a', '\uA560' ], // dla, Da ꕠ
+ [ 'sa', '\uA562' ], // sa ꕢ
+ [ 'sha', '\uA563' ], // sha ꕣ
+ [ 'za', '\uA564' ], // za ꕤ
+ [ 'zha', '\uA565' ], // zha ꕥ
+ [ 'ca', '\uA566' ], // ca ꕦ
+ [ 'nja', '\uA568' ], // nja ꕨ
+ [ 'ka', '\uA56A' ], // ka ꕪ
+ [ '\uA56A~', '\uA56B' ], // ka~ ꕫ
+ [ 'nga', '\uA56C' ], // nga ꕬ
+ [ 'ma', '\uA56E' ], // ma ꕮ
+ [ 'na', '\uA56F' ], // na ꕯ
+ [ 'nya', '\uA570' ], // nya ꕰ
+ [ 'ha', '\uA54C' ], // ha ꕌ
+ [ 'pa', '\uA550' ], // pa ꕐ
+ [ 'ba', '\uA552' ], // ba ꕒ
+ [ 'da', '\uA55C' ], // da ꕜ
+ [ 'la', '\uA55E' ], // la ꕞ
+ [ 'ja', '\uA567' ], // ja ꕧ
+ [ 'ya', '\uA569' ], // ya ꕩ
+ [ 'ga', '\uA56D' ], // ga ꕭ
+
+ // Syllables in -oo (o)
+ [ 'wo', '\uA574' ], // wo ꕴ
+ [ '\uA574~', '\uA575' ], // wo~ ꕵ
+ [ 'bho', '\uA577' ], // bho ꕷ
+ [ 'mbo', '\uA579' ], // mbo ꕹ
+ [ 'kpo', '\uA57A' ], // kpo ꕺ
+ [ 'mgbo', '\uA57B' ], // mgbo ꕻ
+ [ 'gbo', '\uA57C' ], // gbo ꕼ
+ [ 'fo', '\uA57D' ], // fo ꕽ
+ [ 'vo', '\uA57E' ], // vo ꕾ
+ [ 'to', '\uA57F' ], // to ꕿ
+ [ 'tho', '\uA580' ], // tho ꖀ
+ [ 'dho', '\uA582' ], // dho ꖂ
+ [ 'ro', '\uA584' ], // ro ꖄ
+ [ 'n[dD]o', '\uA586' ], // ndo, nDo ꖆ
+ [ '(dl|D)o', '\uA585' ], // dlo, Do ꖅ
+ [ 'so', '\uA587' ], // so ꖇ
+ [ 'sho', '\uA588' ], // sho ꖈ
+ [ 'zo', '\uA589' ], // zo ꖉ
+ [ 'zho', '\uA58A' ], // zho ꖊ
+ [ 'co', '\uA58B' ], // co ꖋ
+ [ 'njo', '\uA58D' ], // njo ꖍ
+ [ 'ko', '\uA58F' ], // ko ꖏ
+ [ 'ngo', '\uA590' ], // ngo ꖐ
+ [ 'mo', '\uA592' ], // mo ꖒ
+ [ 'no', '\uA593' ], // no ꖓ
+ [ 'nyo', '\uA594' ], // nyo ꖔ
+ [ 'ho', '\uA573' ], // ho ꕳ
+ [ 'po', '\uA576' ], // po ꕶ
+ [ 'bo', '\uA578' ], // bo ꕸ
+ [ 'do', '\uA581' ], // do ꖁ
+ [ 'lo', '\uA583' ], // lo ꖃ
+ [ 'jo', '\uA58C' ], // jo ꖌ
+ [ 'yo', '\uA58E' ], // yo ꖎ
+ [ 'go', '\uA591' ], // go ꖑ
+
+ // Syllables in -u
+ [ 'wu', '\uA599' ], // wu ꖕ
+ [ '\uA599~', '\uA59A' ], // wu~ ꖖ
+ [ 'bhu', '\uA59C' ], // bhu ꖜ
+ [ '\uA597~', '\uA598' ], // hu~ ꖘ
+ [ 'mbu', '\uA59E' ], // mbu ꖞ
+ [ 'kpu', '\uA59F' ], // kpu ꖟ
+ [ 'mgbu', '\uA5A0' ], // mgbu ꖠ
+ [ 'gbu', '\uA5A1' ], // gbu ꖡ
+ [ 'fu', '\uA5A2' ], // fu ꖢ
+ [ 'vu', '\uA5A3' ], // vu ꖣ
+ [ 'tu', '\uA5A4' ], // tu ꖤ
+ [ 'thu', '\uA5A5' ], // thu ꖥ
+ [ 'dhu', '\uA5A7' ], // dhu ꖧ
+ [ 'ru', '\uA5A9' ], // ru ꖩ
+ [ 'n[dD]u', '\uA5AB' ], // ndu, nDu ꖫ
+ [ '(dl|D)u', '\uA5AA' ], // dlu, Du ꖪ
+ [ 'su', '\uA5AC' ], // su ꖬ
+ [ 'shu', '\uA5AD' ], // shu ꖭ
+ [ 'zu', '\uA5AE' ], // zu ꖮ
+ [ 'zhu', '\uA5AF' ], // zhu ꖯ
+ [ 'cu', '\uA5B0' ], // cu ꖰ
+ [ 'nju', '\uA5B2' ], // nju ꖲ
+ [ 'ku', '\uA5B4' ], // ku ꖴ
+ [ 'ngu', '\uA5B5' ], // ngu ꖵ
+ [ 'mu', '\uA5B7' ], // mu ꖷ
+ [ 'nu', '\uA5B8' ], // nu ꖸ
+ [ 'nyu', '\uA5B9' ], // nyu ꖹ
+ [ 'hu', '\uA597' ], // hu ꖗ
+ [ 'pu', '\uA59B' ], // pu ꖛ
+ [ 'bu', '\uA59D' ], // bu ꖝ
+ [ 'du', '\uA5A6' ], // du ꖦ
+ [ 'lu', '\uA5A8' ], // lu ꖨ
+ [ 'ju', '\uA5B1' ], // ju ꖱ
+ [ 'yu', '\uA5B3' ], // yu ꖳ
+ [ 'gu', '\uA5B6' ], // gu ꖶ
+
+ // Syllables in -o (ɔ)
+ [ '\uA5DC~', '\uA5BC' ], // ngx~, ngO~ ꖼ
+ [ 'w[xO]', '\uA5BF' ], // wx, wO ꖿ
+ [ '\uA5BF~', '\uA5C0' ], // wx~, wO~ ꗀ
+ [ 'bh[xO]', '\uA5C2' ], // bhx, bhO ꗂ
+ [ '\uA5BD~', '\uA5BE' ], // hx~, hO~ ꖾ
+ [ 'mb[xO]', '\uA5C4' ], // mbx, mbO ꗄ
+ [ 'kp[xO]', '\uA5C5' ], // kpx, kpO ꗅ
+ [ 'mgb[xO]', '\uA5C6' ], // mgbx, mgbO ꗆ
+ [ 'gb[xO]', '\uA5C7' ], // gbx, gbO ꗇ
+ [ '\uA5C7~', '\uA5C8' ], // gbx~, gbO~ ꗈ
+ [ 'f[xO]', '\uA5C9' ], // fx, fO ꗉ
+ [ 'v[xO]', '\uA5CA' ], // vx, vO ꗊ
+ [ 't[xO]', '\uA5CB' ], // tx, tO ꗋ
+ [ 'th[xO]', '\uA5CC' ], // thx, thO ꗌ
+ [ 'dh[xO]', '\uA5CE' ], // dhx, dhO ꗎ
+ [ 'r[xO]', '\uA5D0' ], // rx, rO ꗐ
+ [ 'n[dD][xO]', '\uA5D2' ], // ndx, nDx, ndO nDO ꗒ
+ [ '(dl|D)[xO]', '\uA5D1' ], // dlx, Dx, dlO, DO ꗑ
+ [ 's[xO]', '\uA5D3' ], // sx, sO ꗓ
+ [ 'sh[xO]', '\uA5D4' ], // shx, shO ꗔ
+ [ 'z[xO]', '\uA5D5' ], // zx, zO ꗕ
+ [ 'zh[xO]', '\uA5D6' ], // zhx, zhO ꗖ
+ [ 'c[xO]', '\uA5D7' ], // cx, cO ꗗ
+ [ 'nj[xO]', '\uA5D9' ], // njx, njO ꗙ
+ [ 'k[xO]', '\uA5DB' ], // kx, kO ꗛ
+ [ 'ng[xO]', '\uA5DC' ], // ngx, ngO ꖼ
+ [ 'm[xO]', '\uA5DE' ], // mx, mO ꗞ
+ [ 'n[xO]', '\uA5DF' ], // nx, nO ꗟ
+ [ 'ny[xO]', '\uA5E0' ], // nyx, nyO ꗠ
+ [ 'h[xO]', '\uA5BD' ], // hx, hO ꖽ
+ [ 'p[xO]', '\uA5C1' ], // px, pO ꗁ
+ [ 'b[xO]', '\uA5C3' ], // bx, bO ꗃ
+ [ 'd[xO]', '\uA5CD' ], // dx, dO ꗍ
+ [ 'l[xO]', '\uA5CF' ], // lx, lO ꗏ
+ [ 'j[xO]', '\uA5D8' ], // jx, jO ꗘ
+ [ 'y[xO]', '\uA5DA' ], // yx, yO ꗚ
+ [ 'g[xO]', '\uA5DD' ], // gx, gO ꗝ
+
+ // Syllables in -e (ɛ)
+ [ '\uA604~', 'ng[qE]', '\uA5E3' ], // ngq~, ngE~ ꗣ
+ [ 'w[qE]', '\uA5E6' ], // wq, wE ꗦ
+ [ '\uA5E6~', '\uA5E7' ], // wq~, wE~ ꗧ
+ [ 'bh[qE]', '\uA5E9' ], // bhq, bhE ꗩ
+ [ '\uA5E4~', '\uA5E5' ], // hq~, hE~ ꗥ
+ [ 'mb[qE]', '\uA5EB' ], // mbq, mbE ꗫ
+ [ 'kp[qE]', '\uA5EC' ], // kpq, kpE ꗬ
+ [ '\uA5EC~', '\uA5ED' ], // kpq~, kpE~ ꗭ
+ [ 'mgb[qE]', '\uA5EE' ], // mgbq, mgbE ꗮ
+ [ 'gb[qE]', '\uA5EF' ], // gbq, gbE ꗯ
+ [ '\uA5EF~', '\uA5F0' ], // gbq~, gbE~ ꗰ
+ [ 'f[qE]', '\uA5F1' ], // fq, fE ꗱ
+ [ 'v[qE]', '\uA5F2' ], // vq, vE ꗲ
+ [ 't[qE]', '\uA5F3' ], // tq, tE ꗳ
+ [ 'th[qE]', '\uA5F4' ], // thq, thE ꗴ
+ [ 'dh[qE]', '\uA5F6' ], // dhq, dhE ꗶ
+ [ 'r[qE]', '\uA5F8' ], // rq, rE ꗸ
+ [ 'n[dD][qE]', '\uA5FA' ], // ndq, nDq, ndE, nDE ꗺ
+ [ '(dl|D)[qE]', '\uA5F9' ], // dlq, Dq, dlE, DE ꗹ
+ [ 's[qE]', '\uA5FB' ], // sq, sE ꗻ
+ [ 'sh[qE]', '\uA5FC' ], // shq, shE ꗼ
+ [ 'z[qE]', '\uA5FD' ], // zq, zE ꗽ
+ [ 'zh[qE]', '\uA5FE' ], // zhq, zhE ꗾ
+ [ 'c[qE]', '\uA5FF' ], // cq, cE ꗿ
+ [ 'nj[qE]', '\uA601' ], // njq, njE ꘁ
+ [ 'k[qE]', '\uA603' ], // kq, kE ꘃ
+ [ 'ngg?[qE]', '\uA604' ], // ngq, ngE ꘄ
+ [ '\uA604~', 'gg[qE]', '\uA605' ], // nggq~, nggE~ ꘅ
+ [ '\uA606~', '\uA607' ], // gq~, gE~ ꘇ
+ [ 'm[qE]', '\uA608' ], // mq, mE ꘈ
+ [ 'n[qE]', '\uA609' ], // nq, nE ꘉ
+ [ 'ny[qE]', '\uA60A' ], // nyq, nyE ꘊ
+ [ 'h[qE]', '\uA5E4' ], // hq, hE ꗥ
+ [ 'p[qE]', '\uA5E8' ], // pq, pE ꗨ
+ [ 'b[qE]', '\uA5EA' ], // bq, bE ꗪ
+ [ 'd[qE]', '\uA5F5' ], // dq, dE ꗵ
+ [ 'l[qE]', '\uA5F7' ], // lq, lE ꗷ
+ [ 'j[qE]', '\uA600' ], // jq, jE ꘀ
+ [ 'y[qE]', '\uA602' ], // yq, yE ꘂ
+ [ 'g[qE]', '\uA606' ], // gq, gE ꘆ
+
+ // Vowels
+ [ 'e', '\uA500' ], // e ꔀ (Unicode -ee)
+ [ 'i', '\uA524' ], // i ꔤ
+ [ 'a', '\uA549' ], // a ꕉ
+ [ 'o', '\uA571' ], // o ꕱ (Unicode -oo)
+ [ 'u', '\uA595' ], // u ꖕ
+ [ '[xO]', '\uA5BA' ], // x, O ꖺ (ɔ, Unicode -o)
+ [ '[qE]', '\uA5E1' ], // q, E ꗡ (ɛ, Unicode -e)
+
+ // Nasal vowels
+ [ '\uA500~', '\uA501' ], // e~ ꔁ
+ [ '\uA524~', '\uA525' ], // i~ ꔥ
+ [ '\uA549~', '\uA54A' ], // a~ ꕊ
+ [ '\uA571~', '\uA572' ], // o~ ꕲ
+ [ '\uA595~', '\uA596' ], // u~ ꖖ
+ [ '\uA5BA~', '\uA5BB' ], // x~, O~ ꖻ
+ [ '\uA5E1~', '\uA5E2' ] // q~, E~ ꗢ
+ ]
+ };
+
+ $.ime.register( vaiTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/ve/ve-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/ve/ve-tilde.js
new file mode 100644
index 00000000..a38980c7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/ve/ve-tilde.js
@@ -0,0 +1,28 @@
+( function ( $ ) {
+ 'use strict';
+
+ var veTilde = {
+ id: 've-tilde',
+ name: 've-tilde',
+ description: 'Venda input keyboard',
+ date: '2018-12-02',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~D', 'Ḓ' ],
+ [ '~d', 'ḓ' ],
+ [ '~L', 'Ḽ' ],
+ [ '~l', 'ḽ' ],
+ [ '~N', 'Ṋ' ],
+ [ '~n', 'ṋ' ],
+ [ '~T', 'Ṱ' ],
+ [ '~t', 'ṱ' ],
+ [ '`N', 'Ṅ' ],
+ [ '`n', 'ṅ' ]
+ ]
+ };
+
+ $.ime.register( veTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/vec/vec-GVU.js b/UniversalLanguageSelector/lib/jquery.ime/rules/vec/vec-GVU.js
new file mode 100644
index 00000000..fa172479
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/vec/vec-GVU.js
@@ -0,0 +1,36 @@
+( function ( $ ) {
+ 'use strict';
+
+ var vec = {
+ id: 'vec-GVU',
+ name: 'Vèneto GVU',
+ description: 'Venetian input method.',
+ date: '2020-03-23',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Vajotwo and GatoSelvadego (Wikipedia users)',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ 'ce', 'ç' ],
+ [ 'ci', 'ç' ],
+ [ 'Ce', 'Ç' ],
+ [ 'Ci', 'Ç' ],
+ [ 'dh', 'đ' ],
+ [ 'lh', 'ł' ],
+ [ 'òò', 'ó' ],
+ [ 'zh', 'ẑ' ],
+ [ 'đh', 'dh' ],
+ [ 'łh', 'lh' ],
+ [ 'ẑh', 'zh' ],
+ [ 'Dh', 'Đ' ],
+ [ 'Lh', 'Ł' ],
+ [ 'Òò', 'Ó' ],
+ [ 'Zh', 'Ẑ' ],
+ [ 'Đh', 'Dh' ],
+ [ 'Łh', 'Lh' ],
+ [ 'Ẑh', 'Zh' ]
+ ]
+ };
+
+ $.ime.register( vec );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/wo/wo-alt.js b/UniversalLanguageSelector/lib/jquery.ime/rules/wo/wo-alt.js
new file mode 100644
index 00000000..6646ccd1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/wo/wo-alt.js
@@ -0,0 +1,32 @@
+( function ( $ ) {
+ 'use strict';
+
+ var woAlt = {
+ id: 'wo-alt',
+ name: 'Wolof Alt',
+ description: 'Wolof Alt',
+ date: '2017-05-27',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ contextLength: 0,
+ maxKeyLength: 2,
+ patterns: [
+ [ 'n~', 'ñ' ],
+ [ 'N~', 'Ñ' ],
+ [ 'ñ~', 'n~' ],
+ [ 'Ñ~', 'N~' ]
+ ],
+ patterns_x: [
+ [ 'E', 'Ë' ],
+ [ 'e', 'ë' ],
+ [ 'N', 'Ŋ' ],
+ [ 'n', 'ŋ' ],
+ [ '/', '́' ], // Combining acute accent
+ [ '\\\\', '̀' ] // Combining grave accent
+ ]
+ };
+
+ $.ime.register( woAlt );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/wo/wo-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/wo/wo-tilde.js
new file mode 100644
index 00000000..17044003
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/wo/wo-tilde.js
@@ -0,0 +1,28 @@
+( function ( $ ) {
+ 'use strict';
+
+ var woTilde = {
+ id: 'wo-tilde',
+ name: 'Wolof tilde',
+ description: 'Wolof tilde',
+ date: '2019-05-06',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ '~E', 'Ë' ],
+ [ '~e', 'ë' ],
+ [ '~G', 'Ŋ' ],
+ [ '~g', 'ŋ' ],
+ [ '~n', 'ñ' ],
+ [ '~N', 'Ñ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~:', '\u0308' ] // Combining diaeresis
+ ]
+ };
+
+ $.ime.register( woTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/yo/yo-alt.js b/UniversalLanguageSelector/lib/jquery.ime/rules/yo/yo-alt.js
new file mode 100644
index 00000000..c28905b3
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/yo/yo-alt.js
@@ -0,0 +1,24 @@
+( function ( $ ) {
+ 'use strict';
+
+ var yoAlt = {
+ id: 'yo-alt',
+ name: 'Yorùbá Alt',
+ description: 'Yorùbá Alt',
+ date: '2015-11-14',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns_x: [
+ // Combining dot below
+ [ '\\.', '\u0323' ],
+ // Combining grave accent
+ [ '\\\\', '\u0300' ],
+ // Combining acute accent
+ [ '/', '\u0301' ]
+ ]
+ };
+
+ $.ime.register( yoAlt );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/yo/yo-tilde.js b/UniversalLanguageSelector/lib/jquery.ime/rules/yo/yo-tilde.js
new file mode 100644
index 00000000..571d6604
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/yo/yo-tilde.js
@@ -0,0 +1,29 @@
+( function ( $ ) {
+ 'use strict';
+
+ var yoTilde = {
+ id: 'yo-tilde',
+ name: 'yo-tilde',
+ description: 'Yoruba input keyboard - tilde',
+ date: '2018-11-30',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~E', 'Ẹ' ],
+ [ '~e', 'ẹ' ],
+ [ '~O', 'Ọ' ],
+ [ '~o', 'ọ' ],
+ [ '~S', 'Ṣ' ],
+ [ '~s', 'ṣ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\^', '\u0302' ], // Combining circumflex
+ [ '~\\-', '\u0304' ], // Combining macron
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( yoTilde );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.ime/rules/zh/zh-pinyin-transliteration.js b/UniversalLanguageSelector/lib/jquery.ime/rules/zh/zh-pinyin-transliteration.js
new file mode 100644
index 00000000..9cfe0ae7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.ime/rules/zh/zh-pinyin-transliteration.js
@@ -0,0 +1,60 @@
+( function ( $ ) {
+ 'use strict';
+
+ var zhPinyinTransliteration = {
+ id: 'zh-pinyin-transliteration',
+ name: '拼音符号输入法',
+ description: 'Mandarin PinYin Transliteration input method',
+ date: '2018-12-28',
+ URL: 'http://github.com/wikimedia/jquery.ime',
+ author: 'Yuping Zuo',
+ license: 'MIT',
+ version: '1.0',
+ maxKeyLength: 4,
+ patterns: [
+ [ 'iou', 'iu' ],
+ [ 'uei', 'ui' ],
+ [ 'uen', 'un' ],
+ [ '([jqxy])v', '$1u' ],
+ [ 'v', 'ü' ],
+ [ 'a(ng?)?1', 'ā$1' ],
+ [ 'a(ng?)?2', 'á$1' ],
+ [ 'a(ng?)?3', 'ǎ$1' ],
+ [ 'a(ng?)?4', 'à$1' ],
+ [ 'a([io])1', 'ā$1' ],
+ [ 'a([io])2', 'á$1' ],
+ [ 'a([io])3', 'ǎ$1' ],
+ [ 'a([io])4', 'à$1' ],
+ [ 'o(ng)?1', 'ō$1' ],
+ [ 'o(ng)?2', 'ó$1' ],
+ [ 'o(ng)?3', 'ǒ$1' ],
+ [ 'o(ng)?4', 'ò$1' ],
+ [ 'ou1', 'ōu' ],
+ [ 'ou2', 'óu' ],
+ [ 'ou3', 'ǒu' ],
+ [ 'ou4', 'òu' ],
+ [ 'e(ng?)?1', 'ē$1' ],
+ [ 'e(ng?)?2', 'é$1' ],
+ [ 'e(ng?)?3', 'ě$1' ],
+ [ 'e(ng?)?4', 'è$1' ],
+ [ 'ei1', 'ēi' ],
+ [ 'ei2', 'éi' ],
+ [ 'ei3', 'ěi' ],
+ [ 'ei4', 'èi' ],
+ [ 'i(ng?)?1', 'ī$1' ],
+ [ 'i(ng?)?2', 'í$1' ],
+ [ 'i(ng?)?3', 'ǐ$1' ],
+ [ 'i(ng?)?4', 'ì$1' ],
+ [ 'u(n)?1', 'ū$1' ],
+ [ 'u(n)?2', 'ú$1' ],
+ [ 'u(n)?3', 'ǔ$1' ],
+ [ 'u(n)?4', 'ù$1' ],
+ [ 'ü(n)?1', 'ǖ$1' ],
+ [ 'ü(n)?2', 'ǘ$1' ],
+ [ 'ü(n)?3', 'ǚ$1' ],
+ [ 'ü(n)?4', 'ǜ$1' ]
+ ]
+ };
+
+ $.ime.register( zhPinyinTransliteration );
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.uls/CREDITS b/UniversalLanguageSelector/lib/jquery.uls/CREDITS
new file mode 100644
index 00000000..0729cd3e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/CREDITS
@@ -0,0 +1,16 @@
+Universal Language Selector, part of Project Milkshake, is a collaborative
+project released under the GNU General Public License v2 and the "Expat"
+MIT license. We would like to recognize the following names for their
+contribution to the product:
+
+== Developers ==
+* Alolita Sharma
+* Amir Aharoni
+* Arun Ganesh
+* Brandon Harris
+* Ed Sanders
+* Kartik Mistry
+* Niklas Laxström
+* Pau Giner
+* Santhosh Thottingal
+* Siebrand Mazeland
diff --git a/UniversalLanguageSelector/lib/jquery.uls/GPL-LICENSE b/UniversalLanguageSelector/lib/jquery.uls/GPL-LICENSE
new file mode 100644
index 00000000..019694a9
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/GPL-LICENSE
@@ -0,0 +1,342 @@
+== GNU GENERAL PUBLIC LICENSE ==
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+=== Preamble ===
+
+The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+
+'''0.''' This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+'''1.''' You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+'''2.''' You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ '''a)''' You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ '''b)''' You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ '''c)''' If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+'''3.''' You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ '''a)''' Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ '''b)''' Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ '''c)''' Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+'''4.''' You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+'''5.''' You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+'''6.''' Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+'''7.''' If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+'''8.''' If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+'''9.''' The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+'''10.''' If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+=== NO WARRANTY ===
+
+'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ '''END OF TERMS AND CONDITIONS'''
+
+== How to Apply These Terms to Your New Programs ==
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/UniversalLanguageSelector/lib/jquery.uls/MIT-LICENSE b/UniversalLanguageSelector/lib/jquery.uls/MIT-LICENSE
new file mode 100644
index 00000000..8a9a70a7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/MIT-LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
+Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
+contributors. See CREDITS for a list.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.css b/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.css
new file mode 100644
index 00000000..e5891013
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.css
@@ -0,0 +1,119 @@
+.uls-trigger {
+ background: url( ../images/language.svg ) no-repeat left center;
+ padding-left: 24px;
+}
+
+.uls-menu {
+ position: absolute;
+ z-index: 1000;
+ display: none;
+ margin-top: 1px;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border-color: rgba( 0, 0, 0, 0.2 );
+ -webkit-box-shadow: 0 5px 10px rgba( 0, 0, 0, 0.2 );
+ -moz-box-shadow: 0 5px 10px rgba( 0, 0, 0, 0.2 );
+ box-shadow: 0 5px 10px rgba( 0, 0, 0, 0.2 );
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+}
+
+.uls-wide {
+ min-width: 715px;
+}
+
+.uls-medium {
+ min-width: 360px;
+}
+
+/* Override the grid */
+.uls-medium.grid .row {
+ min-width: 300px;
+}
+
+.uls-narrow {
+ min-width: 180px;
+}
+
+/* Override the grid */
+.uls-narrow.grid .row {
+ min-width: 150px;
+}
+
+.uls-search {
+ background-color: #fff;
+ padding: 5px 16px;
+ border-bottom: 1px solid #ddd;
+}
+
+.grid .uls-search {
+ padding-left: 0;
+}
+
+/* Make space for magnifying class on the front */
+.uls-search-wrapper {
+ position: relative;
+ padding-left: 44px;
+ margin-right: 5px;
+ height: 32px;
+}
+
+.uls-search-label {
+ background: url( ../images/search.svg ) no-repeat center center;
+ background-size: 20px;
+ height: 32px;
+ width: 44px;
+ display: block;
+ position: absolute;
+ left: 0;
+ opacity: 0.5;
+}
+
+.uls-search-input-wrapper {
+ position: relative;
+}
+
+/* There are two input boxes. This class applies to both of them */
+.uls-filterinput {
+ font-size: 1.143em;
+ height: 32px;
+ width: 100%;
+ /* For the custom clear (X) icon */
+ padding: 6px 25px 6px 0;
+ outline: 0;
+ border: 0;
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+
+/* This is the actual input */
+.uls-languagefilter {
+ background-color: transparent;
+ border: 0;
+ color: #222;
+}
+
+/* This is the shadow input box showing completion suggestions */
+.uls-filtersuggestion {
+ background-color: #fff;
+ color: #777;
+}
+
+.uls-languagefilter-clear {
+ background: url( ../images/close.svg ) no-repeat left center;
+ background-size: 15px;
+ cursor: pointer;
+ height: 15px;
+ width: 15px;
+ opacity: 0.7;
+
+ /* Vertical margins: (32 - 15) / 2 */
+ margin: 8.5px 5px;
+ position: absolute;
+ right: 0;
+ /* Make it appear above the input boxes */
+ z-index: 1;
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.grid.css b/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.grid.css
new file mode 100644
index 00000000..bd8a1746
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.grid.css
@@ -0,0 +1,307 @@
+/* Generated using Foundation http://foundation.zurb.com/docs/grid.php */
+/* Global Reset & Standards ---------------------- */
+.grid * {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+/* Misc ---------------------- */
+.grid .left {
+ float: left;
+}
+
+.grid .right {
+ float: right;
+}
+
+.grid .text-left {
+ text-align: left;
+}
+
+.grid .text-right {
+ text-align: right;
+}
+
+.grid .text-center {
+ text-align: center;
+}
+
+.grid .hide {
+ display: none;
+}
+
+.grid .highlight {
+ background: #ff9;
+}
+
+/* The Grid ---------------------- */
+
+.grid .row {
+ width: 100%;
+ max-width: none;
+ min-width: 600px;
+ margin: 0 auto;
+}
+
+.grid .row .row {
+ width: auto;
+ max-width: none;
+ min-width: 0;
+ margin: 0 -5px;
+}
+
+.grid .column,
+.grid .columns {
+ float: left;
+ min-height: 1px;
+ padding: 0 5px;
+ position: relative;
+}
+
+.grid .row.collapse .column,
+.grid .row.collapse .columns {
+ padding: 0;
+}
+
+.grid .row .row.collapse {
+ margin: 0;
+}
+
+.grid .column.centered,
+.grid .columns.centered {
+ float: none;
+ margin: 0 auto;
+}
+
+.grid .row .one {
+ width: 8.333%;
+}
+
+.grid .row .two {
+ width: 16.667%;
+}
+
+.grid .row .three {
+ width: 25%;
+}
+
+.grid .row .four {
+ width: 33.333%;
+}
+
+.grid .row .five {
+ width: 41.667%;
+}
+
+.grid .row .six {
+ width: 50%;
+}
+
+.grid .row .seven {
+ width: 58.333%;
+}
+
+.grid .row .eight {
+ width: 66.667%;
+}
+
+.grid .row .nine {
+ width: 75%;
+}
+
+.grid .row .ten {
+ width: 83.333%;
+}
+
+.grid .row .eleven {
+ width: 91.667%;
+}
+
+.grid .row .twelve {
+ width: 100%;
+}
+
+.grid .row .offset-by-one {
+ margin-left: 8.333%;
+}
+
+.grid .row .offset-by-two {
+ margin-left: 16.667%;
+}
+
+.grid .row .offset-by-three {
+ margin-left: 25%;
+}
+
+.grid .row .offset-by-four {
+ margin-left: 33.333%;
+}
+
+.grid .row .offset-by-five {
+ margin-left: 41.667%;
+}
+
+.grid .row .offset-by-six {
+ margin-left: 50%;
+}
+
+.grid .row .offset-by-seven {
+ margin-left: 58.333%;
+}
+
+.grid .row .offset-by-eight {
+ margin-left: 66.667%;
+}
+
+.grid .row .offset-by-nine {
+ margin-left: 75%;
+}
+
+.grid .row .offset-by-ten {
+ margin-left: 83.333%;
+}
+
+.grid .push-two {
+ left: 16.667%;
+}
+
+.grid .pull-two {
+ right: 16.667%;
+}
+
+.grid .push-three {
+ left: 25%;
+}
+
+.grid .pull-three {
+ right: 25%;
+}
+
+.grid .push-four {
+ left: 33.333%;
+}
+
+.grid .pull-four {
+ right: 33.333%;
+}
+
+.grid .push-five {
+ left: 41.667%;
+}
+
+.grid .pull-five {
+ right: 41.667%;
+}
+
+.grid .push-six {
+ left: 50%;
+}
+
+.grid .pull-six {
+ right: 50%;
+}
+
+.grid .push-seven {
+ left: 58.333%;
+}
+
+.grid .pull-seven {
+ right: 58.333%;
+}
+
+.grid .push-eight {
+ left: 66.667%;
+}
+
+.grid .pull-eight {
+ right: 66.667%;
+}
+
+.grid .push-nine {
+ left: 75%;
+}
+
+.grid .pull-nine {
+ right: 75%;
+}
+
+.grid .push-ten {
+ left: 83.333%;
+}
+
+.grid .pull-ten {
+ right: 83.333%;
+}
+
+.grid .row:before,
+.grid .row:after {
+ content: '';
+ display: table;
+}
+
+.grid .row:after {
+ clear: both;
+}
+
+/* Block Grids ---------------------- */
+/* These are 2-up, 3-up, 4-up and 5-up ULs, suited
+ for repeating blocks of content. Add 'mobile' to
+ them to switch them just like the layout grid
+ (one item per line) on phones
+
+ For IE7/8 compatibility block-grid items need to be
+ the same height. You can optionally uncomment the
+ lines below to support arbitrary height, but know
+ that IE7/8 do not support :nth-child.
+ -------------------------------------------------- */
+.grid .block-grid {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+}
+
+.grid .block-grid > li {
+ display: block;
+ height: auto;
+ float: left;
+}
+
+.grid .block-grid.two-up {
+ margin: 0 -15px;
+}
+
+.grid .block-grid.two-up > li {
+ width: 50%;
+ padding: 0 15px 15px;
+}
+
+/* .block-grid.two-up>li:nth-child(2n+1) {clear: left;} */
+.grid .block-grid.three-up {
+ margin: 0 -12px;
+}
+
+.grid .block-grid.three-up > li {
+ width: 33.33%;
+ padding: 0 12px 12px;
+}
+
+/* .block-grid.three-up>li:nth-child(3n+1) {clear: left;} */
+.grid .block-grid.four-up {
+ margin: 0 -10px;
+}
+
+.grid .block-grid.four-up > li {
+ width: 25%;
+ padding: 0 10px 10px;
+}
+
+/* .block-grid.four-up>li:nth-child(4n+1) {clear: left;} */
+.grid .block-grid.five-up {
+ margin: 0 -8px;
+}
+
+.grid .block-grid.five-up > li {
+ width: 20%;
+ padding: 0 8px 8px;
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.lcd.css b/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.lcd.css
new file mode 100644
index 00000000..4b04e139
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.lcd.css
@@ -0,0 +1,140 @@
+/*
+ * Language Category Display (LCD) consists of multiple sections:
+ * - one to display when there are no search results (which might display suggested languages)
+ * - one for each region of the world, plus regions for world languages and suggested languages
+ * The regions consist of one or more rows (blocks) which consist of one-to-four columns. Each
+ * column is an ul element, and contains up to 8 li elements, each containing a link.
+ */
+
+.uls-lcd {
+ background-color: #fcfcfc;
+ height: 20em;
+ /* Work around Chrome bug where it places scrollbar on the left in
+ * in RTL mode but actually reserves the place on the right side */
+ overflow-x: hidden;
+ overflow-y: auto;
+ width: auto;
+ padding: 0 16px;
+}
+
+.uls-lcd-region-title {
+ color: #555;
+ font-size: 1em;
+ padding-left: 28px;
+}
+
+.uls-lcd--no-quicklist [ data-region='all' ] .uls-lcd-region-title {
+ display: none;
+}
+
+.uls-lcd-region-section {
+ margin-top: 10px;
+}
+
+/*
+ * We need to have this as a grid row to push rest of the content below it, but resetting
+ * padding and margin so that calculating them for children is easier.
+ */
+.grid .uls-language-block.row {
+ padding: 0;
+ margin: 0;
+}
+
+.uls-language-block > ul {
+ /*
+ * We don't want any visible bullets in this list. Not by default anyway.
+ * Using very unspecific selector here to allow other classes to override.
+ * Bug because overflow: hidden is incompatible with bullets, also render
+ * the bullets inside the list in case there should be any.
+ */
+ list-style: none none;
+}
+
+/*
+ * Each block should have 16px padding on both sides. But because we already gave
+ * 16px for the whole menu, we need to remove it for first and last items the blocks.
+ */
+.grid .uls-language-block > ul {
+ margin: 0 0 20px 0;
+ padding: 0 16px;
+}
+
+.grid .uls-language-block > ul:first-child {
+ padding-left: 0;
+}
+
+.grid .uls-language-block > ul:last-child {
+ padding-right: 0;
+}
+
+.uls-language-block > ul > li {
+ margin-left: 20px;
+ padding: 0;
+ /*
+ * The directionality (ltr/rtl) for each list item is set dynamically
+ * as HTML attributes in JavaScript. Setting directionality also applies
+ * alignment, but a list with mixed alignment is hard to read.
+ * All items are therefore explicitly aligned to the left, including names
+ * of right-to-left languages in left-to-right environment and vice versa.
+ * As long as the directionality of the item is set correctly, the text
+ * is readable.
+ */
+ text-align: left;
+}
+
+.uls-language-block > ul > li:hover {
+ background-color: #eaeff7;
+}
+
+.uls-language-block a {
+ cursor: pointer;
+ text-decoration: none;
+ color: #36c;
+ font-size: 1em;
+ display: inline-block;
+ width: 100%;
+ overflow-x: hidden;
+ padding: 8px;
+ /*
+ * Some languages have long names for various reasons and we still want
+ * them to appear on one line.
+ * To make it work correctly, the directionality must be set correctly
+ * on the item level.
+ */
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+.uls-no-results-view {
+ display: none;
+}
+
+.uls-lcd.uls-no-results > .uls-lcd-region-section {
+ display: none;
+}
+
+.uls-lcd.uls-no-results > .uls-no-results-view {
+ display: block;
+}
+
+.uls-no-results-found-title {
+ font-size: 1.143em;
+ padding: 0 16px 0 28px;
+ margin: 20px 0;
+ border-bottom: 0;
+ color: #54595d;
+}
+
+.uls-no-found-more {
+ border-top: 1px solid #eaecf0;
+ color: #54595d;
+ padding: 12px 16px 12px 44px;
+ font-size: 0.9em;
+ width: 100%;
+ margin-top: 1.6em;
+ line-height: 1.6;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.mobile.css b/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.mobile.css
new file mode 100644
index 00000000..a7ae7d2b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.mobile.css
@@ -0,0 +1,307 @@
+/* stylelint-disable declaration-no-important */
+@media only screen and ( max-width: 767px ) {
+ .uls-mobile.uls-menu {
+ width: 95%;
+ left: 2.5%;
+ }
+
+ .uls-mobile .uls-language-list {
+ -webkit-overflow-scrolling: touch;
+ }
+
+ .uls-mobile .uls-language-block {
+ padding-left: 15px !important;
+ }
+
+ .uls-mobile .uls-language-block ul {
+ min-height: 14em;
+ }
+
+ .uls-mobile .uls-language-block a {
+ font-size: 1.143em;
+ line-height: 1.7em;
+ }
+
+ .uls-mobile .row {
+ width: auto;
+ min-width: 0;
+ margin-left: 0;
+ margin-right: 0;
+ }
+
+ .uls-mobile .column,
+ .uls-mobile .columns {
+ width: auto !important;
+ float: none;
+ }
+
+ .uls-mobile .column:last-child,
+ .uls-mobile .columns:last-child {
+ float: none;
+ }
+
+ .uls-mobile [ class*='column' ] + [ class*='column' ]:last-child {
+ float: none;
+ }
+
+ .uls-mobile .column:before,
+ .uls-mobile .uls-mobile .columns:before,
+ .uls-mobile .column:after,
+ .columns:after {
+ content: '';
+ display: table;
+ }
+
+ .uls-mobile .column:after,
+ .uls-mobile .columns:after {
+ clear: both;
+ }
+
+ .uls-mobile .offset-by-one,
+ .uls-mobile .offset-by-two,
+ .uls-mobile .offset-by-three,
+ .uls-mobile .offset-by-four,
+ .uls-mobile .offset-by-five,
+ .uls-mobile .offset-by-six,
+ .uls-mobile .offset-by-seven,
+ .uls-mobile .offset-by-eight,
+ .uls-mobile .offset-by-nine,
+ .uls-mobile .offset-by-ten {
+ margin-left: 0 !important;
+ }
+
+ .uls-mobile .push-two,
+ .uls-mobile .push-three,
+ .uls-mobile .push-four,
+ .uls-mobile .push-five,
+ .uls-mobile .push-six,
+ .uls-mobile .push-seven,
+ .uls-mobile .push-eight,
+ .uls-mobile .push-nine,
+ .uls-mobile .push-ten {
+ left: auto;
+ }
+
+ .uls-mobile .pull-two,
+ .uls-mobile .pull-three,
+ .uls-mobile .pull-four,
+ .uls-mobile .pull-five,
+ .uls-mobile .pull-six,
+ .uls-mobile .pull-seven,
+ .uls-mobile .pull-eight,
+ .uls-mobile .pull-nine,
+ .uls-mobile .pull-ten {
+ right: auto;
+ }
+
+ /* Mobile 4-column Grid */
+ .uls-mobile .row .mobile-one {
+ width: 25% !important;
+ float: left;
+ padding: 0 4px;
+ }
+
+ .uls-mobile .row .mobile-one:last-child {
+ float: right;
+ }
+
+ .uls-mobile .row.collapse .mobile-one {
+ padding: 0;
+ }
+
+ .uls-mobile .row .mobile-two {
+ width: 50% !important;
+ float: left;
+ padding: 0 4px;
+ }
+
+ .uls-mobile .row .mobile-two:last-child {
+ float: right;
+ }
+
+ .uls-mobile .row.collapse .mobile-two {
+ padding: 0;
+ }
+
+ .uls-mobile .row .mobile-three {
+ width: 75% !important;
+ float: left;
+ padding: 0 4px;
+ }
+
+ .uls-mobile .row .mobile-three:last-child {
+ float: right;
+ }
+
+ .uls-mobile .row.collapse .mobile-three {
+ padding: 0;
+ }
+
+ .uls-mobile .row .mobile-four {
+ width: 100% !important;
+ float: left;
+ padding: 0 4px;
+ }
+
+ .uls-mobile .row .mobile-four:last-child {
+ float: right;
+ }
+
+ .uls-mobile .row.collapse .mobile-four {
+ padding: 0;
+ }
+
+ .uls-mobile .push-one-mobile {
+ left: 25%;
+ }
+
+ .uls-mobile .pull-one-mobile {
+ right: 25%;
+ }
+
+ .uls-mobile .push-two-mobile {
+ left: 50%;
+ }
+
+ .uls-mobile .pull-two-mobile {
+ right: 50%;
+ }
+
+ .uls-mobile .push-three-mobile {
+ left: 75%;
+ }
+
+ .uls-mobile .pull-three-mobile {
+ right: 75%;
+ }
+}
+
+/* Visibility Classes ---------------------- */
+/* Standard (large) display targeting */
+.uls-mobile .show-for-small,
+.uls-mobile .show-for-medium,
+.uls-mobile .show-for-medium-down,
+.uls-mobile .hide-for-large,
+.uls-mobile .hide-for-large-up,
+.uls-mobile .show-for-xlarge {
+ display: none !important;
+}
+
+.uls-mobile .hide-for-xlarge,
+.uls-mobile .show-for-large,
+.uls-mobile .show-for-large-up,
+.uls-mobile .hide-for-small,
+.uls-mobile .hide-for-medium,
+.uls-mobile .hide-for-medium-down {
+ display: block !important;
+}
+
+/* Very large display targeting */
+@media only screen and ( min-width: 1441px ) {
+ .uls-mobile .hide-for-small,
+ .uls-mobile .hide-for-medium,
+ .uls-mobile .hide-for-medium-down,
+ .hide-for-large,
+ .show-for-large-up,
+ .show-for-xlarge {
+ display: block !important;
+ }
+
+ .show-for-small,
+ .uls-mobile .show-for-medium,
+ .uls-mobile .show-for-medium-down,
+ .uls-mobile .show-for-large,
+ .uls-mobile .hide-for-large-up,
+ .uls-mobile .hide-for-xlarge {
+ display: none !important;
+ }
+}
+
+/* Medium display targeting */
+@media only screen and ( max-width: 1279px ) and ( min-width: 768px ) {
+ .uls-mobile .hide-for-small,
+ .uls-mobile .show-for-medium,
+ .uls-mobile .show-for-medium-down,
+ .uls-mobile .hide-for-large,
+ .uls-mobile .hide-for-large-up,
+ .uls-mobile .hide-for-xlarge {
+ display: block !important;
+ }
+
+ .uls-mobile .show-for-small,
+ .uls-mobile .hide-for-medium,
+ .uls-mobile .hide-for-medium-down,
+ .uls-mobile .show-for-large,
+ .uls-mobile .show-for-large-up,
+ .uls-mobile .show-for-xlarge {
+ display: none !important;
+ }
+}
+
+/* Small display targeting */
+@media only screen and ( max-width: 767px ) {
+ .uls-mobile .show-for-small,
+ .uls-mobile .hide-for-medium,
+ .uls-mobile .show-for-medium-down,
+ .uls-mobile .hide-for-large,
+ .uls-mobile .hide-for-large-up,
+ .uls-mobile .hide-for-xlarge {
+ display: block !important;
+ }
+
+ .uls-mobile .hide-for-small,
+ .uls-mobile .show-for-medium,
+ .uls-mobile .hide-for-medium-down,
+ .uls-mobile .show-for-large,
+ .uls-mobile .show-for-large-up,
+ .uls-mobile .show-for-xlarge {
+ display: none !important;
+ }
+}
+
+/* Orientation targeting */
+.uls-mobile .show-for-landscape,
+.uls-mobile .hide-for-portrait {
+ display: block !important;
+}
+
+.uls-mobile .hide-for-landscape,
+.uls-mobile .show-for-portrait {
+ display: none !important;
+}
+
+@media screen and ( orientation: landscape ) {
+ .uls-mobile .show-for-landscape,
+ .uls-mobile .hide-for-portrait {
+ display: block !important;
+ }
+
+ .uls-mobile .hide-for-landscape,
+ .uls-mobile .show-for-portrait {
+ display: none !important;
+ }
+}
+
+@media screen and ( orientation: portrait ) {
+ .uls-mobile .show-for-portrait,
+ .uls-mobile .hide-for-landscape {
+ display: block !important;
+ }
+
+ .uls-mobile .hide-for-portrait,
+ .uls-mobile .show-for-landscape {
+ display: none !important;
+ }
+}
+
+/* Touch-enabled device targeting */
+.uls-mobile .show-for-touch,
+.uls-mobile .touch .hide-for-touch {
+ display: none !important;
+}
+
+/* stylelint-disable-next-line no-descending-specificity */
+.uls-mobile .hide-for-touch,
+.uls-mobile .touch .show-for-touch {
+ display: block !important;
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/aeb-latn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/aeb-latn.json
new file mode 100644
index 00000000..2cc8d7cf
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/aeb-latn.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Csisc"
+ ]
+ },
+ "uls-region-WW": "Ģālemīye",
+ "uls-region-SP": "Spēsyāl",
+ "uls-region-AM": "Emerīke",
+ "uls-region-AF": "Ifrīqye",
+ "uls-region-EU": "Ūrūppe",
+ "uls-region-AS": "Ēsye",
+ "uls-region-ME": "Ic-carq il-awsaţ",
+ "uls-region-PA": "Il-Mūḩīţ il-hēdī",
+ "uls-no-results-found": "Mē fammēc ḩattā rēzülta",
+ "uls-common-languages": "Lūğāt muntacra",
+ "uls-no-results-suggestion-title": "Tnejjim tkūn muhtam b-:",
+ "uls-search-help": "Tnejjim tlawwij ḩasb ism il-lūğa, ism il-kod, il-kod ISO mtēģ il-lūğa w illē ḩasb ij-jīhe",
+ "uls-search-placeholder": "Lawwij ģlā il-lūğa"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/af.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/af.json
new file mode 100644
index 00000000..39cf2954
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/af.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Biggs ZA",
+ "Fwolff",
+ "Joris Darlington Quarshie",
+ "Naudefj",
+ "Puvircho"
+ ]
+ },
+ "uls-region-WW": "Wêreldwyd",
+ "uls-region-SP": "Spesiaal",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asië",
+ "uls-region-ME": "Midde-Ooste",
+ "uls-region-PA": "Stille Oseaan",
+ "uls-region-all": "Alle tale",
+ "uls-no-results-found": "Geen resultate gevind nie",
+ "uls-common-languages": "Voorgestelde tale",
+ "uls-no-results-suggestion-title": "U mag geïnteresseerd wees in:",
+ "uls-search-help": "Soek gerus volgens taalnaam, skrifnaam of ISO-kode, of blaai volgens streek.",
+ "uls-search-placeholder": "Soek na ’n taal"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/am.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/am.json
new file mode 100644
index 00000000..521185a8
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/am.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Andemta",
+ "Elfalem"
+ ]
+ },
+ "uls-region-WW": "ዓለም አቀፍ",
+ "uls-region-SP": "ልዩ",
+ "uls-region-AM": "አሜሪካ",
+ "uls-region-AF": "አፍሪካ",
+ "uls-region-EU": "አውሮጳ",
+ "uls-region-AS": "እስያ",
+ "uls-region-ME": "መካከለኛው ምሥራቅ",
+ "uls-region-PA": "ፓሲፊክ",
+ "uls-region-all": "ሁሉ ቋንቋ",
+ "uls-no-results-found": "ውጤት አልተገኘም",
+ "uls-common-languages": "ተመራጭ ቋንቋዎች",
+ "uls-no-results-suggestion-title": "ይህ ሊመስጦት ይችላል:",
+ "uls-search-help": "በቋንቋ ስም፣ የአፃፃፍ ሥርዓት ስም፣ አይ.ኤስ.ኦ. (ISO) ኮድ መፈለግ ወይም በአካባቢ መቃኘት ይቻላል::",
+ "uls-search-placeholder": "ቋንቋ ለመፈለግ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/anp.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/anp.json
new file mode 100644
index 00000000..95d5ee5d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/anp.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Angpradesh"
+ ]
+ },
+ "uls-region-WW": "वैश्विक",
+ "uls-region-SP": "खास",
+ "uls-region-AM": "अमरीका",
+ "uls-region-AF": "अफ़्रीका",
+ "uls-region-EU": "यूरोप",
+ "uls-region-AS": "एशिया",
+ "uls-region-ME": "मध्य पूर्व",
+ "uls-region-PA": "प्रशांत",
+ "uls-region-all": "सब्भे भाषा",
+ "uls-no-results-found": "कोय परिणाम नै मिललै",
+ "uls-common-languages": "आम भाषा सिनी",
+ "uls-no-results-suggestion-title": "आपन॑ लेली संभवतः उपयोगी:",
+ "uls-search-help": "आपन॑ भाषा केरऽ नाम , स्क्रिप्ट केरऽ नाम , भाषा केरऽ आईएसओ कोड सं॑ खोज॑ सकै छहो या आपन॑ क्षेत्र के नाम सं॑ ब्राउज़ कर॑ सकै छहऽ.",
+ "uls-search-placeholder": "भाषा लेली खोजऽ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ar.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ar.json
new file mode 100644
index 00000000..2dedf2bd
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ar.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "DRIHEM",
+ "Hhaboh162002",
+ "Meno25",
+ "ترجمان05",
+ "ديفيد"
+ ]
+ },
+ "uls-region-WW": "في جميع أنحاء العالم",
+ "uls-region-SP": "الخاصة",
+ "uls-region-AM": "أمريكا",
+ "uls-region-AF": "أفريقيا",
+ "uls-region-EU": "أوروبا",
+ "uls-region-AS": "آسيا",
+ "uls-region-ME": "الشرق الأوسط",
+ "uls-region-PA": "المحيط الهادئ",
+ "uls-region-all": "جميع اللغات",
+ "uls-no-results-found": "لم يتم العثور على نتائج",
+ "uls-common-languages": "اللغات المقترحة",
+ "uls-no-results-suggestion-title": "قد تكون مهتما بما يلي:",
+ "uls-search-help": "يمكنك البحث مستخدما اسم اللغة، أو اسم السكريبت، أو رمز اللغة القياسي أو يمكنك التصفح حسب المنطقة.",
+ "uls-search-placeholder": "بحث عن لغة"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/arn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/arn.json
new file mode 100644
index 00000000..7054370e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/arn.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Manke ruLpa"
+ ]
+ },
+ "uls-region-WW": "Monkü Mapu",
+ "uls-region-SP": "Kiñen",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Ewropa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Ragi Puel",
+ "uls-region-PA": "Pasifiko",
+ "uls-region-all": "Kom zungun",
+ "uls-no-results-found": "Pengelay tami kintun",
+ "uls-common-languages": "Pünefal zungun",
+ "uls-no-results-suggestion-title": "Pepi zuamkeafuymi:",
+ "uls-search-help": "Pepi kintuaymi zungun ñi uy, wirin ñi azkülen, ISO zungu, kam chew ñi mülemum",
+ "uls-search-placeholder": "Kintun kiñe zungun"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/arz.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/arz.json
new file mode 100644
index 00000000..f7655221
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/arz.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Meno25",
+ "UpDownUp"
+ ]
+ },
+ "uls-region-WW": "لغات عالمية",
+ "uls-region-SP": "لغات خاصّة",
+ "uls-region-AM": "أمريكا",
+ "uls-region-AF": "إفريقيا",
+ "uls-region-EU": "أوروپّا",
+ "uls-region-AS": "آسيا",
+ "uls-region-ME": "الشرق الأوسط",
+ "uls-region-PA": "المحيط الهادي",
+ "uls-region-all": "كل اللغات",
+ "uls-no-results-found": "مفيش أي نتايج",
+ "uls-common-languages": "اللغات المقترحة",
+ "uls-no-results-suggestion-title": "يمكن تكون مهتم بـ:",
+ "uls-search-help": "ممكن تدور حسب اسم اللغه، اسم نظام الكتابه\\الخط، كود الـ ISO بتاع اللغه أو ممكن تتصفح حسب المنطقه.",
+ "uls-search-placeholder": "دوّر على لغة"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/as.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/as.json
new file mode 100644
index 00000000..4a30d6b9
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/as.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dibya Dutta",
+ "Mohsin Ali",
+ "Nilamdyuti"
+ ]
+ },
+ "uls-region-WW": "বিশ্বব্যাপী",
+ "uls-region-SP": "বিশেষ",
+ "uls-region-AM": "আমেৰিকা",
+ "uls-region-AF": "আফ্ৰিকা",
+ "uls-region-EU": "ইউৰোপ",
+ "uls-region-AS": "এছিয়া",
+ "uls-region-ME": "মধ্যপ্রাচ্য",
+ "uls-region-PA": "পেচিফিক",
+ "uls-region-all": "সকলো ভাষা",
+ "uls-no-results-found": "কোনো ফলাফল পোৱা নগ'ল",
+ "uls-common-languages": "পৰামৰ্শমূলক ভাষাসমূহ",
+ "uls-no-results-suggestion-title": "আপুনি আগ্ৰহী হ'ব পাৰে:",
+ "uls-search-help": "আপুনি ভাষাৰ নাম, লিপিৰ নাম, ভাষাৰ ISO ক'ড সাপেক্ষে সন্ধান কৰিব পাৰে অথবা অঞ্চল সাপেক্ষে ব্ৰাউজ কৰিব পাৰে।",
+ "uls-search-placeholder": "ভাষা এটাৰ সন্ধান কৰক"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ast.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ast.json
new file mode 100644
index 00000000..951de3d3
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ast.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Xuacu"
+ ]
+ },
+ "uls-region-WW": "Mundial",
+ "uls-region-SP": "Especiales",
+ "uls-region-AM": "América",
+ "uls-region-AF": "África",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Oriente mediu",
+ "uls-region-PA": "Pacíficu",
+ "uls-region-all": "Toles llingües",
+ "uls-no-results-found": "Nun s'alcontraron resultaos",
+ "uls-common-languages": "Llingües suxeríes",
+ "uls-no-results-suggestion-title": "Seique t'interese:",
+ "uls-search-help": "Pues buscar pol nome de la llingua, nome del alfabetu, códigu ISO de la llingua o ver un área xeográfica.",
+ "uls-search-placeholder": "Buscar una llingua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/av.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/av.json
new file mode 100644
index 00000000..80e49b0d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/av.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gazimagomedov"
+ ]
+ },
+ "uls-region-WW": "ГӀаламиял",
+ "uls-region-SP": "Хассал",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "АскӀосаб Магъриб",
+ "uls-region-PA": "Океания",
+ "uls-no-results-found": "Щибниги жо батинчӀо",
+ "uls-common-languages": "Жалго жедедаго рищарал мацӀал",
+ "uls-no-results-suggestion-title": "Дур интерес гьал мацӀазда ккезе батила:",
+ "uls-search-help": "МацӀалъул яги хъвай-хъваялъул цӀаразда рекъон цӀехезе бегьула, яги мацӀалъул ISO-кодалда рекъон. Гьединго бегьула регион бищун балагьизе:",
+ "uls-search-placeholder": "МацӀ цӀехей"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/awa.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/awa.json
new file mode 100644
index 00000000..4498d3dd
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/awa.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "1AnuraagPandey",
+ "1PandeyAnurag",
+ "Ajeetsinghawadh",
+ "Ajeetsinghawadhi"
+ ]
+ },
+ "uls-region-WW": "दुनिया भर कय",
+ "uls-region-SP": "खास",
+ "uls-region-AM": "अमेरिका",
+ "uls-region-AF": "अफ्रीका",
+ "uls-region-EU": "यूरोप",
+ "uls-region-AS": "एसिया",
+ "uls-region-ME": "मध्य पुरुब",
+ "uls-region-PA": "प्रसांत",
+ "uls-region-all": "सगरौ भासा",
+ "uls-no-results-found": "कवनो नतीजा नाय मिला",
+ "uls-common-languages": "सुझाई गय भासा",
+ "uls-no-results-suggestion-title": "आपकय दिलचस्पी होय सकत है:",
+ "uls-search-help": "आप भाषा कय नाँव,लिपि कय नाँव,भाषा कय आई.एस.ओ कोड अव क्षेत्र कय नाँव से हेर सका जात अहै ।",
+ "uls-search-placeholder": "भाषा खोज"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/az.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/az.json
new file mode 100644
index 00000000..74b606ce
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/az.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "AZISS",
+ "Khan27",
+ "Wertuose",
+ "Şeyx Şamil"
+ ]
+ },
+ "uls-region-WW": "Dünya üzrə",
+ "uls-region-SP": "Xüsusi",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Avropa",
+ "uls-region-AS": "Asiya",
+ "uls-region-ME": "Yaxın Şərq",
+ "uls-region-PA": "Okeaniya",
+ "uls-region-all": "Bütün dillər",
+ "uls-no-results-found": "Nəticələr tapılmadı",
+ "uls-common-languages": "Təklif edilən dillər",
+ "uls-no-results-suggestion-title": "Sizin üçün maraqlı ola bilər:",
+ "uls-search-help": "Siz dilin adı, yazısı və ISO-kodu üzrə və ya region üzrə axtarış edə bilərsiz.",
+ "uls-search-placeholder": "Dili axtar"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/azb.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/azb.json
new file mode 100644
index 00000000..81b1a146
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/azb.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Alp Er Tunqa",
+ "Arjanizary",
+ "Mousa"
+ ]
+ },
+ "uls-region-WW": "دونیا بویو",
+ "uls-region-SP": "مخصوص",
+ "uls-region-AM": "آمریکا",
+ "uls-region-AF": "آفریقا",
+ "uls-region-EU": "اوروپا",
+ "uls-region-AS": "آسیا",
+ "uls-region-ME": "اورتادوغو",
+ "uls-region-PA": "بؤیوک اوقیانوس",
+ "uls-region-all": "بۆتون دیللر",
+ "uls-no-results-found": "هئچ نتیجه تاپیلمادی",
+ "uls-common-languages": "یایغین دیل‌لر",
+ "uls-no-results-suggestion-title": "بونلارا ماراقلی اولابیلرسینیز:",
+ "uls-search-help": "سیز دیل آدی، یازی آدی، دیلین ISO کودو، یوخسا بؤلگه ایله آختارا بیلرسینیز.",
+ "uls-search-placeholder": "بیر دیلی آختار"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ba.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ba.json
new file mode 100644
index 00000000..3fdae721
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ba.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Sagan",
+ "Ләйсән"
+ ]
+ },
+ "uls-region-WW": "Бөтә донъя",
+ "uls-region-SP": "Махсус",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Яҡын Көнсығыш",
+ "uls-region-PA": "Океания",
+ "uls-region-all": "Бөтә телдәр",
+ "uls-no-results-found": "Бер нимә лә табылманы",
+ "uls-common-languages": "Тәҡдим ителгән телдәр",
+ "uls-no-results-suggestion-title": "Бәлки, ошо телдәрҙе һайларһығыҙ:",
+ "uls-search-help": "Телдең исеме, яҙмаһы, ISO коды йәки регионы буйынса эҙләй алаһығыҙ.",
+ "uls-search-placeholder": "Тел буйынса эҙләү"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ban-bali.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ban-bali.json
new file mode 100644
index 00000000..942c2990
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ban-bali.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Carma Citrawati"
+ ]
+ },
+ "uls-region-WW": "ᬕᬸᬫᬶᬫᬓᭂᬚᬂ᭟",
+ "uls-region-SP": "ᬧᬶᬦᬶᬄᬮᬶᬬᬦ᭄᭞",
+ "uls-region-AM": "ᬅᬫᭂᬭᬶᬓ᭟",
+ "uls-region-AF": "ᬅᬧ᭄ᬭᬶᬓ᭟",
+ "uls-region-EU": "ᬏᬭᭀᬧ᭟",
+ "uls-region-AS": "ᬅᬲᬶᬬ",
+ "uls-region-ME": "ᬢᬶᬫᬸᬄᬢᭂᬗᬄ",
+ "uls-region-PA": "ᬧᬲᬶᬧᬶᬓ᭄",
+ "uls-region-all": "ᬪᬱᬫᬓᭂᬚᬂ",
+ "uls-no-results-found": "ᬢᬸᬲᬶᬂᬳᬤᬳᬲᬶᬮ᭄",
+ "uls-common-languages": "ᬪᬱᬲᬦᬾᬫᬧᬳᬶᬓᭂᬢᬦ᭄᭞",
+ "uls-no-results-suggestion-title": "ᬳᬶᬤᬤᬦᬾᬫᬶᬦᬩ᭄ᬲᭂᬦᭂᬂᬭᬶᬂ᭝",
+ "uls-search-help": "ᬳᬶᬤᬤᬦᬾᬤᬤᭀᬲ᭄‌ᬗᬺᬋᬄᬳᬦ᭄ᬢᬸᬓ᭄ᬯᬱ᭄ᬝᬦ᭄ᬪᬱ᭞ᬯᬱ᭄ᬝᬦ᭄ᬲ᭄ᬓ᭄ᬭᬶᬧ᭄᭞ᬓᭀᬤᭂᬪᬲ᭞ᬇᬲᭀ᭞ᬳᬸᬢᬯᬶᬬᬶᬳᬶᬤᬤᬦᬾᬧ᭄ᬭᬲᬶᬤᬗᬺᬋᬄᬳᬦ᭄ᬢᬸᬓ᭄ᬯᬯᬶᬤᬗᬦ᭄ᬕᭂᬦᬄᬳᬶᬤᬤᬦᬾᬫᬗ᭄ᬓᬶᬦ᭄᭞",
+ "uls-search-placeholder": "ᬪᬱᬲᬦᬾᬓᬋᬋᬄ᭞"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ban.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ban.json
new file mode 100644
index 00000000..1ca07673
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ban.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chinamoonroll",
+ "Joseagush"
+ ]
+ },
+ "uls-region-WW": "Gumi makejang",
+ "uls-region-SP": "Rahina",
+ "uls-region-AM": "Amérika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Éropa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Timur Tengah",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Basa makejang",
+ "uls-no-results-found": "Tusing ade hasil",
+ "uls-common-languages": "Basa sane mapiteket",
+ "uls-no-results-suggestion-title": "Ida dane dumadak rimang:",
+ "uls-search-help": "Ida dane dados ngerereh anggen adan basa, adan script, kode basa ISO, utawi ida dane dados ngalih anggen wewengkon.",
+ "uls-search-placeholder": "Basa sane kererehin"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/bbc-latn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/bbc-latn.json
new file mode 100644
index 00000000..fb279b79
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/bbc-latn.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Stephensuleeman"
+ ]
+ },
+ "uls-region-WW": "Sude luat portibi on",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Eropa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Timur Tengah",
+ "uls-region-PA": "Pasifik",
+ "uls-no-results-found": "Ndang adong jumpang",
+ "uls-common-languages": "Hata na somal",
+ "uls-search-placeholder": "Mandiori hata"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/bcc.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/bcc.json
new file mode 100644
index 00000000..a8ac2344
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/bcc.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Baloch Afghanistan",
+ "Sultanselim baloch"
+ ]
+ },
+ "uls-region-WW": "بی سراسری دونیا",
+ "uls-region-SP": "ویژه",
+ "uls-region-AM": "آمریکا",
+ "uls-region-AF": "آفریقا",
+ "uls-region-EU": "اروپا",
+ "uls-region-AS": "آسیا",
+ "uls-region-ME": "خاورمیانه",
+ "uls-region-PA": "اقیانوس آرام",
+ "uls-no-results-found": "نتیجه‌ای یافت نشد",
+ "uls-common-languages": "زبان‌های رایج",
+ "uls-no-results-suggestion-title": "ممکن است علاقه‌مند باشید:",
+ "uls-search-help": "شما می‌توانید بر پایه نام زبان، نام اسکریپت، کد استاندارد زبان یا بر پایه منطقه جستجو کنید:",
+ "uls-search-placeholder": "زبانء شۏھاز"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/bci.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/bci.json
new file mode 100644
index 00000000..8a6e0c28
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/bci.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kjeanclaude"
+ ]
+ },
+ "uls-region-WW": "Mein oumouan noun",
+ "uls-region-SP": "Ngounmin liké",
+ "uls-region-AM": "Amériki",
+ "uls-region-AF": "Afriki",
+ "uls-region-EU": "Abloki",
+ "uls-region-AS": "Azi",
+ "uls-region-ME": "Wia afiliè lô mein i atôliè",
+ "uls-region-PA": "Pacifiki",
+ "uls-region-all": "Anien mou bé ngba",
+ "uls-no-results-found": "Ya woun man liké fi",
+ "uls-common-languages": "Anien nga bé fa klé mou",
+ "uls-no-results-suggestion-title": "Amoun kwla klo",
+ "uls-search-help": "Amoun kwla kounndè i anien douman sou, klèlè douman sou, anien ISO codi sou, anzè amoun kwla kounndè i akpassoua sou.",
+ "uls-search-placeholder": "Kounndè anien koun"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/bcl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/bcl.json
new file mode 100644
index 00000000..43466c94
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/bcl.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Brazal.dang",
+ "Geopoet"
+ ]
+ },
+ "uls-region-WW": "Pankinaban",
+ "uls-region-SP": "Espesyal",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Aprika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asya",
+ "uls-region-ME": "Katahawang Sirangan",
+ "uls-region-PA": "Pasipiko",
+ "uls-region-all": "Gabos na lengguwahe",
+ "uls-no-results-found": "Mayong mga resultang nanumpungan",
+ "uls-common-languages": "Komun na mga lengguwahe",
+ "uls-no-results-suggestion-title": "Ika gayod interesado sa:",
+ "uls-search-help": "Ika makakahanap sa pangaran nin lengguwahe, pangaran nin eskrip, ISO kodigo nin lengguwahe o kaya ika makakabuklat sa paagi nin rehiyon.",
+ "uls-search-placeholder": "Maghanap nin lengguwahe"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/be-tarask.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/be-tarask.json
new file mode 100644
index 00000000..e29cb1b1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/be-tarask.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Red Winged Duck",
+ "Wizardist"
+ ]
+ },
+ "uls-region-WW": "Сусьветныя",
+ "uls-region-SP": "Дадатковыя",
+ "uls-region-AM": "Амэрыка",
+ "uls-region-AF": "Афрыка",
+ "uls-region-EU": "Эўропа",
+ "uls-region-AS": "Азія",
+ "uls-region-ME": "Блізкі Ўсход",
+ "uls-region-PA": "Акіянія",
+ "uls-region-all": "Усе мовы",
+ "uls-no-results-found": "Нічога ня знойдзена",
+ "uls-common-languages": "Прапанаваныя мовы",
+ "uls-no-results-suggestion-title": "Магчыма, вас зацікавяць:",
+ "uls-search-help": "Вы можаце шукаць паводле назвы мовы ці пісьменнасьці, а таксама паводле ISO-коду мовы, або выбраць рэгіён.",
+ "uls-search-placeholder": "Пошук мовы"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/be.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/be.json
new file mode 100644
index 00000000..768d362e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/be.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Unomano"
+ ]
+ },
+ "uls-region-WW": "Па ўсім свеце",
+ "uls-region-SP": "Спецыяльныя",
+ "uls-region-AM": "Амерыка",
+ "uls-region-AF": "Афрыка",
+ "uls-region-EU": "Еўропа",
+ "uls-region-AS": "Азія",
+ "uls-region-ME": "Блізкі Ўсход",
+ "uls-region-PA": "Ціхі акіян",
+ "uls-region-all": "Усе мовы",
+ "uls-no-results-found": "Нічога не знойдзена",
+ "uls-common-languages": "Прапанаваныя мовы",
+ "uls-no-results-suggestion-title": "Вы можаце быць зацікаўлены ў:",
+ "uls-search-help": "Вы можаце шукаць па мове, назве сцэнара, ISO-коду мовы, або вы можаце праглядаць па рэгіенах.",
+ "uls-search-placeholder": "Пошук мовы"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/bg.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/bg.json
new file mode 100644
index 00000000..efaa4d76
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/bg.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Aquilax",
+ "DCLXVI",
+ "StanProg",
+ "Vodnokon4e"
+ ]
+ },
+ "uls-region-WW": "Световни",
+ "uls-region-SP": "Специални",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Близкия изток",
+ "uls-region-PA": "Тихия океан",
+ "uls-region-all": "Всички езици",
+ "uls-no-results-found": "Не бяха открити резултати",
+ "uls-common-languages": "Предложени езици",
+ "uls-no-results-suggestion-title": "Може би се интересувате от:",
+ "uls-search-help": "Можете да търсите по име на език, име на скрипт, ISO кода на език или да разглеждате по региони.",
+ "uls-search-placeholder": "Търсене на език"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/bgn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/bgn.json
new file mode 100644
index 00000000..5c3939dc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/bgn.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Baloch Afghanistan",
+ "Ibrahim khashrowdi"
+ ]
+ },
+ "uls-region-WW": "بی موچین دونیایی تا",
+ "uls-region-SP": "خاص",
+ "uls-region-AM": "آمریکا",
+ "uls-region-AF": "آفریقا",
+ "uls-region-EU": "اروپا",
+ "uls-region-AS": "آسیا",
+ "uls-region-ME": "خاورمیانه",
+ "uls-region-PA": "اقیانوس آرام",
+ "uls-region-all": "موچین زبانان",
+ "uls-no-results-found": "هیچ نتیجه ودئ نبوت",
+ "uls-common-languages": "پیشنهاد بوته‌این زبانان",
+ "uls-no-results-suggestion-title": "ممکن اینت علاقه‌مند بئیت:",
+ "uls-search-help": "شما ئه توانیت به زبانی نامئ اساسا، نامئ اسکریپت، زبانئ استاندارتین کود یا به منطقه‌ای اساسا بگردیت.",
+ "uls-search-placeholder": "گَشتین په یک زبانئ خاتیرا"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/blk.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/blk.json
new file mode 100644
index 00000000..7d637d98
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/blk.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Khun Kt",
+ "咽頭べさ"
+ ]
+ },
+ "uls-region-WW": "တကမ္ဘာႏလွုမ်း",
+ "uls-region-SP": "အထူꩻ",
+ "uls-region-AM": "အမေႏရိက",
+ "uls-region-AF": "အာဖရိက",
+ "uls-region-EU": "ဥရောပ",
+ "uls-region-AS": "အာသျ",
+ "uls-region-ME": "အခဝ်ကွဉ်ႏထာႏဝ",
+ "uls-region-PA": "ပသိဖိတ်",
+ "uls-region-all": "ဘာႏသာႏငဝ်းငွါဖုံႏ ကားကအဝ်ႏ",
+ "uls-no-results-found": "လꩻလဒ်မုဲင်ꩻမုဲင်ꩻတဲ့ တမော့ꩻတဝ်း",
+ "uls-common-languages": "ဖေႏကျံႏညဏ်ႏဒါႏ ဘာႏသာႏငဝ်းငွါဖုံႏ",
+ "uls-no-results-suggestion-title": "နာꩻသꩻဝင်ႏစာႏနွောင်ꩻဒါႏနဝ်ꩻ:",
+ "uls-search-help": "ထိုမ်ႏထွားနွောင်ꩻဒျာႏ တောမ်ႏဘာႏသာႏငဝ်းငွါမိဉ်ꩻ၊ အက္ခရာႏမိဉ်ꩻ၊ ဘာႏသာႏငဝ်းငွါ ISO ကိုဒ် မွေးတဝ်းလဲ့ ထိုမ်ႏထွားနွောင်ꩻဒျာႏ ဒေႏသအလွောက်ꩻသွူ။",
+ "uls-search-placeholder": "ထိုမ်ႏထွားဘာႏသာႏငဝ်းငွါတဗာႏအတာႏ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/bn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/bn.json
new file mode 100644
index 00000000..d5b65693
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/bn.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aftabuzzaman",
+ "Bellayet",
+ "Nasir8891",
+ "Sankarshan",
+ "Sayak Sarkar",
+ "আফতাবুজ্জামান"
+ ]
+ },
+ "uls-region-WW": "বিশ্বব্যাপী",
+ "uls-region-SP": "বিশেষ",
+ "uls-region-AM": "আমেরিকা",
+ "uls-region-AF": "আফ্রিকা",
+ "uls-region-EU": "ইউরোপ",
+ "uls-region-AS": "এশিয়া",
+ "uls-region-ME": "মধ্যপ্রাচ্য",
+ "uls-region-PA": "প্রশান্ত মহাসাগরীয়",
+ "uls-region-all": "সকল ভাষা",
+ "uls-no-results-found": "কোনও ফলাফল পাওয়া যায়নি",
+ "uls-common-languages": "প্রস্তাবিত ভাষাসমূহ",
+ "uls-no-results-suggestion-title": "আপনি হয়তো এগুলিতে আগ্রহী হতে পারেন:",
+ "uls-search-help": "আপনি ভাষার নাম, লিপির নাম, ভাষার আইএসও কোড দিয়ে অনুসন্ধান করতে পারেন অথবা আপনি অঞ্চল অনুযায়ী ব্রাউজ করতে পারেন।",
+ "uls-search-placeholder": "ভাষা অনুসন্ধান করুন"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/br.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/br.json
new file mode 100644
index 00000000..fb89a663
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/br.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fulup",
+ "Gwenn-Ael"
+ ]
+ },
+ "uls-region-WW": "Bed a-bezh",
+ "uls-region-SP": "Dibar",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azia",
+ "uls-region-ME": "Reter-Kreiz",
+ "uls-region-PA": "Habask",
+ "uls-region-all": "An holl yezhoù",
+ "uls-no-results-found": "N'eus bet kavet disoc'h ebet",
+ "uls-common-languages": "Yezhoù aliet",
+ "uls-no-results-suggestion-title": "Gallout a reot bezañ dedennet gant :",
+ "uls-search-help": "Gallout a reot klask dre anv yezh, anv skript, kod yezh ISO pe gallout a reot klask dre rannvro.",
+ "uls-search-placeholder": "Klask ur yezh"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/bs.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/bs.json
new file mode 100644
index 00000000..9a0f152b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/bs.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "DzWiki",
+ "Edinwiki",
+ "Srdjan m",
+ "Srđan"
+ ]
+ },
+ "uls-region-WW": "Svjetski",
+ "uls-region-SP": "Posebno",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Evropa",
+ "uls-region-AS": "Azija",
+ "uls-region-ME": "Bliski istok",
+ "uls-region-PA": "Pacifik",
+ "uls-region-all": "Svi jezici",
+ "uls-no-results-found": "Nema pronađenih rezultata",
+ "uls-common-languages": "Predloženi jezici",
+ "uls-no-results-suggestion-title": "Možda vas interesuje:",
+ "uls-search-help": "Možete da tražite po imenu jezika ili pisma, po ISO kodu jezika ili po regionu.",
+ "uls-search-placeholder": "Pronađi jezik"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/bto.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/bto.json
new file mode 100644
index 00000000..a3364d27
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/bto.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Filipinayzd"
+ ]
+ },
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Aprika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asya",
+ "uls-region-PA": "Pasipiko",
+ "uls-no-results-found": "Uda naturakan na resulta"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ca.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ca.json
new file mode 100644
index 00000000..08d14471
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ca.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Pginer",
+ "Ssola",
+ "Toniher"
+ ]
+ },
+ "uls-region-WW": "Mundial",
+ "uls-region-SP": "Especials",
+ "uls-region-AM": "Amèrica",
+ "uls-region-AF": "Àfrica",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Àsia",
+ "uls-region-ME": "Orient mitjà",
+ "uls-region-PA": "Pacífic",
+ "uls-region-all": "Totes les llengües",
+ "uls-no-results-found": "Cap resultat",
+ "uls-common-languages": "Llengües suggerides",
+ "uls-no-results-suggestion-title": "Pot interessar-vos:",
+ "uls-search-help": "Podeu cercar per nom de llengua, nom d'alfabet, codi ISO de la llengua o podeu navegar per regió:",
+ "uls-search-placeholder": "Cerca una llengua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ce.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ce.json
new file mode 100644
index 00000000..7c366a4b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ce.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Умар"
+ ]
+ },
+ "uls-region-WW": "Дерригдуьненан",
+ "uls-region-SP": "Леррина",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Ази",
+ "uls-region-ME": "Гергара Малхбале",
+ "uls-region-PA": "Океани",
+ "uls-region-all": "Берриге меттанаш",
+ "uls-no-results-found": "Цакарийна",
+ "uls-common-languages": "Ша дӀанисбелла меттанаш",
+ "uls-no-results-suggestion-title": "Хьуна хӀара меттанаш хьашта хила мега:",
+ "uls-search-help": "Хьа таро йу меттан йа йозанан цӀарца лаха, меттан ISO-кодаца йа регионаца хьажа.",
+ "uls-search-placeholder": "Лаха мотт"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ckb.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ckb.json
new file mode 100644
index 00000000..1e4ab6d0
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ckb.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Asoxor",
+ "Calak",
+ "Halbast",
+ "Lost Whispers",
+ "Épine"
+ ]
+ },
+ "uls-region-WW": "لە گشت جیھاندا",
+ "uls-region-SP": "تایبەت",
+ "uls-region-AM": "ئەمریکا",
+ "uls-region-AF": "ئەفریقا",
+ "uls-region-EU": "ئەورووپا",
+ "uls-region-AS": "ئاسیا",
+ "uls-region-ME": "ڕۆژھەڵاتی ناوین",
+ "uls-region-PA": "زەریای ئارام",
+ "uls-region-all": "ھەموو زمانەکان",
+ "uls-no-results-found": "ھیچ ئاکامێک نەدۆزرایەوە",
+ "uls-common-languages": "زمانە پێشنیارکراوەکان",
+ "uls-no-results-suggestion-title": "ڕەنگە ئەمانەت بەدڵ بێت:",
+ "uls-search-help": "دەتوانیت بەپێی ناوی زمان، ناوی نووسراو، کۆدی ڕێکخراوەی جیھانیی ستانداردی زمان یان بە پێی ناوچە بگەڕێیت.",
+ "uls-search-placeholder": "گەڕان بەدوای زمانێکدا"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/cop.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/cop.json
new file mode 100644
index 00000000..6a61f48c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/cop.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bloomaround",
+ "ⲁϩⲙⲉⲧ"
+ ]
+ },
+ "uls-region-WW": "ⲡⲓⲑⲟ ⲧⲏⲣϥ",
+ "uls-region-AM": "ⲁⲙⲉⲣⲓⲕⲏ",
+ "uls-region-AF": "ⲁⲫⲣⲓⲕⲏ",
+ "uls-region-EU": "ⲉⲩⲣⲱⲡⲏ",
+ "uls-region-AS": "ⲁⲥⲓⲁ",
+ "uls-region-ME": "ⲡⲓⲉⲃⲧ `ⲛⲑⲙⲏϯ",
+ "uls-region-PA": "ⲱⲕⲉⲁⲛⲓⲁ",
+ "uls-region-all": "ⲁⲥⲡⲓ ⲛⲓⲃⲉⲛ",
+ "uls-no-results-found": "ⲁⲩϫⲓⲙⲓ ⲁⲛ ⲛⲓⲁⲡⲟⲧⲉⲗⲉⲥⲙⲁ",
+ "uls-common-languages": "ⲛⲓⲁⲥⲡⲓ ⲁⲩϯⲙⲉⲩⲓ",
+ "uls-search-help": "ⲧⲉⲧⲉⲛϫⲉⲙϫⲟⲙ ⲉϫⲉⲙⲣⲁⲧ ϩⲉⲛ ⲡⲓⲣⲁⲛ ⲛⲧⲉ ⲟⲩⲁⲥⲡⲓ, ⲡⲓⲣⲁⲛ ⲛⲧⲉ ⲟⲩⲙⲉⲧⲥϦⲁⲓ, ⲟⲩϣⲓϥⲣ `ⲛISO ⲛⲧⲉ ⲁⲥⲡⲓ ⲓⲉ ⲧⲉⲧⲉⲛϫⲉⲙϫⲟⲙ ⲉⲥⲓⲛⲓ ϧⲁⲧⲉⲛⲟⲩⲭⲱⲣⲁ",
+ "uls-search-placeholder": "ϫⲉⲙⲣⲁⲧⲕ `ⲛⲟⲩⲁⲥⲡⲓ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/cs.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/cs.json
new file mode 100644
index 00000000..ad945400
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/cs.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Dvorapa",
+ "Mormegil"
+ ]
+ },
+ "uls-region-WW": "Celosvětové",
+ "uls-region-SP": "Speciální",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Evropa",
+ "uls-region-AS": "Asie",
+ "uls-region-ME": "Blízký východ",
+ "uls-region-PA": "Tichomoří",
+ "uls-region-all": "Všechny jazyky",
+ "uls-no-results-found": "Nenalezeny žádné výsledky",
+ "uls-common-languages": "Doporučené jazyky",
+ "uls-no-results-suggestion-title": "Mohlo by vás zajímat:",
+ "uls-search-help": "Můžete vyhledávat podle názvu jazyka, názvu písma, ISO kódu jazyka nebo můžete procházet po regionech.",
+ "uls-search-placeholder": "Hledat jazyk"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/cv.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/cv.json
new file mode 100644
index 00000000..716d3bda
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/cv.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chavash",
+ "Salam"
+ ]
+ },
+ "uls-region-WW": "Пӗтӗм тӗнчери",
+ "uls-region-SP": "Ятарлисем",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Ази",
+ "uls-region-ME": "Малти хӗвел тухӑҫ",
+ "uls-region-PA": "Океани",
+ "uls-region-all": "Мӗн пур чӗлхе",
+ "uls-no-results-found": "Нимӗн те тупӑнмарӗ",
+ "uls-common-languages": "Сӗннӗ чӗлхесем",
+ "uls-no-results-suggestion-title": "Тен çак чĕлхесем пăхма пултаратăр:",
+ "uls-search-help": "Чĕлхе ячĕпе, çырулăхĕпе, ISO-кочĕпе е регионĕпе шырама пулать:",
+ "uls-search-placeholder": "Чĕлхе шыра"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/cy.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/cy.json
new file mode 100644
index 00000000..38f9f895
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/cy.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Dafyddt",
+ "Lloffiwr",
+ "Robin Owain"
+ ]
+ },
+ "uls-region-WW": "Byd-eang",
+ "uls-region-SP": "Neilltuol",
+ "uls-region-AM": "America",
+ "uls-region-AF": "Affrica",
+ "uls-region-EU": "Ewrop",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Y Dwyrain Canol",
+ "uls-region-PA": "Y Pasiffig",
+ "uls-region-all": "Pob iaith",
+ "uls-no-results-found": "Ni chafwyd unrhyw ganlyniadau",
+ "uls-common-languages": "Ieithoedd awgrymedig",
+ "uls-no-results-suggestion-title": "Hwyrach bod y rhai sy'n dilyn o ddiddordeb i chi:",
+ "uls-search-help": "Gallwch chwilio gan ddefnyddio enw iaith, enw sgript, côd ISO'r iaith neu gallwch bori fesul rhanbarth.",
+ "uls-search-placeholder": "Chwilio am iaith"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/da.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/da.json
new file mode 100644
index 00000000..e397b38c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/da.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Christian List",
+ "Jubber",
+ "Peter Alberti"
+ ]
+ },
+ "uls-region-WW": "Verdensomspændende",
+ "uls-region-SP": "Specielle",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asien",
+ "uls-region-ME": "Mellemøsten",
+ "uls-region-PA": "Stillehavet",
+ "uls-region-all": "Alle sprog",
+ "uls-no-results-found": "Ingen resultater fundet",
+ "uls-common-languages": "Foreslåede sprog",
+ "uls-no-results-suggestion-title": "Du er måske interesseret i:",
+ "uls-search-help": "Du kan søge på sprogets navn, skriftens navn eller sprogets ISO-kode, eller du kan bladre hen til sproget efter regionen.",
+ "uls-search-placeholder": "Søg efter et sprog"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/de-formal.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/de-formal.json
new file mode 100644
index 00000000..cbe0493a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/de-formal.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kghbln",
+ "Purodha"
+ ]
+ },
+ "uls-region-SP": "Extras - kein Schprohche",
+ "uls-no-results-suggestion-title": "Dies könnte Sie interessieren:",
+ "uls-search-help": "Sie können nach dem Namen der Sprache suchen, dem Namen der Schrift, dem ISO-Code der Sprache oder aber die Suche über eine Region durchführen:",
+ "uls-search-placeholder": "Noh Schprohche söhke"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/de.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/de.json
new file mode 100644
index 00000000..bbf97e83
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/de.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kghbln",
+ "Man77",
+ "Metalhead64",
+ "TMg"
+ ]
+ },
+ "uls-region-WW": "Weltweit",
+ "uls-region-SP": "Spezial",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asien",
+ "uls-region-ME": "Naher Osten",
+ "uls-region-PA": "Pazifik",
+ "uls-region-all": "Alle Sprachen",
+ "uls-no-results-found": "Es wurden keine Ergebnisse gefunden.",
+ "uls-common-languages": "Vorgeschlagene Sprachen",
+ "uls-no-results-suggestion-title": "Dies könnte dich interessieren:",
+ "uls-search-help": "Du kannst nach dem Namen der Sprache suchen, dem Namen der Schrift, dem ISO-Code der Sprache oder aber die Suche über eine Region durchführen.",
+ "uls-search-placeholder": "Nach einer Sprache suchen"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/diq.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/diq.json
new file mode 100644
index 00000000..a0353df5
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/diq.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Asmen",
+ "Erdemaslancan",
+ "Gorizon",
+ "Gırd",
+ "Kumkumuk",
+ "Marmase",
+ "Mirzali"
+ ]
+ },
+ "uls-region-WW": "Dınyayi",
+ "uls-region-SP": "Xısusi",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Ewropa",
+ "uls-region-AS": "Asya",
+ "uls-region-ME": "Rocvetışê Miyani",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Zıwani pêro",
+ "uls-no-results-found": "Neticeyi nêvêniyayi",
+ "uls-common-languages": "Zıwanê ke estê.",
+ "uls-no-results-suggestion-title": "Belki şıma cıya eleqederi:",
+ "uls-search-help": "Şıma şenê name dê zıwaniya, skript kodiya, ISO qodiya yana mıntıqa heta cıgeyrayış bıkerê.",
+ "uls-search-placeholder": "Yew zıwani cı geyre"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/dsb.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/dsb.json
new file mode 100644
index 00000000..2842600a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/dsb.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Michawiki"
+ ]
+ },
+ "uls-region-WW": "na cełem swěśe",
+ "uls-region-SP": "Specialne",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azija",
+ "uls-region-ME": "Srjejźne pódzajtšo",
+ "uls-region-PA": "Pacifik",
+ "uls-region-all": "Wšykne rěcy",
+ "uls-no-results-found": "Žedne wuslědki namakane",
+ "uls-common-languages": "Powšykne rěcy",
+ "uls-no-results-suggestion-title": "To by mógło śi zajmowaś:",
+ "uls-search-help": "Móžoš pó mjenju rěcy, mjenju pisma, ISO-koźe rěcy pytaś abo móžoš pó regionje pytaś:",
+ "uls-search-placeholder": "Rěcne pytanje"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/dty.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/dty.json
new file mode 100644
index 00000000..6ecc44f6
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/dty.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Nirajan pant",
+ "रमेश सिंह बोहरा"
+ ]
+ },
+ "uls-region-WW": "विश्वभर",
+ "uls-region-SP": "खास",
+ "uls-region-AM": "अमेरिका",
+ "uls-region-AF": "अफ्रिका",
+ "uls-region-EU": "युरोप",
+ "uls-region-AS": "एसिया",
+ "uls-region-ME": "मध्य पूर्व",
+ "uls-region-PA": "प्रशान्त",
+ "uls-region-all": "जम्माइ भाषान",
+ "uls-no-results-found": "कोइ पन नतिजाहरू नाइभेटिया",
+ "uls-common-languages": "सुझावित भाषाअन",
+ "uls-no-results-suggestion-title": "तमलाई यैमी मन लाग्गसकन्छ:",
+ "uls-search-help": "तम भषा: नाउँले, लिपिया नाउँले, भषा: ISO कोड खोजिसकन्छ: या क्षेत्रा आधारमी ब्राउज अरिसकन्छ:।",
+ "uls-search-placeholder": "भाषा खिलाइ खोजी अरऽ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ee.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ee.json
new file mode 100644
index 00000000..f781774a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ee.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aguve"
+ ]
+ },
+ "uls-region-WW": "Xexeme Godoo",
+ "uls-region-SP": "Tɔxɛ",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Titina Ɣedzeƒe",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Gbewo Katã",
+ "uls-no-results-found": "Mekpɔ naneke o",
+ "uls-common-languages": "Kpɔ gbe siawo ɖa",
+ "uls-no-results-suggestion-title": "Ɖewohĩ esiwo gbɔna adzɔ dzi na wò:",
+ "uls-search-help": "Àte ŋu aŋlɔ gbea ŋkɔ atsɔ adii, azã woƒe skript ƒe ŋkɔ, gbea ƒe ISO dzesi adii alo àdii le nutonutowo nu.",
+ "uls-search-placeholder": "Di gbe aɖe"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/el.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/el.json
new file mode 100644
index 00000000..8a295824
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/el.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Evropi",
+ "Geraki"
+ ]
+ },
+ "uls-region-WW": "Παγκόσμιες",
+ "uls-region-SP": "Ειδικές",
+ "uls-region-AM": "Αμερική",
+ "uls-region-AF": "Αφρική",
+ "uls-region-EU": "Ευρώπη",
+ "uls-region-AS": "Ασία",
+ "uls-region-ME": "Μέση Ανατολή",
+ "uls-region-PA": "Ειρηνικός",
+ "uls-region-all": "Όλες οι γλώσσες",
+ "uls-no-results-found": "Δε βρέθηκαν αποτελέσματα",
+ "uls-common-languages": "Προτεινόμενες γλώσσες",
+ "uls-no-results-suggestion-title": "Μπορεί να σας ενδιαφέρουν:",
+ "uls-search-help": "Μπορείτε να ψάξετε κατά το όνομα της γλώσσας, τρόπο γραφής, κωδικό ISO της γλώσσας, ή να περιηγηθείτε ανά περιοχή.",
+ "uls-search-placeholder": "Αναζήτηση για γλώσσα"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/en-gb.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/en-gb.json
new file mode 100644
index 00000000..7b4e801b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/en-gb.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Andibing",
+ "Chase me ladies, I'm the Cavalry"
+ ]
+ },
+ "uls-region-WW": "Worldwide",
+ "uls-region-SP": "Special",
+ "uls-region-AM": "America",
+ "uls-region-AF": "Africa",
+ "uls-region-EU": "Europe",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Middle East",
+ "uls-region-PA": "Pacific",
+ "uls-region-all": "All languages",
+ "uls-no-results-found": "No results found",
+ "uls-common-languages": "Suggested languages",
+ "uls-no-results-suggestion-title": "You may be interested in:",
+ "uls-search-help": "You can search by language name, script name, ISO code of language or you can browse by region.",
+ "uls-search-placeholder": "Search for a language"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/en.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/en.json
new file mode 100644
index 00000000..d67fe538
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/en.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "author": "Santhosh Thottingal <santhosh.thottingal@gmail.com>",
+ "last-updated": "2012-09-21",
+ "locale": "en",
+ "message-documentation": "qqq"
+ },
+ "uls-region-WW": "Worldwide",
+ "uls-region-SP": "Special",
+ "uls-region-AM": "America",
+ "uls-region-AF": "Africa",
+ "uls-region-EU": "Europe",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Middle East",
+ "uls-region-PA": "Pacific",
+ "uls-region-all": "All languages",
+ "uls-no-results-found": "No results found",
+ "uls-common-languages": "Suggested languages",
+ "uls-no-results-suggestion-title": "You may be interested in:",
+ "uls-search-help": "You can search by language name, script name, ISO code of language or you can browse by region.",
+ "uls-search-placeholder": "Search for a language"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/eo.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/eo.json
new file mode 100644
index 00000000..58e8fb02
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/eo.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "KuboF",
+ "Objectivesea",
+ "Orikrin1998"
+ ]
+ },
+ "uls-region-WW": "Tutmonda",
+ "uls-region-SP": "Speciala",
+ "uls-region-AM": "Ameriko",
+ "uls-region-AF": "Afriko",
+ "uls-region-EU": "Eŭropo",
+ "uls-region-AS": "Azio",
+ "uls-region-ME": "Mezoriento",
+ "uls-region-PA": "Pacifiko",
+ "uls-region-all": "Ĉiuj lingvoj",
+ "uls-no-results-found": "Neniu rezulto estis trovita",
+ "uls-common-languages": "Sugestataj lingvoj",
+ "uls-no-results-suggestion-title": "Vi eble interesiĝas pri:",
+ "uls-search-help": "Vi povas serĉi laŭ la lingvonomo, la skriptnomo aŭ la lingva ISO-kodo, aŭ vi povas foliumi laŭ regiono.",
+ "uls-search-placeholder": "Serĉi lingvon"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/es.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/es.json
new file mode 100644
index 00000000..90cafc6b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/es.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armando-Martin",
+ "Fitoschido",
+ "Macofe",
+ "McDutchie",
+ "Pginer",
+ "Santhosh.thottingal",
+ "Vivaelcelta"
+ ]
+ },
+ "uls-region-WW": "Mundial",
+ "uls-region-SP": "Especial",
+ "uls-region-AM": "América",
+ "uls-region-AF": "África",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Medio Oriente",
+ "uls-region-PA": "Pacífico",
+ "uls-region-all": "Todos los idiomas",
+ "uls-no-results-found": "No se encontraron resultados",
+ "uls-common-languages": "Idiomas sugeridos",
+ "uls-no-results-suggestion-title": "Puedes estar interesado en:",
+ "uls-search-help": "Puedes buscar por el nombre del idioma, su tipo de escritura, el código ISO del idioma o buscar por región.",
+ "uls-search-placeholder": "Buscar un idioma"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/et.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/et.json
new file mode 100644
index 00000000..738a9855
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/et.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Pikne"
+ ]
+ },
+ "uls-region-WW": "Kogu maailm",
+ "uls-region-SP": "Erijuhud",
+ "uls-region-AM": "Ameerika",
+ "uls-region-AF": "Aafrika",
+ "uls-region-EU": "Euroopa",
+ "uls-region-AS": "Aasia",
+ "uls-region-ME": "Lähis-Ida",
+ "uls-region-PA": "Vaikne ookean",
+ "uls-region-all": "Kõik keeled",
+ "uls-no-results-found": "Tulemusi ei leitud.",
+ "uls-common-languages": "Soovitatavad keeled",
+ "uls-no-results-suggestion-title": "Võid eelistada neid:",
+ "uls-search-help": "Saad otsida keeli keelenimetuse, kirjanimetuse või keele ISO-koodi järgi või sirvida keeli piirkonna järgi.",
+ "uls-search-placeholder": "Keeleotsing"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/eu.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/eu.json
new file mode 100644
index 00000000..61ec1696
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/eu.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "An13sa",
+ "Sator",
+ "Theklan"
+ ]
+ },
+ "uls-region-WW": "Mundu osoa",
+ "uls-region-SP": "Berezia",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Ekialde Hurbila",
+ "uls-region-PA": "Pazifikoa",
+ "uls-region-all": "Hizkuntza guztiak",
+ "uls-no-results-found": "Ez da emaitzarik aurkitu",
+ "uls-common-languages": "Proposatutako hizkuntzak",
+ "uls-no-results-suggestion-title": "Agian interesa duzu:",
+ "uls-search-help": "Bilaketa egin ahal duzu hizkuntzaren izena, script izena, hizkuntzaren ISO kodea edo eskualdeka bilaketa egin ahal duzu.",
+ "uls-search-placeholder": "Hizkuntza bat bilatu"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/fa.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/fa.json
new file mode 100644
index 00000000..0d38a713
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/fa.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ahmad252",
+ "Alirezaaa",
+ "Amire80",
+ "Namo",
+ "Reza1615"
+ ]
+ },
+ "uls-region-WW": "در سراسر جهان",
+ "uls-region-SP": "ویژه",
+ "uls-region-AM": "آمریکا",
+ "uls-region-AF": "آفریقا",
+ "uls-region-EU": "اروپا",
+ "uls-region-AS": "آسیا",
+ "uls-region-ME": "خاورمیانه",
+ "uls-region-PA": "اقیانوس آرام",
+ "uls-region-all": "همهٔ زبان‌ها",
+ "uls-no-results-found": "نتیجه‌ای یافت نشد",
+ "uls-common-languages": "زبان‌های پیشنهادشده",
+ "uls-no-results-suggestion-title": "ممکن است علاقه‌مند باشید:",
+ "uls-search-help": "شما می‌توانید بر پایه نام زبان، نام اسکریپت، کد استاندارد زبان یا بر پایه منطقه جستجو کنید.",
+ "uls-search-placeholder": "جستجوی زبان"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/fat.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/fat.json
new file mode 100644
index 00000000..31a6a941
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/fat.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ebenoffen1"
+ ]
+ },
+ "uls-region-WW": "Wiase mfɛndzeanan nyinara",
+ "uls-region-SP": "Soronko",
+ "uls-region-AM": "Amereka",
+ "uls-region-AF": "Ebibiman",
+ "uls-region-EU": "Yurop",
+ "uls-region-AS": "Ehyia",
+ "uls-region-ME": "Finimfin Epuei",
+ "uls-region-PA": "Pasefeke",
+ "uls-region-all": "Kasa ahorow nyinara",
+ "uls-no-results-found": "Yennhu hwee",
+ "uls-common-languages": "Kasahorow a yeesusu ama wo",
+ "uls-no-results-suggestion-title": "Annyɛ a w'enyi bɛgye ho:",
+ "uls-search-help": "Ibotum dze kasa ne dzin, akyerɛw ne dzin, ISO kasa koodu anaa ibotum dze fa yi anenam ahwehwɛ.",
+ "uls-search-placeholder": "Hwehwɛ kasa bi"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/fi.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/fi.json
new file mode 100644
index 00000000..f68fe3a6
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/fi.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Alluk.",
+ "Nedergard",
+ "Nike",
+ "VezonThunder"
+ ]
+ },
+ "uls-region-WW": "Maailmankielet",
+ "uls-region-SP": "Erikoiskielet",
+ "uls-region-AM": "Pohjois- ja Etelä-Amerikka",
+ "uls-region-AF": "Afrikka",
+ "uls-region-EU": "Eurooppa",
+ "uls-region-AS": "Aasia",
+ "uls-region-ME": "Lähi-itä",
+ "uls-region-PA": "Tyynenmeren alue",
+ "uls-region-all": "Kaikki kielet",
+ "uls-no-results-found": "Ei hakutuloksia",
+ "uls-common-languages": "Ehdotetut kielet",
+ "uls-no-results-suggestion-title": "Lähimmät hakutulokset:",
+ "uls-search-help": "Hae kielen tai kirjoitusjärjestelmän nimellä, kielen ISO-koodilla tai selaa kieliä alueluettelosta:",
+ "uls-search-placeholder": "Etsi kieltä"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/fit.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/fit.json
new file mode 100644
index 00000000..942797d3
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/fit.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Pyscowicz"
+ ]
+ },
+ "uls-region-WW": "Maailmankielet",
+ "uls-region-SP": "Spesiaalikielet",
+ "uls-region-AM": "Pohjois- ja Etelä-Ameriika",
+ "uls-region-AF": "Aafriikka",
+ "uls-region-EU": "Euruuppa",
+ "uls-region-AS": "Aasia",
+ "uls-region-ME": "Lähi-itä",
+ "uls-region-PA": "Tyynenmeren alue",
+ "uls-region-all": "Kaikki kielet",
+ "uls-no-results-found": "Ei hakuresyltaatteja",
+ "uls-common-languages": "Ehotetut kielet",
+ "uls-no-results-suggestion-title": "Lähimmät hakuresyltaatit:",
+ "uls-search-help": "Hae kielen tai kirjoitussysteemin nimelä, kielen ISO-kootila eli selaa kieliä aluelistasta:",
+ "uls-search-placeholder": "Eti kieltä"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/fo.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/fo.json
new file mode 100644
index 00000000..ab4be10a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/fo.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "EileenSanda"
+ ]
+ },
+ "uls-region-WW": "Alheims",
+ "uls-region-SP": "Serstakt",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Evropa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Miðeystur",
+ "uls-region-PA": "Stillahavið",
+ "uls-region-all": "Øll mál",
+ "uls-no-results-found": "Ongi úrslit funnin",
+ "uls-common-languages": "Vanlig mál",
+ "uls-no-results-suggestion-title": "Tú ert kanska áhugað/ur í:",
+ "uls-search-help": "Tú kanst leita eftir navni á máli, skrifttýpu á máli, ISO kotu av máli ella kanst tú leita eftir øki.",
+ "uls-search-placeholder": "Leita eftir máli"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/fr.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/fr.json
new file mode 100644
index 00000000..05a12235
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/fr.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gomoko",
+ "Pols12",
+ "Ultimate",
+ "Verdy p",
+ "Wladek92"
+ ]
+ },
+ "uls-region-WW": "Dans le monde entier",
+ "uls-region-SP": "Spéciales",
+ "uls-region-AM": "Amérique",
+ "uls-region-AF": "Afrique",
+ "uls-region-EU": "Europe",
+ "uls-region-AS": "Asie",
+ "uls-region-ME": "Moyen-Orient",
+ "uls-region-PA": "Pacifique",
+ "uls-region-all": "Toutes les langues",
+ "uls-no-results-found": "Aucun résultat trouvé",
+ "uls-common-languages": "Langues suggérées",
+ "uls-no-results-suggestion-title": "Ceci pourrait vous intéresser :",
+ "uls-search-help": "Vous pouvez rechercher par nom de langue, par nom de l’écriture, par code ISO de langue, ou bien vous pouvez naviguer par région.",
+ "uls-search-placeholder": "Rechercher une langue"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/fur.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/fur.json
new file mode 100644
index 00000000..85c69b30
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/fur.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Klenje"
+ ]
+ },
+ "uls-region-WW": "Dut il mont",
+ "uls-region-SP": "Speciâl",
+ "uls-region-AM": "Americhe",
+ "uls-region-AF": "Afriche",
+ "uls-region-EU": "Europe",
+ "uls-region-AS": "Asie",
+ "uls-region-ME": "Medi Orient",
+ "uls-region-PA": "Pacjific",
+ "uls-no-results-found": "Nissun risultât",
+ "uls-common-languages": "Lenghis sugjeridis",
+ "uls-no-results-suggestion-title": "Tu puedis jessi interessât a:",
+ "uls-search-help": "Tu pues cirî par non de lenghe, non dal alfabet, codis ISO de lenghe o tu puedis cirî intune regjon.",
+ "uls-search-placeholder": "Cîr une lenghe"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/fy.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/fy.json
new file mode 100644
index 00000000..d37e69cb
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/fy.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "PiefPafPier",
+ "Robin van der Vliet",
+ "Robin0van0der0vliet"
+ ]
+ },
+ "uls-region-WW": "Wrâldwiid",
+ "uls-region-SP": "Spesjaal",
+ "uls-region-AM": "Amearika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Jeropa",
+ "uls-region-AS": "Aazje",
+ "uls-region-ME": "Midden-Easten",
+ "uls-region-PA": "Pasifysk gebiet",
+ "uls-region-all": "Alle talen",
+ "uls-no-results-found": "Gjin resultaten fûn",
+ "uls-common-languages": "Taalsuggestjes",
+ "uls-no-results-suggestion-title": "Faaks stelle jo belang yn:",
+ "uls-search-help": "Jo kinne op taalnamme, skriftnamme, ISO-koade fan 'e taal sykje of it op gebiet trochsjen.",
+ "uls-search-placeholder": "Taal sykje"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ga.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ga.json
new file mode 100644
index 00000000..8b857fcf
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ga.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Kscanne"
+ ]
+ },
+ "uls-region-WW": "Ar fud an Domhain",
+ "uls-region-SP": "Speisialta",
+ "uls-region-AM": "Meiriceá",
+ "uls-region-AF": "An Afraic",
+ "uls-region-EU": "An Eoraip",
+ "uls-region-AS": "An Áise",
+ "uls-region-ME": "An Meánoirthear",
+ "uls-region-PA": "An tAigéan Ciúin",
+ "uls-region-all": "Na teangacha uile",
+ "uls-no-results-found": "Gan torthaí",
+ "uls-common-languages": "Teangacha coitianta",
+ "uls-no-results-suggestion-title": "Seans go mbeadh suim agat i:",
+ "uls-search-help": "Is féidir cuardach de réir ainm na teanga, ainm na scripte, cód ISO 639, nó brabhsáil de réir réigiúin:",
+ "uls-search-placeholder": "Cuardaigh teangacha"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/gcr.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/gcr.json
new file mode 100644
index 00000000..43a49434
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/gcr.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "LeGuyanaisPure"
+ ]
+ },
+ "uls-region-WW": "Annan monn antché",
+ "uls-region-SP": "Èspésyal",
+ "uls-region-AM": "Lanmérik",
+ "uls-region-AF": "Lafrik",
+ "uls-region-EU": "Léròp",
+ "uls-region-AS": "Lazi",
+ "uls-region-ME": "Mwayen-Loryan",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Tout lanng-yan",
+ "uls-no-results-found": "Pyès rézilta trouvé",
+ "uls-common-languages": "Lanng sigjéré",
+ "uls-no-results-suggestion-title": "Ou pouvé fika entérésé pa :",
+ "uls-search-help": "Ou pouvé sasé pa non di lanng, pa non di lékritir-a, pa kod ISO di lanng-an, oben ou pouvé navigé pa réjyon.",
+ "uls-search-placeholder": "Sasé roun lanng"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/gd.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/gd.json
new file mode 100644
index 00000000..f78ab005
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/gd.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Akerbeltz",
+ "GunChleoc"
+ ]
+ },
+ "uls-region-WW": "Mòr-chànan",
+ "uls-region-SP": "Sònraichte",
+ "uls-region-AM": "Aimeireaga",
+ "uls-region-AF": "Afraga",
+ "uls-region-EU": "An Roinn-Eòrpa",
+ "uls-region-AS": "Àisia",
+ "uls-region-ME": "An Ear-mheadhan",
+ "uls-region-PA": "An Cuan Sèimh",
+ "uls-region-all": "A h-uile cànan",
+ "uls-no-results-found": "Cha deach toradh a lorg",
+ "uls-common-languages": "Cànain a mholamaid",
+ "uls-no-results-suggestion-title": "’S dòcha gum bi ùidh agad sna leanas:",
+ "uls-search-help": "'S urrainn dhut lorg le ainm a' chànain, ainm an sgriobt, còd ISO a' chànain no brabhsadh a-rèir roinn-dùthcha.",
+ "uls-search-placeholder": "Lorg cànan"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/gl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/gl.json
new file mode 100644
index 00000000..ddac4f45
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/gl.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Banjo",
+ "Elisardojm",
+ "Toliño"
+ ]
+ },
+ "uls-region-WW": "Mundial",
+ "uls-region-SP": "Especial",
+ "uls-region-AM": "América",
+ "uls-region-AF": "África",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Oriente Medio",
+ "uls-region-PA": "Pacífico",
+ "uls-region-all": "Todas as linguas",
+ "uls-no-results-found": "Non se atopou ningún resultado",
+ "uls-common-languages": "Linguas suxeridas",
+ "uls-no-results-suggestion-title": "Poida que estea buscando:",
+ "uls-search-help": "Pode procurar polo nome da lingua, o tipo de escritura ou o código ISO. Tamén pode explorar as rexións.",
+ "uls-search-placeholder": "Procurar unha lingua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/glk.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/glk.json
new file mode 100644
index 00000000..fc16ea79
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/glk.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "شیخ"
+ ]
+ },
+ "uls-region-WW": "دۊنىا سرتاسرˇ ميئن",
+ "uls-region-SP": "خاص",
+ "uls-region-AM": "آمريکا",
+ "uls-region-AF": "آفريقا",
+ "uls-region-EU": "اۊرۊپا",
+ "uls-region-AS": "آسيا",
+ "uls-region-ME": "مئني خۊرتؤ",
+ "uls-region-PA": "اۊقيانۊسˇ آرؤم",
+ "uls-region-all": "همته زوؤنؤن",
+ "uls-no-results-found": "نتيجه-اي وامته نۊبؤ",
+ "uls-common-languages": "پيش بنا زوؤنؤن",
+ "uls-no-results-suggestion-title": "مۊمکنه خۊش بدأرين:",
+ "uls-search-help": "شۊمۊ تؤنين زوانˇ نؤمˇ أمرأ، رسم الخط، زوانˇ ايزؤ کؤد ىا شيمي سامؤنˇ أمرأ وامجين.",
+ "uls-search-placeholder": "وامج يته زوؤنˇ ويسين"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/gn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/gn.json
new file mode 100644
index 00000000..fefc0a66
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/gn.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fitoschido",
+ "P. S. F. Freitas"
+ ]
+ },
+ "uls-region-WW": "Yvóra",
+ "uls-region-SP": "Mba'echĩchĩ",
+ "uls-region-AM": "Amérika",
+ "uls-region-AF": "Áfrika",
+ "uls-region-EU": "Európa",
+ "uls-region-AS": "Ásia",
+ "uls-region-ME": "Mbyte Kuarahyresẽ",
+ "uls-region-PA": "Paraguasu Py'aguapy",
+ "uls-region-all": "Opa ñe'ẽ",
+ "uls-no-results-found": "Ndojuhu mba'e",
+ "uls-common-languages": "Ñe'ẽ ojeipuruvéva",
+ "uls-no-results-suggestion-title": "Nde ikatu reipotaː",
+ "uls-search-help": "Nde ikatu reheka ñe'ẽ héra rupi, tai ysaja rupi, ISO ñe'ẽ héra térã ñe'ẽ renda rupi.",
+ "uls-search-placeholder": "Ñe'ẽ jeheka"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/gom-deva.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/gom-deva.json
new file mode 100644
index 00000000..6ae4b662
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/gom-deva.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Santhosh.thottingal",
+ "The Discoverer",
+ "Vaishali Parab"
+ ]
+ },
+ "uls-region-AM": "अमेरिका",
+ "uls-region-AF": "अफ़्रीका",
+ "uls-region-EU": "यूरोप",
+ "uls-region-AS": "एशिया",
+ "uls-region-ME": "मदलें उदेंत",
+ "uls-region-PA": "पॅसिफीक",
+ "uls-no-results-found": "परिणाम मेळूंक ना",
+ "uls-common-languages": "सामान्य भासो",
+ "uls-no-results-suggestion-title": "Tuka avdot:",
+ "uls-search-help": "तुज्यान भाशेचें नांव, लिपीचें नांव, भाशेचो ISO‍‌‍‌ कोड वा जाग्यावरवीं सोदूंक जाता.",
+ "uls-search-placeholder": "भास सोदात"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/gom-latn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/gom-latn.json
new file mode 100644
index 00000000..7bfec84e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/gom-latn.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "The Discoverer"
+ ]
+ },
+ "uls-region-WW": "Akhea sonvsarant",
+ "uls-region-SP": "Khashelem",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Erop",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Modlem Udent",
+ "uls-region-PA": "Pacifik",
+ "uls-region-all": "Soglleo bhaso",
+ "uls-no-results-found": "Porinam mellunk nam",
+ "uls-common-languages": "Suchoiloeo bhaso",
+ "uls-no-results-suggestion-title": "Tuka avdot:",
+ "uls-search-help": "Tujean bhase, lipie, bhaseche ISO code vo zagea vorvim sodunk zata.",
+ "uls-search-placeholder": "Eke bhase khatir sod"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/got.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/got.json
new file mode 100644
index 00000000..74596296
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/got.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gothicspeaker"
+ ]
+ },
+ "uls-region-WW": "𐌹𐌽 𐌰𐌻𐌻𐌰𐌼𐌰 𐍆𐌰𐌹𐍂𐍈𐌰𐌿",
+ "uls-region-SP": "𐍃𐌹𐌻𐌳𐌰𐌻𐌴𐌹𐌺𐍃",
+ "uls-region-AM": "𐌰𐌼𐌴𐍂𐌹𐌺𐌰",
+ "uls-region-AF": "𐌰𐍆𐍂𐌹𐌺𐌰",
+ "uls-region-EU": "𐌰𐌹𐍅𐍂𐍉𐍀𐌰",
+ "uls-region-AS": "𐌰𐍃𐌹𐌰",
+ "uls-region-ME": "𐌼𐌹𐌳𐌾𐌹𐍃 𐌰𐌿𐍃𐍄𐍂𐌰",
+ "uls-region-PA": "𐍀𐌰𐍃𐌹𐍆𐌹𐌺",
+ "uls-no-results-found": "𐌽𐌹 𐍅𐌰𐌹𐌷𐍄𐍃 𐌱𐌹𐌲𐌹𐍄𐌰𐌽𐍃",
+ "uls-common-languages": "𐌱𐌹𐌿𐌷𐍄𐌰 𐍂𐌰𐌶𐌳𐍉𐍃",
+ "uls-no-results-suggestion-title": "𐌿𐍆𐍄𐍉 𐍅𐌹𐌻𐌴𐌹𐍃 𐍃𐌿𐌼𐍃 𐌸𐌹𐌶𐍉 𐍂𐌰𐌶𐌳𐍉:",
+ "uls-search-help": "𐌼𐌰𐌲𐍄 𐍃𐍉𐌺𐌾𐌰𐌽 𐌼𐌹𐌸 𐍂𐌰𐌶𐌳𐌰𐌽𐌰𐌼𐌹𐌽, 𐌼𐌴𐌻𐌴𐌹𐌽𐌹𐌽𐌰𐌼𐌹𐌽, 𐌹𐍃𐍉 𐍂𐌰𐌸𐌾𐍉𐌽 𐌸𐌹𐌶𐍉𐍃 𐍂𐌰𐌶𐌳𐍉𐍃 𐌰𐌹𐌸𐌸𐌰𐌿 𐌼𐌰𐌲𐍄 𐍃𐍉𐌺𐌾𐌰𐌽 𐌱𐌹 𐌲𐌰𐍅𐌹.",
+ "uls-search-placeholder": "𐍂𐌰𐌶𐌳𐌰 𐍃𐍉𐌺𐌴𐌹𐌽𐍃"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/grc.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/grc.json
new file mode 100644
index 00000000..0350237b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/grc.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "PastelKos"
+ ]
+ },
+ "uls-region-WW": "Οἰκουμενικῶς",
+ "uls-region-AM": "Ἀμερική",
+ "uls-region-AF": "Λιβύη",
+ "uls-region-EU": "Εὐρώπη",
+ "uls-region-AS": "Ἀσία",
+ "uls-region-ME": "Ἐγγὺς Ἀνατολή",
+ "uls-region-PA": "Εἰρηνικός",
+ "uls-region-all": "Ἅπασαι αἱ γλῶσσαι",
+ "uls-no-results-found": "Οὐδὲν Ἀποτέλεσμα",
+ "uls-common-languages": "Εἰσηγούμεναι γλῶσσαι",
+ "uls-search-placeholder": "Ζητεῖν γλῶσσαν"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/gsw.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/gsw.json
new file mode 100644
index 00000000..3c344d62
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/gsw.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Als-Holder",
+ "Terfili"
+ ]
+ },
+ "uls-region-WW": "Wältwyt",
+ "uls-region-SP": "Spezial",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asie",
+ "uls-region-ME": "Mittlere Oschte",
+ "uls-region-PA": "Pazifik",
+ "uls-region-all": "Alli Sprooche",
+ "uls-no-results-found": "Kei Ergebnis gfunde",
+ "uls-common-languages": "Sprooche, wo vorgschlo sin",
+ "uls-no-results-suggestion-title": "Des chennt Di interessiere:",
+ "uls-search-help": "Du chasch noch em Name vu dr Sproch sueche, em ISO-Code vu dr Sproch oder Du gohsch iber e Region fir d Suechi.",
+ "uls-search-placeholder": "Nooch ere Sproch sueche"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/gu.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/gu.json
new file mode 100644
index 00000000..04302b2f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/gu.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ashok modhvadia",
+ "Harsh4101991",
+ "KartikMistry",
+ "Santhosh.thottingal"
+ ]
+ },
+ "uls-region-WW": "વિશ્વભરમાં",
+ "uls-region-SP": "ખાસ",
+ "uls-region-AM": "અમેરિકા",
+ "uls-region-AF": "આફ્રિકા",
+ "uls-region-EU": "યુરોપ",
+ "uls-region-AS": "એશિયા",
+ "uls-region-ME": "મધ્ય પૂર્વ",
+ "uls-region-PA": "પૅસિફિક",
+ "uls-region-all": "બધી ભાષાઓ",
+ "uls-no-results-found": "કોઈ પરિણામ મળ્યા નહી",
+ "uls-common-languages": "સૂચિત ભાષાઓ",
+ "uls-no-results-suggestion-title": "તમને આમાં રસ હોઈ શકે છે:",
+ "uls-search-help": "તમે ભાષા નામ, સ્ક્રિપ્ટ નામ, ભાષા ISO કોડ દ્વારા શોધ કરી શકો છે અથવા તમે પ્રદેશ દ્વારા શોધ કરી શકો છો.",
+ "uls-search-placeholder": "ભાષા માટે શોધો"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/guc.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/guc.json
new file mode 100644
index 00000000..e61e5445
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/guc.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Leonfd1992"
+ ]
+ },
+ "uls-region-WW": "Mmanain",
+ "uls-region-SP": "Anasüle'eya",
+ "uls-region-AM": "Ameerika",
+ "uls-region-AF": "Apürika",
+ "uls-region-EU": "Euroopa",
+ "uls-region-AS": "Aasia",
+ "uls-region-ME": "Mmakalüirua Wiinnaaka",
+ "uls-region-PA": "Pasiipikat",
+ "uls-region-all": "Süpüshua'a anüikikalüirua",
+ "uls-no-results-found": "Nnojotsü antünüin anain tia achajaanaka",
+ "uls-common-languages": "Anüiki eekalü süpüla püneekajüin",
+ "uls-no-results-suggestion-title": "Eesü süpüla kamalain pümüin tü:",
+ "uls-search-help": "Eesü süpüla püchajaain süka sünülia tia anüikika, süka sukua'ipa süshajiee, süka shikii sünülia ISO amünakat jee eesü süpüla püchajaain süka sünülia mmakat.",
+ "uls-search-placeholder": "Achajawaa wane anüiki"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/guw.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/guw.json
new file mode 100644
index 00000000..d926e3db
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/guw.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joshateji",
+ "Samatics"
+ ]
+ },
+ "uls-region-WW": "Lẹdo aihọn pé",
+ "uls-region-SP": "Vonọtaun",
+ "uls-region-AM": "Amẹlika",
+ "uls-region-AF": "Aflika",
+ "uls-region-EU": "Europe",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Middle East",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Ogbè lẹpo",
+ "uls-no-results-found": "Nuhe dín a te ma sọawuhia to owé depope mẹ",
+ "uls-common-languages": "Ogbè he yin nudego lẹ",
+ "uls-no-results-suggestion-title": "Mì sọgan tindo ojlo na ehelẹ:",
+ "uls-search-help": "Mì sọgan yí yinkọ ogbè tọn do dín, kavi yinkọ wekinkan tọn, kavi hokun ISO ogbè tọn kavi mì ni dín gbọn lẹdo lọ yiyizan dali.",
+ "uls-search-placeholder": "Dín ogbè de"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ha.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ha.json
new file mode 100644
index 00000000..2b6868c7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ha.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Em-em"
+ ]
+ },
+ "uls-region-WW": "Duk duniya",
+ "uls-region-SP": "Muhimmi",
+ "uls-region-AM": "Amurka",
+ "uls-region-AF": "Afirka",
+ "uls-region-EU": "Turai",
+ "uls-region-AS": "Asiya",
+ "uls-region-ME": "Gabas ta Tsakiya",
+ "uls-region-PA": "Pasific",
+ "uls-region-all": "Dukkan harsuna",
+ "uls-no-results-found": "Ba'a samu sakamako ba",
+ "uls-common-languages": "Harsunan da aka gabatar",
+ "uls-no-results-suggestion-title": "Zaka iya son yin:",
+ "uls-search-help": "Zaku iya bincike ta sunan harshe, sunan script, Kod din ISO na harshe ko zaku iya bincike ta yanki.",
+ "uls-search-placeholder": "Bincike na wani harshe"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/hak.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/hak.json
new file mode 100644
index 00000000..07868642
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/hak.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jetlag"
+ ]
+ },
+ "uls-region-WW": "全世界",
+ "uls-region-SP": "特別",
+ "uls-region-AM": "美洲",
+ "uls-region-AF": "非洲",
+ "uls-region-EU": "歐洲",
+ "uls-region-AS": "亞洲",
+ "uls-region-ME": "中東",
+ "uls-region-PA": "太平洋",
+ "uls-no-results-found": "尋毋到任何結果",
+ "uls-common-languages": "常用語言",
+ "uls-no-results-suggestion-title": "爾可能感興趣:",
+ "uls-search-help": "爾可以按語言名稱、程式碼名稱、語言ISO代碼搜索,也可以按區域瀏覽:",
+ "uls-search-placeholder": "語言搜索"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/haw.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/haw.json
new file mode 100644
index 00000000..5fa48483
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/haw.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kolonahe"
+ ]
+ },
+ "uls-region-WW": "ʻŌlelo puni hōnua",
+ "uls-region-SP": "Kūikawā",
+ "uls-region-AM": "ʻAmelika",
+ "uls-region-AF": "ʻApelika",
+ "uls-region-EU": "ʻEulopa",
+ "uls-region-AS": "ʻĀkia",
+ "uls-region-ME": "Hikina Waena",
+ "uls-region-PA": "Pakipika",
+ "uls-region-all": "Nā ʻōlelo a pau",
+ "uls-no-results-found": "ʻAʻohe hualoaʻa",
+ "uls-common-languages": "Nā ʻōlelo lawelawe paha",
+ "uls-no-results-suggestion-title": "Makemake paha ʻoe iā:",
+ "uls-search-help": "Hiki iā ʻoe ke huli i ka inoa ʻōlelo, inoa kikokikona, pāʻālua ISO ʻōlelo a i ʻole huli i ka ʻāina.",
+ "uls-search-placeholder": "Huli ʻŌlelo"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/he.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/he.json
new file mode 100644
index 00000000..00937b60
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/he.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Guycn2",
+ "Inkbug"
+ ]
+ },
+ "uls-region-WW": "עולמי",
+ "uls-region-SP": "מיוחדות",
+ "uls-region-AM": "אמריקה",
+ "uls-region-AF": "אפריקה",
+ "uls-region-EU": "אירופה",
+ "uls-region-AS": "אסיה",
+ "uls-region-ME": "המזרח התיכון",
+ "uls-region-PA": "האוקיינוס השקט",
+ "uls-region-all": "כל השפות",
+ "uls-no-results-found": "לא נמצאו תוצאות",
+ "uls-common-languages": "שפות מוצעות",
+ "uls-no-results-suggestion-title": "אולי זה יעניין אותך:",
+ "uls-search-help": "אפשר לחפש לפי שם שפה, שם שיטת הכתב, קוד ISO של השפה, או ניתן לעיין לפי אזור.",
+ "uls-search-placeholder": "חיפוש שפה"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/hi.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/hi.json
new file mode 100644
index 00000000..c2069692
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/hi.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Santhosh.thottingal",
+ "Sfic",
+ "Siddhartha Ghai"
+ ]
+ },
+ "uls-region-WW": "वैश्विक",
+ "uls-region-SP": "विशेष",
+ "uls-region-AM": "अमेरिका",
+ "uls-region-AF": "अफ़्रीका",
+ "uls-region-EU": "यूरोप",
+ "uls-region-AS": "एशिया",
+ "uls-region-ME": "मध्य पूर्व",
+ "uls-region-PA": "प्रशांत",
+ "uls-region-all": "सभी भाषाएँ",
+ "uls-no-results-found": "कोई परिणाम नहीं मिले",
+ "uls-common-languages": "सुझावित भाषा",
+ "uls-no-results-suggestion-title": "आपके लिये संभवतः उपयोगी:",
+ "uls-search-help": "आप भाषा के नाम, लिपि के नाम एवं भाषा के ISO कोड से खोज कर सकते हैं, और क्षेत्र अनुसार ब्राउज़ भी कर सकते हैं।",
+ "uls-search-placeholder": "भाषा के लिए खोजें"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/hif-latn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/hif-latn.json
new file mode 100644
index 00000000..908e6f73
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/hif-latn.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Girmitya"
+ ]
+ },
+ "uls-region-WW": "Duniya bhar",
+ "uls-region-SP": "Khaas",
+ "uls-region-AM": "America",
+ "uls-region-AF": "Africa",
+ "uls-region-EU": "Europe",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Middle East",
+ "uls-region-PA": "Pacific",
+ "uls-region-all": "Sab bhaasa",
+ "uls-no-results-found": "Koi result nai milaa",
+ "uls-common-languages": "Suggested bhaasa",
+ "uls-no-results-suggestion-title": "Aap saait interested interested rahegaa:",
+ "uls-search-help": "Aap khoje saktaa hae bhaasa ke naam, script ke name, bhaasa ke ISO code, nai to, aap region se browse kare saktaa hai.",
+ "uls-search-placeholder": "Bhasa ke khojo"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/hoc.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/hoc.json
new file mode 100644
index 00000000..400b1277
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/hoc.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Singkiring57"
+ ]
+ },
+ "uls-region-WW": "𑢫𑣉𑣒𑣁 𑣉𑣕𑣈 𑣜𑣈",
+ "uls-region-SP": "𑢷𑣁𑣋𑣈-𑣕𑣂𑣊𑣋𑣃",
+ "uls-region-AM": "𑢡𑣖𑣈𑣜𑣂𑣌𑣁",
+ "uls-region-AF": "𑢡𑣘𑣜𑣂𑣌𑣁",
+ "uls-region-EU": "𑢦𑣇𑣜𑣉𑣉𑣘",
+ "uls-region-AS": "𑢨𑣈𑣞𑣂𑣅𑣁",
+ "uls-region-ME": "𑢵𑣁𑣚𑣁-𑣕𑣃𑣜 𑣞𑣁𑣄",
+ "uls-region-PA": "𑢸𑣈𑣞𑣂𑣘𑣂𑣌",
+ "uls-region-all": "𑢾𑣗𑣈𑣓 𑣎𑣁𑣋𑣁𑣜 𑣌𑣉",
+ "uls-no-results-found": "𑢮𑣁𑣓𑣁𑣄 𑣌𑣁𑣁 𑣓𑣁𑣖-𑣈𑣓𑣁",
+ "uls-common-languages": "𑢨𑣒𑣁𑣄 𑣎𑣁𑣋𑣁𑣜 𑣌𑣉",
+ "uls-no-results-suggestion-title": "𑢳𑣈𑣓𑣁 𑣌𑣉 𑣕𑣉𑣜𑣁𑣊 𑣗𑣈𑣓 𑣞𑣃𑣌𑣃𑣕𑣈𑣁:",
+ "uls-search-help": "𑢮𑣁𑣋𑣁𑣜 𑣓𑣃𑣕𑣃𑣖 𑣕𑣈, 𑣏𑣂𑣕𑣂 𑣓𑣃𑣕𑣃𑣖 𑣕𑣈, 𑣎𑣈𑣋𑣁𑣜 𑣜𑣈𑣅𑣄 ISO 𑣌𑣉𑣉𑣑 𑣕𑣈 𑣌𑣁𑣜𑣈 𑣒𑣅𑣑 𑣓𑣃𑣕𑣃𑣖 𑣕𑣈 𑣉𑣉 𑣓𑣖-𑣓𑣈𑣚 𑣔𑣆𑣅𑣉𑣄𑣁.",
+ "uls-search-placeholder": "𑢶𑣂𑣈𑣑 𑣎𑣁𑣋𑣁𑣓 𑣓𑣈𑣚-𑣓𑣖𑣈"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/hr.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/hr.json
new file mode 100644
index 00000000..1cd4d7e3
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/hr.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "MaGa",
+ "Teoo3"
+ ]
+ },
+ "uls-region-WW": "Svjetski jezici",
+ "uls-region-SP": "Posebno",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azija",
+ "uls-region-ME": "Bliski istok",
+ "uls-region-PA": "Pacifik",
+ "uls-region-all": "Svi jezici",
+ "uls-no-results-found": "Nema rezultata",
+ "uls-common-languages": "Predloženi jezici",
+ "uls-no-results-suggestion-title": "Možda ste zainteresirani za:",
+ "uls-search-help": "Možete tražiti prema nazivu jezika, pisma, ISO kôdu jezika ili možete pretražiti po regiji.",
+ "uls-search-placeholder": "Pretraga jezika"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/hrx.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/hrx.json
new file mode 100644
index 00000000..aab74519
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/hrx.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Paul Beppler"
+ ]
+ },
+ "uls-region-WW": "Weltweit",
+ "uls-region-SP": "Spezial",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asie",
+ "uls-region-ME": "Mittlrer Ost",
+ "uls-region-PA": "Pazifik",
+ "uls-no-results-found": "Do woard ken Ergebniss gefund.",
+ "uls-common-languages": "Voargeschloohte Sproche",
+ "uls-no-results-suggestion-title": "Das könnt dich interssiere:",
+ "uls-search-help": "Du kannst nooh der Sproch ehr Noome suche, dem Schrift sein Noome, dem ISO-Code von der Sproch orrer awer die Such üwer en Reschion dorrichführe:",
+ "uls-search-placeholder": "Sprochesuch"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/hsb.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/hsb.json
new file mode 100644
index 00000000..218522fd
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/hsb.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki"
+ ]
+ },
+ "uls-region-WW": "Na cyłym swěće",
+ "uls-region-SP": "Specialne",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azija",
+ "uls-region-ME": "Srjedźny wuchod:",
+ "uls-region-PA": "Pacifik",
+ "uls-region-all": "Wšě rěče",
+ "uls-no-results-found": "Žane wuslědki namakane",
+ "uls-common-languages": "Namjetowane rěče",
+ "uls-no-results-suggestion-title": "To móhło će zajimować:",
+ "uls-search-help": "Móžeš po mjenje rěče, mjenje pisma, ISO-kodźe rěče pytać abo pytanje přez region přewjesć.",
+ "uls-search-placeholder": "Za rěču pytać"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ht.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ht.json
new file mode 100644
index 00000000..ca761071
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ht.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80"
+ ]
+ },
+ "uls-region-WW": "Atravè lemond",
+ "uls-region-SP": "Espesyal",
+ "uls-region-AM": "Amerik",
+ "uls-region-AF": "Afrik",
+ "uls-region-EU": "Ewòp",
+ "uls-region-AS": "Azi",
+ "uls-region-ME": "Mwayen Oryan",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Tout lang yo",
+ "uls-no-results-found": "Pa gen rezilta yo te jwenn",
+ "uls-common-languages": "Lang yo sijere",
+ "uls-no-results-suggestion-title": "Ou ka enterese nan :",
+ "uls-search-help": "Ou ka chèche pa non lang, non grafi, kòd ISO lang oswa ou ka mache gade pa rejyon an.",
+ "uls-search-placeholder": "Chèche yon lang"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/hu.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/hu.json
new file mode 100644
index 00000000..17d23ed4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/hu.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Dj",
+ "Tacsipacsi"
+ ]
+ },
+ "uls-region-WW": "Világszerte",
+ "uls-region-SP": "Speciális",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Európa",
+ "uls-region-AS": "Ázsia",
+ "uls-region-ME": "Közel-Kelet",
+ "uls-region-PA": "Csendes-óceáni",
+ "uls-region-all": "Minden nyelv",
+ "uls-no-results-found": "Nincs találat",
+ "uls-common-languages": "Javasolt nyelvek",
+ "uls-no-results-suggestion-title": "Lehet, hogy érdekel:",
+ "uls-search-help": "Kereshetsz a nyelv neve, ábécé neve, a nyelv ISO kódja alapján vagy böngészhetsz régiók szerint.",
+ "uls-search-placeholder": "Nyelv keresése"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/hy.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/hy.json
new file mode 100644
index 00000000..d5f4f2dc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/hy.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Nona",
+ "Xelgen"
+ ]
+ },
+ "uls-region-WW": "Միջազգային",
+ "uls-region-SP": "Հատուկ",
+ "uls-region-AM": "Ամերիկա",
+ "uls-region-AF": "Աֆրիկա",
+ "uls-region-EU": "Եվրոպա",
+ "uls-region-AS": "Ասիա",
+ "uls-region-ME": "Միջին արևելք",
+ "uls-region-PA": "Օվկիանիա",
+ "uls-region-all": "Բոլոր լեզուները",
+ "uls-no-results-found": "Ոչինչ չի գտնվել",
+ "uls-common-languages": "Առաջարկվող լեզուներ",
+ "uls-no-results-suggestion-title": "Ձեզ գուցե հետաքրքրեն․",
+ "uls-search-help": "Դուք կարող եք որոնել լեզուն իր անվամբ, գրի անունով, ԻՍՈ կոդով կամ կարող եք ընտրել ըստ տարածաշրջանի։",
+ "uls-search-placeholder": "Որոնել լեզուները"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/hyw.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/hyw.json
new file mode 100644
index 00000000..59b0dfb8
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/hyw.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armeniki"
+ ]
+ },
+ "uls-region-WW": "Համաշխարհային",
+ "uls-region-SP": "Յատուկ",
+ "uls-region-AM": "Ամերիկա",
+ "uls-region-AF": "Ափրիկէ",
+ "uls-region-EU": "Եւրոպա",
+ "uls-region-AS": "Ասիա",
+ "uls-region-ME": "Միջին Արեւելք",
+ "uls-region-PA": "Խաղաղական",
+ "uls-region-all": "Ամէն լեզուները",
+ "uls-no-results-found": "Հետեւանք չը գտնուեձաւ",
+ "uls-common-languages": "Թելադրուած լեզուներ",
+ "uls-no-results-suggestion-title": "Կարելի է ձեզ հետաքրքրական ըլլայ․",
+ "uls-search-help": "Կրնաք որոնել լեզուի անունով, տարերու անունով, լեզուի ISO-ի օրինագիրով կամ կրնաք նայիլ շրջանով:",
+ "uls-search-placeholder": "Որոնել լեզու մը"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ia.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ia.json
new file mode 100644
index 00000000..39ce93fd
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ia.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "McDutchie"
+ ]
+ },
+ "uls-region-WW": "Mundial",
+ "uls-region-SP": "Special",
+ "uls-region-AM": "America",
+ "uls-region-AF": "Africa",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Medio oriente",
+ "uls-region-PA": "Pacific",
+ "uls-region-all": "Tote le linguas",
+ "uls-no-results-found": "Nulle resultato trovate",
+ "uls-common-languages": "Linguas suggerite",
+ "uls-no-results-suggestion-title": "Tu pote esser interessate in:",
+ "uls-search-help": "Tu pote cercar per nomine de lingua, nomine de scriptura o codice ISO de lingua, o tu pote foliar per le regiones.",
+ "uls-search-placeholder": "Cercar un lingua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/id.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/id.json
new file mode 100644
index 00000000..01655ef2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/id.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bennylin",
+ "Farras",
+ "Iwan Novirion",
+ "J Nia30",
+ "NoiX180"
+ ]
+ },
+ "uls-region-WW": "Seluruh dunia",
+ "uls-region-SP": "Khusus",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Eropa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Timur Tengah",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Semua bahasa",
+ "uls-no-results-found": "Tidak ada hasil yang ditemukan",
+ "uls-common-languages": "Bahasa yang disarankan",
+ "uls-no-results-suggestion-title": "Anda mungkin tertarik pada:",
+ "uls-search-help": "Anda dapat mencari dengan nama bahasa, nama skrip, kode ISO bahasa atau Anda dapat menelusuri menurut wilayahnya.",
+ "uls-search-placeholder": "Pencarian bahasa"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ie.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ie.json
new file mode 100644
index 00000000..cc2776c0
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ie.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Makuba",
+ "Stavanger7"
+ ]
+ },
+ "uls-region-WW": "Global",
+ "uls-region-SP": "Special",
+ "uls-region-AM": "America",
+ "uls-region-AF": "Africa",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Medial Ost",
+ "uls-region-PA": "Pacific",
+ "uls-region-all": "Omni lingues",
+ "uls-no-results-found": "Null resultates ha esset trovat.",
+ "uls-common-languages": "Proposit lingues",
+ "uls-no-results-suggestion-title": "Forsan tu es interessat in:",
+ "uls-search-help": "Tu posse serchar li nómin del lingue, del scritura, li ISO-code del lingue o serchar secun un region.",
+ "uls-search-placeholder": "Serchar un lingue"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ike-cans.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ike-cans.json
new file mode 100644
index 00000000..1bc4677a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ike-cans.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "ArticleEditor404"
+ ]
+ },
+ "uls-region-WW": "ᓄᓇᕐᔪᐊᓕᒫᒥ",
+ "uls-region-SP": "ᐊᔾᔨᐅᙱᑦᑐᖅ",
+ "uls-region-AM": "America",
+ "uls-region-AF": "ᐋᕗᕆᑲ",
+ "uls-region-EU": "ᑕᕆᐅᑉ ᐊᑭᐊᓂᕐᒥᐅᑦ",
+ "uls-region-AS": "ᐊᓲᓯ",
+ "uls-region-all": "ᐅᖃᐅᓯᖅᑕᓕᒫᑦ",
+ "uls-no-results-found": "ᖃᐅᔨᓴᕈᑎᕕᓃᑦ ᓇᓂᔭᐅᓚᐅᙱᑦᑐᑦ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ilo.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ilo.json
new file mode 100644
index 00000000..7b09f217
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ilo.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lam-ang"
+ ]
+ },
+ "uls-region-WW": "Sangalubongan",
+ "uls-region-SP": "Espesial",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Aprika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Tengnga a Daya",
+ "uls-region-PA": "Pasipiko",
+ "uls-region-all": "Amin a pagsasao",
+ "uls-no-results-found": "Awan dagiti nabirukan a resulta",
+ "uls-common-languages": "Dagiti maisingasing a pagsasao",
+ "uls-no-results-suggestion-title": "Mabalin nga interesadoka iti:",
+ "uls-search-help": "Mabalinmo ti agbiruk babaen ti nagan ti pagsasao, nagan ti eskritu, ISO a kodigo ti pagsasao wenno agbasabasaka babaen ti rehion.",
+ "uls-search-placeholder": "Agbiruk para iti maysa a pagsasao"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/inh.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/inh.json
new file mode 100644
index 00000000..3310e8bf
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/inh.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Adam-Yourist",
+ "Sapral Mikail"
+ ]
+ },
+ "uls-region-WW": "Дерригача дунен",
+ "uls-region-SP": "ЛаьрххIа дараш",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Ази",
+ "uls-region-ME": "Гаргара Малхбоале",
+ "uls-region-PA": "Океани",
+ "uls-region-all": "Деррига метташ",
+ "uls-no-results-found": "Корадаьдац",
+ "uls-common-languages": "Харжа оттадаь дола метташ",
+ "uls-no-results-suggestion-title": "Ер метташ шун теркдар т|алаца мега:",
+ "uls-search-help": "Меттай ц|ераца е йоазувдарца лаха тарло, иззамо ISO-меттач|егаца е купаца тахка а.",
+ "uls-search-placeholder": "Мотт лахар"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/io.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/io.json
new file mode 100644
index 00000000..f4793221
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/io.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Algentem",
+ "Joao Xavier",
+ "Robin van der Vliet"
+ ]
+ },
+ "uls-region-WW": "Tota mondo",
+ "uls-region-SP": "Specala",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azia",
+ "uls-region-ME": "Mez-Esto",
+ "uls-region-PA": "Pacifiko",
+ "uls-region-all": "Omna lingui",
+ "uls-no-results-found": "Ne trovis ulo",
+ "uls-common-languages": "Sugestanta lingui",
+ "uls-no-results-suggestion-title": "Vu povas havar intereso pri:",
+ "uls-search-help": "Vu povas serchar segun linguala kodexo, nomo dil 'script', kodexo ISO por la linguo, o vu povas serchar segun la regiono.",
+ "uls-search-placeholder": "Serchar linguo"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/is.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/is.json
new file mode 100644
index 00000000..d1d77dae
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/is.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Snævar"
+ ]
+ },
+ "uls-region-WW": "Á heimsvísu",
+ "uls-region-SP": "Sérstök",
+ "uls-region-AM": "Ameríka",
+ "uls-region-AF": "Afríka",
+ "uls-region-EU": "Evrópa",
+ "uls-region-AS": "Asía",
+ "uls-region-ME": "Mið-Austurlönd",
+ "uls-region-PA": "Kyrrahaf",
+ "uls-region-all": "Öll tungumál",
+ "uls-no-results-found": "Ekkert fannst",
+ "uls-common-languages": "Uppástungur að tungumálum",
+ "uls-no-results-suggestion-title": "Þú gætir haft áhuga á:",
+ "uls-search-help": "Þú getur leitað eftir nafni tungumáls, nafni skriftunar, ISO kóða tungumálsins eða þú getur leitað eftir svæði.",
+ "uls-search-placeholder": "Leita eftir tungumáli"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/it.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/it.json
new file mode 100644
index 00000000..45060d1a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/it.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Beta16",
+ "Gianfranco",
+ "Macofe"
+ ]
+ },
+ "uls-region-WW": "Tutto il mondo",
+ "uls-region-SP": "Speciale",
+ "uls-region-AM": "America",
+ "uls-region-AF": "Africa",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Medio oriente",
+ "uls-region-PA": "Pacifico",
+ "uls-region-all": "Tutte le lingue",
+ "uls-no-results-found": "Nessun risultato trovato",
+ "uls-common-languages": "Lingue suggerite",
+ "uls-no-results-suggestion-title": "Puoi essere interessato a:",
+ "uls-search-help": "È possibile cercare per nome, nome dello script, codice ISO della lingua o si può navigare tramite regione.",
+ "uls-search-placeholder": "Cerca una lingua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ja.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ja.json
new file mode 100644
index 00000000..3e8bd32c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ja.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fryed-peach",
+ "Otokoume",
+ "Santhosh.thottingal",
+ "Shirayuki"
+ ]
+ },
+ "uls-region-WW": "全世界",
+ "uls-region-SP": "特殊",
+ "uls-region-AM": "アメリカ",
+ "uls-region-AF": "アフリカ",
+ "uls-region-EU": "ヨーロッパ",
+ "uls-region-AS": "アジア",
+ "uls-region-ME": "中東",
+ "uls-region-PA": "太平洋地域",
+ "uls-region-all": "すべての言語",
+ "uls-no-results-found": "見つかりませんでした",
+ "uls-common-languages": "提案された言語",
+ "uls-no-results-suggestion-title": "もしかして:",
+ "uls-search-help": "言語名、文字体系名、言語の ISO コードで検索できます。地域別の一覧から選択することもできます。",
+ "uls-search-placeholder": "言語を検索"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/jv.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/jv.json
new file mode 100644
index 00000000..14611f11
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/jv.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "NoiX180"
+ ]
+ },
+ "uls-region-WW": "Saindenging donya",
+ "uls-region-SP": "Mirunggan",
+ "uls-region-AM": "Amérikah",
+ "uls-region-AF": "Afrikah",
+ "uls-region-EU": "Éropah",
+ "uls-region-AS": "Asiah",
+ "uls-region-ME": "Wétan Tengah",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Kabèh basa",
+ "uls-no-results-found": "Wohing golèk ora ana",
+ "uls-common-languages": "Basa sing kaprayogakaké",
+ "uls-no-results-suggestion-title": "Panjenengan bokmanawa suka ing:",
+ "uls-search-help": "Panjenengan bisa golèk lumantar jeneng basa, jeneng aksara, kodhe ISO basa, utawa panjengan bisa luru miturut wewengkon.",
+ "uls-search-placeholder": "Golèk basa"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ka.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ka.json
new file mode 100644
index 00000000..cb1960ba
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ka.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "David1010",
+ "MIKHEIL",
+ "Გიო ოქრო"
+ ]
+ },
+ "uls-region-WW": "მსოფლიო",
+ "uls-region-SP": "სპეციალური",
+ "uls-region-AM": "ამერიკა",
+ "uls-region-AF": "აფრიკა",
+ "uls-region-EU": "ევროპა",
+ "uls-region-AS": "აზია",
+ "uls-region-ME": "ახლო აღმოსავლეთი",
+ "uls-region-PA": "ოკეანეთი",
+ "uls-region-all": "ყველა ენა",
+ "uls-no-results-found": "შედეგი ვერ მოიძებნა",
+ "uls-common-languages": "შემოთავაზებული ენები",
+ "uls-no-results-suggestion-title": "იქნებ თქვენ ამ ენებმა დაგაინტერესოთ:",
+ "uls-search-help": "ძიება შესაძლებელია ენის სახელით ან დამწერლობით, ენის ISO-კოდით ან რეგიონის მიხედვით.",
+ "uls-search-placeholder": "ენის მოძებნა"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/kab.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/kab.json
new file mode 100644
index 00000000..cceadc62
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/kab.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amazigh84",
+ "Belkacem77",
+ "Mezgoug",
+ "Mmistmurt",
+ "Sayem AtVkm",
+ "SlimaneAmiri",
+ "YouvaDjouadi"
+ ]
+ },
+ "uls-region-WW": "Deg umaḍal meṛṛa",
+ "uls-region-SP": "Uzzig",
+ "uls-region-AM": "Tamrikt",
+ "uls-region-AF": "Tafriqt",
+ "uls-region-EU": "Turuft",
+ "uls-region-AS": "Asya",
+ "uls-region-ME": "Asammar Alemmas",
+ "uls-region-PA": "Amelwi",
+ "uls-region-all": "Akk tutlayin",
+ "uls-no-results-found": "Ur d-yufi kra seg unadi",
+ "uls-common-languages": "Tutlayin i d-yettwasumren",
+ "uls-no-results-suggestion-title": "Ahat ad tebɣuḍ:",
+ "uls-search-help": "Tzemreḍ ad tnadiḍ s yisem n tutlayt, s yisem n tira, s tengalt ISO n tutlayt neɣ tzemreḍ ad tinigeḍ tamnaḍt tamnaḍt.",
+ "uls-search-placeholder": "Nadi ɣef tutlayt"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/kcg.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/kcg.json
new file mode 100644
index 00000000..8443ab76
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/kcg.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Kambai Akau"
+ ]
+ },
+ "uls-region-WW": "Swanta hu a̱mgba̱m",
+ "uls-region-SP": "Wat khwo",
+ "uls-region-AM": "A̱merika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Yurop",
+ "uls-region-AS": "A̱siya",
+ "uls-region-ME": "A̱ka̱wa̱tyia̱ A̱tyin",
+ "uls-region-PA": "Pa̱si̱fi̱k",
+ "uls-region-all": "A̱mgba̱m lilyem",
+ "uls-no-results-found": "Záng nshyia̱ bah",
+ "uls-common-languages": "Nwuat shim lilyem",
+ "uls-no-results-suggestion-title": "A bye cat:",
+ "uls-search-help": "A maai a zop di̱n vak a̱lyoot a̱lyem, a̱lyoot lyuut, zwunzwuo ISO a̱lyem ji ku a maai nyia̱ brauzin fam a̱byin.",
+ "uls-search-placeholder": "Zop a̱lyem"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/khw.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/khw.json
new file mode 100644
index 00000000..d006a8ad
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/khw.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Rachitrali"
+ ]
+ },
+ "uls-region-WW": "پورا دنیا",
+ "uls-region-AM": "آمریکہ",
+ "uls-region-AF": "افریقہ",
+ "uls-region-EU": "یوروپ",
+ "uls-region-AS": "ایشیاء",
+ "uls-region-ME": "مشرق وسطی"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/kiu.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/kiu.json
new file mode 100644
index 00000000..5d23051b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/kiu.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Orbot707"
+ ]
+ },
+ "uls-region-WW": "Dınyayi",
+ "uls-region-SP": "Xısusi",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Awrupa",
+ "uls-region-AS": "Asya",
+ "uls-region-ME": "Rocvetışê Miyani",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Zoni pêro",
+ "uls-no-results-found": "Neticeyi nêvêniyayi",
+ "uls-common-languages": "Zıwanê ke estê.",
+ "uls-no-results-suggestion-title": "Belki şıma cıya eleqederi:",
+ "uls-search-help": "Şıma şenê name dê zıwaniya, skript kodiya, ISO qodiya ya ki mıntıqa heta cıgeyrayış bıkerê.",
+ "uls-search-placeholder": "Yew zıwani cı geyre"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/kjh.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/kjh.json
new file mode 100644
index 00000000..7af2eefa
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/kjh.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Андрей Саг."
+ ]
+ },
+ "uls-region-WW": "Прай чирдеге",
+ "uls-region-SP": "Ӧнетін",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Чағынғы Іскер",
+ "uls-region-PA": "Амыр",
+ "uls-region-all": "Прай тіллер",
+ "uls-no-results-found": "Салтарларын табалполбан",
+ "uls-common-languages": "Чӧпха пирелген тіллер",
+ "uls-no-results-suggestion-title": "Пасха тіллер пирелче",
+ "uls-search-help": "Сілерге пирелче тілдіӊ адыныӊ, пічіктіӊ, ISO-кодтыӊ тілирге алай регионныӊ кӧрерге",
+ "uls-search-placeholder": "Тілде тілирге"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/kjp.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/kjp.json
new file mode 100644
index 00000000..2d3e5ed1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/kjp.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Rul1902"
+ ]
+ },
+ "uls-region-WW": "ခါန်ႋညာညာႋသါ်",
+ "uls-region-SP": "အ်ုခေါဟ်",
+ "uls-region-AM": "အ်ုမေရိကိုင်",
+ "uls-region-AF": "အာဖရိက",
+ "uls-region-EU": "ဥရဴပ",
+ "uls-region-AS": "အာယှ",
+ "uls-region-ME": "အ်ုကၠာမူႋနုက်ခဝ့်",
+ "uls-region-PA": "ပ်ုစိဖေံ",
+ "uls-region-all": "ဆ်ုခၠါင်ဘာႋသာ့လုက်ဆိင့်",
+ "uls-no-results-found": "အ်ုတင်ၮေဝ်ႋအှ် လ်ုဍးၜး",
+ "uls-common-languages": "ဖှ်ေဆ်ုကုံး ဆ်ုခၠါင်ဘာႋသာ့လ်ုဖး",
+ "uls-no-results-suggestion-title": "ၮ်ုမ်ုသာ့ထိင်ၜးဆ်ု:",
+ "uls-search-help": "ဆ်ုခၠါင်ဘာႋသာ့လ်ုမိင်မိင် ၮ်ုအင်းၰူ့ၮေဝ်ႋၜးသာစာ်ၜိုဝ် အင်းၰူ့ ၜးဆါင့်အ်ုသီးလိက်ဖၠုံးၯေဝ်၊ ISO ဝီႋဖၠုံးၜီးၜါ်သီးမွာဲၯေဝ် လ်ုမွာဲၜး လေဝ်အင်းၰူ့ၮေဝ်ႋဝေ့ ဆ်ုလင်ႋသီးသှ်ေဆေဝ်ႋလှ်။",
+ "uls-search-placeholder": "မ်ုအင်းၰူ့ ဆ်ုခၠါင်လ်ုမိင်ၯင်"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/kk-cyrl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/kk-cyrl.json
new file mode 100644
index 00000000..ba124d38
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/kk-cyrl.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Arystanbek",
+ "Fontan 030"
+ ]
+ },
+ "uls-region-WW": "Әлемдік тілдер",
+ "uls-region-SP": "Арнайы",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Еуропа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Таяу шығыс",
+ "uls-region-PA": "Тынық мұхит",
+ "uls-region-all": "Барлық тілдер",
+ "uls-no-results-found": "Ешбір нәтиже табылмады",
+ "uls-common-languages": "Ортақ тілдер",
+ "uls-no-results-suggestion-title": "Сіз қызықтауыңыз мүмкін:",
+ "uls-search-help": "Тіл атауы бойынша, скрипт аты, тілдің ISO коды бойынша ізей аласыз немесе аумағы бойынша шола аласыз.",
+ "uls-search-placeholder": "Тілді іздеу"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/km.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/km.json
new file mode 100644
index 00000000..5a98da38
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/km.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Sovichet",
+ "គីមស៊្រុន"
+ ]
+ },
+ "uls-region-WW": "ទូទាំង​ពិភពលោក",
+ "uls-region-SP": "ពិសេស",
+ "uls-region-AM": "អាមេរិក",
+ "uls-region-AF": "អាហ្វ្រិក",
+ "uls-region-EU": "អឺរ៉ុប",
+ "uls-region-AS": "អាស៊ី",
+ "uls-region-ME": "មជ្ឈិមបូព៌ា",
+ "uls-region-PA": "ប៉ាស៊ីភិច",
+ "uls-region-all": "ភាសាទាំងអស់",
+ "uls-no-results-found": "រកមិនឃើញលទ្ធផល",
+ "uls-common-languages": "ភាសាបេក្ខភាព",
+ "uls-no-results-suggestion-title": "អ្នក​អាច​នឹង​ចាប់​អារម្មណ៍​លើ៖",
+ "uls-search-help": "អ្នក​អាច​ស្វែង​រក​តាម​ឈ្មោះ​ភាសា, ឈ្មោះ​ស្គ្រីប, កូដ ISO នៃ​ភាសា ឬ​អ្នក​អាច​រុករក​តាម​តំបន់។",
+ "uls-search-placeholder": "ស្វែងរកភាសា"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/kn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/kn.json
new file mode 100644
index 00000000..a5b29f87
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/kn.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ashay vb",
+ "Omshivaprakash",
+ "Shankar"
+ ]
+ },
+ "uls-region-WW": "ಪ್ರಪಂಚದಾದ್ಯಂತ",
+ "uls-region-SP": "ವಿಶೇಷ",
+ "uls-region-AM": "ಅಮೇರಿಕ",
+ "uls-region-AF": "ಆಫ್ರಿಕ",
+ "uls-region-EU": "ಯುರೋಪ್",
+ "uls-region-AS": "ಏಷ್ಯಾ",
+ "uls-region-ME": "ಮಿಡಲ್ ಈಸ್ಟ್",
+ "uls-region-PA": "ಫೆಸಿಫಿಕ್",
+ "uls-region-all": "ಎಲ್ಲಾ ಭಾಷೆಗಳು",
+ "uls-no-results-found": "ಯಾವುದೇ ಫಲಿತಾಂಶಗಳಿಲ್ಲ",
+ "uls-common-languages": "ಸೂಚಿಸಿದ ಭಾಷೆಗಳು",
+ "uls-no-results-suggestion-title": "ನಿಮಗೆ ಇದರಲ್ಲಿ ಆಸಕ್ತಿ ಇರಬಹುದು:",
+ "uls-search-help": "ನೀವು ಭಾಷೆಯ ಹೆಸರು, ಸ್ಕ್ರಿಪ್ಟ್ ಹೆಸರು, ಐಎಸ್ಒ ಭಾಷೆಯ ಕೋಡ್ ಮೂಲಕ ಹುಡುಕಬಹುದು ಅಥವಾ ನೀವು ಪ್ರದೇಶದ ಪ್ರಕಾರ ಬ್ರೌಸ್ ಮಾಡಬಹುದು.",
+ "uls-search-placeholder": "ಭಾಷೆಗಾಗಿ ಹುಡುಕಿ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ko.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ko.json
new file mode 100644
index 00000000..aa94c427
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ko.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hibm98",
+ "IRTC1015",
+ "Ykhwong",
+ "아라"
+ ]
+ },
+ "uls-region-WW": "전 세계",
+ "uls-region-SP": "특수",
+ "uls-region-AM": "아메리카",
+ "uls-region-AF": "아프리카",
+ "uls-region-EU": "유럽",
+ "uls-region-AS": "아시아",
+ "uls-region-ME": "중동",
+ "uls-region-PA": "태평양",
+ "uls-region-all": "모든 언어",
+ "uls-no-results-found": "결과가 없습니다",
+ "uls-common-languages": "제안 언어",
+ "uls-no-results-suggestion-title": "이것을 찾으셨나요:",
+ "uls-search-help": "언어 이름, 문자 체계 이름, 언어의 ISO 코드로 검색할 수 있으며 지역별로 찾아볼 수 있습니다.",
+ "uls-search-placeholder": "언어 검색"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/krc.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/krc.json
new file mode 100644
index 00000000..1a0c8924
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/krc.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ernác",
+ "Iltever"
+ ]
+ },
+ "uls-region-WW": "Бютеудуниялы",
+ "uls-region-SP": "Айырмалы",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Джууукъ Кюнчыгъыш",
+ "uls-region-PA": "Океания",
+ "uls-no-results-found": "Джукъ да табылмады",
+ "uls-common-languages": "Автомат халда айырылгъан тилле",
+ "uls-no-results-suggestion-title": "Бу теллеге талпый болурмусуз:",
+ "uls-search-help": "Тилни неда джазманы атына кёре излерге боллукъсуз, тилни ISO-кодуна кёре неда регионнга кёре къараргъа:",
+ "uls-search-placeholder": "Тил излеу"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ks-arab.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ks-arab.json
new file mode 100644
index 00000000..4f6d212f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ks-arab.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Iflaq",
+ "Tajamul9"
+ ]
+ },
+ "uls-region-WW": "پوٗرٕ دُنیاہس مٕنٛز",
+ "uls-region-SP": "خاص",
+ "uls-region-AM": "امریٖکا",
+ "uls-region-AF": "افریقہ",
+ "uls-region-EU": "یورَپ",
+ "uls-region-AS": "ایشیا",
+ "uls-region-ME": "مشرق وسطی",
+ "uls-region-PA": "بحر الکاہل",
+ "uls-region-all": "تَمام زَبان",
+ "uls-no-results-found": "کانٛہہ تہِ نتٲیِج آو نہٕ لبنہٕ",
+ "uls-common-languages": "تجویٖز دِنہٕ آمَثہٕ زبانہٕ",
+ "uls-no-results-suggestion-title": "شاید ما ٲسِیوٚ تۄہہِ یتھ منٛز دِلچسپی تھاوان:",
+ "uls-search-help": "تُہہ ہیکیوٚ ژھٲرِتھ زبٲنی ناوٕ سٕتی تہِ، سِکرِپٹ ناوٕ سٕتی، ISO کوڈ آف لَنگویج یا تُہہ ہیکیوٚ طبقہٕ ذٕریعہ تہِ ژھأرِتھ",
+ "uls-search-placeholder": "زَبان کٔرِو تَلاش"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ksh.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ksh.json
new file mode 100644
index 00000000..701f797c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ksh.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Purodha"
+ ]
+ },
+ "uls-region-WW": "Fö de jannze Ääd",
+ "uls-region-SP": "Extras - kein Schprohche",
+ "uls-region-AM": "Ammärrika",
+ "uls-region-AF": "Affrikka",
+ "uls-region-EU": "Europpa",
+ "uls-region-AS": "Aasije",
+ "uls-region-ME": "der meddlere Oßte",
+ "uls-region-PA": "der Paziffesche Oozejaan",
+ "uls-no-results-found": "Nix jefonge",
+ "uls-common-languages": "Vörjeschlonn Schprohche",
+ "uls-no-results-suggestion-title": "Do künnts Schpaßß hann aan:",
+ "uls-search-help": "Do kanns noh Schprohche söhke övver der Nahme, dä Schreff iehre Nahme, et Köözel noh dä ISO-Norrm udder övver övver de Rejuhne.",
+ "uls-search-placeholder": "En Schprohch Söhke"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ksw.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ksw.json
new file mode 100644
index 00000000..65f87d29
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ksw.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jaeminlovetaejoon",
+ "SawJaemin"
+ ]
+ },
+ "uls-region-WW": "ဟီခိၣ်ဒီဖျၢၣ်",
+ "uls-region-SP": "လီၤဆီ",
+ "uls-region-AM": "အမဲရကၤ",
+ "uls-region-AF": "အၤဖြံၤကၤ",
+ "uls-region-EU": "ယူရပၤ",
+ "uls-region-AS": "အ့ၡၢၣ်",
+ "uls-region-ME": "မုၢ်ထီၣ်တၢ်ခၢၣ်သးလီၢ်ကဝီၤ",
+ "uls-region-PA": "ဖၢဆ့ၣ်ဖ့ၣ်",
+ "uls-region-all": "ကျိာ်တဖၣ်ခဲလၢာ်",
+ "uls-no-results-found": "တၢ်စံးဆၢတအိၣ်ဘၣ်",
+ "uls-common-languages": "မၤကွၢ်ကျိာ်တဖၣ်အံၤ",
+ "uls-no-results-suggestion-title": "ဘၣ်သ့ၣ်သ့ၣ်နကအိၣ်ဒီးတၢ်သးစဲလၢ:",
+ "uls-search-help": "နဃုကွၢ်လၢကျိာ်အမံၤသ့ မ့ၢ်တမ့ၢ် လၢလံာ်မိၢ်ပှၢ်အမံၤသ့ မ့ၢ်တမ့ၢ် လၢအ ISO မံၤသ့ မ့ၢ်တမ့ၢ် နကွၢ်ဃုလၢ တၢ်လီၢ်သ့စ့ၢ်ကီးလီၤ.",
+ "uls-search-placeholder": "ကွၢ်ဃုကျိာ်တကျိာ်"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ku-latn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ku-latn.json
new file mode 100644
index 00000000..81579f7a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ku-latn.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bikarhêner",
+ "Cûndûllah el-Kurdî",
+ "George Animal",
+ "Ghybu",
+ "Velg"
+ ]
+ },
+ "uls-region-WW": "Li hemû cîhanê",
+ "uls-region-SP": "Taybet",
+ "uls-region-AM": "Amerîka",
+ "uls-region-AF": "Afrîka",
+ "uls-region-EU": "Ewropa",
+ "uls-region-AS": "Asya",
+ "uls-region-ME": "Rojhilata Navîn",
+ "uls-region-PA": "Pasîfîk",
+ "uls-region-all": "Hemû ziman",
+ "uls-no-results-found": "Tu encam nehatin dîtin",
+ "uls-common-languages": "Zimanên pêşniyarkirî",
+ "uls-no-results-suggestion-title": "Pêwendîya we dikara bikişîne:",
+ "uls-search-help": "Hûn lêgerîna xwe li gor nava zimanê, koda ISOyê an jî li gor herêmê dikarin bikin.",
+ "uls-search-placeholder": "Li zimanekî bigere"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ky.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ky.json
new file mode 100644
index 00000000..19e8150f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ky.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Growingup",
+ "Maksat",
+ "Викиней"
+ ]
+ },
+ "uls-region-WW": "Бүткүл дүйнөлүк",
+ "uls-region-SP": "Атайын",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Жакынкы Чыгыш",
+ "uls-region-PA": "Океания",
+ "uls-region-all": "Бардык тилдер",
+ "uls-no-results-found": "Жыйынтыктар табылган жок",
+ "uls-common-languages": "Жалпы тилдер",
+ "uls-no-results-suggestion-title": "Балким бул тилдер сизди кызыктырат:",
+ "uls-search-help": "Сиз тилдердин аталыштары, скрипта, тилдердин ISO коддору же болбосо аймагы боюнча издесеңиз болот.",
+ "uls-search-placeholder": "Издөө тили"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/lb.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/lb.json
new file mode 100644
index 00000000..2287706c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/lb.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robby"
+ ]
+ },
+ "uls-region-WW": "Weltwäit",
+ "uls-region-SP": "Spezial",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asien",
+ "uls-region-ME": "Mëttleren Osten",
+ "uls-region-PA": "Pazifik",
+ "uls-region-all": "All Sproochen",
+ "uls-no-results-found": "Näischt fonnt",
+ "uls-common-languages": "Proposéiert Sproochen",
+ "uls-no-results-suggestion-title": "Dir kënnt interesséiert sinn un:",
+ "uls-search-help": "Dir kënnt mam Numm vun der Sprooch, Numm vun der Schrëft, ISO-Code vun der Sprooch oder iwwer eng Regioun sichen.",
+ "uls-search-placeholder": "No enger Sprooch sichen"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/lez.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/lez.json
new file mode 100644
index 00000000..c82e730a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/lez.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Namik",
+ "Soul Train"
+ ]
+ },
+ "uls-region-WW": "Вири дуьньядин",
+ "uls-region-SP": "Махсус",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Юкьван РагъэкъечӀдай пад",
+ "uls-region-PA": "Океания",
+ "uls-region-all": "Вири чӀалар",
+ "uls-common-languages": "Теклифнавай чӀалар",
+ "uls-search-help": "Вавай чӀалан дахьайтӀа кхьинвилин тӀварунай къекъвез жеда, чӀалан ISO-коддай дахьайтӀа региондай килигиз жеда.",
+ "uls-search-placeholder": "ЧӀал жагъурун"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/li.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/li.json
new file mode 100644
index 00000000..f2be7e30
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/li.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ooswesthoesbes",
+ "Pahles",
+ "Robin van der Vliet",
+ "Robin0van0der0vliet"
+ ]
+ },
+ "uls-region-WW": "Waereldwied",
+ "uls-region-SP": "Sjpesjaal",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azië",
+ "uls-region-ME": "Midde-Ooste",
+ "uls-region-PA": "Pacifisch gebied",
+ "uls-region-all": "Al spraoke",
+ "uls-no-results-found": "Gein rizzeltaote gevónje",
+ "uls-common-languages": "Spraoksuggesties",
+ "uls-no-results-suggestion-title": "Doe bös mesjiens geïnterseerdj in:",
+ "uls-search-help": "Doe kans zeuken op spraoknaam, sjrifnaam, ISO-code vanne spraok of doe kans blajere de regio.",
+ "uls-search-placeholder": "Sjpraok zeuke"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/lki.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/lki.json
new file mode 100644
index 00000000..11080c67
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/lki.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hosseinblue",
+ "Lakzon"
+ ]
+ },
+ "uls-region-WW": "کؤل(گشت)جەهان",
+ "uls-region-SP": "ویژە",
+ "uls-region-AM": "ئآمریکا",
+ "uls-region-AF": "ئآفریقا",
+ "uls-region-EU": "اؤرووپا",
+ "uls-region-AS": "ئاسیا",
+ "uls-region-ME": "(غرب نامِن(خاوورمیانۀ",
+ "uls-region-PA": "ئآرؤم",
+ "uls-no-results-found": "نتیجه أدی نؤی(پئا نؤی)",
+ "uls-common-languages": "زوونەل رایج",
+ "uls-no-results-suggestion-title": ":هائر خووۀشته یۀ بآئ",
+ "uls-search-help": "، مةتۆنین ئۀ وسیلة نؤم زوون مِنی کِین\n نؤم اسکریپت،کد ISO زوونۀ یا مةتۆنین ناحیة(تؤئة) بگئردینو",
+ "uls-search-placeholder": "مِنِی کردن زوون"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/lrc.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/lrc.json
new file mode 100644
index 00000000..1151faac
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/lrc.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lorestani",
+ "Mogoeilor"
+ ]
+ },
+ "uls-region-WW": "کولٛ دۏنیا",
+ "uls-region-SP": "ڤیژٱ",
+ "uls-region-AM": "اْمریکا",
+ "uls-region-AF": "اْفریقا",
+ "uls-region-EU": "اورۊپا",
+ "uls-region-AS": "آسيا",
+ "uls-region-ME": "مؽنجا خاڤٱر",
+ "uls-region-PA": "هوم پاٛڤٱست جهوݩ آوی",
+ "uls-region-all": "همٱ زڤونؽا",
+ "uls-no-results-found": "هيچ نٱتیجاٛيی پاٛدا ناٛیی",
+ "uls-common-languages": "زڤونؽا پیشنهاد بیٱ",
+ "uls-no-results-suggestion-title": "شما مومکنٱ ڤش علاقٱمٱن بۊؽت",
+ "uls-search-placeholder": "پاٛجۊری زڤونی"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/lt.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/lt.json
new file mode 100644
index 00000000..572abd31
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/lt.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Cyklopas",
+ "Eitvys200",
+ "Mantak111",
+ "Manvydasz",
+ "Zygimantus"
+ ]
+ },
+ "uls-region-WW": "Visame pasaulyje",
+ "uls-region-SP": "Specialios",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azija",
+ "uls-region-ME": "Artimieji Rytai",
+ "uls-region-PA": "Ramiojo vandenyno zona",
+ "uls-region-all": "Visos kalbos",
+ "uls-no-results-found": "Rezultatų nerasta",
+ "uls-common-languages": "Siūlomos kalbos",
+ "uls-no-results-suggestion-title": "Galbūt domina:",
+ "uls-search-help": "Galite ieškoti pagal kalbos pavadinimą, scenarijaus pavadinimą, ISO kalbos kodą arba galite naršyti pagal regioną.",
+ "uls-search-placeholder": "Ieškoti kalbos"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/lv.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/lv.json
new file mode 100644
index 00000000..3812f620
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/lv.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Papuass",
+ "Ttdnet"
+ ]
+ },
+ "uls-region-WW": "Visā pasaulē",
+ "uls-region-SP": "Īpašās",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Āfrika",
+ "uls-region-EU": "Eiropa",
+ "uls-region-AS": "Āzija",
+ "uls-region-ME": "Vidējie Austrumi",
+ "uls-region-PA": "Klusā okeāna",
+ "uls-region-all": "Visas valodas",
+ "uls-no-results-found": "Nav atrasts neviens rezultāts",
+ "uls-common-languages": "Ieteiktās valodas",
+ "uls-no-results-suggestion-title": "Jums var būt interesē:",
+ "uls-search-help": "Var meklēt pēc valodas, skripta nosaukuma, valodas ISO koda, vai jūs tos varat pārlūkot pēc reģiona.",
+ "uls-search-placeholder": "Meklēt valodu"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/map-bms.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/map-bms.json
new file mode 100644
index 00000000..c36339d7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/map-bms.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "StefanusRA"
+ ]
+ },
+ "uls-region-WW": "Sak ndonya",
+ "uls-region-SP": "Khusus",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Eropa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Timur Tengah",
+ "uls-region-PA": "Pasifik",
+ "uls-no-results-found": "Ora nemokna hasile",
+ "uls-common-languages": "Basa-basa sing umum",
+ "uls-no-results-suggestion-title": "Rika ndeyane seneng:",
+ "uls-search-help": "Rika teyeng nggoleti nganggo jeneng basa, jeneng skrip, kode ISO ne basa utawa Rika teyeng nggoleti per wilayaeh:",
+ "uls-search-placeholder": "Ngoleti basa"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mg.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mg.json
new file mode 100644
index 00000000..85b5710b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mg.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jagwar"
+ ]
+ },
+ "uls-region-WW": "Erak'izao tontolo izao",
+ "uls-region-SP": "Manokana",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Eoropa",
+ "uls-region-AS": "Azia",
+ "uls-region-ME": "Afovoany Atsinanana",
+ "uls-region-PA": "Pasifika",
+ "uls-region-all": "Fiteny rehetra",
+ "uls-no-results-found": "Tsy nahitana valiny",
+ "uls-common-languages": "Fiteny atao soson-kevitra",
+ "uls-no-results-suggestion-title": "Mety ahitanao tombon-tsoa:",
+ "uls-search-help": "Afaka mikaroka araka ny anaran'ny tenim-pirena, anaran-tsoratra, kaody ISO-n'ny teny na afaka mifidy araky ny faritra.",
+ "uls-search-placeholder": "Hitady fiteny"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/min.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/min.json
new file mode 100644
index 00000000..2e348f3a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/min.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Iwan Novirion"
+ ]
+ },
+ "uls-region-WW": "Saluruah dunia",
+ "uls-region-SP": "Khusuih",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Eropa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Timua Tangah",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Sado bahaso",
+ "uls-no-results-found": "Hasil indak basobok",
+ "uls-common-languages": "Bahaso nan disarankan",
+ "uls-no-results-suggestion-title": "Sanak mungkin tatarik pado:",
+ "uls-search-help": "Sanak dapek mancari jo namo bahaso, namo skrip, kode ISO bahaso atau dapek pulo manalusuri manuruik wilayahnyo.",
+ "uls-search-placeholder": "Pancarian bahaso"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mk.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mk.json
new file mode 100644
index 00000000..aa43d5d1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mk.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bjankuloski06"
+ ]
+ },
+ "uls-region-WW": "Светски",
+ "uls-region-SP": "Посебни",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азија",
+ "uls-region-ME": "Близок Исток",
+ "uls-region-PA": "Океанија",
+ "uls-region-all": "Сите јазици",
+ "uls-no-results-found": "Не пронајдов ништо",
+ "uls-common-languages": "Предложени јазици",
+ "uls-no-results-suggestion-title": "Може да ве интересираат:",
+ "uls-search-help": "Можете да пребарувате по име на јазикот или писмото, по ISO-код на јазикот или пак да разгледате по региони.",
+ "uls-search-placeholder": "Пребарување на јазик"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ml.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ml.json
new file mode 100644
index 00000000..f2d3d841
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ml.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Praveenp",
+ "Ranjithsiji",
+ "Santhosh.thottingal"
+ ]
+ },
+ "uls-region-WW": "ആഗോള ഭാഷകൾ",
+ "uls-region-SP": "പ്രത്യേക ഭാഷകൾ",
+ "uls-region-AM": "അമേരിക്ക",
+ "uls-region-AF": "ആഫ്രിക്ക",
+ "uls-region-EU": "യൂറോപ്പ്",
+ "uls-region-AS": "ഏഷ്യ",
+ "uls-region-ME": "മദ്ധ്യപൂർവേഷ്യ",
+ "uls-region-PA": "പസഫിക്",
+ "uls-region-all": "എല്ലാ ഭാഷകളും",
+ "uls-no-results-found": "ഒന്നും കണ്ടെത്താനായില്ല",
+ "uls-common-languages": "നിർദ്ദേശിക്കുന്ന ഭാഷകൾ",
+ "uls-no-results-suggestion-title": "താങ്കൾക്കാവശ്യം ഇതായിരിക്കാം:",
+ "uls-search-help": "താങ്കൾക്ക് ഭാഷയുടെ പേര്, ISO കോഡ്, ലിപിയുടെ പേര് എന്നിവ ഉപയോഗിച്ച് തിരയാം. അല്ലെങ്കിൽ ഈ മേഖലകളിൽ തിരയാം:",
+ "uls-search-placeholder": "ഒരു ഭാഷക്കായി തിരയുക"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mn.json
new file mode 100644
index 00000000..82141b94
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mn.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Saihanaaaa",
+ "Wisdom"
+ ]
+ },
+ "uls-region-WW": "Дэлхий даяар",
+ "uls-region-SP": "Тусгай",
+ "uls-region-AM": "Америк",
+ "uls-region-AF": "Африк",
+ "uls-region-EU": "Европ",
+ "uls-region-AS": "Ази",
+ "uls-region-ME": "Дундад Ази",
+ "uls-region-PA": "Номхон далай",
+ "uls-region-all": "Бүх хэл",
+ "uls-no-results-found": "Үр дүн олдсонгүй",
+ "uls-common-languages": "Санал болгож буй хэл",
+ "uls-no-results-suggestion-title": "Санал болгох:",
+ "uls-search-help": "Та хэлээр, скриптийн нэрээр, хэлний ISO кодоор хайж болно, эсвэл газар нутгаар нь харж болно.",
+ "uls-search-placeholder": "Хэлний хайлт"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mnc.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mnc.json
new file mode 100644
index 00000000..7a6693af
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mnc.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Moon0319",
+ "Араси"
+ ]
+ },
+ "uls-region-AM": "᠇ᠮᡝᡵᡳᡴᠠ",
+ "uls-region-EU": "ᠣᡵᠣᠪᠠ",
+ "uls-region-all": "ᡝᡳ᠌ᡨᡝᠨ ᡤᡳᠰᡠᠨ",
+ "uls-no-results-suggestion-title": "ᠠᡳ᠌ᠨᠴᡳ ᠰᡳᠨᡳ ᠠᠮᡠᡵᠠᠩᡤᡝ ᠈"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mni.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mni.json
new file mode 100644
index 00000000..352d5d90
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mni.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Awangba Mangang"
+ ]
+ },
+ "uls-region-WW": "ꯃꯂꯦꯝꯁꯤꯟꯕ ꯊꯨꯡꯅ",
+ "uls-region-SP": "ꯑꯈꯟꯅꯕ",
+ "uls-region-AM": "ꯑꯃꯦꯔꯤꯀꯥ",
+ "uls-region-AF": "ꯑꯐ꯭ꯔꯤꯀꯥ",
+ "uls-region-EU": "ꯏꯎꯔꯣꯞ",
+ "uls-region-AS": "ꯑꯦꯁꯤꯌꯥ",
+ "uls-region-ME": "ꯃꯌꯥꯏꯊꯪꯕ ꯅꯣꯡꯄꯣꯛ",
+ "uls-region-PA": "ꯄꯦꯁꯤꯐꯤꯛ",
+ "uls-region-all": "ꯂꯣꯟ ꯄꯨꯝꯅꯃꯛ",
+ "uls-no-results-found": "ꯃꯁꯤꯒ ꯆꯥꯟꯅꯕ ꯂꯩꯇꯦ",
+ "uls-common-languages": "ꯂꯣꯟꯁꯤꯡ ꯑꯁꯤ ꯍꯥꯏꯕ ꯌꯥꯏ",
+ "uls-no-results-suggestion-title": "ꯅꯪꯅ ꯃꯁꯤꯒꯨꯝꯕꯁꯤ ꯄꯥꯝꯃꯝꯕꯁꯨ ꯌꯥꯏ:",
+ "uls-search-help": "ꯅꯪꯅ ꯊꯤꯕꯥ ꯌꯥꯒꯅꯤ ꯂꯣꯟ ꯃꯃꯤꯡꯅ, ꯃꯌꯦꯛ ꯃꯃꯤꯡꯅ, ꯂꯣꯟꯒꯤ ꯑꯣꯏꯑꯦꯁꯑꯣ ꯀꯣꯗꯅ ꯅꯠꯇ꯭ꯔꯒ ꯅꯪꯅ ꯂꯩꯐꯝꯒꯤ ꯃꯇꯨꯡ ꯏꯟꯅ ꯊꯤꯕꯥ ꯌꯥꯒꯅꯤ ꯫",
+ "uls-search-placeholder": "ꯂꯣꯟ ꯱ ꯊꯤꯕꯥ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mnw.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mnw.json
new file mode 100644
index 00000000..22787da2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mnw.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aue Nai"
+ ]
+ },
+ "uls-region-WW": "ဇမၞော်ဂၠး",
+ "uls-region-SP": "တၟေၚ်",
+ "uls-region-AM": "အမေရိက",
+ "uls-region-AF": "အာဖရိက",
+ "uls-region-EU": "ဥရောပ",
+ "uls-region-AS": "အာယှ",
+ "uls-region-ME": "လဒေါဝ် ဗၟံက်",
+ "uls-region-PA": "ပသဳဖှေတ်",
+ "uls-region-all": "အရေဝ်ဘာသာ သီုဖအိုတ်",
+ "uls-no-results-found": "အရာမဂၠာဲဂှ် မုဟွံဂွံ ဆဵု",
+ "uls-common-languages": "အရေဝ်ဘာသာ မကဵုလဝ်ကသပ်ဂမၠိုၚ်",
+ "uls-no-results-suggestion-title": "မၞး စိုတ်လုပ်စမာန် :",
+ "uls-search-help": "မၞးဂၠာဲကေတ်နကဵု ယၟုအရေဝ်ဘာသာမာန်၊ ယၟုအက္ခရ်, မခတ် ISO ဒဒှ်အရေဝ်ဘာသာ ဟွံသေၚ် မၞးတြးပၠးပတိတ် နကဵု ဒေသမာန်.",
+ "uls-search-placeholder": "ဂၠာဲ သွက် အရေဝ်ဘာသာ မွဲ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mr.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mr.json
new file mode 100644
index 00000000..5efd9759
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mr.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kaajawa",
+ "Mahitgar",
+ "Sureshkhole",
+ "V.narsikar"
+ ]
+ },
+ "uls-region-WW": "वैश्विक",
+ "uls-region-SP": "विशेष",
+ "uls-region-AM": "अमेरीका",
+ "uls-region-AF": "आफ्रीका",
+ "uls-region-EU": "युरोप",
+ "uls-region-AS": "आशिया",
+ "uls-region-ME": "मध्यपूर्व (मिडल इस्ट)",
+ "uls-region-PA": "पॅसिफीक",
+ "uls-region-all": "सर्व भाषा",
+ "uls-no-results-found": "परिणाम सापडले नाही",
+ "uls-common-languages": "सुचविलेल्या भाषा",
+ "uls-no-results-suggestion-title": "तुम्हाला कदाचित यात रुची असेल:",
+ "uls-search-help": "आपण भाषेनुसार, लिपीनुसार, भाषेच्या आयएसओ कोडनुसार शोध घेऊ शकता अथवा प्रदेशानुसार शोधु शकता:",
+ "uls-search-placeholder": "भाषेचा शोध घ्या"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mrh.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mrh.json
new file mode 100644
index 00000000..972a6c3c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mrh.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Teitei Para"
+ ]
+ },
+ "uls-region-WW": "Khizaw zydua",
+ "uls-region-SP": "Eihhrâhpa",
+ "uls-region-AM": "Amerikâ",
+ "uls-region-AF": "Afrikâ",
+ "uls-region-EU": "Urôpâ",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Nochhi liaryh",
+ "uls-region-PA": "Pasifi",
+ "uls-region-all": "Reihchâ zydua",
+ "uls-no-results-found": "Sâkha hmâh y vei",
+ "uls-common-languages": "Khokheipa reihchâzy",
+ "uls-no-results-suggestion-title": "Na paphasa thei'pa reihchâ:",
+ "uls-search-help": "Reihchâ moh, rodâh moh, reihchâ ISO code cvk su hawhta na tlua thei.",
+ "uls-search-placeholder": "Reih sâ kha tlua teh"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ms-arab.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ms-arab.json
new file mode 100644
index 00000000..5e70c130
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ms-arab.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tofeiku"
+ ]
+ },
+ "uls-region-WW": "سلوروه دنيا",
+ "uls-region-SP": "خاص",
+ "uls-region-AM": "اميريکا",
+ "uls-region-AF": "افريکا",
+ "uls-region-EU": "ايروڤه",
+ "uls-region-AS": "اسيا",
+ "uls-region-ME": "تيمور تڠه",
+ "uls-region-PA": "ڤاسيفيک",
+ "uls-region-all": "سموا بهاس",
+ "uls-no-results-found": "تياد حاصيل دجومڤاءي",
+ "uls-common-languages": "بهاس يڠ دچادڠکن",
+ "uls-no-results-suggestion-title": "اندا موڠکين برمينت دالم:",
+ "uls-search-help": "اندا بوليه چاري مڠيکوت نام بهاس، نام توليسن، کود اءي. ايس. او. بهاس اتاو اندا بوليه لاير مڠيکوت رنتاو.",
+ "uls-search-placeholder": "چاري بهاس"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ms.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ms.json
new file mode 100644
index 00000000..953b89d0
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ms.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Anakmalaysia",
+ "Tofeiku"
+ ]
+ },
+ "uls-region-WW": "Seluruh Dunia",
+ "uls-region-SP": "Khas",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Eropah",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Timur Tengah",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Semua bahasa",
+ "uls-no-results-found": "Tiada hasil carian",
+ "uls-common-languages": "Bahasa yang dicadangkan",
+ "uls-no-results-suggestion-title": "Mungkin anda ingin mencari:",
+ "uls-search-help": "Anda boleh mencari mengikut nama bahasa, nama tulisan, kod bahasa ISO ataupun menyemak seimbas mengikut kawasan.",
+ "uls-search-placeholder": "Cari bahasa"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mt.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mt.json
new file mode 100644
index 00000000..6f879468
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mt.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Chrisportelli"
+ ]
+ },
+ "uls-region-WW": "Madwar id-dinja",
+ "uls-region-SP": "Speċjali",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Ewropa",
+ "uls-region-AS": "Asja",
+ "uls-region-ME": "Lvant Nofsani",
+ "uls-region-PA": "Paċifiku",
+ "uls-region-all": "Kull lingwa",
+ "uls-no-results-found": "L-ebda riżultat",
+ "uls-common-languages": "Lingwi ssuġġeriti",
+ "uls-no-results-suggestion-title": "Tista' tkun interessat fil-:",
+ "uls-search-help": "Tista' tfittex skont l-isem tal-lingwa, l-isem tal-iskript, kodiċi tal-lingwa ISO jew tista' tinnaviga skont ir-reġjun.",
+ "uls-search-placeholder": "Fittex lingwa"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mwl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mwl.json
new file mode 100644
index 00000000..223cc7fb
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mwl.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Athena in Wonderland",
+ "MokaAkashiyaPT"
+ ]
+ },
+ "uls-region-WW": "Global",
+ "uls-region-SP": "Special",
+ "uls-region-AM": "América",
+ "uls-region-AF": "África",
+ "uls-region-EU": "Ouropa",
+ "uls-region-AS": "Ásia",
+ "uls-region-ME": "Médio Ouriente",
+ "uls-region-PA": "Pacífico",
+ "uls-region-all": "Todas las lhénguas",
+ "uls-no-results-found": "Nó fúrun ancontrados resultados",
+ "uls-common-languages": "Lhénguas sugeridas",
+ "uls-no-results-suggestion-title": "Puode star antressado an:",
+ "uls-search-help": "Puode percurar pul nome de la lhéngua, pul tipo de abc, código ISO de la lhéngua, ó puode nabegar por region.",
+ "uls-search-placeholder": "Percurar por lhéngua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/my.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/my.json
new file mode 100644
index 00000000..d08c0477
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/my.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dr Lotus Black",
+ "Ninjastrikers"
+ ]
+ },
+ "uls-region-WW": "တစ်ကမ္ဘာလုံး",
+ "uls-region-SP": "အထူး",
+ "uls-region-AM": "အမေရိက",
+ "uls-region-AF": "အာဖရိက",
+ "uls-region-EU": "ဥရောပ",
+ "uls-region-AS": "အာရှ",
+ "uls-region-ME": "အရှေ့အလယ်ပိုင်း",
+ "uls-region-PA": "ပစိဖိတ်",
+ "uls-region-all": "ဘာသာစကားများ အားလုံး",
+ "uls-no-results-found": "မည်သည့်ရလဒ်မျှ မရပါ",
+ "uls-common-languages": "အကြံပေးသော ဘာသာစကားများ",
+ "uls-no-results-suggestion-title": "သင် စိတ်ဝင်စားကောင်းစိတ်ဝင်စားနိုင်သည်မှာ-",
+ "uls-search-help": "ဘာသာစကားအမည်၊ ရေးသားပုံစနစ်အမည်၊ ဘာသာစကား၏ အိုင်အက်စ်အိုကုဒ် သို့မဟုတ် ဒေသအလိုက် ရှာဖွေနိုင်သည်။",
+ "uls-search-placeholder": "ဘာသာစကားတစ်ခုအတွက် ရှာဖွေရန်"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/mzn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/mzn.json
new file mode 100644
index 00000000..35239324
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/mzn.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "محک"
+ ]
+ },
+ "uls-region-WW": "جهون میون",
+ "uls-region-SP": "ویژه",
+ "uls-region-AM": "آمریکا",
+ "uls-region-AF": "آفریقا",
+ "uls-region-EU": "اروپا",
+ "uls-region-AS": "آسیا",
+ "uls-region-ME": "خاورمیونه",
+ "uls-region-PA": "آروم اقیانوس",
+ "uls-no-results-found": "هچّی پیدا نیّه",
+ "uls-common-languages": "رایج زوونون",
+ "uls-no-results-suggestion-title": "شاید دوست دارین:",
+ "uls-search-help": "شما بتونّی زوون نوم، اسکریپ نوم، زوونِ استانداردِ کد یا ونه منطقه جه شه دِلِوستِ زوون ره پیدا هاکنین.",
+ "uls-search-placeholder": "زوونِ جستجو"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nah.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nah.json
new file mode 100644
index 00000000..d4a1a510
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nah.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Akapochtli",
+ "Ricardo gs",
+ "Taresi",
+ "Teòtlalili"
+ ]
+ },
+ "uls-region-WW": "Nohuiyanyoh",
+ "uls-region-SP": "Noncuahquizqui",
+ "uls-region-AM": "America",
+ "uls-region-AF": "Africa",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Ihuic Tlahuiztlampa",
+ "uls-region-PA": "Pacifico",
+ "uls-region-all": "Ipan mochi tlahtolli",
+ "uls-no-results-found": "Ahmo omahcic tlen motemoa",
+ "uls-common-languages": "Mitzhuelittaz inin tlahtolli",
+ "uls-no-results-suggestion-title": "Ahzo timoyolehuaz ica inin:",
+ "uls-search-help": "Huel tictemoz in tlahtolli ipal tlahtolli itoca, nozo itlahcuilol, nozo ipal ISO imachiyonecaquiliz, nozo huel tictemoz zan iuh itlalpan.",
+ "uls-search-placeholder": "Tlatemoliztli itech ce tlahtolli"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nap.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nap.json
new file mode 100644
index 00000000..542831c7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nap.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "C.R.",
+ "Chelin",
+ "Finizio",
+ "Ruthven"
+ ]
+ },
+ "uls-region-WW": "Munno intero",
+ "uls-region-SP": "Speciale",
+ "uls-region-AM": "Amereca",
+ "uls-region-AF": "Afreca",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Medio oriente",
+ "uls-region-PA": "Pacifico",
+ "uls-region-all": "Tuttuquante 'e llengue",
+ "uls-no-results-found": "Nisciuno risultato",
+ "uls-common-languages": "Llèngue suggerite",
+ "uls-no-results-suggestion-title": "Te po' interessà a:",
+ "uls-search-help": "Puo cercà pe nomme, nomme dd’’o script, codece ISO dd’’a lengua o naviggà nfra ’e reggiune.",
+ "uls-search-placeholder": "Truòva 'na lengua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nb.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nb.json
new file mode 100644
index 00000000..939a31c4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nb.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Danmichaelo",
+ "Event",
+ "Telaneo",
+ "Wouterkoch"
+ ]
+ },
+ "uls-region-WW": "Verdensomspennende",
+ "uls-region-SP": "Spesielle",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Midtøsten",
+ "uls-region-PA": "Stillehavsområdet",
+ "uls-region-all": "Alle språk",
+ "uls-no-results-found": "Ingen resultater funnet",
+ "uls-common-languages": "Foreslåtte språk",
+ "uls-no-results-suggestion-title": "Dette kan kanskje interessere deg:",
+ "uls-search-help": "Du kan søke etter språkets navn, alfabet (skriftnavn) eller ISO-kode, eller du kan bla etter region.",
+ "uls-search-placeholder": "Språksøk"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nds-nl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nds-nl.json
new file mode 100644
index 00000000..ead12199
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nds-nl.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Servien"
+ ]
+ },
+ "uls-region-WW": "Wereldwied",
+ "uls-region-SP": "Spesiaal",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azië",
+ "uls-region-ME": "Midden-Oosten",
+ "uls-region-PA": "Stille Zeegebied",
+ "uls-no-results-found": "Gien resultaoten evunnen",
+ "uls-common-languages": "Taalsuggesties",
+ "uls-no-results-suggestion-title": "Misschien wi'j een van de volgende talen kiezen:",
+ "uls-search-help": "Je kunnen zeuken op taalnaam, schriftnaam, ISO-kode van de taal of je kunnen per regio deurblaojen:",
+ "uls-search-placeholder": "Taal zeuken"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ne.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ne.json
new file mode 100644
index 00000000..e8618775
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ne.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Krish Dulal",
+ "सरोज कुमार ढकाल"
+ ]
+ },
+ "uls-region-WW": "विश्वभर",
+ "uls-region-SP": "विशेष",
+ "uls-region-AM": "अमेरिका",
+ "uls-region-AF": "अफ्रिका",
+ "uls-region-EU": "युरोप",
+ "uls-region-AS": "एसिया",
+ "uls-region-ME": "मध्य पूर्व",
+ "uls-region-PA": "प्रशान्त",
+ "uls-region-all": "सबै भाषाहरू",
+ "uls-no-results-found": "कुनै पनि नतिजाहरू भेटिएन",
+ "uls-common-languages": "सुझाव दिइएका भाषाहरू",
+ "uls-no-results-suggestion-title": "तपाईंलाई यसमा चाख लाग्नसक्छ:",
+ "uls-search-help": "तपाईं भाषाको नाम, लिपीको नाम, आइएसओ कोड वा क्षेत्रको आधारमा खोज्न सक्नुहुन्छ या क्षेत्रको आधारमा अन्वेषण गर्न सक्नुहुन्छ:",
+ "uls-search-placeholder": "भाषा खोज्नुहोस्"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nia.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nia.json
new file mode 100644
index 00000000..a7c31637
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nia.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Slaia"
+ ]
+ },
+ "uls-region-WW": "Sagörö ulidanö",
+ "uls-region-SP": "Spesial",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Eropa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Timur Tengah",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Fefu li ba gulidanö",
+ "uls-no-results-found": "Lö nisöndra",
+ "uls-common-languages": "Li si no so",
+ "uls-no-results-suggestion-title": "Te omasi'ö ba:",
+ "uls-search-help": "Tola ö'alui molo'ö töi li, töi ila-ila zura, kode ISO ma zui ö'alui molo'ö gölana.",
+ "uls-search-placeholder": "Alui sambua li"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nl-informal.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nl-informal.json
new file mode 100644
index 00000000..d7d24fb4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nl-informal.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Carsrac",
+ "McDutchie",
+ "Robin van der Vliet",
+ "Robin0van0der0vliet"
+ ]
+ },
+ "uls-region-WW": "Wereldwijd",
+ "uls-region-SP": "Speciaal",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azië",
+ "uls-region-ME": "Midden-Oosten",
+ "uls-region-PA": "Pacifisch gebied",
+ "uls-no-results-found": "Geen resultaten gevonden",
+ "uls-common-languages": "Taalsuggesties",
+ "uls-no-results-suggestion-title": "Wellicht wil je een van de volgende talen kiezen:",
+ "uls-search-help": "Je kan zoeken op taalnaam, schriftnaam, ISO-code van de taal of je kunt bladeren per regio.",
+ "uls-search-placeholder": "Zoeken naar een taal"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nl.json
new file mode 100644
index 00000000..e30ccbca
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nl.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mar(c)",
+ "Siebrand",
+ "Sjoerddebruin"
+ ]
+ },
+ "uls-region-WW": "Wereldwijd",
+ "uls-region-SP": "Speciaal",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azië",
+ "uls-region-ME": "Midden-Oosten",
+ "uls-region-PA": "Pacifisch gebied",
+ "uls-region-all": "Alle talen",
+ "uls-no-results-found": "Geen resultaten gevonden",
+ "uls-common-languages": "Taalsuggesties",
+ "uls-no-results-suggestion-title": "Mogelijk bent u geïnteresseerd in:",
+ "uls-search-help": "U kunt zoeken op taalnaam, schriftnaam of ISO-code van de taal, of u kunt bladeren per regio.",
+ "uls-search-placeholder": "Zoeken naar een taal"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nn.json
new file mode 100644
index 00000000..b224db12
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nn.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Njardarlogar"
+ ]
+ },
+ "uls-region-WW": "Verdsfemnande",
+ "uls-region-SP": "Spesielle",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Midtausten",
+ "uls-region-PA": "Stillehavsområdet",
+ "uls-region-all": "Alle språk",
+ "uls-no-results-found": "Ingen resultat funne",
+ "uls-common-languages": "Vanlege språk",
+ "uls-no-results-suggestion-title": "Kan henda er du interessert i:",
+ "uls-search-help": "Du kan søkja etter språknamn, namn på skriftsystem, ISO-kode eller du kan bla gjennom etter region.",
+ "uls-search-placeholder": "Språksøk"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nod.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nod.json
new file mode 100644
index 00000000..20fed475
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nod.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Noktonissian"
+ ]
+ },
+ "uls-region-WW": "ᨣ᩠ᩅᩱ᩵ᩃᩰᩫ᩠ᨠ",
+ "uls-region-SP": "ᨻᩥᩔᩮ",
+ "uls-region-AM": "ᩋᨾᩮᩁᩥᨣᩤ",
+ "uls-region-AF": "ᩋᩯᨼᩕᩥᨣᩤ",
+ "uls-region-EU": "ᩀᩩᩁᩰᩫ᩠ᨷ",
+ "uls-region-AS": "ᩋᩮᨪᩮ᩠ᨿ",
+ "uls-region-ME": "ᨲᩅᩢ᩠ᨶᩋᩬᨠᨠᩖᩣ᩠ᨦ",
+ "uls-region-PA": "ᨻᩯᨪᩥᨼᩥ᩠ᨠ",
+ "uls-region-all": "ᨩᩩᨽᩣᩈᩣ",
+ "uls-no-results-found": "ᨷᩴᨸᩡ",
+ "uls-common-languages": "ᨽᩣᩈᩣᨴᩦ᩵ᨶᩯᩡᨶᩣᩴ",
+ "uls-no-results-suggestion-title": "ᨴ᩵ᩤ᩠ᨶᩋᩣ᩠ᨧᩈᩫ᩠ᨶᨧᩱ:",
+ "uls-search-help": "ᨴ᩵ᩤ᩠ᨶᩋᩣ᩠ᨧᨪᩰᩬᩡᩉᩣᨯᩱ᩶ᨧᩣ᩠ᨿᨩᩨ᩵ᨽᩣᩈᩣ ᨩᩨ᩵ᩋᩢᨠ᩠ᨡᩁ ᨩᩨ᩵ᩁᩉᩢ᩠ᩈ ISO ᨡᩬᨦᨽᩣᩈᩣ ᩁᩂᩋᩣ᩠ᨧᨪᩰᩬᩡᨹᩬᩴ᩵ᨲᩣ᩠ᨾᨽᩪᨾᩥᨽᩣ᩠ᨣᨣᩴᨯᩱ᩶",
+ "uls-search-placeholder": "ᨪᩰᩬᩡᩉᩣᨽᩣᩈᩣ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nqo.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nqo.json
new file mode 100644
index 00000000..d570e9e5
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nqo.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lancine.kounfantoh.fofana",
+ "Youssoufkadialy"
+ ]
+ },
+ "uls-region-WW": "ߞߌߢߍ߲߫ ߝߊ߲߬ ߓߍ߯",
+ "uls-region-SP": "ߞߙߍߞߙߍߣߍ߲",
+ "uls-region-AM": "ߊߡߍߙߌߞߌ߬",
+ "uls-region-AF": "ߊߝߙߌߞߌ߬",
+ "uls-region-EU": "ߋߙߐߔߎ߬",
+ "uls-region-AS": "ߊߖ߭ߌ߫",
+ "uls-region-ME": "ߊߙߊߓߎ߫ ߕߌ߲ߡߎߣߎ߲",
+ "uls-region-PA": "ߖߐ߮ ߟߌ߲ߓߊ߲",
+ "uls-region-all": "ߞߊ߲ ߠߎ߬ ߓߍ߯",
+ "uls-no-results-found": "ߞߐߝߟߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬",
+ "uls-common-languages": "ߞߊ߲߫ ߞߏߝߐߣߍ߲ ߠߎ߬",
+ "uls-no-results-suggestion-title": "ߌ ߡߊ߬ߞߏ ߘߌ߫ ߛߋ߫ ߓߌ߬ߟߊ߬ ߟߊ߫ ߣߌ߲߬ ߠߊ߫:",
+ "uls-search-help": "ߌ ߘߴߛߋ߫ ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߲߫ ߞߍ߫ ߞߊ߬ ߓߍ߲߬ ߞߊ߲ ߕߐ߮ ߡߊ߬ ߸ ߛߓߍߛߎ߲ ߕߐ߮ ߡߊ߬ ߸ ISO ߝߙߍߕߍ ߡߊ߬ ߥߟߊ߫ ߌ ߘߴߛߋ߫ ߛߏ߲߯ߓߊߟߌ ߞߍ߫ ߟߊ߫ ߞߊ߬ ߓߍ߲߬ ߕߌ߲߬ߞߎߘߎ߲ ߠߎ߫ ߕߐ߮ ߡߊ߬",
+ "uls-search-placeholder": "ߞߊ߲ ߘߏ߫ ߢߌߣߌ߲߫"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nso.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nso.json
new file mode 100644
index 00000000..9c1ed284
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nso.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mohau"
+ ]
+ },
+ "uls-region-WW": "Lefasekabophara",
+ "uls-region-SP": "Kgethegilego",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Uropa",
+ "uls-region-all": "Malelme ka moka",
+ "uls-no-results-suggestion-title": "O ka ba le kgatlego go:",
+ "uls-search-placeholder": "Fetleka leleme"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/nyn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/nyn.json
new file mode 100644
index 00000000..d6d06c12
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/nyn.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kakonjo"
+ ]
+ },
+ "uls-region-WW": "Ensiyoona",
+ "uls-region-SP": "Ez'omutaano",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Buraaya",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Ahagati ya burugwa Eizoba",
+ "uls-region-PA": "Pasifiki",
+ "uls-region-all": "Endimi zoona",
+ "uls-no-results-found": "Tihariho ebyarugamu",
+ "uls-common-languages": "Endimi ezirikukutekatekyerwa",
+ "uls-no-results-suggestion-title": "Nobasa kuba noyenda :",
+ "uls-search-help": "Nobasa ku sherura nana eiziina rya orurimi, omuringo get, Kodi y'orurimi eya ISO ninga nobasa kusherura ekyanga aha Karimagyezi.",
+ "uls-search-placeholder": "Sherura orurimi"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/oc.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/oc.json
new file mode 100644
index 00000000..636a1f1a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/oc.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cedric31"
+ ]
+ },
+ "uls-region-WW": "Dins lo monde entièr",
+ "uls-region-SP": "Especial",
+ "uls-region-AM": "America",
+ "uls-region-AF": "Africa",
+ "uls-region-EU": "Euròpa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Orient Mejan",
+ "uls-region-PA": "Pacific",
+ "uls-region-all": "Totas las lengas",
+ "uls-no-results-found": "Cap de resultat pas trobat",
+ "uls-common-languages": "Lengas suggeridas",
+ "uls-no-results-suggestion-title": "Podètz èsser interessat per :",
+ "uls-search-help": "Podètz recercar per nom de lenga, per nom de l'escript, per còdi ISO de la lenga, o podètz navigar per region.",
+ "uls-search-placeholder": "Recèrca de lenga"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/olo.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/olo.json
new file mode 100644
index 00000000..2e89ac8e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/olo.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ilja.mos"
+ ]
+ },
+ "uls-region-WW": "Muailman lajuine",
+ "uls-region-SP": "Erikoine",
+ "uls-region-AM": "Amerikku",
+ "uls-region-AF": "Afriekku",
+ "uls-region-EU": "Jevrouppu",
+ "uls-region-AS": "Aazii",
+ "uls-region-ME": "Lähi-idä",
+ "uls-region-PA": "Okeanii",
+ "uls-region-all": "Kai kielet",
+ "uls-no-results-found": "Ei löydynyh tuloksii",
+ "uls-common-languages": "Automuattizesti vallitut kielet",
+ "uls-no-results-suggestion-title": "Voit olla kiinnostunnuh nämmis kielis:",
+ "uls-search-help": "Voit eččie kielen nimen libo kirjutustavan mugah, kielen ISO-koudan mugah libo kaččuo alovehen kielii.",
+ "uls-search-placeholder": "Eči kieli"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/om.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/om.json
new file mode 100644
index 00000000..8f995879
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/om.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ahrada2016",
+ "Oromoo",
+ "Tumsaa"
+ ]
+ },
+ "uls-region-WW": "Addunyaalessa",
+ "uls-region-SP": "Addayaa",
+ "uls-region-AM": "Ameerikaa",
+ "uls-region-AF": "Aafrikaa",
+ "uls-region-EU": "Yuurooppi",
+ "uls-region-AS": "Eeshiyaa",
+ "uls-region-ME": "Giddu-galeessa Bahaa",
+ "uls-region-PA": "Paasifiik",
+ "uls-region-all": "Afaan hunda",
+ "uls-no-results-found": "Homtuu hin argamane",
+ "uls-common-languages": "Qooqawwan dhiyaatan",
+ "uls-no-results-suggestion-title": "Kana barbaaduu dandeessa:",
+ "uls-search-help": "Maqaa qooqaan barbaaduu dandeessa, maqaa qubeessaan, qooqa lakkaddaa ISO yookiis naannoo keen banuu dandeessa.",
+ "uls-search-placeholder": "Qooqa barbaadi"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/or.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/or.json
new file mode 100644
index 00000000..0440fc6e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/or.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jnanaranjan Sahu",
+ "Psubhashish",
+ "ଶିତିକଣ୍ଠ ଦାଶ"
+ ]
+ },
+ "uls-region-WW": "ବିଶ୍ଵବ୍ୟାପୀ",
+ "uls-region-SP": "ବିଶେଷ",
+ "uls-region-AM": "ଆମେରିକା",
+ "uls-region-AF": "ଆଫ୍ରିକା",
+ "uls-region-EU": "ଇଉରୋପ",
+ "uls-region-AS": "ଏସିଆ",
+ "uls-region-ME": "ମଧ୍ୟପ୍ରାଚ୍ୟ",
+ "uls-region-PA": "ପ୍ରଶାନ୍ତ-ମହାସାଗରୀୟ",
+ "uls-region-all": "ସବୁ ଭାଷା",
+ "uls-no-results-found": "କୌଣସି ଫଳାଫଳ ମିଳିଲା ନାହିଁ",
+ "uls-common-languages": "ସାଧାରଣ ଭାଷାଗୁଡ଼ିକ",
+ "uls-no-results-suggestion-title": "ଆପଣ ହୁଏତ ଆଗ୍ରହୀ ହେଇପାରନ୍ତି:",
+ "uls-search-help": "ଆପଣ ଭାଷା ନାମ, ଆଇଏସଓ କୋଡ଼, ସ୍କ୍ରିପ୍ଟ ନାମ ହିସାବରେ ଖୋଜି ପାରିବେ କିମ୍ବା ଅଞ୍ଚଳ ଅନୁସାରେ ଦେଖିପାରିବେ ।",
+ "uls-search-placeholder": "ଭାଷାଟିଏ ଖୋଜନ୍ତୁ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/os.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/os.json
new file mode 100644
index 00000000..de65798c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/os.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amikeco",
+ "Amire80",
+ "Bouron"
+ ]
+ },
+ "uls-region-WW": "Æппæтдунеон",
+ "uls-region-SP": "Сӕрмагонд",
+ "uls-region-AM": "Америкæ",
+ "uls-region-AF": "Африкæ",
+ "uls-region-EU": "Европæ",
+ "uls-region-AS": "Ази",
+ "uls-region-ME": "Æввахс Скæсæн",
+ "uls-region-PA": "Океани",
+ "uls-region-all": "Æппæт æвзæгтæ",
+ "uls-no-results-found": "Ницы разындис",
+ "uls-common-languages": "Æввахс æвзæгтæ",
+ "uls-no-results-suggestion-title": "Чизоны дæ ацы æвзæгтæ бахъæуой:",
+ "uls-search-help": "Дæ бон у агурын æвзаджы номмæ гæсгæ, фыссынадмæ гæсгæ, ISO кодмæ гæсгæ кæнæ бынатмæ гæсгæ.",
+ "uls-search-placeholder": "Æвзаджы агуырд"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/pa.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/pa.json
new file mode 100644
index 00000000..384d34de
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/pa.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Babanwalia",
+ "Bgo eiu",
+ "Tow"
+ ]
+ },
+ "uls-region-WW": "ਵਿਸ਼ਵਵਿਆਪੀ",
+ "uls-region-SP": "ਖ਼ਾਸ",
+ "uls-region-AM": "ਅਮਰੀਕਾ",
+ "uls-region-AF": "ਅਫ਼ਰੀਕਾ",
+ "uls-region-EU": "ਯੂਰਪ",
+ "uls-region-AS": "ਏਸ਼ੀਆ",
+ "uls-region-ME": "ਮੱਧ ਪੂਰਬ",
+ "uls-region-PA": "ਪ੍ਰਸ਼ਾਂਤ",
+ "uls-no-results-found": "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਲੱਭਾ",
+ "uls-common-languages": "ਸੁਝਾਈਆਂ ਭਾਸ਼ਾਵਾਂ",
+ "uls-no-results-suggestion-title": "ਤੁਹਾਨੂੰ ਇਹਨਾਂ ਵਿੱਚ ਦਿਲਚਸਪੀ ਹੋ ਸਕਦੀ ਹੋ:",
+ "uls-search-help": "ਤੁਸੀਂ ਭਾਸ਼ਾ ਦੇ ਨਾਂ, ਲਿਪੀ ਦੇ ਨਾਂ, ਭਾਸ਼ਾ ਦੇ ISO ਕੋਡ ਰਾਹੀਂ ਖੋਜ ਸਕਦੇ ਹੋ ਜਾਂ ਖੇਤਰ ਪੱਖੋਂ ਸਫ਼ੇ ਪਲਟ ਸਕਦੇ ਹੋ।",
+ "uls-search-placeholder": "ਭਾਸ਼ਾ ਖੋਜ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/pl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/pl.json
new file mode 100644
index 00000000..b0590bee
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/pl.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chrumps",
+ "Matma Rex",
+ "Rezonansowy",
+ "Woytecr"
+ ]
+ },
+ "uls-region-WW": "Cały świat",
+ "uls-region-SP": "Specjalne",
+ "uls-region-AM": "Ameryka",
+ "uls-region-AF": "Afryka",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azja",
+ "uls-region-ME": "Bliski Wschód",
+ "uls-region-PA": "Pacyfik",
+ "uls-region-all": "Wszystkie języki",
+ "uls-no-results-found": "Brak wyników",
+ "uls-common-languages": "Sugerowane języki",
+ "uls-no-results-suggestion-title": "Być może cię zainteresują te języki:",
+ "uls-search-help": "Możesz wyszukiwać według nazwy języka, nazwy systemu pisma, kodu ISO języka, lub przeglądać listy według regionów.",
+ "uls-search-placeholder": "Wyszukiwanie języka"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/pms.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/pms.json
new file mode 100644
index 00000000..82932293
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/pms.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Borichèt",
+ "Dragonòt"
+ ]
+ },
+ "uls-region-WW": "Tut ël mond",
+ "uls-region-SP": "Special",
+ "uls-region-AM": "América",
+ "uls-region-AF": "Àfrica",
+ "uls-region-EU": "Euròpa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Vzin Orient",
+ "uls-region-PA": "Passìfich",
+ "uls-region-all": "Tute le lenghe",
+ "uls-no-results-found": "Gnun arzultà trovà",
+ "uls-common-languages": "Lenghe sugerìe",
+ "uls-no-results-suggestion-title": "It peule esse anteressà a:",
+ "uls-search-help": "A peul sërché për nòm ëd lenga, nòm dl'alfabet, còdes ISO dla lenga o a peul navighé për region.",
+ "uls-search-placeholder": "Serca na lenga"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/pnb.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/pnb.json
new file mode 100644
index 00000000..6af3127a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/pnb.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Abbas dhothar",
+ "Bgo eiu"
+ ]
+ },
+ "uls-region-WW": "جگ بھر",
+ "uls-region-SP": "خاص",
+ "uls-region-AM": "امریکہ",
+ "uls-region-AF": "افریقہ",
+ "uls-region-EU": "یورپ",
+ "uls-region-AS": "ایشیاء",
+ "uls-region-ME": "مشرق وسطی",
+ "uls-region-PA": "بحر الکاہل",
+ "uls-region-all": "ساریاں بولیاں",
+ "uls-no-results-found": "کوئی نتیجے نئیں لبھے",
+ "uls-common-languages": "تجویز کردہ بولیاں",
+ "uls-no-results-suggestion-title": "توانوں اس وچ دلچسپی ہوسکدی اے:",
+ "uls-search-help": "تسیں بولی دے ناں ، اسکرپٹ دا ناں ، بولی دے آئی ایس او کوڈ دے ذریعہ تلاش کرسکدے نيں یا آپ علاقے دے ذریعہ براؤز کرسکدے او۔",
+ "uls-search-placeholder": "بولی لئی کھوجو"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ps.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ps.json
new file mode 100644
index 00000000..7f25b6fc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ps.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ahmed-Najib-Biabani-Ibrahimkhel",
+ "Amjad Khan",
+ "Baloch Khan"
+ ]
+ },
+ "uls-region-WW": "نړېوال",
+ "uls-region-SP": "ځانگړی",
+ "uls-region-AM": "امريکا",
+ "uls-region-AF": "افريقا",
+ "uls-region-EU": "اروپا",
+ "uls-region-AS": "آسيا",
+ "uls-region-ME": "منځنی ختيځ",
+ "uls-region-PA": "غلی سمندر",
+ "uls-region-all": "ټولې ژبې",
+ "uls-no-results-found": "پايلې و نه موندل شوې",
+ "uls-common-languages": "وړانديز کړي ژبې",
+ "uls-no-results-suggestion-title": "کېدای شي تاسې يې لېواله اوسئ:",
+ "uls-search-help": "تاسې د ژبې د نوم له مخې، د سکرېپټ نوم، د ژبې د ISO کوډ له مخې او يا هم د سيمې له مخې پلټنې کولی شئ:",
+ "uls-search-placeholder": "د يوې ژبې پلټنه"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/pt-br.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/pt-br.json
new file mode 100644
index 00000000..5af62428
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/pt-br.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amgauna",
+ "Cristofer Alves",
+ "Eduardo Addad de Oliveira",
+ "Eduardoaddad",
+ "TheEduGobi",
+ "Tuliouel",
+ "Webysther"
+ ]
+ },
+ "uls-region-WW": "Global",
+ "uls-region-SP": "Especial",
+ "uls-region-AM": "América",
+ "uls-region-AF": "África",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Ásia",
+ "uls-region-ME": "Oriente Médio",
+ "uls-region-PA": "Pacífico",
+ "uls-region-all": "Todos os idiomas",
+ "uls-no-results-found": "Nenhum resultado encontrado",
+ "uls-common-languages": "Idiomas sugeridos",
+ "uls-no-results-suggestion-title": "Você pode interessar-se por:",
+ "uls-search-help": "Você pode pesquisar pelo nome da língua, o nome do alfabeto, código ISO da língua, ou você pode procurar por região.",
+ "uls-search-placeholder": "Procurar um idioma"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/pt.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/pt.json
new file mode 100644
index 00000000..df7dc253
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/pt.json
@@ -0,0 +1,28 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Cainamarques",
+ "Hamilton Abreu",
+ "Sarilho1",
+ "Ti4goc",
+ "Vitorvicentevalente",
+ "Waldir",
+ "Waldyrious"
+ ]
+ },
+ "uls-region-WW": "Global",
+ "uls-region-SP": "Especiais",
+ "uls-region-AM": "América",
+ "uls-region-AF": "África",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Ásia",
+ "uls-region-ME": "Médio Oriente",
+ "uls-region-PA": "Pacífico",
+ "uls-region-all": "Todos os idiomas",
+ "uls-no-results-found": "Não foram encontrados resultados",
+ "uls-common-languages": "Idiomas sugeridos",
+ "uls-no-results-suggestion-title": "Você pode estar interessado em:",
+ "uls-search-help": "Pode pesquisar pelo nome da língua, pelo tipo de alfabeto, pelo código ISO da língua, ou pode navegar por região.",
+ "uls-search-placeholder": "Pesquisar uma língua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/qqq.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/qqq.json
new file mode 100644
index 00000000..f66f9f44
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/qqq.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Nike",
+ "Shirayuki"
+ ]
+ },
+ "uls-region-WW": "Label for worldwide languages. They are languages spoken in multiple countries. Eg: English, French, Spanish etc. This label is used in the map region of ULS and as the title of section showing worldwide languages. Translation should not be descriptive.",
+ "uls-region-SP": "Label for the special languages section. This section may include special custom languages that can be added in run time. It's shown after the Worldwide section.\n\nThe special language is everything that isn't a real language. Like code qqq or qqx.\n{{Identical|Special}}",
+ "uls-region-AM": "Label for America",
+ "uls-region-AF": "Label for Africa",
+ "uls-region-EU": "Label for Europe",
+ "uls-region-AS": "Label for Asia",
+ "uls-region-ME": "Label for Middle East",
+ "uls-region-PA": "Label for Pacific",
+ "uls-region-all": "Label for all languages in narrow mode, where languages are not split by region.",
+ "uls-no-results-found": "Title text for 'No results found' section",
+ "uls-common-languages": "The ULS tries to guess the langugages that the user is most likely to pick. They are taken from geolocation (languages of the current country according to the IP address), previously selected languages, and the browser's accept-language. The list of these languages appears at the top of the ULS languages list, above the geographical regions. This is the title of that list.\n\nSee also {{msg-mw|Mobile-frontend-languages-structured-overlay-suggested-languages-header}}",
+ "uls-no-results-suggestion-title": "Title for language suggestion in 'no results found' screen",
+ "uls-search-help": "Help text for searching.\n\n\"Script name\" is a name of a writing system, such as \"Latin\", \"Cyrillic\", \"Arabic\" etc.",
+ "uls-search-placeholder": "Placeholder text in search box"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/rn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/rn.json
new file mode 100644
index 00000000..8ccce0d1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/rn.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gilbert Ndihokubwayo"
+ ]
+ },
+ "uls-region-WW": "Kw'isi yose",
+ "uls-region-SP": "Bidasanzwe",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Uburayi",
+ "uls-region-AS": "Aziya",
+ "uls-region-ME": "Uburasirazuba bwo hagati",
+ "uls-region-PA": "Pasifike",
+ "uls-region-all": "Indimi zose",
+ "uls-no-results-found": "Nta nyishu yabonetse",
+ "uls-common-languages": "Indimi zihitishijwemwo",
+ "uls-no-results-suggestion-title": "Ushobora gushimishwa na:",
+ "uls-search-help": "Ushobora kurondeza ukoresheje izina ryururimi, izina ry'ivyandiko, kode ISO y'ururimi canke naho ukarondeza ukoresheje akarere.",
+ "uls-search-placeholder": "Rondeza ururimi"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ro.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ro.json
new file mode 100644
index 00000000..75b6e14d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ro.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Minisarm",
+ "NGC 54",
+ "Silviu200530"
+ ]
+ },
+ "uls-region-WW": "La nivel mondial",
+ "uls-region-SP": "Speciale",
+ "uls-region-AM": "America",
+ "uls-region-AF": "Africa",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Orientul Mijlociu",
+ "uls-region-PA": "Oceania",
+ "uls-region-all": "Toate limbile",
+ "uls-no-results-found": "Niciun rezultat găsit",
+ "uls-common-languages": "Limbi sugerate",
+ "uls-no-results-suggestion-title": "Ați putea fi interesat de:",
+ "uls-search-help": "Puteți căuta după numele limbii, numele scrierii, codul ISO al limbii sau puteți răsfoi în funcție de regiune.",
+ "uls-search-placeholder": "Căutare după o limbă"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/roa-tara.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/roa-tara.json
new file mode 100644
index 00000000..f020f88f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/roa-tara.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joetaras"
+ ]
+ },
+ "uls-region-WW": "Tutte 'u munne",
+ "uls-region-SP": "Speciale",
+ "uls-region-AM": "Americhe",
+ "uls-region-AF": "Afriche",
+ "uls-region-EU": "Europe",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Medie oriende",
+ "uls-region-PA": "Pacifeche",
+ "uls-region-all": "Tutte le lènghe",
+ "uls-no-results-found": "Nisciune resultate acchiate",
+ "uls-common-languages": "Lènghe suggerite",
+ "uls-no-results-suggestion-title": "Puè essere 'nderessate a:",
+ "uls-search-help": "Puè cercà pe nome d'a lènghe, nome d'u script, codece ISO d'a lènghe o puè navegà passanne pa reggione.",
+ "uls-search-placeholder": "Cirche 'na lènghe"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/rsk.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/rsk.json
new file mode 100644
index 00000000..1cbb0c69
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/rsk.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Keresturec"
+ ]
+ },
+ "uls-region-WW": "Шветови",
+ "uls-region-SP": "Специялни",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Штреднї Восток",
+ "uls-region-PA": "Пацифик",
+ "uls-region-all": "Шицки язики",
+ "uls-no-results-found": "Нєт резултати",
+ "uls-common-languages": "Предложени язик",
+ "uls-no-results-suggestion-title": "Можебуц сце заинтересовани за:",
+ "uls-search-help": "Можеце преглєдовац по мену язика або писма, по ISO коду язика або по реґиону.",
+ "uls-search-placeholder": "Глєданє язика"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ru.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ru.json
new file mode 100644
index 00000000..f4f79aeb
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ru.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Bouron",
+ "Eleferen",
+ "Kaganer",
+ "Kopcap94",
+ "Okras"
+ ]
+ },
+ "uls-region-WW": "Всемирные",
+ "uls-region-SP": "Специальные",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Ближний Восток",
+ "uls-region-PA": "Океания",
+ "uls-region-all": "Все языки",
+ "uls-no-results-found": "Не найдено",
+ "uls-common-languages": "Предложенные языки",
+ "uls-no-results-suggestion-title": "Может быть вас заинтересуют эти языки:",
+ "uls-search-help": "Вы можете искать по названию языка или письменности, по ISO-коду языка или просмотреть по региону.",
+ "uls-search-placeholder": "Поиск языка"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/rup.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/rup.json
new file mode 100644
index 00000000..df2ac9bb
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/rup.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "D'AroemenenZullenNiVergaan"
+ ]
+ },
+ "uls-region-WW": "Tu tutâ lumea",
+ "uls-region-SP": "Alepțâ",
+ "uls-region-AM": "Americhie",
+ "uls-region-AF": "Africa",
+ "uls-region-EU": "Evropa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Apreasa Mulgicanâ (di ńioldzuc)",
+ "uls-region-PA": "Pacificu",
+ "uls-no-results-found": "S-aflarâ țiva rezultati",
+ "uls-common-languages": "Limbi comuni",
+ "uls-no-results-suggestion-title": "S-poati s-ai sinferu (s-hii ntirisatu) trâ:",
+ "uls-search-help": "Poți s-lu cafțâ dupu numa limbâľei, numa scriariľei, codul ISO a limbâľei icâ poți s-li vedz dupu regiuni:",
+ "uls-search-placeholder": "Câftari limbâ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/rw.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/rw.json
new file mode 100644
index 00000000..c7cac5c0
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/rw.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Germain92"
+ ]
+ },
+ "uls-region-WW": "Kwisi Yose",
+ "uls-region-SP": "Ibidasanzwe",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afurika",
+ "uls-region-EU": "Uburayi",
+ "uls-region-AS": "Aziya",
+ "uls-region-ME": "Uburayi bwo Hagati",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Indimi Zose",
+ "uls-no-results-found": "Nta bisubizo Bigaragara",
+ "uls-common-languages": "Indimi ziteganyijwe",
+ "uls-no-results-suggestion-title": "Ushobora gushimishwa na:",
+ "uls-search-help": "Ushobora gushakisha ukoresheje izina ry'ururimi, izina ry'inyandiko, ISO y'ururimi cyangwa ugashakisha ukoresheje Akarere.",
+ "uls-search-placeholder": "Shakisha ururimi"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sa.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sa.json
new file mode 100644
index 00000000..29782ce7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sa.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "NehalDaveND"
+ ]
+ },
+ "uls-region-WW": "विश्वव्यापी",
+ "uls-region-SP": "महत्त्वपूर्णम्",
+ "uls-region-AM": "अमेरिका",
+ "uls-region-AF": "कालद्वीपः",
+ "uls-region-EU": "यूरोप",
+ "uls-region-AS": "जम्बुमहाद्वीपः",
+ "uls-region-ME": "मध्यभूभागे",
+ "uls-region-PA": "पॅसिफिक्",
+ "uls-region-all": "सर्वाः भाषाः",
+ "uls-no-results-found": "परिणामाः न लब्धाः",
+ "uls-common-languages": "परामर्षिताः भाषाः",
+ "uls-no-results-suggestion-title": "एतत् भवते/भवत्यै रोचेत :",
+ "uls-search-help": "भाषाधारेण, लिप्याधारेण, भाषायाः ISO कूटाधारेण, क्षेत्रानुसारं वा भवान्/भवती अन्वेष्टुं शक्नोति ।",
+ "uls-search-placeholder": "भाषा अन्विष्यताम्"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sah.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sah.json
new file mode 100644
index 00000000..7acb9f95
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sah.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "HalanTul"
+ ]
+ },
+ "uls-region-WW": "Аан дойду",
+ "uls-region-SP": "Аналлаах",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Чугас Илин",
+ "uls-region-PA": "Океания",
+ "uls-region-all": "Бары тыллар",
+ "uls-no-results-found": "Туох да көстүбэтэ",
+ "uls-common-languages": "Сүбэлэнэр тыллар",
+ "uls-no-results-suggestion-title": "Баҕар бу тыллары сэргиэҥ:",
+ "uls-search-help": "Тыл биитэр сурук-бичик аатынан, ISO-куодунан биитэр сиринэн көрдүөххүн сөп.",
+ "uls-search-placeholder": "Тылы көрдөөһүн"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sc.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sc.json
new file mode 100644
index 00000000..cc84abb0
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sc.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "L2212"
+ ]
+ },
+ "uls-region-WW": "Totu su mundu",
+ "uls-region-SP": "Ispetziales",
+ "uls-region-AM": "Amèrica",
+ "uls-region-AF": "Àfrica",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Àsia",
+ "uls-region-ME": "Oriènte de mesu.",
+ "uls-region-PA": "Patzìficu",
+ "uls-region-all": "Totu sas limbas",
+ "uls-no-results-found": "Perunu resurtadu agatadu",
+ "uls-common-languages": "Limbas impositadas",
+ "uls-no-results-suggestion-title": "Podes essere interessadu in:",
+ "uls-search-help": "Podes chircare pro mèdiu de su nùmene de sa limba, su nùmene de su script, su còdighe ISO de sa limba o navigare pro mèdiu de sa regione:",
+ "uls-search-placeholder": "Chirca una limba:"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/scn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/scn.json
new file mode 100644
index 00000000..c9b7016b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/scn.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ajeje Brazorf",
+ "Sarvaturi"
+ ]
+ },
+ "uls-region-WW": "Tuttu lu munnu",
+ "uls-region-SP": "Spiciali",
+ "uls-region-AM": "Amèrica",
+ "uls-region-AF": "Àfrica",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Mediu orienti",
+ "uls-region-PA": "Pacìficu",
+ "uls-region-all": "Tutti li lingui",
+ "uls-no-results-found": "Nuddu risurtatu attruvatu",
+ "uls-common-languages": "Lingui suggiruti",
+ "uls-no-results-suggestion-title": "Poi èssiri ntirissatu a:",
+ "uls-search-help": "È pussìbbili arricircari pi nomu, nomu dô script, còdice ISO dâ lingua o si pò navigari tràmiti riggiuni.",
+ "uls-search-placeholder": "Arricerca na lingua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sco.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sco.json
new file mode 100644
index 00000000..5f88572a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sco.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "AmaryllisGardener",
+ "John Reid"
+ ]
+ },
+ "uls-region-WW": "Worldwide",
+ "uls-region-SP": "Speecial",
+ "uls-region-AM": "Americae",
+ "uls-region-AF": "Afreeca",
+ "uls-region-EU": "Europ",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Middle Eist",
+ "uls-region-PA": "Paceefic",
+ "uls-region-all": "Aw leids",
+ "uls-no-results-found": "Nae results foond",
+ "uls-common-languages": "Suggestit leids",
+ "uls-no-results-suggestion-title": "Ye micht hae aen intrest in:",
+ "uls-search-help": "Ye can sairch bi leid name, script name, ISO code o leid or ye can brouse bi region.",
+ "uls-search-placeholder": "Sairch for a leid"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sd.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sd.json
new file mode 100644
index 00000000..88f2256f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sd.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Indusian1236",
+ "Mehtab ahmed",
+ "Tweety"
+ ]
+ },
+ "uls-region-WW": "عالمي",
+ "uls-region-SP": "خاص",
+ "uls-region-AM": "آمريڪا",
+ "uls-region-AF": "آفريڪا",
+ "uls-region-EU": "يُورپ",
+ "uls-region-AS": "ايشيا",
+ "uls-region-ME": "وچ اوڀر",
+ "uls-region-PA": "پئسفڪ",
+ "uls-region-all": "سڀ ٻوليون",
+ "uls-no-results-found": "ڪي بہ نتيجا نہ لڌا",
+ "uls-common-languages": "تجويزڪيل ٻوليون",
+ "uls-no-results-suggestion-title": "توهان هنن شين ۾ دلچسپي رکي سگهو ٿا:",
+ "uls-search-help": "توهان ٻولي جي نالي، اسڪرپٽ جو نالو، ٻولي جو آءِايس.او ڪوڊ يا خطي جي حساب سان ڳولي سگهو ٿا.",
+ "uls-search-placeholder": "ڪنھن ٻوليءَ لاءِ ڳوليو"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sdh.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sdh.json
new file mode 100644
index 00000000..39545b2d
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sdh.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kurdbuddha"
+ ]
+ },
+ "uls-region-WW": "جەهانی",
+ "uls-region-AM": "ئامریکا",
+ "uls-region-AF": "ئافریقا",
+ "uls-region-EU": "ئورووپا",
+ "uls-region-AS": "ئاسیا",
+ "uls-region-ME": "خوەرھەڵات ناوەڕاس"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/shn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/shn.json
new file mode 100644
index 00000000..a257cb6c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/shn.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Saimawnkham"
+ ]
+ },
+ "uls-region-WW": "တင်းၵမ်ႇၽႃႇ",
+ "uls-region-SP": "ၶိုၵ်ႉတွၼ်း",
+ "uls-region-AM": "ဢမေႇရိၵ",
+ "uls-region-AF": "ဢႃႇၽရိၵ",
+ "uls-region-EU": "ရူးရူပ်ႉ",
+ "uls-region-AS": "ဢေးသျႃး",
+ "uls-region-ME": "ပွတ်းၵၢင်တၢင်းဢွၵ်ႇ",
+ "uls-region-PA": "ပသိၽိၵ်ႉ",
+ "uls-region-all": "ၽႃႇသႃႇၵႂၢမ်း တင်းသဵင်ႈ",
+ "uls-no-results-found": "ဢမ်ႇႁၼ်ၽွၼ်းလႆႈ",
+ "uls-common-languages": "ၽႃႇသႃႇဢၼ်ၸႂ်ႉၼမ်",
+ "uls-no-results-suggestion-title": "ၸဝ်ႈၵဝ်ႇၸၢင်ႈၶဝ်ႈၸႂ်ပႃး",
+ "uls-search-help": "ၸဝ်ႈၵဝ်ႇ ၸၢင်ႈသွၵ်ႈႁႃတင်း ၸိုဝ်ႈၽႃႇသႃႇၵႂၢမ်း၊ ၸိုဝ်ႈ Script, မၢႆ ISO တွၼ်ႈတႃႇ ၽႃႇသႃႇၵႂၢမ်း ဢၼ်ၼၼ် ၸဝ်ႈၵဝ်ႇ ၸၢင်ႈပိုတ်ႇႁႃ တင်း လႅၼ်မိူင်း region",
+ "uls-search-placeholder": "ၶူၼ်ႉႁႃ တႃႇၽႃႇသႃႇၵႂၢမ်း"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/si.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/si.json
new file mode 100644
index 00000000..16aff783
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/si.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "පසිඳු කාවින්ද",
+ "හරිත"
+ ]
+ },
+ "uls-region-WW": "ලෝක ව්‍යාප්ත",
+ "uls-region-SP": "විශේෂ",
+ "uls-region-AM": "ඇමෙරිකාව",
+ "uls-region-AF": "අප්‍රිකාව",
+ "uls-region-EU": "යුරෝපය",
+ "uls-region-AS": "ආසියාව",
+ "uls-region-ME": "මැද පෙරදිග",
+ "uls-region-PA": "පැසිෆික්",
+ "uls-no-results-found": "ප්‍රතිඑල හමු නොවුණි",
+ "uls-common-languages": "පොදු භාෂා",
+ "uls-no-results-suggestion-title": "ඔබ සමහර විට කැමති වේවි:",
+ "uls-search-help": "ඔබට භාෂා නාමය, ස්ක්‍රිප්ට නාමය, භාෂාවේ ISO කේතය මගින් සෙවිය හැක නැතහොත් ඔබට ප්‍රදේශය අනුව බ්‍රවුස් කළ හැක.",
+ "uls-search-placeholder": "බස සෙවීම"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sk.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sk.json
new file mode 100644
index 00000000..a04c0b6f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sk.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Jaroslav.micek",
+ "Rudko",
+ "Yardom78"
+ ]
+ },
+ "uls-region-WW": "Po celom svete",
+ "uls-region-SP": "Špeciálne",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Európa",
+ "uls-region-AS": "Ázia",
+ "uls-region-ME": "Blízky východ",
+ "uls-region-PA": "Pacifik",
+ "uls-region-all": "Všetky jazyky",
+ "uls-no-results-found": "Neboli nájdené žiadne výsledky",
+ "uls-common-languages": "Jazyky",
+ "uls-no-results-suggestion-title": "Mohlo by Vás zaujímať:",
+ "uls-search-help": "Môžete vyhľadávať podľa názvu jazyka, názvu písma, ISO kódu jazyka alebo môžete prechádzať po regiónoch:",
+ "uls-search-placeholder": "Vyhľadávanie jazyka"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/skr-arab.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/skr-arab.json
new file mode 100644
index 00000000..9ae7b01e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/skr-arab.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Saraiki"
+ ]
+ },
+ "uls-region-WW": "پوری دنیا وچ",
+ "uls-region-SP": "خاص",
+ "uls-region-AM": "امریکہ",
+ "uls-region-AF": "افریقہ",
+ "uls-region-EU": "یورپ",
+ "uls-region-AS": "ایشیاء",
+ "uls-region-ME": "مشرق وسطی",
+ "uls-region-PA": "بحر الکاہل",
+ "uls-region-all": "ساریاں زباناں",
+ "uls-no-results-found": "کوئی نتیجہ نی لبھا",
+ "uls-common-languages": "تجویز کردہ زباناں",
+ "uls-no-results-suggestion-title": "تہاکوں ایندے وچ وی دلچسپی ہوسی",
+ "uls-search-help": "تساں زبان دے ناں، رسم الخط، زبان دے آئی ایس او کوڈ دے نال وی ڳول سڳدے ہو یا وت علاقے نال وی ڳول سڳدے ہو",
+ "uls-search-placeholder": "زبان دی ڳول"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sl.json
new file mode 100644
index 00000000..da5337e1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sl.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Dbc334",
+ "Eleassar",
+ "Irena Plahuta",
+ "Mateju"
+ ]
+ },
+ "uls-region-WW": "Svetovni jeziki",
+ "uls-region-SP": "Posebni",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Evropa",
+ "uls-region-AS": "Azija",
+ "uls-region-ME": "Bližnji vzhod",
+ "uls-region-PA": "Tihi ocean",
+ "uls-region-all": "Vsi jeziki",
+ "uls-no-results-found": "Ni zadetkov",
+ "uls-common-languages": "Predlagani jeziki",
+ "uls-no-results-suggestion-title": "Morda vas zanima:",
+ "uls-search-help": "Iščete lahko po imenu jezika, imenu pisave, jezikovni kodi ISO ali po področju.",
+ "uls-search-placeholder": "Poišči jezik"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/smn.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/smn.json
new file mode 100644
index 00000000..c28d4346
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/smn.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Seipinne"
+ ]
+ },
+ "uls-region-WW": "Maailmkielah",
+ "uls-region-SP": "Eromâškielah",
+ "uls-region-AM": "Amerik",
+ "uls-region-AF": "Afrik",
+ "uls-region-EU": "Euroop",
+ "uls-region-AS": "Aasia",
+ "uls-region-ME": "Alda-nuorttâ",
+ "uls-region-PA": "Kuálhismeerâ kuávlu",
+ "uls-region-all": "Puoh kielah",
+ "uls-no-results-found": "Iä uuccâmpuátuseh",
+ "uls-common-languages": "Iävtuttum kielah",
+ "uls-no-results-suggestion-title": "Aldemus uuccâmpuátuseh:",
+ "uls-search-help": "Uusâ kielâ teikkâ čäällimvyevi noomáin, kielâ ISO-koodijn teikkâ laađâ kielâid kuávlulistoost:",
+ "uls-search-placeholder": "Uusâ kielâ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sms.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sms.json
new file mode 100644
index 00000000..2f8f959b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sms.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yupik"
+ ]
+ },
+ "uls-region-all": "Puk ǩiõl",
+ "uls-no-results-found": "Ni mâiʹd ij käunnʼjam",
+ "uls-common-languages": "Eʹtǩǩuum ǩiõl",
+ "uls-search-placeholder": "Ooʒʒ ǩiõl"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sq.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sq.json
new file mode 100644
index 00000000..93c3bc0f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sq.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Ammartivari",
+ "Kosovastar",
+ "Liridon",
+ "Vanished 456321456"
+ ]
+ },
+ "uls-region-WW": "Në mbarë botën",
+ "uls-region-SP": "Të veçanta",
+ "uls-region-AM": "Amerikë",
+ "uls-region-AF": "Afrikë",
+ "uls-region-EU": "Evropë",
+ "uls-region-AS": "Azi",
+ "uls-region-ME": "Lindje e Mesme",
+ "uls-region-PA": "Paqësor",
+ "uls-region-all": "Të gjitha gjuhët",
+ "uls-no-results-found": "Nuk është gjetur asnjë rezultat",
+ "uls-common-languages": "Gjuhë të sugjeruara",
+ "uls-no-results-suggestion-title": "Ju mund të jeni të interesuar në:",
+ "uls-search-help": "Ju mund të kërkoni sipas emrit të gjuhës, emrit të skriptës, kodit ISO të gjuhës ose ju mund të shfletoni sipa rajonit.",
+ "uls-search-placeholder": "Kërkoni për një gjuhë"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sr-ec.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sr-ec.json
new file mode 100644
index 00000000..e5852d83
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sr-ec.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Milicevic01",
+ "Rancher"
+ ]
+ },
+ "uls-region-WW": "Светски",
+ "uls-region-SP": "Посебно",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азија",
+ "uls-region-ME": "Блиски исток",
+ "uls-region-PA": "Пацифик",
+ "uls-region-all": "Сви језици",
+ "uls-no-results-found": "Нема резултата",
+ "uls-common-languages": "Предложени јeзици",
+ "uls-no-results-suggestion-title": "Можда вас интересује:",
+ "uls-search-help": "Можете да тражите по имену језика или писма, по ISO коду језика или пак по региону.",
+ "uls-search-placeholder": "Претрага језика"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sr-el.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sr-el.json
new file mode 100644
index 00000000..20b0e3f4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sr-el.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Milicevic01",
+ "Rancher"
+ ]
+ },
+ "uls-region-WW": "Svetski",
+ "uls-region-SP": "Posebno",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Evropa",
+ "uls-region-AS": "Azija",
+ "uls-region-ME": "Bliski istok",
+ "uls-region-PA": "Pacifik",
+ "uls-region-all": "Svi jezici",
+ "uls-no-results-found": "Nema rezultata",
+ "uls-common-languages": "Predloženi jezici",
+ "uls-no-results-suggestion-title": "Možda vas interesuje:",
+ "uls-search-help": "Možete da tražite po imenu jezika ili pisma, po ISO kodu jezika ili pak po regionu.",
+ "uls-search-placeholder": "Pretraga jezika"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sro.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sro.json
new file mode 100644
index 00000000..c99b728e
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sro.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "F Samaritani"
+ ]
+ },
+ "uls-region-AM": "Amèrica",
+ "uls-region-AF": "Àfrica",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Àsia",
+ "uls-no-results-found": "Nisciunu arresultau agatau",
+ "uls-search-placeholder": "Circa una lìngua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sv.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sv.json
new file mode 100644
index 00000000..b94deb70
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sv.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cybjit",
+ "Johan",
+ "Jopparn",
+ "WikiPhoenix"
+ ]
+ },
+ "uls-region-WW": "Världsomfattande",
+ "uls-region-SP": "Speciella",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asien",
+ "uls-region-ME": "Mellanöstern",
+ "uls-region-PA": "Stilla havet",
+ "uls-region-all": "Alla språk",
+ "uls-no-results-found": "Inga resultat hittades",
+ "uls-common-languages": "Föreslagna språk",
+ "uls-no-results-suggestion-title": "Du kan vara intresserad av:",
+ "uls-search-help": "Du kan söka efter språkets namn, skriptnamn, ISO-kod för språket eller bläddra efter region.",
+ "uls-search-placeholder": "Sök efter ett språk"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/sw.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/sw.json
new file mode 100644
index 00000000..55b5e500
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/sw.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lloffiwr",
+ "Muddyb",
+ "Muddyb Blast Producer"
+ ]
+ },
+ "uls-region-WW": "Dunia nzima",
+ "uls-region-SP": "Maalumu",
+ "uls-region-AM": "Marekani",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Ulaya",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Mashariki ya Kati",
+ "uls-region-PA": "Pasifiki",
+ "uls-no-results-found": "Hakuna matokeo",
+ "uls-common-languages": "Lugha za kawaida",
+ "uls-no-results-suggestion-title": "Pengine unaweza kuvutiwa na:",
+ "uls-search-help": "Unaweza kutafuta kwa jina la lugha, jina la maandishi, msimbo wa ISO wa lugha, ama unaweza kutafuta kwa eneo.",
+ "uls-search-placeholder": "Tafuta lugha"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/syl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/syl.json
new file mode 100644
index 00000000..7058ef4c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/syl.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "ꠢꠣꠍꠘ ꠞꠣꠎꠣ"
+ ]
+ },
+ "uls-region-WW": "ꠖꠥꠘꠤꠀꠛꠤ",
+ "uls-region-SP": "ꠢꠥꠀꠉꠧꠞ",
+ "uls-region-AM": "ꠀꠝꠦꠞꠤꠇꠣ",
+ "uls-region-AF": "ꠀꠙꠞꠤꠇꠣ",
+ "uls-region-EU": "ꠁꠃꠞꠥꠙ",
+ "uls-region-AS": "ꠄꠡꠤꠀ",
+ "uls-region-ME": "ꠀꠞꠛ-ꠖꠦꠡ",
+ "uls-region-PA": "ꠖꠞꠤꠀꠞꠛꠣꠄꠇꠥꠞ",
+ "uls-region-all": "ꠢꠇꠟ ꠝꠣꠔꠣꠁꠘ",
+ "uls-no-results-found": "ꠇꠥꠘ꠆ꠔꠣ ꠕꠥꠇꠣꠁꠀ ꠝꠤꠟꠌꠦꠘꠣ",
+ "uls-common-languages": "ꠎꠣꠌꠣ ꠝꠣꠔꠣꠁꠘ",
+ "uls-no-results-suggestion-title": "ꠀꠙꠘꠦ ꠝꠘꠧꠔꠅꠄ ꠅꠇꠣꠘꠣꠁꠘ ꠜꠣꠟꠣ ꠙꠣꠁꠛꠣ:",
+ "uls-search-help": "ꠀꠙꠘꠦ ꠕꠥꠇꠣꠁꠔꠣ ꠙꠣꠞꠛꠣ ꠝꠣꠔꠧꠞ ꠘꠣꠝꠖꠤ, ꠟꠤꠙꠤꠞ ꠘꠣꠝꠖꠤ, ꠝꠣꠔꠧꠞ ꠀꠁꠄꠌꠅ ꠇꠧꠒꠖꠤ ꠀꠞꠘꠣꠄ ꠘꠣꠉꠞꠤꠖꠤ",
+ "uls-search-placeholder": "ꠇꠥꠘꠥ ꠝꠣꠔ ꠕꠥꠇꠣꠁꠘ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/szy.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/szy.json
new file mode 100644
index 00000000..0e226f60
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/szy.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Benel"
+ ]
+ },
+ "uls-region-AM": "Amilikaco",
+ "uls-region-AF": "Afilika",
+ "uls-region-EU": "Ouco",
+ "uls-region-AS": "Yaco"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ta.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ta.json
new file mode 100644
index 00000000..77e072f7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ta.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "ElangoRamanujam",
+ "Kanags",
+ "Logicwiki",
+ "Rakeshonwiki",
+ "Santhosh.thottingal"
+ ]
+ },
+ "uls-region-WW": "உலகளாவிய",
+ "uls-region-SP": "சிறப்பு",
+ "uls-region-AM": "அமெரிக்கா",
+ "uls-region-AF": "ஆப்பிரிக்கா",
+ "uls-region-EU": "ஐரோப்பா",
+ "uls-region-AS": "ஆசியா",
+ "uls-region-ME": "மத்திய கிழக்கு",
+ "uls-region-PA": "பசிபிக்",
+ "uls-region-all": "அனைத்து மொழிகள்",
+ "uls-no-results-found": "முடிவுகள் எதுவும் காணப்படவில்லை",
+ "uls-common-languages": "பரிந்துரைக்கப்பட்ட மொழிகள்",
+ "uls-no-results-suggestion-title": "நீங்கள் இவற்றில் ஆர்வமாக இருக்கலாம்:",
+ "uls-search-help": "மொழியின் பெயர், எழுத்து வடிவம், ISO குறியீடு முலம் தேடலாம் அல்லது பகுதிவாரியாக உலவலாம்:",
+ "uls-search-placeholder": "மொழி தேடல்"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/tcy.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/tcy.json
new file mode 100644
index 00000000..9d2494fb
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/tcy.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "BHARATHESHA ALASANDEMAJALU",
+ "VASANTH S.N."
+ ]
+ },
+ "uls-region-WW": "ಪ್ರಪಂಚದಾದ್ಯಂತ",
+ "uls-region-SP": "ವಿಶೇಷ",
+ "uls-region-AM": "ಅಮೇರಿಕ",
+ "uls-region-AF": "ಆಫ್ರಿಕ",
+ "uls-region-EU": "ಯುರೋಪ್",
+ "uls-region-AS": "ಏಷ್ಯಾ",
+ "uls-region-PA": "ಫೆಸಿಫಿಕ್",
+ "uls-search-placeholder": "ಬಾಸೆಲೆನ್ ನಡ್ಲೆ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/tdd.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/tdd.json
new file mode 100644
index 00000000..c0043886
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/tdd.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "咽頭べさ"
+ ]
+ },
+ "uls-region-WW": "ᥖᥒᥰᥐᥛᥱᥚᥣᥱ",
+ "uls-region-SP": "ᥑᥪᥐᥳᥖᥩᥢᥰ",
+ "uls-region-AM": "ᥟᥛᥥᥱᥞᥤᥐ",
+ "uls-region-AF": "ᥟᥣᥱᥚᥞᥤᥐ",
+ "uls-region-EU": "ᥞᥧᥰᥞᥨᥙᥳ",
+ "uls-region-AS": "ᥟᥥᥰᥡᥣᥰ",
+ "uls-region-ME": "ᥙᥩᥖᥰᥐᥣᥒᥴᥖᥣᥒᥰᥟᥩᥐᥱ",
+ "uls-region-PA": "ᥙᥔᥤᥚᥤᥐᥳ",
+ "uls-region-all": "ᥚᥣᥱᥔᥣᥱᥐᥣᥛᥰ ᥖᥒᥰᥔᥥᥒᥲ",
+ "uls-no-results-found": "ᥟᥛᥱᥞᥢᥴᥚᥩᥢᥰᥘᥭᥲ",
+ "uls-common-languages": "ᥚᥣᥱᥔᥣᥱᥟᥢᥴᥓᥬᥳᥢᥛᥴ",
+ "uls-no-results-suggestion-title": "ᥓᥝᥲᥐᥝᥱᥓᥣᥒᥲᥑᥝᥲᥓᥬᥴᥙᥣᥰ:",
+ "uls-search-help": "ᥓᥝᥲᥐᥝᥱ ᥓᥣᥒᥲᥔᥩᥐᥲᥞᥣᥴᥖᥒᥰ ᥓᥪᥲᥚᥣᥱᥔᥣᥱᥐᥣᥛᥰ, ᥓᥪᥲ Script, ᥛᥣᥭᥴ ISO ᥖᥩᥢᥲᥖᥣᥱ ᥚᥣᥱᥔᥣᥱᥐᥣᥛᥰ ᥟᥢᥴᥢᥢᥴ ᥓᥝᥲᥐᥝᥱ ᥓᥣᥒᥲᥙᥪᥖᥱᥞᥣᥴ ᥖᥒᥰ ᥘᥦᥢᥴᥛᥫᥒᥰ region",
+ "uls-search-placeholder": "ᥑᥨᥢᥳᥞᥣᥴ ᥖᥣᥱᥚᥣᥱᥔᥣᥱᥐᥣᥛᥰ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/te.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/te.json
new file mode 100644
index 00000000..9120beb4
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/te.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "JVRKPRASAD",
+ "Veeven",
+ "WP MANIKHANTA"
+ ]
+ },
+ "uls-region-WW": "ప్రపంచవ్యాప్తం",
+ "uls-region-SP": "ప్రత్యేకం",
+ "uls-region-AM": "అమెరికా",
+ "uls-region-AF": "ఆఫ్రికా",
+ "uls-region-EU": "ఐరోపా",
+ "uls-region-AS": "ఆసియా",
+ "uls-region-ME": "మధ్య తూర్పు",
+ "uls-region-PA": "పసిఫిక్",
+ "uls-region-all": "అన్ని భాషలు",
+ "uls-no-results-found": "ఫలితాలేమీ దొరకలేదు",
+ "uls-common-languages": "సూచించిన భాషలు",
+ "uls-no-results-suggestion-title": "మీకు దీనిలో ఆసక్తి ఉండవచ్చు:",
+ "uls-search-help": "మీరు భాష పేరు, లిపి పేరు, భాష ISO కోడు ద్వారా వెతకవచ్చు లేదా మీరు ప్రాంతం ద్వారా విహరింవచ్చు.",
+ "uls-search-placeholder": "భాష కొరకు వెతకండి"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/th.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/th.json
new file mode 100644
index 00000000..b4640044
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/th.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Octahedron80",
+ "Pon44695"
+ ]
+ },
+ "uls-region-WW": "ทั่วโลก",
+ "uls-region-SP": "พิเศษ",
+ "uls-region-AM": "อเมริกา",
+ "uls-region-AF": "แอฟริกา",
+ "uls-region-EU": "ยุโรป",
+ "uls-region-AS": "เอเชีย",
+ "uls-region-ME": "ตะวันออกกลาง",
+ "uls-region-PA": "แปซิฟิก",
+ "uls-region-all": "ทุกภาษา",
+ "uls-no-results-found": "ไม่พบผลลัพธ์",
+ "uls-common-languages": "ภาษาที่แนะนำ",
+ "uls-no-results-suggestion-title": "คุณอาจสนใจใน:",
+ "uls-search-help": "คุณสามารถค้นหาด้วยชื่อภาษา ชื่ออักษร รหัส ISO ของภาษา หรือสามารถเรียกดูตามภูมิภาค",
+ "uls-search-placeholder": "ค้นหาภาษา"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ti.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ti.json
new file mode 100644
index 00000000..083b5b8a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ti.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joanmp17"
+ ]
+ },
+ "uls-region-WW": "ምሉእ ዓለማዊ",
+ "uls-region-SP": "ፍሉይ",
+ "uls-region-AM": "ኣመሪካ",
+ "uls-region-AF": "ኣፍሪቃ",
+ "uls-region-EU": "ኤውሮጳ",
+ "uls-region-AS": "ኤስያ",
+ "uls-region-ME": "ማእከላይ ምብራቕ",
+ "uls-region-PA": "ሰላማዊ",
+ "uls-region-all": "ኩሎም ቋንቋታት",
+ "uls-no-results-found": "ውጺኢታት ኣይተረኸቡን",
+ "uls-common-languages": "ዝምከሩ ቋንቋታት",
+ "uls-search-placeholder": "ቋንቋ ድለይ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/tl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/tl.json
new file mode 100644
index 00000000..9f76ad1b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/tl.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "GinawaSaHapon"
+ ]
+ },
+ "uls-region-WW": "Pandaigdigan",
+ "uls-region-SP": "Natatangi",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Aprika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asya",
+ "uls-region-ME": "Gitnang Silangan",
+ "uls-region-PA": "Pasipiko",
+ "uls-region-all": "Lahat ng wika",
+ "uls-no-results-found": "Walang nakitang resulta",
+ "uls-common-languages": "Minumungkahing wika",
+ "uls-no-results-suggestion-title": "Baka interesado ka sa:",
+ "uls-search-help": "Makakahanap ka gamit ang pangalan ng wika, pangalan ng sulat, ISO code ng wika, o pwede ka rin naman mag-browse sa bawat rehiyon.",
+ "uls-search-placeholder": "Maghanap ng wika"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/tly.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/tly.json
new file mode 100644
index 00000000..1f90e1f3
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/tly.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Erdemaslancan",
+ "Patriot Kur",
+ "Гусейн"
+ ]
+ },
+ "uls-region-WW": "Həmədınyo",
+ "uls-region-SP": "Xısusi",
+ "uls-region-AM": "Əmerikə",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Avropə",
+ "uls-region-AS": "Asiyə",
+ "uls-region-ME": "Miyonə Şərğ",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Həmə zıvonon",
+ "uls-no-results-found": "Hiçi pəydo bıəni",
+ "uls-common-languages": "Tovsiyə kardə bıə zıvonon",
+ "uls-no-results-suggestion-title": "Bəzne bə ki bo şımə marağinin ın zıvonon:",
+ "uls-search-help": "Шымә бәзнејон де зывони номи ја нывыштәј нәве, де зывони ISO-коди ја де вилојәти дијә карде.",
+ "uls-search-placeholder": "Bınəv zıvoni"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/tok.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/tok.json
new file mode 100644
index 00000000..92ee312a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/tok.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robin van der Vliet",
+ "SpanishSnake"
+ ]
+ },
+ "uls-region-WW": "ma ale",
+ "uls-region-SP": "namako",
+ "uls-region-AM": "ma Amelika",
+ "uls-region-AF": "ma Apika",
+ "uls-region-EU": "ma Elopa",
+ "uls-region-AS": "ma Asija",
+ "uls-region-ME": "insa pi suno kama",
+ "uls-region-PA": "ma Pasipi",
+ "uls-region-all": "toki ale",
+ "uls-no-results-found": "alasa la, ijo ala li kama lon.",
+ "uls-common-languages": "toki pi ken pona",
+ "uls-no-results-suggestion-title": "ken la, sina wile e ni:",
+ "uls-search-help": "sina ken alasa kepeken nimi toki, kepeken nasin sitelen, kepeken nimi ISO, kepeken ma ante.",
+ "uls-search-placeholder": "o alasa e toki"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/tr.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/tr.json
new file mode 100644
index 00000000..53a650ef
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/tr.json
@@ -0,0 +1,28 @@
+{
+ "@metadata": {
+ "authors": [
+ "1917 Ekim Devrimi",
+ "BaRaN6161 TURK",
+ "Emperyan",
+ "Erdemaslancan",
+ "Kumkumuk",
+ "Marmase",
+ "MrSchipunov",
+ "Sadrettin"
+ ]
+ },
+ "uls-region-WW": "Dünya çapında",
+ "uls-region-SP": "Özel",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Avrupa",
+ "uls-region-AS": "Asya",
+ "uls-region-ME": "Orta Doğu",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Tüm diller",
+ "uls-no-results-found": "Sonuç bulunamadı",
+ "uls-common-languages": "Önerilen diller",
+ "uls-no-results-suggestion-title": "İlginizi çekebilir:",
+ "uls-search-help": "Dil adına, betik adına, dilin ISO koduna göre arama yapabilirsiniz ya da bölgeye göre tarayabilirsiniz.",
+ "uls-search-placeholder": "Bir dil arayın"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/tt-cyrl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/tt-cyrl.json
new file mode 100644
index 00000000..eba2302a
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/tt-cyrl.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ajdar",
+ "Ерней",
+ "Ильнар"
+ ]
+ },
+ "uls-region-WW": "Бөтендөнья",
+ "uls-region-SP": "Махсус",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Аурупа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Якын Көнчыгыш",
+ "uls-region-PA": "Океания",
+ "uls-region-all": "Барлык телләр",
+ "uls-no-results-found": "Берни дә табылмаган",
+ "uls-common-languages": "Тәкъдим ителгән телләр",
+ "uls-no-results-suggestion-title": "Бәлки сезне бу телләр кызыксындырыр:",
+ "uls-search-help": "Сез телнең яки әлифбаның исеме, телнең ISO коды буенча эзли аласыз яки төбәк буенча карый аласыз.",
+ "uls-search-placeholder": "Тел буенча эзләү"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/tum.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/tum.json
new file mode 100644
index 00000000..8fdecc31
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/tum.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tumbuka Arch"
+ ]
+ },
+ "uls-region-WW": "Chalochose",
+ "uls-region-SP": "Vakupatulika",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afilika",
+ "uls-region-EU": "Yulaya",
+ "uls-region-AS": "Asia",
+ "uls-region-ME": "Pakati kwaMafumilo ghadazi",
+ "uls-region-PA": "Pasifiki",
+ "uls-region-all": "Viyowoyelo vyose",
+ "uls-no-results-found": "Palije icho chasangika",
+ "uls-common-languages": "Viyowoyelo vakusachizgika",
+ "uls-no-results-suggestion-title": "Panji mungatemwaso :",
+ "uls-search-help": "Mungafufuza zina la chiyowoyelo, zina la script, ISO code ya chiyowoyelo panji chigaŵa.",
+ "uls-search-placeholder": "Fufuza chiyowoyelo"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/tw.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/tw.json
new file mode 100644
index 00000000..0520e6f3
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/tw.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amoarich",
+ "Robertjamal12"
+ ]
+ },
+ "uls-region-WW": "Wiase bɛbiara",
+ "uls-region-SP": "Soronko",
+ "uls-region-AM": "Amelica",
+ "uls-region-AF": "Abibiman",
+ "uls-region-EU": "Yurop",
+ "uls-region-AS": "Ahyia",
+ "uls-region-ME": "Mfimfini Apueɛ",
+ "uls-region-PA": "Po",
+ "uls-region-all": "Kasa ahorow nyinaa",
+ "uls-no-results-found": "Yɛn ho hwee",
+ "uls-common-languages": "Kasa ahorow a yɛgye di sɛ wo pɛ",
+ "uls-no-results-suggestion-title": "Nea w'ani bɛ gye ho:",
+ "uls-search-placeholder": "Hwehwɛ kasa bi"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/twd.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/twd.json
new file mode 100644
index 00000000..046c5397
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/twd.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robin van der Vliet"
+ ]
+ },
+ "uls-region-WW": "Wearldwied",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/tzm.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/tzm.json
new file mode 100644
index 00000000..b6f6c016
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/tzm.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tifinaghes"
+ ]
+ },
+ "uls-region-WW": "ⵎⴰⵕⵕⴰ ⴰⵎⴰⴹⴰⵍ",
+ "uls-region-AM": "ⴰⵎⵔⵉⴽⴰ",
+ "uls-region-AF": "ⵉⴼⵔⵉⵇⵢⴰ",
+ "uls-region-EU": "ⵜⵓⵔⵓⴼⵜ (Europe)",
+ "uls-region-AS": "ⴰⵙⵢⴰ",
+ "uls-common-languages": "ⵜⵓⵜⵍⴰⵢⵉⵏ ⵉⴷⵔⵓⵏ",
+ "uls-search-placeholder": "ⵜⵓⵜⵍⴰⵢⵜ ⵓⵔⵣⵣⵓ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/udm.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/udm.json
new file mode 100644
index 00000000..c1a57137
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/udm.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "AlnashPiyash2",
+ "Kotwys",
+ "Wadorgurt"
+ ]
+ },
+ "uls-region-WW": "Быдэс дуннеысь",
+ "uls-region-SP": "Нимысьтыз",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Европа",
+ "uls-region-AS": "Азия",
+ "uls-region-ME": "Матысь Ӵукпал",
+ "uls-region-PA": "Океания",
+ "uls-region-all": "Вань кылъёс",
+ "uls-no-results-found": "Шедьтэмын ӧвӧл",
+ "uls-common-languages": "Ӵектэм кылъёс",
+ "uls-no-results-suggestion-title": "Тӥледлы та кылъёс тунсыко луозы, дыр:",
+ "uls-search-help": "Кылэз нимызъя, гожъяськонэзъя, ISO кодэзъя утчамды луэ яке улосвылысь учкемды луэ.",
+ "uls-search-placeholder": "Кылэз утчан"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ug-arab.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ug-arab.json
new file mode 100644
index 00000000..6d201808
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ug-arab.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Sahran",
+ "Tel'et",
+ "Uzdil"
+ ]
+ },
+ "uls-region-WW": "دۇنيادا",
+ "uls-region-SP": "ئالاھىدە",
+ "uls-region-AM": "ئامېرىكا",
+ "uls-region-AF": "ئافرىقا",
+ "uls-region-EU": "ياۋروپا",
+ "uls-region-AS": "ئاسىيا",
+ "uls-region-ME": "ئوتتۇرا شەرق",
+ "uls-region-PA": "ئاتلانتىك",
+ "uls-region-all": "بارلىق تىللار",
+ "uls-no-results-found": "نەتىجە تېپىلمىدى",
+ "uls-common-languages": "تەۋسىيە تىللار",
+ "uls-no-results-suggestion-title": "قىزىقىشىڭىز مۇمكىن:",
+ "uls-search-help": "سىز تىل نامى، يېزىق شەكلى نامى، تىلنىڭ ISO كودى بويىچە ئىزدىيەلەيسىز ياكى رايون بويىچە كۆرەلەيسىز:",
+ "uls-search-placeholder": "تىل ئىزدەش"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/uk.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/uk.json
new file mode 100644
index 00000000..03429eff
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/uk.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Alex Khimich",
+ "Amire80",
+ "Andriykopanytsia",
+ "Base",
+ "Piramidion"
+ ]
+ },
+ "uls-region-WW": "Всесвітні",
+ "uls-region-SP": "Спеціальні",
+ "uls-region-AM": "Америка",
+ "uls-region-AF": "Африка",
+ "uls-region-EU": "Європа",
+ "uls-region-AS": "Азія",
+ "uls-region-ME": "Близький Схід",
+ "uls-region-PA": "Океанія",
+ "uls-region-all": "Усі мови",
+ "uls-no-results-found": "Не знайдено результатів",
+ "uls-common-languages": "Пропоновані мови",
+ "uls-no-results-suggestion-title": "Ви можете бути зацікавленими у:",
+ "uls-search-help": "Ви можете шукати за назвою мови або писемності, ISO-коду мови, або можете вказати регіон.",
+ "uls-search-placeholder": "Пошук мови"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/ur.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/ur.json
new file mode 100644
index 00000000..0fb066bc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/ur.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Muhammad Shuaib",
+ "Obaid Raza"
+ ]
+ },
+ "uls-region-WW": "دنیا بھر میں",
+ "uls-region-SP": "خاص",
+ "uls-region-AM": "امریکا",
+ "uls-region-AF": "افریقہ",
+ "uls-region-EU": "یورپ",
+ "uls-region-AS": "ایشیا",
+ "uls-region-ME": "مشرق وسطی",
+ "uls-region-PA": "بحر الکاہل",
+ "uls-region-all": "تمام زبانیں",
+ "uls-no-results-found": "مطلوبہ نتائج نہیں ملے",
+ "uls-common-languages": "تجویز کردہ زبانیں",
+ "uls-no-results-suggestion-title": "شاید آپ ان میں دلچسپی لیں:",
+ "uls-search-help": "آپ زبان کے نام، اسکرپٹ، زبان کے آئی ایس او رمز کے ذریعہ تلاش کر سکتے ہیں، یا خطہ وار بھی ڈھونڈ سکتے ہیں۔",
+ "uls-search-placeholder": "زبان تلاش کریں"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/uz.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/uz.json
new file mode 100644
index 00000000..c1c10fec
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/uz.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "6ahodir",
+ "Akmalzhon",
+ "CoderSI",
+ "Nataev",
+ "Таржимон"
+ ]
+ },
+ "uls-region-WW": "Butun jahon",
+ "uls-region-SP": "Maxsus",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Yevropa",
+ "uls-region-AS": "Osiyo",
+ "uls-region-ME": "Yaqin Sharq",
+ "uls-region-PA": "Okeaniya",
+ "uls-no-results-found": "Natija topilmadi",
+ "uls-common-languages": "Avtomatik tanlangan tillar",
+ "uls-no-results-suggestion-title": "Sizni qiziqtirishi mumkin:",
+ "uls-search-help": "Til hamda yozuv nomi yoki ISO kod bilan izlashingiz mumkin. Hudud boʻyicha koʻrib chiqishingiz ham mumkin.",
+ "uls-search-placeholder": "Qidiruv tili"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/vec.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/vec.json
new file mode 100644
index 00000000..dcfd3234
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/vec.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fierodelveneto",
+ "GatoSelvadego"
+ ]
+ },
+ "uls-region-WW": "Tuto el mondo",
+ "uls-region-SP": "Speçiałe",
+ "uls-region-AM": "Mèrica",
+ "uls-region-AF": "Àfrica",
+ "uls-region-EU": "Eoropa",
+ "uls-region-AS": "Axia",
+ "uls-region-ME": "Levante mexan",
+ "uls-region-PA": "Pasifego",
+ "uls-region-all": "Tute ƚe ƚengue",
+ "uls-no-results-found": "Nisun rixultà",
+ "uls-common-languages": "Lengue sujerìe",
+ "uls-no-results-suggestion-title": "Te pol èsar interesà a:",
+ "uls-search-help": "Xe posibiƚe sercar par nòme, nòme del script, còdexe ISO de ƚa lengua o se połe navegar par rejon.",
+ "uls-search-placeholder": "Serca na lengua"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/vep.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/vep.json
new file mode 100644
index 00000000..f7ab66bc
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/vep.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Игорь Бродский"
+ ]
+ },
+ "uls-region-WW": "Kaikjal",
+ "uls-region-SP": "Specialine",
+ "uls-region-AM": "Amerik",
+ "uls-region-AF": "Afrik",
+ "uls-region-EU": "Evrop",
+ "uls-region-AS": "Azii",
+ "uls-region-ME": "Keskmäine Päivnouzmpol'",
+ "uls-region-PA": "Okeanii",
+ "uls-no-results-found": "Ei ole rezul'tatoid",
+ "uls-common-languages": "Ühthižed keled",
+ "uls-no-results-suggestion-title": "Teile voiži tartta mel'he:",
+ "uls-search-help": "Tö voit ecmäha kelen, skriptannimen, kelen ISO-kodan mödhe, vai valita regioniden mödhe:",
+ "uls-search-placeholder": "Kelenecmine"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/vi.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/vi.json
new file mode 100644
index 00000000..6e51c5e2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/vi.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Minh Nguyen",
+ "Tuankiet65"
+ ]
+ },
+ "uls-region-WW": "Toàn cầu",
+ "uls-region-SP": "Đặc biệt",
+ "uls-region-AM": "Châu Mỹ",
+ "uls-region-AF": "Châu Phi",
+ "uls-region-EU": "Châu Âu",
+ "uls-region-AS": "Châu Á",
+ "uls-region-ME": "Trung Đông",
+ "uls-region-PA": "Châu Đại Dương",
+ "uls-region-all": "Tất cả các ngôn ngữ",
+ "uls-no-results-found": "Không tìm thấy kết quả",
+ "uls-common-languages": "Ngôn ngữ gợi ý",
+ "uls-no-results-suggestion-title": "Bạn có thể quan tâm:",
+ "uls-search-help": "Bạn có thể tìm kiếm theo tên ngôn ngữ, tên hệ thống chữ viết, hay mã ISO của ngôn ngữ hoặc duyệt theo khu vực.",
+ "uls-search-placeholder": "Tìm kiếm ngôn ngữ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/vo.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/vo.json
new file mode 100644
index 00000000..438d5011
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/vo.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robin van der Vliet"
+ ]
+ },
+ "uls-region-SP": "Patik",
+ "uls-region-AM": "Merop",
+ "uls-region-AF": "Frikop",
+ "uls-region-EU": "Yurop",
+ "uls-region-AS": "Siyop"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/war.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/war.json
new file mode 100644
index 00000000..d8829f97
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/war.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Harvzsf",
+ "JinJian",
+ "Wiki indio"
+ ]
+ },
+ "uls-region-WW": "ha Kalibutan",
+ "uls-region-SP": "Pinaurog",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Asya",
+ "uls-region-ME": "Butnga nga Sinirangan / Katundan nga Asya",
+ "uls-region-PA": "Pasipiko",
+ "uls-no-results-found": "Waray mga resulta nga nabilngan",
+ "uls-common-languages": "Mga komun o ginsasaroan nga mga pinulongan",
+ "uls-no-results-suggestion-title": "Bangin ka ma-intersado hin:",
+ "uls-search-help": "Puyde ka magbiling ha kanan ngaran han pinulongan, ngaran han paagi hin pagsurat, ISO nga kodigo han pinulongan o puyde ka magdalikyat ha kanan rehiyon",
+ "uls-search-placeholder": "Pagbiling hin yinaknan"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/xmf.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/xmf.json
new file mode 100644
index 00000000..9c59f2d1
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/xmf.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Narazeni"
+ ]
+ },
+ "uls-region-WW": "მოსოფელი",
+ "uls-region-SP": "სპეციალური",
+ "uls-region-AM": "ამერიკა",
+ "uls-region-AF": "აფრიკა",
+ "uls-region-EU": "ევროპა",
+ "uls-region-AS": "აზია",
+ "uls-region-ME": "არხო ბჟაეიოლი",
+ "uls-region-PA": "ოკიანეთი",
+ "uls-region-all": "არძა ნინა",
+ "uls-no-results-found": "შედეგიქ ვეგორინჷ",
+ "uls-common-languages": "მერზიებული ნინეფი",
+ "uls-search-placeholder": "ნინაშ გორუა"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/yi.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/yi.json
new file mode 100644
index 00000000..a77947e6
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/yi.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Castillerian",
+ "פוילישער"
+ ]
+ },
+ "uls-region-WW": "גלאָבאַל",
+ "uls-region-SP": "באַזונדער",
+ "uls-region-AM": "אַמעריקע",
+ "uls-region-AF": "אַפֿריקע",
+ "uls-region-EU": "אייראָפּע",
+ "uls-region-AS": "אַזיע",
+ "uls-region-ME": "מיטל מזרח",
+ "uls-region-PA": "פּאַציפֿיק",
+ "uls-region-all": "אַלע שפּראַכן",
+ "uls-no-results-found": "קיין רעזולטאַטן נישט געטראָפֿן.",
+ "uls-common-languages": "פֿירגעלייגטע שפּראַכן",
+ "uls-no-results-suggestion-title": "עס וועט אפֿשר דיר אינייערעסירן:",
+ "uls-search-help": "מע קען זוכן לויט שפּראַך־נאָמען, שריפֿט־אָמען, ISO־קאָדפֿון שפּראַך אָדער קען מען בלעטערן לויט ראַיאָן.",
+ "uls-search-placeholder": "זוכן אַ שפּראַך"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/yrl.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/yrl.json
new file mode 100644
index 00000000..9ded3757
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/yrl.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Karapananguasú Kururú Teremembé",
+ "Maracajá Teremembé"
+ ]
+ },
+ "uls-region-WW": "Opaĩwara",
+ "uls-region-SP": "Katumunhãgara",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Zoropa",
+ "uls-region-AS": "Asiya",
+ "uls-region-ME": "Çẽmuçawa Miterara",
+ "uls-region-PA": "Katuawa Parãnawaçú",
+ "uls-region-all": "Panhẽ nhẽẽga'etá",
+ "uls-no-results-found": "Ti yawaçẽmu ne yepé çuaxara",
+ "uls-common-languages": "Ĩdé remurú reyumuçé kuá nhẽẽga'etá",
+ "uls-no-results-suggestion-title": "Ĩdé remurú reyumuçé yawá çui:",
+ "uls-search-help": "Ĩdé remurú resikári nhẽẽga rera rupí, titapawa rera, ã nhẽẽga ISO yupinimaçawa, ã usikári retãma rupí.",
+ "uls-search-placeholder": "Usikári yepé nhẽẽga"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/yue.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/yue.json
new file mode 100644
index 00000000..173c6409
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/yue.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hello903hello",
+ "Moon0319",
+ "Roy17",
+ "Z423x5c6"
+ ]
+ },
+ "uls-region-WW": "全世界",
+ "uls-region-SP": "特別",
+ "uls-region-AM": "美洲",
+ "uls-region-AF": "非洲",
+ "uls-region-EU": "歐洲",
+ "uls-region-AS": "亞洲",
+ "uls-region-ME": "中東",
+ "uls-region-PA": "太平洋",
+ "uls-region-all": "全部嘅話",
+ "uls-no-results-found": "搵唔到結果",
+ "uls-common-languages": "建議嘅話",
+ "uls-no-results-suggestion-title": "您可能有興趣:",
+ "uls-search-help": "你可以用語言名、程式碼名、語言 ISO 代碼搜尋,亦都可以按地區瀏覽。",
+ "uls-search-placeholder": "搵一種話"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/zea.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/zea.json
new file mode 100644
index 00000000..71d97e58
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/zea.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robin van der Vliet",
+ "Robin0van0der0vliet"
+ ]
+ },
+ "uls-region-WW": "Waereldwied",
+ "uls-region-SP": "Speciaal",
+ "uls-region-AM": "Amerika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Europa",
+ "uls-region-AS": "Azië",
+ "uls-region-ME": "Midden-Oôsten",
+ "uls-region-PA": "Pacifisch gebied"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/zgh.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/zgh.json
new file mode 100644
index 00000000..a75b43a2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/zgh.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aslmad mohamed belarhzali",
+ "Brahim-essaidi",
+ "Hakim1bal"
+ ]
+ },
+ "uls-region-WW": "ⴳ ⵓⵎⴰⴹⴰⵍ ⴰⴽⴽ",
+ "uls-region-SP": "ⴰⵎⵥⵍⵉ",
+ "uls-region-AM": "ⵜⴰⵎⵔⵉⴽⵜ",
+ "uls-region-AF": "ⵜⴰⴼⵔⵉⵇⵜ",
+ "uls-region-EU": "ⵜⵓⵕⵓⴼⵜ",
+ "uls-region-AS": "ⵜⴰⵣⵉⵜ",
+ "uls-region-ME": "ⴰⴳⵎⵓⴹ ⴰⵏⴰⵎⵎⴰⵙ",
+ "uls-region-PA": "ⴰⴳⴰⵔⴰⵡ ⵉⵎⵣⴳⵉ",
+ "uls-region-all": "ⵜⵓⵜⵍⴰⵢⵉⵏ ⴰⴽⴽⵯ",
+ "uls-no-results-found": "ⵓⵔ ⵜⵜⵢⴰⴼⴰⵏⵜ ⵜⵢⴰⴼⵓⵜⵉⵏ",
+ "uls-common-languages": "ⵜⵓⵜⵍⴰⵢⵉⵏ ⵉⵜⵜⵓⵙⵓⵎⵔⵏ",
+ "uls-search-placeholder": "ⵔⵣⵓ ⵖⴼ ⴽⵔⴰ ⵏ ⵜⵓⵜⵍⴰⵢⵜ"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hans.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hans.json
new file mode 100644
index 00000000..0aeff94c
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hans.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Liuxinyu970226",
+ "Xiaomingyan",
+ "Yfdyh000"
+ ]
+ },
+ "uls-region-WW": "世界各地",
+ "uls-region-SP": "特别",
+ "uls-region-AM": "美洲",
+ "uls-region-AF": "非洲",
+ "uls-region-EU": "欧洲",
+ "uls-region-AS": "亚洲",
+ "uls-region-ME": "中东",
+ "uls-region-PA": "太平洋",
+ "uls-region-all": "所有语言",
+ "uls-no-results-found": "无搜索结果",
+ "uls-common-languages": "建议的语言",
+ "uls-no-results-suggestion-title": "您可能感兴趣:",
+ "uls-search-help": "您可以按语言名称、文字名称、语言的ISO代码搜索,或按地区浏览。",
+ "uls-search-placeholder": "搜索一种语言"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hant.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hant.json
new file mode 100644
index 00000000..032cf8a6
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hant.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Justincheng12345",
+ "Kly",
+ "LNDDYL",
+ "Simon Shek"
+ ]
+ },
+ "uls-region-WW": "全世界",
+ "uls-region-SP": "特別",
+ "uls-region-AM": "美洲",
+ "uls-region-AF": "非洲",
+ "uls-region-EU": "歐洲",
+ "uls-region-AS": "亞洲",
+ "uls-region-ME": "中東",
+ "uls-region-PA": "太平洋",
+ "uls-region-all": "所有語言",
+ "uls-no-results-found": "找不到任何結果",
+ "uls-common-languages": "推薦語言",
+ "uls-no-results-suggestion-title": "您可能感興趣:",
+ "uls-search-help": "您可以按語言名稱、程式碼名稱、語言 ISO 代碼搜尋,或您亦可按區域瀏覽。",
+ "uls-search-placeholder": "搜尋一種語言"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hk.json b/UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hk.json
new file mode 100644
index 00000000..b84332f3
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/i18n/zh-hk.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "StarrySky"
+ ]
+ },
+ "uls-region-WW": "世界各地",
+ "uls-region-SP": "特別",
+ "uls-region-AM": "美洲",
+ "uls-region-AF": "非洲",
+ "uls-region-EU": "歐洲",
+ "uls-region-AS": "亞洲",
+ "uls-region-ME": "中東",
+ "uls-region-PA": "太平洋",
+ "uls-region-all": "所有語言",
+ "uls-no-results-found": "找不到結果",
+ "uls-common-languages": "推薦語言",
+ "uls-no-results-suggestion-title": "您可能感興趣:",
+ "uls-search-help": "您可以按語言名稱、程式碼名稱、語言 ISO 代碼搜尋,或您亦可按區域瀏覽。",
+ "uls-search-placeholder": "搜尋一種語言"
+}
diff --git a/UniversalLanguageSelector/lib/jquery.uls/images/close.svg b/UniversalLanguageSelector/lib/jquery.uls/images/close.svg
new file mode 100644
index 00000000..4ed25ba2
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/images/close.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <title>
+ close
+ </title>
+ <path d="M4.34 2.93l12.73 12.73-1.41 1.41L2.93 4.35z"/>
+ <path d="M17.07 4.34L4.34 17.07l-1.41-1.41L15.66 2.93z"/>
+</svg>
diff --git a/UniversalLanguageSelector/lib/jquery.uls/images/language.svg b/UniversalLanguageSelector/lib/jquery.uls/images/language.svg
new file mode 100644
index 00000000..9262f73f
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/images/language.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <title>
+ language
+ </title>
+ <path d="M20 18h-1.44a.61.61 0 0 1-.4-.12.81.81 0 0 1-.23-.31L17 15h-5l-1 2.54a.77.77 0 0 1-.22.3.59.59 0 0 1-.4.14H9l4.55-11.47h1.89zm-3.53-4.31L14.89 9.5a11.62 11.62 0 0 1-.39-1.24q-.09.37-.19.69l-.19.56-1.58 4.19zm-6.3-1.58a13.43 13.43 0 0 1-2.91-1.41 11.46 11.46 0 0 0 2.81-5.37H12V4H7.31a4 4 0 0 0-.2-.56C6.87 2.79 6.6 2 6.6 2l-1.47.5s.4.89.6 1.5H0v1.33h2.15A11.23 11.23 0 0 0 5 10.7a17.19 17.19 0 0 1-5 2.1q.56.82.87 1.38a23.28 23.28 0 0 0 5.22-2.51 15.64 15.64 0 0 0 3.56 1.77zM3.63 5.33h4.91a8.11 8.11 0 0 1-2.45 4.45 9.11 9.11 0 0 1-2.46-4.45z"/>
+</svg>
diff --git a/UniversalLanguageSelector/lib/jquery.uls/images/search.svg b/UniversalLanguageSelector/lib/jquery.uls/images/search.svg
new file mode 100644
index 00000000..61be6a40
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/images/search.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <title>
+ search
+ </title>
+ <path fill-rule="evenodd" d="M12.2 13.6a7 7 0 111.4-1.4l5.4 5.4-1.4 1.4-5.4-5.4zM13 8A5 5 0 113 8a5 5 0 0110 0z"/>
+</svg>
diff --git a/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.core.js b/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.core.js
new file mode 100644
index 00000000..1c5d2d17
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.core.js
@@ -0,0 +1,499 @@
+/**
+ * Universal Language Selector
+ * ULS core component.
+ *
+ * Copyright (C) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
+ * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
+ * contributors. See CREDITS for a list.
+ *
+ * UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
+ * have to do anything special to choose one license or the other and you don't
+ * have to notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @file
+ * @license GNU General Public Licence 2.0 or later
+ * @license MIT License
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ var template, ULS;
+
+ // Region numbers in id attributes also appear in the langdb.
+ template = '<div class="grid uls-menu"> \
+ <div id="search" class="row uls-search"> \
+ <div class="uls-search-wrapper"> \
+ <label class="uls-search-label" for="uls-languagefilter"></label>\
+ <div class="uls-search-input-wrapper">\
+ <span class="uls-languagefilter-clear"></span>\
+ <input type="text" class="uls-filterinput uls-filtersuggestion"\
+ disabled="true" autocomplete="off">\
+ <input type="text" class="uls-filterinput uls-languagefilter"\
+ maxlength="40"\
+ data-clear="uls-languagefilter-clear"\
+ data-suggestion="uls-filtersuggestion"\
+ placeholder="Search for a language" autocomplete="off">\
+ </div>\
+ </div>\
+ </div>\
+ <div class="row uls-language-list"></div>\
+ <div class="row" id="uls-settings-block"></div>\
+ </div>';
+
+ /**
+ * ULS Public class definition
+ *
+ * @param {Element} element
+ * @param {Object} options
+ */
+ ULS = function ( element, options ) {
+ var code;
+ this.$element = $( element );
+ this.options = $.extend( {}, $.fn.uls.defaults, options );
+ this.$menu = $( template );
+ this.languages = this.options.languages;
+
+ for ( code in this.languages ) {
+ if ( $.uls.data.languages[ code ] === undefined ) {
+ // Language is unknown to ULS.
+ delete this.languages[ code ];
+ }
+ }
+
+ this.left = this.options.left;
+ this.top = this.options.top;
+ this.shown = false;
+ this.initialized = false;
+ this.shouldRecreate = false;
+ this.menuWidth = this.getMenuWidth();
+
+ this.$languageFilter = this.$menu.find( '.uls-languagefilter' );
+ this.$resultsView = this.$menu.find( '.uls-language-list' );
+
+ this.render();
+ this.listen();
+ this.ready();
+ };
+
+ ULS.prototype = {
+ constructor: ULS,
+
+ /**
+ * A "hook" that runs after the ULS constructor.
+ * At this point it is not guaranteed that the ULS has its dimensions
+ * and that the languages lists are initialized.
+ *
+ * To use it, pass a function as the onReady parameter
+ * in the options when initializing ULS.
+ */
+ ready: function () {
+ if ( this.options.onReady ) {
+ this.options.onReady.call( this );
+ }
+ },
+
+ /**
+ * A "hook" that runs after the ULS panel becomes visible
+ * by using the show method.
+ *
+ * To use it, pass a function as the onVisible parameter
+ * in the options when initializing ULS.
+ */
+ visible: function () {
+ if ( this.options.onVisible ) {
+ this.options.onVisible.call( this );
+ }
+ },
+
+ /**
+ * Calculate the position of ULS
+ * Returns an object with top and left properties.
+ *
+ * @return {Object}
+ */
+ position: function () {
+ var pos,
+ top = this.top,
+ left = this.left;
+
+ if ( this.options.onPosition ) {
+ return this.options.onPosition.call( this );
+ }
+
+ // Default implementation (middle of the screen under the trigger)
+ if ( top === undefined ) {
+ pos = $.extend( {}, this.$element.offset(), {
+ height: this.$element[ 0 ].offsetHeight
+ } );
+ top = pos.top + pos.height;
+ }
+
+ if ( left === undefined ) {
+ left = $( window ).width() / 2 - this.$menu.outerWidth() / 2;
+ }
+
+ return {
+ top: top,
+ left: left
+ };
+ },
+
+ /**
+ * Show the ULS window
+ */
+ show: function () {
+ var widthClasses = {
+ wide: 'uls-wide',
+ medium: 'uls-medium',
+ narrow: 'uls-narrow'
+ };
+
+ this.$menu.addClass( widthClasses[ this.menuWidth ] );
+
+ if ( !this.initialized ) {
+ $( document.body ).prepend( this.$menu );
+ this.i18n();
+ this.initialized = true;
+ }
+
+ this.$menu.css( this.position() );
+ this.$menu.show();
+ this.$menu.scrollIntoView();
+ this.shown = true;
+
+ if ( !this.isMobile() ) {
+ this.$languageFilter.trigger( 'focus' );
+ }
+
+ this.visible();
+ },
+
+ i18n: function () {
+ if ( $.i18n ) {
+ this.$menu.find( '[data-i18n]' ).i18n();
+ this.$languageFilter.prop( 'placeholder', $.i18n( 'uls-search-placeholder' ) );
+ }
+ },
+
+ /**
+ * Hide the ULS window
+ */
+ hide: function () {
+ this.$menu.hide();
+ this.shown = false;
+
+ this.$menu.removeClass( 'uls-wide uls-medium uls-narrow' );
+
+ if ( this.shouldRecreate ) {
+ this.recreateLanguageFilter();
+ }
+
+ if ( this.options.onCancel ) {
+ this.options.onCancel.call( this );
+ }
+ },
+
+ /**
+ * Render the UI elements.
+ * Does nothing by default. Can be used for customization.
+ */
+ render: function () {
+ // Rendering stuff here
+ },
+
+ /**
+ * Callback for results found context.
+ */
+ success: function () {
+ this.$resultsView.show();
+ },
+
+ createLanguageFilter: function () {
+ var lcd, languagesCount,
+ columnsOptions = {
+ wide: 4,
+ medium: 2,
+ narrow: 1
+ };
+
+ languagesCount = Object.keys( this.options.languages ).length;
+ lcd = this.$resultsView.lcd( {
+ languages: this.languages,
+ columns: columnsOptions[ this.menuWidth ],
+
+ quickList: languagesCount > 12 ? this.options.quickList : [],
+ clickhandler: this.select.bind( this ),
+ showRegions: this.options.showRegions,
+ languageDecorator: this.options.languageDecorator,
+ noResultsTemplate: this.options.noResultsTemplate,
+ itemsPerColumn: this.options.itemsPerColumn,
+ groupByRegion: this.options.groupByRegion
+ } ).data( 'lcd' );
+
+ this.$languageFilter.languagefilter( {
+ lcd: lcd,
+ languages: this.languages,
+ ulsPurpose: this.options.ulsPurpose,
+ searchAPI: this.options.searchAPI,
+ onSelect: this.select.bind( this )
+ } );
+
+ this.$languageFilter.on( 'noresults.uls', lcd.noResults.bind( lcd ) );
+ },
+
+ recreateLanguageFilter: function () {
+ this.$resultsView.removeData( 'lcd' );
+ this.$resultsView.empty();
+ this.$languageFilter.removeData( 'languagefilter' );
+ this.createLanguageFilter();
+
+ this.shouldRecreate = false;
+ },
+
+ /**
+ * Bind the UI elements with their event listeners
+ */
+ listen: function () {
+ // Register all event listeners to the ULS here.
+ this.$element.on( 'click', this.click.bind( this ) );
+
+ // Don't do anything if pressing on empty space in the ULS
+ this.$menu.on( 'click', function ( e ) {
+ e.stopPropagation();
+ } );
+
+ // Handle key press events on the menu
+ this.$menu.on( 'keydown', this.keypress.bind( this ) );
+
+ this.createLanguageFilter();
+
+ this.$languageFilter.on( 'resultsfound.uls', this.success.bind( this ) );
+
+ $( document.body ).on( 'click', this.cancel.bind( this ) );
+ $( window ).on( 'resize', $.fn.uls.debounce( this.resize.bind( this ), 250 ) );
+ },
+
+ resize: function () {
+ var menuWidth = this.getMenuWidth();
+
+ if ( this.menuWidth === menuWidth ) {
+ return;
+ }
+
+ this.menuWidth = menuWidth;
+ this.shouldRecreate = true;
+ if ( !this.shown ) {
+ this.recreateLanguageFilter();
+ }
+ },
+
+ /**
+ * On select handler for search results
+ *
+ * @param {string} langCode
+ * @param {Object} event The jQuery click event
+ */
+ select: function ( langCode, event ) {
+ this.hide();
+ if ( this.options.onSelect ) {
+ this.options.onSelect.call( this, langCode, event );
+ }
+ },
+
+ /**
+ * On cancel handler for the uls menu
+ *
+ * @param {Event} e
+ */
+ cancel: function ( e ) {
+ if ( e && ( this.$element.is( e.target ) ||
+ $.contains( this.$element[ 0 ], e.target ) ) ) {
+ return;
+ }
+
+ this.hide();
+ },
+
+ keypress: function ( e ) {
+ if ( !this.shown ) {
+ return;
+ }
+
+ if ( e.keyCode === 27 ) { // escape
+ this.cancel();
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ },
+
+ click: function () {
+ if ( this.shown ) {
+ this.hide();
+ } else {
+ this.show();
+ }
+ },
+
+ /**
+ * Get the panel menu width parameter
+ *
+ * @return {string}
+ */
+ getMenuWidth: function () {
+ var languagesCount,
+ screenWidth = document.documentElement.clientWidth;
+
+ if ( this.options.menuWidth ) {
+ return this.options.menuWidth;
+ }
+
+ languagesCount = Object.keys( this.options.languages ).length;
+
+ if ( screenWidth > 900 && languagesCount >= 48 ) {
+ return 'wide';
+ }
+
+ if ( screenWidth > 500 && languagesCount >= 24 ) {
+ return 'medium';
+ }
+
+ return 'narrow';
+ },
+
+ isMobile: function () {
+ return navigator.userAgent.match( /(iPhone|iPod|iPad|Android|BlackBerry)/ );
+ }
+ };
+
+ /* ULS PLUGIN DEFINITION
+ * =========================== */
+
+ $.fn.uls = function ( option ) {
+ return this.each( function () {
+ var $this = $( this ),
+ data = $this.data( 'uls' ),
+ options = typeof option === 'object' && option;
+
+ if ( !data ) {
+ $this.data( 'uls', ( data = new ULS( this, options ) ) );
+ }
+
+ if ( typeof option === 'string' ) {
+ data[ option ]();
+ }
+ } );
+ };
+
+ $.fn.uls.defaults = {
+ // DEPRECATED: CSS top position for the dialog
+ top: undefined,
+ // DEPRECATED: CSS left position for the dialog
+ left: undefined,
+ // Callback function when user selects a language
+ onSelect: undefined,
+ // Callback function when the dialog is closed without selecting a language
+ onCancel: undefined,
+ // Callback function when ULS has initialized
+ onReady: undefined,
+ // Callback function when ULS dialog is shown
+ onVisible: undefined,
+ // Callback function when ULS dialog is ready to be shown
+ onPosition: undefined,
+ // Languages to be used for ULS, default is all languages
+ languages: $.uls.data.getAutonyms(),
+ // The options are wide (4 columns), medium (2 columns), and narrow (1 column).
+ // If not specified, it will be set automatically.
+ menuWidth: undefined,
+ // What is this ULS used for.
+ // Should be set for distinguishing between different instances of ULS
+ // in the same application.
+ ulsPurpose: '',
+ // Used by LCD
+ quickList: [],
+ // Used by LCD
+ showRegions: undefined,
+ // Used by LCD
+ languageDecorator: undefined,
+ // Used by LCD
+ noResultsTemplate: undefined,
+ // Used by LCD
+ itemsPerColumn: undefined,
+ // Used by LCD
+ groupByRegion: undefined,
+ // Used by LanguageFilter
+ searchAPI: undefined
+ };
+
+ // Define a dummy i18n function, if jquery.i18n not integrated.
+ if ( !$.fn.i18n ) {
+ $.fn.i18n = function () {};
+ }
+
+ /**
+ * Creates and returns a new debounced version of the passed function,
+ * which will postpone its execution, until after wait milliseconds have elapsed
+ * since the last time it was invoked.
+ *
+ * @param {Function} fn Function to be debounced.
+ * @param {number} wait Wait interval in milliseconds.
+ * @param {boolean} [immediate] Trigger the function on the leading edge of the wait interval,
+ * instead of the trailing edge.
+ * @return {Function} Debounced function.
+ */
+ $.fn.uls.debounce = function ( fn, wait, immediate ) {
+ var timeout;
+
+ return function () {
+ var callNow, self = this,
+ later = function () {
+ timeout = null;
+ if ( !immediate ) {
+ fn.apply( self, arguments );
+ }
+ };
+
+ callNow = immediate && !timeout;
+ clearTimeout( timeout );
+ timeout = setTimeout( later, wait || 100 );
+
+ if ( callNow ) {
+ fn.apply( self, arguments );
+ }
+ };
+ };
+
+ /*
+ * Simple scrollIntoView plugin.
+ * Scrolls the element to the viewport smoothly if it is not already.
+ */
+ $.fn.scrollIntoView = function () {
+ return this.each( function () {
+ var scrollPosition,
+ $window = $( window ),
+ windowHeight = $window.height(),
+ windowTop = $window.scrollTop(),
+ windowBottom = windowTop + windowHeight,
+ $element = $( this ),
+ panelHeight = $element.height(),
+ panelTop = $element.offset().top,
+ panelBottom = panelTop + panelHeight;
+
+ if ( ( panelTop < windowTop ) || ( panelBottom > windowBottom ) ) {
+ if ( windowTop > panelTop ) {
+ scrollPosition = panelTop;
+ } else {
+ scrollPosition = panelBottom - windowHeight;
+ }
+ // eslint-disable-next-line no-jquery/no-global-selector
+ $( 'html, body' ).stop().animate( {
+ scrollTop: scrollPosition
+ }, 500 );
+ }
+ } );
+ };
+
+ $.fn.uls.Constructor = ULS;
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.js b/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.js
new file mode 100644
index 00000000..13e177ba
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.js
@@ -0,0 +1,6461 @@
+( function () { function r( e, n, t ) { function o( i, f ) { if ( !n[ i ] ) { if ( !e[ i ] ) { var c = typeof require === 'function' && require; if ( !f && c ) { return c( i, !0 ); } if ( u ) { return u( i, !0 ); } var a = new Error( "Cannot find module '" + i + "'" ); throw a.code = 'MODULE_NOT_FOUND', a; } var p = n[ i ] = { exports: {} }; e[ i ][ 0 ].call( p.exports, function ( r ) { var n = e[ i ][ 1 ][ r ]; return o( n || r ); }, p, p.exports, r, e, n, t ); } return n[ i ].exports; } for ( var u = typeof require === 'function' && require, i = 0; i < t.length; i++ ) { o( t[ i ] ); } return o; } return r; }() )( {
+ 1: [ function ( require, module, exports ) {
+ module.exports = ( function ( $ ) {
+ $.uls = $.uls || {};
+ $.uls.data =
+{
+ "languages": {
+ "aa": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Qafár af"
+ ],
+ "ab": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "аԥсшәа"
+ ],
+ "abe": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Wôbanakiôdwawôgan"
+ ],
+ "abs": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Bahasa Ambon"
+ ],
+ "ace": [
+ "Latn",
+ [
+ "AS",
+ "PA"
+ ],
+ "Acèh"
+ ],
+ "acf": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "kwéyòl"
+ ],
+ "acm": [
+ "Arab",
+ [
+ "ME"
+ ],
+ "عراقي"
+ ],
+ "ady": [
+ "Cyrl",
+ [
+ "EU",
+ "ME"
+ ],
+ "адыгабзэ"
+ ],
+ "ady-cyrl": [
+ "ady"
+ ],
+ "ady-latn": [
+ "Latn",
+ [
+ "EU",
+ "ME"
+ ],
+ "Adygabze"
+ ],
+ "aeb": [
+ "aeb-arab"
+ ],
+ "aeb-arab": [
+ "Arab",
+ [
+ "AF"
+ ],
+ "تونسي"
+ ],
+ "aeb-latn": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Tûnsî"
+ ],
+ "af": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Afrikaans"
+ ],
+ "agq": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "aghɨ̂m"
+ ],
+ "ahr": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "अहिराणी"
+ ],
+ "ajg": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "ajagbe"
+ ],
+ "ajp": [
+ "Arab",
+ [
+ "ME"
+ ],
+ "شامي"
+ ],
+ "ajp-arab": [
+ "ajp"
+ ],
+ "ajp-latn": [
+ "Latn",
+ [
+ "ME"
+ ],
+ "šāmi"
+ ],
+ "ak": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Akan"
+ ],
+ "akz": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Albaamo innaaɬiilka"
+ ],
+ "ale": [
+ "Latn",
+ [
+ "AM",
+ "AS"
+ ],
+ "unangam tunuu"
+ ],
+ "ale-cyrl": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "унаӈам тунуу"
+ ],
+ "aln": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Gegë"
+ ],
+ "alt": [
+ "Cyrl",
+ [
+ "EU",
+ "AS"
+ ],
+ "алтай тил"
+ ],
+ "am": [
+ "Ethi",
+ [
+ "AF"
+ ],
+ "አማርኛ"
+ ],
+ "ami": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Pangcah"
+ ],
+ "an": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "aragonés"
+ ],
+ "ang": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Ænglisc"
+ ],
+ "ann": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Obolo"
+ ],
+ "anp": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "अंगिका"
+ ],
+ "ar": [
+ "Arab",
+ [
+ "AF",
+ "ME"
+ ],
+ "العربية"
+ ],
+ "arc": [
+ "Syrc",
+ [
+ "ME"
+ ],
+ "ܐܪܡܝܐ"
+ ],
+ "arn": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "mapudungun"
+ ],
+ "aro": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Araona"
+ ],
+ "arq": [
+ "Arab",
+ [
+ "AF",
+ "ME"
+ ],
+ "جازايرية"
+ ],
+ "ary": [
+ "Arab",
+ [
+ "AF",
+ "ME"
+ ],
+ "الدارجة"
+ ],
+ "ary-arab": [
+ "ary"
+ ],
+ "ary-latn": [
+ "Latn",
+ [
+ "AF",
+ "ME"
+ ],
+ "ed-dārija"
+ ],
+ "arz": [
+ "Arab",
+ [
+ "AF",
+ "ME"
+ ],
+ "مصرى"
+ ],
+ "as": [
+ "Beng",
+ [
+ "AS"
+ ],
+ "অসমীয়া"
+ ],
+ "ase": [
+ "Sgnw",
+ [
+ "AM"
+ ],
+ "American sign language"
+ ],
+ "ast": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "asturianu"
+ ],
+ "atj": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "atikamekw"
+ ],
+ "atv": [
+ "Cyrl",
+ [
+ "EU",
+ "AS"
+ ],
+ "тÿндÿк алтай тил"
+ ],
+ "av": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "авар"
+ ],
+ "avk": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "Kotava"
+ ],
+ "awa": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "अवधी"
+ ],
+ "ay": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Aymar aru"
+ ],
+ "az": [
+ "az-latn"
+ ],
+ "az-arab": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "تۆرکجه"
+ ],
+ "az-latn": [
+ "Latn",
+ [
+ "EU",
+ "ME"
+ ],
+ "azərbaycanca"
+ ],
+ "az-cyrl": [
+ "Cyrl",
+ [
+ "EU",
+ "ME"
+ ],
+ "азәрбајҹанҹа"
+ ],
+ "azb": [
+ "az-arab"
+ ],
+ "azj": [
+ "az-latn"
+ ],
+ "ba": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "башҡортса"
+ ],
+ "ban": [
+ "Latn",
+ [
+ "AS",
+ "PA"
+ ],
+ "Bali"
+ ],
+ "ban-bali": [
+ "Bali",
+ [
+ "AS",
+ "PA"
+ ],
+ "ᬩᬮᬶ"
+ ],
+ "bar": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Boarisch"
+ ],
+ "bas": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "ɓasaá"
+ ],
+ "bat-smg": [
+ "sgs"
+ ],
+ "bbc-latn": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Batak Toba"
+ ],
+ "bbc-batk": [
+ "Batk",
+ [
+ "AS"
+ ],
+ "ᯅᯖᯂ᯲ ᯖᯬᯅ"
+ ],
+ "bbc": [
+ "bbc-latn"
+ ],
+ "bcc": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "جهلسری بلوچی"
+ ],
+ "bci": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "wawle"
+ ],
+ "bcl": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Bikol Central"
+ ],
+ "bdr": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Bajau Sama"
+ ],
+ "be-tarask": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "беларуская (тарашкевіца)"
+ ],
+ "be-x-old": [
+ "be-tarask"
+ ],
+ "be": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "беларуская"
+ ],
+ "bew": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Bahasa Betawi"
+ ],
+ "bfa": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Bari"
+ ],
+ "bft": [
+ "Arab",
+ [
+ "AS"
+ ],
+ "بلتی"
+ ],
+ "bfq": [
+ "Taml",
+ [
+ "AS"
+ ],
+ "படகா"
+ ],
+ "bg": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "български"
+ ],
+ "bgn": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "روچ کپتین بلوچی"
+ ],
+ "bh": [
+ "bho"
+ ],
+ "bho": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "भोजपुरी"
+ ],
+ "bi": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Bislama"
+ ],
+ "bjn": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Banjar"
+ ],
+ "bkm": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Itaŋikom"
+ ],
+ "blc": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "ItNuxalkmc"
+ ],
+ "blk": [
+ "Mymr",
+ [
+ "AS"
+ ],
+ "ပအိုဝ်ႏဘာႏသာႏ"
+ ],
+ "bm": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "bamanankan"
+ ],
+ "bn": [
+ "Beng",
+ [
+ "AS"
+ ],
+ "বাংলা"
+ ],
+ "bnn": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "bunun"
+ ],
+ "bo": [
+ "Tibt",
+ [
+ "AS"
+ ],
+ "བོད་ཡིག"
+ ],
+ "bpy": [
+ "Beng",
+ [
+ "AS"
+ ],
+ "বিষ্ণুপ্রিয়া মণিপুরী"
+ ],
+ "bqi": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "بختیاری"
+ ],
+ "br": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "brezhoneg"
+ ],
+ "brh": [
+ "Latn",
+ [
+ "ME",
+ "AS"
+ ],
+ "Bráhuí"
+ ],
+ "brx": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "बर'"
+ ],
+ "bs": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "bosanski"
+ ],
+ "btm": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Mandailing"
+ ],
+ "bto": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Iriga Bicolano"
+ ],
+ "bug": [
+ "Bugi",
+ [
+ "AS"
+ ],
+ "ᨅᨔ ᨕᨘᨁᨗ"
+ ],
+ "bum": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "bulu"
+ ],
+ "bwr": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "bura"
+ ],
+ "bxr": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "буряад"
+ ],
+ "byn": [
+ "Ethi",
+ [
+ "AF"
+ ],
+ "ብሊን"
+ ],
+ "bzj": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Bileez Kriol"
+ ],
+ "ca": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "català"
+ ],
+ "cak": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Kaqchikel"
+ ],
+ "cbk": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Chavacano de Zamboanga"
+ ],
+ "cbk-zam": [
+ "cbk"
+ ],
+ "ccp": [
+ "Cakm",
+ [
+ "AS"
+ ],
+ "𑄌𑄋𑄴𑄟𑄳𑄦"
+ ],
+ "cdo": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Mìng-dĕ̤ng-ngṳ̄"
+ ],
+ "cdo-latn": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Mìng-dĕ̤ng-ngṳ̄ Bàng-uâ-cê"
+ ],
+ "cdo-hani": [
+ "Hani",
+ [
+ "AS"
+ ],
+ "閩東語(漢字)"
+ ],
+ "ce": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "нохчийн"
+ ],
+ "ceb": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Cebuano"
+ ],
+ "ch": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Chamoru"
+ ],
+ "chm": [
+ "mhr"
+ ],
+ "chn": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "chinuk wawa"
+ ],
+ "cho": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Choctaw"
+ ],
+ "chr": [
+ "Cher",
+ [
+ "AM"
+ ],
+ "ᏣᎳᎩ"
+ ],
+ "chy": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Tsetsêhestâhese"
+ ],
+ "ciw": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Anishinaabemowin"
+ ],
+ "cjy": [
+ "cjy-hant"
+ ],
+ "cjy-hans": [
+ "Hans",
+ [
+ "AS"
+ ],
+ "晋语(简化字)"
+ ],
+ "cjy-hant": [
+ "Hant",
+ [
+ "AS"
+ ],
+ "晉語"
+ ],
+ "ckb": [
+ "Arab",
+ [
+ "ME"
+ ],
+ "کوردی"
+ ],
+ "ckt": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "ԓыгъоравэтԓьэн"
+ ],
+ "cnh": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Lai holh"
+ ],
+ "cnr": [
+ "cnr-latn"
+ ],
+ "cnr-cyrl": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "црногорски"
+ ],
+ "cnr-latn": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "crnogorski"
+ ],
+ "co": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "corsu"
+ ],
+ "cop": [
+ "Copt",
+ [
+ "AF",
+ "ME"
+ ],
+ "ϯⲙⲉⲧⲣⲉⲙⲛ̀ⲭⲏⲙⲓ"
+ ],
+ "cps": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Capiceño"
+ ],
+ "cr": [
+ "Cans",
+ [
+ "AM"
+ ],
+ "ᓀᐦᐃᔭᐍᐏᐣ"
+ ],
+ "cr-cans": [
+ "cr"
+ ],
+ "cr-latn": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Nēhiyawēwin"
+ ],
+ "crh": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "qırımtatarca"
+ ],
+ "crh-cyrl": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "къырымтатарджа"
+ ],
+ "crh-latn": [
+ "crh"
+ ],
+ "cs": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "čeština"
+ ],
+ "csb": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "kaszëbsczi"
+ ],
+ "cu": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "словѣньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ"
+ ],
+ "cv": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "чӑвашла"
+ ],
+ "cy": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Cymraeg"
+ ],
+ "da": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "dansk"
+ ],
+ "dag": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "dagbanli"
+ ],
+ "dar": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "дарган"
+ ],
+ "de-at": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Österreichisches Deutsch"
+ ],
+ "de-ch": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Schweizer Hochdeutsch"
+ ],
+ "de-formal": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Deutsch (Sie-Form)"
+ ],
+ "de": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Deutsch"
+ ],
+ "din": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Thuɔŋjäŋ"
+ ],
+ "diq": [
+ "Latn",
+ [
+ "EU",
+ "AS"
+ ],
+ "Zazaki"
+ ],
+ "doi": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "डोगरी"
+ ],
+ "dsb": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "dolnoserbski"
+ ],
+ "dtp": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Dusun Bundu-liwan"
+ ],
+ "dty": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "डोटेली"
+ ],
+ "dv": [
+ "Thaa",
+ [
+ "AS"
+ ],
+ "ދިވެހިބަސް"
+ ],
+ "dz": [
+ "Tibt",
+ [
+ "AS"
+ ],
+ "ཇོང་ཁ"
+ ],
+ "ee": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "eʋegbe"
+ ],
+ "efi": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "efịk"
+ ],
+ "egl": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Emiliàn"
+ ],
+ "el": [
+ "Grek",
+ [
+ "EU"
+ ],
+ "Ελληνικά"
+ ],
+ "elm": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Eleme"
+ ],
+ "eml": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "emiliàn e rumagnòl"
+ ],
+ "en-ca": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Canadian English"
+ ],
+ "en-gb": [
+ "Latn",
+ [
+ "EU",
+ "AS",
+ "PA"
+ ],
+ "British English"
+ ],
+ "en-simple": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "Simple English"
+ ],
+ "en": [
+ "Latn",
+ [
+ "EU",
+ "AM",
+ "AF",
+ "ME",
+ "AS",
+ "PA",
+ "WW"
+ ],
+ "English"
+ ],
+ "eo": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "Esperanto"
+ ],
+ "es-419": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "español de América Latina"
+ ],
+ "es-formal": [
+ "Latn",
+ [
+ "EU",
+ "AM",
+ "AF",
+ "WW"
+ ],
+ "español (formal)"
+ ],
+ "es": [
+ "Latn",
+ [
+ "EU",
+ "AM",
+ "AF",
+ "WW",
+ "PA"
+ ],
+ "español"
+ ],
+ "es-ni": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "español nicaragüense"
+ ],
+ "esu": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Yup'ik"
+ ],
+ "et": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "eesti"
+ ],
+ "eu": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "euskara"
+ ],
+ "ext": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "estremeñu"
+ ],
+ "eya": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "I·ya·q"
+ ],
+ "fa": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "فارسی"
+ ],
+ "fan": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Faŋ"
+ ],
+ "fat": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "mfantse"
+ ],
+ "fax": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Fala"
+ ],
+ "ff": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Fulfulde"
+ ],
+ "fi": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "suomi"
+ ],
+ "fil": [
+ "tl"
+ ],
+ "fit": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "meänkieli"
+ ],
+ "fiu-vro": [
+ "vro"
+ ],
+ "fj": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Na Vosa Vakaviti"
+ ],
+ "fkv": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "kvääni"
+ ],
+ "fo": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "føroyskt"
+ ],
+ "fon": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "fɔ̀ngbè"
+ ],
+ "fr": [
+ "Latn",
+ [
+ "EU",
+ "AM",
+ "WW"
+ ],
+ "français"
+ ],
+ "frc": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "français cadien"
+ ],
+ "frp": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "arpetan"
+ ],
+ "frr": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Nordfriisk"
+ ],
+ "fuf": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Fuuta Jalon"
+ ],
+ "fur": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "furlan"
+ ],
+ "fvr": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "poor’íŋ belé’ŋ"
+ ],
+ "fy": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Frysk"
+ ],
+ "ga": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Gaeilge"
+ ],
+ "gaa": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Ga"
+ ],
+ "gag": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Gagauz"
+ ],
+ "gah": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Alekano"
+ ],
+ "gan-hans": [
+ "Hans",
+ [
+ "AS"
+ ],
+ "赣语(简体)"
+ ],
+ "gan-hant": [
+ "gan"
+ ],
+ "gan": [
+ "Hant",
+ [
+ "AS"
+ ],
+ "贛語"
+ ],
+ "gbm": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "गढ़वळि"
+ ],
+ "gbz": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Dari-e Mazdeyasnā"
+ ],
+ "gcf": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Guadeloupean Creole French"
+ ],
+ "gcr": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "kriyòl gwiyannen"
+ ],
+ "gd": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Gàidhlig"
+ ],
+ "gez": [
+ "Ethi",
+ [
+ "AF"
+ ],
+ "ግዕዝ"
+ ],
+ "gl": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "galego"
+ ],
+ "gld": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "на̄ни"
+ ],
+ "glk": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "گیلکی"
+ ],
+ "gn": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Avañe'ẽ"
+ ],
+ "gom": [
+ "gom-deva"
+ ],
+ "gom-deva": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "गोंयची कोंकणी"
+ ],
+ "gom-latn": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Gõychi Konknni"
+ ],
+ "gor": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Bahasa Hulontalo"
+ ],
+ "got": [
+ "Goth",
+ [
+ "EU"
+ ],
+ "𐌲𐌿𐍄𐌹𐍃𐌺"
+ ],
+ "gpe": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Ghanaian Pidgin"
+ ],
+ "grc": [
+ "Grek",
+ [
+ "EU"
+ ],
+ "Ἀρχαία ἑλληνικὴ"
+ ],
+ "gsw": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Alemannisch"
+ ],
+ "gu": [
+ "Gujr",
+ [
+ "AS"
+ ],
+ "ગુજરાતી"
+ ],
+ "guc": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "wayuunaiki"
+ ],
+ "gum": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Namtrik"
+ ],
+ "gur": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "farefare"
+ ],
+ "guw": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "gungbe"
+ ],
+ "gv": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Gaelg"
+ ],
+ "ha": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Hausa"
+ ],
+ "ha-arab": [
+ "Arab",
+ [
+ "AF"
+ ],
+ "هَوُسَ"
+ ],
+ "ha-latn": [
+ "ha"
+ ],
+ "hai": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "X̱aat Kíl"
+ ],
+ "hak": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Hak-kâ-fa"
+ ],
+ "haw": [
+ "Latn",
+ [
+ "AM",
+ "PA"
+ ],
+ "Hawai`i"
+ ],
+ "he": [
+ "Hebr",
+ [
+ "ME"
+ ],
+ "עברית"
+ ],
+ "hak-hans": [
+ "Hans",
+ [
+ "AS"
+ ],
+ "客家语(简体)"
+ ],
+ "hak-hant": [
+ "Hant",
+ [
+ "AS"
+ ],
+ "客家語(繁體)"
+ ],
+ "hi": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "हिन्दी"
+ ],
+ "hif": [
+ "Latn",
+ [
+ "PA",
+ "AS"
+ ],
+ "Fiji Hindi"
+ ],
+ "hif-deva": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "फ़ीजी हिन्दी"
+ ],
+ "hif-latn": [
+ "hif"
+ ],
+ "hil": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Ilonggo"
+ ],
+ "hne": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "छत्तीसगढ़ी"
+ ],
+ "ho": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Hiri Motu"
+ ],
+ "hoc": [
+ "Wara",
+ [
+ "AS"
+ ],
+ "𑢹𑣉𑣉"
+ ],
+ "hr": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "hrvatski"
+ ],
+ "hrx": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Hunsrik"
+ ],
+ "hsb": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "hornjoserbsce"
+ ],
+ "hsn": [
+ "Hans",
+ [
+ "AS"
+ ],
+ "湘语"
+ ],
+ "ht": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Kreyòl ayisyen"
+ ],
+ "hu-formal": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Magyar (magázó)"
+ ],
+ "hu": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "magyar"
+ ],
+ "hy": [
+ "Armn",
+ [
+ "EU",
+ "ME"
+ ],
+ "հայերեն"
+ ],
+ "hyw": [
+ "Armn",
+ [
+ "EU",
+ "ME"
+ ],
+ "Արեւմտահայերէն"
+ ],
+ "hz": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Otsiherero"
+ ],
+ "ia": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "interlingua"
+ ],
+ "id": [
+ "Latn",
+ [
+ "AS",
+ "PA"
+ ],
+ "Bahasa Indonesia"
+ ],
+ "ie": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "Interlingue"
+ ],
+ "ig": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Igbo"
+ ],
+ "ii": [
+ "Yiii",
+ [
+ "AS"
+ ],
+ "ꆇꉙ"
+ ],
+ "ik": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Iñupiatun"
+ ],
+ "ike-cans": [
+ "Cans",
+ [
+ "AM"
+ ],
+ "ᐃᓄᒃᑎᑐᑦ"
+ ],
+ "ike-latn": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "inuktitut"
+ ],
+ "ilo": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Ilokano"
+ ],
+ "inh": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "гӀалгӀай"
+ ],
+ "io": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "Ido"
+ ],
+ "is": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "íslenska"
+ ],
+ "ish": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "awain"
+ ],
+ "it": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "italiano"
+ ],
+ "iu": [
+ "ike-cans"
+ ],
+ "izh": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "ižoran keel"
+ ],
+ "ja": [
+ "Jpan",
+ [
+ "AS"
+ ],
+ "日本語"
+ ],
+ "jam": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Patois"
+ ],
+ "jbo": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "lojban"
+ ],
+ "jdt": [
+ "jdt-cyrl"
+ ],
+ "jdt-cyrl": [
+ "Cyrl",
+ [
+ "EU",
+ "AS"
+ ],
+ "жугьури"
+ ],
+ "jje": [
+ "Kore",
+ [
+ "AS"
+ ],
+ "제주말"
+ ],
+ "jut": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "jysk"
+ ],
+ "jv": [
+ "Latn",
+ [
+ "AS",
+ "PA"
+ ],
+ "Jawa"
+ ],
+ "jv-java": [
+ "Java",
+ [
+ "AS",
+ "PA"
+ ],
+ "ꦗꦮ"
+ ],
+ "ka": [
+ "Geor",
+ [
+ "EU"
+ ],
+ "ქართული"
+ ],
+ "kaa": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Qaraqalpaqsha"
+ ],
+ "kab": [
+ "Latn",
+ [
+ "AF",
+ "EU"
+ ],
+ "Taqbaylit"
+ ],
+ "kac": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Jinghpaw"
+ ],
+ "kbd-cyrl": [
+ "kbd"
+ ],
+ "kbd-latn": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Qabardjajəbza"
+ ],
+ "kbd": [
+ "Cyrl",
+ [
+ "EU",
+ "ME"
+ ],
+ "адыгэбзэ"
+ ],
+ "kbp": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Kabɩyɛ"
+ ],
+ "kcg": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Tyap"
+ ],
+ "kck": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "tjikalanga"
+ ],
+ "kea": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "kabuverdianu"
+ ],
+ "ken": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "kɛ́nyáŋ"
+ ],
+ "kg": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Kongo"
+ ],
+ "kgp": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Kaingáng"
+ ],
+ "khw": [
+ "Arab",
+ [
+ "ME",
+ "AS"
+ ],
+ "کھوار"
+ ],
+ "ki": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Gĩkũyũ"
+ ],
+ "kiu": [
+ "Latn",
+ [
+ "EU",
+ "ME"
+ ],
+ "Kırmancki"
+ ],
+ "kj": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Kwanyama"
+ ],
+ "kjh": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "хакас"
+ ],
+ "kjp": [
+ "Mymr",
+ [
+ "AS"
+ ],
+ "ဖၠုံလိက်"
+ ],
+ "kk": [
+ "kk-cyrl"
+ ],
+ "kk-arab": [
+ "Arab",
+ [
+ "EU",
+ "AS"
+ ],
+ "قازاقشا (تٶتە)"
+ ],
+ "kk-cn": [
+ "kk-arab"
+ ],
+ "kk-cyrl": [
+ "Cyrl",
+ [
+ "EU",
+ "AS"
+ ],
+ "қазақша"
+ ],
+ "kk-kz": [
+ "kk-cyrl"
+ ],
+ "kk-latn": [
+ "Latn",
+ [
+ "EU",
+ "AS",
+ "ME"
+ ],
+ "qazaqşa"
+ ],
+ "kk-tr": [
+ "kk-latn"
+ ],
+ "kl": [
+ "Latn",
+ [
+ "AM",
+ "EU"
+ ],
+ "kalaallisut"
+ ],
+ "km": [
+ "Khmr",
+ [
+ "AS"
+ ],
+ "ភាសាខ្មែរ"
+ ],
+ "kn": [
+ "Knda",
+ [
+ "AS"
+ ],
+ "ಕನ್ನಡ"
+ ],
+ "knn": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "महाराष्ट्रीय कोंकणी"
+ ],
+ "ko-kp": [
+ "Kore",
+ [
+ "AS"
+ ],
+ "조선말"
+ ],
+ "ko": [
+ "Kore",
+ [
+ "AS"
+ ],
+ "한국어"
+ ],
+ "koi": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "перем коми"
+ ],
+ "koy": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Denaakkenaageʼ"
+ ],
+ "kr": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "kanuri"
+ ],
+ "krc": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "къарачай-малкъар"
+ ],
+ "kri": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Krio"
+ ],
+ "krj": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Kinaray-a"
+ ],
+ "krl": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Karjala"
+ ],
+ "ks-arab": [
+ "Arab",
+ [
+ "AS"
+ ],
+ "کٲشُر"
+ ],
+ "ks-deva": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "कॉशुर"
+ ],
+ "ks": [
+ "ks-arab"
+ ],
+ "ksf": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Bafia"
+ ],
+ "ksh": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Ripoarisch"
+ ],
+ "ksw": [
+ "Mymr",
+ [
+ "AS"
+ ],
+ "စှီၤ"
+ ],
+ "ku": [
+ "ku-latn"
+ ],
+ "ku-arab": [
+ "Arab",
+ [
+ "EU",
+ "ME"
+ ],
+ "كوردي"
+ ],
+ "ku-latn": [
+ "Latn",
+ [
+ "EU",
+ "ME"
+ ],
+ "kurdî"
+ ],
+ "kum": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "къумукъ"
+ ],
+ "kv": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "коми"
+ ],
+ "kw": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "kernowek"
+ ],
+ "ky": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "кыргызча"
+ ],
+ "la": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Latina"
+ ],
+ "lad": [
+ "lad-latn"
+ ],
+ "lad-latn": [
+ "Latn",
+ [
+ "ME",
+ "EU",
+ "AM"
+ ],
+ "Ladino"
+ ],
+ "lad-hebr": [
+ "Hebr",
+ [
+ "ME",
+ "EU",
+ "AM"
+ ],
+ "לאדינו"
+ ],
+ "lag": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Kilaangi"
+ ],
+ "lb": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Lëtzebuergesch"
+ ],
+ "lbe": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "лакку"
+ ],
+ "lez": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "лезги"
+ ],
+ "lfn": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "Lingua Franca Nova"
+ ],
+ "lg": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Luganda"
+ ],
+ "li": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Limburgs"
+ ],
+ "lij": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Ligure"
+ ],
+ "liv": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Līvõ kēļ"
+ ],
+ "lki": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "لەکی"
+ ],
+ "lkt": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Lakȟótiyapi"
+ ],
+ "lld": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Ladin"
+ ],
+ "lmo": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "lombard"
+ ],
+ "ln": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "lingála"
+ ],
+ "lo": [
+ "Laoo",
+ [
+ "AS"
+ ],
+ "ລາວ"
+ ],
+ "loz": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Silozi"
+ ],
+ "lt": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "lietuvių"
+ ],
+ "lrc": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "لۊری شومالی"
+ ],
+ "ltg": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "latgaļu"
+ ],
+ "lud": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "lüüdi"
+ ],
+ "lus": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Mizo ţawng"
+ ],
+ "lut": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "dxʷləšucid"
+ ],
+ "luz": [
+ "Arab",
+ [
+ "ME"
+ ],
+ "لئری دوٙمینی"
+ ],
+ "lv": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "latviešu"
+ ],
+ "lzh": [
+ "Hant",
+ [
+ "AS"
+ ],
+ "文言"
+ ],
+ "lzz": [
+ "Latn",
+ [
+ "EU",
+ "ME"
+ ],
+ "Lazuri"
+ ],
+ "mad": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Madhurâ"
+ ],
+ "mag": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "मगही"
+ ],
+ "mai": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "मैथिली"
+ ],
+ "mak": [
+ "Latn",
+ [
+ "AS",
+ "PA"
+ ],
+ "Mangkasarak"
+ ],
+ "mak-bugi": [
+ "Bugi",
+ [
+ "AS",
+ "PA"
+ ],
+ "ᨆᨀᨔᨑ"
+ ],
+ "map-bms": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Basa Banyumasan"
+ ],
+ "mcn": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "vùn màsànà"
+ ],
+ "mdf": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "мокшень"
+ ],
+ "mfe": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Morisyen"
+ ],
+ "mg": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Malagasy"
+ ],
+ "mh": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Ebon"
+ ],
+ "mhr": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "олык марий"
+ ],
+ "mi": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Māori"
+ ],
+ "mic": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Mi'kmaq"
+ ],
+ "min": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Minangkabau"
+ ],
+ "miq": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Mískitu"
+ ],
+ "mk": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "македонски"
+ ],
+ "ml": [
+ "Mlym",
+ [
+ "AS",
+ "ME"
+ ],
+ "മലയാളം"
+ ],
+ "mn": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "монгол"
+ ],
+ "mn-cyrl": [
+ "mn"
+ ],
+ "mn-mong": [
+ "mvf"
+ ],
+ "mnc": [
+ "Mong",
+ [
+ "AS"
+ ],
+ "ᠮᠠᠨᠵᡠ ᡤᡳᠰᡠᠨ"
+ ],
+ "mni": [
+ "Mtei",
+ [
+ "AS"
+ ],
+ "ꯃꯤꯇꯩ ꯂꯣꯟ"
+ ],
+ "mni-beng": [
+ "Beng",
+ [
+ "AS"
+ ],
+ "মেইতেই লোন্"
+ ],
+ "mnw": [
+ "Mymr",
+ [
+ "AS"
+ ],
+ "ဘာသာ မန်"
+ ],
+ "mo": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "молдовеняскэ"
+ ],
+ "moe": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "innu-aimun"
+ ],
+ "mos": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "moore"
+ ],
+ "mr": [
+ "Deva",
+ [
+ "AS",
+ "ME"
+ ],
+ "मराठी"
+ ],
+ "mrh": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Mara"
+ ],
+ "mrj": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "кырык мары"
+ ],
+ "mrv": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Magareva"
+ ],
+ "ms": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Bahasa Melayu"
+ ],
+ "ms-arab": [
+ "Arab",
+ [
+ "AS"
+ ],
+ "بهاس ملايو"
+ ],
+ "mt": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Malti"
+ ],
+ "mui": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Musi"
+ ],
+ "mus": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Mvskoke"
+ ],
+ "mvf": [
+ "Mong",
+ [
+ "AS"
+ ],
+ "ᠮᠣᠩᠭᠣᠯ"
+ ],
+ "mwl": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Mirandés"
+ ],
+ "mwv": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Behase Mentawei"
+ ],
+ "mww": [
+ "mww-latn"
+ ],
+ "mww-latn": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Hmoob Dawb"
+ ],
+ "my": [
+ "Mymr",
+ [
+ "AS"
+ ],
+ "မြန်မာဘာသာ"
+ ],
+ "myv": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "эрзянь"
+ ],
+ "mzn": [
+ "Arab",
+ [
+ "ME",
+ "AS"
+ ],
+ "مازِرونی"
+ ],
+ "na": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Dorerin Naoero"
+ ],
+ "nah": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Nāhuatl"
+ ],
+ "nan": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Bân-lâm-gú"
+ ],
+ "nan-hani": [
+ "Hani",
+ [
+ "AS"
+ ],
+ "閩南語(漢字)"
+ ],
+ "nap": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Napulitano"
+ ],
+ "nb": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "norsk (bokmål)"
+ ],
+ "nd": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "siNdebele saseNyakatho"
+ ],
+ "nds-nl": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Nedersaksisch"
+ ],
+ "nds": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Plattdüütsch"
+ ],
+ "ne": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "नेपाली"
+ ],
+ "new": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "नेपाल भाषा"
+ ],
+ "ng": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Oshiwambo"
+ ],
+ "nia": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Li Niha"
+ ],
+ "niu": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "ko e vagahau Niuē"
+ ],
+ "njo": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Ao"
+ ],
+ "nl-informal": [
+ "Latn",
+ [
+ "EU",
+ "AM"
+ ],
+ "Nederlands (informeel)"
+ ],
+ "nl": [
+ "Latn",
+ [
+ "EU",
+ "AM"
+ ],
+ "Nederlands"
+ ],
+ "nmz": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "nawdm"
+ ],
+ "nn": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "norsk (nynorsk)"
+ ],
+ "no": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "norsk"
+ ],
+ "nod": [
+ "Lana",
+ [
+ "AS"
+ ],
+ "ᨣᩴᩤᨾᩮᩥᩬᨦ"
+ ],
+ "nod-thai": [
+ "Thai",
+ [
+ "AS"
+ ],
+ "คำเมือง"
+ ],
+ "nog": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "ногайша"
+ ],
+ "nov": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "Novial"
+ ],
+ "nqo": [
+ "Nkoo",
+ [
+ "AF"
+ ],
+ "ߒߞߏ"
+ ],
+ "nr": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "isiNdebele seSewula"
+ ],
+ "nrm": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Nouormand"
+ ],
+ "nso": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Sesotho sa Leboa"
+ ],
+ "nus": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Thok Naath"
+ ],
+ "nv": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Diné bizaad"
+ ],
+ "ny": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Chi-Chewa"
+ ],
+ "nyn": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "runyankore"
+ ],
+ "nys": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Nyungar"
+ ],
+ "oc": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "occitan"
+ ],
+ "ojb": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Ojibwemowin"
+ ],
+ "oka": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "n̓səl̓xcin̓"
+ ],
+ "olo": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "livvinkarjala"
+ ],
+ "om": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Oromoo"
+ ],
+ "ood": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "ʼOʼodham ha-ñeʼokĭ"
+ ],
+ "or": [
+ "Orya",
+ [
+ "AS"
+ ],
+ "ଓଡ଼ିଆ"
+ ],
+ "os": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "ирон"
+ ],
+ "osi": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Using"
+ ],
+ "ota": [
+ "Arab",
+ [
+ "AS",
+ "EU"
+ ],
+ "لسان عثمانى"
+ ],
+ "ovd": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "övdalsk"
+ ],
+ "pa": [
+ "pa-guru"
+ ],
+ "pa-guru": [
+ "Guru",
+ [
+ "AS"
+ ],
+ "ਪੰਜਾਬੀ"
+ ],
+ "pag": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Pangasinan"
+ ],
+ "pam": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Kapampangan"
+ ],
+ "pap": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Papiamentu"
+ ],
+ "pap-aw": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Papiamento"
+ ],
+ "pbb": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Nasa Yuwe"
+ ],
+ "pcd": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Picard"
+ ],
+ "pcm": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Naijá"
+ ],
+ "pdc": [
+ "Latn",
+ [
+ "EU",
+ "AM"
+ ],
+ "Deitsch"
+ ],
+ "pdt": [
+ "Latn",
+ [
+ "EU",
+ "AM"
+ ],
+ "Plautdietsch"
+ ],
+ "pfl": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Pälzisch"
+ ],
+ "pi": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "पालि"
+ ],
+ "pih": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Norfuk \/ Pitkern"
+ ],
+ "pis": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Pijin"
+ ],
+ "pjt": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Pitjantjatjara"
+ ],
+ "pko": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Pökoot"
+ ],
+ "pl": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "polski"
+ ],
+ "pms": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Piemontèis"
+ ],
+ "pnb": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "پنجابی"
+ ],
+ "pnt": [
+ "Grek",
+ [
+ "EU"
+ ],
+ "Ποντιακά"
+ ],
+ "pov": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "guinensi"
+ ],
+ "ppl": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Nawat"
+ ],
+ "prg": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Prūsiskan"
+ ],
+ "prs": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "دری"
+ ],
+ "ps": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "پښتو"
+ ],
+ "pt-br": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "português do Brasil"
+ ],
+ "pt": [
+ "Latn",
+ [
+ "EU",
+ "AM",
+ "AS",
+ "PA",
+ "AF",
+ "WW"
+ ],
+ "português"
+ ],
+ "pwn": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "pinayuanan"
+ ],
+ "qu": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Runa Simi"
+ ],
+ "quc": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "K'iche'"
+ ],
+ "qug": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Runa shimi"
+ ],
+ "qwh": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "anqash qichwa"
+ ],
+ "rag": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Lologooli"
+ ],
+ "rap": [
+ "Latn",
+ [
+ "PA",
+ "AM"
+ ],
+ "arero rapa nui"
+ ],
+ "rcf": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Kreol Réyoné"
+ ],
+ "rej": [
+ "Latn",
+ [
+ "AS",
+ "PA"
+ ],
+ "Jang"
+ ],
+ "rgn": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Rumagnôl"
+ ],
+ "rhg": [
+ "Rohg",
+ [
+ "AS"
+ ],
+ "𐴌𐴟𐴇𐴥𐴝𐴚𐴒𐴙𐴝"
+ ],
+ "rif": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Tarifit"
+ ],
+ "rki": [
+ "Mymr",
+ [
+ "AS"
+ ],
+ "ရခိုင်"
+ ],
+ "rm": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "rumantsch"
+ ],
+ "rmc": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "romaňi čhib"
+ ],
+ "rmf": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "kaalengo tšimb"
+ ],
+ "rmy": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Romani"
+ ],
+ "rn": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "ikirundi"
+ ],
+ "ro": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "română"
+ ],
+ "roa-rup": [
+ "rup"
+ ],
+ "roa-tara": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "tarandíne"
+ ],
+ "rsk": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "руски"
+ ],
+ "rtm": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Faeag Rotuma"
+ ],
+ "ru": [
+ "Cyrl",
+ [
+ "EU",
+ "AS",
+ "ME"
+ ],
+ "русский"
+ ],
+ "rue": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "русиньскый"
+ ],
+ "rup": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "armãneashti"
+ ],
+ "ruq": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "Влахесте"
+ ],
+ "ruq-cyrl": [
+ "ruq"
+ ],
+ "ruq-grek": [
+ "Grek",
+ [
+ "EU"
+ ],
+ "Megleno-Romanian (Greek script)"
+ ],
+ "ruq-latn": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Vlăheşte"
+ ],
+ "rut": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "мыхаӀбишды"
+ ],
+ "rw": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Ikinyarwanda"
+ ],
+ "rwr": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "मारवाड़ी"
+ ],
+ "ryu": [
+ "Jpan",
+ [
+ "AS"
+ ],
+ "うちなーぐち"
+ ],
+ "sa": [
+ "Deva",
+ [
+ "AS"
+ ],
+ "संस्कृतम्"
+ ],
+ "sah": [
+ "Cyrl",
+ [
+ "EU",
+ "AS"
+ ],
+ "саха тыла"
+ ],
+ "sat": [
+ "Olck",
+ [
+ "AS"
+ ],
+ "ᱥᱟᱱᱛᱟᱲᱤ"
+ ],
+ "saz": [
+ "Saur",
+ [
+ "AS"
+ ],
+ "ꢱꣃꢬꢵꢯ꣄ꢡ꣄ꢬꢵ"
+ ],
+ "sc": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "sardu"
+ ],
+ "scn": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "sicilianu"
+ ],
+ "sco": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Scots"
+ ],
+ "sd": [
+ "Arab",
+ [
+ "AS"
+ ],
+ "سنڌي"
+ ],
+ "sdc": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Sassaresu"
+ ],
+ "sdh": [
+ "Arab",
+ [
+ "ME"
+ ],
+ "کوردی خوارگ"
+ ],
+ "se": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "davvisámegiella"
+ ],
+ "se-fi": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "davvisámegiella (Suoma bealde)"
+ ],
+ "se-no": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "davvisámegiella (Norgga bealde)"
+ ],
+ "se-se": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "davvisámegiella (Ruoŧa bealde)"
+ ],
+ "ses": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Koyraboro Senni"
+ ],
+ "sei": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Cmique Itom"
+ ],
+ "sg": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Sängö"
+ ],
+ "sgs": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "žemaitėška"
+ ],
+ "sh": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "srpskohrvatski"
+ ],
+ "shi-latn": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Taclḥit"
+ ],
+ "shi-tfng": [
+ "Tfng",
+ [
+ "AF"
+ ],
+ "ⵜⴰⵛⵍⵃⵉⵜ"
+ ],
+ "shi": [
+ "shi-latn"
+ ],
+ "shn": [
+ "Mymr",
+ [
+ "AS"
+ ],
+ "လိၵ်ႈတႆး"
+ ],
+ "shy-latn": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "tacawit"
+ ],
+ "shy": [
+ "shy-latn"
+ ],
+ "si": [
+ "Sinh",
+ [
+ "AS"
+ ],
+ "සිංහල"
+ ],
+ "simple": [
+ "en-simple"
+ ],
+ "sjd": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "кӣллт са̄мь кӣлл"
+ ],
+ "sje": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "bidumsámegiella"
+ ],
+ "sjo": [
+ "Mong",
+ [
+ "AS"
+ ],
+ "ᠰᡞᠪᡝ ᡤᡞᠰᡠᠨ"
+ ],
+ "sju": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "ubmejesámiengiälla"
+ ],
+ "sk": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "slovenčina"
+ ],
+ "sl": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "slovenščina"
+ ],
+ "sli": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Schläsch"
+ ],
+ "slr": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Salırça"
+ ],
+ "sly": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Bahasa Selayar"
+ ],
+ "skr-arab": [
+ "Arab",
+ [
+ "AS"
+ ],
+ "سرائیکی"
+ ],
+ "skr": [
+ "skr-arab"
+ ],
+ "srq": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "mbia cheë"
+ ],
+ "syc": [
+ "Syrc",
+ [
+ "ME"
+ ],
+ "ܣܘܪܝܝܐ"
+ ],
+ "syl": [
+ "Sylo",
+ [
+ "AS"
+ ],
+ "ꠍꠤꠟꠐꠤ"
+ ],
+ "syl-beng": [
+ "Beng",
+ [
+ "AS"
+ ],
+ "সিলেটি"
+ ],
+ "syl-sylo": [
+ "syl"
+ ],
+ "sm": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Gagana Samoa"
+ ],
+ "sma": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "åarjelsaemien"
+ ],
+ "smj": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "julevsámegiella"
+ ],
+ "smn": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "anarâškielâ"
+ ],
+ "sms": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "nuõrttsääʹmǩiõll"
+ ],
+ "sn": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "chiShona"
+ ],
+ "so": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Soomaaliga"
+ ],
+ "son": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "soŋay"
+ ],
+ "sq": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "shqip"
+ ],
+ "sr": [
+ "sr-cyrl"
+ ],
+ "sr-ec": [
+ "sr-cyrl"
+ ],
+ "sr-cyrl": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "српски"
+ ],
+ "sr-el": [
+ "sr-latn"
+ ],
+ "sr-latn": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "srpski"
+ ],
+ "srn": [
+ "Latn",
+ [
+ "AM",
+ "EU"
+ ],
+ "Sranantongo"
+ ],
+ "sro": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "sardu campidanesu"
+ ],
+ "ss": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "SiSwati"
+ ],
+ "st": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Sesotho"
+ ],
+ "stq": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Seeltersk"
+ ],
+ "sty": [
+ "Cyrl",
+ [
+ "EU",
+ "AS"
+ ],
+ "себертатар"
+ ],
+ "su": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Sunda"
+ ],
+ "sv": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "svenska"
+ ],
+ "sw": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Kiswahili"
+ ],
+ "swb": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Shikomoro"
+ ],
+ "sxu": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Säggssch"
+ ],
+ "szl": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "ślůnski"
+ ],
+ "szy": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Sakizaya"
+ ],
+ "ta": [
+ "Taml",
+ [
+ "AS"
+ ],
+ "தமிழ்"
+ ],
+ "tay": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Tayal"
+ ],
+ "tcy": [
+ "Knda",
+ [
+ "AS"
+ ],
+ "ತುಳು"
+ ],
+ "tdd": [
+ "Tale",
+ [
+ "AS"
+ ],
+ "ᥖᥭᥰᥖᥬᥳᥑᥨᥒᥰ"
+ ],
+ "te": [
+ "Telu",
+ [
+ "AS"
+ ],
+ "తెలుగు"
+ ],
+ "tet": [
+ "Latn",
+ [
+ "AS",
+ "PA"
+ ],
+ "tetun"
+ ],
+ "tg-cyrl": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "тоҷикӣ"
+ ],
+ "tg-latn": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "tojikī"
+ ],
+ "tg": [
+ "tg-cyrl"
+ ],
+ "th": [
+ "Thai",
+ [
+ "AS"
+ ],
+ "ไทย"
+ ],
+ "ti": [
+ "Ethi",
+ [
+ "AF"
+ ],
+ "ትግርኛ"
+ ],
+ "tig": [
+ "Ethi",
+ [
+ "AF"
+ ],
+ "ትግረ"
+ ],
+ "tk": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Türkmençe"
+ ],
+ "tkr": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "цӀаӀхна миз"
+ ],
+ "tl": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Tagalog"
+ ],
+ "tly": [
+ "Latn",
+ [
+ "EU",
+ "AS",
+ "ME"
+ ],
+ "tolışi"
+ ],
+ "tly-cyrl": [
+ "Cyrl",
+ [
+ "EU",
+ "AS",
+ "ME"
+ ],
+ "толыши"
+ ],
+ "tmr": [
+ "Hebr",
+ [
+ "ME",
+ "EU",
+ "AM"
+ ],
+ "ארמית בבלית"
+ ],
+ "tn": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Setswana"
+ ],
+ "to": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "lea faka-Tonga"
+ ],
+ "tok": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "toki pona"
+ ],
+ "tokipona": [
+ "tok"
+ ],
+ "tpi": [
+ "Latn",
+ [
+ "PA",
+ "AS"
+ ],
+ "Tok Pisin"
+ ],
+ "tr": [
+ "Latn",
+ [
+ "EU",
+ "ME"
+ ],
+ "Türkçe"
+ ],
+ "trp": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Kokborok"
+ ],
+ "tru": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Ṫuroyo"
+ ],
+ "trv": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Seediq"
+ ],
+ "ts": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Xitsonga"
+ ],
+ "tsd": [
+ "Grek",
+ [
+ "EU"
+ ],
+ "Τσακωνικά"
+ ],
+ "tt": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "татарча"
+ ],
+ "tt-cyrl": [
+ "tt"
+ ],
+ "tt-latn": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "tatarça"
+ ],
+ "ttt": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "Tati"
+ ],
+ "tum": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "chiTumbuka"
+ ],
+ "tw": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Twi"
+ ],
+ "twd": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Tweants"
+ ],
+ "ty": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "reo tahiti"
+ ],
+ "tyv": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "тыва дыл"
+ ],
+ "tzl": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "Talossan"
+ ],
+ "tzm": [
+ "Tfng",
+ [
+ "AF"
+ ],
+ "ⵜⴰⵎⴰⵣⵉⵖⵜ"
+ ],
+ "udm": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "удмурт"
+ ],
+ "ug": [
+ "ug-arab"
+ ],
+ "ug-arab": [
+ "Arab",
+ [
+ "AS"
+ ],
+ "ئۇيغۇرچە"
+ ],
+ "ug-latn": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "uyghurche"
+ ],
+ "ug-cyrl": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "уйғурчә"
+ ],
+ "uk": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "українська"
+ ],
+ "umu": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Huluníixsuwaakan"
+ ],
+ "ur": [
+ "Arab",
+ [
+ "AS",
+ "ME"
+ ],
+ "اردو"
+ ],
+ "uz": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "oʻzbekcha"
+ ],
+ "uz-cyrl": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "ўзбекча"
+ ],
+ "uz-latn": [
+ "uz"
+ ],
+ "ve": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Tshivenda"
+ ],
+ "vai": [
+ "Vaii",
+ [
+ "AF"
+ ],
+ "ꕙꔤ"
+ ],
+ "vec": [
+ "Latn",
+ [
+ "EU",
+ "AM"
+ ],
+ "vèneto"
+ ],
+ "vep": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "vepsän kel’"
+ ],
+ "vi": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Tiếng Việt"
+ ],
+ "vls": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "West-Vlams"
+ ],
+ "vmf": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Mainfränkisch"
+ ],
+ "vmw": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "emakhuwa"
+ ],
+ "vo": [
+ "Latn",
+ [
+ "WW"
+ ],
+ "Volapük"
+ ],
+ "vot": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Vaďďa"
+ ],
+ "vro": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "võro"
+ ],
+ "wa": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "walon"
+ ],
+ "wal": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "wolaytta"
+ ],
+ "war": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Winaray"
+ ],
+ "wls": [
+ "Latn",
+ [
+ "PA"
+ ],
+ "Faka'uvea"
+ ],
+ "wo": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Wolof"
+ ],
+ "wuu": [
+ "Hans",
+ [
+ "AS"
+ ],
+ "吴语"
+ ],
+ "xal": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "хальмг"
+ ],
+ "xh": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "isiXhosa"
+ ],
+ "xmf": [
+ "Geor",
+ [
+ "EU"
+ ],
+ "მარგალური"
+ ],
+ "xsy": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "SaiSiyat"
+ ],
+ "ydd": [
+ "yi"
+ ],
+ "yi": [
+ "Hebr",
+ [
+ "ME",
+ "EU",
+ "AM"
+ ],
+ "ייִדיש"
+ ],
+ "yo": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Yorùbá"
+ ],
+ "yoi": [
+ "Jpan",
+ [
+ "AS"
+ ],
+ "与那国物言"
+ ],
+ "yrk": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "ненэцяʼ вада"
+ ],
+ "yrl": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Nhẽẽgatú"
+ ],
+ "yua": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Maaya T'aan"
+ ],
+ "yue": [
+ "Hant",
+ [
+ "AS"
+ ],
+ "粵語"
+ ],
+ "za": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Vahcuengh"
+ ],
+ "zea": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "Zeêuws"
+ ],
+ "zgh": [
+ "Tfng",
+ [
+ "AF"
+ ],
+ "ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ"
+ ],
+ "zh": [
+ "Hans",
+ [
+ "AS",
+ "PA",
+ "AM"
+ ],
+ "中文"
+ ],
+ "zh-classical": [
+ "lzh"
+ ],
+ "zh-cn": [
+ "Hans",
+ [
+ "AS"
+ ],
+ "中文(中国大陆)"
+ ],
+ "zh-hans": [
+ "Hans",
+ [
+ "AS",
+ "PA",
+ "AM"
+ ],
+ "中文(简体)"
+ ],
+ "zh-hant": [
+ "Hant",
+ [
+ "AS",
+ "PA",
+ "AM"
+ ],
+ "中文(繁體)"
+ ],
+ "zh-hk": [
+ "Hant",
+ [
+ "AS"
+ ],
+ "中文(香港)"
+ ],
+ "zh-min-nan": [
+ "nan"
+ ],
+ "zh-mo": [
+ "Hant",
+ [
+ "AS"
+ ],
+ "中文(澳門)"
+ ],
+ "zh-my": [
+ "Hans",
+ [
+ "AS"
+ ],
+ "中文(马来西亚)"
+ ],
+ "zh-sg": [
+ "Hans",
+ [
+ "AS"
+ ],
+ "中文(新加坡)"
+ ],
+ "zh-tw": [
+ "Hant",
+ [
+ "AS"
+ ],
+ "中文(台灣)"
+ ],
+ "zh-yue": [
+ "yue"
+ ],
+ "zh-cdo": [
+ "cdo"
+ ],
+ "zu": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "isiZulu"
+ ],
+ "zun": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Shiwi'ma"
+ ]
+ },
+ "scriptgroups": {
+ "Latin": [
+ "Latn",
+ "Goth"
+ ],
+ "Greek": [
+ "Grek"
+ ],
+ "WestCaucasian": [
+ "Armn",
+ "Geor"
+ ],
+ "Arabic": [
+ "Arab"
+ ],
+ "MiddleEastern": [
+ "Hebr",
+ "Syrc"
+ ],
+ "African": [
+ "Copt",
+ "Ethi",
+ "Nkoo",
+ "Tfng",
+ "Vaii"
+ ],
+ "SouthAsian": [
+ "Beng",
+ "Cakm",
+ "Deva",
+ "Gujr",
+ "Guru",
+ "Knda",
+ "Mlym",
+ "Mtei",
+ "Olck",
+ "Orya",
+ "Rohg",
+ "Saur",
+ "Sinh",
+ "Sylo",
+ "Taml",
+ "Telu",
+ "Tibt",
+ "Thaa",
+ "Wara"
+ ],
+ "Cyrillic": [
+ "Cyrl"
+ ],
+ "CJK": [
+ "Hani",
+ "Hans",
+ "Hant",
+ "Kore",
+ "Jpan",
+ "Yiii"
+ ],
+ "SouthEastAsian": [
+ "Bali",
+ "Batk",
+ "Bugi",
+ "Java",
+ "Khmr",
+ "Laoo",
+ "Lana",
+ "Mymr",
+ "Thai",
+ "Tale"
+ ],
+ "Mongolian": [
+ "Mong"
+ ],
+ "SignWriting": [
+ "Sgnw"
+ ],
+ "NativeAmerican": [
+ "Cher",
+ "Cans"
+ ],
+ "Special": [
+ "Zyyy"
+ ]
+ },
+ "rtlscripts": [
+ "Arab",
+ "Hebr",
+ "Syrc",
+ "Nkoo",
+ "Rohg",
+ "Thaa"
+ ],
+ "regiongroups": {
+ "WW": 1,
+ "SP": 1,
+ "AM": 2,
+ "EU": 3,
+ "ME": 3,
+ "AF": 3,
+ "AS": 4,
+ "PA": 4
+ },
+ "territories": {
+ "AC": [
+ "en"
+ ],
+ "AD": [
+ "ca",
+ "es",
+ "fr"
+ ],
+ "AE": [
+ "ar",
+ "en",
+ "ml",
+ "ps",
+ "fa"
+ ],
+ "AF": [
+ "fa",
+ "ps",
+ "uz",
+ "tk",
+ "bgn",
+ "ug-arab",
+ "kk-arab",
+ "kk-cyrl"
+ ],
+ "AG": [
+ "en",
+ "pt"
+ ],
+ "AI": [
+ "en"
+ ],
+ "AL": [
+ "sq",
+ "el",
+ "mk"
+ ],
+ "AM": [
+ "hy",
+ "ku-latn",
+ "az-latn"
+ ],
+ "AO": [
+ "pt",
+ "ln"
+ ],
+ "AR": [
+ "es",
+ "en",
+ "cy",
+ "gn"
+ ],
+ "AS": [
+ "sm",
+ "en"
+ ],
+ "AT": [
+ "de",
+ "bar",
+ "en",
+ "fr",
+ "it",
+ "hr",
+ "sl",
+ "hu"
+ ],
+ "AU": [
+ "en",
+ "zh-hant",
+ "zh",
+ "it"
+ ],
+ "AW": [
+ "nl",
+ "pap",
+ "en"
+ ],
+ "AX": [
+ "sv"
+ ],
+ "AZ": [
+ "az-latn",
+ "az-cyrl",
+ "tly",
+ "ku-latn",
+ "ttt",
+ "tkr"
+ ],
+ "BA": [
+ "bs",
+ "en",
+ "hr",
+ "sr-cyrl",
+ "sr-latn"
+ ],
+ "BB": [
+ "en"
+ ],
+ "BD": [
+ "bn",
+ "en",
+ "syl",
+ "rhg",
+ "ccp",
+ "my",
+ "mni"
+ ],
+ "BE": [
+ "en",
+ "nl",
+ "fr",
+ "de",
+ "vls",
+ "wa"
+ ],
+ "BF": [
+ "mos",
+ "fr",
+ "ff"
+ ],
+ "BG": [
+ "bg",
+ "en",
+ "ru",
+ "tr",
+ "de"
+ ],
+ "BH": [
+ "ar",
+ "ml"
+ ],
+ "BI": [
+ "rn",
+ "fr",
+ "sw",
+ "en"
+ ],
+ "BJ": [
+ "fr",
+ "fon",
+ "yo"
+ ],
+ "BL": [
+ "fr"
+ ],
+ "BM": [
+ "en"
+ ],
+ "BN": [
+ "ms",
+ "zh-hant",
+ "zh",
+ "ms-arab",
+ "en"
+ ],
+ "BO": [
+ "es",
+ "qu",
+ "ay",
+ "gn",
+ "aro"
+ ],
+ "BQ": [
+ "pap",
+ "nl"
+ ],
+ "BR": [
+ "pt",
+ "en",
+ "de",
+ "it",
+ "vec",
+ "ja",
+ "es",
+ "kgp",
+ "ko",
+ "yrl"
+ ],
+ "BS": [
+ "en"
+ ],
+ "BT": [
+ "dz",
+ "ne",
+ "en"
+ ],
+ "BW": [
+ "en",
+ "tn",
+ "af"
+ ],
+ "BY": [
+ "be",
+ "ru"
+ ],
+ "BZ": [
+ "en",
+ "es"
+ ],
+ "CA": [
+ "en",
+ "fr",
+ "zh",
+ "yue",
+ "es",
+ "pa-guru",
+ "ar",
+ "tl",
+ "it",
+ "de",
+ "ur",
+ "fa",
+ "pt",
+ "ru",
+ "hi",
+ "ta",
+ "vi",
+ "pl",
+ "ko",
+ "gu",
+ "el",
+ "ro",
+ "bn",
+ "pdt",
+ "uk",
+ "sr-cyrl",
+ "nl",
+ "ja",
+ "hu",
+ "so",
+ "hr",
+ "ike-cans",
+ "tr",
+ "moe",
+ "cr",
+ "mic",
+ "atj",
+ "war",
+ "oka"
+ ],
+ "CC": [
+ "ms-arab",
+ "ms",
+ "en"
+ ],
+ "CD": [
+ "sw",
+ "fr",
+ "ln",
+ "kg",
+ "rw"
+ ],
+ "CF": [
+ "fr",
+ "sg",
+ "ln"
+ ],
+ "CG": [
+ "fr",
+ "ln"
+ ],
+ "CH": [
+ "de",
+ "gsw",
+ "en",
+ "fr",
+ "it",
+ "lmo",
+ "pt",
+ "rm"
+ ],
+ "CI": [
+ "fr",
+ "bci"
+ ],
+ "CK": [
+ "en"
+ ],
+ "CL": [
+ "es",
+ "en",
+ "arn"
+ ],
+ "CM": [
+ "fr",
+ "en",
+ "bum",
+ "ff",
+ "bkm",
+ "bas",
+ "ar",
+ "ksf",
+ "ken",
+ "agq",
+ "ha-arab",
+ "ha"
+ ],
+ "CN": [
+ "zh",
+ "wuu",
+ "yue",
+ "hsn",
+ "hak",
+ "nan",
+ "gan",
+ "ii",
+ "ug-arab",
+ "za",
+ "mvf",
+ "mn",
+ "bo",
+ "ko",
+ "kk-arab",
+ "kk-cyrl",
+ "ky",
+ "tdd",
+ "en",
+ "ru",
+ "vi",
+ "uz-cyrl",
+ "uz",
+ "lzh"
+ ],
+ "CO": [
+ "es",
+ "guc",
+ "yrl"
+ ],
+ "CR": [
+ "es"
+ ],
+ "CU": [
+ "es"
+ ],
+ "CV": [
+ "kea",
+ "pt"
+ ],
+ "CW": [
+ "pap",
+ "nl",
+ "es"
+ ],
+ "CX": [
+ "en"
+ ],
+ "CY": [
+ "el",
+ "en",
+ "tr",
+ "fr",
+ "hy",
+ "ar"
+ ],
+ "CZ": [
+ "cs",
+ "en",
+ "sk",
+ "de",
+ "pl"
+ ],
+ "DE": [
+ "de",
+ "en",
+ "fr",
+ "bar",
+ "nds",
+ "nl",
+ "it",
+ "es",
+ "ru",
+ "vmf",
+ "tr",
+ "gsw",
+ "da",
+ "hr",
+ "ku-latn",
+ "el",
+ "ksh",
+ "pl",
+ "hsb",
+ "frr",
+ "dsb",
+ "stq",
+ "pfl"
+ ],
+ "DG": [
+ "en"
+ ],
+ "DJ": [
+ "aa",
+ "so",
+ "ar",
+ "fr"
+ ],
+ "DK": [
+ "da",
+ "en",
+ "de",
+ "sv",
+ "fo",
+ "kl",
+ "jut"
+ ],
+ "DM": [
+ "en"
+ ],
+ "DO": [
+ "es",
+ "en"
+ ],
+ "DZ": [
+ "arq",
+ "ar",
+ "fr",
+ "kab",
+ "en"
+ ],
+ "EA": [
+ "es"
+ ],
+ "EC": [
+ "es",
+ "qu",
+ "qug"
+ ],
+ "EE": [
+ "et",
+ "ru",
+ "en",
+ "fi",
+ "vro"
+ ],
+ "EG": [
+ "ar",
+ "arz",
+ "en",
+ "el"
+ ],
+ "EH": [
+ "ar"
+ ],
+ "ER": [
+ "ti",
+ "en",
+ "tig",
+ "ar",
+ "aa",
+ "byn"
+ ],
+ "ES": [
+ "es",
+ "en",
+ "ca",
+ "gl",
+ "eu",
+ "ast",
+ "ext",
+ "an",
+ "oc"
+ ],
+ "ET": [
+ "en",
+ "am",
+ "om",
+ "so",
+ "ti",
+ "wal",
+ "aa",
+ "gez"
+ ],
+ "FI": [
+ "fi",
+ "en",
+ "sv",
+ "de",
+ "ru",
+ "et",
+ "rmf",
+ "se",
+ "smn",
+ "sms"
+ ],
+ "FJ": [
+ "en",
+ "hi",
+ "hif",
+ "fj",
+ "rtm"
+ ],
+ "FK": [
+ "en"
+ ],
+ "FM": [
+ "en"
+ ],
+ "FO": [
+ "fo"
+ ],
+ "FR": [
+ "fr",
+ "en",
+ "es",
+ "de",
+ "oc",
+ "it",
+ "pt",
+ "pcd",
+ "gsw",
+ "br",
+ "co",
+ "ca",
+ "nl",
+ "eu",
+ "frp",
+ "ia"
+ ],
+ "GA": [
+ "fr"
+ ],
+ "GB": [
+ "en",
+ "fr",
+ "de",
+ "es",
+ "pl",
+ "pa-guru",
+ "ur",
+ "ta",
+ "gu",
+ "sco",
+ "cy",
+ "bn",
+ "ar",
+ "zh-hant",
+ "zh",
+ "it",
+ "lt",
+ "pt",
+ "so",
+ "tr",
+ "ga",
+ "gd",
+ "kw"
+ ],
+ "GD": [
+ "en"
+ ],
+ "GE": [
+ "ka",
+ "xmf",
+ "ru",
+ "hy",
+ "ab",
+ "os",
+ "ku-latn"
+ ],
+ "GF": [
+ "fr",
+ "gcr",
+ "zh-hant",
+ "zh"
+ ],
+ "GG": [
+ "en"
+ ],
+ "GH": [
+ "ak",
+ "en",
+ "ee",
+ "gur",
+ "gaa",
+ "ha",
+ "ff"
+ ],
+ "GI": [
+ "en",
+ "es"
+ ],
+ "GL": [
+ "kl",
+ "da"
+ ],
+ "GM": [
+ "en",
+ "ff"
+ ],
+ "GN": [
+ "fr",
+ "ff",
+ "nqo"
+ ],
+ "GP": [
+ "fr"
+ ],
+ "GQ": [
+ "es",
+ "fan",
+ "fr",
+ "pt"
+ ],
+ "GR": [
+ "el",
+ "en",
+ "fr",
+ "de",
+ "pnt",
+ "mk",
+ "tr",
+ "bg",
+ "sq",
+ "tsd"
+ ],
+ "GT": [
+ "es",
+ "quc"
+ ],
+ "GU": [
+ "en",
+ "ch"
+ ],
+ "GW": [
+ "pt",
+ "ff"
+ ],
+ "GY": [
+ "en"
+ ],
+ "HK": [
+ "zh-hant",
+ "zh",
+ "yue",
+ "en"
+ ],
+ "HN": [
+ "es",
+ "en"
+ ],
+ "HR": [
+ "hr",
+ "en",
+ "it",
+ "vec"
+ ],
+ "HT": [
+ "ht",
+ "fr"
+ ],
+ "HU": [
+ "hu",
+ "en",
+ "de",
+ "fr",
+ "ro",
+ "hr",
+ "sk",
+ "sl"
+ ],
+ "IC": [
+ "es"
+ ],
+ "ID": [
+ "id",
+ "jv",
+ "su",
+ "mad",
+ "ms",
+ "min",
+ "bew",
+ "ban",
+ "bug",
+ "bjn",
+ "ace",
+ "ms-arab",
+ "bbc-latn",
+ "zh-hant",
+ "zh",
+ "mak",
+ "rej",
+ "gor",
+ "sly",
+ "mwv"
+ ],
+ "IE": [
+ "en",
+ "ga",
+ "fr"
+ ],
+ "IL": [
+ "he",
+ "en",
+ "ar",
+ "ru",
+ "ro",
+ "yi",
+ "pl",
+ "lad-latn",
+ "hu",
+ "am",
+ "ti",
+ "ml"
+ ],
+ "IM": [
+ "en",
+ "gv"
+ ],
+ "IN": [
+ "hi",
+ "en",
+ "bn",
+ "te",
+ "mr",
+ "ta",
+ "ur",
+ "gu",
+ "kn",
+ "ml",
+ "or",
+ "pa-guru",
+ "bho",
+ "awa",
+ "as",
+ "mag",
+ "mai",
+ "hne",
+ "ne",
+ "sat",
+ "ks-arab",
+ "gom-deva",
+ "gbm",
+ "sd",
+ "doi",
+ "tcy",
+ "brx",
+ "mni",
+ "hoc",
+ "saz",
+ "ccp",
+ "bfq",
+ "njo",
+ "bo",
+ "bpy",
+ "bft",
+ "sa",
+ "dv",
+ "dz"
+ ],
+ "IO": [
+ "en"
+ ],
+ "IQ": [
+ "ar",
+ "en",
+ "ckb",
+ "az-arab",
+ "az-latn",
+ "fa",
+ "lrc"
+ ],
+ "IR": [
+ "fa",
+ "az-arab",
+ "az-latn",
+ "mzn",
+ "glk",
+ "ckb",
+ "sdh",
+ "tk",
+ "lrc",
+ "ar",
+ "bqi",
+ "luz",
+ "lki",
+ "bgn",
+ "hy",
+ "ps",
+ "ka",
+ "gbz",
+ "kk-arab",
+ "kk-cyrl"
+ ],
+ "IS": [
+ "is",
+ "da"
+ ],
+ "IT": [
+ "it",
+ "en",
+ "fr",
+ "sc",
+ "de",
+ "vec",
+ "nap",
+ "lij",
+ "scn",
+ "sl",
+ "sdc",
+ "fur",
+ "egl",
+ "ca",
+ "el",
+ "lmo",
+ "pms",
+ "hr",
+ "rgn"
+ ],
+ "JE": [
+ "en"
+ ],
+ "JM": [
+ "en",
+ "jam"
+ ],
+ "JO": [
+ "ar",
+ "en"
+ ],
+ "JP": [
+ "ja",
+ "ryu",
+ "ko"
+ ],
+ "KE": [
+ "sw",
+ "en",
+ "ki",
+ "so",
+ "pko",
+ "om",
+ "ar",
+ "pa-guru",
+ "gu"
+ ],
+ "KG": [
+ "ky",
+ "ru"
+ ],
+ "KH": [
+ "km"
+ ],
+ "KI": [
+ "en"
+ ],
+ "KM": [
+ "ar",
+ "fr"
+ ],
+ "KN": [
+ "en"
+ ],
+ "KP": [
+ "ko"
+ ],
+ "KR": [
+ "ko"
+ ],
+ "KW": [
+ "ar"
+ ],
+ "KY": [
+ "en"
+ ],
+ "KZ": [
+ "ru",
+ "kk-cyrl",
+ "en",
+ "de",
+ "ug-cyrl",
+ "ug-arab"
+ ],
+ "LA": [
+ "lo"
+ ],
+ "LB": [
+ "ar",
+ "en",
+ "hy",
+ "ku-arab",
+ "ku-latn",
+ "fr"
+ ],
+ "LC": [
+ "en"
+ ],
+ "LI": [
+ "de",
+ "gsw"
+ ],
+ "LK": [
+ "si",
+ "ta",
+ "en"
+ ],
+ "LR": [
+ "en",
+ "vai",
+ "ff"
+ ],
+ "LS": [
+ "st",
+ "en",
+ "zu",
+ "ss",
+ "xh"
+ ],
+ "LT": [
+ "lt",
+ "ru",
+ "en",
+ "de",
+ "sgs"
+ ],
+ "LU": [
+ "fr",
+ "lb",
+ "de",
+ "en",
+ "pt"
+ ],
+ "LV": [
+ "lv",
+ "en",
+ "ru",
+ "ltg"
+ ],
+ "LY": [
+ "ar"
+ ],
+ "MA": [
+ "ary",
+ "ar",
+ "zgh",
+ "fr",
+ "en",
+ "tzm",
+ "shi-latn",
+ "rif",
+ "es"
+ ],
+ "MC": [
+ "fr"
+ ],
+ "MD": [
+ "ro",
+ "uk",
+ "bg",
+ "gag",
+ "ru"
+ ],
+ "ME": [
+ "sr-latn",
+ "sr-cyrl",
+ "sq"
+ ],
+ "MF": [
+ "fr"
+ ],
+ "MG": [
+ "mg",
+ "fr",
+ "en"
+ ],
+ "MH": [
+ "en",
+ "mh"
+ ],
+ "MK": [
+ "mk",
+ "sq",
+ "tr"
+ ],
+ "ML": [
+ "bm",
+ "fr",
+ "ses",
+ "ar"
+ ],
+ "MM": [
+ "my",
+ "shn",
+ "kac",
+ "rhg",
+ "mnw"
+ ],
+ "MN": [
+ "mn",
+ "kk-arab",
+ "kk-cyrl",
+ "zh",
+ "ru",
+ "ug-cyrl",
+ "ug-arab"
+ ],
+ "MO": [
+ "zh-hant",
+ "zh",
+ "pt",
+ "en"
+ ],
+ "MP": [
+ "en",
+ "ch"
+ ],
+ "MQ": [
+ "fr"
+ ],
+ "MR": [
+ "ar",
+ "fr",
+ "ff",
+ "wo"
+ ],
+ "MS": [
+ "en"
+ ],
+ "MT": [
+ "mt",
+ "en",
+ "it",
+ "fr"
+ ],
+ "MU": [
+ "mfe",
+ "en",
+ "bho",
+ "ur",
+ "fr",
+ "ta"
+ ],
+ "MV": [
+ "dv",
+ "en"
+ ],
+ "MW": [
+ "en",
+ "ny",
+ "tum",
+ "zu"
+ ],
+ "MX": [
+ "es",
+ "en",
+ "yua",
+ "vec",
+ "sei"
+ ],
+ "MY": [
+ "ms",
+ "en",
+ "zh",
+ "ta",
+ "jv",
+ "dtp",
+ "ml",
+ "bug",
+ "bjn"
+ ],
+ "MZ": [
+ "pt",
+ "vmw",
+ "ts",
+ "ny",
+ "sw",
+ "zu"
+ ],
+ "NA": [
+ "af",
+ "kj",
+ "ng",
+ "hz",
+ "en",
+ "de",
+ "tn"
+ ],
+ "NC": [
+ "fr"
+ ],
+ "NE": [
+ "ha",
+ "fr",
+ "ar",
+ "ff"
+ ],
+ "NF": [
+ "en"
+ ],
+ "NG": [
+ "en",
+ "pcm",
+ "ha",
+ "ig",
+ "yo",
+ "efi",
+ "ha-arab",
+ "kcg",
+ "ar",
+ "ff",
+ "ann"
+ ],
+ "NI": [
+ "es"
+ ],
+ "NL": [
+ "nl",
+ "en",
+ "de",
+ "fr",
+ "nds",
+ "li",
+ "fy",
+ "id",
+ "zea",
+ "rif",
+ "tr"
+ ],
+ "NO": [
+ "nb",
+ "no",
+ "nn",
+ "se"
+ ],
+ "NP": [
+ "ne",
+ "mai",
+ "bho",
+ "new",
+ "en",
+ "dty",
+ "awa",
+ "hi",
+ "bo",
+ "bn"
+ ],
+ "NR": [
+ "en",
+ "na"
+ ],
+ "NU": [
+ "en",
+ "niu"
+ ],
+ "NZ": [
+ "en",
+ "mi"
+ ],
+ "OM": [
+ "ar",
+ "fa"
+ ],
+ "PA": [
+ "es",
+ "en",
+ "zh-hant",
+ "zh"
+ ],
+ "PE": [
+ "es",
+ "qu",
+ "ay"
+ ],
+ "PF": [
+ "fr",
+ "ty",
+ "zh-hant",
+ "zh"
+ ],
+ "PG": [
+ "tpi",
+ "en",
+ "ho"
+ ],
+ "PH": [
+ "en",
+ "tl",
+ "es",
+ "ceb",
+ "ilo",
+ "hil",
+ "war",
+ "pam",
+ "pag",
+ "zh-hant",
+ "zh",
+ "cps",
+ "krj",
+ "bto"
+ ],
+ "PK": [
+ "ur",
+ "pa-guru",
+ "en",
+ "ps",
+ "sd",
+ "skr-arab",
+ "brh",
+ "fa",
+ "bgn",
+ "tg-cyrl",
+ "bft",
+ "khw",
+ "ks-arab"
+ ],
+ "PL": [
+ "pl",
+ "en",
+ "de",
+ "ru",
+ "szl",
+ "be",
+ "uk",
+ "csb",
+ "sli",
+ "lt",
+ "prg"
+ ],
+ "PM": [
+ "fr",
+ "en"
+ ],
+ "PN": [
+ "en"
+ ],
+ "PR": [
+ "es",
+ "en"
+ ],
+ "PS": [
+ "ar"
+ ],
+ "PT": [
+ "pt",
+ "en",
+ "fr",
+ "es",
+ "gl"
+ ],
+ "PW": [
+ "en"
+ ],
+ "PY": [
+ "gn",
+ "es",
+ "de"
+ ],
+ "QA": [
+ "ar",
+ "fa",
+ "ml"
+ ],
+ "RE": [
+ "fr",
+ "rcf",
+ "ta"
+ ],
+ "RO": [
+ "ro",
+ "en",
+ "fr",
+ "es",
+ "hu",
+ "de",
+ "tr",
+ "sr-latn",
+ "sr-cyrl",
+ "bg",
+ "el",
+ "pl"
+ ],
+ "RS": [
+ "sr-cyrl",
+ "sr-latn",
+ "sq",
+ "hu",
+ "ro",
+ "hr",
+ "sk",
+ "uk"
+ ],
+ "RU": [
+ "ru",
+ "tt",
+ "ba",
+ "cv",
+ "hy",
+ "ce",
+ "av",
+ "udm",
+ "mhr",
+ "sah",
+ "os",
+ "kbd",
+ "myv",
+ "dar",
+ "mdf",
+ "kum",
+ "kv",
+ "lez",
+ "krc",
+ "inh",
+ "tyv",
+ "az-cyrl",
+ "az-latn",
+ "ady",
+ "krl",
+ "lbe",
+ "koi",
+ "mrj",
+ "alt",
+ "fi",
+ "sr-latn",
+ "sr-cyrl",
+ "vep",
+ "mn",
+ "izh",
+ "vot",
+ "cu"
+ ],
+ "RW": [
+ "rw",
+ "en",
+ "fr"
+ ],
+ "SA": [
+ "ar"
+ ],
+ "SB": [
+ "en",
+ "pis"
+ ],
+ "SC": [
+ "fr",
+ "en"
+ ],
+ "SD": [
+ "ar",
+ "en",
+ "fvr",
+ "ha-arab",
+ "ha"
+ ],
+ "SE": [
+ "sv",
+ "en",
+ "fi",
+ "fit",
+ "se",
+ "yi",
+ "smj",
+ "sma",
+ "ia"
+ ],
+ "SG": [
+ "en",
+ "zh",
+ "ms",
+ "ta",
+ "ml",
+ "pa-guru"
+ ],
+ "SH": [
+ "en"
+ ],
+ "SI": [
+ "sl",
+ "hr",
+ "en",
+ "de",
+ "vec",
+ "hu",
+ "it"
+ ],
+ "SJ": [
+ "nb",
+ "ru"
+ ],
+ "SK": [
+ "sk",
+ "cs",
+ "en",
+ "de",
+ "hu",
+ "uk",
+ "pl"
+ ],
+ "SL": [
+ "kri",
+ "en",
+ "ff"
+ ],
+ "SM": [
+ "it",
+ "eo"
+ ],
+ "SN": [
+ "wo",
+ "fr",
+ "ff"
+ ],
+ "SO": [
+ "so",
+ "ar",
+ "sw",
+ "om"
+ ],
+ "SR": [
+ "nl",
+ "srn",
+ "zh-hant",
+ "zh"
+ ],
+ "SS": [
+ "ar",
+ "en",
+ "nus"
+ ],
+ "ST": [
+ "pt"
+ ],
+ "SV": [
+ "es"
+ ],
+ "SX": [
+ "en",
+ "es",
+ "nl"
+ ],
+ "SY": [
+ "ar",
+ "ku-latn",
+ "fr",
+ "hy"
+ ],
+ "SZ": [
+ "en",
+ "ss",
+ "zu",
+ "ts"
+ ],
+ "TA": [
+ "en"
+ ],
+ "TC": [
+ "en"
+ ],
+ "TD": [
+ "fr",
+ "ar"
+ ],
+ "TF": [
+ "fr"
+ ],
+ "TG": [
+ "fr",
+ "ee"
+ ],
+ "TH": [
+ "th",
+ "en",
+ "nod",
+ "zh-hant",
+ "zh",
+ "mnw",
+ "shn"
+ ],
+ "TJ": [
+ "tg-cyrl",
+ "ru",
+ "fa",
+ "ar"
+ ],
+ "TK": [
+ "en"
+ ],
+ "TL": [
+ "pt",
+ "tet"
+ ],
+ "TM": [
+ "tk",
+ "ru",
+ "uz",
+ "ku-latn"
+ ],
+ "TN": [
+ "aeb-arab",
+ "ar",
+ "fr"
+ ],
+ "TO": [
+ "to",
+ "en"
+ ],
+ "TR": [
+ "tr",
+ "en",
+ "ku-latn",
+ "kbd",
+ "az-latn",
+ "az-arab",
+ "ar",
+ "bg",
+ "ady",
+ "kiu",
+ "hy",
+ "ka",
+ "sr-latn",
+ "sr-cyrl",
+ "lzz",
+ "sq",
+ "ab",
+ "el",
+ "tru",
+ "uz",
+ "ky",
+ "kk-cyrl"
+ ],
+ "TT": [
+ "en",
+ "es"
+ ],
+ "TV": [
+ "en"
+ ],
+ "TW": [
+ "zh-hant",
+ "zh",
+ "trv"
+ ],
+ "TZ": [
+ "sw",
+ "en",
+ "lag"
+ ],
+ "UA": [
+ "uk",
+ "ru",
+ "pl",
+ "yi",
+ "rue",
+ "be",
+ "crh",
+ "ro",
+ "bg",
+ "tr",
+ "hu",
+ "el"
+ ],
+ "UG": [
+ "sw",
+ "lg",
+ "nyn",
+ "en",
+ "rw",
+ "hi"
+ ],
+ "UM": [
+ "en"
+ ],
+ "US": [
+ "en",
+ "es",
+ "zh-hant",
+ "zh",
+ "fr",
+ "de",
+ "tl",
+ "it",
+ "vi",
+ "ko",
+ "ru",
+ "nv",
+ "yi",
+ "pdc",
+ "haw",
+ "frc",
+ "chr",
+ "esu",
+ "cho",
+ "lkt",
+ "ik",
+ "mus",
+ "io",
+ "jbo"
+ ],
+ "UY": [
+ "es"
+ ],
+ "UZ": [
+ "uz",
+ "uz-cyrl",
+ "ru",
+ "kaa",
+ "tr"
+ ],
+ "VA": [
+ "it",
+ "la"
+ ],
+ "VC": [
+ "en"
+ ],
+ "VE": [
+ "es",
+ "yrl"
+ ],
+ "VG": [
+ "en"
+ ],
+ "VI": [
+ "en"
+ ],
+ "VN": [
+ "vi",
+ "zh-hant",
+ "zh"
+ ],
+ "VU": [
+ "bi",
+ "en",
+ "fr"
+ ],
+ "WF": [
+ "wls",
+ "fr"
+ ],
+ "WS": [
+ "sm",
+ "en"
+ ],
+ "XK": [
+ "sq",
+ "aln",
+ "sr-cyrl",
+ "sr-latn"
+ ],
+ "YE": [
+ "ar",
+ "en"
+ ],
+ "YT": [
+ "swb",
+ "fr",
+ "sw"
+ ],
+ "ZA": [
+ "en",
+ "zu",
+ "xh",
+ "af",
+ "nso",
+ "tn",
+ "st",
+ "ts",
+ "ss",
+ "ve",
+ "hi",
+ "nr",
+ "sw"
+ ],
+ "ZM": [
+ "en",
+ "ny",
+ "loz"
+ ],
+ "ZW": [
+ "sn",
+ "en",
+ "nd",
+ "kck",
+ "ny",
+ "ve",
+ "tn"
+ ]
+ }
+}
+
+ }( jQuery ) );
+ }, {} ]
+}, {}, [ 1 ] );
diff --git a/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.utils.js b/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.utils.js
new file mode 100644
index 00000000..9c34f9b9
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.utils.js
@@ -0,0 +1,335 @@
+/**
+ * Utility functions for querying language data.
+ *
+ * Copyright (C) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
+ * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
+ * contributors. See CREDITS for a list.
+ *
+ * UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
+ * have to do anything special to choose one license or the other and you don't
+ * have to notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @file
+ * @license GNU General Public Licence 2.0 or later
+ * @license MIT License
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ /**
+ * Is this language a redirect to another language?
+ *
+ * @param {string} language Language code
+ * @return {string|boolean} Target language code if it's a redirect or false if it's not
+ */
+ $.uls.data.isRedirect = function ( language ) {
+ return ( $.uls.data.languages[ language ] !== undefined &&
+ $.uls.data.languages[ language ].length === 1 ) ?
+ $.uls.data.languages[ language ][ 0 ] : false;
+ };
+
+ /**
+ * Returns the script of the language.
+ *
+ * @param {string} language Language code
+ * @return {string}
+ */
+ $.uls.data.getScript = function ( language ) {
+ var target = $.uls.data.isRedirect( language );
+
+ if ( target ) {
+ return $.uls.data.getScript( target );
+ }
+
+ if ( !$.uls.data.languages[ language ] ) {
+ // Undetermined
+ return 'Zyyy';
+ }
+
+ return $.uls.data.languages[ language ][ 0 ];
+ };
+
+ /**
+ * Returns the regions in which a language is spoken.
+ *
+ * @param {string} language Language code
+ * @return {string|string[]}
+ */
+ $.uls.data.getRegions = function ( language ) {
+ var target = $.uls.data.isRedirect( language );
+
+ if ( target ) {
+ return $.uls.data.getRegions( target );
+ }
+
+ return ( $.uls.data.languages[ language ] && $.uls.data.languages[ language ][ 1 ] ) || 'UNKNOWN';
+ };
+
+ /**
+ * Returns the autonym of the language.
+ *
+ * @param {string} language Language code
+ * @return {string}
+ */
+ $.uls.data.getAutonym = function ( language ) {
+ var target = $.uls.data.isRedirect( language );
+
+ if ( target ) {
+ return $.uls.data.getAutonym( target );
+ }
+
+ return ( $.uls.data.languages[ language ] &&
+ $.uls.data.languages[ language ][ 2 ] ) || language;
+ };
+
+ /**
+ * Returns all language codes and corresponding autonyms
+ *
+ * @return {string[]}
+ */
+ $.uls.data.getAutonyms = function () {
+ var language,
+ autonymsByCode = {};
+
+ for ( language in $.uls.data.languages ) {
+ if ( $.uls.data.isRedirect( language ) ) {
+ continue;
+ }
+
+ autonymsByCode[ language ] = $.uls.data.getAutonym( language );
+ }
+
+ return autonymsByCode;
+ };
+
+ /**
+ * Returns all languages written in script.
+ *
+ * @param {string} script string
+ * @return {string[]} languages codes
+ */
+ $.uls.data.getLanguagesInScript = function ( script ) {
+ return $.uls.data.getLanguagesInScripts( [ script ] );
+ };
+
+ /**
+ * Returns all languages written in the given scripts.
+ *
+ * @param {string[]} scripts
+ * @return {string[]} languages codes
+ */
+ $.uls.data.getLanguagesInScripts = function ( scripts ) {
+ var language, i,
+ languagesInScripts = [];
+
+ for ( language in $.uls.data.languages ) {
+ if ( $.uls.data.isRedirect( language ) ) {
+ continue;
+ }
+
+ for ( i = 0; i < scripts.length; i++ ) {
+ if ( scripts[ i ] === $.uls.data.getScript( language ) ) {
+ languagesInScripts.push( language );
+ break;
+ }
+ }
+ }
+
+ return languagesInScripts;
+ };
+
+ /**
+ * Returns an associative array of languages in a region,
+ * grouped by script group.
+ *
+ * @param {string} region Region code
+ * @return {Object}
+ */
+ $.uls.data.getLanguagesByScriptGroupInRegion = function ( region ) {
+ return $.uls.data.getLanguagesByScriptGroupInRegions( [ region ] );
+ };
+
+ /**
+ * Get the given list of languages grouped by script.
+ *
+ * @param {string[]} languages Array of language codes to group
+ * @return {string[]} Array of language codes
+ */
+ $.uls.data.getLanguagesByScriptGroup = function ( languages ) {
+ var languagesByScriptGroup = {},
+ language, languageIndex, resolvedRedirect, langScriptGroup;
+
+ for ( languageIndex = 0; languageIndex < languages.length; languageIndex++ ) {
+ language = languages[ languageIndex ];
+ resolvedRedirect = $.uls.data.isRedirect( language ) || language;
+ langScriptGroup = $.uls.data.getScriptGroupOfLanguage( resolvedRedirect );
+ if ( !languagesByScriptGroup[ langScriptGroup ] ) {
+ languagesByScriptGroup[ langScriptGroup ] = [];
+ }
+ languagesByScriptGroup[ langScriptGroup ].push( language );
+ }
+ return languagesByScriptGroup;
+ };
+
+ /**
+ * Returns an associative array of languages in several regions,
+ * grouped by script group.
+ *
+ * @param {string[]} regions region codes
+ * @return {Object}
+ */
+ $.uls.data.getLanguagesByScriptGroupInRegions = function ( regions ) {
+ var language, i, scriptGroup,
+ languagesByScriptGroupInRegions = {};
+
+ for ( language in $.uls.data.languages ) {
+ if ( $.uls.data.isRedirect( language ) ) {
+ continue;
+ }
+
+ for ( i = 0; i < regions.length; i++ ) {
+ if ( $.uls.data.getRegions( language ).indexOf( regions[ i ] ) !== -1 ) {
+ scriptGroup = $.uls.data.getScriptGroupOfLanguage( language );
+
+ if ( languagesByScriptGroupInRegions[ scriptGroup ] === undefined ) {
+ languagesByScriptGroupInRegions[ scriptGroup ] = [];
+ }
+
+ languagesByScriptGroupInRegions[ scriptGroup ].push( language );
+ break;
+ }
+ }
+ }
+
+ return languagesByScriptGroupInRegions;
+ };
+
+ /**
+ * Returns the script group of a script or 'Other' if it doesn't
+ * belong to any group.
+ *
+ * @param {string} script Script code
+ * @return {string} script group name
+ */
+ $.uls.data.getGroupOfScript = function ( script ) {
+ var scriptGroup;
+
+ for ( scriptGroup in $.uls.data.scriptgroups ) {
+ if ( $.uls.data.scriptgroups[ scriptGroup ].indexOf( script ) !== -1 ) {
+ return scriptGroup;
+ }
+ }
+
+ return 'Other';
+ };
+
+ /**
+ * Returns the script group of a language.
+ *
+ * @param {string} language Language code
+ * @return {string} script group name
+ */
+ $.uls.data.getScriptGroupOfLanguage = function ( language ) {
+ return $.uls.data.getGroupOfScript( $.uls.data.getScript( language ) );
+ };
+
+ /**
+ * Return the list of languages sorted by script groups.
+ *
+ * @param {string[]} languages Array of language codes to sort
+ * @return {string[]} Array of language codes
+ */
+ $.uls.data.sortByScriptGroup = function ( languages ) {
+ var groupedLanguages, scriptGroups, i,
+ allLanguages = [];
+
+ groupedLanguages = $.uls.data.getLanguagesByScriptGroup( languages );
+ scriptGroups = Object.keys( groupedLanguages ).sort();
+
+ for ( i = 0; i < scriptGroups.length; i++ ) {
+ allLanguages = allLanguages.concat( groupedLanguages[ scriptGroups[ i ] ] );
+ }
+
+ return allLanguages;
+ };
+
+ /**
+ * A callback for sorting languages by autonym.
+ * Can be used as an argument to a sort function.
+ *
+ * @param {string} a Language code
+ * @param {string} b Language code
+ * @return {number}
+ */
+ $.uls.data.sortByAutonym = function ( a, b ) {
+ var autonymA = $.uls.data.getAutonym( a ) || a,
+ autonymB = $.uls.data.getAutonym( b ) || b;
+
+ return ( autonymA.toLowerCase() < autonymB.toLowerCase() ) ? -1 : 1;
+ };
+
+ /**
+ * Check if a language is right-to-left.
+ *
+ * @param {string} language Language code
+ * @return {boolean}
+ */
+ $.uls.data.isRtl = function ( language ) {
+ return $.uls.data.rtlscripts.indexOf( $.uls.data.getScript( language ) ) !== -1;
+ };
+
+ /**
+ * Return the direction of the language
+ *
+ * @param {string} language Language code
+ * @return {string}
+ */
+ $.uls.data.getDir = function ( language ) {
+ return $.uls.data.isRtl( language ) ? 'rtl' : 'ltr';
+ };
+
+ /**
+ * Returns the languages spoken in a territory.
+ *
+ * @param {string} territory Territory code
+ * @return {string[]} list of language codes
+ */
+ $.uls.data.getLanguagesInTerritory = function ( territory ) {
+ return $.uls.data.territories[ territory ] || [];
+ };
+
+ /**
+ * Adds a language in run time and sets its options as provided.
+ * If the target option is provided, the language is defined as a redirect.
+ * Other possible options are script, regions and autonym.
+ *
+ * @param {string} code New language code.
+ * @param {Object} options Language properties.
+ */
+ $.uls.data.addLanguage = function ( code, options ) {
+ if ( options.target ) {
+ $.uls.data.languages[ code ] = [ options.target ];
+ } else {
+ $.uls.data.languages[ code ] = [ options.script, options.regions, options.autonym ];
+ }
+ };
+
+ /**
+ * Removes a language from the langdb in run time.
+ *
+ * @param {string} code Language code to delete.
+ * @return {boolean} true if the language was removed, false otherwise.
+ */
+ $.uls.data.deleteLanguage = function ( code ) {
+ if ( $.uls.data.languages[ code ] ) {
+ delete $.uls.data.languages[ code ];
+
+ return true;
+ }
+
+ return false;
+ };
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.languagefilter.js b/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.languagefilter.js
new file mode 100644
index 00000000..c87c680b
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.languagefilter.js
@@ -0,0 +1,361 @@
+/**
+ * jQuery language filter plugin.
+ *
+ * Copyright (C) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
+ * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
+ * contributors. See CREDITS for a list.
+ *
+ * UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
+ * have to do anything special to choose one license or the other and you don't
+ * have to notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @file
+ * @license GNU General Public Licence 2.0 or later
+ * @license MIT License
+ */
+
+/**
+ * Usage: $( 'inputbox' ).languagefilter();
+ * The values for autocompletion is from the options.languages or options.searchAPI.
+ *
+ * @param {jQuery} $
+ */
+( function ( $ ) {
+ 'use strict';
+
+ var LanguageFilter;
+
+ /**
+ * Check if a prefix is visually prefix of a string
+ *
+ * @param {string} prefix
+ * @param {string} string
+ * @return {boolean}
+ */
+ function isVisualPrefix( prefix, string ) {
+ // Pre-base vowel signs of Indic languages. A vowel sign is called pre-base if
+ // consonant + vowel becomes [vowel][consonant] when rendered. Eg: ക + െ => കെ
+ var prebases = 'െേൈൊോൌெேைொோௌେୈୋୌિਿिিেৈোৌෙේෛොෝෞ';
+ return prebases.indexOf( string[ prefix.length ] ) <= 0;
+ }
+
+ LanguageFilter = function ( element, options ) {
+ this.$element = $( element );
+ this.options = $.extend( {}, $.fn.languagefilter.defaults, options );
+ this.$element.addClass( 'languagefilter' );
+ this.resultCount = 0;
+ this.$suggestion = this.$element.siblings( '.' + this.$element.data( 'suggestion' ) );
+ this.$clear = this.$element.siblings( '.' + this.$element.data( 'clear' ) );
+ this.selectedLanguage = null;
+ this.init();
+ this.listen();
+ };
+
+ LanguageFilter.prototype = {
+ init: function () {
+ this.search();
+ },
+
+ listen: function () {
+ this.$element.on( 'keydown', this.keypress.bind( this ) );
+ this.$element.on( 'input', $.fn.uls.debounce( this.onInputChange.bind( this ), 300 ) );
+
+ if ( this.$clear.length ) {
+ this.$clear.on( 'click', this.clear.bind( this ) );
+ }
+
+ this.toggleClear();
+ },
+
+ onInputChange: function () {
+ this.selectedLanguage = null;
+
+ if ( !this.$element.val() ) {
+ this.clear();
+ } else {
+ this.options.lcd.empty();
+ this.search();
+ }
+
+ this.toggleClear();
+ },
+
+ keypress: function ( e ) {
+ var suggestion, query;
+
+ switch ( e.keyCode ) {
+ case 9: // Tab -> Autocomplete
+ suggestion = this.$suggestion.val();
+
+ if ( suggestion && suggestion !== this.$element.val() ) {
+ this.$element.val( suggestion );
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ break;
+ case 13: // Enter
+ if ( !this.options.onSelect ) {
+ break;
+ }
+
+ // Avoid bubbling this 'enter' to background page elements
+ e.preventDefault();
+ e.stopPropagation();
+
+ query = ( this.$element.val() || '' ).trim().toLowerCase();
+
+ if ( this.selectedLanguage ) {
+ // this.selectLanguage will be populated from a matching search
+ this.options.onSelect( this.selectedLanguage, e );
+ } else if ( this.options.languages[ query ] ) {
+ // Search is yet to happen (in timeout delay),
+ // but we have a matching language code.
+ this.options.onSelect( query, e );
+ }
+
+ break;
+ }
+ },
+
+ /**
+ * Clears the current search removing
+ * clear buttons and suggestions.
+ */
+ deactivate: function () {
+ this.$element.val( '' );
+
+ if ( !$.fn.uls.Constructor.prototype.isMobile() ) {
+ this.$element.trigger( 'focus' );
+ }
+
+ this.toggleClear();
+ this.autofill();
+ },
+
+ /**
+ * Clears the search and shows all languages
+ */
+ clear: function () {
+ this.deactivate();
+ this.search();
+ },
+
+ /**
+ * Toggles the visibility of clear icon depending
+ * on whether there is anything to clear.
+ */
+ toggleClear: function () {
+ if ( !this.$clear.length ) {
+ return;
+ }
+
+ if ( this.$element.val() ) {
+ this.$clear.show();
+ } else {
+ this.$clear.hide();
+ }
+ },
+
+ search: function () {
+ var languages = Object.keys( this.options.languages ),
+ results = [],
+ query = ( this.$element.val() || '' ).trim().toLowerCase();
+
+ if ( query === '' ) {
+ this.options.lcd.setGroupByRegionOverride( null );
+ this.resultHandler( query, languages );
+ return;
+ }
+
+ this.options.lcd.setGroupByRegionOverride( false );
+ // Local search results
+ results = languages.filter( function ( langCode ) {
+ return this.filter( langCode, query );
+ }.bind( this ) );
+
+ // Use the searchAPI if available, assuming that it has superior search results.
+ if ( this.options.searchAPI ) {
+ this.searchAPI( query )
+ .done( this.resultHandler.bind( this ) )
+ .fail( this.resultHandler.bind( this, query, results, undefined ) );
+ } else {
+ this.resultHandler( query, results );
+ }
+ },
+
+ searchAPI: function ( query ) {
+ return $.get( this.options.searchAPI, { search: query } ).then( function ( result ) {
+ var autofillLabel,
+ results = [];
+
+ // eslint-disable-next-line no-jquery/no-each-util
+ $.each( result.languagesearch, function ( apiCode, name ) {
+ var code, redirect;
+
+ if ( this.options.languages[ apiCode ] ) {
+ code = apiCode;
+ } else {
+ redirect = $.uls.data.isRedirect( apiCode );
+ if ( !redirect || !this.options.languages[ redirect ] ) {
+ return;
+ }
+ code = redirect;
+ }
+
+ // Because of the redirect checking above, we might get duplicates.
+ // For example if API returns both `sr` and `sr-cyrl`, the former
+ // could get mapped to `sr-cyrl` and then we would have it twice.
+ // The exact cases when this happens of course depends on what is in
+ // options.languages, which might contain redirects such as `sr`. In
+ // this case we only show `sr` if no other variants are there.
+ // This also protects against broken search APIs returning duplicate
+ // results, although that is not happening in practice.
+ if ( results.indexOf( code ) === -1 ) {
+ autofillLabel = autofillLabel || name;
+ results.push( code );
+ }
+ }.bind( this ) );
+
+ return $.Deferred().resolve( query, results, autofillLabel );
+ }.bind( this ) );
+ },
+
+ /**
+ * Handler method to be called once search is over.
+ * Based on search result triggers resultsfound or noresults events
+ *
+ * @param {string} query
+ * @param {string[]} results
+ * @param {string} [autofillLabel]
+ */
+ resultHandler: function ( query, results, autofillLabel ) {
+ if ( results.length === 0 ) {
+ this.$suggestion.val( '' );
+ this.$element.trigger(
+ 'noresults.uls',
+ {
+ query: query,
+ ulsPurpose: this.options.ulsPurpose
+ }
+ );
+ return;
+ }
+
+ if ( query ) {
+ this.selectedLanguage = results[ 0 ];
+ this.autofill( results[ 0 ], autofillLabel );
+ }
+
+ results.map( this.render.bind( this ) );
+ this.$element.trigger( 'resultsfound.uls', [ query, results.length ] );
+ },
+
+ autofill: function ( langCode, languageName ) {
+ var autonym, userInput, suggestion;
+
+ if ( !this.$suggestion.length ) {
+ return;
+ }
+
+ if ( !this.$element.val() ) {
+ this.$suggestion.val( '' );
+ return;
+ }
+
+ languageName = languageName || this.options.languages[ langCode ];
+
+ if ( !languageName ) {
+ return;
+ }
+
+ userInput = this.$element.val();
+ suggestion = userInput +
+ languageName.slice( userInput.length, languageName.length );
+
+ if ( suggestion.toLowerCase() !== languageName.toLowerCase() ) {
+ // see if it was autonym match
+ autonym = $.uls.data.getAutonym( langCode ) || '';
+ suggestion = userInput + autonym.slice( userInput.length, autonym.length );
+
+ if ( suggestion !== autonym ) {
+ // Give up. It may be an ISO/script code match.
+ suggestion = '';
+ }
+ }
+
+ // Make sure that it is a visual prefix.
+ if ( !isVisualPrefix( userInput, suggestion ) ) {
+ suggestion = '';
+ }
+
+ this.$suggestion.val( suggestion );
+ },
+
+ render: function ( langCode ) {
+ return this.options.lcd.append( langCode );
+ },
+
+ escapeRegex: function ( value ) {
+ return value.replace( /[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&' );
+ },
+
+ /**
+ * A search match happens if any of the following passes:
+ * a) Language name in current user interface language
+ * 'starts with' search string.
+ * b) Language autonym 'starts with' search string.
+ * c) ISO 639 code match with search string.
+ * d) ISO 15924 code for the script match the search string.
+ *
+ * @param {string} langCode
+ * @param {string} searchTerm
+ * @return {boolean}
+ */
+ filter: function ( langCode, searchTerm ) {
+ // FIXME script is ISO 15924 code. We might need actual name of script.
+ var matcher = new RegExp( '^' + this.escapeRegex( searchTerm ), 'i' ),
+ languageName = this.options.languages[ langCode ];
+
+ return matcher.test( languageName ) ||
+ matcher.test( $.uls.data.getAutonym( langCode ) ) ||
+ matcher.test( langCode ) ||
+ matcher.test( $.uls.data.getScript( langCode ) );
+ }
+ };
+
+ $.fn.languagefilter = function ( option ) {
+ return this.each( function () {
+ var $this = $( this ),
+ data = $this.data( 'languagefilter' ),
+ options = typeof option === 'object' && option;
+
+ if ( !data ) {
+ $this.data( 'languagefilter', ( data = new LanguageFilter( this, options ) ) );
+ }
+
+ if ( typeof option === 'string' ) {
+ data[ option ]();
+ }
+ } );
+ };
+
+ $.fn.languagefilter.defaults = {
+ // LanguageCategoryDisplay
+ lcd: undefined,
+ // URL to which we append query parameter with the query value
+ searchAPI: undefined,
+ // What is this ULS used for.
+ // Should be set for distinguishing between different instances of ULS
+ // in the same application.
+ ulsPurpose: '',
+ // Object of language tags to language names
+ languages: [],
+ // Callback function when language is selected
+ onSelect: undefined
+ };
+
+ $.fn.languagefilter.Constructor = LanguageFilter;
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.lcd.js b/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.lcd.js
new file mode 100644
index 00000000..47f08200
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.lcd.js
@@ -0,0 +1,481 @@
+/**
+ * Universal Language Selector
+ * Language category display component - Used for showing the search results,
+ * grouped by regions, scripts
+ *
+ * Copyright (C) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
+ * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
+ * contributors. See CREDITS for a list.
+ *
+ * UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
+ * have to do anything special to choose one license or the other and you don't
+ * have to notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @file
+ * @license GNU General Public Licence 2.0 or later
+ * @license MIT License
+ */
+
+( function ( $ ) {
+ 'use strict';
+
+ var noResultsTemplate = '<div class="uls-no-results-view"> \
+ <h2 data-i18n="uls-no-results-found" class="uls-no-results-found-title">No results found</h2> \
+ <div class="uls-no-results-suggestions"></div> \
+ <div class="uls-no-found-more"> \
+ <div data-i18n="uls-search-help">You can search by language name, script name, ISO code of language or you can browse by region.</div> \
+ </div></div>';
+
+ /**
+ * Language category display
+ *
+ * @param {Element} element The container element to which the languages to be displayed
+ * @param {Object} [options] Configuration object
+ * @cfg {Object} [languages] Selectable languages. Keyed by language code, values are autonyms.
+ * @cfg {string[]} [showRegions] Array of region codes to show. Default is
+ * [ 'WW', 'AM', 'EU', 'ME', 'AF', 'AS', 'PA' ]
+ * @cfg {number} [itemsPerColumn] Number of languages per column.
+ * @cfg {number} [columns] Number of columns for languages. Default is 4.
+ * @cfg {Function} [languageDecorator] Callback function to be called when a language
+ * link is prepared - for custom decoration.
+ * @cfg {Function|string[]} [quickList] The languages to display as suggestions for quick
+ * selection.
+ * @cfg {Function} [clickhandler] Callback when language is selected.
+ * @cfg {jQuery|Function} [noResultsTemplate]
+ */
+ function LanguageCategoryDisplay( element, options ) {
+ this.$element = $( element );
+ this.options = $.extend( {}, $.fn.lcd.defaults, options );
+ // Ensure the internal region 'all' is always present
+ if ( this.options.showRegions.indexOf( 'all' ) === -1 ) {
+ this.options.showRegions.push( 'all' );
+ }
+
+ this.$element.addClass( 'uls-lcd' );
+ this.regionLanguages = {};
+ this.renderTimeout = null;
+ this.$cachedQuicklist = null;
+ this.groupByRegionOverride = null;
+
+ this.render();
+ this.listen();
+ }
+
+ LanguageCategoryDisplay.prototype = {
+ constructor: LanguageCategoryDisplay,
+
+ /**
+ * Adds language to the language list.
+ *
+ * @param {string} langCode
+ * @param {string} [regionCode]
+ * @return {boolean} Whether the language was known and accepted
+ */
+ append: function ( langCode, regionCode ) {
+ var i, regions;
+
+ if ( !$.uls.data.languages[ langCode ] ) {
+ // Language is unknown or not in the list of languages for this context.
+ return false;
+ }
+
+ if ( !this.isGroupingByRegionEnabled() ) {
+ regions = [ 'all' ];
+
+ // Make sure we do not get duplicates
+ if ( this.regionLanguages.all.indexOf( langCode ) > -1 ) {
+ return true;
+ }
+ } else {
+ if ( regionCode ) {
+ regions = [ regionCode ];
+ } else {
+ regions = $.uls.data.getRegions( langCode );
+ }
+ }
+
+ for ( i = 0; i < regions.length; i++ ) {
+ if ( this.regionLanguages[ regions[ i ] ] ) {
+ this.regionLanguages[ regions[ i ] ].push( langCode );
+ }
+ }
+
+ // Work around the bad interface, delay rendering until we have got
+ // all the languages to speed up performance.
+ clearTimeout( this.renderTimeout );
+ this.renderTimeout = setTimeout( function () {
+ this.renderRegions();
+ }.bind( this ), 50 );
+
+ return true;
+ },
+
+ /**
+ * Whether we should render languages grouped to geographic regions.
+ *
+ * @return {boolean}
+ */
+ isGroupingByRegionEnabled: function () {
+ if ( this.groupByRegionOverride !== null ) {
+ return this.groupByRegionOverride;
+ } else if ( this.options.groupByRegion !== 'auto' ) {
+ return this.options.groupByRegion;
+ } else {
+ return this.options.columns > 1;
+ }
+ },
+
+ /**
+ * Override the default region grouping setting.
+ * This is to allow LanguageFilter to disable grouping when displaying search results.
+ *
+ * @param {boolean|null} val True to force grouping, false to disable, null
+ * to undo override.
+ */
+ setGroupByRegionOverride: function ( val ) {
+ this.groupByRegionOverride = val;
+ },
+
+ render: function () {
+ var $section,
+ $quicklist = this.buildQuicklist(),
+ regions = [],
+ regionNames = {
+ // These are fallback text when i18n library not present
+ all: 'All languages', // Used if there is quicklist and no region grouping
+ WW: 'Worldwide',
+ SP: 'Special',
+ AM: 'America',
+ EU: 'Europe',
+ ME: 'Middle East',
+ AS: 'Asia',
+ AF: 'Africa',
+ PA: 'Pacific'
+ };
+
+ if ( $quicklist.length ) {
+ regions.push( $quicklist );
+ } else {
+ // We use CSS to hide the header for 'all' when quicklist is NOT present
+ this.$element.addClass( 'uls-lcd--no-quicklist' );
+ }
+
+ this.options.showRegions.forEach( function ( regionCode ) {
+ this.regionLanguages[ regionCode ] = [];
+
+ $section = $( '<div>' )
+ .addClass( 'uls-lcd-region-section hide' )
+ .attr( 'data-region', regionCode );
+
+ $( '<h3>' )
+ .attr( 'data-i18n', 'uls-region-' + regionCode )
+ .addClass( 'uls-lcd-region-title' )
+ .text( regionNames[ regionCode ] )
+ .appendTo( $section );
+
+ regions.push( $section );
+ }.bind( this ) );
+
+ this.$element.append( regions );
+
+ this.i18n();
+ },
+
+ /**
+ * Renders a region and displays it if it has content.
+ */
+ renderRegions: function () {
+ var languages,
+ lcd = this;
+
+ this.$element.removeClass( 'uls-no-results' );
+ this.$element.children( '.uls-lcd-region-section' ).each( function () {
+ var $region = $( this ),
+ regionCode = $region.data( 'region' );
+
+ if ( $region.is( '.uls-lcd-quicklist' ) ) {
+ return;
+ }
+
+ $region.children( '.uls-language-block' ).remove();
+
+ languages = lcd.regionLanguages[ regionCode ];
+ if ( !languages || languages.length === 0 ) {
+ $region.addClass( 'hide' );
+ return;
+ }
+
+ lcd.renderRegion(
+ $region,
+ languages,
+ lcd.options.itemsPerColumn,
+ lcd.options.columns
+ );
+ $region.removeClass( 'hide' );
+
+ lcd.regionLanguages[ regionCode ] = [];
+ } );
+
+ },
+
+ /**
+ * Adds given languages sorted into rows and columns into given element.
+ *
+ * @param {jQuery} $region Element to add language list.
+ * @param {Array} languages List of language codes.
+ * @param {number} itemsPerColumn How many languages fit in a column.
+ * @param {number} columnsPerRow How many columns fit in a row.
+ */
+ renderRegion: function ( $region, languages, itemsPerColumn, columnsPerRow ) {
+ var columnsClasses, i, lastItem, currentScript, nextScript, force,
+ languagesCount = languages.length,
+ items = [],
+ columns = [],
+ rows = [];
+
+ languages = $.uls.data.sortByScriptGroup(
+ languages.sort( $.uls.data.sortByAutonym )
+ );
+
+ if ( columnsPerRow === 1 ) {
+ columnsClasses = 'twelve columns';
+ } else if ( columnsPerRow === 2 ) {
+ columnsClasses = 'six columns';
+ } else {
+ columnsClasses = 'three columns';
+ }
+
+ if ( this.options.columns === 1 ) {
+ // For one-column narrow ULS, just render all the languages
+ // in one simple list without separators or script groups
+ for ( i = 0; i < languagesCount; i++ ) {
+ items.push( this.renderItem( languages[ i ] ) );
+ }
+
+ columns.push( $( '<ul>' ).addClass( columnsClasses ).append( items ) );
+ rows.push( $( '<div>' ).addClass( 'row uls-language-block' ).append( columns ) );
+ } else {
+ // For medium and wide ULS, clever column placement
+ for ( i = 0; i < languagesCount; i++ ) {
+ force = false;
+ nextScript = $.uls.data.getScriptGroupOfLanguage( languages[ i + 1 ] );
+
+ lastItem = languagesCount - i === 1;
+ // Force column break if script changes and column has more than one
+ // row already, but only if grouping by region
+ if ( i === 0 || !this.isGroupingByRegionEnabled() ) {
+ currentScript = $.uls.data.getScriptGroupOfLanguage( languages[ i ] );
+ } else if ( currentScript !== nextScript && items.length > 1 ) {
+ force = true;
+ }
+ currentScript = nextScript;
+
+ items.push( this.renderItem( languages[ i ] ) );
+
+ if ( items.length >= itemsPerColumn || lastItem || force ) {
+ columns.push( $( '<ul>' ).addClass( columnsClasses ).append( items ) );
+ items = [];
+ if ( columns.length >= columnsPerRow || lastItem ) {
+ rows.push( $( '<div>' ).addClass( 'row uls-language-block' ).append( columns ) );
+ columns = [];
+ }
+ }
+ }
+ }
+
+ $region.append( rows );
+ },
+
+ /**
+ * Creates dom node representing one item in language list.
+ *
+ * @param {string} code Language code
+ * @return {Element}
+ */
+ renderItem: function ( code ) {
+ var a, name, autonym, li;
+
+ name = this.options.languages[ code ];
+ autonym = $.uls.data.getAutonym( code ) || name || code;
+
+ // Not using jQuery as this is performance hotspot
+ li = document.createElement( 'li' );
+ li.title = name;
+ li.setAttribute( 'data-code', code );
+
+ a = document.createElement( 'a' );
+ a.appendChild( document.createTextNode( autonym ) );
+ a.className = 'autonym';
+ a.lang = code;
+ a.dir = $.uls.data.getDir( code );
+
+ li.appendChild( a );
+ if ( this.options.languageDecorator ) {
+ this.options.languageDecorator( $( a ), code );
+ }
+ return li;
+ },
+
+ i18n: function () {
+ this.$element.find( '[data-i18n]' ).i18n();
+ },
+
+ /**
+ * Adds quicklist as a region.
+ */
+ quicklist: function () {
+ this.$element.find( '.uls-lcd-quicklist' ).removeClass( 'hide' );
+ },
+
+ buildQuicklist: function () {
+ var quickList, $quickListSection, $quickListSectionTitle;
+
+ if ( this.$cachedQuicklist !== null ) {
+ return this.$cachedQuicklist;
+ }
+
+ if ( typeof this.options.quickList === 'function' ) {
+ this.options.quickList = this.options.quickList();
+ }
+
+ if ( !this.options.quickList.length ) {
+ this.$cachedQuicklist = $( [] );
+ return this.$cachedQuicklist;
+ }
+
+ // Pick only the first elements, because we don't have room for more
+ quickList = this.options.quickList;
+ quickList = quickList.slice( 0, 16 );
+ quickList.sort( $.uls.data.sortByAutonym );
+
+ $quickListSection = $( '<div>' )
+ .addClass( 'uls-lcd-region-section uls-lcd-quicklist' );
+
+ $quickListSectionTitle = $( '<h3>' )
+ .attr( 'data-i18n', 'uls-common-languages' )
+ .addClass( 'uls-lcd-region-title' )
+ .text( 'Suggested languages' ); // This is placeholder text if jquery.i18n not present
+ $quickListSection.append( $quickListSectionTitle );
+
+ this.renderRegion(
+ $quickListSection,
+ quickList,
+ this.options.itemsPerColumn,
+ this.options.columns
+ );
+
+ $quickListSectionTitle.i18n();
+
+ this.$cachedQuicklist = $quickListSection;
+ return this.$cachedQuicklist;
+ },
+
+ show: function () {
+ if ( !this.regionDivs ) {
+ this.render();
+ }
+ },
+
+ /**
+ * Called when a fresh search is started
+ */
+ empty: function () {
+ this.$element.addClass( 'uls-lcd--no-quicklist' );
+ this.$element.find( '.uls-lcd-quicklist' ).addClass( 'hide' );
+ },
+
+ focus: function () {
+ this.$element.trigger( 'focus' );
+ },
+
+ /**
+ * No-results event handler
+ *
+ * @param {Event} event
+ * @param {Object} data Information about the failed search query
+ */
+ noResults: function ( event, data ) {
+ var $noResults;
+
+ this.$element.addClass( 'uls-no-results' );
+
+ this.$element.find( '.uls-no-results-view' ).remove();
+
+ if ( typeof this.options.noResultsTemplate === 'function' ) {
+ $noResults =
+ this.options.noResultsTemplate.call( this, data.query );
+ } else if ( this.options.noResultsTemplate instanceof jQuery ) {
+ $noResults = this.options.noResultsTemplate;
+ } else {
+ throw new Error( 'noResultsTemplate option must be ' +
+ 'either jQuery or function returning jQuery' );
+ }
+
+ this.$element.append( $noResults.addClass( 'uls-no-results-view' ).i18n() );
+ },
+
+ listen: function () {
+ var lcd = this;
+
+ if ( this.options.clickhandler ) {
+ this.$element.on( 'click', '.row li', function ( event ) {
+ lcd.options.clickhandler.call( this, $( this ).data( 'code' ), event );
+ } );
+ }
+ }
+ };
+
+ $.fn.lcd = function ( option ) {
+ return this.each( function () {
+ var $this = $( this ),
+ data = $this.data( 'lcd' ),
+ options = typeof option === 'object' && option;
+
+ if ( !data ) {
+ $this.data( 'lcd', ( data = new LanguageCategoryDisplay( this, options ) ) );
+ }
+
+ if ( typeof option === 'string' ) {
+ data[ option ]();
+ }
+ } );
+ };
+
+ $.fn.lcd.defaults = {
+ // List of languages to show
+ languages: [],
+ // List of regions to show
+ showRegions: [ 'WW', 'AM', 'EU', 'ME', 'AF', 'AS', 'PA' ],
+ // Whether to group by region, defaults to true when columns > 1
+ groupByRegion: 'auto',
+ // How many items per column until new "row" starts
+ itemsPerColumn: 8,
+ // Number of columns, only 1, 2 and 4 are supported
+ columns: 4,
+ // Callback function for language item styling
+ languageDecorator: undefined,
+ // Likely candidates
+ quickList: [],
+ // Callback function for language selection
+ clickhandler: undefined,
+ // Callback function when no search results.
+ // If overloaded, it can accept the search string as an argument.
+ noResultsTemplate: function () {
+ var $suggestionsContainer, $suggestions,
+ $noResultsTemplate = $( noResultsTemplate );
+
+ $suggestions = this.buildQuicklist().clone();
+ $suggestions.removeClass( 'hide' )
+ .find( 'h3' )
+ .data( 'i18n', 'uls-no-results-suggestion-title' )
+ .text( 'You may be interested in:' )
+ .i18n();
+ $suggestionsContainer = $noResultsTemplate.find( '.uls-no-results-suggestions' );
+ $suggestionsContainer.append( $suggestions );
+ return $noResultsTemplate;
+ }
+ };
+
+}( jQuery ) );
diff --git a/UniversalLanguageSelector/lib/jquery.webfonts/GPL-LICENSE b/UniversalLanguageSelector/lib/jquery.webfonts/GPL-LICENSE
new file mode 100644
index 00000000..019694a9
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.webfonts/GPL-LICENSE
@@ -0,0 +1,342 @@
+== GNU GENERAL PUBLIC LICENSE ==
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+=== Preamble ===
+
+The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+
+'''0.''' This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+'''1.''' You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+'''2.''' You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ '''a)''' You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ '''b)''' You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ '''c)''' If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+'''3.''' You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ '''a)''' Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ '''b)''' Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ '''c)''' Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+'''4.''' You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+'''5.''' You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+'''6.''' Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+'''7.''' If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+'''8.''' If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+'''9.''' The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+'''10.''' If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+=== NO WARRANTY ===
+
+'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ '''END OF TERMS AND CONDITIONS'''
+
+== How to Apply These Terms to Your New Programs ==
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/UniversalLanguageSelector/lib/jquery.webfonts/MIT-LICENSE b/UniversalLanguageSelector/lib/jquery.webfonts/MIT-LICENSE
new file mode 100644
index 00000000..8a9a70a7
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.webfonts/MIT-LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
+Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
+contributors. See CREDITS for a list.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/UniversalLanguageSelector/lib/jquery.webfonts/src/jquery.webfonts.js b/UniversalLanguageSelector/lib/jquery.webfonts/src/jquery.webfonts.js
new file mode 100644
index 00000000..6e5d7d90
--- /dev/null
+++ b/UniversalLanguageSelector/lib/jquery.webfonts/src/jquery.webfonts.js
@@ -0,0 +1,518 @@
+/**
+ * jQuery Webfonts.
+ *
+ * Copyright (C) 2012 Santhosh Thottingal
+ *
+ * UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
+ * have to do anything special to choose one license or the other and you don't
+ * have to notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @file
+ * @ingroup Extensions
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function( $, window, document, undefined ) {
+ 'use strict';
+
+ var WebFonts = function( element, options ) {
+ // Load defaults
+ this.options = $.extend( {}, $.fn.webfonts.defaults, options );
+ this.$element = $( element );
+ this.repository = $.extend( WebFonts.repository, this.options.repository );
+ // List of loaded fonts
+ this.fonts = [];
+ this.originalFontFamily = this.$element.css( 'font-family' );
+ this.language = this.$element.attr( 'lang' ) || $( 'html' ).attr( 'lang' );
+
+ this.init();
+ };
+
+ WebFonts.repository = {
+ base: 'fonts', // Relative or absolute path to the font repository.
+ languages: {}, // languages to font mappings
+ fonts: {}, // Font name to font configuration mapping
+
+ // Utility methods to work on the repository.
+ defaultFont: function( language ) {
+ var defaultFont = null;
+
+ if ( this.languages[language] ) {
+ defaultFont = this.languages[language][0];
+ }
+
+ return defaultFont;
+ },
+
+ get: function( fontFamily ) {
+ return this.fonts[fontFamily];
+ }
+ };
+
+ WebFonts.prototype = {
+ constructor: WebFonts,
+
+ /**
+ * Get the default font family for given language.
+ * @param {String|undefined} language Language code.
+ * @param {array} classes
+ * @return {String} Font family name
+ */
+ getFont: function( language, classes ) {
+ language = ( language || this.language || '' ).toLowerCase();
+
+ if ( this.options.fontSelector && language ) {
+ return this.options.fontSelector( this.repository, language, classes );
+ } else {
+ return this.repository.defaultFont( language );
+ }
+ },
+
+ /**
+ * Initialize.
+ */
+ init: function() {
+ if ( this.language ) {
+ this.apply( this.getFont( this.language ) );
+ }
+
+ this.parse();
+ },
+
+ /**
+ * TODO: document
+ */
+ refresh: function() {
+ this.reset();
+ this.init();
+ },
+
+ /**
+ * Apply a font for given elements.
+ *
+ * @param {String} fontFamily Font family name
+ * @param {jQuery} $element One or more jQuery elements
+ */
+ apply: function( fontFamily, $element ) {
+ var fontStack = this.options.fontStack.slice( 0 );
+
+ $element = $element || this.$element;
+
+ // Loading an empty string is pointless.
+ // Putting an empty string into a font-family list doesn't work with
+ // jQuery.css().
+ if ( fontFamily ) {
+ this.load( fontFamily );
+ // Avoid duplicates
+ if ( $.inArray( fontFamily, fontStack ) < 0 ) {
+ fontStack.unshift( fontFamily );
+ }
+ }
+
+ if ( !fontFamily ) {
+ // We are resetting the font to original font.
+ fontStack = [];
+ // This will cause removing inline fontFamily style.
+ }
+
+ // Set the font of this element if it's not excluded.
+ // Add class webfonts-changed when webfonts are applied.
+ $element.not( this.options.exclude )
+ .css( 'font-family', fontStack.join() )
+ .addClass( 'webfonts-changed' );
+
+ // Set the font of this element's children if they are not excluded.
+ // font-family of <input>, <textarea> and <button> must be changed explicitly.
+ // Add class webfonts-changed when webfonts are applied.
+ $element.find( 'textarea, input, button' ).not( this.options.exclude )
+ .css( 'font-family', fontStack.join() )
+ .addClass( 'webfonts-changed' );
+ },
+
+ /**
+ * Load given font families if not loaded already. Creates the CSS rules
+ * and appends them to document.
+ *
+ * @param {Array|String} fontFamilies List of font families
+ */
+ load: function( fontFamilies ) {
+ var css, fontFamily, i,
+ fontFaceRule = '';
+
+ // Convert to array if string given (old signature)
+ if ( typeof fontFamilies === 'string' ) {
+ fontFamilies = [fontFamilies];
+ }
+
+ for ( i = 0; i < fontFamilies.length; i++ ) {
+ fontFamily = fontFamilies[i];
+ if ( $.inArray( fontFamily, this.fonts ) >= 0 ) {
+ continue;
+ }
+
+ css = this.getCSS( fontFamily, 'normal' );
+ if ( css !== false ) {
+ fontFaceRule += css;
+ this.fonts.push( fontFamily );
+ }
+ }
+
+ // In case the list contained only fonts that are already loaded
+ // or non-existing fonts.
+ if ( fontFaceRule !== '' ) {
+ injectCSS( fontFaceRule );
+ }
+
+ return true;
+ },
+
+ /**
+ * Parse the element for custom font-family styles and for nodes with
+ * different language than what the element itself has.
+ */
+ parse: function() {
+ var webfonts = this,
+ // Fonts can be added indirectly via classes, but also with
+ // style attributes. For lang attributes we will use our font
+ // if they don't have explicit font already.
+ $elements = webfonts.$element.find( '*[lang], [style], [class]' ),
+ // List of fonts to load in a batch
+ fontQueue = [],
+ // List of elements to apply a certain font family in a batch.
+ // Object keys are the font family, values are list of plain elements.
+ elementQueue = {};
+
+ // Add to the font queue(no dupes)
+ function addToFontQueue( value ) {
+ if ( $.inArray( value, fontQueue ) < 0 ) {
+ fontQueue.push( value );
+ }
+ }
+
+ // Add to the font queue
+ function addToElementQueue( element, fontFamily ) {
+ elementQueue[fontFamily] = elementQueue[fontFamily] || [];
+ elementQueue[fontFamily].push( element );
+ }
+
+ $elements.each( function( i, element ) {
+ var fontFamilyStyle, fontFamily,
+ $element = $( element ),
+ elementLanguage = element.getAttribute( 'lang' );
+
+ if ( $element.is( webfonts.options.exclude ) ) {
+ return;
+ }
+
+ // Note: it depends on the browser whether this returns font names
+ // which don't exist. In Chrome it does, while in Opera it doesn't.
+ fontFamilyStyle = $element.css( 'fontFamily' );
+ // Note: It is unclear whether this can ever be falsy. Maybe also
+ // browser specific.
+ if ( fontFamilyStyle ) {
+ // if it is overridable, override. always.
+ if ( webfonts.isOverridable( fontFamilyStyle ) ) {
+ fontFamily = webfonts.getFont( elementLanguage || webfonts.language );
+ // We do not have fonts for all languages
+ if ( fontFamily ) {
+ addToFontQueue( fontFamily );
+ addToElementQueue( element, fontFamily );
+ }
+ return;
+ } else {
+ fontFamily = fontFamilyStyle.split( ',' )[0];
+ // Remove the ' and " characters if any.
+ fontFamily = fontFamily.replace( /["']/g, '' ).trim();
+ addToFontQueue( fontFamily );
+ }
+ }
+
+ // Load and apply fonts for other language tagged elements (batched)
+ if ( elementLanguage && elementLanguage !== webfonts.language ) {
+ // language differs. We may want to apply a different font.
+ if ( webfonts.hasExplicitFontStyle ( $element ) &&
+ !webfonts.isOverridable( fontFamilyStyle ) ) {
+ // respect the explicit font family style. Do not override.
+ // This style may be from css, inheritance, or even from
+ // browser settings.
+ return;
+ } else {
+ fontFamily = webfonts.getFont( elementLanguage, element.className.split(/\s+/) );
+ }
+
+ if ( !fontFamily ) {
+ // No font preference for the language.
+ // Check if we need to reset for this language.
+ // If the font of the parent element, to which webfonts were applied,
+ // remained the same, there is no need to reset.
+ if ( webfonts.$element.css( 'fontFamily' ) !== webfonts.originalFontFamily ) {
+ // The parent font changed.
+ // Is there an inheritance?
+ // Is the font for this element the same as parent's font?
+ if ( fontFamilyStyle === webfonts.$element.css( 'fontFamily' ) ) {
+ // Break inheritance of the font from the parent element
+ // by applying the original font to this element
+ fontFamily = webfonts.originalFontFamily;
+ }
+ }
+ }
+
+ // We do not have fonts for all languages
+ if ( fontFamily ) {
+ addToFontQueue( fontFamily );
+ addToElementQueue( element, fontFamily );
+ }
+ }
+ } );
+
+ // Process in batch the accumulated fonts and elements
+ this.load( fontQueue );
+ $.each( elementQueue, function( fontFamily, elements ) {
+ webfonts.apply( fontFamily, $( elements ) );
+ } );
+ },
+
+ /**
+ * Find out whether an element has explicit non generic font family style
+ * For the practical purpose we check whether font is same as top element
+ * or having any of generic font family
+ * http://www.w3.org/TR/CSS2/fonts.html#generic-font-families
+ * @param {jQuery} $element
+ * @return {boolean}
+ */
+ hasExplicitFontStyle: function ( $element ) {
+ var elementFontFamily = $element.css( 'fontFamily' );
+
+ // whether the font is inherited from top element to which plugin applied
+ return this.$element.css( 'fontFamily' ) !== elementFontFamily
+ // whether the element has generic font family
+ && ( $.inArray( elementFontFamily,
+ [ 'monospace', 'serif', 'cursive', 'fantasy', 'sans-serif' ] ) < 0 );
+ },
+
+ /**
+ * Check whether the given font family is overridable or not. jquery.webfonts
+ * by default does not override any font-family styles other than generic
+ * font family styles (see hasExplicitFontStyle method).
+ * @param {string} fontFamily
+ * @return {boolean} Whether the given fontFamily is overridable or not.
+ */
+ isOverridable: function( fontFamily ) {
+ var overridableFontFamilies = [ 'monospace', 'serif', 'cursive', 'fantasy', 'sans-serif' ];
+ $.merge( overridableFontFamilies, this.options.overridableFontFamilies );
+ // Browsers like FF put space after comma in font stack. Chrome does not.
+ // Normalise it by removing the spaces and quotes
+ overridableFontFamilies = $.map( overridableFontFamilies, function( item ) {
+ return item.replace( /[\s'"]/g, '' );
+ } );
+ fontFamily = fontFamily.replace( /[\s'"]/g, '' );
+
+ return $.inArray( fontFamily, overridableFontFamilies ) >= 0;
+ },
+
+ /**
+ * List all fonts for the given language
+ *
+ * @param {String} [language] Language code. If undefined all fonts will be listed.
+ * @return {Array} List of font family names.
+ */
+ list: function( language ) {
+ var fontName,
+ fontNames = [];
+
+ if ( language ) {
+ fontNames = this.repository.languages[language] || [];
+ } else {
+ for ( fontName in this.repository.fonts ) {
+ if ( this.repository.fonts.hasOwnProperty( fontName ) ) {
+ fontNames.push( fontName );
+ }
+ }
+ }
+
+ return fontNames;
+ },
+
+ /**
+ * List all languages supported by the repository
+ *
+ * @return {Array} List of language codes
+ */
+ languages: function() {
+ var language,
+ languages = [];
+
+ for ( language in this.repository.languages ) {
+ if ( this.repository.languages.hasOwnProperty( language ) ) {
+ languages.push( language );
+ }
+ }
+
+ return languages;
+ },
+
+ /**
+ * Set the font repository
+ *
+ * @param {Object} repository The font repository.
+ */
+ setRepository: function( repository ) {
+ this.repository = $.extend( WebFonts.repository, repository );
+ },
+
+ /**
+ * Reset the font-family style.
+ */
+ reset: function() {
+ this.$element.find( '.webfonts-changed' )
+ .removeClass( '.webfonts-changed' )
+ .css( 'font-family', '' );
+ this.apply( this.originalFontFamily );
+ },
+
+ /**
+ * Unbind the plugin
+ */
+ unbind: function() {
+ this.$element.data( 'webfonts', null );
+ },
+
+ /**
+ * Construct the CSS required for the font-family.
+ *
+ * @param {String} fontFamily The font-family name
+ * @param {String} [variant] The font variant, eg: bold, italic etc. Default is normal.
+ * @return {String} CSS
+ */
+ getCSS: function( fontFamily, variant ) {
+ var webfonts, base,
+ fontFaceRule, userAgent, fontStyle, fontFormats, fullFontName,
+ fontconfig = this.repository.get( fontFamily );
+
+ variant = variant || 'normal';
+ fullFontName = fontFamily;
+
+ if ( variant !== 'normal' ) {
+ if ( fontconfig.variants !== undefined && fontconfig.variants[variant] ) {
+ fullFontName = fontconfig.variants[variant];
+ fontconfig = this.repository.get( fontconfig.variants[variant] );
+ }
+ }
+
+ if ( !fontconfig ) {
+ return false;
+ }
+
+ base = this.repository.base;
+ fontFaceRule = '@font-face { font-family: \'' + fontFamily + '\';\n';
+ userAgent = window.navigator.userAgent;
+ fontStyle = fontconfig.fontstyle || 'normal';
+ fontFormats = [];
+
+ if ( fontconfig.eot ) {
+ fontFaceRule += '\tsrc: url(\'' + base + fontconfig.eot + '\');\n';
+ }
+ fontFaceRule += '\tsrc: ';
+
+ // If the font is present locally, use it.
+ if ( userAgent.match( /Android 2\.3/ ) === null ) {
+ // Android 2.3.x does not respect local() syntax.
+ // http://code.google.com/p/android/issues/detail?id=10609
+ fontFaceRule += 'local(\'' + fullFontName + '\'),';
+ }
+
+ if ( fontconfig.woff2 ) {
+ fontFormats.push( '\t\turl(\'' + base + fontconfig.woff2
+ + '\') format(\'woff2\')' );
+ }
+
+ if ( fontconfig.woff ) {
+ fontFormats.push( '\t\turl(\'' + base + fontconfig.woff
+ + '\') format(\'woff\')' );
+ }
+
+ if ( fontconfig.svg ) {
+ fontFormats.push( '\t\turl(\'' + base + fontconfig.svg + '#'
+ + fontFamily + '\') format(\'svg\')' );
+ }
+
+ if ( fontconfig.ttf ) {
+ fontFormats.push( '\t\turl(\'' + base + fontconfig.ttf
+ + '\') format(\'truetype\')' );
+ }
+
+ fontFaceRule += fontFormats.join() + ';\n';
+
+ if ( fontconfig.fontweight ) {
+ fontFaceRule += '\tfont-weight:' + fontconfig.fontweight + ';';
+ }
+
+ if ( fontconfig.fontstyle !== undefined ) {
+ fontFaceRule += '\tfont-style:' + fontconfig.fontstyle + ';';
+ } else {
+ fontFaceRule += '\tfont-style: normal;';
+ }
+
+ fontFaceRule += '}\n';
+
+ webfonts = this;
+ if ( fontconfig.variants !== undefined ) {
+ $.each( fontconfig.variants, function ( variant ) {
+ fontFaceRule += webfonts.getCSS( fontFamily, variant );
+ } );
+ }
+
+ return fontFaceRule;
+ }
+ };
+
+ $.fn.webfonts = function( option ) {
+ return this.each( function() {
+ var $this = $( this ),
+ data = $this.data( 'webfonts' ),
+ options = typeof option === 'object' && option;
+
+ if ( !data ) {
+ $this.data( 'webfonts', ( data = new WebFonts( this, options ) ) );
+ }
+
+ if ( typeof option === 'string' ) {
+ data[option]();
+ }
+ } );
+ };
+
+ $.fn.webfonts.defaults = {
+ repository: WebFonts.repository, // Default font repository
+ fontStack: [ 'Helvetica', 'Arial', 'sans-serif' ], // Default font fallback
+ exclude: '', // jQuery selectors to exclude
+ overridableFontFamilies: []
+ };
+
+ $.fn.webfonts.Constructor = WebFonts;
+
+ // Private methods for the WebFonts prototype
+
+ /**
+ * Create a new style tag and add it to the DOM.
+ *
+ * @param {String} css
+ */
+ function injectCSS( css ) {
+ var s = document.createElement( 'style' );
+
+ // Insert into document before setting cssText
+ document.getElementsByTagName( 'head' )[0].appendChild( s );
+
+ if ( s.styleSheet ) {
+ s.styleSheet.cssText = css;
+ // IE
+ } else {
+ // Safari sometimes borks on null
+ s.appendChild( document.createTextNode( String( css ) ) );
+ }
+ }
+} )( jQuery, window, document );
diff --git a/UniversalLanguageSelector/lib/rangy/rangy-core.js b/UniversalLanguageSelector/lib/rangy/rangy-core.js
new file mode 100644
index 00000000..69e95bfa
--- /dev/null
+++ b/UniversalLanguageSelector/lib/rangy/rangy-core.js
@@ -0,0 +1,3845 @@
+/**
+ * Rangy, a cross-browser JavaScript range and selection library
+ * https://github.com/timdown/rangy
+ *
+ * Copyright 2015, Tim Down
+ * Licensed under the MIT license.
+ * Version: 1.3.0
+ * Build date: 10 May 2015
+ */
+
+(function(factory, root) {
+ if (typeof define == "function" && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(factory);
+ } else if (typeof module != "undefined" && typeof exports == "object") {
+ // Node/CommonJS style
+ module.exports = factory();
+ } else {
+ // No AMD or CommonJS support so we place Rangy in (probably) the global variable
+ root.rangy = factory();
+ }
+})(function() {
+
+ var OBJECT = "object", FUNCTION = "function", UNDEFINED = "undefined";
+
+ // Minimal set of properties required for DOM Level 2 Range compliance. Comparison constants such as START_TO_START
+ // are omitted because ranges in KHTML do not have them but otherwise work perfectly well. See issue 113.
+ var domRangeProperties = ["startContainer", "startOffset", "endContainer", "endOffset", "collapsed",
+ "commonAncestorContainer"];
+
+ // Minimal set of methods required for DOM Level 2 Range compliance
+ var domRangeMethods = ["setStart", "setStartBefore", "setStartAfter", "setEnd", "setEndBefore",
+ "setEndAfter", "collapse", "selectNode", "selectNodeContents", "compareBoundaryPoints", "deleteContents",
+ "extractContents", "cloneContents", "insertNode", "surroundContents", "cloneRange", "toString", "detach"];
+
+ var textRangeProperties = ["boundingHeight", "boundingLeft", "boundingTop", "boundingWidth", "htmlText", "text"];
+
+ // Subset of TextRange's full set of methods that we're interested in
+ var textRangeMethods = ["collapse", "compareEndPoints", "duplicate", "moveToElementText", "parentElement", "select",
+ "setEndPoint", "getBoundingClientRect"];
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // Trio of functions taken from Peter Michaux's article:
+ // http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting
+ function isHostMethod(o, p) {
+ var t = typeof o[p];
+ return t == FUNCTION || (!!(t == OBJECT && o[p])) || t == "unknown";
+ }
+
+ function isHostObject(o, p) {
+ return !!(typeof o[p] == OBJECT && o[p]);
+ }
+
+ function isHostProperty(o, p) {
+ return typeof o[p] != UNDEFINED;
+ }
+
+ // Creates a convenience function to save verbose repeated calls to tests functions
+ function createMultiplePropertyTest(testFunc) {
+ return function(o, props) {
+ var i = props.length;
+ while (i--) {
+ if (!testFunc(o, props[i])) {
+ return false;
+ }
+ }
+ return true;
+ };
+ }
+
+ // Next trio of functions are a convenience to save verbose repeated calls to previous two functions
+ var areHostMethods = createMultiplePropertyTest(isHostMethod);
+ var areHostObjects = createMultiplePropertyTest(isHostObject);
+ var areHostProperties = createMultiplePropertyTest(isHostProperty);
+
+ function isTextRange(range) {
+ return range && areHostMethods(range, textRangeMethods) && areHostProperties(range, textRangeProperties);
+ }
+
+ function getBody(doc) {
+ return isHostObject(doc, "body") ? doc.body : doc.getElementsByTagName("body")[0];
+ }
+
+ var forEach = [].forEach ?
+ function(arr, func) {
+ arr.forEach(func);
+ } :
+ function(arr, func) {
+ for (var i = 0, len = arr.length; i < len; ++i) {
+ func(arr[i], i);
+ }
+ };
+
+ var modules = {};
+
+ var isBrowser = (typeof window != UNDEFINED && typeof document != UNDEFINED);
+
+ var util = {
+ isHostMethod: isHostMethod,
+ isHostObject: isHostObject,
+ isHostProperty: isHostProperty,
+ areHostMethods: areHostMethods,
+ areHostObjects: areHostObjects,
+ areHostProperties: areHostProperties,
+ isTextRange: isTextRange,
+ getBody: getBody,
+ forEach: forEach
+ };
+
+ var api = {
+ version: "1.3.0",
+ initialized: false,
+ isBrowser: isBrowser,
+ supported: true,
+ util: util,
+ features: {},
+ modules: modules,
+ config: {
+ alertOnFail: false,
+ alertOnWarn: false,
+ preferTextRange: false,
+ autoInitialize: (typeof rangyAutoInitialize == UNDEFINED) ? true : rangyAutoInitialize
+ }
+ };
+
+ function consoleLog(msg) {
+ if (typeof console != UNDEFINED && isHostMethod(console, "log")) {
+ console.log(msg);
+ }
+ }
+
+ function alertOrLog(msg, shouldAlert) {
+ if (isBrowser && shouldAlert) {
+ alert(msg);
+ } else {
+ consoleLog(msg);
+ }
+ }
+
+ function fail(reason) {
+ api.initialized = true;
+ api.supported = false;
+ alertOrLog("Rangy is not supported in this environment. Reason: " + reason, api.config.alertOnFail);
+ }
+
+ api.fail = fail;
+
+ function warn(msg) {
+ alertOrLog("Rangy warning: " + msg, api.config.alertOnWarn);
+ }
+
+ api.warn = warn;
+
+ // Add utility extend() method
+ var extend;
+ if ({}.hasOwnProperty) {
+ util.extend = extend = function(obj, props, deep) {
+ var o, p;
+ for (var i in props) {
+ if (props.hasOwnProperty(i)) {
+ o = obj[i];
+ p = props[i];
+ if (deep && o !== null && typeof o == "object" && p !== null && typeof p == "object") {
+ extend(o, p, true);
+ }
+ obj[i] = p;
+ }
+ }
+ // Special case for toString, which does not show up in for...in loops in IE <= 8
+ if (props.hasOwnProperty("toString")) {
+ obj.toString = props.toString;
+ }
+ return obj;
+ };
+
+ util.createOptions = function(optionsParam, defaults) {
+ var options = {};
+ extend(options, defaults);
+ if (optionsParam) {
+ extend(options, optionsParam);
+ }
+ return options;
+ };
+ } else {
+ fail("hasOwnProperty not supported");
+ }
+
+ // Test whether we're in a browser and bail out if not
+ if (!isBrowser) {
+ fail("Rangy can only run in a browser");
+ }
+
+ // Test whether Array.prototype.slice can be relied on for NodeLists and use an alternative toArray() if not
+ (function() {
+ var toArray;
+
+ if (isBrowser) {
+ var el = document.createElement("div");
+ el.appendChild(document.createElement("span"));
+ var slice = [].slice;
+ try {
+ if (slice.call(el.childNodes, 0)[0].nodeType == 1) {
+ toArray = function(arrayLike) {
+ return slice.call(arrayLike, 0);
+ };
+ }
+ } catch (e) {}
+ }
+
+ if (!toArray) {
+ toArray = function(arrayLike) {
+ var arr = [];
+ for (var i = 0, len = arrayLike.length; i < len; ++i) {
+ arr[i] = arrayLike[i];
+ }
+ return arr;
+ };
+ }
+
+ util.toArray = toArray;
+ })();
+
+ // Very simple event handler wrapper function that doesn't attempt to solve issues such as "this" handling or
+ // normalization of event properties
+ var addListener;
+ if (isBrowser) {
+ if (isHostMethod(document, "addEventListener")) {
+ addListener = function(obj, eventType, listener) {
+ obj.addEventListener(eventType, listener, false);
+ };
+ } else if (isHostMethod(document, "attachEvent")) {
+ addListener = function(obj, eventType, listener) {
+ obj.attachEvent("on" + eventType, listener);
+ };
+ } else {
+ fail("Document does not have required addEventListener or attachEvent method");
+ }
+
+ util.addListener = addListener;
+ }
+
+ var initListeners = [];
+
+ function getErrorDesc(ex) {
+ return ex.message || ex.description || String(ex);
+ }
+
+ // Initialization
+ function init() {
+ if (!isBrowser || api.initialized) {
+ return;
+ }
+ var testRange;
+ var implementsDomRange = false, implementsTextRange = false;
+
+ // First, perform basic feature tests
+
+ if (isHostMethod(document, "createRange")) {
+ testRange = document.createRange();
+ if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {
+ implementsDomRange = true;
+ }
+ }
+
+ var body = getBody(document);
+ if (!body || body.nodeName.toLowerCase() != "body") {
+ fail("No body element found");
+ return;
+ }
+
+ if (body && isHostMethod(body, "createTextRange")) {
+ testRange = body.createTextRange();
+ if (isTextRange(testRange)) {
+ implementsTextRange = true;
+ }
+ }
+
+ if (!implementsDomRange && !implementsTextRange) {
+ fail("Neither Range nor TextRange are available");
+ return;
+ }
+
+ api.initialized = true;
+ api.features = {
+ implementsDomRange: implementsDomRange,
+ implementsTextRange: implementsTextRange
+ };
+
+ // Initialize modules
+ var module, errorMessage;
+ for (var moduleName in modules) {
+ if ( (module = modules[moduleName]) instanceof Module ) {
+ module.init(module, api);
+ }
+ }
+
+ // Call init listeners
+ for (var i = 0, len = initListeners.length; i < len; ++i) {
+ try {
+ initListeners[i](api);
+ } catch (ex) {
+ errorMessage = "Rangy init listener threw an exception. Continuing. Detail: " + getErrorDesc(ex);
+ consoleLog(errorMessage);
+ }
+ }
+ }
+
+ function deprecationNotice(deprecated, replacement, module) {
+ if (module) {
+ deprecated += " in module " + module.name;
+ }
+ api.warn("DEPRECATED: " + deprecated + " is deprecated. Please use " +
+ replacement + " instead.");
+ }
+
+ function createAliasForDeprecatedMethod(owner, deprecated, replacement, module) {
+ owner[deprecated] = function() {
+ deprecationNotice(deprecated, replacement, module);
+ return owner[replacement].apply(owner, util.toArray(arguments));
+ };
+ }
+
+ util.deprecationNotice = deprecationNotice;
+ util.createAliasForDeprecatedMethod = createAliasForDeprecatedMethod;
+
+ // Allow external scripts to initialize this library in case it's loaded after the document has loaded
+ api.init = init;
+
+ // Execute listener immediately if already initialized
+ api.addInitListener = function(listener) {
+ if (api.initialized) {
+ listener(api);
+ } else {
+ initListeners.push(listener);
+ }
+ };
+
+ var shimListeners = [];
+
+ api.addShimListener = function(listener) {
+ shimListeners.push(listener);
+ };
+
+ function shim(win) {
+ win = win || window;
+ init();
+
+ // Notify listeners
+ for (var i = 0, len = shimListeners.length; i < len; ++i) {
+ shimListeners[i](win);
+ }
+ }
+
+ if (isBrowser) {
+ api.shim = api.createMissingNativeApi = shim;
+ createAliasForDeprecatedMethod(api, "createMissingNativeApi", "shim");
+ }
+
+ function Module(name, dependencies, initializer) {
+ this.name = name;
+ this.dependencies = dependencies;
+ this.initialized = false;
+ this.supported = false;
+ this.initializer = initializer;
+ }
+
+ Module.prototype = {
+ init: function() {
+ var requiredModuleNames = this.dependencies || [];
+ for (var i = 0, len = requiredModuleNames.length, requiredModule, moduleName; i < len; ++i) {
+ moduleName = requiredModuleNames[i];
+
+ requiredModule = modules[moduleName];
+ if (!requiredModule || !(requiredModule instanceof Module)) {
+ throw new Error("required module '" + moduleName + "' not found");
+ }
+
+ requiredModule.init();
+
+ if (!requiredModule.supported) {
+ throw new Error("required module '" + moduleName + "' not supported");
+ }
+ }
+
+ // Now run initializer
+ this.initializer(this);
+ },
+
+ fail: function(reason) {
+ this.initialized = true;
+ this.supported = false;
+ throw new Error(reason);
+ },
+
+ warn: function(msg) {
+ api.warn("Module " + this.name + ": " + msg);
+ },
+
+ deprecationNotice: function(deprecated, replacement) {
+ api.warn("DEPRECATED: " + deprecated + " in module " + this.name + " is deprecated. Please use " +
+ replacement + " instead");
+ },
+
+ createError: function(msg) {
+ return new Error("Error in Rangy " + this.name + " module: " + msg);
+ }
+ };
+
+ function createModule(name, dependencies, initFunc) {
+ var newModule = new Module(name, dependencies, function(module) {
+ if (!module.initialized) {
+ module.initialized = true;
+ try {
+ initFunc(api, module);
+ module.supported = true;
+ } catch (ex) {
+ var errorMessage = "Module '" + name + "' failed to load: " + getErrorDesc(ex);
+ consoleLog(errorMessage);
+ if (ex.stack) {
+ consoleLog(ex.stack);
+ }
+ }
+ }
+ });
+ modules[name] = newModule;
+ return newModule;
+ }
+
+ api.createModule = function(name) {
+ // Allow 2 or 3 arguments (second argument is an optional array of dependencies)
+ var initFunc, dependencies;
+ if (arguments.length == 2) {
+ initFunc = arguments[1];
+ dependencies = [];
+ } else {
+ initFunc = arguments[2];
+ dependencies = arguments[1];
+ }
+
+ var module = createModule(name, dependencies, initFunc);
+
+ // Initialize the module immediately if the core is already initialized
+ if (api.initialized && api.supported) {
+ module.init();
+ }
+ };
+
+ api.createCoreModule = function(name, dependencies, initFunc) {
+ createModule(name, dependencies, initFunc);
+ };
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // Ensure rangy.rangePrototype and rangy.selectionPrototype are available immediately
+
+ function RangePrototype() {}
+ api.RangePrototype = RangePrototype;
+ api.rangePrototype = new RangePrototype();
+
+ function SelectionPrototype() {}
+ api.selectionPrototype = new SelectionPrototype();
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // DOM utility methods used by Rangy
+ api.createCoreModule("DomUtil", [], function(api, module) {
+ var UNDEF = "undefined";
+ var util = api.util;
+ var getBody = util.getBody;
+
+ // Perform feature tests
+ if (!util.areHostMethods(document, ["createDocumentFragment", "createElement", "createTextNode"])) {
+ module.fail("document missing a Node creation method");
+ }
+
+ if (!util.isHostMethod(document, "getElementsByTagName")) {
+ module.fail("document missing getElementsByTagName method");
+ }
+
+ var el = document.createElement("div");
+ if (!util.areHostMethods(el, ["insertBefore", "appendChild", "cloneNode"] ||
+ !util.areHostObjects(el, ["previousSibling", "nextSibling", "childNodes", "parentNode"]))) {
+ module.fail("Incomplete Element implementation");
+ }
+
+ // innerHTML is required for Range's createContextualFragment method
+ if (!util.isHostProperty(el, "innerHTML")) {
+ module.fail("Element is missing innerHTML property");
+ }
+
+ var textNode = document.createTextNode("test");
+ if (!util.areHostMethods(textNode, ["splitText", "deleteData", "insertData", "appendData", "cloneNode"] ||
+ !util.areHostObjects(el, ["previousSibling", "nextSibling", "childNodes", "parentNode"]) ||
+ !util.areHostProperties(textNode, ["data"]))) {
+ module.fail("Incomplete Text Node implementation");
+ }
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // Removed use of indexOf because of a bizarre bug in Opera that is thrown in one of the Acid3 tests. I haven't been
+ // able to replicate it outside of the test. The bug is that indexOf returns -1 when called on an Array that
+ // contains just the document as a single element and the value searched for is the document.
+ var arrayContains = /*Array.prototype.indexOf ?
+ function(arr, val) {
+ return arr.indexOf(val) > -1;
+ }:*/
+
+ function(arr, val) {
+ var i = arr.length;
+ while (i--) {
+ if (arr[i] === val) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ // Opera 11 puts HTML elements in the null namespace, it seems, and IE 7 has undefined namespaceURI
+ function isHtmlNamespace(node) {
+ var ns;
+ return typeof node.namespaceURI == UNDEF || ((ns = node.namespaceURI) === null || ns == "http://www.w3.org/1999/xhtml");
+ }
+
+ function parentElement(node) {
+ var parent = node.parentNode;
+ return (parent.nodeType == 1) ? parent : null;
+ }
+
+ function getNodeIndex(node) {
+ var i = 0;
+ while( (node = node.previousSibling) ) {
+ ++i;
+ }
+ return i;
+ }
+
+ function getNodeLength(node) {
+ switch (node.nodeType) {
+ case 7:
+ case 10:
+ return 0;
+ case 3:
+ case 8:
+ return node.length;
+ default:
+ return node.childNodes.length;
+ }
+ }
+
+ function getCommonAncestor(node1, node2) {
+ var ancestors = [], n;
+ for (n = node1; n; n = n.parentNode) {
+ ancestors.push(n);
+ }
+
+ for (n = node2; n; n = n.parentNode) {
+ if (arrayContains(ancestors, n)) {
+ return n;
+ }
+ }
+
+ return null;
+ }
+
+ function isAncestorOf(ancestor, descendant, selfIsAncestor) {
+ var n = selfIsAncestor ? descendant : descendant.parentNode;
+ while (n) {
+ if (n === ancestor) {
+ return true;
+ } else {
+ n = n.parentNode;
+ }
+ }
+ return false;
+ }
+
+ function isOrIsAncestorOf(ancestor, descendant) {
+ return isAncestorOf(ancestor, descendant, true);
+ }
+
+ function getClosestAncestorIn(node, ancestor, selfIsAncestor) {
+ var p, n = selfIsAncestor ? node : node.parentNode;
+ while (n) {
+ p = n.parentNode;
+ if (p === ancestor) {
+ return n;
+ }
+ n = p;
+ }
+ return null;
+ }
+
+ function isCharacterDataNode(node) {
+ var t = node.nodeType;
+ return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment
+ }
+
+ function isTextOrCommentNode(node) {
+ if (!node) {
+ return false;
+ }
+ var t = node.nodeType;
+ return t == 3 || t == 8 ; // Text or Comment
+ }
+
+ function insertAfter(node, precedingNode) {
+ var nextNode = precedingNode.nextSibling, parent = precedingNode.parentNode;
+ if (nextNode) {
+ parent.insertBefore(node, nextNode);
+ } else {
+ parent.appendChild(node);
+ }
+ return node;
+ }
+
+ // Note that we cannot use splitText() because it is bugridden in IE 9.
+ function splitDataNode(node, index, positionsToPreserve) {
+ var newNode = node.cloneNode(false);
+ newNode.deleteData(0, index);
+ node.deleteData(index, node.length - index);
+ insertAfter(newNode, node);
+
+ // Preserve positions
+ if (positionsToPreserve) {
+ for (var i = 0, position; position = positionsToPreserve[i++]; ) {
+ // Handle case where position was inside the portion of node after the split point
+ if (position.node == node && position.offset > index) {
+ position.node = newNode;
+ position.offset -= index;
+ }
+ // Handle the case where the position is a node offset within node's parent
+ else if (position.node == node.parentNode && position.offset > getNodeIndex(node)) {
+ ++position.offset;
+ }
+ }
+ }
+ return newNode;
+ }
+
+ function getDocument(node) {
+ if (node.nodeType == 9) {
+ return node;
+ } else if (typeof node.ownerDocument != UNDEF) {
+ return node.ownerDocument;
+ } else if (typeof node.document != UNDEF) {
+ return node.document;
+ } else if (node.parentNode) {
+ return getDocument(node.parentNode);
+ } else {
+ throw module.createError("getDocument: no document found for node");
+ }
+ }
+
+ function getWindow(node) {
+ var doc = getDocument(node);
+ if (typeof doc.defaultView != UNDEF) {
+ return doc.defaultView;
+ } else if (typeof doc.parentWindow != UNDEF) {
+ return doc.parentWindow;
+ } else {
+ throw module.createError("Cannot get a window object for node");
+ }
+ }
+
+ function getIframeDocument(iframeEl) {
+ if (typeof iframeEl.contentDocument != UNDEF) {
+ return iframeEl.contentDocument;
+ } else if (typeof iframeEl.contentWindow != UNDEF) {
+ return iframeEl.contentWindow.document;
+ } else {
+ throw module.createError("getIframeDocument: No Document object found for iframe element");
+ }
+ }
+
+ function getIframeWindow(iframeEl) {
+ if (typeof iframeEl.contentWindow != UNDEF) {
+ return iframeEl.contentWindow;
+ } else if (typeof iframeEl.contentDocument != UNDEF) {
+ return iframeEl.contentDocument.defaultView;
+ } else {
+ throw module.createError("getIframeWindow: No Window object found for iframe element");
+ }
+ }
+
+ // This looks bad. Is it worth it?
+ function isWindow(obj) {
+ return obj && util.isHostMethod(obj, "setTimeout") && util.isHostObject(obj, "document");
+ }
+
+ function getContentDocument(obj, module, methodName) {
+ var doc;
+
+ if (!obj) {
+ doc = document;
+ }
+
+ // Test if a DOM node has been passed and obtain a document object for it if so
+ else if (util.isHostProperty(obj, "nodeType")) {
+ doc = (obj.nodeType == 1 && obj.tagName.toLowerCase() == "iframe") ?
+ getIframeDocument(obj) : getDocument(obj);
+ }
+
+ // Test if the doc parameter appears to be a Window object
+ else if (isWindow(obj)) {
+ doc = obj.document;
+ }
+
+ if (!doc) {
+ throw module.createError(methodName + "(): Parameter must be a Window object or DOM node");
+ }
+
+ return doc;
+ }
+
+ function getRootContainer(node) {
+ var parent;
+ while ( (parent = node.parentNode) ) {
+ node = parent;
+ }
+ return node;
+ }
+
+ function comparePoints(nodeA, offsetA, nodeB, offsetB) {
+ // See http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing
+ var nodeC, root, childA, childB, n;
+ if (nodeA == nodeB) {
+ // Case 1: nodes are the same
+ return offsetA === offsetB ? 0 : (offsetA < offsetB) ? -1 : 1;
+ } else if ( (nodeC = getClosestAncestorIn(nodeB, nodeA, true)) ) {
+ // Case 2: node C (container B or an ancestor) is a child node of A
+ return offsetA <= getNodeIndex(nodeC) ? -1 : 1;
+ } else if ( (nodeC = getClosestAncestorIn(nodeA, nodeB, true)) ) {
+ // Case 3: node C (container A or an ancestor) is a child node of B
+ return getNodeIndex(nodeC) < offsetB ? -1 : 1;
+ } else {
+ root = getCommonAncestor(nodeA, nodeB);
+ if (!root) {
+ throw new Error("comparePoints error: nodes have no common ancestor");
+ }
+
+ // Case 4: containers are siblings or descendants of siblings
+ childA = (nodeA === root) ? root : getClosestAncestorIn(nodeA, root, true);
+ childB = (nodeB === root) ? root : getClosestAncestorIn(nodeB, root, true);
+
+ if (childA === childB) {
+ // This shouldn't be possible
+ throw module.createError("comparePoints got to case 4 and childA and childB are the same!");
+ } else {
+ n = root.firstChild;
+ while (n) {
+ if (n === childA) {
+ return -1;
+ } else if (n === childB) {
+ return 1;
+ }
+ n = n.nextSibling;
+ }
+ }
+ }
+ }
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // Test for IE's crash (IE 6/7) or exception (IE >= 8) when a reference to garbage-collected text node is queried
+ var crashyTextNodes = false;
+
+ function isBrokenNode(node) {
+ var n;
+ try {
+ n = node.parentNode;
+ return false;
+ } catch (e) {
+ return true;
+ }
+ }
+
+ (function() {
+ var el = document.createElement("b");
+ el.innerHTML = "1";
+ var textNode = el.firstChild;
+ el.innerHTML = "<br />";
+ crashyTextNodes = isBrokenNode(textNode);
+
+ api.features.crashyTextNodes = crashyTextNodes;
+ })();
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ function inspectNode(node) {
+ if (!node) {
+ return "[No node]";
+ }
+ if (crashyTextNodes && isBrokenNode(node)) {
+ return "[Broken node]";
+ }
+ if (isCharacterDataNode(node)) {
+ return '"' + node.data + '"';
+ }
+ if (node.nodeType == 1) {
+ var idAttr = node.id ? ' id="' + node.id + '"' : "";
+ return "<" + node.nodeName + idAttr + ">[index:" + getNodeIndex(node) + ",length:" + node.childNodes.length + "][" + (node.innerHTML || "[innerHTML not supported]").slice(0, 25) + "]";
+ }
+ return node.nodeName;
+ }
+
+ function fragmentFromNodeChildren(node) {
+ var fragment = getDocument(node).createDocumentFragment(), child;
+ while ( (child = node.firstChild) ) {
+ fragment.appendChild(child);
+ }
+ return fragment;
+ }
+
+ var getComputedStyleProperty;
+ if (typeof window.getComputedStyle != UNDEF) {
+ getComputedStyleProperty = function(el, propName) {
+ return getWindow(el).getComputedStyle(el, null)[propName];
+ };
+ } else if (typeof document.documentElement.currentStyle != UNDEF) {
+ getComputedStyleProperty = function(el, propName) {
+ return el.currentStyle ? el.currentStyle[propName] : "";
+ };
+ } else {
+ module.fail("No means of obtaining computed style properties found");
+ }
+
+ function createTestElement(doc, html, contentEditable) {
+ var body = getBody(doc);
+ var el = doc.createElement("div");
+ el.contentEditable = "" + !!contentEditable;
+ if (html) {
+ el.innerHTML = html;
+ }
+
+ // Insert the test element at the start of the body to prevent scrolling to the bottom in iOS (issue #292)
+ var bodyFirstChild = body.firstChild;
+ if (bodyFirstChild) {
+ body.insertBefore(el, bodyFirstChild);
+ } else {
+ body.appendChild(el);
+ }
+
+ return el;
+ }
+
+ function removeNode(node) {
+ return node.parentNode.removeChild(node);
+ }
+
+ function NodeIterator(root) {
+ this.root = root;
+ this._next = root;
+ }
+
+ NodeIterator.prototype = {
+ _current: null,
+
+ hasNext: function() {
+ return !!this._next;
+ },
+
+ next: function() {
+ var n = this._current = this._next;
+ var child, next;
+ if (this._current) {
+ child = n.firstChild;
+ if (child) {
+ this._next = child;
+ } else {
+ next = null;
+ while ((n !== this.root) && !(next = n.nextSibling)) {
+ n = n.parentNode;
+ }
+ this._next = next;
+ }
+ }
+ return this._current;
+ },
+
+ detach: function() {
+ this._current = this._next = this.root = null;
+ }
+ };
+
+ function createIterator(root) {
+ return new NodeIterator(root);
+ }
+
+ function DomPosition(node, offset) {
+ this.node = node;
+ this.offset = offset;
+ }
+
+ DomPosition.prototype = {
+ equals: function(pos) {
+ return !!pos && this.node === pos.node && this.offset == pos.offset;
+ },
+
+ inspect: function() {
+ return "[DomPosition(" + inspectNode(this.node) + ":" + this.offset + ")]";
+ },
+
+ toString: function() {
+ return this.inspect();
+ }
+ };
+
+ function DOMException(codeName) {
+ this.code = this[codeName];
+ this.codeName = codeName;
+ this.message = "DOMException: " + this.codeName;
+ }
+
+ DOMException.prototype = {
+ INDEX_SIZE_ERR: 1,
+ HIERARCHY_REQUEST_ERR: 3,
+ WRONG_DOCUMENT_ERR: 4,
+ NO_MODIFICATION_ALLOWED_ERR: 7,
+ NOT_FOUND_ERR: 8,
+ NOT_SUPPORTED_ERR: 9,
+ INVALID_STATE_ERR: 11,
+ INVALID_NODE_TYPE_ERR: 24
+ };
+
+ DOMException.prototype.toString = function() {
+ return this.message;
+ };
+
+ api.dom = {
+ arrayContains: arrayContains,
+ isHtmlNamespace: isHtmlNamespace,
+ parentElement: parentElement,
+ getNodeIndex: getNodeIndex,
+ getNodeLength: getNodeLength,
+ getCommonAncestor: getCommonAncestor,
+ isAncestorOf: isAncestorOf,
+ isOrIsAncestorOf: isOrIsAncestorOf,
+ getClosestAncestorIn: getClosestAncestorIn,
+ isCharacterDataNode: isCharacterDataNode,
+ isTextOrCommentNode: isTextOrCommentNode,
+ insertAfter: insertAfter,
+ splitDataNode: splitDataNode,
+ getDocument: getDocument,
+ getWindow: getWindow,
+ getIframeWindow: getIframeWindow,
+ getIframeDocument: getIframeDocument,
+ getBody: getBody,
+ isWindow: isWindow,
+ getContentDocument: getContentDocument,
+ getRootContainer: getRootContainer,
+ comparePoints: comparePoints,
+ isBrokenNode: isBrokenNode,
+ inspectNode: inspectNode,
+ getComputedStyleProperty: getComputedStyleProperty,
+ createTestElement: createTestElement,
+ removeNode: removeNode,
+ fragmentFromNodeChildren: fragmentFromNodeChildren,
+ createIterator: createIterator,
+ DomPosition: DomPosition
+ };
+
+ api.DOMException = DOMException;
+ });
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // Pure JavaScript implementation of DOM Range
+ api.createCoreModule("DomRange", ["DomUtil"], function(api, module) {
+ var dom = api.dom;
+ var util = api.util;
+ var DomPosition = dom.DomPosition;
+ var DOMException = api.DOMException;
+
+ var isCharacterDataNode = dom.isCharacterDataNode;
+ var getNodeIndex = dom.getNodeIndex;
+ var isOrIsAncestorOf = dom.isOrIsAncestorOf;
+ var getDocument = dom.getDocument;
+ var comparePoints = dom.comparePoints;
+ var splitDataNode = dom.splitDataNode;
+ var getClosestAncestorIn = dom.getClosestAncestorIn;
+ var getNodeLength = dom.getNodeLength;
+ var arrayContains = dom.arrayContains;
+ var getRootContainer = dom.getRootContainer;
+ var crashyTextNodes = api.features.crashyTextNodes;
+
+ var removeNode = dom.removeNode;
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // Utility functions
+
+ function isNonTextPartiallySelected(node, range) {
+ return (node.nodeType != 3) &&
+ (isOrIsAncestorOf(node, range.startContainer) || isOrIsAncestorOf(node, range.endContainer));
+ }
+
+ function getRangeDocument(range) {
+ return range.document || getDocument(range.startContainer);
+ }
+
+ function getRangeRoot(range) {
+ return getRootContainer(range.startContainer);
+ }
+
+ function getBoundaryBeforeNode(node) {
+ return new DomPosition(node.parentNode, getNodeIndex(node));
+ }
+
+ function getBoundaryAfterNode(node) {
+ return new DomPosition(node.parentNode, getNodeIndex(node) + 1);
+ }
+
+ function insertNodeAtPosition(node, n, o) {
+ var firstNodeInserted = node.nodeType == 11 ? node.firstChild : node;
+ if (isCharacterDataNode(n)) {
+ if (o == n.length) {
+ dom.insertAfter(node, n);
+ } else {
+ n.parentNode.insertBefore(node, o == 0 ? n : splitDataNode(n, o));
+ }
+ } else if (o >= n.childNodes.length) {
+ n.appendChild(node);
+ } else {
+ n.insertBefore(node, n.childNodes[o]);
+ }
+ return firstNodeInserted;
+ }
+
+ function rangesIntersect(rangeA, rangeB, touchingIsIntersecting) {
+ assertRangeValid(rangeA);
+ assertRangeValid(rangeB);
+
+ if (getRangeDocument(rangeB) != getRangeDocument(rangeA)) {
+ throw new DOMException("WRONG_DOCUMENT_ERR");
+ }
+
+ var startComparison = comparePoints(rangeA.startContainer, rangeA.startOffset, rangeB.endContainer, rangeB.endOffset),
+ endComparison = comparePoints(rangeA.endContainer, rangeA.endOffset, rangeB.startContainer, rangeB.startOffset);
+
+ return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;
+ }
+
+ function cloneSubtree(iterator) {
+ var partiallySelected;
+ for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {
+ partiallySelected = iterator.isPartiallySelectedSubtree();
+ node = node.cloneNode(!partiallySelected);
+ if (partiallySelected) {
+ subIterator = iterator.getSubtreeIterator();
+ node.appendChild(cloneSubtree(subIterator));
+ subIterator.detach();
+ }
+
+ if (node.nodeType == 10) { // DocumentType
+ throw new DOMException("HIERARCHY_REQUEST_ERR");
+ }
+ frag.appendChild(node);
+ }
+ return frag;
+ }
+
+ function iterateSubtree(rangeIterator, func, iteratorState) {
+ var it, n;
+ iteratorState = iteratorState || { stop: false };
+ for (var node, subRangeIterator; node = rangeIterator.next(); ) {
+ if (rangeIterator.isPartiallySelectedSubtree()) {
+ if (func(node) === false) {
+ iteratorState.stop = true;
+ return;
+ } else {
+ // The node is partially selected by the Range, so we can use a new RangeIterator on the portion of
+ // the node selected by the Range.
+ subRangeIterator = rangeIterator.getSubtreeIterator();
+ iterateSubtree(subRangeIterator, func, iteratorState);
+ subRangeIterator.detach();
+ if (iteratorState.stop) {
+ return;
+ }
+ }
+ } else {
+ // The whole node is selected, so we can use efficient DOM iteration to iterate over the node and its
+ // descendants
+ it = dom.createIterator(node);
+ while ( (n = it.next()) ) {
+ if (func(n) === false) {
+ iteratorState.stop = true;
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ function deleteSubtree(iterator) {
+ var subIterator;
+ while (iterator.next()) {
+ if (iterator.isPartiallySelectedSubtree()) {
+ subIterator = iterator.getSubtreeIterator();
+ deleteSubtree(subIterator);
+ subIterator.detach();
+ } else {
+ iterator.remove();
+ }
+ }
+ }
+
+ function extractSubtree(iterator) {
+ for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {
+
+ if (iterator.isPartiallySelectedSubtree()) {
+ node = node.cloneNode(false);
+ subIterator = iterator.getSubtreeIterator();
+ node.appendChild(extractSubtree(subIterator));
+ subIterator.detach();
+ } else {
+ iterator.remove();
+ }
+ if (node.nodeType == 10) { // DocumentType
+ throw new DOMException("HIERARCHY_REQUEST_ERR");
+ }
+ frag.appendChild(node);
+ }
+ return frag;
+ }
+
+ function getNodesInRange(range, nodeTypes, filter) {
+ var filterNodeTypes = !!(nodeTypes && nodeTypes.length), regex;
+ var filterExists = !!filter;
+ if (filterNodeTypes) {
+ regex = new RegExp("^(" + nodeTypes.join("|") + ")$");
+ }
+
+ var nodes = [];
+ iterateSubtree(new RangeIterator(range, false), function(node) {
+ if (filterNodeTypes && !regex.test(node.nodeType)) {
+ return;
+ }
+ if (filterExists && !filter(node)) {
+ return;
+ }
+ // Don't include a boundary container if it is a character data node and the range does not contain any
+ // of its character data. See issue 190.
+ var sc = range.startContainer;
+ if (node == sc && isCharacterDataNode(sc) && range.startOffset == sc.length) {
+ return;
+ }
+
+ var ec = range.endContainer;
+ if (node == ec && isCharacterDataNode(ec) && range.endOffset == 0) {
+ return;
+ }
+
+ nodes.push(node);
+ });
+ return nodes;
+ }
+
+ function inspect(range) {
+ var name = (typeof range.getName == "undefined") ? "Range" : range.getName();
+ return "[" + name + "(" + dom.inspectNode(range.startContainer) + ":" + range.startOffset + ", " +
+ dom.inspectNode(range.endContainer) + ":" + range.endOffset + ")]";
+ }
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // RangeIterator code partially borrows from IERange by Tim Ryan (http://github.com/timcameronryan/IERange)
+
+ function RangeIterator(range, clonePartiallySelectedTextNodes) {
+ this.range = range;
+ this.clonePartiallySelectedTextNodes = clonePartiallySelectedTextNodes;
+
+
+ if (!range.collapsed) {
+ this.sc = range.startContainer;
+ this.so = range.startOffset;
+ this.ec = range.endContainer;
+ this.eo = range.endOffset;
+ var root = range.commonAncestorContainer;
+
+ if (this.sc === this.ec && isCharacterDataNode(this.sc)) {
+ this.isSingleCharacterDataNode = true;
+ this._first = this._last = this._next = this.sc;
+ } else {
+ this._first = this._next = (this.sc === root && !isCharacterDataNode(this.sc)) ?
+ this.sc.childNodes[this.so] : getClosestAncestorIn(this.sc, root, true);
+ this._last = (this.ec === root && !isCharacterDataNode(this.ec)) ?
+ this.ec.childNodes[this.eo - 1] : getClosestAncestorIn(this.ec, root, true);
+ }
+ }
+ }
+
+ RangeIterator.prototype = {
+ _current: null,
+ _next: null,
+ _first: null,
+ _last: null,
+ isSingleCharacterDataNode: false,
+
+ reset: function() {
+ this._current = null;
+ this._next = this._first;
+ },
+
+ hasNext: function() {
+ return !!this._next;
+ },
+
+ next: function() {
+ // Move to next node
+ var current = this._current = this._next;
+ if (current) {
+ this._next = (current !== this._last) ? current.nextSibling : null;
+
+ // Check for partially selected text nodes
+ if (isCharacterDataNode(current) && this.clonePartiallySelectedTextNodes) {
+ if (current === this.ec) {
+ (current = current.cloneNode(true)).deleteData(this.eo, current.length - this.eo);
+ }
+ if (this._current === this.sc) {
+ (current = current.cloneNode(true)).deleteData(0, this.so);
+ }
+ }
+ }
+
+ return current;
+ },
+
+ remove: function() {
+ var current = this._current, start, end;
+
+ if (isCharacterDataNode(current) && (current === this.sc || current === this.ec)) {
+ start = (current === this.sc) ? this.so : 0;
+ end = (current === this.ec) ? this.eo : current.length;
+ if (start != end) {
+ current.deleteData(start, end - start);
+ }
+ } else {
+ if (current.parentNode) {
+ removeNode(current);
+ } else {
+ }
+ }
+ },
+
+ // Checks if the current node is partially selected
+ isPartiallySelectedSubtree: function() {
+ var current = this._current;
+ return isNonTextPartiallySelected(current, this.range);
+ },
+
+ getSubtreeIterator: function() {
+ var subRange;
+ if (this.isSingleCharacterDataNode) {
+ subRange = this.range.cloneRange();
+ subRange.collapse(false);
+ } else {
+ subRange = new Range(getRangeDocument(this.range));
+ var current = this._current;
+ var startContainer = current, startOffset = 0, endContainer = current, endOffset = getNodeLength(current);
+
+ if (isOrIsAncestorOf(current, this.sc)) {
+ startContainer = this.sc;
+ startOffset = this.so;
+ }
+ if (isOrIsAncestorOf(current, this.ec)) {
+ endContainer = this.ec;
+ endOffset = this.eo;
+ }
+
+ updateBoundaries(subRange, startContainer, startOffset, endContainer, endOffset);
+ }
+ return new RangeIterator(subRange, this.clonePartiallySelectedTextNodes);
+ },
+
+ detach: function() {
+ this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null;
+ }
+ };
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ var beforeAfterNodeTypes = [1, 3, 4, 5, 7, 8, 10];
+ var rootContainerNodeTypes = [2, 9, 11];
+ var readonlyNodeTypes = [5, 6, 10, 12];
+ var insertableNodeTypes = [1, 3, 4, 5, 7, 8, 10, 11];
+ var surroundNodeTypes = [1, 3, 4, 5, 7, 8];
+
+ function createAncestorFinder(nodeTypes) {
+ return function(node, selfIsAncestor) {
+ var t, n = selfIsAncestor ? node : node.parentNode;
+ while (n) {
+ t = n.nodeType;
+ if (arrayContains(nodeTypes, t)) {
+ return n;
+ }
+ n = n.parentNode;
+ }
+ return null;
+ };
+ }
+
+ var getDocumentOrFragmentContainer = createAncestorFinder( [9, 11] );
+ var getReadonlyAncestor = createAncestorFinder(readonlyNodeTypes);
+ var getDocTypeNotationEntityAncestor = createAncestorFinder( [6, 10, 12] );
+
+ function assertNoDocTypeNotationEntityAncestor(node, allowSelf) {
+ if (getDocTypeNotationEntityAncestor(node, allowSelf)) {
+ throw new DOMException("INVALID_NODE_TYPE_ERR");
+ }
+ }
+
+ function assertValidNodeType(node, invalidTypes) {
+ if (!arrayContains(invalidTypes, node.nodeType)) {
+ throw new DOMException("INVALID_NODE_TYPE_ERR");
+ }
+ }
+
+ function assertValidOffset(node, offset) {
+ if (offset < 0 || offset > (isCharacterDataNode(node) ? node.length : node.childNodes.length)) {
+ throw new DOMException("INDEX_SIZE_ERR");
+ }
+ }
+
+ function assertSameDocumentOrFragment(node1, node2) {
+ if (getDocumentOrFragmentContainer(node1, true) !== getDocumentOrFragmentContainer(node2, true)) {
+ throw new DOMException("WRONG_DOCUMENT_ERR");
+ }
+ }
+
+ function assertNodeNotReadOnly(node) {
+ if (getReadonlyAncestor(node, true)) {
+ throw new DOMException("NO_MODIFICATION_ALLOWED_ERR");
+ }
+ }
+
+ function assertNode(node, codeName) {
+ if (!node) {
+ throw new DOMException(codeName);
+ }
+ }
+
+ function isValidOffset(node, offset) {
+ return offset <= (isCharacterDataNode(node) ? node.length : node.childNodes.length);
+ }
+
+ function isRangeValid(range) {
+ return (!!range.startContainer && !!range.endContainer &&
+ !(crashyTextNodes && (dom.isBrokenNode(range.startContainer) || dom.isBrokenNode(range.endContainer))) &&
+ getRootContainer(range.startContainer) == getRootContainer(range.endContainer) &&
+ isValidOffset(range.startContainer, range.startOffset) &&
+ isValidOffset(range.endContainer, range.endOffset));
+ }
+
+ function assertRangeValid(range) {
+ if (!isRangeValid(range)) {
+ throw new Error("Range error: Range is not valid. This usually happens after DOM mutation. Range: (" + range.inspect() + ")");
+ }
+ }
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // Test the browser's innerHTML support to decide how to implement createContextualFragment
+ var styleEl = document.createElement("style");
+ var htmlParsingConforms = false;
+ try {
+ styleEl.innerHTML = "<b>x</b>";
+ htmlParsingConforms = (styleEl.firstChild.nodeType == 3); // Opera incorrectly creates an element node
+ } catch (e) {
+ // IE 6 and 7 throw
+ }
+
+ api.features.htmlParsingConforms = htmlParsingConforms;
+
+ var createContextualFragment = htmlParsingConforms ?
+
+ // Implementation as per HTML parsing spec, trusting in the browser's implementation of innerHTML. See
+ // discussion and base code for this implementation at issue 67.
+ // Spec: http://html5.org/specs/dom-parsing.html#extensions-to-the-range-interface
+ // Thanks to Aleks Williams.
+ function(fragmentStr) {
+ // "Let node the context object's start's node."
+ var node = this.startContainer;
+ var doc = getDocument(node);
+
+ // "If the context object's start's node is null, raise an INVALID_STATE_ERR
+ // exception and abort these steps."
+ if (!node) {
+ throw new DOMException("INVALID_STATE_ERR");
+ }
+
+ // "Let element be as follows, depending on node's interface:"
+ // Document, Document Fragment: null
+ var el = null;
+
+ // "Element: node"
+ if (node.nodeType == 1) {
+ el = node;
+
+ // "Text, Comment: node's parentElement"
+ } else if (isCharacterDataNode(node)) {
+ el = dom.parentElement(node);
+ }
+
+ // "If either element is null or element's ownerDocument is an HTML document
+ // and element's local name is "html" and element's namespace is the HTML
+ // namespace"
+ if (el === null || (
+ el.nodeName == "HTML" &&
+ dom.isHtmlNamespace(getDocument(el).documentElement) &&
+ dom.isHtmlNamespace(el)
+ )) {
+
+ // "let element be a new Element with "body" as its local name and the HTML
+ // namespace as its namespace.""
+ el = doc.createElement("body");
+ } else {
+ el = el.cloneNode(false);
+ }
+
+ // "If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm."
+ // "If the node's document is an XML document: Invoke the XML fragment parsing algorithm."
+ // "In either case, the algorithm must be invoked with fragment as the input
+ // and element as the context element."
+ el.innerHTML = fragmentStr;
+
+ // "If this raises an exception, then abort these steps. Otherwise, let new
+ // children be the nodes returned."
+
+ // "Let fragment be a new DocumentFragment."
+ // "Append all new children to fragment."
+ // "Return fragment."
+ return dom.fragmentFromNodeChildren(el);
+ } :
+
+ // In this case, innerHTML cannot be trusted, so fall back to a simpler, non-conformant implementation that
+ // previous versions of Rangy used (with the exception of using a body element rather than a div)
+ function(fragmentStr) {
+ var doc = getRangeDocument(this);
+ var el = doc.createElement("body");
+ el.innerHTML = fragmentStr;
+
+ return dom.fragmentFromNodeChildren(el);
+ };
+
+ function splitRangeBoundaries(range, positionsToPreserve) {
+ assertRangeValid(range);
+
+ var sc = range.startContainer, so = range.startOffset, ec = range.endContainer, eo = range.endOffset;
+ var startEndSame = (sc === ec);
+
+ if (isCharacterDataNode(ec) && eo > 0 && eo < ec.length) {
+ splitDataNode(ec, eo, positionsToPreserve);
+ }
+
+ if (isCharacterDataNode(sc) && so > 0 && so < sc.length) {
+ sc = splitDataNode(sc, so, positionsToPreserve);
+ if (startEndSame) {
+ eo -= so;
+ ec = sc;
+ } else if (ec == sc.parentNode && eo >= getNodeIndex(sc)) {
+ eo++;
+ }
+ so = 0;
+ }
+ range.setStartAndEnd(sc, so, ec, eo);
+ }
+
+ function rangeToHtml(range) {
+ assertRangeValid(range);
+ var container = range.commonAncestorContainer.parentNode.cloneNode(false);
+ container.appendChild( range.cloneContents() );
+ return container.innerHTML;
+ }
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ var rangeProperties = ["startContainer", "startOffset", "endContainer", "endOffset", "collapsed",
+ "commonAncestorContainer"];
+
+ var s2s = 0, s2e = 1, e2e = 2, e2s = 3;
+ var n_b = 0, n_a = 1, n_b_a = 2, n_i = 3;
+
+ util.extend(api.rangePrototype, {
+ compareBoundaryPoints: function(how, range) {
+ assertRangeValid(this);
+ assertSameDocumentOrFragment(this.startContainer, range.startContainer);
+
+ var nodeA, offsetA, nodeB, offsetB;
+ var prefixA = (how == e2s || how == s2s) ? "start" : "end";
+ var prefixB = (how == s2e || how == s2s) ? "start" : "end";
+ nodeA = this[prefixA + "Container"];
+ offsetA = this[prefixA + "Offset"];
+ nodeB = range[prefixB + "Container"];
+ offsetB = range[prefixB + "Offset"];
+ return comparePoints(nodeA, offsetA, nodeB, offsetB);
+ },
+
+ insertNode: function(node) {
+ assertRangeValid(this);
+ assertValidNodeType(node, insertableNodeTypes);
+ assertNodeNotReadOnly(this.startContainer);
+
+ if (isOrIsAncestorOf(node, this.startContainer)) {
+ throw new DOMException("HIERARCHY_REQUEST_ERR");
+ }
+
+ // No check for whether the container of the start of the Range is of a type that does not allow
+ // children of the type of node: the browser's DOM implementation should do this for us when we attempt
+ // to add the node
+
+ var firstNodeInserted = insertNodeAtPosition(node, this.startContainer, this.startOffset);
+ this.setStartBefore(firstNodeInserted);
+ },
+
+ cloneContents: function() {
+ assertRangeValid(this);
+
+ var clone, frag;
+ if (this.collapsed) {
+ return getRangeDocument(this).createDocumentFragment();
+ } else {
+ if (this.startContainer === this.endContainer && isCharacterDataNode(this.startContainer)) {
+ clone = this.startContainer.cloneNode(true);
+ clone.data = clone.data.slice(this.startOffset, this.endOffset);
+ frag = getRangeDocument(this).createDocumentFragment();
+ frag.appendChild(clone);
+ return frag;
+ } else {
+ var iterator = new RangeIterator(this, true);
+ clone = cloneSubtree(iterator);
+ iterator.detach();
+ }
+ return clone;
+ }
+ },
+
+ canSurroundContents: function() {
+ assertRangeValid(this);
+ assertNodeNotReadOnly(this.startContainer);
+ assertNodeNotReadOnly(this.endContainer);
+
+ // Check if the contents can be surrounded. Specifically, this means whether the range partially selects
+ // no non-text nodes.
+ var iterator = new RangeIterator(this, true);
+ var boundariesInvalid = (iterator._first && (isNonTextPartiallySelected(iterator._first, this)) ||
+ (iterator._last && isNonTextPartiallySelected(iterator._last, this)));
+ iterator.detach();
+ return !boundariesInvalid;
+ },
+
+ surroundContents: function(node) {
+ assertValidNodeType(node, surroundNodeTypes);
+
+ if (!this.canSurroundContents()) {
+ throw new DOMException("INVALID_STATE_ERR");
+ }
+
+ // Extract the contents
+ var content = this.extractContents();
+
+ // Clear the children of the node
+ if (node.hasChildNodes()) {
+ while (node.lastChild) {
+ node.removeChild(node.lastChild);
+ }
+ }
+
+ // Insert the new node and add the extracted contents
+ insertNodeAtPosition(node, this.startContainer, this.startOffset);
+ node.appendChild(content);
+
+ this.selectNode(node);
+ },
+
+ cloneRange: function() {
+ assertRangeValid(this);
+ var range = new Range(getRangeDocument(this));
+ var i = rangeProperties.length, prop;
+ while (i--) {
+ prop = rangeProperties[i];
+ range[prop] = this[prop];
+ }
+ return range;
+ },
+
+ toString: function() {
+ assertRangeValid(this);
+ var sc = this.startContainer;
+ if (sc === this.endContainer && isCharacterDataNode(sc)) {
+ return (sc.nodeType == 3 || sc.nodeType == 4) ? sc.data.slice(this.startOffset, this.endOffset) : "";
+ } else {
+ var textParts = [], iterator = new RangeIterator(this, true);
+ iterateSubtree(iterator, function(node) {
+ // Accept only text or CDATA nodes, not comments
+ if (node.nodeType == 3 || node.nodeType == 4) {
+ textParts.push(node.data);
+ }
+ });
+ iterator.detach();
+ return textParts.join("");
+ }
+ },
+
+ // The methods below are all non-standard. The following batch were introduced by Mozilla but have since
+ // been removed from Mozilla.
+
+ compareNode: function(node) {
+ assertRangeValid(this);
+
+ var parent = node.parentNode;
+ var nodeIndex = getNodeIndex(node);
+
+ if (!parent) {
+ throw new DOMException("NOT_FOUND_ERR");
+ }
+
+ var startComparison = this.comparePoint(parent, nodeIndex),
+ endComparison = this.comparePoint(parent, nodeIndex + 1);
+
+ if (startComparison < 0) { // Node starts before
+ return (endComparison > 0) ? n_b_a : n_b;
+ } else {
+ return (endComparison > 0) ? n_a : n_i;
+ }
+ },
+
+ comparePoint: function(node, offset) {
+ assertRangeValid(this);
+ assertNode(node, "HIERARCHY_REQUEST_ERR");
+ assertSameDocumentOrFragment(node, this.startContainer);
+
+ if (comparePoints(node, offset, this.startContainer, this.startOffset) < 0) {
+ return -1;
+ } else if (comparePoints(node, offset, this.endContainer, this.endOffset) > 0) {
+ return 1;
+ }
+ return 0;
+ },
+
+ createContextualFragment: createContextualFragment,
+
+ toHtml: function() {
+ return rangeToHtml(this);
+ },
+
+ // touchingIsIntersecting determines whether this method considers a node that borders a range intersects
+ // with it (as in WebKit) or not (as in Gecko pre-1.9, and the default)
+ intersectsNode: function(node, touchingIsIntersecting) {
+ assertRangeValid(this);
+ if (getRootContainer(node) != getRangeRoot(this)) {
+ return false;
+ }
+
+ var parent = node.parentNode, offset = getNodeIndex(node);
+ if (!parent) {
+ return true;
+ }
+
+ var startComparison = comparePoints(parent, offset, this.endContainer, this.endOffset),
+ endComparison = comparePoints(parent, offset + 1, this.startContainer, this.startOffset);
+
+ return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;
+ },
+
+ isPointInRange: function(node, offset) {
+ assertRangeValid(this);
+ assertNode(node, "HIERARCHY_REQUEST_ERR");
+ assertSameDocumentOrFragment(node, this.startContainer);
+
+ return (comparePoints(node, offset, this.startContainer, this.startOffset) >= 0) &&
+ (comparePoints(node, offset, this.endContainer, this.endOffset) <= 0);
+ },
+
+ // The methods below are non-standard and invented by me.
+
+ // Sharing a boundary start-to-end or end-to-start does not count as intersection.
+ intersectsRange: function(range) {
+ return rangesIntersect(this, range, false);
+ },
+
+ // Sharing a boundary start-to-end or end-to-start does count as intersection.
+ intersectsOrTouchesRange: function(range) {
+ return rangesIntersect(this, range, true);
+ },
+
+ intersection: function(range) {
+ if (this.intersectsRange(range)) {
+ var startComparison = comparePoints(this.startContainer, this.startOffset, range.startContainer, range.startOffset),
+ endComparison = comparePoints(this.endContainer, this.endOffset, range.endContainer, range.endOffset);
+
+ var intersectionRange = this.cloneRange();
+ if (startComparison == -1) {
+ intersectionRange.setStart(range.startContainer, range.startOffset);
+ }
+ if (endComparison == 1) {
+ intersectionRange.setEnd(range.endContainer, range.endOffset);
+ }
+ return intersectionRange;
+ }
+ return null;
+ },
+
+ union: function(range) {
+ if (this.intersectsOrTouchesRange(range)) {
+ var unionRange = this.cloneRange();
+ if (comparePoints(range.startContainer, range.startOffset, this.startContainer, this.startOffset) == -1) {
+ unionRange.setStart(range.startContainer, range.startOffset);
+ }
+ if (comparePoints(range.endContainer, range.endOffset, this.endContainer, this.endOffset) == 1) {
+ unionRange.setEnd(range.endContainer, range.endOffset);
+ }
+ return unionRange;
+ } else {
+ throw new DOMException("Ranges do not intersect");
+ }
+ },
+
+ containsNode: function(node, allowPartial) {
+ if (allowPartial) {
+ return this.intersectsNode(node, false);
+ } else {
+ return this.compareNode(node) == n_i;
+ }
+ },
+
+ containsNodeContents: function(node) {
+ return this.comparePoint(node, 0) >= 0 && this.comparePoint(node, getNodeLength(node)) <= 0;
+ },
+
+ containsRange: function(range) {
+ var intersection = this.intersection(range);
+ return intersection !== null && range.equals(intersection);
+ },
+
+ containsNodeText: function(node) {
+ var nodeRange = this.cloneRange();
+ nodeRange.selectNode(node);
+ var textNodes = nodeRange.getNodes([3]);
+ if (textNodes.length > 0) {
+ nodeRange.setStart(textNodes[0], 0);
+ var lastTextNode = textNodes.pop();
+ nodeRange.setEnd(lastTextNode, lastTextNode.length);
+ return this.containsRange(nodeRange);
+ } else {
+ return this.containsNodeContents(node);
+ }
+ },
+
+ getNodes: function(nodeTypes, filter) {
+ assertRangeValid(this);
+ return getNodesInRange(this, nodeTypes, filter);
+ },
+
+ getDocument: function() {
+ return getRangeDocument(this);
+ },
+
+ collapseBefore: function(node) {
+ this.setEndBefore(node);
+ this.collapse(false);
+ },
+
+ collapseAfter: function(node) {
+ this.setStartAfter(node);
+ this.collapse(true);
+ },
+
+ getBookmark: function(containerNode) {
+ var doc = getRangeDocument(this);
+ var preSelectionRange = api.createRange(doc);
+ containerNode = containerNode || dom.getBody(doc);
+ preSelectionRange.selectNodeContents(containerNode);
+ var range = this.intersection(preSelectionRange);
+ var start = 0, end = 0;
+ if (range) {
+ preSelectionRange.setEnd(range.startContainer, range.startOffset);
+ start = preSelectionRange.toString().length;
+ end = start + range.toString().length;
+ }
+
+ return {
+ start: start,
+ end: end,
+ containerNode: containerNode
+ };
+ },
+
+ moveToBookmark: function(bookmark) {
+ var containerNode = bookmark.containerNode;
+ var charIndex = 0;
+ this.setStart(containerNode, 0);
+ this.collapse(true);
+ var nodeStack = [containerNode], node, foundStart = false, stop = false;
+ var nextCharIndex, i, childNodes;
+
+ while (!stop && (node = nodeStack.pop())) {
+ if (node.nodeType == 3) {
+ nextCharIndex = charIndex + node.length;
+ if (!foundStart && bookmark.start >= charIndex && bookmark.start <= nextCharIndex) {
+ this.setStart(node, bookmark.start - charIndex);
+ foundStart = true;
+ }
+ if (foundStart && bookmark.end >= charIndex && bookmark.end <= nextCharIndex) {
+ this.setEnd(node, bookmark.end - charIndex);
+ stop = true;
+ }
+ charIndex = nextCharIndex;
+ } else {
+ childNodes = node.childNodes;
+ i = childNodes.length;
+ while (i--) {
+ nodeStack.push(childNodes[i]);
+ }
+ }
+ }
+ },
+
+ getName: function() {
+ return "DomRange";
+ },
+
+ equals: function(range) {
+ return Range.rangesEqual(this, range);
+ },
+
+ isValid: function() {
+ return isRangeValid(this);
+ },
+
+ inspect: function() {
+ return inspect(this);
+ },
+
+ detach: function() {
+ // In DOM4, detach() is now a no-op.
+ }
+ });
+
+ function copyComparisonConstantsToObject(obj) {
+ obj.START_TO_START = s2s;
+ obj.START_TO_END = s2e;
+ obj.END_TO_END = e2e;
+ obj.END_TO_START = e2s;
+
+ obj.NODE_BEFORE = n_b;
+ obj.NODE_AFTER = n_a;
+ obj.NODE_BEFORE_AND_AFTER = n_b_a;
+ obj.NODE_INSIDE = n_i;
+ }
+
+ function copyComparisonConstants(constructor) {
+ copyComparisonConstantsToObject(constructor);
+ copyComparisonConstantsToObject(constructor.prototype);
+ }
+
+ function createRangeContentRemover(remover, boundaryUpdater) {
+ return function() {
+ assertRangeValid(this);
+
+ var sc = this.startContainer, so = this.startOffset, root = this.commonAncestorContainer;
+
+ var iterator = new RangeIterator(this, true);
+
+ // Work out where to position the range after content removal
+ var node, boundary;
+ if (sc !== root) {
+ node = getClosestAncestorIn(sc, root, true);
+ boundary = getBoundaryAfterNode(node);
+ sc = boundary.node;
+ so = boundary.offset;
+ }
+
+ // Check none of the range is read-only
+ iterateSubtree(iterator, assertNodeNotReadOnly);
+
+ iterator.reset();
+
+ // Remove the content
+ var returnValue = remover(iterator);
+ iterator.detach();
+
+ // Move to the new position
+ boundaryUpdater(this, sc, so, sc, so);
+
+ return returnValue;
+ };
+ }
+
+ function createPrototypeRange(constructor, boundaryUpdater) {
+ function createBeforeAfterNodeSetter(isBefore, isStart) {
+ return function(node) {
+ assertValidNodeType(node, beforeAfterNodeTypes);
+ assertValidNodeType(getRootContainer(node), rootContainerNodeTypes);
+
+ var boundary = (isBefore ? getBoundaryBeforeNode : getBoundaryAfterNode)(node);
+ (isStart ? setRangeStart : setRangeEnd)(this, boundary.node, boundary.offset);
+ };
+ }
+
+ function setRangeStart(range, node, offset) {
+ var ec = range.endContainer, eo = range.endOffset;
+ if (node !== range.startContainer || offset !== range.startOffset) {
+ // Check the root containers of the range and the new boundary, and also check whether the new boundary
+ // is after the current end. In either case, collapse the range to the new position
+ if (getRootContainer(node) != getRootContainer(ec) || comparePoints(node, offset, ec, eo) == 1) {
+ ec = node;
+ eo = offset;
+ }
+ boundaryUpdater(range, node, offset, ec, eo);
+ }
+ }
+
+ function setRangeEnd(range, node, offset) {
+ var sc = range.startContainer, so = range.startOffset;
+ if (node !== range.endContainer || offset !== range.endOffset) {
+ // Check the root containers of the range and the new boundary, and also check whether the new boundary
+ // is after the current end. In either case, collapse the range to the new position
+ if (getRootContainer(node) != getRootContainer(sc) || comparePoints(node, offset, sc, so) == -1) {
+ sc = node;
+ so = offset;
+ }
+ boundaryUpdater(range, sc, so, node, offset);
+ }
+ }
+
+ // Set up inheritance
+ var F = function() {};
+ F.prototype = api.rangePrototype;
+ constructor.prototype = new F();
+
+ util.extend(constructor.prototype, {
+ setStart: function(node, offset) {
+ assertNoDocTypeNotationEntityAncestor(node, true);
+ assertValidOffset(node, offset);
+
+ setRangeStart(this, node, offset);
+ },
+
+ setEnd: function(node, offset) {
+ assertNoDocTypeNotationEntityAncestor(node, true);
+ assertValidOffset(node, offset);
+
+ setRangeEnd(this, node, offset);
+ },
+
+ /**
+ * Convenience method to set a range's start and end boundaries. Overloaded as follows:
+ * - Two parameters (node, offset) creates a collapsed range at that position
+ * - Three parameters (node, startOffset, endOffset) creates a range contained with node starting at
+ * startOffset and ending at endOffset
+ * - Four parameters (startNode, startOffset, endNode, endOffset) creates a range starting at startOffset in
+ * startNode and ending at endOffset in endNode
+ */
+ setStartAndEnd: function() {
+ var args = arguments;
+ var sc = args[0], so = args[1], ec = sc, eo = so;
+
+ switch (args.length) {
+ case 3:
+ eo = args[2];
+ break;
+ case 4:
+ ec = args[2];
+ eo = args[3];
+ break;
+ }
+
+ boundaryUpdater(this, sc, so, ec, eo);
+ },
+
+ setBoundary: function(node, offset, isStart) {
+ this["set" + (isStart ? "Start" : "End")](node, offset);
+ },
+
+ setStartBefore: createBeforeAfterNodeSetter(true, true),
+ setStartAfter: createBeforeAfterNodeSetter(false, true),
+ setEndBefore: createBeforeAfterNodeSetter(true, false),
+ setEndAfter: createBeforeAfterNodeSetter(false, false),
+
+ collapse: function(isStart) {
+ assertRangeValid(this);
+ if (isStart) {
+ boundaryUpdater(this, this.startContainer, this.startOffset, this.startContainer, this.startOffset);
+ } else {
+ boundaryUpdater(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset);
+ }
+ },
+
+ selectNodeContents: function(node) {
+ assertNoDocTypeNotationEntityAncestor(node, true);
+
+ boundaryUpdater(this, node, 0, node, getNodeLength(node));
+ },
+
+ selectNode: function(node) {
+ assertNoDocTypeNotationEntityAncestor(node, false);
+ assertValidNodeType(node, beforeAfterNodeTypes);
+
+ var start = getBoundaryBeforeNode(node), end = getBoundaryAfterNode(node);
+ boundaryUpdater(this, start.node, start.offset, end.node, end.offset);
+ },
+
+ extractContents: createRangeContentRemover(extractSubtree, boundaryUpdater),
+
+ deleteContents: createRangeContentRemover(deleteSubtree, boundaryUpdater),
+
+ canSurroundContents: function() {
+ assertRangeValid(this);
+ assertNodeNotReadOnly(this.startContainer);
+ assertNodeNotReadOnly(this.endContainer);
+
+ // Check if the contents can be surrounded. Specifically, this means whether the range partially selects
+ // no non-text nodes.
+ var iterator = new RangeIterator(this, true);
+ var boundariesInvalid = (iterator._first && isNonTextPartiallySelected(iterator._first, this) ||
+ (iterator._last && isNonTextPartiallySelected(iterator._last, this)));
+ iterator.detach();
+ return !boundariesInvalid;
+ },
+
+ splitBoundaries: function() {
+ splitRangeBoundaries(this);
+ },
+
+ splitBoundariesPreservingPositions: function(positionsToPreserve) {
+ splitRangeBoundaries(this, positionsToPreserve);
+ },
+
+ normalizeBoundaries: function() {
+ assertRangeValid(this);
+
+ var sc = this.startContainer, so = this.startOffset, ec = this.endContainer, eo = this.endOffset;
+
+ var mergeForward = function(node) {
+ var sibling = node.nextSibling;
+ if (sibling && sibling.nodeType == node.nodeType) {
+ ec = node;
+ eo = node.length;
+ node.appendData(sibling.data);
+ removeNode(sibling);
+ }
+ };
+
+ var mergeBackward = function(node) {
+ var sibling = node.previousSibling;
+ if (sibling && sibling.nodeType == node.nodeType) {
+ sc = node;
+ var nodeLength = node.length;
+ so = sibling.length;
+ node.insertData(0, sibling.data);
+ removeNode(sibling);
+ if (sc == ec) {
+ eo += so;
+ ec = sc;
+ } else if (ec == node.parentNode) {
+ var nodeIndex = getNodeIndex(node);
+ if (eo == nodeIndex) {
+ ec = node;
+ eo = nodeLength;
+ } else if (eo > nodeIndex) {
+ eo--;
+ }
+ }
+ }
+ };
+
+ var normalizeStart = true;
+ var sibling;
+
+ if (isCharacterDataNode(ec)) {
+ if (eo == ec.length) {
+ mergeForward(ec);
+ } else if (eo == 0) {
+ sibling = ec.previousSibling;
+ if (sibling && sibling.nodeType == ec.nodeType) {
+ eo = sibling.length;
+ if (sc == ec) {
+ normalizeStart = false;
+ }
+ sibling.appendData(ec.data);
+ removeNode(ec);
+ ec = sibling;
+ }
+ }
+ } else {
+ if (eo > 0) {
+ var endNode = ec.childNodes[eo - 1];
+ if (endNode && isCharacterDataNode(endNode)) {
+ mergeForward(endNode);
+ }
+ }
+ normalizeStart = !this.collapsed;
+ }
+
+ if (normalizeStart) {
+ if (isCharacterDataNode(sc)) {
+ if (so == 0) {
+ mergeBackward(sc);
+ } else if (so == sc.length) {
+ sibling = sc.nextSibling;
+ if (sibling && sibling.nodeType == sc.nodeType) {
+ if (ec == sibling) {
+ ec = sc;
+ eo += sc.length;
+ }
+ sc.appendData(sibling.data);
+ removeNode(sibling);
+ }
+ }
+ } else {
+ if (so < sc.childNodes.length) {
+ var startNode = sc.childNodes[so];
+ if (startNode && isCharacterDataNode(startNode)) {
+ mergeBackward(startNode);
+ }
+ }
+ }
+ } else {
+ sc = ec;
+ so = eo;
+ }
+
+ boundaryUpdater(this, sc, so, ec, eo);
+ },
+
+ collapseToPoint: function(node, offset) {
+ assertNoDocTypeNotationEntityAncestor(node, true);
+ assertValidOffset(node, offset);
+ this.setStartAndEnd(node, offset);
+ }
+ });
+
+ copyComparisonConstants(constructor);
+ }
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // Updates commonAncestorContainer and collapsed after boundary change
+ function updateCollapsedAndCommonAncestor(range) {
+ range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);
+ range.commonAncestorContainer = range.collapsed ?
+ range.startContainer : dom.getCommonAncestor(range.startContainer, range.endContainer);
+ }
+
+ function updateBoundaries(range, startContainer, startOffset, endContainer, endOffset) {
+ range.startContainer = startContainer;
+ range.startOffset = startOffset;
+ range.endContainer = endContainer;
+ range.endOffset = endOffset;
+ range.document = dom.getDocument(startContainer);
+
+ updateCollapsedAndCommonAncestor(range);
+ }
+
+ function Range(doc) {
+ this.startContainer = doc;
+ this.startOffset = 0;
+ this.endContainer = doc;
+ this.endOffset = 0;
+ this.document = doc;
+ updateCollapsedAndCommonAncestor(this);
+ }
+
+ createPrototypeRange(Range, updateBoundaries);
+
+ util.extend(Range, {
+ rangeProperties: rangeProperties,
+ RangeIterator: RangeIterator,
+ copyComparisonConstants: copyComparisonConstants,
+ createPrototypeRange: createPrototypeRange,
+ inspect: inspect,
+ toHtml: rangeToHtml,
+ getRangeDocument: getRangeDocument,
+ rangesEqual: function(r1, r2) {
+ return r1.startContainer === r2.startContainer &&
+ r1.startOffset === r2.startOffset &&
+ r1.endContainer === r2.endContainer &&
+ r1.endOffset === r2.endOffset;
+ }
+ });
+
+ api.DomRange = Range;
+ });
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // Wrappers for the browser's native DOM Range and/or TextRange implementation
+ api.createCoreModule("WrappedRange", ["DomRange"], function(api, module) {
+ var WrappedRange, WrappedTextRange;
+ var dom = api.dom;
+ var util = api.util;
+ var DomPosition = dom.DomPosition;
+ var DomRange = api.DomRange;
+ var getBody = dom.getBody;
+ var getContentDocument = dom.getContentDocument;
+ var isCharacterDataNode = dom.isCharacterDataNode;
+
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ if (api.features.implementsDomRange) {
+ // This is a wrapper around the browser's native DOM Range. It has two aims:
+ // - Provide workarounds for specific browser bugs
+ // - provide convenient extensions, which are inherited from Rangy's DomRange
+
+ (function() {
+ var rangeProto;
+ var rangeProperties = DomRange.rangeProperties;
+
+ function updateRangeProperties(range) {
+ var i = rangeProperties.length, prop;
+ while (i--) {
+ prop = rangeProperties[i];
+ range[prop] = range.nativeRange[prop];
+ }
+ // Fix for broken collapsed property in IE 9.
+ range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);
+ }
+
+ function updateNativeRange(range, startContainer, startOffset, endContainer, endOffset) {
+ var startMoved = (range.startContainer !== startContainer || range.startOffset != startOffset);
+ var endMoved = (range.endContainer !== endContainer || range.endOffset != endOffset);
+ var nativeRangeDifferent = !range.equals(range.nativeRange);
+
+ // Always set both boundaries for the benefit of IE9 (see issue 35)
+ if (startMoved || endMoved || nativeRangeDifferent) {
+ range.setEnd(endContainer, endOffset);
+ range.setStart(startContainer, startOffset);
+ }
+ }
+
+ var createBeforeAfterNodeSetter;
+
+ WrappedRange = function(range) {
+ if (!range) {
+ throw module.createError("WrappedRange: Range must be specified");
+ }
+ this.nativeRange = range;
+ updateRangeProperties(this);
+ };
+
+ DomRange.createPrototypeRange(WrappedRange, updateNativeRange);
+
+ rangeProto = WrappedRange.prototype;
+
+ rangeProto.selectNode = function(node) {
+ this.nativeRange.selectNode(node);
+ updateRangeProperties(this);
+ };
+
+ rangeProto.cloneContents = function() {
+ return this.nativeRange.cloneContents();
+ };
+
+ // Due to a long-standing Firefox bug that I have not been able to find a reliable way to detect,
+ // insertNode() is never delegated to the native range.
+
+ rangeProto.surroundContents = function(node) {
+ this.nativeRange.surroundContents(node);
+ updateRangeProperties(this);
+ };
+
+ rangeProto.collapse = function(isStart) {
+ this.nativeRange.collapse(isStart);
+ updateRangeProperties(this);
+ };
+
+ rangeProto.cloneRange = function() {
+ return new WrappedRange(this.nativeRange.cloneRange());
+ };
+
+ rangeProto.refresh = function() {
+ updateRangeProperties(this);
+ };
+
+ rangeProto.toString = function() {
+ return this.nativeRange.toString();
+ };
+
+ // Create test range and node for feature detection
+
+ var testTextNode = document.createTextNode("test");
+ getBody(document).appendChild(testTextNode);
+ var range = document.createRange();
+
+ /*--------------------------------------------------------------------------------------------------------*/
+
+ // Test for Firefox 2 bug that prevents moving the start of a Range to a point after its current end and
+ // correct for it
+
+ range.setStart(testTextNode, 0);
+ range.setEnd(testTextNode, 0);
+
+ try {
+ range.setStart(testTextNode, 1);
+
+ rangeProto.setStart = function(node, offset) {
+ this.nativeRange.setStart(node, offset);
+ updateRangeProperties(this);
+ };
+
+ rangeProto.setEnd = function(node, offset) {
+ this.nativeRange.setEnd(node, offset);
+ updateRangeProperties(this);
+ };
+
+ createBeforeAfterNodeSetter = function(name) {
+ return function(node) {
+ this.nativeRange[name](node);
+ updateRangeProperties(this);
+ };
+ };
+
+ } catch(ex) {
+
+ rangeProto.setStart = function(node, offset) {
+ try {
+ this.nativeRange.setStart(node, offset);
+ } catch (ex) {
+ this.nativeRange.setEnd(node, offset);
+ this.nativeRange.setStart(node, offset);
+ }
+ updateRangeProperties(this);
+ };
+
+ rangeProto.setEnd = function(node, offset) {
+ try {
+ this.nativeRange.setEnd(node, offset);
+ } catch (ex) {
+ this.nativeRange.setStart(node, offset);
+ this.nativeRange.setEnd(node, offset);
+ }
+ updateRangeProperties(this);
+ };
+
+ createBeforeAfterNodeSetter = function(name, oppositeName) {
+ return function(node) {
+ try {
+ this.nativeRange[name](node);
+ } catch (ex) {
+ this.nativeRange[oppositeName](node);
+ this.nativeRange[name](node);
+ }
+ updateRangeProperties(this);
+ };
+ };
+ }
+
+ rangeProto.setStartBefore = createBeforeAfterNodeSetter("setStartBefore", "setEndBefore");
+ rangeProto.setStartAfter = createBeforeAfterNodeSetter("setStartAfter", "setEndAfter");
+ rangeProto.setEndBefore = createBeforeAfterNodeSetter("setEndBefore", "setStartBefore");
+ rangeProto.setEndAfter = createBeforeAfterNodeSetter("setEndAfter", "setStartAfter");
+
+ /*--------------------------------------------------------------------------------------------------------*/
+
+ // Always use DOM4-compliant selectNodeContents implementation: it's simpler and less code than testing
+ // whether the native implementation can be trusted
+ rangeProto.selectNodeContents = function(node) {
+ this.setStartAndEnd(node, 0, dom.getNodeLength(node));
+ };
+
+ /*--------------------------------------------------------------------------------------------------------*/
+
+ // Test for and correct WebKit bug that has the behaviour of compareBoundaryPoints round the wrong way for
+ // constants START_TO_END and END_TO_START: https://bugs.webkit.org/show_bug.cgi?id=20738
+
+ range.selectNodeContents(testTextNode);
+ range.setEnd(testTextNode, 3);
+
+ var range2 = document.createRange();
+ range2.selectNodeContents(testTextNode);
+ range2.setEnd(testTextNode, 4);
+ range2.setStart(testTextNode, 2);
+
+ if (range.compareBoundaryPoints(range.START_TO_END, range2) == -1 &&
+ range.compareBoundaryPoints(range.END_TO_START, range2) == 1) {
+ // This is the wrong way round, so correct for it
+
+ rangeProto.compareBoundaryPoints = function(type, range) {
+ range = range.nativeRange || range;
+ if (type == range.START_TO_END) {
+ type = range.END_TO_START;
+ } else if (type == range.END_TO_START) {
+ type = range.START_TO_END;
+ }
+ return this.nativeRange.compareBoundaryPoints(type, range);
+ };
+ } else {
+ rangeProto.compareBoundaryPoints = function(type, range) {
+ return this.nativeRange.compareBoundaryPoints(type, range.nativeRange || range);
+ };
+ }
+
+ /*--------------------------------------------------------------------------------------------------------*/
+
+ // Test for IE deleteContents() and extractContents() bug and correct it. See issue 107.
+
+ var el = document.createElement("div");
+ el.innerHTML = "123";
+ var textNode = el.firstChild;
+ var body = getBody(document);
+ body.appendChild(el);
+
+ range.setStart(textNode, 1);
+ range.setEnd(textNode, 2);
+ range.deleteContents();
+
+ if (textNode.data == "13") {
+ // Behaviour is correct per DOM4 Range so wrap the browser's implementation of deleteContents() and
+ // extractContents()
+ rangeProto.deleteContents = function() {
+ this.nativeRange.deleteContents();
+ updateRangeProperties(this);
+ };
+
+ rangeProto.extractContents = function() {
+ var frag = this.nativeRange.extractContents();
+ updateRangeProperties(this);
+ return frag;
+ };
+ } else {
+ }
+
+ body.removeChild(el);
+ body = null;
+
+ /*--------------------------------------------------------------------------------------------------------*/
+
+ // Test for existence of createContextualFragment and delegate to it if it exists
+ if (util.isHostMethod(range, "createContextualFragment")) {
+ rangeProto.createContextualFragment = function(fragmentStr) {
+ return this.nativeRange.createContextualFragment(fragmentStr);
+ };
+ }
+
+ /*--------------------------------------------------------------------------------------------------------*/
+
+ // Clean up
+ getBody(document).removeChild(testTextNode);
+
+ rangeProto.getName = function() {
+ return "WrappedRange";
+ };
+
+ api.WrappedRange = WrappedRange;
+
+ api.createNativeRange = function(doc) {
+ doc = getContentDocument(doc, module, "createNativeRange");
+ return doc.createRange();
+ };
+ })();
+ }
+
+ if (api.features.implementsTextRange) {
+ /*
+ This is a workaround for a bug where IE returns the wrong container element from the TextRange's parentElement()
+ method. For example, in the following (where pipes denote the selection boundaries):
+
+ <ul id="ul"><li id="a">| a </li><li id="b"> b |</li></ul>
+
+ var range = document.selection.createRange();
+ alert(range.parentElement().id); // Should alert "ul" but alerts "b"
+
+ This method returns the common ancestor node of the following:
+ - the parentElement() of the textRange
+ - the parentElement() of the textRange after calling collapse(true)
+ - the parentElement() of the textRange after calling collapse(false)
+ */
+ var getTextRangeContainerElement = function(textRange) {
+ var parentEl = textRange.parentElement();
+ var range = textRange.duplicate();
+ range.collapse(true);
+ var startEl = range.parentElement();
+ range = textRange.duplicate();
+ range.collapse(false);
+ var endEl = range.parentElement();
+ var startEndContainer = (startEl == endEl) ? startEl : dom.getCommonAncestor(startEl, endEl);
+
+ return startEndContainer == parentEl ? startEndContainer : dom.getCommonAncestor(parentEl, startEndContainer);
+ };
+
+ var textRangeIsCollapsed = function(textRange) {
+ return textRange.compareEndPoints("StartToEnd", textRange) == 0;
+ };
+
+ // Gets the boundary of a TextRange expressed as a node and an offset within that node. This function started
+ // out as an improved version of code found in Tim Cameron Ryan's IERange (http://code.google.com/p/ierange/)
+ // but has grown, fixing problems with line breaks in preformatted text, adding workaround for IE TextRange
+ // bugs, handling for inputs and images, plus optimizations.
+ var getTextRangeBoundaryPosition = function(textRange, wholeRangeContainerElement, isStart, isCollapsed, startInfo) {
+ var workingRange = textRange.duplicate();
+ workingRange.collapse(isStart);
+ var containerElement = workingRange.parentElement();
+
+ // Sometimes collapsing a TextRange that's at the start of a text node can move it into the previous node, so
+ // check for that
+ if (!dom.isOrIsAncestorOf(wholeRangeContainerElement, containerElement)) {
+ containerElement = wholeRangeContainerElement;
+ }
+
+
+ // Deal with nodes that cannot "contain rich HTML markup". In practice, this means form inputs, images and
+ // similar. See http://msdn.microsoft.com/en-us/library/aa703950%28VS.85%29.aspx
+ if (!containerElement.canHaveHTML) {
+ var pos = new DomPosition(containerElement.parentNode, dom.getNodeIndex(containerElement));
+ return {
+ boundaryPosition: pos,
+ nodeInfo: {
+ nodeIndex: pos.offset,
+ containerElement: pos.node
+ }
+ };
+ }
+
+ var workingNode = dom.getDocument(containerElement).createElement("span");
+
+ // Workaround for HTML5 Shiv's insane violation of document.createElement(). See Rangy issue 104 and HTML5
+ // Shiv issue 64: https://github.com/aFarkas/html5shiv/issues/64
+ if (workingNode.parentNode) {
+ dom.removeNode(workingNode);
+ }
+
+ var comparison, workingComparisonType = isStart ? "StartToStart" : "StartToEnd";
+ var previousNode, nextNode, boundaryPosition, boundaryNode;
+ var start = (startInfo && startInfo.containerElement == containerElement) ? startInfo.nodeIndex : 0;
+ var childNodeCount = containerElement.childNodes.length;
+ var end = childNodeCount;
+
+ // Check end first. Code within the loop assumes that the endth child node of the container is definitely
+ // after the range boundary.
+ var nodeIndex = end;
+
+ while (true) {
+ if (nodeIndex == childNodeCount) {
+ containerElement.appendChild(workingNode);
+ } else {
+ containerElement.insertBefore(workingNode, containerElement.childNodes[nodeIndex]);
+ }
+ workingRange.moveToElementText(workingNode);
+ comparison = workingRange.compareEndPoints(workingComparisonType, textRange);
+ if (comparison == 0 || start == end) {
+ break;
+ } else if (comparison == -1) {
+ if (end == start + 1) {
+ // We know the endth child node is after the range boundary, so we must be done.
+ break;
+ } else {
+ start = nodeIndex;
+ }
+ } else {
+ end = (end == start + 1) ? start : nodeIndex;
+ }
+ nodeIndex = Math.floor((start + end) / 2);
+ containerElement.removeChild(workingNode);
+ }
+
+
+ // We've now reached or gone past the boundary of the text range we're interested in
+ // so have identified the node we want
+ boundaryNode = workingNode.nextSibling;
+
+ if (comparison == -1 && boundaryNode && isCharacterDataNode(boundaryNode)) {
+ // This is a character data node (text, comment, cdata). The working range is collapsed at the start of
+ // the node containing the text range's boundary, so we move the end of the working range to the
+ // boundary point and measure the length of its text to get the boundary's offset within the node.
+ workingRange.setEndPoint(isStart ? "EndToStart" : "EndToEnd", textRange);
+
+ var offset;
+
+ if (/[\r\n]/.test(boundaryNode.data)) {
+ /*
+ For the particular case of a boundary within a text node containing rendered line breaks (within a
+ <pre> element, for example), we need a slightly complicated approach to get the boundary's offset in
+ IE. The facts:
+
+ - Each line break is represented as \r in the text node's data/nodeValue properties
+ - Each line break is represented as \r\n in the TextRange's 'text' property
+ - The 'text' property of the TextRange does not contain trailing line breaks
+
+ To get round the problem presented by the final fact above, we can use the fact that TextRange's
+ moveStart() and moveEnd() methods return the actual number of characters moved, which is not
+ necessarily the same as the number of characters it was instructed to move. The simplest approach is
+ to use this to store the characters moved when moving both the start and end of the range to the
+ start of the document body and subtracting the start offset from the end offset (the
+ "move-negative-gazillion" method). However, this is extremely slow when the document is large and
+ the range is near the end of it. Clearly doing the mirror image (i.e. moving the range boundaries to
+ the end of the document) has the same problem.
+
+ Another approach that works is to use moveStart() to move the start boundary of the range up to the
+ end boundary one character at a time and incrementing a counter with the value returned by the
+ moveStart() call. However, the check for whether the start boundary has reached the end boundary is
+ expensive, so this method is slow (although unlike "move-negative-gazillion" is largely unaffected
+ by the location of the range within the document).
+
+ The approach used below is a hybrid of the two methods above. It uses the fact that a string
+ containing the TextRange's 'text' property with each \r\n converted to a single \r character cannot
+ be longer than the text of the TextRange, so the start of the range is moved that length initially
+ and then a character at a time to make up for any trailing line breaks not contained in the 'text'
+ property. This has good performance in most situations compared to the previous two methods.
+ */
+ var tempRange = workingRange.duplicate();
+ var rangeLength = tempRange.text.replace(/\r\n/g, "\r").length;
+
+ offset = tempRange.moveStart("character", rangeLength);
+ while ( (comparison = tempRange.compareEndPoints("StartToEnd", tempRange)) == -1) {
+ offset++;
+ tempRange.moveStart("character", 1);
+ }
+ } else {
+ offset = workingRange.text.length;
+ }
+ boundaryPosition = new DomPosition(boundaryNode, offset);
+ } else {
+
+ // If the boundary immediately follows a character data node and this is the end boundary, we should favour
+ // a position within that, and likewise for a start boundary preceding a character data node
+ previousNode = (isCollapsed || !isStart) && workingNode.previousSibling;
+ nextNode = (isCollapsed || isStart) && workingNode.nextSibling;
+ if (nextNode && isCharacterDataNode(nextNode)) {
+ boundaryPosition = new DomPosition(nextNode, 0);
+ } else if (previousNode && isCharacterDataNode(previousNode)) {
+ boundaryPosition = new DomPosition(previousNode, previousNode.data.length);
+ } else {
+ boundaryPosition = new DomPosition(containerElement, dom.getNodeIndex(workingNode));
+ }
+ }
+
+ // Clean up
+ dom.removeNode(workingNode);
+
+ return {
+ boundaryPosition: boundaryPosition,
+ nodeInfo: {
+ nodeIndex: nodeIndex,
+ containerElement: containerElement
+ }
+ };
+ };
+
+ // Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that
+ // node. This function started out as an optimized version of code found in Tim Cameron Ryan's IERange
+ // (http://code.google.com/p/ierange/)
+ var createBoundaryTextRange = function(boundaryPosition, isStart) {
+ var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset;
+ var doc = dom.getDocument(boundaryPosition.node);
+ var workingNode, childNodes, workingRange = getBody(doc).createTextRange();
+ var nodeIsDataNode = isCharacterDataNode(boundaryPosition.node);
+
+ if (nodeIsDataNode) {
+ boundaryNode = boundaryPosition.node;
+ boundaryParent = boundaryNode.parentNode;
+ } else {
+ childNodes = boundaryPosition.node.childNodes;
+ boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null;
+ boundaryParent = boundaryPosition.node;
+ }
+
+ // Position the range immediately before the node containing the boundary
+ workingNode = doc.createElement("span");
+
+ // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within
+ // the element rather than immediately before or after it
+ workingNode.innerHTML = "&#feff;";
+
+ // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report
+ // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12
+ if (boundaryNode) {
+ boundaryParent.insertBefore(workingNode, boundaryNode);
+ } else {
+ boundaryParent.appendChild(workingNode);
+ }
+
+ workingRange.moveToElementText(workingNode);
+ workingRange.collapse(!isStart);
+
+ // Clean up
+ boundaryParent.removeChild(workingNode);
+
+ // Move the working range to the text offset, if required
+ if (nodeIsDataNode) {
+ workingRange[isStart ? "moveStart" : "moveEnd"]("character", boundaryOffset);
+ }
+
+ return workingRange;
+ };
+
+ /*------------------------------------------------------------------------------------------------------------*/
+
+ // This is a wrapper around a TextRange, providing full DOM Range functionality using rangy's DomRange as a
+ // prototype
+
+ WrappedTextRange = function(textRange) {
+ this.textRange = textRange;
+ this.refresh();
+ };
+
+ WrappedTextRange.prototype = new DomRange(document);
+
+ WrappedTextRange.prototype.refresh = function() {
+ var start, end, startBoundary;
+
+ // TextRange's parentElement() method cannot be trusted. getTextRangeContainerElement() works around that.
+ var rangeContainerElement = getTextRangeContainerElement(this.textRange);
+
+ if (textRangeIsCollapsed(this.textRange)) {
+ end = start = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true,
+ true).boundaryPosition;
+ } else {
+ startBoundary = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true, false);
+ start = startBoundary.boundaryPosition;
+
+ // An optimization used here is that if the start and end boundaries have the same parent element, the
+ // search scope for the end boundary can be limited to exclude the portion of the element that precedes
+ // the start boundary
+ end = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, false, false,
+ startBoundary.nodeInfo).boundaryPosition;
+ }
+
+ this.setStart(start.node, start.offset);
+ this.setEnd(end.node, end.offset);
+ };
+
+ WrappedTextRange.prototype.getName = function() {
+ return "WrappedTextRange";
+ };
+
+ DomRange.copyComparisonConstants(WrappedTextRange);
+
+ var rangeToTextRange = function(range) {
+ if (range.collapsed) {
+ return createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);
+ } else {
+ var startRange = createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);
+ var endRange = createBoundaryTextRange(new DomPosition(range.endContainer, range.endOffset), false);
+ var textRange = getBody( DomRange.getRangeDocument(range) ).createTextRange();
+ textRange.setEndPoint("StartToStart", startRange);
+ textRange.setEndPoint("EndToEnd", endRange);
+ return textRange;
+ }
+ };
+
+ WrappedTextRange.rangeToTextRange = rangeToTextRange;
+
+ WrappedTextRange.prototype.toTextRange = function() {
+ return rangeToTextRange(this);
+ };
+
+ api.WrappedTextRange = WrappedTextRange;
+
+ // IE 9 and above have both implementations and Rangy makes both available. The next few lines sets which
+ // implementation to use by default.
+ if (!api.features.implementsDomRange || api.config.preferTextRange) {
+ // Add WrappedTextRange as the Range property of the global object to allow expression like Range.END_TO_END to work
+ var globalObj = (function(f) { return f("return this;")(); })(Function);
+ if (typeof globalObj.Range == "undefined") {
+ globalObj.Range = WrappedTextRange;
+ }
+
+ api.createNativeRange = function(doc) {
+ doc = getContentDocument(doc, module, "createNativeRange");
+ return getBody(doc).createTextRange();
+ };
+
+ api.WrappedRange = WrappedTextRange;
+ }
+ }
+
+ api.createRange = function(doc) {
+ doc = getContentDocument(doc, module, "createRange");
+ return new api.WrappedRange(api.createNativeRange(doc));
+ };
+
+ api.createRangyRange = function(doc) {
+ doc = getContentDocument(doc, module, "createRangyRange");
+ return new DomRange(doc);
+ };
+
+ util.createAliasForDeprecatedMethod(api, "createIframeRange", "createRange");
+ util.createAliasForDeprecatedMethod(api, "createIframeRangyRange", "createRangyRange");
+
+ api.addShimListener(function(win) {
+ var doc = win.document;
+ if (typeof doc.createRange == "undefined") {
+ doc.createRange = function() {
+ return api.createRange(doc);
+ };
+ }
+ doc = win = null;
+ });
+ });
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // This module creates a selection object wrapper that conforms as closely as possible to the Selection specification
+ // in the HTML Editing spec (http://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#selections)
+ api.createCoreModule("WrappedSelection", ["DomRange", "WrappedRange"], function(api, module) {
+ api.config.checkSelectionRanges = true;
+
+ var BOOLEAN = "boolean";
+ var NUMBER = "number";
+ var dom = api.dom;
+ var util = api.util;
+ var isHostMethod = util.isHostMethod;
+ var DomRange = api.DomRange;
+ var WrappedRange = api.WrappedRange;
+ var DOMException = api.DOMException;
+ var DomPosition = dom.DomPosition;
+ var getNativeSelection;
+ var selectionIsCollapsed;
+ var features = api.features;
+ var CONTROL = "Control";
+ var getDocument = dom.getDocument;
+ var getBody = dom.getBody;
+ var rangesEqual = DomRange.rangesEqual;
+
+
+ // Utility function to support direction parameters in the API that may be a string ("backward", "backwards",
+ // "forward" or "forwards") or a Boolean (true for backwards).
+ function isDirectionBackward(dir) {
+ return (typeof dir == "string") ? /^backward(s)?$/i.test(dir) : !!dir;
+ }
+
+ function getWindow(win, methodName) {
+ if (!win) {
+ return window;
+ } else if (dom.isWindow(win)) {
+ return win;
+ } else if (win instanceof WrappedSelection) {
+ return win.win;
+ } else {
+ var doc = dom.getContentDocument(win, module, methodName);
+ return dom.getWindow(doc);
+ }
+ }
+
+ function getWinSelection(winParam) {
+ return getWindow(winParam, "getWinSelection").getSelection();
+ }
+
+ function getDocSelection(winParam) {
+ return getWindow(winParam, "getDocSelection").document.selection;
+ }
+
+ function winSelectionIsBackward(sel) {
+ var backward = false;
+ if (sel.anchorNode) {
+ backward = (dom.comparePoints(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset) == 1);
+ }
+ return backward;
+ }
+
+ // Test for the Range/TextRange and Selection features required
+ // Test for ability to retrieve selection
+ var implementsWinGetSelection = isHostMethod(window, "getSelection"),
+ implementsDocSelection = util.isHostObject(document, "selection");
+
+ features.implementsWinGetSelection = implementsWinGetSelection;
+ features.implementsDocSelection = implementsDocSelection;
+
+ var useDocumentSelection = implementsDocSelection && (!implementsWinGetSelection || api.config.preferTextRange);
+
+ if (useDocumentSelection) {
+ getNativeSelection = getDocSelection;
+ api.isSelectionValid = function(winParam) {
+ var doc = getWindow(winParam, "isSelectionValid").document, nativeSel = doc.selection;
+
+ // Check whether the selection TextRange is actually contained within the correct document
+ return (nativeSel.type != "None" || getDocument(nativeSel.createRange().parentElement()) == doc);
+ };
+ } else if (implementsWinGetSelection) {
+ getNativeSelection = getWinSelection;
+ api.isSelectionValid = function() {
+ return true;
+ };
+ } else {
+ module.fail("Neither document.selection or window.getSelection() detected.");
+ return false;
+ }
+
+ api.getNativeSelection = getNativeSelection;
+
+ var testSelection = getNativeSelection();
+
+ // In Firefox, the selection is null in an iframe with display: none. See issue #138.
+ if (!testSelection) {
+ module.fail("Native selection was null (possibly issue 138?)");
+ return false;
+ }
+
+ var testRange = api.createNativeRange(document);
+ var body = getBody(document);
+
+ // Obtaining a range from a selection
+ var selectionHasAnchorAndFocus = util.areHostProperties(testSelection,
+ ["anchorNode", "focusNode", "anchorOffset", "focusOffset"]);
+
+ features.selectionHasAnchorAndFocus = selectionHasAnchorAndFocus;
+
+ // Test for existence of native selection extend() method
+ var selectionHasExtend = isHostMethod(testSelection, "extend");
+ features.selectionHasExtend = selectionHasExtend;
+
+ // Test if rangeCount exists
+ var selectionHasRangeCount = (typeof testSelection.rangeCount == NUMBER);
+ features.selectionHasRangeCount = selectionHasRangeCount;
+
+ var selectionSupportsMultipleRanges = false;
+ var collapsedNonEditableSelectionsSupported = true;
+
+ var addRangeBackwardToNative = selectionHasExtend ?
+ function(nativeSelection, range) {
+ var doc = DomRange.getRangeDocument(range);
+ var endRange = api.createRange(doc);
+ endRange.collapseToPoint(range.endContainer, range.endOffset);
+ nativeSelection.addRange(getNativeRange(endRange));
+ nativeSelection.extend(range.startContainer, range.startOffset);
+ } : null;
+
+ if (util.areHostMethods(testSelection, ["addRange", "getRangeAt", "removeAllRanges"]) &&
+ typeof testSelection.rangeCount == NUMBER && features.implementsDomRange) {
+
+ (function() {
+ // Previously an iframe was used but this caused problems in some circumstances in IE, so tests are
+ // performed on the current document's selection. See issue 109.
+
+ // Note also that if a selection previously existed, it is wiped and later restored by these tests. This
+ // will result in the selection direction begin reversed if the original selection was backwards and the
+ // browser does not support setting backwards selections (Internet Explorer, I'm looking at you).
+ var sel = window.getSelection();
+ if (sel) {
+ // Store the current selection
+ var originalSelectionRangeCount = sel.rangeCount;
+ var selectionHasMultipleRanges = (originalSelectionRangeCount > 1);
+ var originalSelectionRanges = [];
+ var originalSelectionBackward = winSelectionIsBackward(sel);
+ for (var i = 0; i < originalSelectionRangeCount; ++i) {
+ originalSelectionRanges[i] = sel.getRangeAt(i);
+ }
+
+ // Create some test elements
+ var testEl = dom.createTestElement(document, "", false);
+ var textNode = testEl.appendChild( document.createTextNode("\u00a0\u00a0\u00a0") );
+
+ // Test whether the native selection will allow a collapsed selection within a non-editable element
+ var r1 = document.createRange();
+
+ r1.setStart(textNode, 1);
+ r1.collapse(true);
+ sel.removeAllRanges();
+ sel.addRange(r1);
+ collapsedNonEditableSelectionsSupported = (sel.rangeCount == 1);
+ sel.removeAllRanges();
+
+ // Test whether the native selection is capable of supporting multiple ranges.
+ if (!selectionHasMultipleRanges) {
+ // Doing the original feature test here in Chrome 36 (and presumably later versions) prints a
+ // console error of "Discontiguous selection is not supported." that cannot be suppressed. There's
+ // nothing we can do about this while retaining the feature test so we have to resort to a browser
+ // sniff. I'm not happy about it. See
+ // https://code.google.com/p/chromium/issues/detail?id=399791
+ var chromeMatch = window.navigator.appVersion.match(/Chrome\/(.*?) /);
+ if (chromeMatch && parseInt(chromeMatch[1]) >= 36) {
+ selectionSupportsMultipleRanges = false;
+ } else {
+ var r2 = r1.cloneRange();
+ r1.setStart(textNode, 0);
+ r2.setEnd(textNode, 3);
+ r2.setStart(textNode, 2);
+ sel.addRange(r1);
+ sel.addRange(r2);
+ selectionSupportsMultipleRanges = (sel.rangeCount == 2);
+ }
+ }
+
+ // Clean up
+ dom.removeNode(testEl);
+ sel.removeAllRanges();
+
+ for (i = 0; i < originalSelectionRangeCount; ++i) {
+ if (i == 0 && originalSelectionBackward) {
+ if (addRangeBackwardToNative) {
+ addRangeBackwardToNative(sel, originalSelectionRanges[i]);
+ } else {
+ api.warn("Rangy initialization: original selection was backwards but selection has been restored forwards because the browser does not support Selection.extend");
+ sel.addRange(originalSelectionRanges[i]);
+ }
+ } else {
+ sel.addRange(originalSelectionRanges[i]);
+ }
+ }
+ }
+ })();
+ }
+
+ features.selectionSupportsMultipleRanges = selectionSupportsMultipleRanges;
+ features.collapsedNonEditableSelectionsSupported = collapsedNonEditableSelectionsSupported;
+
+ // ControlRanges
+ var implementsControlRange = false, testControlRange;
+
+ if (body && isHostMethod(body, "createControlRange")) {
+ testControlRange = body.createControlRange();
+ if (util.areHostProperties(testControlRange, ["item", "add"])) {
+ implementsControlRange = true;
+ }
+ }
+ features.implementsControlRange = implementsControlRange;
+
+ // Selection collapsedness
+ if (selectionHasAnchorAndFocus) {
+ selectionIsCollapsed = function(sel) {
+ return sel.anchorNode === sel.focusNode && sel.anchorOffset === sel.focusOffset;
+ };
+ } else {
+ selectionIsCollapsed = function(sel) {
+ return sel.rangeCount ? sel.getRangeAt(sel.rangeCount - 1).collapsed : false;
+ };
+ }
+
+ function updateAnchorAndFocusFromRange(sel, range, backward) {
+ var anchorPrefix = backward ? "end" : "start", focusPrefix = backward ? "start" : "end";
+ sel.anchorNode = range[anchorPrefix + "Container"];
+ sel.anchorOffset = range[anchorPrefix + "Offset"];
+ sel.focusNode = range[focusPrefix + "Container"];
+ sel.focusOffset = range[focusPrefix + "Offset"];
+ }
+
+ function updateAnchorAndFocusFromNativeSelection(sel) {
+ var nativeSel = sel.nativeSelection;
+ sel.anchorNode = nativeSel.anchorNode;
+ sel.anchorOffset = nativeSel.anchorOffset;
+ sel.focusNode = nativeSel.focusNode;
+ sel.focusOffset = nativeSel.focusOffset;
+ }
+
+ function updateEmptySelection(sel) {
+ sel.anchorNode = sel.focusNode = null;
+ sel.anchorOffset = sel.focusOffset = 0;
+ sel.rangeCount = 0;
+ sel.isCollapsed = true;
+ sel._ranges.length = 0;
+ }
+
+ function getNativeRange(range) {
+ var nativeRange;
+ if (range instanceof DomRange) {
+ nativeRange = api.createNativeRange(range.getDocument());
+ nativeRange.setEnd(range.endContainer, range.endOffset);
+ nativeRange.setStart(range.startContainer, range.startOffset);
+ } else if (range instanceof WrappedRange) {
+ nativeRange = range.nativeRange;
+ } else if (features.implementsDomRange && (range instanceof dom.getWindow(range.startContainer).Range)) {
+ nativeRange = range;
+ }
+ return nativeRange;
+ }
+
+ function rangeContainsSingleElement(rangeNodes) {
+ if (!rangeNodes.length || rangeNodes[0].nodeType != 1) {
+ return false;
+ }
+ for (var i = 1, len = rangeNodes.length; i < len; ++i) {
+ if (!dom.isAncestorOf(rangeNodes[0], rangeNodes[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function getSingleElementFromRange(range) {
+ var nodes = range.getNodes();
+ if (!rangeContainsSingleElement(nodes)) {
+ throw module.createError("getSingleElementFromRange: range " + range.inspect() + " did not consist of a single element");
+ }
+ return nodes[0];
+ }
+
+ // Simple, quick test which only needs to distinguish between a TextRange and a ControlRange
+ function isTextRange(range) {
+ return !!range && typeof range.text != "undefined";
+ }
+
+ function updateFromTextRange(sel, range) {
+ // Create a Range from the selected TextRange
+ var wrappedRange = new WrappedRange(range);
+ sel._ranges = [wrappedRange];
+
+ updateAnchorAndFocusFromRange(sel, wrappedRange, false);
+ sel.rangeCount = 1;
+ sel.isCollapsed = wrappedRange.collapsed;
+ }
+
+ function updateControlSelection(sel) {
+ // Update the wrapped selection based on what's now in the native selection
+ sel._ranges.length = 0;
+ if (sel.docSelection.type == "None") {
+ updateEmptySelection(sel);
+ } else {
+ var controlRange = sel.docSelection.createRange();
+ if (isTextRange(controlRange)) {
+ // This case (where the selection type is "Control" and calling createRange() on the selection returns
+ // a TextRange) can happen in IE 9. It happens, for example, when all elements in the selected
+ // ControlRange have been removed from the ControlRange and removed from the document.
+ updateFromTextRange(sel, controlRange);
+ } else {
+ sel.rangeCount = controlRange.length;
+ var range, doc = getDocument(controlRange.item(0));
+ for (var i = 0; i < sel.rangeCount; ++i) {
+ range = api.createRange(doc);
+ range.selectNode(controlRange.item(i));
+ sel._ranges.push(range);
+ }
+ sel.isCollapsed = sel.rangeCount == 1 && sel._ranges[0].collapsed;
+ updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], false);
+ }
+ }
+ }
+
+ function addRangeToControlSelection(sel, range) {
+ var controlRange = sel.docSelection.createRange();
+ var rangeElement = getSingleElementFromRange(range);
+
+ // Create a new ControlRange containing all the elements in the selected ControlRange plus the element
+ // contained by the supplied range
+ var doc = getDocument(controlRange.item(0));
+ var newControlRange = getBody(doc).createControlRange();
+ for (var i = 0, len = controlRange.length; i < len; ++i) {
+ newControlRange.add(controlRange.item(i));
+ }
+ try {
+ newControlRange.add(rangeElement);
+ } catch (ex) {
+ throw module.createError("addRange(): Element within the specified Range could not be added to control selection (does it have layout?)");
+ }
+ newControlRange.select();
+
+ // Update the wrapped selection based on what's now in the native selection
+ updateControlSelection(sel);
+ }
+
+ var getSelectionRangeAt;
+
+ if (isHostMethod(testSelection, "getRangeAt")) {
+ // try/catch is present because getRangeAt() must have thrown an error in some browser and some situation.
+ // Unfortunately, I didn't write a comment about the specifics and am now scared to take it out. Let that be a
+ // lesson to us all, especially me.
+ getSelectionRangeAt = function(sel, index) {
+ try {
+ return sel.getRangeAt(index);
+ } catch (ex) {
+ return null;
+ }
+ };
+ } else if (selectionHasAnchorAndFocus) {
+ getSelectionRangeAt = function(sel) {
+ var doc = getDocument(sel.anchorNode);
+ var range = api.createRange(doc);
+ range.setStartAndEnd(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset);
+
+ // Handle the case when the selection was selected backwards (from the end to the start in the
+ // document)
+ if (range.collapsed !== this.isCollapsed) {
+ range.setStartAndEnd(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset);
+ }
+
+ return range;
+ };
+ }
+
+ function WrappedSelection(selection, docSelection, win) {
+ this.nativeSelection = selection;
+ this.docSelection = docSelection;
+ this._ranges = [];
+ this.win = win;
+ this.refresh();
+ }
+
+ WrappedSelection.prototype = api.selectionPrototype;
+
+ function deleteProperties(sel) {
+ sel.win = sel.anchorNode = sel.focusNode = sel._ranges = null;
+ sel.rangeCount = sel.anchorOffset = sel.focusOffset = 0;
+ sel.detached = true;
+ }
+
+ var cachedRangySelections = [];
+
+ function actOnCachedSelection(win, action) {
+ var i = cachedRangySelections.length, cached, sel;
+ while (i--) {
+ cached = cachedRangySelections[i];
+ sel = cached.selection;
+ if (action == "deleteAll") {
+ deleteProperties(sel);
+ } else if (cached.win == win) {
+ if (action == "delete") {
+ cachedRangySelections.splice(i, 1);
+ return true;
+ } else {
+ return sel;
+ }
+ }
+ }
+ if (action == "deleteAll") {
+ cachedRangySelections.length = 0;
+ }
+ return null;
+ }
+
+ var getSelection = function(win) {
+ // Check if the parameter is a Rangy Selection object
+ if (win && win instanceof WrappedSelection) {
+ win.refresh();
+ return win;
+ }
+
+ win = getWindow(win, "getNativeSelection");
+
+ var sel = actOnCachedSelection(win);
+ var nativeSel = getNativeSelection(win), docSel = implementsDocSelection ? getDocSelection(win) : null;
+ if (sel) {
+ sel.nativeSelection = nativeSel;
+ sel.docSelection = docSel;
+ sel.refresh();
+ } else {
+ sel = new WrappedSelection(nativeSel, docSel, win);
+ cachedRangySelections.push( { win: win, selection: sel } );
+ }
+ return sel;
+ };
+
+ api.getSelection = getSelection;
+
+ util.createAliasForDeprecatedMethod(api, "getIframeSelection", "getSelection");
+
+ var selProto = WrappedSelection.prototype;
+
+ function createControlSelection(sel, ranges) {
+ // Ensure that the selection becomes of type "Control"
+ var doc = getDocument(ranges[0].startContainer);
+ var controlRange = getBody(doc).createControlRange();
+ for (var i = 0, el, len = ranges.length; i < len; ++i) {
+ el = getSingleElementFromRange(ranges[i]);
+ try {
+ controlRange.add(el);
+ } catch (ex) {
+ throw module.createError("setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)");
+ }
+ }
+ controlRange.select();
+
+ // Update the wrapped selection based on what's now in the native selection
+ updateControlSelection(sel);
+ }
+
+ // Selecting a range
+ if (!useDocumentSelection && selectionHasAnchorAndFocus && util.areHostMethods(testSelection, ["removeAllRanges", "addRange"])) {
+ selProto.removeAllRanges = function() {
+ this.nativeSelection.removeAllRanges();
+ updateEmptySelection(this);
+ };
+
+ var addRangeBackward = function(sel, range) {
+ addRangeBackwardToNative(sel.nativeSelection, range);
+ sel.refresh();
+ };
+
+ if (selectionHasRangeCount) {
+ selProto.addRange = function(range, direction) {
+ if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {
+ addRangeToControlSelection(this, range);
+ } else {
+ if (isDirectionBackward(direction) && selectionHasExtend) {
+ addRangeBackward(this, range);
+ } else {
+ var previousRangeCount;
+ if (selectionSupportsMultipleRanges) {
+ previousRangeCount = this.rangeCount;
+ } else {
+ this.removeAllRanges();
+ previousRangeCount = 0;
+ }
+ // Clone the native range so that changing the selected range does not affect the selection.
+ // This is contrary to the spec but is the only way to achieve consistency between browsers. See
+ // issue 80.
+ var clonedNativeRange = getNativeRange(range).cloneRange();
+ try {
+ this.nativeSelection.addRange(clonedNativeRange);
+ } catch (ex) {
+ }
+
+ // Check whether adding the range was successful
+ this.rangeCount = this.nativeSelection.rangeCount;
+
+ if (this.rangeCount == previousRangeCount + 1) {
+ // The range was added successfully
+
+ // Check whether the range that we added to the selection is reflected in the last range extracted from
+ // the selection
+ if (api.config.checkSelectionRanges) {
+ var nativeRange = getSelectionRangeAt(this.nativeSelection, this.rangeCount - 1);
+ if (nativeRange && !rangesEqual(nativeRange, range)) {
+ // Happens in WebKit with, for example, a selection placed at the start of a text node
+ range = new WrappedRange(nativeRange);
+ }
+ }
+ this._ranges[this.rangeCount - 1] = range;
+ updateAnchorAndFocusFromRange(this, range, selectionIsBackward(this.nativeSelection));
+ this.isCollapsed = selectionIsCollapsed(this);
+ } else {
+ // The range was not added successfully. The simplest thing is to refresh
+ this.refresh();
+ }
+ }
+ }
+ };
+ } else {
+ selProto.addRange = function(range, direction) {
+ if (isDirectionBackward(direction) && selectionHasExtend) {
+ addRangeBackward(this, range);
+ } else {
+ this.nativeSelection.addRange(getNativeRange(range));
+ this.refresh();
+ }
+ };
+ }
+
+ selProto.setRanges = function(ranges) {
+ if (implementsControlRange && implementsDocSelection && ranges.length > 1) {
+ createControlSelection(this, ranges);
+ } else {
+ this.removeAllRanges();
+ for (var i = 0, len = ranges.length; i < len; ++i) {
+ this.addRange(ranges[i]);
+ }
+ }
+ };
+ } else if (isHostMethod(testSelection, "empty") && isHostMethod(testRange, "select") &&
+ implementsControlRange && useDocumentSelection) {
+
+ selProto.removeAllRanges = function() {
+ // Added try/catch as fix for issue #21
+ try {
+ this.docSelection.empty();
+
+ // Check for empty() not working (issue #24)
+ if (this.docSelection.type != "None") {
+ // Work around failure to empty a control selection by instead selecting a TextRange and then
+ // calling empty()
+ var doc;
+ if (this.anchorNode) {
+ doc = getDocument(this.anchorNode);
+ } else if (this.docSelection.type == CONTROL) {
+ var controlRange = this.docSelection.createRange();
+ if (controlRange.length) {
+ doc = getDocument( controlRange.item(0) );
+ }
+ }
+ if (doc) {
+ var textRange = getBody(doc).createTextRange();
+ textRange.select();
+ this.docSelection.empty();
+ }
+ }
+ } catch(ex) {}
+ updateEmptySelection(this);
+ };
+
+ selProto.addRange = function(range) {
+ if (this.docSelection.type == CONTROL) {
+ addRangeToControlSelection(this, range);
+ } else {
+ api.WrappedTextRange.rangeToTextRange(range).select();
+ this._ranges[0] = range;
+ this.rangeCount = 1;
+ this.isCollapsed = this._ranges[0].collapsed;
+ updateAnchorAndFocusFromRange(this, range, false);
+ }
+ };
+
+ selProto.setRanges = function(ranges) {
+ this.removeAllRanges();
+ var rangeCount = ranges.length;
+ if (rangeCount > 1) {
+ createControlSelection(this, ranges);
+ } else if (rangeCount) {
+ this.addRange(ranges[0]);
+ }
+ };
+ } else {
+ module.fail("No means of selecting a Range or TextRange was found");
+ return false;
+ }
+
+ selProto.getRangeAt = function(index) {
+ if (index < 0 || index >= this.rangeCount) {
+ throw new DOMException("INDEX_SIZE_ERR");
+ } else {
+ // Clone the range to preserve selection-range independence. See issue 80.
+ return this._ranges[index].cloneRange();
+ }
+ };
+
+ var refreshSelection;
+
+ if (useDocumentSelection) {
+ refreshSelection = function(sel) {
+ var range;
+ if (api.isSelectionValid(sel.win)) {
+ range = sel.docSelection.createRange();
+ } else {
+ range = getBody(sel.win.document).createTextRange();
+ range.collapse(true);
+ }
+
+ if (sel.docSelection.type == CONTROL) {
+ updateControlSelection(sel);
+ } else if (isTextRange(range)) {
+ updateFromTextRange(sel, range);
+ } else {
+ updateEmptySelection(sel);
+ }
+ };
+ } else if (isHostMethod(testSelection, "getRangeAt") && typeof testSelection.rangeCount == NUMBER) {
+ refreshSelection = function(sel) {
+ if (implementsControlRange && implementsDocSelection && sel.docSelection.type == CONTROL) {
+ updateControlSelection(sel);
+ } else {
+ sel._ranges.length = sel.rangeCount = sel.nativeSelection.rangeCount;
+ if (sel.rangeCount) {
+ for (var i = 0, len = sel.rangeCount; i < len; ++i) {
+ sel._ranges[i] = new api.WrappedRange(sel.nativeSelection.getRangeAt(i));
+ }
+ updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], selectionIsBackward(sel.nativeSelection));
+ sel.isCollapsed = selectionIsCollapsed(sel);
+ } else {
+ updateEmptySelection(sel);
+ }
+ }
+ };
+ } else if (selectionHasAnchorAndFocus && typeof testSelection.isCollapsed == BOOLEAN && typeof testRange.collapsed == BOOLEAN && features.implementsDomRange) {
+ refreshSelection = function(sel) {
+ var range, nativeSel = sel.nativeSelection;
+ if (nativeSel.anchorNode) {
+ range = getSelectionRangeAt(nativeSel, 0);
+ sel._ranges = [range];
+ sel.rangeCount = 1;
+ updateAnchorAndFocusFromNativeSelection(sel);
+ sel.isCollapsed = selectionIsCollapsed(sel);
+ } else {
+ updateEmptySelection(sel);
+ }
+ };
+ } else {
+ module.fail("No means of obtaining a Range or TextRange from the user's selection was found");
+ return false;
+ }
+
+ selProto.refresh = function(checkForChanges) {
+ var oldRanges = checkForChanges ? this._ranges.slice(0) : null;
+ var oldAnchorNode = this.anchorNode, oldAnchorOffset = this.anchorOffset;
+
+ refreshSelection(this);
+ if (checkForChanges) {
+ // Check the range count first
+ var i = oldRanges.length;
+ if (i != this._ranges.length) {
+ return true;
+ }
+
+ // Now check the direction. Checking the anchor position is the same is enough since we're checking all the
+ // ranges after this
+ if (this.anchorNode != oldAnchorNode || this.anchorOffset != oldAnchorOffset) {
+ return true;
+ }
+
+ // Finally, compare each range in turn
+ while (i--) {
+ if (!rangesEqual(oldRanges[i], this._ranges[i])) {
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+
+ // Removal of a single range
+ var removeRangeManually = function(sel, range) {
+ var ranges = sel.getAllRanges();
+ sel.removeAllRanges();
+ for (var i = 0, len = ranges.length; i < len; ++i) {
+ if (!rangesEqual(range, ranges[i])) {
+ sel.addRange(ranges[i]);
+ }
+ }
+ if (!sel.rangeCount) {
+ updateEmptySelection(sel);
+ }
+ };
+
+ if (implementsControlRange && implementsDocSelection) {
+ selProto.removeRange = function(range) {
+ if (this.docSelection.type == CONTROL) {
+ var controlRange = this.docSelection.createRange();
+ var rangeElement = getSingleElementFromRange(range);
+
+ // Create a new ControlRange containing all the elements in the selected ControlRange minus the
+ // element contained by the supplied range
+ var doc = getDocument(controlRange.item(0));
+ var newControlRange = getBody(doc).createControlRange();
+ var el, removed = false;
+ for (var i = 0, len = controlRange.length; i < len; ++i) {
+ el = controlRange.item(i);
+ if (el !== rangeElement || removed) {
+ newControlRange.add(controlRange.item(i));
+ } else {
+ removed = true;
+ }
+ }
+ newControlRange.select();
+
+ // Update the wrapped selection based on what's now in the native selection
+ updateControlSelection(this);
+ } else {
+ removeRangeManually(this, range);
+ }
+ };
+ } else {
+ selProto.removeRange = function(range) {
+ removeRangeManually(this, range);
+ };
+ }
+
+ // Detecting if a selection is backward
+ var selectionIsBackward;
+ if (!useDocumentSelection && selectionHasAnchorAndFocus && features.implementsDomRange) {
+ selectionIsBackward = winSelectionIsBackward;
+
+ selProto.isBackward = function() {
+ return selectionIsBackward(this);
+ };
+ } else {
+ selectionIsBackward = selProto.isBackward = function() {
+ return false;
+ };
+ }
+
+ // Create an alias for backwards compatibility. From 1.3, everything is "backward" rather than "backwards"
+ selProto.isBackwards = selProto.isBackward;
+
+ // Selection stringifier
+ // This is conformant to the old HTML5 selections draft spec but differs from WebKit and Mozilla's implementation.
+ // The current spec does not yet define this method.
+ selProto.toString = function() {
+ var rangeTexts = [];
+ for (var i = 0, len = this.rangeCount; i < len; ++i) {
+ rangeTexts[i] = "" + this._ranges[i];
+ }
+ return rangeTexts.join("");
+ };
+
+ function assertNodeInSameDocument(sel, node) {
+ if (sel.win.document != getDocument(node)) {
+ throw new DOMException("WRONG_DOCUMENT_ERR");
+ }
+ }
+
+ // No current browser conforms fully to the spec for this method, so Rangy's own method is always used
+ selProto.collapse = function(node, offset) {
+ assertNodeInSameDocument(this, node);
+ var range = api.createRange(node);
+ range.collapseToPoint(node, offset);
+ this.setSingleRange(range);
+ this.isCollapsed = true;
+ };
+
+ selProto.collapseToStart = function() {
+ if (this.rangeCount) {
+ var range = this._ranges[0];
+ this.collapse(range.startContainer, range.startOffset);
+ } else {
+ throw new DOMException("INVALID_STATE_ERR");
+ }
+ };
+
+ selProto.collapseToEnd = function() {
+ if (this.rangeCount) {
+ var range = this._ranges[this.rangeCount - 1];
+ this.collapse(range.endContainer, range.endOffset);
+ } else {
+ throw new DOMException("INVALID_STATE_ERR");
+ }
+ };
+
+ // The spec is very specific on how selectAllChildren should be implemented and not all browsers implement it as
+ // specified so the native implementation is never used by Rangy.
+ selProto.selectAllChildren = function(node) {
+ assertNodeInSameDocument(this, node);
+ var range = api.createRange(node);
+ range.selectNodeContents(node);
+ this.setSingleRange(range);
+ };
+
+ selProto.deleteFromDocument = function() {
+ // Sepcial behaviour required for IE's control selections
+ if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {
+ var controlRange = this.docSelection.createRange();
+ var element;
+ while (controlRange.length) {
+ element = controlRange.item(0);
+ controlRange.remove(element);
+ dom.removeNode(element);
+ }
+ this.refresh();
+ } else if (this.rangeCount) {
+ var ranges = this.getAllRanges();
+ if (ranges.length) {
+ this.removeAllRanges();
+ for (var i = 0, len = ranges.length; i < len; ++i) {
+ ranges[i].deleteContents();
+ }
+ // The spec says nothing about what the selection should contain after calling deleteContents on each
+ // range. Firefox moves the selection to where the final selected range was, so we emulate that
+ this.addRange(ranges[len - 1]);
+ }
+ }
+ };
+
+ // The following are non-standard extensions
+ selProto.eachRange = function(func, returnValue) {
+ for (var i = 0, len = this._ranges.length; i < len; ++i) {
+ if ( func( this.getRangeAt(i) ) ) {
+ return returnValue;
+ }
+ }
+ };
+
+ selProto.getAllRanges = function() {
+ var ranges = [];
+ this.eachRange(function(range) {
+ ranges.push(range);
+ });
+ return ranges;
+ };
+
+ selProto.setSingleRange = function(range, direction) {
+ this.removeAllRanges();
+ this.addRange(range, direction);
+ };
+
+ selProto.callMethodOnEachRange = function(methodName, params) {
+ var results = [];
+ this.eachRange( function(range) {
+ results.push( range[methodName].apply(range, params || []) );
+ } );
+ return results;
+ };
+
+ function createStartOrEndSetter(isStart) {
+ return function(node, offset) {
+ var range;
+ if (this.rangeCount) {
+ range = this.getRangeAt(0);
+ range["set" + (isStart ? "Start" : "End")](node, offset);
+ } else {
+ range = api.createRange(this.win.document);
+ range.setStartAndEnd(node, offset);
+ }
+ this.setSingleRange(range, this.isBackward());
+ };
+ }
+
+ selProto.setStart = createStartOrEndSetter(true);
+ selProto.setEnd = createStartOrEndSetter(false);
+
+ // Add select() method to Range prototype. Any existing selection will be removed.
+ api.rangePrototype.select = function(direction) {
+ getSelection( this.getDocument() ).setSingleRange(this, direction);
+ };
+
+ selProto.changeEachRange = function(func) {
+ var ranges = [];
+ var backward = this.isBackward();
+
+ this.eachRange(function(range) {
+ func(range);
+ ranges.push(range);
+ });
+
+ this.removeAllRanges();
+ if (backward && ranges.length == 1) {
+ this.addRange(ranges[0], "backward");
+ } else {
+ this.setRanges(ranges);
+ }
+ };
+
+ selProto.containsNode = function(node, allowPartial) {
+ return this.eachRange( function(range) {
+ return range.containsNode(node, allowPartial);
+ }, true ) || false;
+ };
+
+ selProto.getBookmark = function(containerNode) {
+ return {
+ backward: this.isBackward(),
+ rangeBookmarks: this.callMethodOnEachRange("getBookmark", [containerNode])
+ };
+ };
+
+ selProto.moveToBookmark = function(bookmark) {
+ var selRanges = [];
+ for (var i = 0, rangeBookmark, range; rangeBookmark = bookmark.rangeBookmarks[i++]; ) {
+ range = api.createRange(this.win);
+ range.moveToBookmark(rangeBookmark);
+ selRanges.push(range);
+ }
+ if (bookmark.backward) {
+ this.setSingleRange(selRanges[0], "backward");
+ } else {
+ this.setRanges(selRanges);
+ }
+ };
+
+ selProto.saveRanges = function() {
+ return {
+ backward: this.isBackward(),
+ ranges: this.callMethodOnEachRange("cloneRange")
+ };
+ };
+
+ selProto.restoreRanges = function(selRanges) {
+ this.removeAllRanges();
+ for (var i = 0, range; range = selRanges.ranges[i]; ++i) {
+ this.addRange(range, (selRanges.backward && i == 0));
+ }
+ };
+
+ selProto.toHtml = function() {
+ var rangeHtmls = [];
+ this.eachRange(function(range) {
+ rangeHtmls.push( DomRange.toHtml(range) );
+ });
+ return rangeHtmls.join("");
+ };
+
+ if (features.implementsTextRange) {
+ selProto.getNativeTextRange = function() {
+ var sel, textRange;
+ if ( (sel = this.docSelection) ) {
+ var range = sel.createRange();
+ if (isTextRange(range)) {
+ return range;
+ } else {
+ throw module.createError("getNativeTextRange: selection is a control selection");
+ }
+ } else if (this.rangeCount > 0) {
+ return api.WrappedTextRange.rangeToTextRange( this.getRangeAt(0) );
+ } else {
+ throw module.createError("getNativeTextRange: selection contains no range");
+ }
+ };
+ }
+
+ function inspect(sel) {
+ var rangeInspects = [];
+ var anchor = new DomPosition(sel.anchorNode, sel.anchorOffset);
+ var focus = new DomPosition(sel.focusNode, sel.focusOffset);
+ var name = (typeof sel.getName == "function") ? sel.getName() : "Selection";
+
+ if (typeof sel.rangeCount != "undefined") {
+ for (var i = 0, len = sel.rangeCount; i < len; ++i) {
+ rangeInspects[i] = DomRange.inspect(sel.getRangeAt(i));
+ }
+ }
+ return "[" + name + "(Ranges: " + rangeInspects.join(", ") +
+ ")(anchor: " + anchor.inspect() + ", focus: " + focus.inspect() + "]";
+ }
+
+ selProto.getName = function() {
+ return "WrappedSelection";
+ };
+
+ selProto.inspect = function() {
+ return inspect(this);
+ };
+
+ selProto.detach = function() {
+ actOnCachedSelection(this.win, "delete");
+ deleteProperties(this);
+ };
+
+ WrappedSelection.detachAll = function() {
+ actOnCachedSelection(null, "deleteAll");
+ };
+
+ WrappedSelection.inspect = inspect;
+ WrappedSelection.isDirectionBackward = isDirectionBackward;
+
+ api.Selection = WrappedSelection;
+
+ api.selectionPrototype = selProto;
+
+ api.addShimListener(function(win) {
+ if (typeof win.getSelection == "undefined") {
+ win.getSelection = function() {
+ return getSelection(win);
+ };
+ }
+ win = null;
+ });
+ });
+
+
+ /*----------------------------------------------------------------------------------------------------------------*/
+
+ // Wait for document to load before initializing
+ var docReady = false;
+
+ var loadHandler = function(e) {
+ if (!docReady) {
+ docReady = true;
+ if (!api.initialized && api.config.autoInitialize) {
+ init();
+ }
+ }
+ };
+
+ if (isBrowser) {
+ // Test whether the document has already been loaded and initialize immediately if so
+ if (document.readyState == "complete") {
+ loadHandler();
+ } else {
+ if (isHostMethod(document, "addEventListener")) {
+ document.addEventListener("DOMContentLoaded", loadHandler, false);
+ }
+
+ // Add a fallback in case the DOMContentLoaded event isn't supported
+ addListener(window, "load", loadHandler);
+ }
+ }
+
+ return api;
+}, this); \ No newline at end of file