Christian Perrier, le Sat 04 Jul 2009 11:31:07 +0200, a écrit : > I went through all languages.
That approach misses things. For instance, Andorra (AD)'s official language is catalan (cat), for which you only provide es' cat variant layout. Xorg does have an ad layout which is quite different from es' cat variant. And that is only the first one in the xkb list. Ok, that's no regression from what we had previously and we have no AD locale for now, but should we really select keyboards by hand and restrict ourselves from just automatically supporting such keyboard? I have a script that can automatically generate the attached perl hash (kbds), which I had meant to use to automatically determine the default keyboard to use depending on the country/language pair, to replace the handcrafted switch statement of console-setup's config. That brings 137 keyboard layouts which we should ideally support (kbds2). Samuel
%locales_keyboards = ( 'AD' => { 'ca' => { 'layout' => 'ad' }, }, 'AE' => { 'ar' => { 'layout' => 'ara' }, }, 'AF' => { 'ps' => { 'layout' => 'af', 'variant' => 'ps' }, 'uz' => { 'layout' => 'af', 'variant' => 'uz' }, }, 'AL' => { 'sq' => { 'layout' => 'al' }, }, 'AM' => { 'hy' => { 'layout' => 'am' }, }, 'AR' => { 'es' => { 'layout' => 'latam' }, }, 'AZ' => { 'az' => { 'layout' => 'az' }, }, 'BA' => { 'bs' => { 'layout' => 'ba' }, }, 'BD' => { 'bn' => { 'layout' => 'bd' }, }, 'BE' => { 'de' => { 'layout' => 'be' }, 'fr' => { 'layout' => 'be' }, }, 'BG' => { 'bg' => { 'layout' => 'bg' }, }, 'BH' => { 'ar' => { 'layout' => 'ara' }, }, 'BO' => { 'es' => { 'layout' => 'latam' }, }, 'BR' => { 'eo' => { 'layout' => 'br', 'variant' => 'nativo-epo' }, 'pt' => { 'layout' => 'br' }, }, 'BT' => { 'dz' => { 'layout' => 'bt' }, }, 'BY' => { 'be' => { 'layout' => 'by' }, }, 'CA' => { 'en' => { 'layout' => 'ca', 'variant' => 'eng' }, 'fr' => { 'layout' => 'ca' }, 'iu' => { 'layout' => 'ca', 'variant' => 'ike' }, }, 'CD' => { 'fr' => { 'layout' => 'cd' }, }, 'CH' => { 'de' => { 'layout' => 'ch' }, 'fr' => { 'layout' => 'ch', 'variant' => 'fr' }, 'gsw' => { 'layout' => 'ch' }, }, 'CL' => { 'es' => { 'layout' => 'latam' }, }, 'CN' => { 'bo' => { 'layout' => 'cn', 'variant' => 'tib' }, 'zh' => { 'layout' => 'cn' }, }, 'CO' => { 'es' => { 'layout' => 'latam' }, }, 'CR' => { 'es' => { 'layout' => 'latam' }, }, 'CU' => { 'es' => { 'layout' => 'latam' }, }, 'CZ' => { 'cs' => { 'layout' => 'cz' }, }, 'DE' => { 'de' => { 'layout' => 'de' }, 'dsb' => { 'layout' => 'de', 'variant' => 'dsb' }, }, 'DK' => { 'da' => { 'layout' => 'dk' }, }, 'DO' => { 'es' => { 'layout' => 'latam' }, }, 'DZ' => { 'ar' => { 'layout' => 'ara' }, }, 'EC' => { 'es' => { 'layout' => 'latam' }, }, 'EE' => { 'et' => { 'layout' => 'ee' }, }, 'EG' => { 'ar' => { 'layout' => 'ara' }, }, 'EH' => { 'ar' => { 'layout' => 'ara' }, }, 'ES' => { 'ast' => { 'layout' => 'es', 'variant' => 'ast' }, 'ca' => { 'layout' => 'es', 'variant' => 'cat' }, 'es' => { 'layout' => 'es' }, }, 'ET' => { 'am' => { 'layout' => 'et' }, }, 'FI' => { 'fi' => { 'layout' => 'fi' }, 'se' => { 'layout' => 'fi', 'variant' => 'smi' }, 'smi' => { 'layout' => 'fi', 'variant' => 'smi' }, }, 'FO' => { 'fo' => { 'layout' => 'fo' }, }, 'FR' => { 'fr' => { 'layout' => 'fr' }, 'ka' => { 'layout' => 'fr', 'variant' => 'geo' }, }, 'GB' => { 'en' => { 'layout' => 'gb' }, }, 'GE' => { 'ka' => { 'layout' => 'ge' }, 'os' => { 'layout' => 'ge', 'variant' => 'os' }, 'ru' => { 'layout' => 'ge', 'variant' => 'ru' }, }, 'GH' => { 'ak' => { 'layout' => 'gh', 'variant' => 'akan' }, 'ee' => { 'layout' => 'gh', 'variant' => 'ewe' }, 'en' => { 'layout' => 'gh' }, 'ff' => { 'layout' => 'gh', 'variant' => 'fula' }, 'gaa' => { 'layout' => 'gh', 'variant' => 'ga' }, 'ha' => { 'layout' => 'gh', 'variant' => 'hausa' }, }, 'GN' => { 'fr' => { 'layout' => 'gn' }, }, 'GR' => { 'el' => { 'layout' => 'gr' }, }, 'GT' => { 'es' => { 'layout' => 'latam' }, }, 'HN' => { 'es' => { 'layout' => 'latam' }, }, 'HR' => { 'hr' => { 'layout' => 'hr' }, }, 'HT' => { 'es' => { 'layout' => 'latam' }, }, 'HU' => { 'hu' => { 'layout' => 'hu' }, }, 'IE' => { 'en' => { 'layout' => 'ie' }, 'gd' => { 'layout' => 'ie', 'variant' => 'CloGaelach' }, }, 'IL' => { 'he' => { 'layout' => 'il' }, }, 'IN' => { 'bn' => { 'layout' => 'in', 'variant' => 'ben' }, 'gu' => { 'layout' => 'in', 'variant' => 'guj' }, 'hi' => { 'layout' => 'in', 'variant' => 'bolnagri' }, 'kn' => { 'layout' => 'in', 'variant' => 'kan' }, 'ml' => { 'layout' => 'in', 'variant' => 'mal' }, 'or' => { 'layout' => 'in', 'variant' => 'ori' }, 'pa' => { 'layout' => 'in', 'variant' => 'guru' }, 'ta' => { 'layout' => 'in', 'variant' => 'tam_unicode' }, 'te' => { 'layout' => 'in', 'variant' => 'tel' }, 'ur' => { 'layout' => 'in', 'variant' => 'urd-phonetic' }, }, 'IQ' => { 'ar' => { 'layout' => 'iq' }, 'ku' => { 'layout' => 'iq' }, }, 'IR' => { 'fa' => { 'layout' => 'ir' }, 'ku' => { 'layout' => 'ir', 'variant' => 'ku' }, }, 'IS' => { 'is' => { 'layout' => 'is' }, }, 'IT' => { 'it' => { 'layout' => 'it' }, 'ka' => { 'layout' => 'it', 'variant' => 'geo' }, }, 'JO' => { 'ar' => { 'layout' => 'ara' }, }, 'JP' => { 'ja' => { 'layout' => 'jp' }, }, 'KG' => { 'ky' => { 'layout' => 'kg' }, }, 'KH' => { 'km' => { 'layout' => 'kh' }, }, 'KR' => { 'ko' => { 'layout' => 'kr' }, }, 'KW' => { 'ar' => { 'layout' => 'ara' }, }, 'KZ' => { 'kk' => { 'layout' => 'kz' }, 'ru' => { 'layout' => 'kz', 'variant' => 'ruskaz' }, }, 'LA' => { 'lo' => { 'layout' => 'la' }, }, 'LB' => { 'ar' => { 'layout' => 'ara' }, }, 'LK' => { 'si' => { 'layout' => 'lk' }, 'ta' => { 'layout' => 'lk', 'variant' => 'tam_unicode' }, }, 'LT' => { 'lt' => { 'layout' => 'lt' }, }, 'LV' => { 'lv' => { 'layout' => 'lv' }, }, 'LY' => { 'ar' => { 'layout' => 'ara' }, }, 'MA' => { 'ar' => { 'layout' => 'ara' }, 'ber' => { 'layout' => 'ma', 'variant' => 'tifinagh' }, 'fr' => { 'layout' => 'ma', 'variant' => 'french' }, }, 'ME' => { 'sr' => { 'layout' => 'me' }, }, 'MK' => { 'mk' => { 'layout' => 'mk' }, }, 'MM' => { 'my' => { 'layout' => 'mm' }, }, 'MN' => { 'mng' => { 'layout' => 'mn' }, }, 'MR' => { 'ar' => { 'layout' => 'ara' }, }, 'MT' => { 'mt' => { 'layout' => 'mt' }, }, 'MV' => { 'dv' => { 'layout' => 'mv' }, }, 'MX' => { 'es' => { 'layout' => 'latam' }, }, 'NG' => { 'en' => { 'layout' => 'ng' }, 'ha' => { 'layout' => 'ng', 'variant' => 'hausa' }, 'ig' => { 'layout' => 'ng', 'variant' => 'igbo' }, 'yo' => { 'layout' => 'ng', 'variant' => 'yoruba' }, }, 'NI' => { 'es' => { 'layout' => 'latam' }, }, 'NL' => { 'nl' => { 'layout' => 'nl' }, }, 'NO' => { 'no' => { 'layout' => 'no' }, 'se' => { 'layout' => 'no', 'variant' => 'smi' }, }, 'NP' => { 'ne' => { 'layout' => 'np' }, }, 'OM' => { 'ar' => { 'layout' => 'ara' }, }, 'PA' => { 'es' => { 'layout' => 'latam' }, }, 'PE' => { 'es' => { 'layout' => 'latam' }, }, 'PK' => { 'ar' => { 'layout' => 'pk', 'variant' => 'ara' }, 'ur' => { 'layout' => 'pk' }, }, 'PL' => { 'csb' => { 'layout' => 'pl', 'variant' => 'csb' }, 'pl' => { 'layout' => 'pl' }, 'ru' => { 'layout' => 'pl', 'variant' => 'ru_phonetic_dvorak' }, }, 'PR' => { 'es' => { 'layout' => 'latam' }, }, 'PS' => { 'ar' => { 'layout' => 'ara' }, }, 'PT' => { 'eo' => { 'layout' => 'pt', 'variant' => 'nativo-epo' }, 'pt' => { 'layout' => 'pt' }, }, 'PY' => { 'es' => { 'layout' => 'latam' }, }, 'QA' => { 'ar' => { 'layout' => 'ara' }, }, 'RO' => { 'ro' => { 'layout' => 'ro' }, }, 'RS' => { 'sr' => { 'layout' => 'rs' }, }, 'RU' => { 'cv' => { 'layout' => 'ru', 'variant' => 'cv' }, 'kv' => { 'layout' => 'ru', 'variant' => 'kom' }, 'os' => { 'layout' => 'ru', 'variant' => 'os_legacy' }, 'ru' => { 'layout' => 'ru' }, 'sah' => { 'layout' => 'ru', 'variant' => 'sah' }, 'tt' => { 'layout' => 'ru', 'variant' => 'tt' }, 'udm' => { 'layout' => 'ru', 'variant' => 'udm' }, 'xal' => { 'layout' => 'ru', 'variant' => 'xal' }, }, 'SA' => { 'ar' => { 'layout' => 'ara' }, }, 'SD' => { 'ar' => { 'layout' => 'ara' }, }, 'SE' => { 'ru' => { 'layout' => 'se', 'variant' => 'rus' }, 'se' => { 'layout' => 'se', 'variant' => 'smi' }, 'sv' => { 'layout' => 'se' }, }, 'SI' => { 'sl' => { 'layout' => 'si' }, }, 'SK' => { 'sk' => { 'layout' => 'sk' }, }, 'SV' => { 'es' => { 'layout' => 'latam' }, }, 'SY' => { 'ar' => { 'layout' => 'ara' }, 'ku' => { 'layout' => 'sy', 'variant' => 'ku' }, 'syr' => { 'layout' => 'sy' }, }, 'TH' => { 'th' => { 'layout' => 'th' }, }, 'TJ' => { 'tg' => { 'layout' => 'tj' }, }, 'TN' => { 'ar' => { 'layout' => 'ara' }, }, 'TR' => { 'ku' => { 'layout' => 'tr', 'variant' => 'ku' }, 'tr' => { 'layout' => 'tr' }, }, 'UA' => { 'uk' => { 'layout' => 'ua' }, }, 'US' => { 'chr' => { 'layout' => 'us', 'variant' => 'chr' }, 'de' => { 'layout' => 'us', 'variant' => 'altgr-intl' }, 'en' => { 'layout' => 'us' }, 'es' => { 'layout' => 'latam' }, 'fr' => { 'layout' => 'us', 'variant' => 'altgr-intl' }, }, 'UY' => { 'es' => { 'layout' => 'latam' }, }, 'UZ' => { 'uz' => { 'layout' => 'uz' }, }, 'VE' => { 'es' => { 'layout' => 'latam' }, }, 'VN' => { 'vi' => { 'layout' => 'vn' }, }, 'YE' => { 'ar' => { 'layout' => 'ara' }, }, 'ZA' => { 'en' => { 'layout' => 'za' }, }, ); %countries_keyboards = ( 'AD' => { 'layout' => 'ad' }, 'AE' => { 'layout' => 'ara' }, 'AF' => { 'layout' => 'af' }, 'AL' => { 'layout' => 'al' }, 'AM' => { 'layout' => 'am' }, 'AR' => { 'layout' => 'latam' }, 'AZ' => { 'layout' => 'az' }, 'BA' => { 'layout' => 'ba' }, 'BD' => { 'layout' => 'bd' }, 'BE' => { 'layout' => 'be' }, 'BG' => { 'layout' => 'bg' }, 'BH' => { 'layout' => 'ara' }, 'BO' => { 'layout' => 'latam' }, 'BR' => { 'layout' => 'br' }, 'BT' => { 'layout' => 'bt' }, 'BY' => { 'layout' => 'by' }, 'CA' => { 'layout' => 'ca' }, 'CD' => { 'layout' => 'cd' }, 'CH' => { 'layout' => 'ch' }, 'CL' => { 'layout' => 'latam' }, 'CN' => { 'layout' => 'cn' }, 'CO' => { 'layout' => 'latam' }, 'CR' => { 'layout' => 'latam' }, 'CU' => { 'layout' => 'latam' }, 'CZ' => { 'layout' => 'cz' }, 'DE' => { 'layout' => 'de' }, 'DK' => { 'layout' => 'dk' }, 'DO' => { 'layout' => 'latam' }, 'DZ' => { 'layout' => 'ara' }, 'EC' => { 'layout' => 'latam' }, 'EE' => { 'layout' => 'ee' }, 'EG' => { 'layout' => 'ara' }, 'EH' => { 'layout' => 'ara' }, 'ES' => { 'layout' => 'es' }, 'ET' => { 'layout' => 'et' }, 'FI' => { 'layout' => 'fi' }, 'FO' => { 'layout' => 'fo' }, 'FR' => { 'layout' => 'fr' }, 'GB' => { 'layout' => 'gb' }, 'GE' => { 'layout' => 'ge' }, 'GH' => { 'layout' => 'gh' }, 'GN' => { 'layout' => 'gn' }, 'GR' => { 'layout' => 'gr' }, 'GT' => { 'layout' => 'latam' }, 'HN' => { 'layout' => 'latam' }, 'HR' => { 'layout' => 'hr' }, 'HT' => { 'layout' => 'latam' }, 'HU' => { 'layout' => 'hu' }, 'IE' => { 'layout' => 'ie' }, 'IL' => { 'layout' => 'il' }, 'IN' => { 'layout' => 'in' }, 'IQ' => { 'layout' => 'iq' }, 'IR' => { 'layout' => 'ir' }, 'IS' => { 'layout' => 'is' }, 'IT' => { 'layout' => 'it' }, 'JO' => { 'layout' => 'ara' }, 'JP' => { 'layout' => 'jp' }, 'KG' => { 'layout' => 'kg' }, 'KH' => { 'layout' => 'kh' }, 'KR' => { 'layout' => 'kr' }, 'KW' => { 'layout' => 'ara' }, 'KZ' => { 'layout' => 'kz' }, 'LA' => { 'layout' => 'la' }, 'LB' => { 'layout' => 'ara' }, 'LK' => { 'layout' => 'lk' }, 'LT' => { 'layout' => 'lt' }, 'LV' => { 'layout' => 'lv' }, 'LY' => { 'layout' => 'ara' }, 'MA' => { 'layout' => 'ara', 'ambiguous' => 1 }, 'ME' => { 'layout' => 'me' }, 'MK' => { 'layout' => 'mk' }, 'MM' => { 'layout' => 'mm' }, 'MN' => { 'layout' => 'mn' }, 'MR' => { 'layout' => 'ara' }, 'MT' => { 'layout' => 'mt' }, 'MV' => { 'layout' => 'mv' }, 'MX' => { 'layout' => 'latam' }, 'NG' => { 'layout' => 'ng' }, 'NI' => { 'layout' => 'latam' }, 'NL' => { 'layout' => 'nl' }, 'NO' => { 'layout' => 'no' }, 'NP' => { 'layout' => 'np' }, 'OM' => { 'layout' => 'ara' }, 'PA' => { 'layout' => 'latam' }, 'PE' => { 'layout' => 'latam' }, 'PK' => { 'layout' => 'pk' }, 'PL' => { 'layout' => 'pl' }, 'PR' => { 'layout' => 'latam' }, 'PS' => { 'layout' => 'ara' }, 'PT' => { 'layout' => 'pt' }, 'PY' => { 'layout' => 'latam' }, 'QA' => { 'layout' => 'ara' }, 'RO' => { 'layout' => 'ro' }, 'RS' => { 'layout' => 'rs' }, 'RU' => { 'layout' => 'ru' }, 'SA' => { 'layout' => 'ara' }, 'SD' => { 'layout' => 'ara' }, 'SE' => { 'layout' => 'se' }, 'SI' => { 'layout' => 'si' }, 'SK' => { 'layout' => 'sk' }, 'SV' => { 'layout' => 'latam' }, 'SY' => { 'layout' => 'ara', 'ambiguous' => 1 }, 'TH' => { 'layout' => 'th' }, 'TJ' => { 'layout' => 'tj' }, 'TN' => { 'layout' => 'ara' }, 'TR' => { 'layout' => 'tr' }, 'UA' => { 'layout' => 'ua' }, 'US' => { 'layout' => 'us', 'ambiguous' => 1 }, 'UY' => { 'layout' => 'latam' }, 'UZ' => { 'layout' => 'uz' }, 'VE' => { 'layout' => 'latam' }, 'VN' => { 'layout' => 'vn' }, 'YE' => { 'layout' => 'ara' }, 'ZA' => { 'layout' => 'za' }, ); %languages_keyboards = ( 'ak' => { 'layout' => 'gh', 'variant' => 'akan' }, 'am' => { 'layout' => 'et' }, 'ar' => { 'layout' => 'ara', 'ambiguous' => 1 }, 'ast' => { 'layout' => 'es', 'variant' => 'ast' }, 'az' => { 'layout' => 'az' }, 'be' => { 'layout' => 'by' }, 'ber' => { 'layout' => 'ma', 'variant' => 'tifinagh' }, 'bg' => { 'layout' => 'bg' }, 'bn' => { 'layout' => 'bd', 'ambiguous' => 1 }, 'bo' => { 'layout' => 'cn', 'variant' => 'tib' }, 'bs' => { 'layout' => 'ba' }, 'ca' => { 'layout' => 'ad', 'ambiguous' => 1 }, 'chr' => { 'layout' => 'us', 'variant' => 'chr' }, 'cs' => { 'layout' => 'cz' }, 'csb' => { 'layout' => 'pl', 'variant' => 'csb' }, 'cv' => { 'layout' => 'ru', 'variant' => 'cv' }, 'da' => { 'layout' => 'dk' }, 'de' => { 'layout' => 'be', 'ambiguous' => 1 }, 'dsb' => { 'layout' => 'de', 'variant' => 'dsb' }, 'dv' => { 'layout' => 'mv' }, 'dz' => { 'layout' => 'bt' }, 'ee' => { 'layout' => 'gh', 'variant' => 'ewe' }, 'el' => { 'layout' => 'gr' }, 'en' => { 'layout' => 'us', 'ambiguous' => 1 }, 'eo' => { 'layout' => 'epo' }, 'es' => { 'layout' => 'latam', 'ambiguous' => 1 }, 'et' => { 'layout' => 'ee' }, 'fa' => { 'layout' => 'ir' }, 'ff' => { 'layout' => 'gh', 'variant' => 'fula' }, 'fi' => { 'layout' => 'fi' }, 'fo' => { 'layout' => 'fo' }, 'fr' => { 'layout' => 'be', 'ambiguous' => 1 }, 'gaa' => { 'layout' => 'gh', 'variant' => 'ga' }, 'gd' => { 'layout' => 'ie', 'variant' => 'CloGaelach' }, 'gsw' => { 'layout' => 'ch' }, 'gu' => { 'layout' => 'in', 'variant' => 'guj' }, 'ha' => { 'layout' => 'gh', 'variant' => 'hausa', 'ambiguous' => 1 }, 'he' => { 'layout' => 'il' }, 'hi' => { 'layout' => 'in', 'variant' => 'bolnagri' }, 'hr' => { 'layout' => 'hr' }, 'hu' => { 'layout' => 'hu' }, 'hy' => { 'layout' => 'am' }, 'ig' => { 'layout' => 'ng', 'variant' => 'igbo' }, 'is' => { 'layout' => 'is' }, 'it' => { 'layout' => 'it' }, 'iu' => { 'layout' => 'ca', 'variant' => 'ike' }, 'ja' => { 'layout' => 'jp' }, 'ka' => { 'layout' => 'ge', 'ambiguous' => 1 }, 'kk' => { 'layout' => 'kz' }, 'km' => { 'layout' => 'kh' }, 'kn' => { 'layout' => 'in', 'variant' => 'kan' }, 'ko' => { 'layout' => 'kr' }, 'ku' => { 'layout' => 'iq', 'ambiguous' => 1 }, 'kv' => { 'layout' => 'ru', 'variant' => 'kom' }, 'ky' => { 'layout' => 'kg' }, 'lo' => { 'layout' => 'la' }, 'lt' => { 'layout' => 'lt' }, 'lv' => { 'layout' => 'lv' }, 'mi' => { 'layout' => 'mao' }, 'mk' => { 'layout' => 'mk' }, 'ml' => { 'layout' => 'in', 'variant' => 'mal' }, 'mng' => { 'layout' => 'mn' }, 'mt' => { 'layout' => 'mt' }, 'my' => { 'layout' => 'mm' }, 'ne' => { 'layout' => 'np' }, 'nl' => { 'layout' => 'nl' }, 'no' => { 'layout' => 'no' }, 'or' => { 'layout' => 'in', 'variant' => 'ori' }, 'os' => { 'layout' => 'ge', 'variant' => 'os', 'ambiguous' => 1 }, 'pa' => { 'layout' => 'in', 'variant' => 'guru' }, 'pl' => { 'layout' => 'pl' }, 'ps' => { 'layout' => 'af', 'variant' => 'ps' }, 'pt' => { 'layout' => 'br', 'ambiguous' => 1 }, 'ro' => { 'layout' => 'ro' }, 'ru' => { 'layout' => 'ru', 'ambiguous' => 1 }, 'sah' => { 'layout' => 'ru', 'variant' => 'sah' }, 'se' => { 'layout' => 'fi', 'variant' => 'smi', 'ambiguous' => 1 }, 'si' => { 'layout' => 'lk' }, 'sk' => { 'layout' => 'sk' }, 'sl' => { 'layout' => 'si' }, 'smi' => { 'layout' => 'fi', 'variant' => 'smi' }, 'sq' => { 'layout' => 'al' }, 'sr' => { 'layout' => 'me', 'ambiguous' => 1 }, 'sv' => { 'layout' => 'se' }, 'syr' => { 'layout' => 'sy' }, 'ta' => { 'layout' => 'in', 'variant' => 'tam_unicode', 'ambiguous' => 1 }, 'te' => { 'layout' => 'in', 'variant' => 'tel' }, 'tg' => { 'layout' => 'tj' }, 'th' => { 'layout' => 'th' }, 'tr' => { 'layout' => 'tr' }, 'tt' => { 'layout' => 'ru', 'variant' => 'tt' }, 'udm' => { 'layout' => 'ru', 'variant' => 'udm' }, 'uk' => { 'layout' => 'ua' }, 'ur' => { 'layout' => 'pk' }, 'uz' => { 'layout' => 'uz' }, 'vi' => { 'layout' => 'vn' }, 'xal' => { 'layout' => 'ru', 'variant' => 'xal' }, 'yo' => { 'layout' => 'ng', 'variant' => 'yoruba' }, 'zh' => { 'layout' => 'cn' }, );
{ 'layout' => 'ad' }, { 'layout' => 'af' }, { 'layout' => 'af', 'variant' => 'ps' }, { 'layout' => 'af', 'variant' => 'uz' }, { 'layout' => 'al' }, { 'layout' => 'am' }, { 'layout' => 'ara' }, { 'layout' => 'az' }, { 'layout' => 'ba' }, { 'layout' => 'bd' }, { 'layout' => 'be' }, { 'layout' => 'bg' }, { 'layout' => 'br' }, { 'layout' => 'br', 'variant' => 'nativo-epo' }, { 'layout' => 'bt' }, { 'layout' => 'by' }, { 'layout' => 'ca' }, { 'layout' => 'ca', 'variant' => 'eng' }, { 'layout' => 'ca', 'variant' => 'ike' }, { 'layout' => 'cd' }, { 'layout' => 'ch' }, { 'layout' => 'ch', 'variant' => 'fr' }, { 'layout' => 'cn' }, { 'layout' => 'cn', 'variant' => 'tib' }, { 'layout' => 'cz' }, { 'layout' => 'de' }, { 'layout' => 'de', 'variant' => 'dsb' }, { 'layout' => 'dk' }, { 'layout' => 'ee' }, { 'layout' => 'epo' }, { 'layout' => 'es' }, { 'layout' => 'es', 'variant' => 'ast' }, { 'layout' => 'es', 'variant' => 'cat' }, { 'layout' => 'et' }, { 'layout' => 'fi' }, { 'layout' => 'fi', 'variant' => 'smi' }, { 'layout' => 'fo' }, { 'layout' => 'fr' }, { 'layout' => 'fr', 'variant' => 'geo' }, { 'layout' => 'gb' }, { 'layout' => 'ge' }, { 'layout' => 'ge', 'variant' => 'os' }, { 'layout' => 'ge', 'variant' => 'ru' }, { 'layout' => 'gh' }, { 'layout' => 'gh', 'variant' => 'akan' }, { 'layout' => 'gh', 'variant' => 'ewe' }, { 'layout' => 'gh', 'variant' => 'fula' }, { 'layout' => 'gh', 'variant' => 'ga' }, { 'layout' => 'gh', 'variant' => 'hausa' }, { 'layout' => 'gn' }, { 'layout' => 'gr' }, { 'layout' => 'hr' }, { 'layout' => 'hu' }, { 'layout' => 'ie' }, { 'layout' => 'ie', 'variant' => 'CloGaelach' }, { 'layout' => 'il' }, { 'layout' => 'in' }, { 'layout' => 'in', 'variant' => 'ben' }, { 'layout' => 'in', 'variant' => 'bolnagri' }, { 'layout' => 'in', 'variant' => 'guj' }, { 'layout' => 'in', 'variant' => 'guru' }, { 'layout' => 'in', 'variant' => 'kan' }, { 'layout' => 'in', 'variant' => 'mal' }, { 'layout' => 'in', 'variant' => 'ori' }, { 'layout' => 'in', 'variant' => 'tam_unicode' }, { 'layout' => 'in', 'variant' => 'tel' }, { 'layout' => 'in', 'variant' => 'urd-phonetic' }, { 'layout' => 'iq' }, { 'layout' => 'ir' }, { 'layout' => 'ir', 'variant' => 'ku' }, { 'layout' => 'is' }, { 'layout' => 'it' }, { 'layout' => 'it', 'variant' => 'geo' }, { 'layout' => 'jp' }, { 'layout' => 'kg' }, { 'layout' => 'kh' }, { 'layout' => 'kr' }, { 'layout' => 'kz' }, { 'layout' => 'kz', 'variant' => 'ruskaz' }, { 'layout' => 'la' }, { 'layout' => 'latam' }, { 'layout' => 'lk' }, { 'layout' => 'lk', 'variant' => 'tam_unicode' }, { 'layout' => 'lt' }, { 'layout' => 'lv' }, { 'layout' => 'mao' }, { 'layout' => 'ma', 'variant' => 'french' }, { 'layout' => 'ma', 'variant' => 'tifinagh' }, { 'layout' => 'me' }, { 'layout' => 'mk' }, { 'layout' => 'mm' }, { 'layout' => 'mn' }, { 'layout' => 'mt' }, { 'layout' => 'mv' }, { 'layout' => 'ng' }, { 'layout' => 'ng', 'variant' => 'hausa' }, { 'layout' => 'ng', 'variant' => 'igbo' }, { 'layout' => 'ng', 'variant' => 'yoruba' }, { 'layout' => 'nl' }, { 'layout' => 'no' }, { 'layout' => 'no', 'variant' => 'smi' }, { 'layout' => 'np' }, { 'layout' => 'pk' }, { 'layout' => 'pk', 'variant' => 'ara' }, { 'layout' => 'pl' }, { 'layout' => 'pl', 'variant' => 'csb' }, { 'layout' => 'pl', 'variant' => 'ru_phonetic_dvorak' }, { 'layout' => 'pt' }, { 'layout' => 'pt', 'variant' => 'nativo-epo' }, { 'layout' => 'ro' }, { 'layout' => 'rs' }, { 'layout' => 'ru' }, { 'layout' => 'ru', 'variant' => 'cv' }, { 'layout' => 'ru', 'variant' => 'kom' }, { 'layout' => 'ru', 'variant' => 'os_legacy' }, { 'layout' => 'ru', 'variant' => 'sah' }, { 'layout' => 'ru', 'variant' => 'tt' }, { 'layout' => 'ru', 'variant' => 'udm' }, { 'layout' => 'ru', 'variant' => 'xal' }, { 'layout' => 'se' }, { 'layout' => 'se', 'variant' => 'rus' }, { 'layout' => 'se', 'variant' => 'smi' }, { 'layout' => 'si' }, { 'layout' => 'sk' }, { 'layout' => 'sy' }, { 'layout' => 'sy', 'variant' => 'ku' }, { 'layout' => 'th' }, { 'layout' => 'tj' }, { 'layout' => 'tr' }, { 'layout' => 'tr', 'variant' => 'ku' }, { 'layout' => 'ua' }, { 'layout' => 'us' }, { 'layout' => 'us', 'variant' => 'altgr-intl' }, { 'layout' => 'us', 'variant' => 'chr' }, { 'layout' => 'uz' }, { 'layout' => 'vn' }, { 'layout' => 'za' },