Update jquery.ime to 7572e2

Documentation, code clean ups and build updates

Change-Id: I7ce3d75345b76f2a7693b6143e013b6a8202e093
This commit is contained in:
Santhosh Thottingal
2016-04-12 10:05:15 +05:30
parent 0bf38c715f
commit 28044a6f14
134 changed files with 11484 additions and 11473 deletions

View File

@@ -1,4 +1,4 @@
/*! jquery.ime - v0.1.0+20160325
/*! jquery.ime - v0.1.0+20160412
* https://github.com/wikimedia/jquery.ime
* Copyright (c) 2016 Santhosh Thottingal; Licensed GPL, MIT */
( function ( $ ) {
@@ -36,14 +36,15 @@
/**
* IME Class
* @class
*
* @class
* @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
* @param {Object} [options.helpHandler.imeSelector]
* @param {string} [options.helpHandler.ime] Id of the input method
*/
function IME( element, textEntry, options ) {
this.$element = $( element );
@@ -145,9 +146,9 @@
* @param {string} input
* @param {string} context
* @param {boolean} altGr whether altGr key is pressed or not
* @returns {object} transliteration object
* @returns {bool} return.noop Whether to consider input processed or passed through.
* @returns {string} return.output the transliterated input or input unmodified.
* @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;
@@ -179,19 +180,19 @@
}
for ( i = 0; i < patterns.length; i++ ) {
rule = patterns[i];
regex = new RegExp( rule[0] + '$' );
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];
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 ) ) {
if ( new RegExp( rule[ 1 ] + '$' ).test( context ) ) {
return { noop: false, output: input.replace( regex, replacement ) };
}
} else {
@@ -218,8 +219,9 @@
/**
* Keypress handler
*
* @param {jQuery.Event} e Event
* @returns {Boolean}
* @return {boolean}
*/
keypress: function ( e ) {
var altGr = false,
@@ -289,7 +291,8 @@
/**
* Check whether the input method is active or not
* @returns {Boolean}
*
* @return {boolean}
*/
isActive: function () {
return this.active;
@@ -327,7 +330,8 @@
/**
* Get the current input method
* @returns {string} Current input method id
*
* @return {string} Current input method id
*/
getIM: function () {
return this.inputmethod;
@@ -335,23 +339,25 @@
/**
* Set the current input method
*
* @param {string} inputmethodId
* @fires imeLanguageChange
*/
setIM: function ( inputmethodId ) {
this.inputmethod = $.ime.inputmethods[inputmethodId];
this.inputmethod = $.ime.inputmethods[ inputmethodId ];
$.ime.preferences.setIM( inputmethodId );
this.$element.trigger( 'imeMethodChange' );
},
/**
* Set the current Language
*
* @param {string} languageCode
* @fires imeLanguageChange
* @returns {Boolean}
* @return {boolean}
*/
setLanguage: function ( languageCode ) {
if ( !$.ime.languages[languageCode] ) {
if ( !$.ime.languages[ languageCode ] ) {
debug( 'Language ' + languageCode + ' is not known to jquery.ime.' );
return false;
@@ -365,7 +371,8 @@
/**
* Get current language
* @returns {string}
*
* @return {string}
*/
getLanguage: function () {
return this.language;
@@ -373,6 +380,7 @@
/**
* load an input method by given id
*
* @param {string} inputmethodId
* @return {jQuery.Promise}
*/
@@ -383,8 +391,8 @@
/**
* TextEntry factory
* @class
*
* @class
* @constructor
*/
TextEntryFactory = function IMETextEntryFactory() {
@@ -400,7 +408,7 @@
/**
* Register a TextEntry class, with priority over previous registrations
*
* @param {TextEntry} Class to register
* @param {TextEntry} TextEntryClass Class to register
*/
TextEntryFactory.prototype.register = function ( TextEntryClass ) {
this.TextEntryClasses.unshift( TextEntryClass );
@@ -429,8 +437,8 @@
/**
* Generic text entry
* @class
*
* @class
* @abstract
*/
TextEntry = function IMETextEntry() {
@@ -460,7 +468,7 @@
* 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
* @return {string} Up to maxLength of text
*/
TextEntry.prototype.getTextBeforeSelection = null;
@@ -468,14 +476,14 @@
* 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
* @param {string} newText Replacement text
*/
TextEntry.prototype.replaceTextAtSelection = null;
/**
* TextEntry class for input/textarea widgets
* @class
*
* @class
* @constructor
* @param {jQuery} $element The element to wrap
*/
@@ -567,9 +575,9 @@
/**
* Get the current selection offsets inside the widget
*
* @return {Object} Offsets in chars (0 means first offset *or* no selection in widget)
* @return.start {number} Selection start
* @return.end {number} Selection end
* @return {Object} return Offsets in chars (0 means first offset *or* no selection in widget)
* @return {number} return.start Selection start
* @return {number} return.end Selection end
*/
FormWidgetEntry.prototype.getCaretPosition = function () {
var el = this.$element.get( 0 ),
@@ -628,8 +636,8 @@
/**
* TextEntry class for ContentEditable
* @class
*
* @class
* @constructor
* @param {jQuery} $element The element to wrap
*/
@@ -748,6 +756,7 @@
/**
* jQuery plugin ime
*
* @param {Object} option
*/
$.fn.ime = function ( option ) {
@@ -767,7 +776,7 @@
}
if ( typeof option === 'string' ) {
data[option]();
data[ option ]();
}
} );
};
@@ -793,6 +802,7 @@
/**
* load an input method by given id
*
* @param {string} inputmethodId
* @return {jQuery.Promise}
*/
@@ -800,17 +810,17 @@
var dependency,
deferred = $.Deferred();
if ( $.ime.inputmethods[inputmethodId] ) {
if ( $.ime.inputmethods[ inputmethodId ] ) {
return deferred.resolve();
}
// Validate the input method id.
if ( !$.ime.sources[inputmethodId] ) {
if ( !$.ime.sources[ inputmethodId ] ) {
return deferred.reject();
}
dependency = $.ime.sources[inputmethodId].depends;
if ( dependency && !$.ime.inputmethods[dependency] ) {
dependency = $.ime.sources[ inputmethodId ].depends;
if ( dependency && !$.ime.inputmethods[ dependency ] ) {
$.ime.load( dependency ).done( function () {
$.ime.load( inputmethodId ).done( function () {
deferred.resolve();
@@ -822,7 +832,7 @@
debug( 'Loading ' + inputmethodId );
deferred = $.ajax( {
url: $.ime.path + $.ime.sources[inputmethodId].source,
url: $.ime.path + $.ime.sources[ inputmethodId ].source,
dataType: 'script',
cache: true
} ).done( function () {
@@ -835,7 +845,7 @@
};
$.ime.register = function ( inputMethod ) {
$.ime.inputmethods[inputMethod.id] = $.extend( {}, defaultInputMethod, inputMethod );
$.ime.inputmethods[ inputMethod.id ] = $.extend( {}, defaultInputMethod, inputMethod );
};
/**
@@ -863,8 +873,8 @@
}
}
function arrayKeys ( obj ) {
return $.map( obj, function( element, index ) {
function arrayKeys( obj ) {
return $.map( obj, function ( element, index ) {
return index;
} );
}
@@ -936,8 +946,8 @@
this.timer = setTimeout(
function () {
imeselector.$imeSetting.animate( {
'opacity': 0,
'marginTop': '-20px'
opacity: 0,
marginTop: '-20px'
}, 500, function () {
imeselector.$imeSetting.hide();
// Restore properties for the next time it becomes visible:
@@ -1022,7 +1032,7 @@
imeselector.$imeSetting.removeClass( 'ime-onfocus' );
} );
imeselector.$menu.on( 'click.ime', 'li', function() {
imeselector.$menu.on( 'click.ime', 'li', function () {
imeselector.$element.focus();
return false;
@@ -1103,16 +1113,16 @@
languageCode = this.decideLanguage();
this.selectLanguage( languageCode );
if ( !ime.isActive() && $.ime.languages[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] );
if ( previousInputMethods[ 0 ] ) {
this.selectIM( previousInputMethods[ 0 ] );
} else {
// Provide the default input method in this case.
firstInputmethod = $.ime.languages[languageCode].inputmethods[0];
firstInputmethod = $.ime.languages[ languageCode ].inputmethods[ 0 ];
this.selectIM( firstInputmethod );
}
}
@@ -1171,7 +1181,7 @@
cssTop = top;
cssLeft = left;
this.$element.parents().each( function() {
this.$element.parents().each( function () {
if ( $( this ).css( 'position' ) === 'fixed' ) {
imeSelector.$imeSetting.css( 'position', 'fixed' );
cssTop -= $( document ).scrollTop();
@@ -1223,7 +1233,7 @@
ime = this.$element.data( 'ime' );
imePref = $.ime.preferences.getIM( languageCode );
language = $.ime.languages[languageCode];
language = $.ime.languages[ languageCode ];
this.setMenuTitle( this.getAutonym( languageCode ) );
@@ -1261,8 +1271,8 @@
* @return {string} The autonym
*/
getAutonym: function ( languageCode ) {
return $.ime.languages[languageCode]
&& $.ime.languages[languageCode].autonym;
return $.ime.languages[ languageCode ]
&& $.ime.languages[ languageCode ].autonym;
},
/**
@@ -1320,12 +1330,12 @@
}
ime.load( inputmethodId ).done( function () {
imeselector.inputmethod = $.ime.inputmethods[inputmethodId];
imeselector.inputmethod = $.ime.inputmethods[ inputmethodId ];
imeselector.hide();
ime.enable();
ime.setIM( inputmethodId );
imeselector.$imeSetting.find( 'a.ime-name' ).text(
$.ime.sources[inputmethodId].name
$.ime.sources[ inputmethodId ].name
);
imeselector.position();
@@ -1375,8 +1385,8 @@
}
for ( languageCodeIndex in languageList ) {
languageCode = languageList[languageCodeIndex];
language = $.ime.languages[languageCode];
languageCode = languageList[ languageCodeIndex ];
language = $.ime.languages[ languageCode ];
if ( !language ) {
continue;
@@ -1405,7 +1415,7 @@
* @param {string} languageCode
*/
prepareInputMethods: function ( languageCode ) {
var language = $.ime.languages[languageCode],
var language = $.ime.languages[ languageCode ],
$imeList = this.$menu.find( '.ime-list' ),
imeSelector = this;
@@ -1414,7 +1424,7 @@
$.each( language.inputmethods, function ( index, inputmethod ) {
var $imeItem, $inputMethod, source, name;
source = $.ime.sources[inputmethod];
source = $.ime.sources[ inputmethod ];
if ( !source ) {
return;
}
@@ -1440,6 +1450,7 @@
/**
* Create a help link element.
*
* @return {jQuery}
*/
helpLink: function () {
@@ -1447,8 +1458,8 @@
.append( $( '<a>' ).text( 'Help' )
.addClass( 'selectable-row-item' )
.attr( {
'href': 'http://github.com/wikimedia/jquery.ime',
'target': '_blank',
href: 'http://github.com/wikimedia/jquery.ime',
target: '_blank',
'data-i18n': 'jquery-ime-help'
} )
);
@@ -1474,7 +1485,7 @@
}
if ( typeof options === 'string' ) {
data[options].call( $this );
data[ options ].call( $this );
}
} );
};
@@ -1523,7 +1534,7 @@
* Check whether a keypress event corresponds to the shortcut key
*
* @param {event} event
* @return {bool} true if the key is a shortcut key
* @return {boolean} true if the key is a shortcut key
*/
function isShortcutKey( event ) {
// 77 - The letter M, for Ctrl-M
@@ -1553,9 +1564,9 @@
}
$.fn.attrchange = function ( callback ) {
if ( MutationObserver ) {
var observer;
var observer;
if ( MutationObserver ) {
observer = new MutationObserver( function ( mutations ) {
mutations.forEach( function ( e ) {
callback.call( e.target, e.attributeName );
@@ -1590,7 +1601,7 @@
previousLanguages: [], // array of previous languages
previousInputMethods: [], // array of previous inputmethods
imes: {
'en': 'system'
en: 'system'
}
},
@@ -1636,11 +1647,11 @@
}
// Do nothing if there's no actual change
if ( inputMethod === this.registry.imes[this.registry.language] ) {
if ( inputMethod === this.registry.imes[ this.registry.language ] ) {
return;
}
this.registry.imes[this.getLanguage()] = inputMethod;
this.registry.imes[ this.getLanguage() ] = inputMethod;
this.registry.isDirty = true;
if ( !this.registry.previousInputMethods ) {
this.registry.previousInputMethods = [];
@@ -1659,7 +1670,7 @@
this.registry.imes = {};
}
return this.registry.imes[language] || 'system';
return this.registry.imes[ language ] || 'system';
},
save: function () {
@@ -2054,7 +2065,7 @@
name: 'لۊری شومالی',
source: 'rules/lrc/lrc-kbd.js'
},
'mh': {
mh: {
name: 'Kajin M̧ajeļ',
source: 'rules/mh/mh.js'
},
@@ -2292,39 +2303,39 @@
} );
$.extend( $.ime.languages, {
'ady': {
ady: {
autonym: 'адыгэбзэ',
inputmethods: [ 'cyrl-palochka' ]
},
'ahr': {
ahr: {
autonym: 'अहिराणी',
inputmethods: [ 'mr-transliteration', 'mr-inscript' ]
},
'am': {
am: {
autonym: 'አማርኛ',
inputmethods: [ 'am-transliteration' ]
},
'ar': {
ar: {
autonym: 'العربية',
inputmethods: [ 'ar-kbd' ]
},
'as': {
as: {
autonym: 'অসমীয়া',
inputmethods: [ 'as-transliteration', 'as-avro', 'as-bornona', 'as-inscript', 'as-phonetic', 'as-inscript2', 'as-rodali' ]
},
'av': {
av: {
autonym: 'авар',
inputmethods: [ 'cyrl-palochka' ]
},
'azb': {
azb: {
autonym: 'تۆرکجه',
inputmethods: [ 'azb-kbd' ]
},
'bbc': {
bbc: {
autonym: 'Batak',
inputmethods: [ 'batak-qwerty' ]
},
'be': {
be: {
autonym: 'беларуская',
inputmethods: [ 'be-transliteration', 'be-latin', 'be-kbd' ]
},
@@ -2332,203 +2343,203 @@
autonym: 'беларуская (тарашкевіца)',
inputmethods: [ 'be-transliteration', 'be-latin' ]
},
'bh': {
bh: {
autonym: 'भोजपुरी',
inputmethods: [ 'hi-transliteration' ]
},
'bgn': {
bgn: {
autonym: 'روچ کپتین بلوچی',
inputmethods: [ 'bgn-kbd' ]
},
'bho': {
bho: {
autonym: 'भोजपुरी',
inputmethods: [ 'hi-transliteration' ]
},
'bn': {
bn: {
autonym: 'বাংলা',
inputmethods: [ 'bn-avro', 'bn-inscript', 'bn-nkb', 'bn-probhat', 'bn-inscript2' ]
},
'bo': {
bo: {
autonym: 'བོད་ཡིག།',
inputmethods: [ 'bo-ewts' ]
},
'brx': {
brx: {
autonym: 'बोड़ो',
inputmethods: [ 'brx-inscript', 'brx-inscript2' ]
},
'ckb': {
ckb: {
autonym: 'کوردیی ناوەندی',
inputmethods: [ 'ckb-transliteration-arkbd', 'ckb-transliteration-fakbd', 'ckb-transliteration-lakbd' ]
},
'ce': {
ce: {
autonym: 'нохчийн',
inputmethods: [ 'cyrl-palochka' ]
},
'cv': {
cv: {
autonym: 'Чăвашла',
inputmethods: [ 'cv-cyr-altgr', 'cv-lat-altgr', 'cv-cyr-numbers' ]
},
'da': {
da: {
autonym: 'Dansk',
inputmethods: [ 'da-normforms' ]
},
'de': {
de: {
autonym: 'Deutsch',
inputmethods: [ 'de-transliteration' ]
},
'diq': {
diq: {
autonym: 'Kirdkî',
inputmethods: [ 'ku-h', 'ku-tr' ]
},
'doi': {
doi: {
autonym: 'डोगरी',
inputmethods: [ 'doi-inscript2' ]
},
'en': {
en: {
autonym: 'English',
inputmethods: [ 'ipa-sil', 'ipa-x-sampa' ]
},
'el': {
el: {
autonym: 'Ελληνικά',
inputmethods: [ 'el-kbd' ]
},
'eo': {
eo: {
autonym: 'Esperanto',
inputmethods: [ 'eo-transliteration', 'eo-h', 'eo-h-f', 'eo-plena', 'eo-q', 'eo-vi', 'eo-x' ]
},
'fa': {
fa: {
autonym: 'فارسی',
inputmethods: [ 'fa-kbd' ]
},
'fo': {
fo: {
autonym: 'Føroyskt',
inputmethods: [ 'fo-normforms' ]
},
'fi': {
fi: {
autonym: 'Suomi',
inputmethods: [ 'fi-transliteration' ]
},
'lrc': {
lrc: {
autonym: 'لۊری شومالی',
inputmethods: [ 'lrc-kbd' ]
},
'lud': {
lud: {
autonym: 'lüüdi',
inputmethods: [ 'lud-transliteration' ]
},
'gom': {
gom: {
autonym: 'गोवा कोंकणी / Gova Konknni',
inputmethods: [ 'hi-transliteration', 'hi-inscript', 'gom-inscript2' ]
},
'gu': {
gu: {
autonym: 'ગુજરાતી',
inputmethods: [ 'gu-transliteration', 'gu-inscript', 'gu-inscript2', 'gu-phonetic' ]
},
'he': {
he: {
autonym: 'עברית',
inputmethods: [ 'he-standard-2012-extonly', 'he-standard-2012' ]
},
'hi': {
hi: {
autonym: 'हिन्दी',
inputmethods: [ 'hi-transliteration', 'hi-inscript', 'hi-bolnagri', 'hi-phonetic', 'hi-inscript2' ]
},
'hr': {
hr: {
autonym: 'Hrvatski',
inputmethods: [ 'hr-kbd' ]
},
'hy': {
hy: {
autonym: 'հայերեն',
inputmethods: [ 'hy-ephonetic', 'hy-typewriter', 'hy-ephoneticalt', 'hy-emslegacy', 'hy-wmslegacy' ]
},
'hne': {
hne: {
autonym: 'छत्तीसगढ़ी',
inputmethods: [ 'hi-transliteration' ]
},
'is': {
is: {
autonym: 'Íslenska',
inputmethods: [ 'is-normforms' ]
},
'fonipa': {
fonipa: {
autonym: 'International Phonetic Alphabet',
inputmethods: [ 'ipa-sil', 'ipa-x-sampa' ]
},
'jv': {
jv: {
autonym: 'ꦧꦱꦗꦮ',
inputmethods: [ 'jv-transliteration' ]
},
'ka': {
ka: {
autonym: 'ქართული ენა',
inputmethods: [ 'ka-transliteration', 'ka-kbd' ]
},
'kbd': {
kbd: {
autonym: 'адыгэбзэ (къэбэрдеибзэ)',
inputmethods: [ 'cyrl-palochka' ]
},
'kk': {
kk: {
autonym: 'Қазақша',
inputmethods: [ 'kk-kbd', 'kk-arabic' ]
},
'kn': {
kn: {
autonym: 'ಕನ್ನಡ',
inputmethods: [ 'kn-transliteration', 'kn-inscript', 'kn-kgp', 'kn-inscript2' ]
},
'ks': {
ks: {
autonym: 'कॉशुर / کٲشُر',
inputmethods: [ 'ks-inscript', 'ks-kbd' ]
},
'ky': {
ky: {
autonym: 'Кыргыз',
inputmethods: [ 'ky-cyrl-alt' ]
},
'kab': {
kab: {
autonym: 'ⵜⴰⵇⴱⴰⵢⵍⵉⵜ',
inputmethods: [ 'ber-tfng' ]
},
'ku': {
ku: {
autonym: 'Kurdî',
inputmethods: [ 'ku-h', 'ku-tr' ]
},
'lbe': {
lbe: {
autonym: 'лакку',
inputmethods: [ 'cyrl-palochka' ]
},
'lez': {
lez: {
autonym: 'лезги',
inputmethods: [ 'cyrl-palochka' ]
},
'lo': {
lo: {
autonym: 'ລາວ',
inputmethods: [ 'lo-kbd' ]
},
'mai': {
mai: {
autonym: 'मैथिली',
inputmethods: [ 'mai-inscript', 'mai-inscript2' ]
},
'mh': {
mh: {
autonym: 'Kajin M̧ajeļ',
inputmethods: [ 'mh' ]
},
'ml': {
ml: {
autonym: 'മലയാളം',
inputmethods: [ 'ml-transliteration', 'ml-inscript', 'ml-inscript2' ]
},
'mn': {
mn: {
autonym: 'Монгол',
inputmethods: [ 'mn-cyrl' ]
},
'mni': {
mni: {
autonym: 'Manipuri',
inputmethods: [ 'mni-inscript2' ]
},
'mr': {
mr: {
autonym: 'मराठी',
inputmethods: [ 'mr-transliteration', 'mr-inscript2', 'mr-inscript', 'mr-phonetic' ]
},
'my': {
my: {
autonym: 'မြန်မာ',
inputmethods: [ 'my-xkb' ]
},
'ne': {
ne: {
autonym: 'नेपाली',
inputmethods: [ 'ne-transliteration', 'ne-inscript2', 'ne-inscript', 'ne-rom', 'ne-trad' ]
},
@@ -2536,123 +2547,123 @@
autonym: 'नेपाल भाषा',
inputmethods: [ 'hi-transliteration', 'hi-inscript' ]
},
'nb': {
nb: {
autonym: 'Norsk (bokmål)',
inputmethods: [ 'nb-normforms', 'nb-tildeforms' ]
},
'nn': {
nn: {
autonym: 'Norsk (nynorsk)',
inputmethods: [ 'nb-normforms', 'nn-tildeforms' ]
},
'or': {
or: {
autonym: 'ଓଡ଼ିଆ',
inputmethods: [ 'or-phonetic', 'or-transliteration', 'or-inscript', 'or-inscript2', 'or-lekhani', 'or-OdiScript' ]
},
'pa': {
pa: {
autonym: 'ਪੰਜਾਬੀ',
inputmethods: [ 'pa-transliteration', 'pa-inscript', 'pa-phonetic', 'pa-inscript2', 'pa-jhelum' ]
},
'rif': {
rif: {
autonym: 'ⵜⴰⵔⵉⴼⵉⵜ',
inputmethods: [ 'ber-tfng' ]
},
'ru': {
ru: {
autonym: 'русский',
inputmethods: [ 'ru-jcuken', 'ru-kbd', 'ru-phonetic', 'ru-yawerty' ]
},
'sah': {
sah: {
autonym: 'саха тыла',
inputmethods: [ 'sah-transliteration' ]
},
'sa': {
sa: {
autonym: 'संस्कृत',
inputmethods: [ 'sa-transliteration', 'sa-inscript2', 'sa-inscript', 'sa-iast' ]
},
'sat': {
sat: {
autonym: 'संताली',
inputmethods: [ 'sat-inscript2']
inputmethods: [ 'sat-inscript2' ]
},
'sd': {
sd: {
autonym: 'सिंधी',
inputmethods: [ 'sd-inscript2' ]
},
'sdh': {
sdh: {
autonym: 'کوردی خوارگ',
inputmethods: [ 'sdh-kbd' ]
},
'se': {
se: {
autonym: 'Davvisámegiella',
inputmethods: [ 'se-normforms' ]
},
'shi': {
shi: {
autonym: 'ⵜⴰⵛⵍⵃⵉⵜ',
inputmethods: [ 'ber-tfng' ]
},
'si': {
si: {
autonym: 'සිංහල',
inputmethods: [ 'si-singlish', 'si-wijesekara' ]
},
'sk': {
sk: {
autonym: 'Slovenčina',
inputmethods: [ 'sk-kbd' ]
},
'sr': {
sr: {
autonym: 'Српски / srpski',
inputmethods: [ 'sr-kbd' ]
},
'sv': {
sv: {
autonym: 'Svenska',
inputmethods: [ 'sv-normforms' ]
},
'ta': {
ta: {
autonym: 'தமிழ்',
inputmethods: [ 'ta-transliteration', 'ta-99', 'ta-inscript', 'ta-bamini', 'ta-inscript2' ]
},
'tcy': {
tcy: {
autonym: 'ತುಳು',
inputmethods: [ 'kn-transliteration' ]
},
'te': {
te: {
autonym: 'తెలుగు',
inputmethods: [ 'te-transliteration', 'te-inscript', 'te-inscript2', 'te-apple', 'te-modular' ]
},
'th': {
th: {
autonym: 'ไทย',
inputmethods: [ 'th-kedmanee', 'th-pattachote' ]
},
'tkr': {
tkr: {
autonym: 'цӀаӀхна миз',
inputmethods: [ 'cyrl-palochka' ]
},
'tzm': {
tzm: {
autonym: 'ⵜⴰⵎⴰⵣⵉⵖⵜ',
inputmethods: [ 'ber-tfng' ]
},
'udm': {
udm: {
autonym: 'удмурт',
inputmethods: [ 'udm-alt' ]
},
'uk': {
uk: {
autonym: 'Українська',
inputmethods: [ 'uk-kbd' ]
},
'ug': {
ug: {
autonym: 'ئۇيغۇرچە / Uyghurche',
inputmethods: [ 'ug-kbd' ]
},
'ur': {
ur: {
autonym: 'اردو',
inputmethods: [ 'ur-transliteration', 'ur-phonetic' ]
},
'uz': {
uz: {
autonym: 'Oʻzbekcha',
inputmethods: [ 'uz-kbd' ]
},
'vec': {
vec: {
autonym: 'Venetian',
inputmethods: [ 'vec-GVU' ]
},
'yo': {
yo: {
autonym: 'Yorùbá',
inputmethods: [ 'yo-alt' ]
}