Merge "Show the suggestion strip for the important notice"
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 841675a..522180f 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Koppel \'n kopstuk om te hoor hoe wagwoordsleutels hardop gesê word."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Huidige teks is %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Geen teks ingevoer nie"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> korrigeer <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> voer outokorrigering uit"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Sleutelkode %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift aan (tik om te deaktiveer)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Foonmodus"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Foonsimbool-modus"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Sleutelbord versteek"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Wys tans <xliff:g id="KEYBOARD_MODE">%s</xliff:g>-sleutelbord"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum en tyd"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pos"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Engels (VK)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Engels (VS)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Spaans (VS)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engels (VK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engels (VS) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spaans (VS) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Tradisioneel)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Geen taal nie (alfabet)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lees eksterne woordeboeklêer"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Geen woordeboeklêers in die aflaaiselsvouer nie"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Kies \'n woordeboeklêer om te installeer"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Moet hierdie lêer regtig vir <xliff:g id="LANGUAGE_NAME">%s</xliff:g> geïnstalleer word?"</string>
     <string name="error" msgid="8940763624668513648">"Daar was \'n fout"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Gooi kontaktewoordeboek weg"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Gooi persoonlike woordeboek weg"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Verfris"</string>
     <string name="last_update" msgid="730467549913588780">"Laas opgedateer"</string>
     <string name="message_updating" msgid="4457761393932375219">"Kontroleer vir opdaterings"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Laai tans…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Hoofwoordeboek"</string>
     <string name="cancel" msgid="6830980399865683324">"Kanselleer"</string>
     <string name="install_dict" msgid="180852772562189365">"Installeer"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Kanselleer"</string>
     <string name="delete_dict" msgid="756853268088330054">"Vee uit"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Die gekose taal op jou mobiele toestel het \'n beskikbare woordeboek.&lt;br/&gt; Ons beveel aan dat die <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-woordeboek &lt;b&gt;afgelaai&lt;/b&gt; word om jou tikervaring te verbeter.&lt;br/&gt; &lt;br/&gt; Dit kan \'n minuut of twee duur om oor 3G af te laai. Heffings kan dalk geld as jy nie \'n &lt;b&gt;onbeperkte dataplan&lt;/b&gt;.&lt;br/&gt; het nie. As jy onseker is oor watter dataplan jy het, beveel ons aan dat jy \'n Wi-Fi-verbinding soek om outomaties te begin aflaai.&lt;br/&gt; &lt;br/&gt; Wenk: Jy kan woordeboeke aflaai en verwyder deur te gaan na &lt;b&gt;Taal en invoer&lt;/b&gt; in die &lt;b&gt;Instellings&lt;/b&gt;-kieslys van jou mobiele toestel."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Laai nou af (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Laai oor Wi-Fi af"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"\'n Woordeboek is beskikbaar vir <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Druk om te hersien en af te laai"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Laai tans af: voorstelle vir <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> sal binnekort gereed wees."</string>
     <string name="version_text" msgid="2715354215568469385">"Weergawe <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Voeg by"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Voeg by woordeboek"</string>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index c7ef42d..63fde8c 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"يمكنك توصيل سماعة رأس لسماع مفاتيح كلمة المرور منطوقة بصوت عالٍ."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"‏النص الحالي هو %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"لم يتم إدخال نص"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> لتصحيح <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> إلى <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> لإجراء التصحيح التلقائي"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"‏رمز المفتاح %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"العالي"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"‏Shift يعمل (انقر للتعطيل)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"وضع الهاتف"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"وضع رموز الهاتف"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"لوحة المفاتيح مخفية"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"إظهار لوحة مفاتيح <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"التاريخ"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"التاريخ والوقت"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"البريد الإلكتروني"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"الإنجليزية (المملكة المتحدة)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"الإنجليزية (الولايات المتحدة)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"الإسبانية (الأميركية)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"الإنجليزية (المملكة المتحدة) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"الإنجليزية (الولايات المتحدة) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"الإسبانية (الولايات المتحدة) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (التقليدية)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"بدون لغة (أبجدية)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"‏الأبجدية (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"‏الأبجدية (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"قراءة ملف قاموس خارجي"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ليست هناك ملفات قواميس في مجلد التنزيلات"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"تحديد ملف قاموس للتثبيت"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"هل تريد حقًا تثبيت هذا الملف للغة <xliff:g id="LANGUAGE_NAME">%s</xliff:g>؟"</string>
     <string name="error" msgid="8940763624668513648">"حدث خطأ"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"تفريغ معجم جهات الاتصال"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"تفريغ المعجم الشخصي"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"تحديث"</string>
     <string name="last_update" msgid="730467549913588780">"تاريخ آخر تحديث"</string>
     <string name="message_updating" msgid="4457761393932375219">"جارٍ البحث عن تحديثات"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"جارٍ التحميل…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"القاموس الرئيسي"</string>
     <string name="cancel" msgid="6830980399865683324">"إلغاء"</string>
     <string name="install_dict" msgid="180852772562189365">"تثبيت"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"إلغاء"</string>
     <string name="delete_dict" msgid="756853268088330054">"حذف"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"‏اللغة المحددة على جهازك الجوّال تشتمل على قاموس متوفر.&lt;br/&gt; نوصي &lt;b&gt;بتنزيل&lt;/b&gt; قاموس <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> لتحسين تجربة الكتابة.&lt;br/&gt; &lt;br/&gt; قد يستغرق التنزيل دقيقة أو دقيقتين عبر شبكة الجيل الثالث. قد تنطبق الرسوم إذا لم تكن مشتركًا في &lt;b&gt;خطة البيانات غير المحدودة&lt;/b&gt;.&lt;br/&gt; إذا لم تكن متأكدًا من خطة البيانات المتوفرة لديك، فنحن نوصي بالبحث عن اتصال Wi-Fi لبدء عملية التنزيل تلقائيًا.&lt;br/&gt; &lt;br/&gt; نصيحة: يمكنك تنزيل القواميس وإزالتها من خلال الانتقال إلى &lt;b&gt;اللغة والإدخال&lt;/b&gt; في القائمة &lt;b&gt;إعدادات&lt;/b&gt; في جهازك الجوّال."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"التنزيل الآن (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> ميغابايت)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"‏التنزيل عبر شبكة Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"هناك قاموس متوفر للغة <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"اضغط للمراجعة والتنزيل"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"جارٍ التنزيل: ستتوفر اقتراحات للغة <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> قريبًا."</string>
     <string name="version_text" msgid="2715354215568469385">"الإصدار <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"إضافة"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"إضافة إلى القاموس"</string>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index 9900b32..a164d8e 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Включете слушалки, за да чуете клавишите за паролата на висок глас."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Текущият текст е %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Няма въведен текст"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"„<xliff:g id="KEY_NAME">%1$s</xliff:g>“ коригира „<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>“ на „<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>“"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"„<xliff:g id="KEY_NAME">%1$s</xliff:g>“ изпълнява автоматично коригиране"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Код на клавишa %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"„Shift“ е включен (докоснете за деактивиране)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим  за телефон"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим за символи на телефона"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Клавиатурата е скрита"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Показва се клавиатурата за <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"дата"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"дата и час"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"имейл aдреси"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"английски (Великобритания)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"английски (САЩ)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"испански (САЩ)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"английски (Великобр.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"английски (САЩ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"испански (САЩ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (традиционен)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Без език (латиница)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Латиница (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Латиница (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Четене на файл за външен речник"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"В папката „Изтегляния“ няма файлове за речник"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Изберете файл за речника, който да инсталирате"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Наистина ли да се инсталира този файл за <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Възникна грешка"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Разтоварване на речника с контакти"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Разтоварване на частния речник"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Опресняване"</string>
     <string name="last_update" msgid="730467549913588780">"Последна актуализация:"</string>
     <string name="message_updating" msgid="4457761393932375219">"Проверява се за актуализации"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Зарежда се…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Основен речник"</string>
     <string name="cancel" msgid="6830980399865683324">"Отказ"</string>
     <string name="install_dict" msgid="180852772562189365">"Инсталиране"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Отказ"</string>
     <string name="delete_dict" msgid="756853268088330054">"Изтриване"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Налице е речник за избрания език на мобилното ви устройство.&lt;br/&gt; Препоръчваме ви &lt;b&gt;да изтеглите&lt;/b&gt; речника за <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>, за да подобрите практическата си работа при писане.&lt;br/&gt; &lt;br/&gt; Изтеглянето през 3G може да отнеме една до две минути. Възможно е да бъдете таксувани, ако нямате &lt;b&gt;неограничен план за данни&lt;/b&gt;.&lt;br/&gt; В случай че не сте сигурни какъв е вашият план, ви препоръчваме да намерите Wi-Fi връзка, за да започнете автоматично изтеглянето.&lt;br/&gt; &lt;br/&gt; Съвет: Можете да изтегляте и премахвате речници, като отворите &lt;b&gt;Език и въвеждане&lt;/b&gt; в менюто &lt;b&gt;Настройки&lt;/b&gt; на мобилното си устройство."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Изтегляне сега (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> МБ)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Изтегляне през Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"За <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> е налице речник"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Натиснете, за да прегледате и изтеглите"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Изтегля се: Предложенията за <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ще бъдат готови скоро."</string>
     <string name="version_text" msgid="2715354215568469385">"Версия <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Добавяне"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Добавяне в речника"</string>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index 4c42b22..305d255 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Connecta un auricular per escoltar les claus de la contrasenya en veu alta."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"El text actual és %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"No s\'ha introduït cap text"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corregeix <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> per <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>."</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> executa la correcció automàtica."</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Clau de codi %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Maj"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Maj activat (pica per desactivar)"</string>
@@ -93,7 +91,7 @@
     <string name="spoken_description_to_alpha" msgid="23129338819771807">"Lletres"</string>
     <string name="spoken_description_to_numeric" msgid="591752092685161732">"Números"</string>
     <string name="spoken_description_settings" msgid="4627462689603838099">"Configuració"</string>
-    <string name="spoken_description_tab" msgid="2667716002663482248">"Pestanya"</string>
+    <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulador"</string>
     <string name="spoken_description_space" msgid="2582521050049860859">"Espai"</string>
     <string name="spoken_description_mic" msgid="615536748882611950">"Entrada de veu"</string>
     <string name="spoken_description_smiley" msgid="2256309826200113918">"Cara somrient"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode de telèfon"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode de símbols de telèfon"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclat amagat"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Es mostra el teclat per a <xliff:g id="KEYBOARD_MODE">%s</xliff:g>."</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"data i hora"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"correu electrònic"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Anglès (Regne Unit)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Anglès (EUA)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Espanyol (EUA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Anglès (Regne Unit) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Anglès (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Espanyol (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicional)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Cap idioma (alfabet)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lectura d\'un fitxer de diccionari extern"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No hi ha cap fitxer de diccionari a la carpeta Baixades"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecció d\'un fitxer de diccionari per instal·lar"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Realment vols instal·lar aquest fitxer per a <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"S\'ha produït un error"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Esborrar el diccionari de contactes"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Esborrar el diccionari personal"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Actualitza"</string>
     <string name="last_update" msgid="730467549913588780">"Última actualització"</string>
     <string name="message_updating" msgid="4457761393932375219">"S\'està comprovant si hi ha actualitzacions"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"S\'està carregant..."</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Diccionari principal"</string>
     <string name="cancel" msgid="6830980399865683324">"Cancel·la"</string>
     <string name="install_dict" msgid="180852772562189365">"Instal·la"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Cancel·la"</string>
     <string name="delete_dict" msgid="756853268088330054">"Suprimeix"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Hi ha un diccionari disponible per a l\'idioma seleccionat al teu dispositiu mòbil.&lt;br/&gt; Et recomanem que &lt;b&gt;baixis&lt;/b&gt; el diccionari per a <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> per millorar la teva experiència d\'escriptura.&lt;br/&gt; &lt;br/&gt; La baixada pot trigar un parell de minuts en xarxes 3G. Si no tens un &lt;b&gt;pla de dades il·limitat&lt;/b&gt;,&lt;br/&gt; és possible que s\'apliquin càrrecs. Si no estàs segur de les característiques del teu pla de dades, et recomanem que cerquis una connexió Wi-Fi per iniciar la baixada automàticament.&lt;br/&gt; &lt;br/&gt;Consell: Pots baixar i suprimir diccionaris a la secció &lt;b&gt;Idioma i introducció de text&lt;/b&gt; del menú &lt;b&gt;Configuració&lt;/b&gt; del dispositiu mòbil."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Baixa ara (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Baixa mitjançant Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Hi ha disponible un diccionari per a <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Prem per revisar-lo i per baixar-lo"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Baixada: els suggeriments per a <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estaran disponibles ben aviat."</string>
     <string name="version_text" msgid="2715354215568469385">"Versió <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Afegeix"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Afegeix al diccionari"</string>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index 0eededc..1b2fb0c 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Chcete-li slyšet, které klávesy jste při zadávání hesla stiskli, připojte sluchátka."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Aktuální text je %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Není zadán žádný text"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"Klávesou <xliff:g id="KEY_NAME">%1$s</xliff:g> opravíte <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"Klávesou <xliff:g id="KEY_NAME">%1$s</xliff:g> provedete automatickou opravu"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Kód klávesy %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Klávesa Shift je zapnutá (vypnete ji klepnutím)."</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Režim telefonu"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Režim telefonních symbolů"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klávesnice je skrytá"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Je zobrazena klávesnice <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum a čas"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"angličtina (Velká Británie)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"angličtina (USA)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"španělština (USA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"angličtina (VB) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"angličtina (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"španělština (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradiční)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Žádný jazyk (latinka)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Latinka (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Latinka (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Číst soubor externího slovníku"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Ve složce Stažené nejsou žádné soubory slovníků."</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vyberte soubor slovníku k instalaci"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Chcete nainstalovat tento soubor pro jazyk <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Došlo k chybě"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Vypsat slovník kontaktů"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Vypsat osobní slovník"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Aktualizovat"</string>
     <string name="last_update" msgid="730467549913588780">"Poslední aktualizace"</string>
     <string name="message_updating" msgid="4457761393932375219">"Kontrola aktualizací"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Načítání…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Hlavní slovník"</string>
     <string name="cancel" msgid="6830980399865683324">"Zrušit"</string>
     <string name="install_dict" msgid="180852772562189365">"Instalovat"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Zrušit"</string>
     <string name="delete_dict" msgid="756853268088330054">"Smazat"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Pro vybraný jazyk mobilního zařízení je k dispozici slovník.&lt;br/&gt; Doporučujeme slovník pro jazyk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> &lt;b&gt;stáhnout&lt;/b&gt;. Usnadníte si tím zadávání textu. &lt;br/&gt; &lt;br/&gt; V síti 3G bude stahování trvat minutu až dvě. Pokud nemáte &lt;b&gt;neomezený datový tarif&lt;/b&gt;, mohou vám být účtovány poplatky.&lt;br/&gt; Jestliže si nejste jisti, jaký datový tarif máte, doporučujeme vám najít připojení Wi-Fi. Stahování se pak zahájí automaticky.&lt;br/&gt; &lt;br/&gt; Tip: Slovníky můžete stahovat a odstraňovat v nabídce mobilního zařízení &lt;b&gt;Jazyk a zadávání&lt;/b&gt; v &lt;b&gt;Nastavení&lt;/b&gt;."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Stáhnout ihned (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Stáhnout pouze přes Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Je k dispozici slovník pro jazyk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Stisknutím zkontrolujete a stáhnete"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Stahování: návrhy pro jazyk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> budou brzy k dispozici."</string>
     <string name="version_text" msgid="2715354215568469385">"Verze <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Přidat"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Přidat do slovníku"</string>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index 3796847..b64684d 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Tilslut et headset for at høre indtastningen blive læst højt ved angivelse af adgangskode."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Nuværende tekst er %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Der er ingen indtastet tekst"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> retter <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> til <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> udfører automatisk stavekontrol"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Tastekode %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift-tast"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Skift er slået til (tryk for at deaktivere)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefontilstand"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefonsymboltilstand"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastaturet er skjult"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Viser tastatur til <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"dato"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"Dato og klokkeslæt"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Engelsk (Storbritannien)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Engelsk (USA)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Spansk (USA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engelsk (Storbritannien) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engelsk (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spansk (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditionelt)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Intet sprog (Alfabet)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Læs ekstern ordbogsfil"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Der er ingen ordbogsfiler i mappen Downloads"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vælg den ordbog, som du vil installere"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Vil du virkelig installere denne fil for <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Der opstod en fejl"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Eksportér ordbog for kontakter"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Eksportér personlig ordbog"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Opdater"</string>
     <string name="last_update" msgid="730467549913588780">"Sidst opdateret"</string>
     <string name="message_updating" msgid="4457761393932375219">"Søger efter opdateringer"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Indlæser…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Hovedordbog"</string>
     <string name="cancel" msgid="6830980399865683324">"Annuller"</string>
     <string name="install_dict" msgid="180852772562189365">"Installer"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Annuller"</string>
     <string name="delete_dict" msgid="756853268088330054">"Slet"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Det valgte sprog på din mobilenhed har en tilgængelig ordbog.&lt;br/&gt; Vi anbefaler, at du &lt;b&gt;downloader&lt;/b&gt; <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-ordbogen for at forbedre din skriveoplevelse.&lt;br/&gt; &lt;br/&gt; Downloaden kan tage 1-2 minutter via 3G. Der bliver muligvis opkrævet et gebyr, hvis du ikke har et &lt;b&gt;ubegrænset dataabonnement&lt;/b&gt;.&lt;br/&gt;. Hvis du ikke er sikker på, hvilket dataabonnement du har, anbefaler vi, at du finder en Wi-Fi-forbindelse for at starte automatisk download.&lt;br/&gt; &lt;br/&gt;Tip! Du kan downloade og fjerne ordbøger ved at gå til &lt;b&gt;Sprog og input &lt;/b&gt; i menuen &lt;b&gt;Indstillinger&lt;/b&gt; på din mobilenhed."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Download nu (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Download via Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Der er en ordbog tilgængelig for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Tryk for at gennemgå og downloade"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Downloader: Der vil snart være forslag klar på <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string>
     <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Tilføj"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Føj til ordbog"</string>
diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml
index a24973d..137a2df 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Schließen Sie ein Headset an, um das Passwort gesprochen zu hören."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Aktueller Text lautet %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Kein Text eingegeben"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"Mit <xliff:g id="KEY_NAME">%1$s</xliff:g> wird \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" in \"<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>\" geändert."</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"Mit <xliff:g id="KEY_NAME">%1$s</xliff:g> erfolgt eine Autokorrektur."</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Tastencode %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift aktiviert (zum Deaktivieren berühren)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonmodus"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefon-Symbolmodus"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastatur ausgeblendet"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Tastatur für <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"Datum"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"Datum &amp; Uhrzeit"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"E-Mail-Adresse"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Englisch (UK)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Englisch (USA)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Spanisch (USA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Englisch (GB) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Englisch (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spanisch (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditionell)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Keine Sprache (lat. Alphabet)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Lat. Alphabet (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Lat. Alphabet (QWERTZ)"</string>
@@ -173,13 +166,12 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Externe Wörterbuchdatei lesen"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Keine Wörterbuchdateien im Ordner \"Downloads\""</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Wörterbuchdatei zum Installieren auswählen"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Möchten Sie diese Datei für <xliff:g id="LANGUAGE_NAME">%s</xliff:g> installieren?"</string>
     <string name="error" msgid="8940763624668513648">"Es ist ein Fehler aufgetreten"</string>
-    <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Kontaktwörterbuch sichern"</string>
-    <string name="prefs_dump_user_dict" msgid="294870685041741951">"Persönliches Wörterbuch sichern"</string>
-    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Nutzerverlaufswörterbuch sichern"</string>
-    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Personalisierungswörterbuch sichern"</string>
+    <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Auszug Kontaktwörterbuch"</string>
+    <string name="prefs_dump_user_dict" msgid="294870685041741951">"Auszug persönliches Wörterbuch"</string>
+    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Auszug Nutzerverlaufswörterbuch"</string>
+    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Auszug Personalisierungswörterbuch"</string>
     <string name="button_default" msgid="3988017840431881491">"Standard"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"Willkommen bei <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_welcome_additional_description" msgid="8150252008545768953">"mit Bewegungseingabe"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Aktualisieren"</string>
     <string name="last_update" msgid="730467549913588780">"Zuletzt aktualisiert"</string>
     <string name="message_updating" msgid="4457761393932375219">"Suche nach Updates..."</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Wird geladen…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Allgemeines Wörterbuch"</string>
     <string name="cancel" msgid="6830980399865683324">"Abbrechen"</string>
     <string name="install_dict" msgid="180852772562189365">"Installieren"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Abbrechen"</string>
     <string name="delete_dict" msgid="756853268088330054">"Löschen"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Für die auf dem Mobilgerät ausgewählte Sprache ist ein Wörterbuch verfügbar.&lt;br/&gt; &lt;b&gt;Laden Sie das <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-Wörterbuch herunter&lt;/b&gt; und verbessern Sie Ihre Eingabeerfahrung.&lt;br/&gt; &lt;br/&gt; Der Download über 3G kann ein bis zwei Minuten dauern. Falls Sie keine &lt;b&gt;Datenflatrate&lt;/b&gt; haben, fallen eventuell Gebühren an.&lt;br/&gt; Sollten Sie sich nicht sicher sein, welchen Datentarif Sie haben, suchen Sie eine WLAN-Verbindung, um den Download automatisch zu starten.&lt;br/&gt; &lt;br/&gt; Tipp: Im Menü &lt;b&gt;Einstellungen&lt;/b&gt; Ihres Mobilgeräts können Sie unter &lt;b&gt;Sprache &amp; Eingabe&lt;/b&gt; Wörterbücher herunterladen und entfernen."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Jetzt herunterladen (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Über WLAN herunterladen"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Es ist ein Wörterbuch für <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> verfügbar."</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Zum Lesen und Herunterladen drücken"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Download wurde gestartet: Vorschläge für <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> sind in Kürze bereit."</string>
     <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Hinzufügen"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Zum Wörterbuch hinzufügen"</string>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index 3373c67..b73a729 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Συνδέστε ένα σετ ακουστικών για να ακούσετε τα πλήκτρα του κωδικού πρόσβασης να εκφωνούνται δυνατά."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Το τρέχον κείμενο είναι %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Δεν υπάρχει κείμενο"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> διορθώνει το <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> σε <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> εκτελεί αυτόματη διόρθωση"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Κωδικός πλήκτρου %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Το Shift είναι ενεργοποιημένο (πατήστε για απενεργοποίηση)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Λειτουργία τηλεφώνου"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Λειτουργία συμβόλων τηλεφώνου"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Πληκτρολόγιο είναι κρυμμένο"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Εμφάνιση πληκτρολογίου <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"ημερομηνία"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"ημερομηνία και ώρα"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"διεύθυνση ηλεκτρονικού ταχυδρομείου"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Αγγλικά (Η.Β.)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Αγγλικά (Η.Π.Α)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Ισπανικά (ΗΠΑ)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Αγγλικά (Ηνωμένο Βασίλειο) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Αγγλικά (ΗΠΑ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Ισπανικά (ΗΠΑ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Παραδοσιακά)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Καμία γλώσσα (Αλφάβητο)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Αλφάβητο (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Αλφάβητο (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ανάγνωση εξωτερικού αρχείου λεξικού"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Δεν υπάρχουν αρχεία λεξικού στο φάκελο \"Λήψεις\""</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Επιλογή αρχείου λεξικού για εγκατάσταση"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Εγκατάσταση αυτού του αρχείου για τα <xliff:g id="LANGUAGE_NAME">%s</xliff:g>;"</string>
     <string name="error" msgid="8940763624668513648">"Παρουσιάστηκε σφάλμα."</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Αποτύπωση λεξικού επαφών"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Αποτύπωση προσωπικού λεξικού"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Ανανέωση"</string>
     <string name="last_update" msgid="730467549913588780">"Τελευταία ενημέρωση"</string>
     <string name="message_updating" msgid="4457761393932375219">"Έλεγχος για ενημερώσεις"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Φόρτωση…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Κύριο λεξικό"</string>
     <string name="cancel" msgid="6830980399865683324">"Ακύρωση"</string>
     <string name="install_dict" msgid="180852772562189365">"Εγκατάσταση"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Ακύρωση"</string>
     <string name="delete_dict" msgid="756853268088330054">"Διαγραφή"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Η επιλεγμένη γλώσσα στην κινητή συσκευή σας διαθέτει λεξικό.&lt;br/&gt; Προτείνουμε να &lt;b&gt;κατεβάσετε&lt;/b&gt; το λεξικό <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> για βελτίωση της πληκτρολόγησης.&lt;br/&gt; &lt;br/&gt; Για τη λήψη μπορεί να χρειαστούν 1 ή 2 λεπτά μέσω 3G. Ενδέχεται να ισχύουν χρεώσεις αν δεν έχετε διαθέτετε&lt;b&gt;πρόγραμμα απεριόριστων δεδομένων&lt;/b&gt;.&lt;br/&gt; Αν δεν γνωρίζετε ποιο πρόγραμμα δεδομένων διαθέτετε, προτείνουμε να χρησιμοποιήσετε μια σύνδεση Wi-Fi για να ξεκινήσει αυτόματα η λήψη.&lt;br/&gt; &lt;br/&gt; Συμβουλή: Μπορείτε να κατεβάσετε και να καταργήσετε λεξικά, από την περιοχή &lt;b&gt;Γλώσσα και εισαγωγή&lt;/b&gt;, στο μενού &lt;b&gt;Ρυθμίσεις&lt;/b&gt; της κινητής συσκευής σας."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Άμεση λήψη (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Λήψη μέσω Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Υπάρχει διαθέσιμο λεξικό για τα <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Πατήστε για έλεγχο και λήψη"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Λήψη: οι προτάσεις για τα <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> θα είναι έτοιμες σύντομα."</string>
     <string name="version_text" msgid="2715354215568469385">"Έκδοση <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Προσθήκη"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Προσθήκη στο λεξικό"</string>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index 8a3cbee..967a673 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Plug in a headset to hear password keys spoken aloud."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Current text is %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"No text entered"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> performs auto-correction"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Key code %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift on (tap to disable)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Phone mode"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Phone symbols mode"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Keyboard hidden"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Showing <xliff:g id="KEYBOARD_MODE">%s</xliff:g> keyboard"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"date"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"date and time"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"English (UK)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"English (US)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Spanish (US)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"English (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"English (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spanish (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Traditional)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"No language (Alphabet)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alphabet (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alphabet (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Read external dictionary file"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No dictionary files in the Downloads folder"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Select a dictionary file to install"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Really install this file for <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"There was an error"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Dump contacts dictionary"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Dump personal dictionary"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Refresh"</string>
     <string name="last_update" msgid="730467549913588780">"Last updated"</string>
     <string name="message_updating" msgid="4457761393932375219">"Checking for updates"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Loading…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Main dictionary"</string>
     <string name="cancel" msgid="6830980399865683324">"Cancel"</string>
     <string name="install_dict" msgid="180852772562189365">"Install"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Cancel"</string>
     <string name="delete_dict" msgid="756853268088330054">"Delete"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"The selected language on your mobile device has an available dictionary.&lt;br/&gt; We recommend &lt;b&gt;downloading&lt;/b&gt; the <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> dictionary to improve your typing experience.&lt;br/&gt; &lt;br/&gt; The download could take a minute or two over 3G. Charges may apply if you don\'t have an &lt;b&gt;unlimited data plan&lt;/b&gt;.&lt;br/&gt; If you are not sure which data plan you have, we recommend finding a Wi-Fi connection to start the download automatically.&lt;br/&gt; &lt;br/&gt; Tip: You can download and remove dictionaries by going to &lt;b&gt;Language &amp; input&lt;/b&gt; in the &lt;b&gt;Settings&lt;/b&gt; menu of your mobile device."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Download now (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Download over Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"A dictionary is available for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Press to review and download"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Downloading: suggestions for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> will be ready soon."</string>
     <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Add"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Add to dictionary"</string>
diff --git a/java/res/values-en-rIN/strings.xml b/java/res/values-en-rIN/strings.xml
index 8a3cbee..967a673 100644
--- a/java/res/values-en-rIN/strings.xml
+++ b/java/res/values-en-rIN/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Plug in a headset to hear password keys spoken aloud."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Current text is %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"No text entered"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> performs auto-correction"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Key code %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift on (tap to disable)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Phone mode"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Phone symbols mode"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Keyboard hidden"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Showing <xliff:g id="KEYBOARD_MODE">%s</xliff:g> keyboard"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"date"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"date and time"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"English (UK)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"English (US)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Spanish (US)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"English (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"English (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spanish (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Traditional)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"No language (Alphabet)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alphabet (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alphabet (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Read external dictionary file"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No dictionary files in the Downloads folder"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Select a dictionary file to install"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Really install this file for <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"There was an error"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Dump contacts dictionary"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Dump personal dictionary"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Refresh"</string>
     <string name="last_update" msgid="730467549913588780">"Last updated"</string>
     <string name="message_updating" msgid="4457761393932375219">"Checking for updates"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Loading…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Main dictionary"</string>
     <string name="cancel" msgid="6830980399865683324">"Cancel"</string>
     <string name="install_dict" msgid="180852772562189365">"Install"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Cancel"</string>
     <string name="delete_dict" msgid="756853268088330054">"Delete"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"The selected language on your mobile device has an available dictionary.&lt;br/&gt; We recommend &lt;b&gt;downloading&lt;/b&gt; the <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> dictionary to improve your typing experience.&lt;br/&gt; &lt;br/&gt; The download could take a minute or two over 3G. Charges may apply if you don\'t have an &lt;b&gt;unlimited data plan&lt;/b&gt;.&lt;br/&gt; If you are not sure which data plan you have, we recommend finding a Wi-Fi connection to start the download automatically.&lt;br/&gt; &lt;br/&gt; Tip: You can download and remove dictionaries by going to &lt;b&gt;Language &amp; input&lt;/b&gt; in the &lt;b&gt;Settings&lt;/b&gt; menu of your mobile device."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Download now (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Download over Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"A dictionary is available for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Press to review and download"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Downloading: suggestions for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> will be ready soon."</string>
     <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Add"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Add to dictionary"</string>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index d62f9dc..3e5b910 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Enchufa tus auriculares para escuchar en voz alta qué teclas presionas al ingresar una contraseña."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"El texto actual es %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"No se ingresó texto."</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> por <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>."</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige automáticamente."</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Clave de código %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Mayús"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Se activó el modo Mayúscula (toca para desactivarlo)."</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo Teléfono"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo Símbolos del teléfono"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Mostrando teclado para <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"fecha"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"fecha y hora"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"correo"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Inglés (Reino Unido)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Inglés (EE.UU.)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Español (EE.UU.)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglés, Reino Unido (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglés, EE. UU. (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Español, EE. UU. (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicional)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Ningún idioma (alfabeto)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Leer archivo de diccionario externo"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No hay archivos de diccionario en la carpeta de descargas."</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Seleccionar archivo de diccionario para instalar"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"¿Realmente quieres instalar este archivo para <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Se produjo un error."</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Volcar diccionario de contactos"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Volcar diccionario personal"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Actualizar"</string>
     <string name="last_update" msgid="730467549913588780">"Última actualización"</string>
     <string name="message_updating" msgid="4457761393932375219">"Buscando actualizaciones"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Cargando…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Diccionario principal"</string>
     <string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
     <string name="install_dict" msgid="180852772562189365">"Instalar"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string>
     <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Hay un diccionario disponible para el idioma seleccionado en tu dispositivo móvil.&lt;br/&gt; Te recomendamos que &lt;b&gt;descargues&lt;/b&gt; el diccionario de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> para mejorar tu experiencia de escritura.&lt;br/&gt; &lt;br/&gt; La descarga puede tardar unos minutos en redes 3G. Si no tienes un &lt;b&gt;plan de datos ilimitado&lt;/b&gt;, es posible que se apliquen cargos.&lt;br/&gt; Si no sabes qué plan de datos tienes, te recomendamos que uses una conexión Wi-Fi para iniciar la descarga automáticamente.&lt;br/&gt; &lt;br/&gt; Sugerencia: Puedes descargar y eliminar diccionarios desde &lt;b&gt;Teclado e idioma&lt;/b&gt; en el menú &lt;b&gt;Configuración&lt;/b&gt; del dispositivo móvil."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Descargar ahora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Descargar por Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Hay un diccionario disponible de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Pulsar para opinar y descargar"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"La descarga de sugerencias para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estará lista en breve."</string>
     <string name="version_text" msgid="2715354215568469385">"Versión <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Agregar"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Agregar al diccionario"</string>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index 392acc8..37692f1 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Conecta un auricular para escuchar las contraseñas en voz alta."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"El texto actual es %s."</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"No se ha introducido texto."</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> a <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corregirá la palabra automáticamente"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Código del teclado: %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Mayús"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Mayúsculas activadas (tocar para inhabilitar)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo de teléfono"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo de símbolos de teléfono"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Mostrando teclado de <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"fecha"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"fecha y hora"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"correo electrónico"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"inglés (Reino Unido)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"inglés (EE.UU.)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Español (EE.UU.)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglés (Reino Unido) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglés (EE.UU.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Español (EE.UU.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicional)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Ningún idioma (alfabeto)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Leer archivo de diccionario externo"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No hay archivos de diccionario en la carpeta de descargas."</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecciona un archivo de diccionario para instalar"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"¿Seguro que quieres instalar este archivo para <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Se ha producido un error"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Volcar diccionario de contactos"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Volcar diccionario personal"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Actualizar"</string>
     <string name="last_update" msgid="730467549913588780">"Última actualización"</string>
     <string name="message_updating" msgid="4457761393932375219">"Buscando actualizaciones"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Cargando…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Diccionario principal"</string>
     <string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
     <string name="install_dict" msgid="180852772562189365">"Instalar"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string>
     <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Hay un diccionario disponible para el idioma seleccionado en tu dispositivo móvil.&lt;br/&gt; Te recomendamos que &lt;b&gt;descargues&lt;/b&gt; el diccionario de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> para mejorar la experiencia de escritura.&lt;br/&gt; &lt;br/&gt; La descarga puede tardar unos minutos en redes 3G. Es posible que se apliquen cargos si no tienes un &lt;b&gt;plan de datos ilimitado&lt;/b&gt;.&lt;br/&gt; Si no sabes con certeza cuál es tu plan de datos, te recomendamos que te conectes a una red Wi-Fi para que la descarga empiece automáticamente.&lt;br/&gt; &lt;br/&gt; Consejo: Puedes descargar y eliminar diccionarios en la sección &lt;b&gt;Idioma e introducción de texto&lt;/b&gt; en el menú &lt;b&gt;Ajustes&lt;/b&gt; de tu dispositivo móvil."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Descargar ahora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Descargar mediante Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Hay disponible un diccionario de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Pulsa para comprobar y descargar"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"La descarga de sugerencias para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estará disponible próximamente."</string>
     <string name="version_text" msgid="2715354215568469385">"Versión <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Añadir"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Añadir al diccionario"</string>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index 4d2decf..f4a006e 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Priključite slušalice da biste čuli tipke zaporke izgovorene naglas."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Trenutačni tekst je %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nije unesen tekst"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ispravlja <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> u <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> vrši samoispravljanje"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Kôd tipke %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Uključena tipka Shift (dotaknite da onemogućite)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonski način rada"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Način unosa telefonskih simbola"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tipkovnica je skrivena"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Način prikazane tipkovnice: <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum i vrijeme"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pošta"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Engleski (UK)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Engleski (SAD)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"španjolski (SAD)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"engleska (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"engleska (SAD) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"španjolska (SAD) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicionalna)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Nema jezika (abeceda)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Abeceda (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Abeceda (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Čitanje datoteke vanjskog rječnika"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"U mapi Preuzimanja nema datoteka rječnika"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Odabir datoteke rječnika za instaliranje"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Želite li zaista instalirati tu datoteku za <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Došlo je do pogreške"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Kopiranje rječnika kontakata"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Kopiranje osobnog rječnika"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Osvježavanje"</string>
     <string name="last_update" msgid="730467549913588780">"Zadnje ažuriranje"</string>
     <string name="message_updating" msgid="4457761393932375219">"Provjera ažuriranja"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Učitavanje…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Glavni rječnik"</string>
     <string name="cancel" msgid="6830980399865683324">"Odustani"</string>
     <string name="install_dict" msgid="180852772562189365">"Instaliraj"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Odustani"</string>
     <string name="delete_dict" msgid="756853268088330054">"Izbriši"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Dostupan je rječnik za odabrani jezik na vašem mobilnom uređaju.&lt;br/&gt; Preporučujemo da &lt;b&gt;preuzmete&lt;/b&gt; <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> rječnik radi lakšeg unosa teksta.&lt;br/&gt; &lt;br/&gt; Preuzimanje može potrajati jednu do dvije minute putem 3G-a. Možda se naplaćuje dodatna naknada ako nemate &lt;b&gt;neograničenu podatkovnu tarifu&lt;/b&gt;.&lt;br/&gt; Ako niste sigurni koju tarifu imate, preporučujemo da pronađete Wi-Fi vezu kako bi se automatski pokrenulo preuzimanje.&lt;br/&gt; &lt;br/&gt; Savjet: rječnike možete preuzeti i ukloniti u odjeljku &lt;b&gt;Jezik i unos&lt;/b&gt; u izborniku &lt;b&gt;Postavke&lt;/b&gt; na mobilnom uređaju."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Preuzmi sada (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Preuzmi putem Wi-Fi mreže"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Dostupan je rječnik za <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> jezik"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Pritisnite za pregled i preuzimanje"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Preuzimanje: prijedlozi za <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> bit će spremni uskoro."</string>
     <string name="version_text" msgid="2715354215568469385">"Verzija <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Dodavanje"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Dodaj u rječnik"</string>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index 918e504..faaadbb 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Csatlakoztasson egy headsetet, ha hallani szeretné a jelszót felolvasva."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"A jelenlegi szöveg: %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Szöveg nincs megadva"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> billentyű: <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> szóra javítja a következőt: <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> billentyű automatikus javítást végez"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Billentyűkód: %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift be van kapcsolva (érintse meg a kikapcsoláshoz)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"\"Telefon\" mód"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"\"Telefonos szimbólumok\" mód"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Billentyűzet elrejtve"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> billentyűzet megjelenítve"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"dátum"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"dátum és idő"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"angol (brit)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"angol (amerikai)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"spanyol (USA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"angol (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"angol (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"spanyol (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (hagyományos)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Nincs nyelv (ábécé)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Ábécé (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Ábécé (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Külső szótárfájl olvasása"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Nincs szótárfájl a Letöltések mappában."</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Válasszon ki egy szótárfájlt a telepítéshez."</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Valóban telepíti ezt a fájlt <xliff:g id="LANGUAGE_NAME">%s</xliff:g> nyelvhez?"</string>
     <string name="error" msgid="8940763624668513648">"Hiba történt."</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Névjegyszótár törlése"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Személyes szótár törlése"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Frissítés"</string>
     <string name="last_update" msgid="730467549913588780">"Legutóbb frissítve"</string>
     <string name="message_updating" msgid="4457761393932375219">"Frissítések keresése"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Betöltés…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Fő szótár"</string>
     <string name="cancel" msgid="6830980399865683324">"Mégse"</string>
     <string name="install_dict" msgid="180852772562189365">"Telepítés"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Mégse"</string>
     <string name="delete_dict" msgid="756853268088330054">"Törlés"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"A mobileszközön kiválasztott nyelvhez szótár érhető el.&lt;br/&gt; A gépelési élmény javításához javasoljuk a(z) <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> szótár &lt;b&gt;letöltését.&lt;br/&gt; &lt;br/&gt; A letöltés 3G hálózaton keresztül néhány percig tart. Ha &lt;b&gt;előfizetése nem korlátlan&lt;/b&gt;, a letöltés költségekkel járhat.&lt;br/&gt; Ha nem biztos abban, hogy milyen adatcsomagot használ, javasoljuk, hogy keressen egy Wi-Fi-kapcsolatot a letöltés automatikus elindításához.&lt;br/&gt; &lt;br/&gt; Tipp: szótárakat a mobileszköz &lt;b&gt;Beállítások&lt;/b&gt; menüjében a &lt;b&gt;Nyelv és bevitel&lt;/b&gt; részben tölthet le és távolíthat el."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Töltse le most (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Letöltés Wi-Fivel"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> nyelvhez van rendelkezésre álló szótár"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Nyomja meg az áttekintéshez és letöltéshez"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Letöltés: a(z) <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> nyelvvel kapcsolatos javaslatok hamarosan elérhetők lesznek."</string>
     <string name="version_text" msgid="2715354215568469385">"Verzió: <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Hozzáadás"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Hozzáadás a szótárhoz"</string>
diff --git a/java/res/values-hy-rAM/strings.xml b/java/res/values-hy-rAM/strings.xml
index e4a0dc9..f281f67 100644
--- a/java/res/values-hy-rAM/strings.xml
+++ b/java/res/values-hy-rAM/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Միացրեք ականջակալը՝ բարձրաձայն արտասանվող գաղտնաբառը լսելու համար:"</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Տվյալ տեքստը %s է"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Տեքստ չի մուտքագրվել"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g>-ը շտկում է <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-ը և դարձնում <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ստեղնը ինքնաշտկում է կատարում"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Բանալու կոդը՝ %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift-ը միացված է (հպել անջատելու համար)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Հեռախոսային ռեժիմ"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Հեռախոսի նշանների ռեժիմ"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Ստեղնաշարը թաքցված է"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Ցուցադրվում է <xliff:g id="KEYBOARD_MODE">%s</xliff:g> ստեղնաշարը"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"ամսաթիվ"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"ամսաթիվ և ժամ"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"էլփոստ"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Անգլերեն (ՄԹ)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Անգլերեն (ԱՄՆ)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Իսպաներեն (ԱՄՆ)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Անգլերեն (ՄԹ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Անգլերեն (ԱՄՆ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Իսպաներեն (ԱՄՆ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ավանդական)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Ոչ մի լեզվով (Այբուբեն)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Այբուբեն (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Այբուբեն (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Կարդալ արտաքին բառարանի ֆայլը"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Ներբեռնումների թղթապանակում բառարանային ֆայլեր չկան"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Ընտրեք բառարանային ֆայլը տեղադրման համար"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Տեղադրե՞լ այս ֆայլը <xliff:g id="LANGUAGE_NAME">%s</xliff:g> լեզվի համար:"</string>
     <string name="error" msgid="8940763624668513648">"Տեղի է ունեցել սխալ"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Բեռնել կոնտակտների բառարանը"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Բեռնել անձնական բառարանը"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Թարմացնել"</string>
     <string name="last_update" msgid="730467549913588780">"Վերջին անգամ թարմացվել է"</string>
     <string name="message_updating" msgid="4457761393932375219">"Ստուգվում է թարմացումների առկայությունը"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Բեռնում..."</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Հիմնական բառարան"</string>
     <string name="cancel" msgid="6830980399865683324">"Չեղարկել"</string>
     <string name="install_dict" msgid="180852772562189365">"Տեղադրել"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Չեղարկել"</string>
     <string name="delete_dict" msgid="756853268088330054">"Ջնջել"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Ձեր բջջային սարքում ընտրված լեզվով առկա է բառարան:<br/> Խորհուրդ ենք տալիս &lt;b&gt;ներբեռնել&lt;/b&gt; <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> բառարանը՝ ձեր մուտքագրման հմտությունների բարելավման համար:&lt;br/&gt; &lt;br/&gt; Ներբեռնումը կարող է խլել մեկ կամ երկու րոպե 3G-ի դեպքում: Հնարավոր է գանձում կատարվի, եթե դուք չունեք &lt;b&gt;տվյալների անսահմանափակ փաթեթ&lt;/b&gt;.&lt;br/&gt; Եթե դուք վստահ չեք, թե տվյալների որ փաթեթն ունեք, խորհուրդ ենք տալիս գտնել Wi-Fi կապ՝ ներբեռնումն ավտոմատ սկսելու համար:&lt;br/&gt; &lt;br/&gt; Հուշում. դուք կարող եք ներբեռնել և հեռացնել բառարաններ՝ անցնելով ձեր բջջային սարքի &lt;b&gt;Կարգավորումներ ցանկի Լեզու և մուտքագրում&lt;/b&gt; բաժինը:"</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Ներբեռնել հիմա (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>Մբ)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Ներբեռնել Wi-Fi-ով"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> լեզվի համար առկա է բառարան"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Սեղմեք՝ վերանայելու և ներբեռնելու համար"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Ներբեռնում. <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> լեզվի համար առաջարկները պատրաստ կլինեն շուտով:"</string>
     <string name="version_text" msgid="2715354215568469385">"Տարբերակ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Ավելացնել"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Ավելացնել բառարանում"</string>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 59061a8..888219a 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Pasang headset untuk mendengar tombol sandi yang diucapkan dengan keras."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Teks saat ini adalah %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Tidak ada teks yang dimasukkan"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> mengoreksi <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> menjadi <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> melakukan koreksi otomatis"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Kode tombol %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift hidup (ketuk untuk mematikan)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode telepon"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode simbol telepon"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Keyboard disembunyikan"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Menampilkan keyboard <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"tanggal"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"tanggal dan waktu"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Inggris (Inggris)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Inggris (AS)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Spanyol (AS)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>) Inggris (Inggris)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>) Inggris (AS)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>) Spanyol (AS)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Tradisional)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Tidak ada bahasa (Abjad)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Abjad (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Abjad (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Membaca file kamus eksternal"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Tidak ada file kamus di folder Unduhan"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pilih file kamus untuk dipasang"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Yakin ingin memasang file ini untuk <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Terjadi kesalahan"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Kosongkan kamus kontak"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Kosongkan kamus pribadi"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Segarkan"</string>
     <string name="last_update" msgid="730467549913588780">"Terakhir diperbarui"</string>
     <string name="message_updating" msgid="4457761393932375219">"Memeriksa pembaruan"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Memuat…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Kamus utama"</string>
     <string name="cancel" msgid="6830980399865683324">"Batal"</string>
     <string name="install_dict" msgid="180852772562189365">"Pasang"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Batal"</string>
     <string name="delete_dict" msgid="756853268088330054">"Hapus"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Bahasa pilihan pada perangkat seluler Anda memiliki kamus yang tersedia.&lt;br/&gt; Sebaiknya &lt;b&gt;unduh&lt;/b&gt; kamus <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> untuk meningkatkan pengalaman pengetikan.&lt;br/&gt; &lt;br/&gt; Unduhan dapat berlangsung selama satu atau dua menit melalui 3G. Mungkin dikenakan tagihan data jika Anda tidak memiliki &lt;b&gt;paket data tak terbatas&lt;/b&gt;.&lt;br/&gt; Jika Anda tidak yakin paket data mana yang Anda miliki, sebaiknya cari sambungan Wi-Fi untuk memulai unduhan secara otomatis.&lt;br/&gt; &lt;br/&gt; Kiat: Anda dapat mengunduh dan menghapus kamus dengan membuka &lt;b&gt;Bahasa &amp; masukan&lt;/b&gt; di menu &lt;b&gt;Setelan&lt;/b&gt; perangkat seluler Anda."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Unduh sekarang (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Unduh melalui Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Kamus tersedia untuk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Tekan untuk meninjau dan mengunduh"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Mengunduh: saran untuk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> akan segera tersedia."</string>
     <string name="version_text" msgid="2715354215568469385">"Versi <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Tambahkan"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Tambahkan ke kamus"</string>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index 4ccf44b..b688a9d 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Collega gli auricolari per ascoltare la pronuncia dei tasti premuti per la password."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Il testo attuale è %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nessun testo inserito"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corregge <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> con <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> esegue la correzione automatica"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Codice tasto %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Maiuscolo"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Maiuscolo attivo (tocca per disattivare)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modalità telefono"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modalità simboli telefono"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastiera nascosta"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Ecco la tastiera <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"data e ora"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Inglese (UK)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Inglese (USA)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Spagnolo (USA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglese (Regno Unito) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglese (Stati Uniti) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spagnolo (Stati Uniti) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradizionale)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Nessuna lingua (alfabeto)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string>
@@ -173,12 +166,11 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Leggi file dizionario esterno"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Nessun file di dizionario nella cartella Download"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Seleziona un file di dizionario da installare"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Vuoi davvero installare questo file per <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Si è verificato un errore"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Scarica dizionario contatti"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Scarica dizionario personale"</string>
-    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Scarica dizionario cronologia utente"</string>
+    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Scarica dizion. cronologia utente"</string>
     <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Scarica dizionario di personalizz."</string>
     <string name="button_default" msgid="3988017840431881491">"Predefinito"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"Benvenuto in <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Aggiorna"</string>
     <string name="last_update" msgid="730467549913588780">"Ultimo aggiornamento"</string>
     <string name="message_updating" msgid="4457761393932375219">"Verifica disponibilità aggiornamenti"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Caricamento..."</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Dizionario principale"</string>
     <string name="cancel" msgid="6830980399865683324">"Annulla"</string>
     <string name="install_dict" msgid="180852772562189365">"Installa"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Annulla"</string>
     <string name="delete_dict" msgid="756853268088330054">"Elimina"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Per la lingua selezionata sul dispositivo mobile è disponibile un dizionario.&lt;br/&gt; Ti consigliamo di &lt;b&gt;scaricare&lt;/b&gt; il dizionario in <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> per migliorare la digitazione.&lt;br/&gt; &lt;br/&gt; Il download potrebbe richiedere un paio di minuti su 3G. Potrebbero essere applicati costi se non disponi di un &lt;b&gt;piano dati illimitato&lt;/b&gt;.&lt;br/&gt; Se non sei sicuro di quale sia il tuo piano dati, dovresti trovare una connessione Wi-Fi per avviare il download automaticamente.&lt;br/&gt; &lt;br/&gt; Suggerimento. Puoi scaricare e rimuovere dizionari selezionando &lt;b&gt;Lingua e immissione&lt;/b&gt; nel menu &lt;b&gt;Impostazioni&lt;/b&gt; del dispositivo mobile."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Scarica ora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Scarica tramite Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"È disponibile un dizionario per: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Premi per esaminare e scaricare"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Download: i suggerimenti per <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> saranno pronti a breve."</string>
     <string name="version_text" msgid="2715354215568469385">"Versione <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Aggiungi"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Aggiungi al dizionario"</string>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index c794968..19f2466 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"חבר אוזניות כדי לשמוע הקראה של מפתחות סיסמה."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"‏הטקסט הנוכחי הוא %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"לא הוזן טקסט"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> מתקן את <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ל-<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> מבצע תיקון אוטומטי"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"‏קוד מקש %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"‏Shift פועל (הקש כדי להשבית)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"מצב טלפון"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"מצב סמלי טלפון"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"המקלדת מוסתרת"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"מציג מקלדת <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"תאריך"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"תאריך ושעה"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"דוא\"ל"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"אנגלית (בריטניה)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"אנגלית (ארה\"ב)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"ספרדית (ארצות הברית)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"אנגלית (בריטניה)‏ (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"אנגלית (ארה\"ב) ‏(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ספרדית (ארה\"ב) ‏(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (מסורתית)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"ללא שפה (אלף-בית)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"‏אלף-בית (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"‏אלף-בית (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"קריאה של קובץ מילון חיצוני"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"אין קובצי מילונים בתיקיית ההורדות"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"בחירת קובץ מילון להתקנה"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"האם אתה באמת רוצה להתקין את הקובץ הזה עבור <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"אירעה שגיאה"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"מחק את מילון אנשי הקשר"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"מחק מילון אישי"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"רענן"</string>
     <string name="last_update" msgid="730467549913588780">"עודכן לאחרונה"</string>
     <string name="message_updating" msgid="4457761393932375219">"מחפש עדכונים"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"טוען…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"מילון ראשי"</string>
     <string name="cancel" msgid="6830980399865683324">"בטל"</string>
     <string name="install_dict" msgid="180852772562189365">"התקן"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"בטל"</string>
     <string name="delete_dict" msgid="756853268088330054">"מחק"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"‏יש מילון זמין עבור השפה הנבחרת במכשיר הנייד שלך.&lt;br/&gt; אנחנו ממליצים &lt;b&gt;להוריד&lt;/b&gt; את המילון ב<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> לשיפור חוויית ההקלדה.&lt;br/&gt; &lt;br/&gt; ייתכן שההורדה תארך דקה או שתיים ברשת דור שלישי. ייתכנו חיובים אם אין לך &lt;b&gt;תכנית נתונים ללא הגבלה&lt;/b&gt;.&lt;br/&gt; אם אינך בטוח איזו תכנית נתונים יש לך, אנחנו ממליצים למצוא חיבור Wi-Fi כדי להתחיל את ההורדה באופן אוטומטי.&lt;br/&gt; &lt;br/&gt; טיפ: ניתן להוריד ולהסיר מילונים על ידי מעבר אל &lt;b&gt;שפה וקלט&lt;/b&gt; בתפריט &lt;b&gt;הגדרות&lt;/b&gt; של המכשיר הנייד."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"‏הורד עכשיו (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"‏הורד באמצעות Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"יש מילון זמין עבור <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"לחץ כדי לעיין ולהוריד"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"מוריד: הצעות עבור <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> יהיו מוכנות בקרוב."</string>
     <string name="version_text" msgid="2715354215568469385">"גרסה <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"הוסף"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"הוסף למילון"</string>
diff --git a/java/res/values-lo-rLA/strings.xml b/java/res/values-lo-rLA/strings.xml
index 976f30f..a206cdb 100644
--- a/java/res/values-lo-rLA/strings.xml
+++ b/java/res/values-lo-rLA/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"ສຽບສາຍຫູຟັງເພື່ອຟັງລະຫັດຜ່ານ."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"ຂໍ້ຄວາມປະຈຸບັນແມ່ນ %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"ບໍ່ມີການໃສ່ຂໍ້ຄວາມ"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ແກ້​ໄຂ​ <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ເປັນ <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ດຳ​ເນີນ​ການ​ແກ້​ໄຂ​ອັດ​ຕະ​ໂນ​ມັດ"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"ລະຫັດກະແຈ %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift ເປີດນຳໃຊ້ຢູ່ (ກົດເພື່ອປິດນຳໃຊ້)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"ໂຫມດໂທລະສັບ"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"ໂຫມດສັນຍາລັກໂທລະສັບ"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"ແປ້ນ​ພິມ​ເຊື່ອງ​ໄວ້"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"ກຳ​ລັງ​ສະ​ແດງແປ້ນ​ພິມ <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"ວັນທີ"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"ວັນ​ທີ​ແລະ​ເວ​ລາ"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"ອັງກິດ (ສະຫະລາດຊະອານາຈັກ)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"ອັງກິດ (ສະຫະລັດຯ)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"ສະເປນ (ອາເມລິກາ)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ອັງ​ກິດ (ສະ​ຫະ​ລາດ​ຊະ​ອາ​ນາ​ຈັກ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ອັງ​ກິດ (ສະ​ຫະ​ລັດຯ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ສະ​ແປນ​ນິດ (ສະ​ຫະ​ລັດຯ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ດັ້ງ​ເດີມ)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"ບໍ່ມີພາສາ (ໂຕອັກສອນ)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"ໂຕອັກສອນ (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"ໂຕອັກສອນ (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"ອ່ານໄຟລ໌ວັດຈະນານຸກົມພາຍນອກ"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ບໍ່ມີໄຟລ໌ວັດຈະນານຸກົມໃນໂຟນເດີຂອງການດາວໂຫລດ"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ເລືອກໄຟລ໌ວັດຈະນານຸກົມເພື່ອຕິດຕັ້ງ"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"ຕິດ​ຕັ້ງ​ໄຟ​ລ໌​ນີ້​ສຳ​ລັບ <xliff:g id="LANGUAGE_NAME">%s</xliff:g> ແທ້ບໍ່??"</string>
     <string name="error" msgid="8940763624668513648">"ມີຂໍ້ຜິດພາດເກີດຂຶ້ນ"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"ເທຂໍ້ມູນວັດຈະນານຸກົມລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"ເທຂໍ້ມູນວັດຈະນານຸກົມສ່ວນໂຕ"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"ດຶງຂໍ້ມູນໃຫມ່"</string>
     <string name="last_update" msgid="730467549913588780">"ອັບເດດຫຼ້າສຸດ"</string>
     <string name="message_updating" msgid="4457761393932375219">"ກຳລັງກວດການອັບເດດ"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"ກຳລັງໂຫຼດ..."</string>
     <string name="main_dict_description" msgid="3072821352793492143">"ວັດຈະນານຸກົມຫຼັກ"</string>
     <string name="cancel" msgid="6830980399865683324">"ຍົກເລີກ"</string>
     <string name="install_dict" msgid="180852772562189365">"ຕິດຕັ້ງ"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"ຍົກເລີກ"</string>
     <string name="delete_dict" msgid="756853268088330054">"ລຶບ"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"ພາ​ສາ​ທີ່​ເລືອກ​ໃນ​ອຸ​ປະ​ກອນ​ມື​ຖື​ຂອງ​ທ່າ​ນັ້ນ​ມີ​ວັດ​ຈະ​ນາ​ນຸ​ກົມ​ທີ່​ສາ​ມາດ​ໃຊ້​ໄດ້.&lt;br/&gt; ພວ​ກ​ເຮົາ​ຂໍ​ແນະ​ນຳ​ໃຫ້ &lt;b&gt;ດາວ​ໂຫລດ&lt;/b&gt; ວັດ​ຈ​ະ​ນາ​ນຸ​ກົມ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ເພື່ອ​ປັບ​ປຸງ​ປະ​ສົບ​ການ​ໃນ​ການ​ພິມ​ຂອງ​ທ່ານ.&lt;br/&gt; &lt;br/&gt; ການ​ດາວ​ໂຫລດ​ອາດ​ໃຊ້​ເວ​ລາ​ສອງ​ສາມ​ນາ​ທີ​ຜ່ານ​ເຄືອ​ຂ່າຍ 3G. ທ່ານ​ອາ​ດ​ຖືກ​ຮຽກ​ເກັບ​ຄ່າ​ຂໍ້​ມູນ​ໄດ້​ຫາກ​ທ່ານບໍ່​ໄດ້​ໃຊ້ &lt;b&gt;ແພັກ​ເກດ​ຂໍ້​ມູນ​ແບບບໍ່​ຈຳ​ກັດ&lt;/b&gt;.&lt;br/&gt; ຫາກ​ທ່ານບໍ່​ແນ່​ໃຈ​ວ່າ​ທ່ານ​ໃຊ້​ແພັກ​ເກດ​ແບບ​ໃດ​ຢູ່ ພວກ​ເຮົາ​ຂໍ​ແນະ​ນຳ​ໃຫ້​ທ່ານ​ເຊື່ອມ​ຕໍ່ເຄືອ​ຂ່າຍ Wi-Fi ໃດ​ນຶ່ງ​ແທນ​ເພື່ອ​ເລີ່ມ​ຕົ້ນ​ການ​ດາວ​ໂຫລດ​ໂດຍ​ອັດ​ຕະ​ໂນ​ມັດ.&lt;br/&gt; &lt;br/&gt; ເຄັດ​ລັບ: ທ່ານ​ສາ​ມາ​ດ​ດາວ​ໂຫລດ ແລະ​ລຶບ​ວັດ​ຈະ​ນາ​ນຸ​ກົມ​ອອກ​ໄດ້​ໂດຍ​ການ​ໄປ​ທີ່ &lt;b&gt;ພາ​ສາ &amp; ການ​ປ້ອນ​ຂໍ້​ມູນ&lt;/b&gt; ໃນ​ເມ​ນູ &lt;b&gt;ການ​ຕັ້ງ​ຄ່າ&lt;/b&gt; ຂອງ​ອຸ​ປະ​ກອນ​ມື​ຖື​ຂອງ​ທ່ານ."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"ດາວໂຫລດດຽວນີ້ (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"ດາວ​ໂຫລດຜ່ານ Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"ມີ​ວັດ​ຈະ​ນາ​ນຸ​ກົມ​ທີ່​ສາ​ມາດ​ໃຊ້​ໄດ້​ກັບ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"ກົດທີ່ກວດຄືນ ແລະ ດາວໂຫລດ"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ກຳ​ລັງ​ດາວ​ໂຫລດ: ການ​ແນະ​ນຳ​ສຳ​ລັບ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ຈະ​ພ້ອມ​ໃນ​ໄວໆ​ນີ້."</string>
     <string name="version_text" msgid="2715354215568469385">"ເວີຊັນ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"ເພີ່ມ"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"ເພີ່ມໄປທີ່ວັດຈະນານຸກົມ"</string>
diff --git a/java/res/values-mn-rMN/strings.xml b/java/res/values-mn-rMN/strings.xml
index 8d5f635..a89b974 100644
--- a/java/res/values-mn-rMN/strings.xml
+++ b/java/res/values-mn-rMN/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Нууц үгний товчнуудыг чангаар уншихыг сонсохын тулд чихэвчээ залгана уу."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Одоогийн текст %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Текст оруулаагүй"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> нь <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-г <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> руу залруулна"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> авто-залруулалт хийдэг"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Товчийн код %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Сэлгэх"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Сэлгэхийг идэвхжүүлсэн (товшиж идэвхгүйжүүлнэ үү)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Утасны төлөв"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Утасны символ төлөв"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Гарыг нуусан"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> гар харуулж байна"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"огноо"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"огноо болон цаг"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"и"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Англи (ИБ)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Англи (АНУ)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Испани (АНУ)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Англи (ИБ) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Англи (АНУ) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Испани (АНУ-ын) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (уламжлалт)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Хэл байхгүй (Цагаан толгой)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Цагаан толгой (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Цагаан толгой (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Толь бичгийн гадны файлыг унших"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Татаж авсан фолдерт толь бичгийн файл байхгүй байна"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Суулгах толь бичгийн файлыг сонгоно уу"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>-д зориулсан энэ файлыг үнэхээр суулгах уу?"</string>
     <string name="error" msgid="8940763624668513648">"Алдаа гарсан"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Харилцагчдын толь бичгийг хаях"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Хувийн толь бичгийг хаях"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Дахин шинэчлэх"</string>
     <string name="last_update" msgid="730467549913588780">"Сүүлд шинэчлэгдсэн"</string>
     <string name="message_updating" msgid="4457761393932375219">"Шинэчлэлтийг шалгаж байна"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Ачаалж байна..."</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Үндсэн толь бичиг"</string>
     <string name="cancel" msgid="6830980399865683324">"Цуцлах"</string>
     <string name="install_dict" msgid="180852772562189365">"Суулгах"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Цуцлах"</string>
     <string name="delete_dict" msgid="756853268088330054">"Устгах"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Таны мобайл төхөөрөмж дээр сонгосон хэлний толь бичиг байна. &lt;br/&gt; Бид танд <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> хэлний толь бичиг &lt;b&gt; татаж аван &lt;/ б&gt; бичихэд хялбар болгохыг зөвлөж байна. &lt;br/&gt; &lt;br/&gt; Татаж авахад 3G дээр нэг, хоёр минут болж магадгүй. Хэрэв та  &lt;b&gt; хязгааргүй дата ашиглах эрхтэй &lt;/ б&gt; биш бол нэмэлт төлбөр гарч болно. Хэрэв та өөрийн дата ашиглалтын эрхийг сайн мэдэхгүй байгаа бол Wi-Fi холболт ашиглан автоматаар татан авахыг эхлүүлэхийг зөвлөж байна.&lt;br/&gt; &lt;br/&gt; &lt;br/&gt; Зөвлөмж: Та өөрийн мобайл төхөөрөмжийн &lt;b&gt; тохиргоо &lt;/ б&gt; цэсэнд &lt;/ б&gt; Хэл &amp; оролт &lt;b&gt; руу очиж толь бичиг татаж авах, устгах боломжтой."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Одоо татах (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi-р татаж авах"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> хэлний толь ашиглах боломжтой"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Шалгах болон татаж авахын тулд дарна уу"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-д зориулсан татан авалтын санал болголтууд удахгүй бэлэн болно."</string>
     <string name="version_text" msgid="2715354215568469385">"Хувилбар <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Нэмэх"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Толь бичигт нэмэх"</string>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index 8a95959..510bef4 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Koble til hodetelefoner for å høre opplesing av bokstavene i passordet."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Gjeldende tekst er %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Ingen tekst er skrevet inn"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> retter <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> til <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> utfører automatisk retting"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Tastaturkode %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift er på (trykk for å deaktivere)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Ringemodus"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Ringemodus med symboler"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastaturet er skjult"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Viser <xliff:g id="KEYBOARD_MODE">%s</xliff:g>-tastatur"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"dato"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"dato og klokkeslett"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"e-post"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Engelsk (Storbritannia)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Engelsk (USA)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Spansk (USA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engelsk (Storbritannia) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engelsk (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spansk (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradisjonell)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Ingen språk (alfabet)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string>
@@ -173,13 +166,12 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Bruk en ekstern ordlistefil"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Det ligger ingen ordboksfiler i Nedlastinger-mappen"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Velg ordboksfilen du vil installere"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Vil du virkelig installere denne filen for <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Det oppsto en feil"</string>
-    <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Slett kontakter-ordlisten"</string>
-    <string name="prefs_dump_user_dict" msgid="294870685041741951">"Slett den personlige ordlisten"</string>
-    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Slett brukerlogg-ordlisten"</string>
-    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Slett tilpasningsordlisten"</string>
+    <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Tøm kontakter-ordlisten"</string>
+    <string name="prefs_dump_user_dict" msgid="294870685041741951">"Tøm den personlige ordlisten"</string>
+    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Tøm brukerlogg-ordlisten"</string>
+    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Tøm tilpasningsordlisten"</string>
     <string name="button_default" msgid="3988017840431881491">"Standard"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"Velkommen til <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_welcome_additional_description" msgid="8150252008545768953">"med Ordføring"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Last inn på nytt"</string>
     <string name="last_update" msgid="730467549913588780">"Sist oppdatert"</string>
     <string name="message_updating" msgid="4457761393932375219">"Ser etter oppdateringer ..."</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Laster inn …"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Hovedordliste"</string>
     <string name="cancel" msgid="6830980399865683324">"Avbryt"</string>
     <string name="install_dict" msgid="180852772562189365">"Installer"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Avbryt"</string>
     <string name="delete_dict" msgid="756853268088330054">"Slett"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Det valgte språket på mobilenheten din har en tilgjengelig ordliste.&lt;br/&gt; Vi anbefaler å &lt;b&gt;laste ned&lt;/b&gt; ordlisten for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>. Dette forbedrer skriveopplevelsen din.&lt;br/&gt; &lt;br/&gt; Nedlastingen kan ta fra ett til to minutter via 3G. Belastninger kan påløpe hvis du ikke har et abonnement med &lt;b&gt;ubegrenset databruk&lt;/b&gt;.&lt;br/&gt; Hvis du er usikker på hvilken abonnementstype du har, anbefaler vi deg å finne en Wi-Fi-tilkobling for å starte nedlastingen automatisk.&lt;br/&gt; &lt;br/&gt; Tips: Du kan laste ned og fjerne ordlister ved å gå til &lt;b&gt;Språk og inndata&lt;/b&gt; i menyen for &lt;b&gt;Innstillinger&lt;/b&gt; på mobilenheten din."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Last ned nå (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Last ned via Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"En ordliste er tilgjengelig for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Trykk for å se gjennom og laste ned"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Laster ned: forslag til <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> er snart klare"</string>
     <string name="version_text" msgid="2715354215568469385">"Versjon <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Legg til"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Legg til i ordlisten"</string>
diff --git a/java/res/values-ne-rNP/strings.xml b/java/res/values-ne-rNP/strings.xml
index 8e2ca1e..fa7ebd2 100644
--- a/java/res/values-ne-rNP/strings.xml
+++ b/java/res/values-ne-rNP/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"हेडसेट प्लग इन गर्नुहोस्"</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"वर्तमान पाठ %s हो"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"कुनै पाठ प्रविष्टि गरिएको छैन"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> सही <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> गर्न <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> स्वतः सच्याउने प्रदर्शन"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"कुञ्जी कोड %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"सिफ्ट"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"सिप्ट सक्रिय (असक्षम पार्न ट्याप गर्नुहोस्)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"फोन मोड"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"फोन प्रतिक मोड"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"किबोर्ड लुकाइएको छ"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Showing <xliff:g id="KEYBOARD_MODE">%s</xliff:g> कुञ्जीपाटी"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"मिति"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"मिति र समय"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"इमेल"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"अंग्रेजी (युके)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"अंग्रेजी (युएस्)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"स्पेनिस (युएस्)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"अंग्रेजी (बेलायत) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"अंग्रेजी (अमेरिका) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"स्पेनी (अमेरिका) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (परम्परागत)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"कुनै भाषा होइन (वर्णमाला)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"वर्णमाला (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"वर्णमाला (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"बाह्य शब्दकोश फाइल पढ्नुहोस्"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"डाउनलोड फोल्डरमा कुनै शब्दकोश फाइलहरू छैनन्।"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"स्थापना गर्न कुनै शब्दकोश फाइल चयन गर्नुहोस्"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"वास्तवमा लागि यो फाइल स्थापना <xliff:g id="LANGUAGE_NAME">%s</xliff:g> ?"</string>
     <string name="error" msgid="8940763624668513648">"कुनै त्रुटि भयो"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"सम्पर्क शब्दकोश डम्प गर्नुहोस्"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"व्यक्तिगत शब्दकोश डम्प गर्नुहोस्"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"पुनः ताजा गर्नुहोस्"</string>
     <string name="last_update" msgid="730467549913588780">"पछिल्लो अद्यावधिक"</string>
     <string name="message_updating" msgid="4457761393932375219">"अद्यावधिकको लागि जाँच गर्दै"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"लोड हुँदै..."</string>
     <string name="main_dict_description" msgid="3072821352793492143">"मुख्य शब्दकोश"</string>
     <string name="cancel" msgid="6830980399865683324">"रद्द गर्नुहोस्"</string>
     <string name="install_dict" msgid="180852772562189365">"स्थापना गर्नुहोस्"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"रद्द गर्नुहोस्"</string>
     <string name="delete_dict" msgid="756853268088330054">"मेट्नुहोस्"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"आफ्नो मोबाइल उपकरणमा चयन गरिएको भाषामा शब्दकोश उपलब्ध छ। &lt;br/&gt; हामी डाउनलोड गर्न &lt;/ b&gt; ले सिफारिस गर्छन् <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> आफ्नो टाइपिङ अनुभव सुधार्न शब्दकोश। यो विचारको यस डाउनलोड 3G मा एक वा दुई मिनेट लिन सक्छ। तपाईं एक &lt;b&gt; असीमित डेटा योजना &lt;/ b&gt; छैन भने शुल्क लागू हुन सक्छ। तपाईं हामी सुरु गर्न वाइफाइ जडान खोज्न सिफारिस, जो तपाईं डेटा योजना छैन भने &lt;br/&gt; को स्वतः डाउनलोड सल्लाह:। तपाईं डाउनलोड र &lt;b&gt; सेटिङ &lt;/ b&gt; मेनु मा &lt;/ b&gt; भाषा र इनपुट &lt;b&gt; जाने शब्दकोशलाई हटाउन सक्नुहुन्छ आफ्नो मोबाइल उपकरणको।"</string>
     <string name="download_over_metered" msgid="1643065851159409546">"(अब डाउनलोड गर्नुहोस्<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"वाइ-फाइको माध्ययमद्वार डाउनलोड गर्नुहोस्"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"एक शब्दकोश लागि उपलब्ध छ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"समीक्षा गर्न थिच्नुहोस् र डाउनलोड गर्नुहोस्"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Downloading: लागि सुझाव <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> चाँडै नै तयार हुनेछ।"</string>
     <string name="version_text" msgid="2715354215568469385">"संस्करण <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"थप्नुहोस्"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"शब्दकोशमा थप्नुहोस्"</string>
diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
index 231cd60..565811b 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Sluit een headset aan om wachtwoordtoetsen hardop te laten voorlezen."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Huidige tekst is %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Geen tekst ingevoerd"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"Met <xliff:g id="KEY_NAME">%1$s</xliff:g> wordt <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> gecorrigeerd naar <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"Met <xliff:g id="KEY_NAME">%1$s</xliff:g> voert u automatische correctie uit"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Toetscode %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift aan (tik om uit te schakelen)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Toetsenbord telefoon"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefoonsymbolen"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Toetsenbord verborgen"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> toetsenbord wordt weergegeven"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum en tijd"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Engels (GB)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Engels (VS)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Spaans (VS)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engels (VK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engels (VS) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spaans (VS) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditioneel)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Geen taal (alfabet)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Extern woordenboekbestand lezen"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Geen woordenboekbestanden in de map \'Downloads\'"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecteer een woordenboekbestand om te installeren"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Wilt u dit bestand voor het <xliff:g id="LANGUAGE_NAME">%s</xliff:g> echt installeren?"</string>
     <string name="error" msgid="8940763624668513648">"Er is een fout opgetreden"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Contactenwoordenboek dumpen"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Persoonlijk woordenboek dumpen"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Vernieuwen"</string>
     <string name="last_update" msgid="730467549913588780">"Laatst bijgewerkt"</string>
     <string name="message_updating" msgid="4457761393932375219">"Controleren op updates"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Laden…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Algemeen woordenboek"</string>
     <string name="cancel" msgid="6830980399865683324">"Annuleren"</string>
     <string name="install_dict" msgid="180852772562189365">"Installeren"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Annuleren"</string>
     <string name="delete_dict" msgid="756853268088330054">"Verwijderen"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Er is een woordenboek voor de geselecteerde taal beschikbaar op uw mobiele apparaat.&lt;br/&gt; We raden u aan het woordenboek voor het <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> te &lt;b&gt;downloaden&lt;/b&gt; om uw typvaardigheid te verbeteren.&lt;br/&gt; &lt;br/&gt; De download kan één of twee minuten duren via 3G. Er kunnen kosten worden berekend als u geen &lt;b&gt;onbeperkt gegevensabonnement&lt;/b&gt; heeft.&lt;br/&gt; Als u niet zeker weet welk gegevensabonnement u heeft, raden we u aan een wifi-verbinding te zoeken om de download automatisch te starten.&lt;br/&gt; &lt;br/&gt; Tip: u kunt woordenboeken downloaden en verwijderen via &lt;b&gt;Taal en invoer&lt;/b&gt; in het menu &lt;b&gt;Instellingen&lt;/b&gt; van uw mobiele apparaat."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Nu downloaden (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Downloaden via wifi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Er is een woordenboek beschikbaar voor het <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Druk om te controleren en te downloaden"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Downloaden: suggesties voor het <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> zijn straks beschikbaar."</string>
     <string name="version_text" msgid="2715354215568469385">"Versie <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Toevoegen"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Toevoegen aan woordenboek"</string>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index 5956263..15ce516 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Podłącz zestaw słuchawkowy, aby usłyszeć znaki hasła wypowiadane na głos."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Aktualny tekst: %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nie wprowadzono tekstu"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> poprawia <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> wykonuje autokorektę"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Kod klawisza: %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift włączony (kliknij, by wyłączyć)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Tryb telefonu"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Tryb symboli telefonu"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klawiatura ukryta"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Pokazuję klawiaturę w trybie <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"data i godzina"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"angielski (Wielka Brytania)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"angielski (Stany Zjednoczone)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"hiszpański (USA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Angielski (Wielka Brytania) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Angielski (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Hiszpański (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradycyjny)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Bez języka (alfabet)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Odczyt zewnętrznego pliku słownika"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Brak plików słownika w folderze Pobrane pliki"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Wybierz plik słownika do zainstalowania"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Czy na pewno zainstalować ten plik dla języka: <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Wystąpił błąd"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Zrzut słownika kontaktów"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Zrzut słownika osobistego"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Odśwież"</string>
     <string name="last_update" msgid="730467549913588780">"Ostatnia aktualizacja"</string>
     <string name="message_updating" msgid="4457761393932375219">"Sprawdzanie dostępności aktualizacji"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Wczytuję…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Słownik główny"</string>
     <string name="cancel" msgid="6830980399865683324">"Anuluj"</string>
     <string name="install_dict" msgid="180852772562189365">"Zainstaluj"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Anuluj"</string>
     <string name="delete_dict" msgid="756853268088330054">"Usuń"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Do języka, którego używasz na swoim urządzeniu przenośnym, jest dostępny słownik.&lt;br/&gt; Warto &lt;b&gt;pobrać&lt;/b&gt; ten słownik <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>, by ułatwić sobie pisanie.&lt;br/&gt; &lt;br/&gt; Pobieranie trwa do dwóch minut (przez 3G). Jeśli nie masz &lt;b&gt;abonamentu z nieograniczoną transmisją danych&lt;/b&gt;, operator może naliczyć opłatę.&lt;br/&gt; Jeśli nie wiesz, jaki masz abonament, połącz się z Wi-Fi, by automatycznie rozpocząć pobieranie.&lt;br/&gt; &lt;br/&gt; Wskazówka: słowniki możesz pobierać i usuwać w sekcji &lt;b&gt;Język, klawiatura, głos&lt;/b&gt; w menu &lt;b&gt;Ustawienia&lt;/b&gt; na urządzeniu."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Pobierz teraz (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Pobierz przez Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Dostępny jest słownik <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Naciśnij, by sprawdzić i pobrać"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Pobieranie – wkrótce będą dostępne sugestie w tym języku: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string>
     <string name="version_text" msgid="2715354215568469385">"Wersja <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Dodaj"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Dodaj do słownika"</string>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 1acf9d2..eb519d2 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Ligar auscultadores com microfone integrado para ouvir as teclas da palavra-passe."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"O texto atual é %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nenhum texto digitado"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> para <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> executa a correção automática"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Código da tecla %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift ativado (tocar para desativar)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo de telemóvel"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo de símbolos de telemóvel"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"A mostrar o teclado de <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"data e hora"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Inglês (RU)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Inglês (EUA)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"Espanhol (EUA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglês (RU) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglês (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Espanhol (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicional)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Sem idioma (alfabeto)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ler ficheiro de dicionário externo"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Não há ficheiros de dicionário na pasta Transferências"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecione um ficheiro de dicionário para instalar"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Instalar mesmo este ficheiro para <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Ocorreu um erro"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Descarregar dicionário de contactos"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Descarregar dicionário pessoal"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Atualizar"</string>
     <string name="last_update" msgid="730467549913588780">"Última atualização"</string>
     <string name="message_updating" msgid="4457761393932375219">"A verificar existência de atualizações"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"A carregar…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Dicionário principal"</string>
     <string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
     <string name="install_dict" msgid="180852772562189365">"Instalar"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string>
     <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"O idioma selecionado no disp. móvel tem um dicionário disponível.&lt;br/&gt; Recomendamos que &lt;b&gt;transfira&lt;/b&gt; o dicionário de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> para melhorar a sua experiência de introdução de texto.&lt;br/&gt; &lt;br/&gt; A transferência pode demorar um ou dois minutos através de 3G. Poderão ser aplicadas taxas se não tiver um &lt;b&gt;plano de dados ilimitado&lt;/b&gt;.&lt;br/&gt; Se não tiver a certeza do plano de dados que tem, recomendamos que procure uma ligação Wi-Fi para começar a transferência automaticamente.&lt;br/&gt; &lt;br/&gt; Sugestão: Pode transferir e remover dicionários acedendo a &lt;b&gt;Idioma e introdução&lt;/b&gt; no menu &lt;b&gt;Definições&lt;/b&gt; do disp. móvel."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Transferir agora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Transferir via Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Está disponível um dicionário de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Prima para consultar e transferir"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"A transferir: as sugestões para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estarão prontas em breve"</string>
     <string name="version_text" msgid="2715354215568469385">"Versão <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Adicionar"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Adicionar ao dicionário"</string>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index 2c278ec..5dacd77 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -176,10 +176,10 @@
     <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
     <skip />
     <string name="error" msgid="8940763624668513648">"Ошибка"</string>
-    <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Создать копию списка контактов"</string>
-    <string name="prefs_dump_user_dict" msgid="294870685041741951">"Создать копию польз. словаря"</string>
-    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Создать копию истории"</string>
-    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Создать копию польз. словаря"</string>
+    <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Выгрузить словарь контактов"</string>
+    <string name="prefs_dump_user_dict" msgid="294870685041741951">"Выгрузить личный словарь"</string>
+    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Выгрузить словарь польз. истории"</string>
+    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Выгрузить словарь персонализации"</string>
     <string name="button_default" msgid="3988017840431881491">"По умолчанию"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"Представляем приложение \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\""</string>
     <string name="setup_welcome_additional_description" msgid="8150252008545768953">"с непрерывным вводом"</string>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
index e1bfc71..3704e2c 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Priključite slušalke, če želite slišati izgovorjene tipke gesla."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Trenutno besedilo je %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Ni vnesenega besedila"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"Tipka <xliff:g id="KEY_NAME">%1$s</xliff:g> popravi <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> v <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> izvede samopopravek"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Koda tipke %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift je vklopljen (dotaknite se, da onemogočite)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Način telefona"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Način simbolov telefona"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tipkovnica je skrita"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Prikaz tipkovnice <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum in ura"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pošta"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"angleščina (Združeno kraljestvo)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"angleščina (ZDA)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"španščina (ZDA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"angleščina (VB) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"angleščina (ZDA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"španščina (ZDA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicionalna)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Brez jezika (latinice)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Latinica (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Latinica (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Branje zunanje datoteke slovarja"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"V mapi »Prenosi« ni nobene datoteke slovarja"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Izberite datoteko slovarja, ki jo želite namestiti"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Zares želite namestiti to datoteko za ta jezik: <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Prišlo je do napake"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Izvoz slovarja stikov"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Izvoz osebnega slovarja"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Osveži"</string>
     <string name="last_update" msgid="730467549913588780">"Nazadnje posodobljeno"</string>
     <string name="message_updating" msgid="4457761393932375219">"Iskanje posodobitev"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Nalaganje …"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Glavni slovar"</string>
     <string name="cancel" msgid="6830980399865683324">"Prekliči"</string>
     <string name="install_dict" msgid="180852772562189365">"Namesti"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Prekliči"</string>
     <string name="delete_dict" msgid="756853268088330054">"Izbriši"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Za izbrani jezik v mobilni napravi je na voljo slovar.&lt;br/&gt; Za izboljšano izkušnjo tipkanja priporočamo, da &lt;b&gt;prenesete&lt;/b&gt; slovar za ta jezik: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>.&lt;br/&gt; &lt;br/&gt; Prenos prek povezave 3G lahko traja minuto ali dve. Če nimate &lt;b&gt;neomejenega podatkovnega paketa&lt;/b&gt;.&lt;br/&gt;, boste morda morali plačati prenos podatkov. Če ne veste, kateri podatkovni paket imate, priporočamo, da poiščete omrežje Wi-Fi in prenos začnete samodejno.&lt;br/&gt; &lt;br/&gt; Nasvet: Slovarje lahko prenesete in odstranite tako, da v meniju &lt;b&gt;Nastavitve&lt;/b&gt; v mobilni napravi odprete &lt;b&gt;Jezik in vnos&lt;/b&gt;."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Prenesi zdaj (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Prenos prek povezave Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Na voljo je slovar za ta jezik: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Pritisnite za pregled in prenos"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Prenos: predlogi za jezik <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> bodo kmalu na voljo."</string>
     <string name="version_text" msgid="2715354215568469385">"Različica <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Dodaj"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Dodaj v slovar"</string>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index f521428..510a2e8 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Укључите слушалице да бисте чули наглас изговорене тастере за лозинку."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Тренутни текст је %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Текст није унет"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> исправља <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> у <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> обавља аутоматско исправљање"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Кôд тастера %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift је укључен (додирните да бисте га онемогућили)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим телефона"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим симбола телефона"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Тастатура је сакривена"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Приказујемо тастатуру у режиму <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"датум"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"датум и време"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"адреса е-поште"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"енглески (УК)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"енглески (САД)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"шпански (САД)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"енглески (УК) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"енглески (САД) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"шпански (САД) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (традиционални)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Нема језика (абецеда)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Абецеда (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Абецеда (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Читање датотеке спољног речника"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"У директоријуму Преузимања нема датотека речника"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Избор датотеке речника за инсталирање"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Желите ли стварно да инсталирате ову датотеку за <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Дошло је до грешке"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Избриши речник контаката"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Избриши лични речник"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Освежи"</string>
     <string name="last_update" msgid="730467549913588780">"Последње ажурирање"</string>
     <string name="message_updating" msgid="4457761393932375219">"Тражење ажурирања"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Учитавање…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Главни речник"</string>
     <string name="cancel" msgid="6830980399865683324">"Откажи"</string>
     <string name="install_dict" msgid="180852772562189365">"Инсталирај"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Откажи"</string>
     <string name="delete_dict" msgid="756853268088330054">"Избриши"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Доступан је речник за изабрани језик на мобилном уређају.&lt;br/&gt; Препоручујемо вам да &lt;b&gt;преузмете&lt;/b&gt; речник за <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> да бисте побољшали доживљај куцања.&lt;br/&gt; &lt;br/&gt; Преузимање може да траје минут или два преко 3G мреже. Трошкови ће можда бити наплаћени ако немате &lt;b&gt;претплатнички пакет без ограничења&lt;/b&gt;.&lt;br/&gt; Ако нисте сигурни који претплатнички пакет имате, препоручујемо вам да пронађете Wi-Fi везу да бисте аутоматски започели преузимање.&lt;br/&gt; &lt;br/&gt; Савет: Речнике можете да преузимате и уклањате ако одете на &lt;b&gt;Језик и унос&lt;/b&gt; у менију &lt;b&gt;Подешавања&lt;/b&gt; на мобилном уређају."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Преузми одмах (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Преузми преко Wi-Fi-ја"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Доступан је речник за <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Притисните за преглед и преузимање"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Преузимање: Предлози за <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ће ускоро бити спремни."</string>
     <string name="version_text" msgid="2715354215568469385">"Верзија <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Додај"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Додавање у речник"</string>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index 0f29e9e..0dcda09 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Anslut hörlurar om du vill att lösenordet ska läsas upp."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Nuvarande text är %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Ingen text har angetts"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"Om du trycker på <xliff:g id="KEY_NAME">%1$s</xliff:g> rättas <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> till <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"Om du trycker på <xliff:g id="KEY_NAME">%1$s</xliff:g> utförs autokorrigering"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Nyckelkod %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Skift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Skift på (knacka lätt för att inaktivera)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonläge"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefonsymbolläge"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tangentbordet är dolt"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Tangentbord för <xliff:g id="KEYBOARD_MODE">%s</xliff:g> visas"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum och tid"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"e-post"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Engelskt (brittiskt)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Engelskt (amerikanskt)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"spanska (USA)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engelska (Storbritannien) <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engelska (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spanska (USA (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditionell)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Inget språk (alfabet)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Läs extern ordboksfil"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Inga ordboksfiler i mappen Hämtningar"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Välj en ordboksfil att installera"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Vill du verkligen installera filen för <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Ett fel uppstod"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Dumpa ordlista för kontakter"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Dumpa personlig ordlista"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Uppdatera"</string>
     <string name="last_update" msgid="730467549913588780">"Informationen uppdaterades senast"</string>
     <string name="message_updating" msgid="4457761393932375219">"Söker efter uppdateringar"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Läser in …"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Huvudordlista"</string>
     <string name="cancel" msgid="6830980399865683324">"Avbryt"</string>
     <string name="install_dict" msgid="180852772562189365">"Installera"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Avbryt"</string>
     <string name="delete_dict" msgid="756853268088330054">"Ta bort"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Det finns en ordbok för språket du har valt på din mobila enhet.&lt;br/&gt; Vi rekommenderar att du &lt;b&gt;hämtar&lt;/b&gt; ordboken på <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>. Då blir det enklare och smidigare att skriva.&lt;br/&gt; &lt;br/&gt; Hämtningen tar en minut eller två om du använder 3G. Avgifter kan tillkomma om du inte har ett &lt;b&gt;abonnemang med obegränsad data&lt;/b&gt;.&lt;br/&gt; Om du inte är säker på vad som ingår i ditt abonnemang rekommenderar vi att du hittar en Wi-Fi-anslutning och påbörjar hämtningen automatiskt.&lt;br/&gt; &lt;br/&gt; Tips: Du kan hämta och ta bort ordböcker via &lt;b&gt;Språk och inmatning&lt;/b&gt; i menyn &lt;b&gt;Inställningar&lt;/b&gt; på din mobila enhet."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Hämta nu (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Hämta via Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"En ordlista för <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> är tillgänglig"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Tryck om du vill granska och hämta"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Hämtar: förslag för <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> är snart klara."</string>
     <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Lägg till"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Lägg till i ordlista"</string>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index c8d4c80..a439537 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -179,7 +179,7 @@
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"ถ่ายโอนพจนานุกรมที่อยู่ติดต่อ"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"ถ่ายโอนพจนานุกรมส่วนตัว"</string>
     <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"ถ่ายโอนพจนานุกรมประวัติผู้ใช้"</string>
-    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"ถ่ายโอนพจนานุกรมปรับเปลี่ยนในแบบคุณ"</string>
+    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"ถ่ายโอนพจนานุกรมในแบบคุณ"</string>
     <string name="button_default" msgid="3988017840431881491">"ค่าเริ่มต้น"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"ยินดีต้อนรับสู่ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_welcome_additional_description" msgid="8150252008545768953">"พร้อมการป้อนข้อมูลด้วยท่าทาง"</string>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 89c75f2..b82913a 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Підключіть гарнітуру, щоб прослухати відтворені вголос символи пароля."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Поточний текст – %s."</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Текст не введено"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"<xliff:g id="KEY_NAME">%1$s</xliff:g> виправляє слово \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" на \"<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>\""</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"<xliff:g id="KEY_NAME">%1$s</xliff:g> здійснює автоматичне виправлення"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Код клавіші – %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Клавіша Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift увімкнено (швидко торкніться, щоб вимкнути)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим набору номера"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим набору символів"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Клавіатуру сховано"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Режим клавіатури: <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"дата"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"дата й час"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"електронні адреси"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Англійська (Великобританія)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Англійська (США)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"іспанська (США)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Англійська (Британія) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Англійська (США) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Іспанська (США) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (традиційне письмо)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Стандартна (латиниця)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Латиниця (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Латиниця (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Читати файл зовнішнього словника"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"У папці \"Завантаження\" немає файлів словника"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Вибрати файл словника, який потрібно встановити"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Справді встановити цей файл для такої мови: <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Сталася помилка"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Дамп словника контактів"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Дамп особистого словника"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Оновити"</string>
     <string name="last_update" msgid="730467549913588780">"Останнє оновлення"</string>
     <string name="message_updating" msgid="4457761393932375219">"Перевірка наявності оновлень"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Завантаження…"</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Основний словник"</string>
     <string name="cancel" msgid="6830980399865683324">"Скасувати"</string>
     <string name="install_dict" msgid="180852772562189365">"Установити"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Скасувати"</string>
     <string name="delete_dict" msgid="756853268088330054">"Видалити"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Для вибраної на вашому мобільному пристрої мови доступний словник.&lt;br/&gt; Радимо &lt;b&gt;завантажити&lt;/b&gt; словник для цієї мови (<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>), щоб покращити введення тексту.&lt;br/&gt; &lt;br/&gt; У мережі 3G завантаження триває 1–2 хвилини. Якщо у вас не &lt;b&gt;безлімітний тарифний план Інтернету&lt;/b&gt;, може стягуватися плата.&lt;br/&gt; Якщо ви не впевнені щодо тарифного плану, радимо скористатися з’єднанням Wi-Fi, щоб автоматично почати завантаження.&lt;br/&gt; &lt;br/&gt; Порада: завантажувати та видаляти словники можна в меню &lt;b&gt;Налаштування&lt;/b&gt; в розділі &lt;b&gt;Мова та введення&lt;/b&gt; вашого мобільного пристрою."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Завантажити зараз (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> Mб)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Завантажити через Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Доступний словник для такої мови: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Натисніть, щоб переглянути та завантажити"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Завантаження. Скоро будуть готові пропозиції для такої мови: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string>
     <string name="version_text" msgid="2715354215568469385">"Версія <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Додати"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Додати в словник"</string>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index 45b009b..dc2741d 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -176,10 +176,10 @@
     <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
     <skip />
     <string name="error" msgid="8940763624668513648">"Đã xảy ra lỗi"</string>
-    <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Kết xuất từ điển danh bạ"</string>
-    <string name="prefs_dump_user_dict" msgid="294870685041741951">"Kết xuất từ điển cá nhân"</string>
-    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Kết xuất từ điển lịch sử người dùng"</string>
-    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Kết xuất từ điển cá nhân hóa"</string>
+    <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Lưu vào từ điển danh bạ"</string>
+    <string name="prefs_dump_user_dict" msgid="294870685041741951">"Lưu vào từ điển cá nhân"</string>
+    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Lưu vào từ điển lịch sử người dùng"</string>
+    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Lưu vào từ điển cá nhân hóa"</string>
     <string name="button_default" msgid="3988017840431881491">"Mặc định"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"Chào mừng bạn đến với <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_welcome_additional_description" msgid="8150252008545768953">"với Nhập bằng cử chỉ"</string>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index 8371636..c4fd700 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -176,10 +176,10 @@
     <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
     <skip />
     <string name="error" msgid="8940763624668513648">"出现错误"</string>
-    <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"转储联系人字典"</string>
-    <string name="prefs_dump_user_dict" msgid="294870685041741951">"转储个人字典"</string>
-    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"转储用户历史记录字典"</string>
-    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"转储个性化字典"</string>
+    <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"转储联系人词典"</string>
+    <string name="prefs_dump_user_dict" msgid="294870685041741951">"转储个人词典"</string>
+    <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"转储用户历史记录词典"</string>
+    <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"转储个性化词典"</string>
     <string name="button_default" msgid="3988017840431881491">"默认"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"欢迎使用 <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_welcome_additional_description" msgid="8150252008545768953">"体验顺畅的滑行输入体验"</string>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index ecb4890..2281933 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -80,10 +80,8 @@
     <string name="spoken_use_headphones" msgid="896961781287283493">"Plaka ku-headset ukuze uzwe okhiye bephasiwedi ezindlebeni zakho bezwakala kakhulu."</string>
     <string name="spoken_current_text_is" msgid="2485723011272583845">"Umbhalo wamanje ngu %s"</string>
     <string name="spoken_no_text_entered" msgid="7479685225597344496">"Awukho umbhalo ofakiwe"</string>
-    <!-- no translation found for spoken_auto_correct (5150455215290003221) -->
-    <skip />
-    <!-- no translation found for spoken_auto_correct_obscured (2309828861778711939) -->
-    <skip />
+    <string name="spoken_auto_correct" msgid="5150455215290003221">"I-<xliff:g id="KEY_NAME">%1$s</xliff:g> ilungisa i-<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> kube yi-<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
+    <string name="spoken_auto_correct_obscured" msgid="2309828861778711939">"I-<xliff:g id="KEY_NAME">%1$s</xliff:g> yenza ukulungisa okuzenzakalelayo"</string>
     <string name="spoken_description_unknown" msgid="3197434010402179157">"Ikhodi yokhiye %d"</string>
     <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
     <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"U-Shift uvuliwe (thepha ukuwuvimbela)"</string>
@@ -111,8 +109,7 @@
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Imodi yefoni"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Imodi yezimpawu zefoni"</string>
     <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Ikhibhodi ifihliwe"</string>
-    <!-- no translation found for announce_keyboard_mode (7486740369324538848) -->
-    <skip />
+    <string name="announce_keyboard_mode" msgid="7486740369324538848">"Ibonisa ikhibhodi ye-<xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="3137520166817128102">"idethi"</string>
     <string name="keyboard_mode_date_time" msgid="339593358488851072">"idethi nesikhathi"</string>
     <string name="keyboard_mode_email" msgid="6216248078128294262">"i-imeyili"</string>
@@ -136,14 +133,10 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"i-English(UK)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"i-English (US)"</string>
     <string name="subtype_es_US" msgid="5583145191430180200">"I-Spanish (US)"</string>
-    <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) -->
-    <skip />
-    <!-- no translation found for subtype_with_layout_es_US (510930471167541338) -->
-    <skip />
-    <!-- no translation found for subtype_nepali_traditional (1994571919751163596) -->
-    <skip />
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"I-English (UK) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"I-English (US) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Isi-Spanish (US) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string>
+    <string name="subtype_nepali_traditional" msgid="1994571919751163596">"Isi-<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Eyosiko)"</string>
     <string name="subtype_no_language" msgid="7137390094240139495">"Alikho ulimi (Alfabhethi)"</string>
     <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabhethi (QWERTY)"</string>
     <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabhethi (QWERTZ)"</string>
@@ -173,8 +166,7 @@
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Funda ifayela elangaphandle lesichazamazwi"</string>
     <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Awekho amafayela wesichazamazwi kufolda yokulandiwe"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Khetha ifayela lesichazamazwi ukuze ulifake"</string>
-    <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) -->
-    <skip />
+    <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Fakela ngempela leli fayela i-<xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"Kube nephutha"</string>
     <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Lahla isichazamazwi soxhumana nabo"</string>
     <string name="prefs_dump_user_dict" msgid="294870685041741951">"Lahla isichazamazwi somuntu siqu"</string>
@@ -217,22 +209,18 @@
     <string name="check_for_updates_now" msgid="8087688440916388581">"Qala kabusha"</string>
     <string name="last_update" msgid="730467549913588780">"Igcine ukulungiswa"</string>
     <string name="message_updating" msgid="4457761393932375219">"Ihlola izibuyekezo"</string>
-    <!-- no translation found for message_loading (5638680861387748936) -->
-    <skip />
+    <string name="message_loading" msgid="5638680861387748936">"Iyalayisha..."</string>
     <string name="main_dict_description" msgid="3072821352793492143">"Isichazamazwi sakho esisemqoka"</string>
     <string name="cancel" msgid="6830980399865683324">"Khansela"</string>
     <string name="install_dict" msgid="180852772562189365">"Faka"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Khansela"</string>
     <string name="delete_dict" msgid="756853268088330054">"Susa"</string>
-    <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) -->
-    <skip />
+    <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Ulimi olukhethiwe kudivayisi yakho yeselula lunesichazamazwi esitholakalayo.&lt;br/&gt; Sincoma &lt;b&gt;ukulanda&lt;/b&gt; isichazamazwi se-<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ukuze sithuthukise umuzwa wakho wokuthayipha.&lt;br/&gt; &lt;br/&gt; Ukulanda kungathatha iminithi noma amabili ngaphezulu kwe-3G. Ukukhokhiswa kungasebenza uma unganalo &lt;b&gt;uhlelo lwedatha elingenamkhawulo&lt;/b&gt;.&lt;br/&gt; Uma ungenaso isiqiniseko sokuthi ukuliphi uhlelo lwedatha, sincoma ukuthi uthole ukuxhumeka kwe-Wi-Fi ukuze uqale ukulanda ngokuzenzakalela.&lt;br/&gt; &lt;br/&gt; Ithiphu: Ungalanda uphinde ususe izichazamazwi ngokuya ku-&lt;b&gt;Ulimi nokokufaka&lt;/b&gt; kumenyu ye-&lt;b&gt;Izilungiselelo&lt;/b&gt; zedivayisi yakho yeselula."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Landa manje (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"Landa nge-Wi-Fi"</string>
-    <!-- no translation found for dict_available_notification_title (4583842811218581658) -->
-    <skip />
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"Isichazamazwi sitholakalela i-<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Cindezela ukuze ubuyekeze uphinde ulande"</string>
-    <!-- no translation found for toast_downloading_suggestions (6128155879830851739) -->
-    <skip />
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Ukulanda: iziphakamiso ze-<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> zizolunga maduze."</string>
     <string name="version_text" msgid="2715354215568469385">"Inguqulo engu-<xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
     <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Engeza"</string>
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Faka kusichazamazwi"</string>
diff --git a/java/res/xml/keys_curly_brackets.xml b/java/res/xml/keys_curly_brackets.xml
index da6dfc0..596516a 100644
--- a/java/res/xml/keys_curly_brackets.xml
+++ b/java/res/xml/keys_curly_brackets.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keySpec="{|!code/key_left_curly_bracket" />
+        latin:keySpec="!text/keyspec_left_curly_bracket" />
     <Key
-        latin:keySpec="}|!code/key_right_curly_bracket" />
+        latin:keySpec="!text/keyspec_right_curly_bracket" />
 </merge>
diff --git a/java/res/xml/keys_less_greater.xml b/java/res/xml/keys_less_greater.xml
index 3304e4c..46f4e4b 100644
--- a/java/res/xml/keys_less_greater.xml
+++ b/java/res/xml/keys_less_greater.xml
@@ -25,25 +25,22 @@
         <case
             latin:languageCode="fa"
         >
-            <!-- TODO: Introduce !code/key_{left,right}_angle_quotation. -->
-            <!-- U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-                 U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
             <Key
-                latin:keySpec="&#x00AB;|&#x00BB;"
+                latin:keySpec="!text/keyspec_left_double_angle_quote"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_less_than" />
             <Key
-                latin:keySpec="&#x00BB;|&#x00AB;"
+                latin:keySpec="!text/keyspec_right_double_angle_quote"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_greater_than" />
         </case>
         <default>
             <Key
-                latin:keySpec="&lt;|!code/key_less_than"
+                latin:keySpec="!text/keyspec_less_than"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_less_than" />
             <Key
-                latin:keySpec="&gt;|!code/key_greater_than"
+                latin:keySpec="!text/keyspec_greater_than"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_greater_than" />
         </default>
diff --git a/java/res/xml/keys_parentheses.xml b/java/res/xml/keys_parentheses.xml
index ab33ef5..73105d8 100644
--- a/java/res/xml/keys_parentheses.xml
+++ b/java/res/xml/keys_parentheses.xml
@@ -22,9 +22,9 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keySpec="(|!code/key_left_parenthesis"
+        latin:keySpec="!text/keyspec_left_parenthesis"
         latin:moreKeys="!text/more_keys_for_left_parenthesis" />
     <Key
-        latin:keySpec=")|!code/key_right_parenthesis"
+        latin:keySpec="!text/keyspec_right_parenthesis"
         latin:moreKeys="!text/more_keys_for_right_parenthesis" />
 </merge>
diff --git a/java/res/xml/keys_square_brackets.xml b/java/res/xml/keys_square_brackets.xml
index 8f0dec5..076b2c2 100644
--- a/java/res/xml/keys_square_brackets.xml
+++ b/java/res/xml/keys_square_brackets.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keySpec="[|!code/key_left_square_bracket" />
+        latin:keySpec="!text/keyspec_left_square_bracket" />
     <Key
-        latin:keySpec="]|!code/key_right_square_bracket" />
+        latin:keySpec="!text/keyspec_right_square_bracket" />
 </merge>
diff --git a/java/res/xml/rowkeys_symbols3.xml b/java/res/xml/rowkeys_symbols3.xml
index 01ca030..3dbfe81 100644
--- a/java/res/xml/rowkeys_symbols3.xml
+++ b/java/res/xml/rowkeys_symbols3.xml
@@ -28,14 +28,11 @@
         <case
             latin:languageCode="fa"
         >
-            <!-- TODO: Introduce !code/key_{left,right}_angle_quotation. -->
-            <!-- U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-                 U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
             <Key
-                latin:keySpec="&#x00AB;|&#x00BB;"
+                latin:keySpec="!text/keyspec_left_double_angle_quote"
                 latin:moreKeys="!text/more_keys_for_double_quote" />
             <Key
-                latin:keySpec="&#x00BB;|&#x00AB;"
+                latin:keySpec="!text/keyspec_right_double_angle_quote"
                 latin:moreKeys="!text/more_keys_for_single_quote" />
         </case>
         <default>
diff --git a/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java b/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
index 672759a..c344643 100644
--- a/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
+++ b/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
@@ -534,6 +534,7 @@
     @Override
     public void onPageScrolled(final int position, final float positionOffset,
             final int positionOffsetPixels) {
+        mEmojiPalettesAdapter.onPageScrolled();
         final Pair<Integer, Integer> newPos =
                 mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(position);
         final int newCategoryId = newPos.first;
@@ -718,6 +719,16 @@
             }
         }
 
+        public void onPageScrolled() {
+            // Make sure the delayed key-down event (highlight effect and haptic feedback) will be
+            // canceled.
+            final EmojiPageKeyboardView currentKeyboardView =
+                    mActiveKeyboardViews.get(mActivePosition);
+            if (currentKeyboardView != null) {
+                currentKeyboardView.releaseCurrentKey();
+            }
+        }
+
         @Override
         public int getCount() {
             return mEmojiCategory.getTotalPageCountOfAllCategories();
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 6f0f753..ceda9ee 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -292,8 +292,7 @@
             actionFlags |= ACTION_FLAGS_ENABLE_LONG_PRESS;
             mMoreKeys = new MoreKeySpec[moreKeys.length];
             for (int i = 0; i < moreKeys.length; i++) {
-                mMoreKeys[i] = new MoreKeySpec(
-                        moreKeys[i], needsToUpperCase, locale, params.mCodesSet);
+                mMoreKeys[i] = new MoreKeySpec(moreKeys[i], needsToUpperCase, locale);
             }
         } else {
             mMoreKeys = null;
@@ -306,7 +305,7 @@
         final int previewIconId = KeySpecParser.getIconId(style.getString(keyAttr,
                 R.styleable.Keyboard_Key_keyIconPreview));
 
-        final int code = KeySpecParser.getCode(keySpec, params.mCodesSet);
+        final int code = KeySpecParser.getCode(keySpec);
         if ((mLabelFlags & LABEL_FLAGS_FROM_CUSTOM_ACTION_LABEL) != 0) {
             mLabel = params.mId.mCustomActionLabel;
         } else if (code >= Character.MIN_SUPPLEMENTARY_CODE_POINT) {
@@ -353,8 +352,8 @@
         } else {
             mCode = StringUtils.toUpperCaseOfCodeForLocale(code, needsToUpperCase, locale);
         }
-        final int altCodeInAttr = KeySpecParser.parseCode(style.getString(keyAttr,
-                R.styleable.Keyboard_Key_altCode), params.mCodesSet, CODE_UNSPECIFIED);
+        final int altCodeInAttr = KeySpecParser.parseCode(
+                style.getString(keyAttr, R.styleable.Keyboard_Key_altCode), CODE_UNSPECIFIED);
         final int altCode = StringUtils.toUpperCaseOfCodeForLocale(
                 altCodeInAttr, needsToUpperCase, locale);
         mOptionalAttributes = OptionalAttributes.newInstance(outputText, altCode,
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 19aef14..b5d82fa 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -412,13 +412,9 @@
         final int keyWidth = mKeyboard.mMostCommonKeyWidth;
         final int keyHeight = mKeyboard.mMostCommonKeyHeight;
         mBatchInputArbiter.setKeyboardGeometry(keyWidth, mKeyboard.mOccupiedHeight);
-        final Key newKey = mKeyDetector.detectHitKey(mKeyX, mKeyY);
-        if (newKey != mCurrentKey) {
-            if (sDrawingProxy != null) {
-                setReleasedKeyGraphics(mCurrentKey);
-            }
-            // Keep {@link #mCurrentKey} that comes from previous keyboard.
-        }
+        // Keep {@link #mCurrentKey} that comes from previous keyboard. The key preview of
+        // {@link #mCurrentKey} will be dismissed by {@setReleasedKeyGraphics(Key)} via
+        // {@link onMoveEventInternal(int,int,long)} or {@link #onUpEventInternal(int,int,long)}.
         mPhantomSuddenMoveThreshold = (int)(keyWidth * PHANTOM_SUDDEN_MOVE_THRESHOLD);
         mBogusMoveEventDetector.setKeyboardGeometry(keyWidth, keyHeight);
     }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
index ff197ba..625d1f0 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
@@ -101,10 +101,11 @@
             if (tag instanceof KeyPreviewAnimations) {
                 final KeyPreviewAnimations animation = (KeyPreviewAnimations)tag;
                 animation.startDismiss();
+                return;
             }
-            return;
         }
         // Dismiss preview without animation.
+        mShowingKeyPreviewTextViews.remove(key);
         if (tag instanceof Animator) {
             ((Animator)tag).cancel();
         }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
index 2099666..48ba8e0 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
@@ -184,7 +184,7 @@
         return (StringUtils.codePointCount(label) == 1) ? null : label;
     }
 
-    public static int getCode(final String keySpec, final KeyboardCodesSet codesSet) {
+    public static int getCode(final String keySpec) {
         if (keySpec == null) {
             // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory.
             return CODE_UNSPECIFIED;
@@ -192,7 +192,7 @@
         final int labelEnd = indexOfLabelEnd(keySpec);
         if (hasCode(keySpec, labelEnd)) {
             checkDoubleLabelEnd(keySpec, labelEnd);
-            return parseCode(getAfterLabelEnd(keySpec, labelEnd), codesSet, CODE_UNSPECIFIED);
+            return parseCode(getAfterLabelEnd(keySpec, labelEnd), CODE_UNSPECIFIED);
         }
         final String outputText = getOutputTextInternal(keySpec, labelEnd);
         if (outputText != null) {
@@ -211,13 +211,12 @@
         return (StringUtils.codePointCount(label) == 1) ? label.codePointAt(0) : CODE_OUTPUT_TEXT;
     }
 
-    public static int parseCode(final String text, final KeyboardCodesSet codesSet,
-            final int defaultCode) {
+    public static int parseCode(final String text, final int defaultCode) {
         if (text == null) {
             return defaultCode;
         }
         if (text.startsWith(KeyboardCodesSet.PREFIX_CODE)) {
-            return codesSet.getCode(text.substring(KeyboardCodesSet.PREFIX_CODE.length()));
+            return KeyboardCodesSet.getCode(text.substring(KeyboardCodesSet.PREFIX_CODE.length()));
         }
         // This is a workaround to have a key that has a supplementary code point. We can't put a
         // string in resource as a XML entity of a supplementary code point or a surrogate pair.
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
index 340d184..81a8e71 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
@@ -279,7 +279,6 @@
             params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0);
             params.mIconsSet.loadIcons(keyboardAttr);
             final Locale locale = params.mId.mLocale;
-            params.mCodesSet.setLocale(locale);
             params.mTextsSet.setLocale(locale);
             final RunInLocale<Void> job = new RunInLocale<Void>() {
                 @Override
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
index 9f873ed..06da571 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
@@ -18,26 +18,22 @@
 
 import com.android.inputmethod.latin.Constants;
 import com.android.inputmethod.latin.utils.CollectionUtils;
-import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
 import java.util.HashMap;
-import java.util.Locale;
 
 public final class KeyboardCodesSet {
     public static final String PREFIX_CODE = "!code/";
 
     private static final HashMap<String, Integer> sNameToIdMap = CollectionUtils.newHashMap();
 
-    private int[] mCodes = DEFAULT;
-
-    public void setLocale(final Locale locale) {
-        mCodes = SubtypeLocaleUtils.isRtlLanguage(locale) ? RTL : DEFAULT;
+    private KeyboardCodesSet() {
+        // This utility class is not publicly instantiable.
     }
 
-    public int getCode(final String name) {
+    public static int getCode(final String name) {
         Integer id = sNameToIdMap.get(name);
         if (id == null) throw new RuntimeException("Unknown key code: " + name);
-        return mCodes[id];
+        return DEFAULT[id];
     }
 
     private static final String[] ID_TO_NAME = {
@@ -58,26 +54,8 @@
         "key_emoji",
         "key_alpha_from_emoji",
         "key_unspecified",
-        "key_left_parenthesis",
-        "key_right_parenthesis",
-        "key_less_than",
-        "key_greater_than",
-        "key_left_square_bracket",
-        "key_right_square_bracket",
-        "key_left_curly_bracket",
-        "key_right_curly_bracket",
     };
 
-    private static final int CODE_LEFT_PARENTHESIS = '(';
-    private static final int CODE_RIGHT_PARENTHESIS = ')';
-    private static final int CODE_LESS_THAN_SIGN = '<';
-    private static final int CODE_GREATER_THAN_SIGN = '>';
-    private static final int CODE_LEFT_SQUARE_BRACKET = '[';
-    private static final int CODE_RIGHT_SQUARE_BRACKET = ']';
-    private static final int CODE_LEFT_CURLY_BRACKET = '{';
-    private static final int CODE_RIGHT_CURLY_BRACKET = '}';
-
-    // This array should be aligned with the array RTL below.
     private static final int[] DEFAULT = {
         Constants.CODE_TAB,
         Constants.CODE_ENTER,
@@ -96,48 +74,9 @@
         Constants.CODE_EMOJI,
         Constants.CODE_ALPHA_FROM_EMOJI,
         Constants.CODE_UNSPECIFIED,
-        CODE_LEFT_PARENTHESIS,
-        CODE_RIGHT_PARENTHESIS,
-        CODE_LESS_THAN_SIGN,
-        CODE_GREATER_THAN_SIGN,
-        CODE_LEFT_SQUARE_BRACKET,
-        CODE_RIGHT_SQUARE_BRACKET,
-        CODE_LEFT_CURLY_BRACKET,
-        CODE_RIGHT_CURLY_BRACKET,
-    };
-
-    private static final int[] RTL = {
-        DEFAULT[0],
-        DEFAULT[1],
-        DEFAULT[2],
-        DEFAULT[3],
-        DEFAULT[4],
-        DEFAULT[5],
-        DEFAULT[6],
-        DEFAULT[7],
-        DEFAULT[8],
-        DEFAULT[9],
-        DEFAULT[10],
-        DEFAULT[11],
-        DEFAULT[12],
-        DEFAULT[13],
-        DEFAULT[14],
-        DEFAULT[15],
-        DEFAULT[16],
-        CODE_RIGHT_PARENTHESIS,
-        CODE_LEFT_PARENTHESIS,
-        CODE_GREATER_THAN_SIGN,
-        CODE_LESS_THAN_SIGN,
-        CODE_RIGHT_SQUARE_BRACKET,
-        CODE_LEFT_SQUARE_BRACKET,
-        CODE_RIGHT_CURLY_BRACKET,
-        CODE_LEFT_CURLY_BRACKET,
     };
 
     static {
-        if (DEFAULT.length != RTL.length || DEFAULT.length != ID_TO_NAME.length) {
-            throw new RuntimeException("Internal inconsistency");
-        }
         for (int i = 0; i < ID_TO_NAME.length; i++) {
             sNameToIdMap.put(ID_TO_NAME[i], i);
         }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java
index d32bb75..153391e 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java
@@ -62,7 +62,6 @@
     public final ArrayList<Key> mShiftKeys = CollectionUtils.newArrayList();
     public final ArrayList<Key> mAltCodeKeysWhileTyping = CollectionUtils.newArrayList();
     public final KeyboardIconsSet mIconsSet = new KeyboardIconsSet();
-    public final KeyboardCodesSet mCodesSet = new KeyboardCodesSet();
     public final KeyboardTextsSet mTextsSet = new KeyboardTextsSet();
     public final KeyStylesSet mKeyStyles = new KeyStylesSet(mTextsSet);
 
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
index a9eeeb0..1e021e5 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -63,317 +63,359 @@
     }
 
     private static final String[] NAMES = {
-        /*  0 */ "more_keys_for_a",
-        /*  1 */ "more_keys_for_e",
-        /*  2 */ "more_keys_for_i",
-        /*  3 */ "more_keys_for_o",
-        /*  4 */ "more_keys_for_u",
-        /*  5 */ "more_keys_for_s",
-        /*  6 */ "more_keys_for_n",
-        /*  7 */ "more_keys_for_c",
-        /*  8 */ "more_keys_for_y",
-        /*  9 */ "more_keys_for_d",
-        /* 10 */ "more_keys_for_r",
-        /* 11 */ "more_keys_for_t",
-        /* 12 */ "more_keys_for_z",
-        /* 13 */ "more_keys_for_k",
-        /* 14 */ "more_keys_for_l",
-        /* 15 */ "more_keys_for_g",
-        /* 16 */ "more_keys_for_v",
-        /* 17 */ "more_keys_for_h",
-        /* 18 */ "more_keys_for_j",
-        /* 19 */ "more_keys_for_w",
-        /* 20 */ "keylabel_for_nordic_row1_11",
-        /* 21 */ "keylabel_for_nordic_row2_10",
-        /* 22 */ "keylabel_for_nordic_row2_11",
-        /* 23 */ "more_keys_for_nordic_row2_10",
-        /* 24 */ "more_keys_for_nordic_row2_11",
-        /* 25 */ "keylabel_for_east_slavic_row1_9",
-        /* 26 */ "keylabel_for_east_slavic_row1_12",
-        /* 27 */ "keylabel_for_east_slavic_row2_1",
-        /* 28 */ "keylabel_for_east_slavic_row2_11",
-        /* 29 */ "keylabel_for_east_slavic_row3_5",
-        /* 30 */ "more_keys_for_cyrillic_u",
-        /* 31 */ "more_keys_for_cyrillic_ka",
-        /* 32 */ "more_keys_for_cyrillic_en",
-        /* 33 */ "more_keys_for_cyrillic_ghe",
-        /* 34 */ "more_keys_for_east_slavic_row2_1",
-        /* 35 */ "more_keys_for_cyrillic_a",
-        /* 36 */ "more_keys_for_cyrillic_o",
-        /* 37 */ "more_keys_for_cyrillic_soft_sign",
-        /* 38 */ "more_keys_for_east_slavic_row2_11",
-        /* 39 */ "keylabel_for_south_slavic_row1_6",
-        /* 40 */ "keylabel_for_south_slavic_row2_11",
-        /* 41 */ "keylabel_for_south_slavic_row3_1",
-        /* 42 */ "keylabel_for_south_slavic_row3_8",
-        /* 43 */ "more_keys_for_cyrillic_ie",
-        /* 44 */ "more_keys_for_cyrillic_i",
-        /* 45 */ "keylabel_for_swiss_row1_11",
-        /* 46 */ "keylabel_for_swiss_row2_10",
-        /* 47 */ "keylabel_for_swiss_row2_11",
-        /* 48 */ "more_keys_for_swiss_row1_11",
-        /* 49 */ "more_keys_for_swiss_row2_10",
-        /* 50 */ "more_keys_for_swiss_row2_11",
-        /* 51 */ "label_to_alpha_key",
-        /* 52 */ "single_quotes",
-        /* 53 */ "double_quotes",
-        /* 54 */ "single_angle_quotes",
-        /* 55 */ "double_angle_quotes",
-        /* 56 */ "more_keys_for_currency_dollar",
-        /* 57 */ "keylabel_for_currency",
-        /* 58 */ "more_keys_for_currency",
-        /* 59 */ "more_keys_for_punctuation",
-        /* 60 */ "more_keys_for_tablet_punctuation",
-        /* 61 */ "keylabel_for_spanish_row2_10",
-        /* 62 */ "more_keys_for_star",
-        /* 63 */ "more_keys_for_bullet",
-        /* 64 */ "more_keys_for_plus",
-        /* 65 */ "more_keys_for_left_parenthesis",
-        /* 66 */ "more_keys_for_right_parenthesis",
-        /* 67 */ "more_keys_for_less_than",
-        /* 68 */ "more_keys_for_greater_than",
-        /* 69 */ "more_keys_for_arabic_diacritics",
-        /* 70 */ "keylabel_for_symbols_1",
-        /* 71 */ "keylabel_for_symbols_2",
-        /* 72 */ "keylabel_for_symbols_3",
-        /* 73 */ "keylabel_for_symbols_4",
-        /* 74 */ "keylabel_for_symbols_5",
-        /* 75 */ "keylabel_for_symbols_6",
-        /* 76 */ "keylabel_for_symbols_7",
-        /* 77 */ "keylabel_for_symbols_8",
-        /* 78 */ "keylabel_for_symbols_9",
-        /* 79 */ "keylabel_for_symbols_0",
-        /* 80 */ "label_to_symbol_key",
-        /* 81 */ "label_to_symbol_with_microphone_key",
-        /* 82 */ "additional_more_keys_for_symbols_1",
-        /* 83 */ "additional_more_keys_for_symbols_2",
-        /* 84 */ "additional_more_keys_for_symbols_3",
-        /* 85 */ "additional_more_keys_for_symbols_4",
-        /* 86 */ "additional_more_keys_for_symbols_5",
-        /* 87 */ "additional_more_keys_for_symbols_6",
-        /* 88 */ "additional_more_keys_for_symbols_7",
-        /* 89 */ "additional_more_keys_for_symbols_8",
-        /* 90 */ "additional_more_keys_for_symbols_9",
-        /* 91 */ "additional_more_keys_for_symbols_0",
-        /* 92 */ "more_keys_for_symbols_1",
-        /* 93 */ "more_keys_for_symbols_2",
-        /* 94 */ "more_keys_for_symbols_3",
-        /* 95 */ "more_keys_for_symbols_4",
-        /* 96 */ "more_keys_for_symbols_5",
-        /* 97 */ "more_keys_for_symbols_6",
-        /* 98 */ "more_keys_for_symbols_7",
-        /* 99 */ "more_keys_for_symbols_8",
-        /* 100 */ "more_keys_for_symbols_9",
-        /* 101 */ "more_keys_for_symbols_0",
-        /* 102 */ "keylabel_for_comma",
-        /* 103 */ "more_keys_for_comma",
-        /* 104 */ "keylabel_for_tablet_comma",
-        /* 105 */ "keyhintlabel_for_tablet_comma",
-        /* 106 */ "more_keys_for_tablet_comma",
-        /* 107 */ "keylabel_for_period",
-        /* 108 */ "keyhintlabel_for_period",
-        /* 109 */ "more_keys_for_period",
-        /* 110 */ "keylabel_for_tablet_period",
-        /* 111 */ "keyhintlabel_for_tablet_period",
-        /* 112 */ "more_keys_for_tablet_period",
-        /* 113 */ "keylabel_for_symbols_question",
-        /* 114 */ "keylabel_for_symbols_semicolon",
-        /* 115 */ "keylabel_for_symbols_percent",
-        /* 116 */ "more_keys_for_exclamation",
-        /* 117 */ "more_keys_for_question",
-        /* 118 */ "more_keys_for_symbols_semicolon",
-        /* 119 */ "more_keys_for_symbols_percent",
-        /* 120 */ "more_keys_for_q",
-        /* 121 */ "more_keys_for_x",
-        /* 122 */ "keylabel_for_q",
-        /* 123 */ "keylabel_for_w",
-        /* 124 */ "keylabel_for_y",
-        /* 125 */ "keylabel_for_x",
-        /* 126 */ "more_keys_for_am_pm",
-        /* 127 */ "settings_as_more_key",
-        /* 128 */ "shortcut_as_more_key",
-        /* 129 */ "action_next_as_more_key",
-        /* 130 */ "action_previous_as_more_key",
-        /* 131 */ "label_to_more_symbol_key",
-        /* 132 */ "label_to_more_symbol_for_tablet_key",
-        /* 133 */ "label_tab_key",
-        /* 134 */ "label_to_phone_numeric_key",
-        /* 135 */ "label_to_phone_symbols_key",
-        /* 136 */ "label_time_am",
-        /* 137 */ "label_time_pm",
-        /* 138 */ "keylabel_for_popular_domain",
-        /* 139 */ "more_keys_for_popular_domain",
-        /* 140 */ "single_laqm_raqm",
-        /* 141 */ "single_laqm_raqm_rtl",
-        /* 142 */ "single_raqm_laqm",
-        /* 143 */ "double_laqm_raqm",
-        /* 144 */ "double_laqm_raqm_rtl",
-        /* 145 */ "double_raqm_laqm",
-        /* 146 */ "single_lqm_rqm",
-        /* 147 */ "single_9qm_lqm",
-        /* 148 */ "single_9qm_rqm",
-        /* 149 */ "double_lqm_rqm",
-        /* 150 */ "double_9qm_lqm",
-        /* 151 */ "double_9qm_rqm",
-        /* 152 */ "more_keys_for_single_quote",
-        /* 153 */ "more_keys_for_double_quote",
-        /* 154 */ "more_keys_for_tablet_double_quote",
-        /* 155 */ "emoji_key_as_more_key",
+    //  /* index:histogram */ "name",
+        /*   0:30 */ "more_keys_for_a",
+        /*   1:30 */ "more_keys_for_o",
+        /*   2:28 */ "more_keys_for_u",
+        /*   3:27 */ "more_keys_for_e",
+        /*   4:26 */ "more_keys_for_i",
+        /*   5:23 */ "double_quotes",
+        /*   6:22 */ "single_quotes",
+        /*   7:21 */ "more_keys_for_c",
+        /*   8:20 */ "more_keys_for_s",
+        /*   9:20 */ "more_keys_for_n",
+        /*  10:20 */ "label_to_alpha_key",
+        /*  11:15 */ "more_keys_for_y",
+        /*  12:13 */ "more_keys_for_d",
+        /*  13:12 */ "more_keys_for_z",
+        /*  14:10 */ "more_keys_for_t",
+        /*  15:10 */ "more_keys_for_l",
+        /*  16: 9 */ "more_keys_for_g",
+        /*  17: 9 */ "single_angle_quotes",
+        /*  18: 9 */ "double_angle_quotes",
+        /*  19: 9 */ "keylabel_for_currency",
+        /*  20: 8 */ "more_keys_for_r",
+        /*  21: 6 */ "more_keys_for_k",
+        /*  22: 6 */ "keylabel_for_nordic_row1_11",
+        /*  23: 6 */ "keylabel_for_nordic_row2_10",
+        /*  24: 6 */ "keylabel_for_nordic_row2_11",
+        /*  25: 6 */ "more_keys_for_cyrillic_ie",
+        /*  26: 5 */ "more_keys_for_nordic_row2_10",
+        /*  27: 5 */ "keylabel_for_east_slavic_row1_9",
+        /*  28: 5 */ "keylabel_for_east_slavic_row1_12",
+        /*  29: 5 */ "keylabel_for_east_slavic_row2_1",
+        /*  30: 5 */ "keylabel_for_east_slavic_row2_11",
+        /*  31: 5 */ "keylabel_for_east_slavic_row3_5",
+        /*  32: 5 */ "more_keys_for_cyrillic_soft_sign",
+        /*  33: 5 */ "more_keys_for_punctuation",
+        /*  34: 4 */ "more_keys_for_nordic_row2_11",
+        /*  35: 4 */ "keylabel_for_symbols_1",
+        /*  36: 4 */ "keylabel_for_symbols_2",
+        /*  37: 4 */ "keylabel_for_symbols_3",
+        /*  38: 4 */ "keylabel_for_symbols_4",
+        /*  39: 4 */ "keylabel_for_symbols_5",
+        /*  40: 4 */ "keylabel_for_symbols_6",
+        /*  41: 4 */ "keylabel_for_symbols_7",
+        /*  42: 4 */ "keylabel_for_symbols_8",
+        /*  43: 4 */ "keylabel_for_symbols_9",
+        /*  44: 4 */ "keylabel_for_symbols_0",
+        /*  45: 4 */ "label_to_symbol_key",
+        /*  46: 4 */ "label_to_symbol_with_microphone_key",
+        /*  47: 4 */ "additional_more_keys_for_symbols_1",
+        /*  48: 4 */ "additional_more_keys_for_symbols_2",
+        /*  49: 4 */ "additional_more_keys_for_symbols_3",
+        /*  50: 4 */ "additional_more_keys_for_symbols_4",
+        /*  51: 4 */ "additional_more_keys_for_symbols_5",
+        /*  52: 4 */ "additional_more_keys_for_symbols_6",
+        /*  53: 4 */ "additional_more_keys_for_symbols_7",
+        /*  54: 4 */ "additional_more_keys_for_symbols_8",
+        /*  55: 4 */ "additional_more_keys_for_symbols_9",
+        /*  56: 4 */ "additional_more_keys_for_symbols_0",
+        /*  57: 3 */ "more_keys_for_star",
+        /*  58: 3 */ "keyspec_left_parenthesis",
+        /*  59: 3 */ "keyspec_right_parenthesis",
+        /*  60: 3 */ "keyspec_left_square_bracket",
+        /*  61: 3 */ "keyspec_right_square_bracket",
+        /*  62: 3 */ "keyspec_left_curly_bracket",
+        /*  63: 3 */ "keyspec_right_curly_bracket",
+        /*  64: 3 */ "keyspec_less_than",
+        /*  65: 3 */ "keyspec_greater_than",
+        /*  66: 3 */ "keyspec_less_than_equal",
+        /*  67: 3 */ "keyspec_greater_than_equal",
+        /*  68: 3 */ "keyspec_left_double_angle_quote",
+        /*  69: 3 */ "keyspec_right_double_angle_quote",
+        /*  70: 3 */ "keyspec_left_single_angle_quote",
+        /*  71: 3 */ "keyspec_right_single_angle_quote",
+        /*  72: 3 */ "keylabel_for_tablet_comma",
+        /*  73: 3 */ "more_keys_for_tablet_period",
+        /*  74: 3 */ "more_keys_for_question",
+        /*  75: 2 */ "more_keys_for_h",
+        /*  76: 2 */ "more_keys_for_w",
+        /*  77: 2 */ "more_keys_for_cyrillic_u",
+        /*  78: 2 */ "more_keys_for_cyrillic_en",
+        /*  79: 2 */ "more_keys_for_cyrillic_ghe",
+        /*  80: 2 */ "more_keys_for_east_slavic_row2_1",
+        /*  81: 2 */ "more_keys_for_cyrillic_o",
+        /*  82: 2 */ "keylabel_for_south_slavic_row1_6",
+        /*  83: 2 */ "keylabel_for_south_slavic_row2_11",
+        /*  84: 2 */ "keylabel_for_south_slavic_row3_1",
+        /*  85: 2 */ "keylabel_for_south_slavic_row3_8",
+        /*  86: 2 */ "more_keys_for_cyrillic_i",
+        /*  87: 2 */ "keylabel_for_swiss_row1_11",
+        /*  88: 2 */ "keylabel_for_swiss_row2_10",
+        /*  89: 2 */ "keylabel_for_swiss_row2_11",
+        /*  90: 2 */ "more_keys_for_swiss_row1_11",
+        /*  91: 2 */ "more_keys_for_swiss_row2_10",
+        /*  92: 2 */ "more_keys_for_swiss_row2_11",
+        /*  93: 2 */ "keylabel_for_spanish_row2_10",
+        /*  94: 2 */ "more_keys_for_bullet",
+        /*  95: 2 */ "more_keys_for_left_parenthesis",
+        /*  96: 2 */ "more_keys_for_right_parenthesis",
+        /*  97: 2 */ "more_keys_for_arabic_diacritics",
+        /*  98: 2 */ "keylabel_for_comma",
+        /*  99: 2 */ "more_keys_for_comma",
+        /* 100: 2 */ "keyhintlabel_for_tablet_comma",
+        /* 101: 2 */ "more_keys_for_tablet_comma",
+        /* 102: 2 */ "keyhintlabel_for_period",
+        /* 103: 2 */ "more_keys_for_period",
+        /* 104: 2 */ "keyhintlabel_for_tablet_period",
+        /* 105: 2 */ "keylabel_for_symbols_question",
+        /* 106: 2 */ "keylabel_for_symbols_semicolon",
+        /* 107: 2 */ "keylabel_for_symbols_percent",
+        /* 108: 2 */ "more_keys_for_symbols_semicolon",
+        /* 109: 2 */ "more_keys_for_symbols_percent",
+        /* 110: 1 */ "more_keys_for_v",
+        /* 111: 1 */ "more_keys_for_j",
+        /* 112: 1 */ "more_keys_for_cyrillic_ka",
+        /* 113: 1 */ "more_keys_for_cyrillic_a",
+        /* 114: 1 */ "more_keys_for_east_slavic_row2_11",
+        /* 115: 1 */ "more_keys_for_currency_dollar",
+        /* 116: 1 */ "more_keys_for_tablet_punctuation",
+        /* 117: 1 */ "more_keys_for_plus",
+        /* 118: 1 */ "more_keys_for_less_than",
+        /* 119: 1 */ "more_keys_for_greater_than",
+        /* 120: 1 */ "keylabel_for_period",
+        /* 121: 1 */ "keylabel_for_tablet_period",
+        /* 122: 1 */ "more_keys_for_exclamation",
+        /* 123: 1 */ "more_keys_for_q",
+        /* 124: 1 */ "more_keys_for_x",
+        /* 125: 1 */ "keylabel_for_q",
+        /* 126: 1 */ "keylabel_for_w",
+        /* 127: 1 */ "keylabel_for_y",
+        /* 128: 1 */ "keylabel_for_x",
+        /* 129: 0 */ "more_keys_for_currency",
+        /* 130: 0 */ "more_keys_for_symbols_1",
+        /* 131: 0 */ "more_keys_for_symbols_2",
+        /* 132: 0 */ "more_keys_for_symbols_3",
+        /* 133: 0 */ "more_keys_for_symbols_4",
+        /* 134: 0 */ "more_keys_for_symbols_5",
+        /* 135: 0 */ "more_keys_for_symbols_6",
+        /* 136: 0 */ "more_keys_for_symbols_7",
+        /* 137: 0 */ "more_keys_for_symbols_8",
+        /* 138: 0 */ "more_keys_for_symbols_9",
+        /* 139: 0 */ "more_keys_for_symbols_0",
+        /* 140: 0 */ "more_keys_for_am_pm",
+        /* 141: 0 */ "settings_as_more_key",
+        /* 142: 0 */ "shortcut_as_more_key",
+        /* 143: 0 */ "action_next_as_more_key",
+        /* 144: 0 */ "action_previous_as_more_key",
+        /* 145: 0 */ "label_to_more_symbol_key",
+        /* 146: 0 */ "label_to_more_symbol_for_tablet_key",
+        /* 147: 0 */ "label_tab_key",
+        /* 148: 0 */ "label_to_phone_numeric_key",
+        /* 149: 0 */ "label_to_phone_symbols_key",
+        /* 150: 0 */ "label_time_am",
+        /* 151: 0 */ "label_time_pm",
+        /* 152: 0 */ "keylabel_for_popular_domain",
+        /* 153: 0 */ "more_keys_for_popular_domain",
+        /* 154: 0 */ "keyspecs_for_left_parenthesis_more_keys",
+        /* 155: 0 */ "keyspecs_for_right_parenthesis_more_keys",
+        /* 156: 0 */ "single_laqm_raqm",
+        /* 157: 0 */ "single_raqm_laqm",
+        /* 158: 0 */ "double_laqm_raqm",
+        /* 159: 0 */ "double_raqm_laqm",
+        /* 160: 0 */ "single_lqm_rqm",
+        /* 161: 0 */ "single_9qm_lqm",
+        /* 162: 0 */ "single_9qm_rqm",
+        /* 163: 0 */ "single_rqm_9qm",
+        /* 164: 0 */ "double_lqm_rqm",
+        /* 165: 0 */ "double_9qm_lqm",
+        /* 166: 0 */ "double_9qm_rqm",
+        /* 167: 0 */ "double_rqm_9qm",
+        /* 168: 0 */ "more_keys_for_single_quote",
+        /* 169: 0 */ "more_keys_for_double_quote",
+        /* 170: 0 */ "more_keys_for_tablet_double_quote",
+        /* 171: 0 */ "emoji_key_as_more_key",
     };
 
     private static final String EMPTY = "";
 
     /* Default texts */
     private static final String[] LANGUAGE_DEFAULT = {
-        /* 0~ */
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~ more_keys_for_i */
+        /* double_quotes */ "!text/double_lqm_rqm",
+        /* single_quotes */ "!text/single_lqm_rqm",
+        /* more_keys_for_c ~ */
+        EMPTY, EMPTY, EMPTY,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
-        /* 51 */ "ABC",
-        /* 52 */ "!text/single_lqm_rqm",
-        /* 53 */ "!text/double_lqm_rqm",
-        /* 54 */ "!text/single_laqm_raqm",
-        /* 55 */ "!text/double_laqm_raqm",
-        // U+00A2: "¢" CENT SIGN
-        // U+00A3: "£" POUND SIGN
-        // U+20AC: "€" EURO SIGN
-        // U+00A5: "¥" YEN SIGN
-        // U+20B1: "₱" PESO SIGN
-        /* 56 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
-        /* 57 */ "$",
-        /* 58 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
-        /* 59 */ "!fixedColumnOrder!8,;,/,(,),#,!,\\,,?,&,\\%,+,\",-,:,',@",
-        /* 60 */ "!fixedColumnOrder!7,;,/,(,),#,',\\,,&,\\%,+,\",-,:,@",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 61 */ "\u00F1",
+        /* label_to_alpha_key */ "ABC",
+        /* more_keys_for_y ~ */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~ more_keys_for_g */
+        /* single_angle_quotes */ "!text/single_laqm_raqm",
+        /* double_angle_quotes */ "!text/double_laqm_raqm",
+        /* keylabel_for_currency */ "$",
+        /* more_keys_for_r ~ */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~ more_keys_for_cyrillic_soft_sign */
+        /* more_keys_for_punctuation */ "!fixedColumnOrder!8,;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,#,!,\\,,?,&,\\%,+,\",-,:,',@",
+        /* more_keys_for_nordic_row2_11 */ EMPTY,
+        /* keylabel_for_symbols_1 */ "1",
+        /* keylabel_for_symbols_2 */ "2",
+        /* keylabel_for_symbols_3 */ "3",
+        /* keylabel_for_symbols_4 */ "4",
+        /* keylabel_for_symbols_5 */ "5",
+        /* keylabel_for_symbols_6 */ "6",
+        /* keylabel_for_symbols_7 */ "7",
+        /* keylabel_for_symbols_8 */ "8",
+        /* keylabel_for_symbols_9 */ "9",
+        /* keylabel_for_symbols_0 */ "0",
+        // Label for "switch to symbols" key.
+        /* label_to_symbol_key */ "?123",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* label_to_symbol_with_microphone_key */ "123",
+        /* additional_more_keys_for_symbols_1 ~ */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~ additional_more_keys_for_symbols_0 */
         // U+2020: "†" DAGGER
         // U+2021: "‡" DOUBLE DAGGER
         // U+2605: "★" BLACK STAR
-        /* 62 */ "\u2020,\u2021,\u2605",
-        // U+266A: "♪" EIGHTH NOTE
-        // U+2665: "♥" BLACK HEART SUIT
-        // U+2660: "♠" BLACK SPADE SUIT
-        // U+2666: "♦" BLACK DIAMOND SUIT
-        // U+2663: "♣" BLACK CLUB SUIT
-        /* 63 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
-        // U+00B1: "±" PLUS-MINUS SIGN
-        /* 64 */ "\u00B1",
+        /* more_keys_for_star */ "\u2020,\u2021,\u2605",
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 65 */ "!fixedColumnOrder!3,<,{,[",
-        /* 66 */ "!fixedColumnOrder!3,>,},]",
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        /* 67 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
-        /* 68 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
-        /* 69 */ EMPTY,
-        /* 70 */ "1",
-        /* 71 */ "2",
-        /* 72 */ "3",
-        /* 73 */ "4",
-        /* 74 */ "5",
-        /* 75 */ "6",
-        /* 76 */ "7",
-        /* 77 */ "8",
-        /* 78 */ "9",
-        /* 79 */ "0",
-        // Label for "switch to symbols" key.
-        /* 80 */ "?123",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 81 */ "123",
-        /* 82~ */
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~91 */
+        /* keyspec_left_parenthesis */ "(",
+        /* keyspec_right_parenthesis */ ")",
+        /* keyspec_left_square_bracket */ "[",
+        /* keyspec_right_square_bracket */ "]",
+        /* keyspec_left_curly_bracket */ "{",
+        /* keyspec_right_curly_bracket */ "}",
+        /* keyspec_less_than */ "<",
+        /* keyspec_greater_than */ ">",
+        /* keyspec_less_than_equal */ "\u2264",
+        /* keyspec_greater_than_equal */ "\u2265",
+        /* keyspec_left_double_angle_quote */ "\u00AB",
+        /* keyspec_right_double_angle_quote */ "\u00BB",
+        /* keyspec_left_single_angle_quote */ "\u2039",
+        /* keyspec_right_single_angle_quote */ "\u203A",
+        /* keylabel_for_tablet_comma */ ",",
+        /* more_keys_for_tablet_period */ "!text/more_keys_for_tablet_punctuation",
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* more_keys_for_question */ "\u00BF",
+        /* more_keys_for_h ~ */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~ more_keys_for_swiss_row2_11 */
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* keylabel_for_spanish_row2_10 */ "\u00F1",
+        // U+266A: "♪" EIGHTH NOTE
+        // U+2665: "♥" BLACK HEART SUIT
+        // U+2660: "♠" BLACK SPADE SUIT
+        // U+2666: "♦" BLACK DIAMOND SUIT
+        // U+2663: "♣" BLACK CLUB SUIT
+        /* more_keys_for_bullet */ "\u266A,\u2665,\u2660,\u2666,\u2663",
+        /* more_keys_for_left_parenthesis */ "!fixedColumnOrder!3,!text/keyspecs_for_left_parenthesis_more_keys",
+        /* more_keys_for_right_parenthesis */ "!fixedColumnOrder!3,!text/keyspecs_for_right_parenthesis_more_keys",
+        /* more_keys_for_arabic_diacritics */ EMPTY,
+        // Comma key
+        /* keylabel_for_comma */ ",",
+        /* more_keys_for_comma ~ */
+        EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~ keyhintlabel_for_period */
+        /* more_keys_for_period */ "!text/more_keys_for_punctuation",
+        /* keyhintlabel_for_tablet_period */ EMPTY,
+        /* keylabel_for_symbols_question */ "?",
+        /* keylabel_for_symbols_semicolon */ ";",
+        /* keylabel_for_symbols_percent */ "%",
+        /* more_keys_for_symbols_semicolon */ EMPTY,
+        // U+2030: "‰" PER MILLE SIGN
+        /* more_keys_for_symbols_percent */ "\u2030",
+        /* more_keys_for_v ~ */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~ more_keys_for_east_slavic_row2_11 */
+        // U+00A2: "¢" CENT SIGN
+        // U+00A3: "£" POUND SIGN
+        // U+20AC: "€" EURO SIGN
+        // U+00A5: "¥" YEN SIGN
+        // U+20B1: "₱" PESO SIGN
+        /* more_keys_for_currency_dollar */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
+        /* more_keys_for_tablet_punctuation */ "!fixedColumnOrder!7,;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,#,',\\,,&,\\%,+,\",-,:,@",
+        // U+00B1: "±" PLUS-MINUS SIGN
+        /* more_keys_for_plus */ "\u00B1",
+        /* more_keys_for_less_than */ "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_left_double_angle_quote",
+        /* more_keys_for_greater_than */ "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_right_double_angle_quote",
+        // Period key
+        /* keylabel_for_period */ ".",
+        /* keylabel_for_tablet_period */ ".",
+        // U+00A1: "¡" INVERTED EXCLAMATION MARK
+        /* more_keys_for_exclamation */ "\u00A1",
+        /* more_keys_for_q */ EMPTY,
+        /* more_keys_for_x */ EMPTY,
+        /* keylabel_for_q */ "q",
+        /* keylabel_for_w */ "w",
+        /* keylabel_for_y */ "y",
+        /* keylabel_for_x */ "x",
+        /* more_keys_for_currency */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
         // U+00B9: "¹" SUPERSCRIPT ONE
         // U+00BD: "½" VULGAR FRACTION ONE HALF
         // U+2153: "⅓" VULGAR FRACTION ONE THIRD
         // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
         // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH
-        /* 92 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
+        /* more_keys_for_symbols_1 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
         // U+00B2: "²" SUPERSCRIPT TWO
         // U+2154: "⅔" VULGAR FRACTION TWO THIRDS
-        /* 93 */ "\u00B2,\u2154",
+        /* more_keys_for_symbols_2 */ "\u00B2,\u2154",
         // U+00B3: "³" SUPERSCRIPT THREE
         // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
         // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
-        /* 94 */ "\u00B3,\u00BE,\u215C",
+        /* more_keys_for_symbols_3 */ "\u00B3,\u00BE,\u215C",
         // U+2074: "⁴" SUPERSCRIPT FOUR
-        /* 95 */ "\u2074",
+        /* more_keys_for_symbols_4 */ "\u2074",
         // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
-        /* 96 */ "\u215D",
-        /* 97 */ EMPTY,
+        /* more_keys_for_symbols_5 */ "\u215D",
+        /* more_keys_for_symbols_6 */ EMPTY,
         // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
-        /* 98 */ "\u215E",
-        /* 99 */ EMPTY,
-        /* 100 */ EMPTY,
+        /* more_keys_for_symbols_7 */ "\u215E",
+        /* more_keys_for_symbols_8 */ EMPTY,
+        /* more_keys_for_symbols_9 */ EMPTY,
         // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
         // U+2205: "∅" EMPTY SET
-        /* 101 */ "\u207F,\u2205",
-        // Comma key
-        /* 102 */ ",",
-        /* 103 */ EMPTY,
-        /* 104 */ ",",
-        /* 105 */ EMPTY,
-        /* 106 */ EMPTY,
-        // Period key
-        /* 107 */ ".",
-        /* 108 */ EMPTY,
-        /* 109 */ "!text/more_keys_for_punctuation",
-        /* 110 */ ".",
-        /* 111 */ EMPTY,
-        /* 112 */ "!text/more_keys_for_tablet_punctuation",
-        /* 113 */ "?",
-        /* 114 */ ";",
-        /* 115 */ "%",
-        // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 116 */ "\u00A1",
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 117 */ "\u00BF",
-        /* 118 */ EMPTY,
-        // U+2030: "‰" PER MILLE SIGN
-        /* 119 */ "\u2030",
-        /* 120 */ EMPTY,
-        /* 121 */ EMPTY,
-        /* 122 */ "q",
-        /* 123 */ "w",
-        /* 124 */ "y",
-        /* 125 */ "x",
-        /* 126 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
-        /* 127 */ "!icon/settings_key|!code/key_settings",
-        /* 128 */ "!icon/shortcut_key|!code/key_shortcut",
-        /* 129 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
-        /* 130 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
+        /* more_keys_for_symbols_0 */ "\u207F,\u2205",
+        /* more_keys_for_am_pm */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
+        /* settings_as_more_key */ "!icon/settings_key|!code/key_settings",
+        /* shortcut_as_more_key */ "!icon/shortcut_key|!code/key_shortcut",
+        /* action_next_as_more_key */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
+        /* action_previous_as_more_key */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
         // Label for "switch to more symbol" modifier key ("= \ <"). Must be short to fit on key!
-        /* 131 */ "= \\\\ <",
+        /* label_to_more_symbol_key */ "= \\\\ <",
         // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
-        /* 132 */ "~ [ <",
+        /* label_to_more_symbol_for_tablet_key */ "~ [ <",
         // Label for "Tab" key.  Must be short to fit on key!
-        /* 133 */ "Tab",
+        /* label_tab_key */ "Tab",
         // Label for "switch to phone numeric" key.  Must be short to fit on key!
-        /* 134 */ "123",
+        /* label_to_phone_numeric_key */ "123",
         // Label for "switch to phone symbols" key.  Must be short to fit on key!
         // U+FF0A: "*" FULLWIDTH ASTERISK
         // U+FF03: "#" FULLWIDTH NUMBER SIGN
-        /* 135 */ "\uFF0A\uFF03",
+        /* label_to_phone_symbols_key */ "\uFF0A\uFF03",
         // Key label for "ante meridiem"
-        /* 136 */ "AM",
+        /* label_time_am */ "AM",
         // Key label for "post meridiem"
-        /* 137 */ "PM",
-        /* 138 */ ".com",
+        /* label_time_pm */ "PM",
+        /* keylabel_for_popular_domain */ ".com",
         // popular web domains for the locale - most popular, displayed on the keyboard
-        /* 139 */ "!hasLabels!,.net,.org,.gov,.edu",
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        /* more_keys_for_popular_domain */ "!hasLabels!,.net,.org,.gov,.edu",
+        /* keyspecs_for_left_parenthesis_more_keys */ "!text/keyspec_less_than,!text/keyspec_left_curly_bracket,!text/keyspec_left_square_bracket",
+        /* keyspecs_for_right_parenthesis_more_keys */ "!text/keyspec_greater_than,!text/keyspec_right_curly_bracket,!text/keyspec_right_square_bracket",
         // The following characters don't need BIDI mirroring.
         // U+2018: "‘" LEFT SINGLE QUOTATION MARK
         // U+2019: "’" RIGHT SINGLE QUOTATION MARK
@@ -384,32 +426,31 @@
         // Abbreviations are:
         // laqm: LEFT-POINTING ANGLE QUOTATION MARK
         // raqm: RIGHT-POINTING ANGLE QUOTATION MARK
-        // rtl: Right-To-Left script order
         // lqm: LEFT QUOTATION MARK
         // rqm: RIGHT QUOTATION MARK
         // 9qm: LOW-9 QUOTATION MARK
         // The following each quotation mark pair consist of
         // <opening quotation mark>, <closing quotation mark>
         // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
-        /* 140 */ "\u2039,\u203A",
-        /* 141 */ "\u2039|\u203A,\u203A|\u2039",
-        /* 142 */ "\u203A,\u2039",
-        /* 143 */ "\u00AB,\u00BB",
-        /* 144 */ "\u00AB|\u00BB,\u00BB|\u00AB",
-        /* 145 */ "\u00BB,\u00AB",
+        /* single_laqm_raqm */ "!text/keyspec_left_single_angle_quote,!text/keyspec_right_single_angle_quote",
+        /* single_raqm_laqm */ "!text/keyspec_right_single_angle_quote,!text/keyspec_left_single_angle_quote",
+        /* double_laqm_raqm */ "!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote",
+        /* double_raqm_laqm */ "!text/keyspec_right_double_angle_quote,!text/keyspec_left_double_angle_quote",
         // The following each quotation mark triplet consists of
         // <another quotation mark>, <opening quotation mark>, <closing quotation mark>
         // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
-        /* 146 */ "\u201A,\u2018,\u2019",
-        /* 147 */ "\u2019,\u201A,\u2018",
-        /* 148 */ "\u2018,\u201A,\u2019",
-        /* 149 */ "\u201E,\u201C,\u201D",
-        /* 150 */ "\u201D,\u201E,\u201C",
-        /* 151 */ "\u201C,\u201E,\u201D",
-        /* 152 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
-        /* 153 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
-        /* 154 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
-        /* 155 */ "!icon/emoji_key|!code/key_emoji",
+        /* single_lqm_rqm */ "\u201A,\u2018,\u2019",
+        /* single_9qm_lqm */ "\u2019,\u201A,\u2018",
+        /* single_9qm_rqm */ "\u2018,\u201A,\u2019",
+        /* single_rqm_9qm */ "\u2018,\u2019,\u201A",
+        /* double_lqm_rqm */ "\u201E,\u201C,\u201D",
+        /* double_9qm_lqm */ "\u201D,\u201E,\u201C",
+        /* double_9qm_rqm */ "\u201C,\u201E,\u201D",
+        /* double_rqm_9qm */ "\u201C,\u201D,\u201E",
+        /* more_keys_for_single_quote */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
+        /* more_keys_for_double_quote */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
+        /* more_keys_for_tablet_double_quote */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
+        /* emoji_key_as_more_key */ "!icon/emoji_key|!code/key_emoji",
     };
 
     /* Language af: Afrikaans */
@@ -423,23 +464,7 @@
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E2,\u00E4,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
+        /* more_keys_for_a */ "\u00E1,\u00E2,\u00E4,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
@@ -448,67 +473,138 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F4,\u00F6,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        /* more_keys_for_o */ "\u00F3,\u00F4,\u00F6,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
-        /* 5 */ null,
+        /* more_keys_for_u */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* more_keys_for_i */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
+        /* double_quotes ~ */
+        null, null, null, null,
+        /* ~ more_keys_for_s */
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7 */ null,
+        /* more_keys_for_n */ "\u00F1,\u0144",
+        /* label_to_alpha_key */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 8 */ "\u00FD,\u0133",
+        /* more_keys_for_y */ "\u00FD,\u0133",
     };
 
     /* Language ar: Arabic */
     private static final String[] LANGUAGE_ar = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0623: "ا" ARABIC LETTER ALEF
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
         // U+062C: "پ" ARABIC LETTER PEH
-        /* 51 */ "\u0623\u200C\u0628\u200C\u062C",
-        /* 52 */ null,
-        /* 53 */ null,
-        /* 54 */ "!text/single_laqm_raqm_rtl",
-        /* 55 */ "!text/double_laqm_raqm_rtl",
-        /* 56~ */
-        null, null, null,
-        /* ~58 */
-        /* 59 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
-        /* 60 */ null,
-        /* 61 */ null,
+        /* label_to_alpha_key */ "\u0623\u200C\u0628\u200C\u062C",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null,
+        /* ~ more_keys_for_cyrillic_soft_sign */
+        /* more_keys_for_punctuation */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
+        /* more_keys_for_nordic_row2_11 */ null,
+        // U+0661: "١" ARABIC-INDIC DIGIT ONE
+        /* keylabel_for_symbols_1 */ "\u0661",
+        // U+0662: "٢" ARABIC-INDIC DIGIT TWO
+        /* keylabel_for_symbols_2 */ "\u0662",
+        // U+0663: "٣" ARABIC-INDIC DIGIT THREE
+        /* keylabel_for_symbols_3 */ "\u0663",
+        // U+0664: "٤" ARABIC-INDIC DIGIT FOUR
+        /* keylabel_for_symbols_4 */ "\u0664",
+        // U+0665: "٥" ARABIC-INDIC DIGIT FIVE
+        /* keylabel_for_symbols_5 */ "\u0665",
+        // U+0666: "٦" ARABIC-INDIC DIGIT SIX
+        /* keylabel_for_symbols_6 */ "\u0666",
+        // U+0667: "٧" ARABIC-INDIC DIGIT SEVEN
+        /* keylabel_for_symbols_7 */ "\u0667",
+        // U+0668: "٨" ARABIC-INDIC DIGIT EIGHT
+        /* keylabel_for_symbols_8 */ "\u0668",
+        // U+0669: "٩" ARABIC-INDIC DIGIT NINE
+        /* keylabel_for_symbols_9 */ "\u0669",
+        // U+0660: "٠" ARABIC-INDIC DIGIT ZERO
+        /* keylabel_for_symbols_0 */ "\u0660",
+        // Label for "switch to symbols" key.
+        // U+061F: "؟" ARABIC QUESTION MARK
+        /* label_to_symbol_key */ "\u0663\u0662\u0661\u061F",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* label_to_symbol_with_microphone_key */ "\u0663\u0662\u0661",
+        /* additional_more_keys_for_symbols_1 */ "1",
+        /* additional_more_keys_for_symbols_2 */ "2",
+        /* additional_more_keys_for_symbols_3 */ "3",
+        /* additional_more_keys_for_symbols_4 */ "4",
+        /* additional_more_keys_for_symbols_5 */ "5",
+        /* additional_more_keys_for_symbols_6 */ "6",
+        /* additional_more_keys_for_symbols_7 */ "7",
+        /* additional_more_keys_for_symbols_8 */ "8",
+        /* additional_more_keys_for_symbols_9 */ "9",
+        // U+066B: "٫" ARABIC DECIMAL SEPARATOR
+        // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
+        /* additional_more_keys_for_symbols_0 */ "0,\u066B,\u066C",
         // U+2605: "★" BLACK STAR
         // U+066D: "٭" ARABIC FIVE POINTED STAR
-        /* 62 */ "\u2605,\u066D",
-        // U+266A: "♪" EIGHTH NOTE
-        /* 63 */ "\u266A",
-        /* 64 */ null,
-        // The all letters need to be mirrored are found at
-        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
-        // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
-        /* 65 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 66 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        /* more_keys_for_star */ "\u2605,\u066D",
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 67 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 68 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+        /* keyspec_left_parenthesis */ "(|)",
+        /* keyspec_right_parenthesis */ ")|(",
+        /* keyspec_left_square_bracket */ "[|]",
+        /* keyspec_right_square_bracket */ "]|[",
+        /* keyspec_left_curly_bracket */ "{|}",
+        /* keyspec_right_curly_bracket */ "}|{",
+        /* keyspec_less_than */ "<|>",
+        /* keyspec_greater_than */ ">|<",
+        /* keyspec_less_than_equal */ "\u2264|\u2265",
+        /* keyspec_greater_than_equal */ "\u2265|\u2264",
+        /* keyspec_left_double_angle_quote */ "\u00AB|\u00BB",
+        /* keyspec_right_double_angle_quote */ "\u00BB|\u00AB",
+        /* keyspec_left_single_angle_quote */ "\u2039|\u203A",
+        /* keyspec_right_single_angle_quote */ "\u203A|\u2039",
+        // U+061F: "؟" ARABIC QUESTION MARK
+        // U+060C: "،" ARABIC COMMA
+        // U+061B: "؛" ARABIC SEMICOLON
+        /* keylabel_for_tablet_comma */ "\u060C",
+        /* more_keys_for_tablet_period */ "!text/more_keys_for_arabic_diacritics",
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* more_keys_for_question */ "?,\u00BF",
+        /* more_keys_for_h ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null,
+        /* ~ keylabel_for_spanish_row2_10 */
+        // U+266A: "♪" EIGHTH NOTE
+        /* more_keys_for_bullet */ "\u266A",
+        // The all letters need to be mirrored are found at
+        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
+        // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
+        // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
+        /* more_keys_for_left_parenthesis */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,!text/keyspecs_for_left_parenthesis_more_keys",
+        /* more_keys_for_right_parenthesis */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,!text/keyspecs_for_right_parenthesis_more_keys",
         // U+0655: "ٕ" ARABIC HAMZA BELOW
         // U+0654: "ٔ" ARABIC HAMZA ABOVE
         // U+0652: "ْ" ARABIC SUKUN
@@ -525,90 +621,29 @@
         // U+0640: "ـ" ARABIC TATWEEL
         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
         // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
-        /* 69 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        // U+0661: "١" ARABIC-INDIC DIGIT ONE
-        /* 70 */ "\u0661",
-        // U+0662: "٢" ARABIC-INDIC DIGIT TWO
-        /* 71 */ "\u0662",
-        // U+0663: "٣" ARABIC-INDIC DIGIT THREE
-        /* 72 */ "\u0663",
-        // U+0664: "٤" ARABIC-INDIC DIGIT FOUR
-        /* 73 */ "\u0664",
-        // U+0665: "٥" ARABIC-INDIC DIGIT FIVE
-        /* 74 */ "\u0665",
-        // U+0666: "٦" ARABIC-INDIC DIGIT SIX
-        /* 75 */ "\u0666",
-        // U+0667: "٧" ARABIC-INDIC DIGIT SEVEN
-        /* 76 */ "\u0667",
-        // U+0668: "٨" ARABIC-INDIC DIGIT EIGHT
-        /* 77 */ "\u0668",
-        // U+0669: "٩" ARABIC-INDIC DIGIT NINE
-        /* 78 */ "\u0669",
-        // U+0660: "٠" ARABIC-INDIC DIGIT ZERO
-        /* 79 */ "\u0660",
-        // Label for "switch to symbols" key.
-        // U+061F: "؟" ARABIC QUESTION MARK
-        /* 80 */ "\u0663\u0662\u0661\u061F",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 81 */ "\u0663\u0662\u0661",
-        /* 82 */ "1",
-        /* 83 */ "2",
-        /* 84 */ "3",
-        /* 85 */ "4",
-        /* 86 */ "5",
-        /* 87 */ "6",
-        /* 88 */ "7",
-        /* 89 */ "8",
-        /* 90 */ "9",
-        // U+066B: "٫" ARABIC DECIMAL SEPARATOR
-        // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
-        /* 91 */ "0,\u066B,\u066C",
-        /* 92~ */
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~101 */
+        /* more_keys_for_arabic_diacritics */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
         // U+060C: "،" ARABIC COMMA
-        /* 102 */ "\u060C",
-        /* 103 */ "\\,",
-        // U+061F: "؟" ARABIC QUESTION MARK
-        // U+060C: "،" ARABIC COMMA
-        // U+061B: "؛" ARABIC SEMICOLON
-        /* 104 */ "\u060C",
-        /* 105 */ "\u061F",
-        /* 106 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\",\'",
-        /* 107 */ null,
+        /* keylabel_for_comma */ "\u060C",
+        /* more_keys_for_comma */ "\\,",
+        /* keyhintlabel_for_tablet_comma */ "\u061F",
+        /* more_keys_for_tablet_comma */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\",\'",
         // U+0651: "ّ" ARABIC SHADDA
-        /* 108 */ "\u0651",
-        /* 109 */ "!text/more_keys_for_arabic_diacritics",
-        /* 110 */ null,
-        /* 111 */ "\u0651",
-        /* 112 */ "!text/more_keys_for_arabic_diacritics",
-        /* 113 */ "\u061F",
-        /* 114 */ "\u061B",
+        /* keyhintlabel_for_period */ "\u0651",
+        /* more_keys_for_period */ "!text/more_keys_for_arabic_diacritics",
+        /* keyhintlabel_for_tablet_period */ "\u0651",
+        /* keylabel_for_symbols_question */ "\u061F",
+        /* keylabel_for_symbols_semicolon */ "\u061B",
         // U+066A: "٪" ARABIC PERCENT SIGN
-        /* 115 */ "\u066A",
-        /* 116 */ null,
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 117 */ "?,\u00BF",
-        /* 118 */ ";",
+        /* keylabel_for_symbols_percent */ "\u066A",
+        /* more_keys_for_symbols_semicolon */ ";",
         // U+2030: "‰" PER MILLE SIGN
-        /* 119 */ "\\%,\u2030",
+        /* more_keys_for_symbols_percent */ "\\%,\u2030",
     };
 
     /* Language az_AZ: Azerbaijani (Azerbaijan) */
     private static final String[] LANGUAGE_az_AZ = {
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        /* 0 */ "\u00E2",
-        // U+0259: "ə" LATIN SMALL LETTER SCHWA
-        /* 1 */ "\u0259",
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E2",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+0153: "œ" LATIN SMALL LIGATURE OE
@@ -617,84 +652,91 @@
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
+        /* more_keys_for_o */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        /* more_keys_for_u */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        // U+0259: "ə" LATIN SMALL LETTER SCHWA
+        /* more_keys_for_e */ "\u0259",
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* more_keys_for_c */ "\u00E7,\u0107,\u010D",
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
-        /* 6 */ null,
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
+        /* more_keys_for_s */ "\u015F,\u00DF,\u015B,\u0161",
+        /* more_keys_for_n ~ */
         null, null, null, null, null, null, null,
-        /* ~14 */
+        /* ~ more_keys_for_l */
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u011F",
+        /* more_keys_for_g */ "\u011F",
     };
 
     /* Language be_BY: Belarusian (Belarus) */
     private static final String[] LANGUAGE_be_BY = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~24 */
-        // U+045E: "ў" CYRILLIC SMALL LETTER SHORT U
-        /* 25 */ "\u045E",
-        // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 26 */ "\u0451",
-        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-        /* 29 */ "\u0456",
-        /* 30~ */
-        null, null, null, null, null, null, null,
-        /* ~36 */
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
+        /* more_keys_for_a ~ */
         null, null, null, null, null,
-        /* ~42 */
-        // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
+        /* ~ more_keys_for_i */
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        /* more_keys_for_c ~ */
+        null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
+        /* label_to_alpha_key */ "\u0410\u0411\u0412",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ keylabel_for_nordic_row2_11 */
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* more_keys_for_cyrillic_ie */ "\u0451",
+        /* more_keys_for_nordic_row2_10 */ null,
+        // U+045E: "ў" CYRILLIC SMALL LETTER SHORT U
+        /* keylabel_for_east_slavic_row1_9 */ "\u045E",
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* keylabel_for_east_slavic_row1_12 */ "\u0451",
+        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
+        /* keylabel_for_east_slavic_row2_1 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* keylabel_for_east_slavic_row2_11 */ "\u044D",
+        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        /* keylabel_for_east_slavic_row3_5 */ "\u0456",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* more_keys_for_cyrillic_soft_sign */ "\u044A",
     };
 
     /* Language bg: Bulgarian */
     private static final String[] LANGUAGE_bg = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null,
+        /* ~ more_keys_for_i */
+        // single_quotes of Bulgarian is default single_quotes_right_left.
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes ~ */
+        null, null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ null,
-        // single_quotes of Bulgarian is default single_quotes_right_left.
-        /* 53 */ "!text/double_9qm_lqm",
+        /* label_to_alpha_key */ "\u0410\u0411\u0412",
     };
 
     /* Language ca: Catalan */
@@ -709,22 +751,7 @@
         // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
         // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
@@ -734,37 +761,63 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
+        /* more_keys_for_o */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
+        /* more_keys_for_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
-        null, null, null, null, null, null,
-        /* ~13 */
+        /* more_keys_for_c */ "\u00E7,\u0107,\u010D",
+        /* more_keys_for_s */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* more_keys_for_n */ "\u00F1,\u0144",
+        /* label_to_alpha_key ~ */
+        null, null, null, null, null,
+        /* ~ more_keys_for_t */
         // U+00B7: "·" MIDDLE DOT
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "l\u00B7l,\u0142",
-        /* 15~ */
+        /* more_keys_for_l */ "l\u00B7l,\u0142",
+        /* more_keys_for_g ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
+        /* ~ more_keys_for_cyrillic_soft_sign */
+        // U+00B7: "·" MIDDLE DOT
+        /* more_keys_for_punctuation */ "!fixedColumnOrder!9,;,/,(,),#,\u00B7,!,\\,,?,&,\\%,+,\",-,:,',@",
+        /* more_keys_for_nordic_row2_11 ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~58 */
-        // U+00B7: "·" MIDDLE DOT
-        /* 59 */ "!fixedColumnOrder!9,;,/,(,),#,\u00B7,!,\\,,?,&,\\%,+,\",-,:,',@",
-        /* 60 */ "!fixedColumnOrder!8,;,/,(,),#,\u00B7,',\\,,&,\\%,+,\",-,:,@",
+        /* ~ more_keys_for_swiss_row2_11 */
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 61 */ "\u00E7",
+        /* keylabel_for_spanish_row2_10 */ "\u00E7",
+        /* more_keys_for_bullet ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null,
+        /* ~ more_keys_for_currency_dollar */
+        /* more_keys_for_tablet_punctuation */ "!fixedColumnOrder!8,;,/,(,),#,\u00B7,',\\,,&,\\%,+,\",-,:,@",
     };
 
     /* Language cs: Czech */
@@ -777,23 +830,7 @@
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
@@ -802,48 +839,63 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        /* more_keys_for_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B",
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        /* 5 */ "\u0161,\u00DF,\u015B",
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0148,\u00F1,\u0144",
+        /* more_keys_for_u */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
+        /* more_keys_for_c */ "\u010D,\u00E7,\u0107",
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        /* more_keys_for_s */ "\u0161,\u00DF,\u015B",
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* more_keys_for_n */ "\u0148,\u00F1,\u0144",
+        /* label_to_alpha_key */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
+        /* more_keys_for_y */ "\u00FD,\u00FF",
         // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        /* 10 */ "\u0159",
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0165",
+        /* more_keys_for_d */ "\u010F",
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017E,\u017A,\u017C",
-        /* 13~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
+        /* more_keys_for_z */ "\u017E,\u017A,\u017C",
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        /* more_keys_for_t */ "\u0165",
+        /* more_keys_for_l */ null,
+        /* more_keys_for_g */ null,
+        /* single_angle_quotes */ "!text/single_raqm_laqm",
+        /* double_angle_quotes */ "!text/double_raqm_laqm",
+        /* keylabel_for_currency */ null,
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        /* more_keys_for_r */ "\u0159",
     };
 
     /* Language da: Danish */
@@ -854,65 +906,66 @@
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        /* 1 */ "\u00E9,\u00EB",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        /* 2 */ "\u00ED,\u00EF",
+        /* more_keys_for_a */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
+        /* more_keys_for_o */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        /* more_keys_for_u */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        /* more_keys_for_e */ "\u00E9,\u00EB",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        /* more_keys_for_i */ "\u00ED,\u00EF",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        /* more_keys_for_c */ null,
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u00DF,\u015B,\u0161",
+        /* more_keys_for_s */ "\u00DF,\u015B,\u0161",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7 */ null,
+        /* more_keys_for_n */ "\u00F1,\u0144",
+        /* label_to_alpha_key */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
+        /* more_keys_for_y */ "\u00FD,\u00FF",
         // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 9 */ "\u00F0",
-        /* 10~ */
-        null, null, null, null,
-        /* ~13 */
+        /* more_keys_for_d */ "\u00F0",
+        /* more_keys_for_z */ null,
+        /* more_keys_for_t */ null,
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u0142",
-        /* 15~ */
-        null, null, null, null, null,
-        /* ~19 */
+        /* more_keys_for_l */ "\u0142",
+        /* more_keys_for_g */ null,
+        /* single_angle_quotes */ "!text/single_raqm_laqm",
+        /* double_angle_quotes */ "!text/double_raqm_laqm",
+        /* keylabel_for_currency ~ */
+        null, null, null,
+        /* ~ more_keys_for_k */
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
+        /* keylabel_for_nordic_row1_11 */ "\u00E5",
         // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 21 */ "\u00E6",
+        /* keylabel_for_nordic_row2_10 */ "\u00E6",
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 22 */ "\u00F8",
+        /* keylabel_for_nordic_row2_11 */ "\u00F8",
+        /* more_keys_for_cyrillic_ie */ null,
         // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 23 */ "\u00E4",
+        /* more_keys_for_nordic_row2_10 */ "\u00E4",
+        /* keylabel_for_east_slavic_row1_9 ~ */
+        null, null, null, null, null, null, null,
+        /* ~ more_keys_for_punctuation */
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 24 */ "\u00F6",
-        /* 25~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
+        /* more_keys_for_nordic_row2_11 */ "\u00F6",
     };
 
     /* Language de: German */
@@ -925,14 +978,7 @@
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E4,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
-        /* 2 */ null,
+        /* more_keys_for_a */ "\u00E4,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
@@ -941,57 +987,66 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D",
+        /* more_keys_for_o */ "\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D",
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        /* more_keys_for_u */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        /* more_keys_for_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
+        /* more_keys_for_i */ null,
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        /* more_keys_for_c */ null,
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u00DF,\u015B,\u0161",
+        /* more_keys_for_s */ "\u00DF,\u015B,\u0161",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7~ */
+        /* more_keys_for_n */ "\u00F1,\u0144",
+        /* label_to_alpha_key ~ */
+        null, null, null, null, null, null, null,
+        /* ~ more_keys_for_g */
+        /* single_angle_quotes */ "!text/single_raqm_laqm",
+        /* double_angle_quotes */ "!text/double_raqm_laqm",
+        /* keylabel_for_currency ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null,
-        /* ~44 */
+        /* ~ more_keys_for_cyrillic_i */
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 45 */ "\u00FC",
+        /* keylabel_for_swiss_row1_11 */ "\u00FC",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 46 */ "\u00F6",
+        /* keylabel_for_swiss_row2_10 */ "\u00F6",
         // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 47 */ "\u00E4",
+        /* keylabel_for_swiss_row2_11 */ "\u00E4",
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        /* 48 */ "\u00E8",
+        /* more_keys_for_swiss_row1_11 */ "\u00E8",
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        /* 49 */ "\u00E9",
+        /* more_keys_for_swiss_row2_10 */ "\u00E9",
         // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        /* 50 */ "\u00E0",
-        /* 51 */ null,
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
+        /* more_keys_for_swiss_row2_11 */ "\u00E0",
     };
 
     /* Language el: Greek */
     private static final String[] LANGUAGE_el = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
         // U+0392: "Β" GREEK CAPITAL LETTER BETA
         // U+0393: "Γ" GREEK CAPITAL LETTER GAMMA
-        /* 51 */ "\u0391\u0392\u0393",
+        /* label_to_alpha_key */ "\u0391\u0392\u0393",
     };
 
     /* Language en: English */
@@ -1004,19 +1059,7 @@
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        /* more_keys_for_a */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
@@ -1025,19 +1068,33 @@
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
+        /* more_keys_for_o */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u00F1",
+        /* more_keys_for_u */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        /* more_keys_for_i */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u00E7",
+        /* more_keys_for_c */ "\u00E7",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* more_keys_for_s */ "\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* more_keys_for_n */ "\u00F1",
     };
 
     /* Language eo: Esperanto */
@@ -1053,26 +1110,7 @@
         // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
         // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
         // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133",
+        /* more_keys_for_a */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
@@ -1083,7 +1121,7 @@
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
         // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D,\u0151,\u00BA",
+        /* more_keys_for_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D,\u0151,\u00BA",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
@@ -1094,91 +1132,121 @@
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
         // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
         // U+00B5: "µ" MICRO SIGN
-        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5",
+        /* more_keys_for_u */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* more_keys_for_i */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
+        /* more_keys_for_c */ "\u0107,\u010D,\u00E7,\u010B",
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u00DF,\u0161,\u015B,\u0219,\u015F",
+        /* more_keys_for_s */ "\u00DF,\u0161,\u015B,\u0219,\u015F",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
         // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
         // U+014B: "ŋ" LATIN SMALL LETTER ENG
-        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
-        /* 7 */ "\u0107,\u010D,\u00E7,\u010B",
+        /* more_keys_for_n */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
+        /* label_to_alpha_key */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
         // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 8 */ "y,\u00FD,\u0177,\u00FF,\u00FE",
+        /* more_keys_for_y */ "y,\u00FD,\u0177,\u00FF,\u00FE",
         // U+00F0: "ð" LATIN SMALL LETTER ETH
         // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
         // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u00F0,\u010F,\u0111",
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        /* 10 */ "\u0159,\u0155,\u0157",
+        /* more_keys_for_d */ "\u00F0,\u010F,\u0111",
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* more_keys_for_z */ "\u017A,\u017C,\u017E",
         // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
         // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW
         // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
         // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
-        /* 11 */ "\u0165,\u021B,\u0163,\u0167",
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017A,\u017C,\u017E",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        // U+0138: "ĸ" LATIN SMALL LETTER KRA
-        /* 13 */ "\u0137,\u0138",
+        /* more_keys_for_t */ "\u0165,\u021B,\u0163,\u0167",
         // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
         // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
         // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
         // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
+        /* more_keys_for_l */ "\u013A,\u013C,\u013E,\u0140,\u0142",
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
         // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE
         // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
-        /* 15 */ "\u011F,\u0121,\u0123",
-        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
-        /* 16 */ "w,\u0175",
+        /* more_keys_for_g */ "\u011F,\u0121,\u0123",
+        /* single_angle_quotes ~ */
+        null, null, null,
+        /* ~ keylabel_for_currency */
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        /* more_keys_for_r */ "\u0159,\u0155,\u0157",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        // U+0138: "ĸ" LATIN SMALL LETTER KRA
+        /* more_keys_for_k */ "\u0137,\u0138",
+        /* keylabel_for_nordic_row1_11 ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_question */
         // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
         // U+0127: "ħ" LATIN SMALL LETTER H WITH STROKE
-        /* 17 */ "\u0125,\u0127",
-        /* 18 */ null,
+        /* more_keys_for_h */ "\u0125,\u0127",
         // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
-        /* 19 */ "w,\u0175",
-        /* 20~ */
+        /* more_keys_for_w */ "w,\u0175",
+        /* more_keys_for_cyrillic_u ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null,
-        /* ~60 */
+        null,
+        /* ~ more_keys_for_swiss_row2_11 */
         // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
-        /* 61 */ "\u0135",
-        /* 62~ */
+        /* keylabel_for_spanish_row2_10 */ "\u0135",
+        /* more_keys_for_bullet ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~119 */
-        /* 120 */ "q",
-        /* 121 */ "x",
+        null,
+        /* ~ more_keys_for_symbols_percent */
+        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
+        /* more_keys_for_v */ "w,\u0175",
+        /* more_keys_for_j ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_exclamation */
+        /* more_keys_for_q */ "q",
+        /* more_keys_for_x */ "x",
         // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
-        /* 122 */ "\u015D",
+        /* keylabel_for_q */ "\u015D",
         // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
-        /* 123 */ "\u011D",
+        /* keylabel_for_w */ "\u011D",
         // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
-        /* 124 */ "\u016D",
+        /* keylabel_for_y */ "\u016D",
         // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
-        /* 125 */ "\u0109",
+        /* keylabel_for_x */ "\u0109",
     };
 
     /* Language es: Spanish */
@@ -1193,22 +1261,7 @@
         // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
         // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
@@ -1218,30 +1271,45 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
+        /* more_keys_for_o */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
+        /* more_keys_for_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
+        /* more_keys_for_c */ "\u00E7,\u0107,\u010D",
+        /* more_keys_for_s */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* more_keys_for_n */ "\u00F1,\u0144",
+        /* label_to_alpha_key ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~58 */
+        null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_cyrillic_soft_sign */
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 59 */ "!fixedColumnOrder!9,\u00A1,;,/,(,),#,!,\\,,?,\u00BF,&,\\%,+,\",-,:,',@",
+        /* more_keys_for_punctuation */ "!fixedColumnOrder!9,\u00A1,;,/,(,),#,!,\\,,?,\u00BF,&,\\%,+,\",-,:,',@",
     };
 
     /* Language et_EE: Estonian (Estonia) */
@@ -1255,24 +1323,7 @@
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        /* 0 */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
+        /* more_keys_for_a */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
@@ -1281,7 +1332,7 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
+        /* more_keys_for_o */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
@@ -1290,114 +1341,181 @@
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
+        /* more_keys_for_u */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        /* more_keys_for_e */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* more_keys_for_i */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* more_keys_for_c */ "\u010D,\u00E7,\u0107",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F",
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
+        /* more_keys_for_n */ "\u0146,\u00F1,\u0144,\u0144",
+        /* label_to_alpha_key */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
+        /* more_keys_for_y */ "\u00FD,\u00FF",
         // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        /* 10 */ "\u0157,\u0159,\u0155",
-        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0163,\u0165",
+        /* more_keys_for_d */ "\u010F",
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
+        /* more_keys_for_z */ "\u017E,\u017C,\u017A",
+        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        /* more_keys_for_t */ "\u0163,\u0165",
         // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
         // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
         // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
+        /* more_keys_for_l */ "\u013C,\u0142,\u013A,\u013E",
         // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        null, null, null, null,
-        /* ~19 */
+        /* more_keys_for_g */ "\u0123,\u011F",
+        /* single_angle_quotes ~ */
+        null, null, null,
+        /* ~ keylabel_for_currency */
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        /* more_keys_for_r */ "\u0157,\u0159,\u0155",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        /* more_keys_for_k */ "\u0137",
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 20 */ "\u00FC",
+        /* keylabel_for_nordic_row1_11 */ "\u00FC",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 21 */ "\u00F6",
+        /* keylabel_for_nordic_row2_10 */ "\u00F6",
         // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 22 */ "\u00E4",
+        /* keylabel_for_nordic_row2_11 */ "\u00E4",
+        /* more_keys_for_cyrillic_ie */ null,
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 23 */ "\u00F5",
-        /* 24~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
+        /* more_keys_for_nordic_row2_10 */ "\u00F5",
     };
 
     /* Language fa: Persian */
     private static final String[] LANGUAGE_fa = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0627: "ا" ARABIC LETTER ALEF
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
         // U+067E: "پ" ARABIC LETTER PEH
-        /* 51 */ "\u0627\u200C\u0628\u200C\u067E",
-        /* 52 */ null,
-        /* 53 */ null,
-        /* 54 */ "!text/single_laqm_raqm_rtl",
-        /* 55 */ "!text/double_laqm_raqm_rtl",
-        /* 56 */ null,
+        /* label_to_alpha_key */ "\u0627\u200C\u0628\u200C\u067E",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ double_angle_quotes */
         // U+FDFC: "﷼" RIAL SIGN
-        /* 57 */ "\uFDFC",
-        /* 58 */ null,
+        /* keylabel_for_currency */ "\uFDFC",
+        /* more_keys_for_r ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_cyrillic_soft_sign */
         // U+061F: "؟" ARABIC QUESTION MARK
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
-        /* 59 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
-        /* 60 */ null,
-        /* 61 */ null,
+        /* more_keys_for_punctuation */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis",
+        /* more_keys_for_nordic_row2_11 */ null,
+        // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE
+        /* keylabel_for_symbols_1 */ "\u06F1",
+        // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO
+        /* keylabel_for_symbols_2 */ "\u06F2",
+        // U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE
+        /* keylabel_for_symbols_3 */ "\u06F3",
+        // U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR
+        /* keylabel_for_symbols_4 */ "\u06F4",
+        // U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE
+        /* keylabel_for_symbols_5 */ "\u06F5",
+        // U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX
+        /* keylabel_for_symbols_6 */ "\u06F6",
+        // U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN
+        /* keylabel_for_symbols_7 */ "\u06F7",
+        // U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT
+        /* keylabel_for_symbols_8 */ "\u06F8",
+        // U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE
+        /* keylabel_for_symbols_9 */ "\u06F9",
+        // U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO
+        /* keylabel_for_symbols_0 */ "\u06F0",
+        // Label for "switch to symbols" key.
+        // U+061F: "؟" ARABIC QUESTION MARK
+        /* label_to_symbol_key */ "\u06F3\u06F2\u06F1\u061F",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* label_to_symbol_with_microphone_key */ "\u06F3\u06F2\u06F1",
+        /* additional_more_keys_for_symbols_1 */ "1",
+        /* additional_more_keys_for_symbols_2 */ "2",
+        /* additional_more_keys_for_symbols_3 */ "3",
+        /* additional_more_keys_for_symbols_4 */ "4",
+        /* additional_more_keys_for_symbols_5 */ "5",
+        /* additional_more_keys_for_symbols_6 */ "6",
+        /* additional_more_keys_for_symbols_7 */ "7",
+        /* additional_more_keys_for_symbols_8 */ "8",
+        /* additional_more_keys_for_symbols_9 */ "9",
+        // U+066B: "٫" ARABIC DECIMAL SEPARATOR
+        // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
+        /* additional_more_keys_for_symbols_0 */ "0,\u066B,\u066C",
         // U+2605: "★" BLACK STAR
         // U+066D: "٭" ARABIC FIVE POINTED STAR
-        /* 62 */ "\u2605,\u066D",
+        /* more_keys_for_star */ "\u2605,\u066D",
+        /* keyspec_left_parenthesis */ "(|)",
+        /* keyspec_right_parenthesis */ ")|(",
+        /* keyspec_left_square_bracket */ "[|]",
+        /* keyspec_right_square_bracket */ "]|[",
+        /* keyspec_left_curly_bracket */ "{|}",
+        /* keyspec_right_curly_bracket */ "}|{",
+        /* keyspec_less_than */ "<|>",
+        /* keyspec_greater_than */ ">|<",
+        /* keyspec_less_than_equal */ "\u2264|\u2265",
+        /* keyspec_greater_than_equal */ "\u2265|\u2264",
+        /* keyspec_left_double_angle_quote */ "\u00AB|\u00BB",
+        /* keyspec_right_double_angle_quote */ "\u00BB|\u00AB",
+        /* keyspec_left_single_angle_quote */ "\u2039|\u203A",
+        /* keyspec_right_single_angle_quote */ "\u203A|\u2039",
+        // U+060C: "،" ARABIC COMMA
+        // U+061B: "؛" ARABIC SEMICOLON
+        // U+061F: "؟" ARABIC QUESTION MARK
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        /* keylabel_for_tablet_comma */ "\u060C",
+        /* more_keys_for_tablet_period */ "!text/more_keys_for_arabic_diacritics",
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* more_keys_for_question */ "?,\u00BF",
+        /* more_keys_for_h ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null,
+        /* ~ keylabel_for_spanish_row2_10 */
         // U+266A: "♪" EIGHTH NOTE
-        /* 63 */ "\u266A",
-        /* 64 */ null,
+        /* more_keys_for_bullet */ "\u266A",
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
         // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
         // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
-        /* 65 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 66 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
-        // U+2264: "≤" LESS-THAN OR EQUAL TO
-        // U+2265: "≥" GREATER-THAN EQUAL TO
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 67 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
-        /* 68 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
+        /* more_keys_for_left_parenthesis */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,!text/keyspecs_for_left_parenthesis_more_keys",
+        /* more_keys_for_right_parenthesis */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,!text/keyspecs_for_right_parenthesis_more_keys",
         // U+0655: "ٕ" ARABIC HAMZA BELOW
         // U+0652: "ْ" ARABIC SUKUN
         // U+0651: "ّ" ARABIC SHADDA
@@ -1414,76 +1532,34 @@
         // U+0640: "ـ" ARABIC TATWEEL
         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
         // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
-        /* 69 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE
-        /* 70 */ "\u06F1",
-        // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO
-        /* 71 */ "\u06F2",
-        // U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE
-        /* 72 */ "\u06F3",
-        // U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR
-        /* 73 */ "\u06F4",
-        // U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE
-        /* 74 */ "\u06F5",
-        // U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX
-        /* 75 */ "\u06F6",
-        // U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN
-        /* 76 */ "\u06F7",
-        // U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT
-        /* 77 */ "\u06F8",
-        // U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE
-        /* 78 */ "\u06F9",
-        // U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO
-        /* 79 */ "\u06F0",
-        // Label for "switch to symbols" key.
-        // U+061F: "؟" ARABIC QUESTION MARK
-        /* 80 */ "\u06F3\u06F2\u06F1\u061F",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 81 */ "\u06F3\u06F2\u06F1",
-        /* 82 */ "1",
-        /* 83 */ "2",
-        /* 84 */ "3",
-        /* 85 */ "4",
-        /* 86 */ "5",
-        /* 87 */ "6",
-        /* 88 */ "7",
-        /* 89 */ "8",
-        /* 90 */ "9",
-        // U+066B: "٫" ARABIC DECIMAL SEPARATOR
-        // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
-        /* 91 */ "0,\u066B,\u066C",
-        /* 92~ */
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~101 */
+        /* more_keys_for_arabic_diacritics */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
         // U+060C: "،" ARABIC COMMA
-        /* 102 */ "\u060C",
-        /* 103 */ "\\,",
-        // U+060C: "،" ARABIC COMMA
-        // U+061B: "؛" ARABIC SEMICOLON
-        // U+061F: "؟" ARABIC QUESTION MARK
+        /* keylabel_for_comma */ "\u060C",
+        /* more_keys_for_comma */ "\\,",
+        /* keyhintlabel_for_tablet_comma */ "\u061F",
+        /* more_keys_for_tablet_comma */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote",
+        // U+064B: "ً" ARABIC FATHATAN
+        /* keyhintlabel_for_period */ "\u064B",
+        /* more_keys_for_period */ "!text/more_keys_for_arabic_diacritics",
+        /* keyhintlabel_for_tablet_period */ "\u064B",
+        /* keylabel_for_symbols_question */ "\u061F",
+        /* keylabel_for_symbols_semicolon */ "\u061B",
+        // U+066A: "٪" ARABIC PERCENT SIGN
+        /* keylabel_for_symbols_percent */ "\u066A",
+        /* more_keys_for_symbols_semicolon */ ";",
+        // U+2030: "‰" PER MILLE SIGN
+        /* more_keys_for_symbols_percent */ "\\%,\u2030",
+        /* more_keys_for_v ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_plus */
+        // U+2264: "≤" LESS-THAN OR EQUAL TO
+        // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        /* 104 */ "\u060C",
-        /* 105 */ "\u061F",
-        /* 106 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
-        /* 107 */ null,
-        // U+064B: "ً" ARABIC FATHATAN
-        /* 108 */ "\u064B",
-        /* 109 */ "!text/more_keys_for_arabic_diacritics",
-        /* 110 */ null,
-        /* 111 */ "\u064B",
-        /* 112 */ "!text/more_keys_for_arabic_diacritics",
-        /* 113 */ "\u061F",
-        /* 114 */ "\u061B",
-        // U+066A: "٪" ARABIC PERCENT SIGN
-        /* 115 */ "\u066A",
-        /* 116 */ null,
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 117 */ "?,\u00BF",
-        /* 118 */ ";",
-        // U+2030: "‰" PER MILLE SIGN
-        /* 119 */ "\\%,\u2030",
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        /* more_keys_for_less_than */ "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote;,!text/keyspec_less_than_equal;,!text/keyspec_less_than",
+        /* more_keys_for_greater_than */ "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote;,!text/keyspec_greater_than_equal;,!text/keyspec_greater_than",
     };
 
     /* Language fi: Finnish */
@@ -1494,9 +1570,7 @@
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
-        /* 1 */ null,
-        /* 2 */ null,
+        /* more_keys_for_a */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
@@ -1504,33 +1578,40 @@
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
+        /* more_keys_for_o */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 4 */ "\u00FC",
+        /* more_keys_for_u */ "\u00FC",
+        /* more_keys_for_e ~ */
+        null, null, null, null, null,
+        /* ~ more_keys_for_c */
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        /* 5 */ "\u0161,\u00DF,\u015B",
-        /* 6~ */
-        null, null, null, null, null, null,
-        /* ~11 */
+        /* more_keys_for_s */ "\u0161,\u00DF,\u015B",
+        /* more_keys_for_n ~ */
+        null, null, null, null,
+        /* ~ more_keys_for_d */
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017E,\u017A,\u017C",
-        /* 13~ */
-        null, null, null, null, null, null, null,
-        /* ~19 */
+        /* more_keys_for_z */ "\u017E,\u017A,\u017C",
+        /* more_keys_for_t ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_k */
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
+        /* keylabel_for_nordic_row1_11 */ "\u00E5",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 21 */ "\u00F6",
+        /* keylabel_for_nordic_row2_10 */ "\u00F6",
         // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 22 */ "\u00E4",
+        /* keylabel_for_nordic_row2_11 */ "\u00E4",
+        /* more_keys_for_cyrillic_ie */ null,
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 23 */ "\u00F8",
+        /* more_keys_for_nordic_row2_10 */ "\u00F8",
+        /* keylabel_for_east_slavic_row1_9 ~ */
+        null, null, null, null, null, null, null,
+        /* ~ more_keys_for_punctuation */
         // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 24 */ "\u00E6",
+        /* more_keys_for_nordic_row2_11 */ "\u00E6",
     };
 
     /* Language fr: French */
@@ -1544,22 +1625,7 @@
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
         // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA",
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
@@ -1569,132 +1635,146 @@
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA",
+        /* more_keys_for_o */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA",
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B",
-        /* 5 */ null,
-        /* 6 */ null,
+        /* more_keys_for_u */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* more_keys_for_c */ "\u00E7,\u0107,\u010D",
+        /* more_keys_for_s ~ */
+        null, null, null,
+        /* ~ label_to_alpha_key */
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "%,\u00FF",
-        /* 9~ */
+        /* more_keys_for_y */ "%,\u00FF",
+        /* more_keys_for_d ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~44 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_cyrillic_i */
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        /* 45 */ "\u00E8",
+        /* keylabel_for_swiss_row1_11 */ "\u00E8",
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        /* 46 */ "\u00E9",
+        /* keylabel_for_swiss_row2_10 */ "\u00E9",
         // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        /* 47 */ "\u00E0",
+        /* keylabel_for_swiss_row2_11 */ "\u00E0",
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 48 */ "\u00FC",
+        /* more_keys_for_swiss_row1_11 */ "\u00FC",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 49 */ "\u00F6",
+        /* more_keys_for_swiss_row2_10 */ "\u00F6",
         // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 50 */ "\u00E4",
+        /* more_keys_for_swiss_row2_11 */ "\u00E4",
     };
 
     /* Language hi: Hindi */
     private static final String[] LANGUAGE_hi = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
-        /* 51 */ "\u0915\u0916\u0917",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
+        /* label_to_alpha_key */ "\u0915\u0916\u0917",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ double_angle_quotes */
         // U+20B9: "₹" INDIAN RUPEE SIGN
-        /* 57 */ "\u20B9",
-        /* 58~ */
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~69 */
+        /* keylabel_for_currency */ "\u20B9",
+        /* more_keys_for_r ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_nordic_row2_11 */
         // U+0967: "१" DEVANAGARI DIGIT ONE
-        /* 70 */ "\u0967",
+        /* keylabel_for_symbols_1 */ "\u0967",
         // U+0968: "२" DEVANAGARI DIGIT TWO
-        /* 71 */ "\u0968",
+        /* keylabel_for_symbols_2 */ "\u0968",
         // U+0969: "३" DEVANAGARI DIGIT THREE
-        /* 72 */ "\u0969",
+        /* keylabel_for_symbols_3 */ "\u0969",
         // U+096A: "४" DEVANAGARI DIGIT FOUR
-        /* 73 */ "\u096A",
+        /* keylabel_for_symbols_4 */ "\u096A",
         // U+096B: "५" DEVANAGARI DIGIT FIVE
-        /* 74 */ "\u096B",
+        /* keylabel_for_symbols_5 */ "\u096B",
         // U+096C: "६" DEVANAGARI DIGIT SIX
-        /* 75 */ "\u096C",
+        /* keylabel_for_symbols_6 */ "\u096C",
         // U+096D: "७" DEVANAGARI DIGIT SEVEN
-        /* 76 */ "\u096D",
+        /* keylabel_for_symbols_7 */ "\u096D",
         // U+096E: "८" DEVANAGARI DIGIT EIGHT
-        /* 77 */ "\u096E",
+        /* keylabel_for_symbols_8 */ "\u096E",
         // U+096F: "९" DEVANAGARI DIGIT NINE
-        /* 78 */ "\u096F",
+        /* keylabel_for_symbols_9 */ "\u096F",
         // U+0966: "०" DEVANAGARI DIGIT ZERO
-        /* 79 */ "\u0966",
+        /* keylabel_for_symbols_0 */ "\u0966",
         // Label for "switch to symbols" key.
-        /* 80 */ "?\u0967\u0968\u0969",
+        /* label_to_symbol_key */ "?\u0967\u0968\u0969",
         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
         // part because it'll be appended by the code.
-        /* 81 */ "\u0967\u0968\u0969",
-        /* 82 */ "1",
-        /* 83 */ "2",
-        /* 84 */ "3",
-        /* 85 */ "4",
-        /* 86 */ "5",
-        /* 87 */ "6",
-        /* 88 */ "7",
-        /* 89 */ "8",
-        /* 90 */ "9",
-        /* 91 */ "0",
+        /* label_to_symbol_with_microphone_key */ "\u0967\u0968\u0969",
+        /* additional_more_keys_for_symbols_1 */ "1",
+        /* additional_more_keys_for_symbols_2 */ "2",
+        /* additional_more_keys_for_symbols_3 */ "3",
+        /* additional_more_keys_for_symbols_4 */ "4",
+        /* additional_more_keys_for_symbols_5 */ "5",
+        /* additional_more_keys_for_symbols_6 */ "6",
+        /* additional_more_keys_for_symbols_7 */ "7",
+        /* additional_more_keys_for_symbols_8 */ "8",
+        /* additional_more_keys_for_symbols_9 */ "9",
+        /* additional_more_keys_for_symbols_0 */ "0",
     };
 
     /* Language hr: Croatian */
     private static final String[] LANGUAGE_hr = {
-        /* 0~ */
+        /* more_keys_for_a ~ */
         null, null, null, null, null,
-        /* ~4 */
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u0161,\u015B,\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
+        /* ~ more_keys_for_i */
+        /* double_quotes */ "!text/double_9qm_rqm",
+        /* single_quotes */ "!text/single_9qm_rqm",
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u010D,\u0107,\u00E7",
-        /* 8 */ null,
+        /* more_keys_for_c */ "\u010D,\u0107,\u00E7",
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* more_keys_for_s */ "\u0161,\u015B,\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* more_keys_for_n */ "\u00F1,\u0144",
+        /* label_to_alpha_key */ null,
+        /* more_keys_for_y */ null,
         // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u0111",
-        /* 10 */ null,
-        /* 11 */ null,
+        /* more_keys_for_d */ "\u0111",
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017E,\u017A,\u017C",
-        /* 13~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
+        /* more_keys_for_z */ "\u017E,\u017A,\u017C",
+        /* more_keys_for_t ~ */
+        null, null, null,
+        /* ~ more_keys_for_g */
+        /* single_angle_quotes */ "!text/single_raqm_laqm",
+        /* double_angle_quotes */ "!text/double_raqm_laqm",
     };
 
     /* Language hu: Hungarian */
@@ -1707,22 +1787,7 @@
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
@@ -1732,34 +1797,52 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        /* more_keys_for_o */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
-        /* 5~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
+        /* more_keys_for_u */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
+        /* double_quotes */ "!text/double_9qm_rqm",
+        /* single_quotes */ "!text/single_9qm_rqm",
+        /* more_keys_for_c ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_g */
+        /* single_angle_quotes */ "!text/single_raqm_laqm",
+        /* double_angle_quotes */ "!text/double_raqm_laqm",
     };
 
     /* Language hy_AM: Armenian (Armenia) */
     private static final String[] LANGUAGE_hy_AM = {
-        /* 0~ */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_n */
+        // Label for "switch to alphabetic" key.
+        // U+0531: "Ա" ARMENIAN CAPITAL LETTER AYB
+        // U+0532: "Բ" ARMENIAN CAPITAL LETTER BEN
+        // U+0533: "Գ" ARMENIAN CAPITAL LETTER GIM
+        /* label_to_alpha_key */ "\u0531\u0532\u0533",
+        /* more_keys_for_y ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~58 */
+        null, null, null, null, null, null, null,
+        /* ~ more_keys_for_cyrillic_soft_sign */
         // U+058A: "֊" ARMENIAN HYPHEN
         // U+055C: "՜" ARMENIAN EXCLAMATION MARK
         // U+055D: "՝" ARMENIAN COMMA
@@ -1768,36 +1851,33 @@
         // U+055A: "՚" ARMENIAN APOSTROPHE
         // U+055B: "՛" ARMENIAN EMPHASIS MARK
         // U+055F: "՟" ARMENIAN ABBREVIATION MARK
-        /* 59 */ "!fixedColumnOrder!8,!,?,\u0559,\u055A,.,\u055C,\\,,\u055E,:,;,\u055F,\u00AB,\u00BB,\u058A,\u055D,\u055B",
-        /* 60~ */
+        /* more_keys_for_punctuation */ "!fixedColumnOrder!8,!,?,\u0559,\u055A,.,\u055C,\\,,\u055E,:,;,\u055F,\u00AB,\u00BB,\u058A,\u055D,\u055B",
+        /* more_keys_for_nordic_row2_11 ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~103 */
+        null, null, null, null, null, null, null, null,
+        /* ~ keyspec_right_single_angle_quote */
         // U+058F: "֏" ARMENIAN DRAM SIGN
         // TODO: Enable this when we have glyph for the following letter
         // <string name="keylabel_for_currency">&#x058F;</string>
         // 
         // U+055D: "՝" ARMENIAN COMMA
-        /* 104 */ "\u055D",
-        /* 105 */ null,
-        /* 106 */ null,
-        // U+0589: "։" ARMENIAN FULL STOP
-        /* 107 */ "\u0589",
-        /* 108 */ null,
-        /* 109 */ null,
-        /* 110 */ "\u0589",
-        /* 111 */ null,
-        /* 112 */ "!text/more_keys_for_punctuation",
-        /* 113~ */
-        null, null, null,
-        /* ~115 */
-        // U+055C: "՜" ARMENIAN EXCLAMATION MARK
-        // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 116 */ "\u055C,\u00A1",
+        /* keylabel_for_tablet_comma */ "\u055D",
+        /* more_keys_for_tablet_period */ "!text/more_keys_for_punctuation",
         // U+055E: "՞" ARMENIAN QUESTION MARK
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 117 */ "\u055E,\u00BF",
+        /* more_keys_for_question */ "\u055E,\u00BF",
+        /* more_keys_for_h ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_greater_than */
+        // U+0589: "։" ARMENIAN FULL STOP
+        /* keylabel_for_period */ "\u0589",
+        /* keylabel_for_tablet_period */ "\u0589",
+        // U+055C: "՜" ARMENIAN EXCLAMATION MARK
+        // U+00A1: "¡" INVERTED EXCLAMATION MARK
+        /* more_keys_for_exclamation */ "\u055C,\u00A1",
     };
 
     /* Language is: Icelandic */
@@ -1810,22 +1890,7 @@
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
@@ -1834,39 +1899,50 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        /* more_keys_for_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
-        /* 5~ */
-        null, null, null,
-        /* ~7 */
+        /* more_keys_for_u */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        /* more_keys_for_c ~ */
+        null, null, null, null,
+        /* ~ label_to_alpha_key */
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
+        /* more_keys_for_y */ "\u00FD,\u00FF",
         // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 9 */ "\u00F0",
-        /* 10 */ null,
+        /* more_keys_for_d */ "\u00F0",
+        /* more_keys_for_z */ null,
         // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 11 */ "\u00FE",
-        /* 12~ */
-        null, null, null, null, null, null, null, null,
-        /* ~19 */
+        /* more_keys_for_t */ "\u00FE",
+        /* more_keys_for_l ~ */
+        null, null, null, null, null, null, null,
+        /* ~ more_keys_for_k */
         // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 20 */ "\u00F0",
+        /* keylabel_for_nordic_row1_11 */ "\u00F0",
         // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 21 */ "\u00E6",
+        /* keylabel_for_nordic_row2_10 */ "\u00E6",
         // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 22 */ "\u00FE",
-        /* 23~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
+        /* keylabel_for_nordic_row2_11 */ "\u00FE",
     };
 
     /* Language it: Italian */
@@ -1880,22 +1956,7 @@
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
         // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA",
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
@@ -1905,214 +1966,243 @@
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA",
+        /* more_keys_for_o */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA",
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B",
+        /* more_keys_for_u */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
     };
 
     /* Language iw: Hebrew */
     private static final String[] LANGUAGE_iw = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null,
+        /* ~ more_keys_for_i */
+        /* double_quotes */ "!text/double_rqm_9qm",
+        /* single_quotes */ "!text/single_rqm_9qm",
+        /* more_keys_for_c ~ */
+        null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+05D0: "א" HEBREW LETTER ALEF
         // U+05D1: "ב" HEBREW LETTER BET
         // U+05D2: "ג" HEBREW LETTER GIMEL
-        /* 51 */ "\u05D0\u05D1\u05D2",
-        // The following characters don't need BIDI mirroring.
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        /* 52 */ "\u2018,\u2019,\u201A",
-        /* 53 */ "\u201C,\u201D,\u201E",
-        /* 54 */ "!text/single_laqm_raqm_rtl",
-        /* 55 */ "!text/double_laqm_raqm_rtl",
-        /* 56 */ null,
+        /* label_to_alpha_key */ "\u05D0\u05D1\u05D2",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ double_angle_quotes */
         // U+20AA: "₪" NEW SHEQEL SIGN
-        /* 57 */ "\u20AA",
-        /* 58 */ null,
-        /* 59 */ "!fixedColumnOrder!8,;,/,(|),)|(,#,!,\\,,?,&,\\%,+,\",-,:,',@",
-        /* 60 */ "!fixedColumnOrder!7,;,/,(|),)|(,#,',\\,,&,\\%,+,\",-,:,@",
-        /* 61 */ null,
+        /* keylabel_for_currency */ "\u20AA",
+        /* more_keys_for_r ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null,
+        /* ~ additional_more_keys_for_symbols_0 */
         // U+2605: "★" BLACK STAR
-        /* 62 */ "\u2605",
-        /* 63 */ null,
-        // U+00B1: "±" PLUS-MINUS SIGN
-        // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
-        /* 64 */ "\u00B1,\uFB29",
+        /* more_keys_for_star */ "\u2605",
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 65 */ "!fixedColumnOrder!3,<|>,{|},[|]",
-        /* 66 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 67 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 68 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+        /* keyspec_left_parenthesis */ "(|)",
+        /* keyspec_right_parenthesis */ ")|(",
+        /* keyspec_left_square_bracket */ "[|]",
+        /* keyspec_right_square_bracket */ "]|[",
+        /* keyspec_left_curly_bracket */ "{|}",
+        /* keyspec_right_curly_bracket */ "}|{",
+        /* keyspec_less_than */ "<|>",
+        /* keyspec_greater_than */ ">|<",
+        /* keyspec_less_than_equal */ "\u2264|\u2265",
+        /* keyspec_greater_than_equal */ "\u2265|\u2264",
+        /* keyspec_left_double_angle_quote */ "\u00AB|\u00BB",
+        /* keyspec_right_double_angle_quote */ "\u00BB|\u00AB",
+        /* keyspec_left_single_angle_quote */ "\u2039|\u203A",
+        /* keyspec_right_single_angle_quote */ "\u203A|\u2039",
+        /* keylabel_for_tablet_comma ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_tablet_punctuation */
+        // U+00B1: "±" PLUS-MINUS SIGN
+        // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
+        /* more_keys_for_plus */ "\u00B1,\uFB29",
     };
 
     /* Language ka_GE: Georgian (Georgia) */
     private static final String[] LANGUAGE_ka_GE = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null,
+        /* ~ more_keys_for_i */
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        /* more_keys_for_c ~ */
+        null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+10D0: "ა" GEORGIAN LETTER AN
         // U+10D1: "ბ" GEORGIAN LETTER BAN
         // U+10D2: "გ" GEORGIAN LETTER GAN
-        /* 51 */ "\u10D0\u10D1\u10D2",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
+        /* label_to_alpha_key */ "\u10D0\u10D1\u10D2",
     };
 
     /* Language kk: Kazakh */
     private static final String[] LANGUAGE_kk = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* more_keys_for_a ~ */
         null, null, null, null, null, null, null, null, null, null,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 26 */ "\u044A",
-        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
-        // U+04B1: "ұ" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
-        /* 30 */ "\u04AF,\u04B1",
-        // U+049B: "қ" CYRILLIC SMALL LETTER KA WITH DESCENDER
-        /* 31 */ "\u049B",
-        // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
-        /* 32 */ "\u04A3",
-        // U+0493: "ғ" CYRILLIC SMALL LETTER GHE WITH STROKE
-        /* 33 */ "\u0493",
-        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-        /* 34 */ "\u0456",
-        // U+04D9: "ә" CYRILLIC SMALL LETTER SCHWA
-        /* 35 */ "\u04D9",
-        // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
-        /* 36 */ "\u04E9",
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        // U+04BB: "һ" CYRILLIC SMALL LETTER SHHA
-        /* 38 */ "\u04BB",
-        /* 39~ */
-        null, null, null, null,
-        /* ~42 */
-        // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
+        /* label_to_alpha_key */ "\u0410\u0411\u0412",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ keylabel_for_nordic_row2_11 */
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* more_keys_for_cyrillic_ie */ "\u0451",
+        /* more_keys_for_nordic_row2_10 */ null,
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* keylabel_for_east_slavic_row1_9 */ "\u0449",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* keylabel_for_east_slavic_row1_12 */ "\u044A",
+        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
+        /* keylabel_for_east_slavic_row2_1 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* keylabel_for_east_slavic_row2_11 */ "\u044D",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* keylabel_for_east_slavic_row3_5 */ "\u0438",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* more_keys_for_cyrillic_soft_sign */ "\u044A",
+        /* more_keys_for_punctuation ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_w */
+        // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
+        // U+04B1: "ұ" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+        /* more_keys_for_cyrillic_u */ "\u04AF,\u04B1",
+        // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
+        /* more_keys_for_cyrillic_en */ "\u04A3",
+        // U+0493: "ғ" CYRILLIC SMALL LETTER GHE WITH STROKE
+        /* more_keys_for_cyrillic_ghe */ "\u0493",
+        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        /* more_keys_for_east_slavic_row2_1 */ "\u0456",
+        // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
+        /* more_keys_for_cyrillic_o */ "\u04E9",
+        /* keylabel_for_south_slavic_row1_6 ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_j */
+        // U+049B: "қ" CYRILLIC SMALL LETTER KA WITH DESCENDER
+        /* more_keys_for_cyrillic_ka */ "\u049B",
+        // U+04D9: "ә" CYRILLIC SMALL LETTER SCHWA
+        /* more_keys_for_cyrillic_a */ "\u04D9",
+        // U+04BB: "һ" CYRILLIC SMALL LETTER SHHA
+        /* more_keys_for_east_slavic_row2_11 */ "\u04BB",
     };
 
     /* Language km_KH: Khmer (Cambodia) */
     private static final String[] LANGUAGE_km_KH = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+1780: "ក" KHMER LETTER KA
         // U+1781: "ខ" KHMER LETTER KHA
         // U+1782: "គ" KHMER LETTER KO
-        /* 51 */ "\u1780\u1781\u1782",
-        /* 52~ */
-        null, null, null, null,
-        /* ~55 */
+        /* label_to_alpha_key */ "\u1780\u1781\u1782",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_east_slavic_row2_11 */
         // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
-        /* 56 */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
+        /* more_keys_for_currency_dollar */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
     };
 
     /* Language ky: Kirghiz */
     private static final String[] LANGUAGE_ky = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* more_keys_for_a ~ */
         null, null, null, null, null, null, null, null, null, null,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 26 */ "\u044A",
-        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
-        /* 30 */ "\u04AF",
-        /* 31 */ null,
-        // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
-        /* 32 */ "\u04A3",
-        /* 33~ */
-        null, null, null,
-        /* ~35 */
-        // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
-        /* 36 */ "\u04E9",
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
-        null, null, null, null, null,
-        /* ~42 */
-        // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
+        /* label_to_alpha_key */ "\u0410\u0411\u0412",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ keylabel_for_nordic_row2_11 */
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* more_keys_for_cyrillic_ie */ "\u0451",
+        /* more_keys_for_nordic_row2_10 */ null,
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* keylabel_for_east_slavic_row1_9 */ "\u0449",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* keylabel_for_east_slavic_row1_12 */ "\u044A",
+        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
+        /* keylabel_for_east_slavic_row2_1 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* keylabel_for_east_slavic_row2_11 */ "\u044D",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* keylabel_for_east_slavic_row3_5 */ "\u0438",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* more_keys_for_cyrillic_soft_sign */ "\u044A",
+        /* more_keys_for_punctuation ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_w */
+        // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
+        /* more_keys_for_cyrillic_u */ "\u04AF",
+        // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
+        /* more_keys_for_cyrillic_en */ "\u04A3",
+        /* more_keys_for_cyrillic_ghe */ null,
+        /* more_keys_for_east_slavic_row2_1 */ null,
+        // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
+        /* more_keys_for_cyrillic_o */ "\u04E9",
     };
 
     /* Language lo_LA: Lao (Laos) */
     private static final String[] LANGUAGE_lo_LA = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0E81: "ກ" LAO LETTER KO
         // U+0E82: "ຂ" LAO LETTER KHO SUNG
         // U+0E84: "ຄ" LAO LETTER KHO TAM
-        /* 51 */ "\u0E81\u0E82\u0E84",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
+        /* label_to_alpha_key */ "\u0E81\u0E82\u0E84",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ double_angle_quotes */
         // U+20AD: "₭" KIP SIGN
-        /* 57 */ "\u20AD",
+        /* keylabel_for_currency */ "\u20AD",
     };
 
     /* Language lt: Lithuanian */
@@ -2126,24 +2216,7 @@
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 0 */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6",
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B",
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
+        /* more_keys_for_a */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
@@ -2152,7 +2225,7 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
+        /* more_keys_for_o */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
@@ -2162,54 +2235,70 @@
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
+        /* more_keys_for_u */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        /* more_keys_for_e */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B",
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* more_keys_for_i */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* more_keys_for_c */ "\u010D,\u00E7,\u0107",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F",
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
+        /* more_keys_for_n */ "\u0146,\u00F1,\u0144,\u0144",
+        /* label_to_alpha_key */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
+        /* more_keys_for_y */ "\u00FD,\u00FF",
         // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        /* 10 */ "\u0157,\u0159,\u0155",
-        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0163,\u0165",
+        /* more_keys_for_d */ "\u010F",
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
+        /* more_keys_for_z */ "\u017E,\u017C,\u017A",
+        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        /* more_keys_for_t */ "\u0163,\u0165",
         // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
         // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
         // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
+        /* more_keys_for_l */ "\u013C,\u0142,\u013A,\u013E",
         // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
+        /* more_keys_for_g */ "\u0123,\u011F",
+        /* single_angle_quotes ~ */
+        null, null, null,
+        /* ~ keylabel_for_currency */
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        /* more_keys_for_r */ "\u0157,\u0159,\u0155",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        /* more_keys_for_k */ "\u0137",
     };
 
     /* Language lv: Latvian */
@@ -2223,24 +2312,7 @@
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        /* 0 */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105",
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
+        /* more_keys_for_a */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105",
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
@@ -2249,7 +2321,7 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8",
+        /* more_keys_for_o */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8",
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
@@ -2258,105 +2330,125 @@
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171",
+        /* more_keys_for_u */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171",
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        /* more_keys_for_e */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* more_keys_for_i */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* more_keys_for_c */ "\u010D,\u00E7,\u0107",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F",
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
+        /* more_keys_for_n */ "\u0146,\u00F1,\u0144,\u0144",
+        /* label_to_alpha_key */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
+        /* more_keys_for_y */ "\u00FD,\u00FF",
         // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        /* 10 */ "\u0157,\u0159,\u0155",
-        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0163,\u0165",
+        /* more_keys_for_d */ "\u010F",
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
+        /* more_keys_for_z */ "\u017E,\u017C,\u017A",
+        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        /* more_keys_for_t */ "\u0163,\u0165",
         // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
         // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
         // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
+        /* more_keys_for_l */ "\u013C,\u0142,\u013A,\u013E",
         // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
+        /* more_keys_for_g */ "\u0123,\u011F",
+        /* single_angle_quotes ~ */
+        null, null, null,
+        /* ~ keylabel_for_currency */
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        /* more_keys_for_r */ "\u0157,\u0159,\u0155",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        /* more_keys_for_k */ "\u0137",
     };
 
     /* Language mk: Macedonian */
     private static final String[] LANGUAGE_mk = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~38 */
-        // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
-        /* 39 */ "\u0455",
-        // U+045C: "ќ" CYRILLIC SMALL LETTER KJE
-        /* 40 */ "\u045C",
-        // U+0437: "з" CYRILLIC SMALL LETTER ZE
-        /* 41 */ "\u0437",
-        // U+0453: "ѓ" CYRILLIC SMALL LETTER GJE
-        /* 42 */ "\u0453",
-        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
-        /* 43 */ "\u0450",
-        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
-        /* 44 */ "\u045D",
-        /* 45~ */
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null,
+        /* ~ more_keys_for_i */
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        /* more_keys_for_c ~ */
+        null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
+        /* label_to_alpha_key */ "\u0410\u0411\u0412",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ keylabel_for_nordic_row2_11 */
+        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
+        /* more_keys_for_cyrillic_ie */ "\u0450",
+        /* more_keys_for_nordic_row2_10 ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_cyrillic_o */
+        // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
+        /* keylabel_for_south_slavic_row1_6 */ "\u0455",
+        // U+045C: "ќ" CYRILLIC SMALL LETTER KJE
+        /* keylabel_for_south_slavic_row2_11 */ "\u045C",
+        // U+0437: "з" CYRILLIC SMALL LETTER ZE
+        /* keylabel_for_south_slavic_row3_1 */ "\u0437",
+        // U+0453: "ѓ" CYRILLIC SMALL LETTER GJE
+        /* keylabel_for_south_slavic_row3_8 */ "\u0453",
+        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
+        /* more_keys_for_cyrillic_i */ "\u045D",
     };
 
     /* Language mn_MN: Mongolian (Mongolia) */
     private static final String[] LANGUAGE_mn_MN = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
+        /* label_to_alpha_key */ "\u0410\u0411\u0412",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ double_angle_quotes */
         // U+20AE: "₮" TUGRIK SIGN
-        /* 57 */ "\u20AE",
+        /* keylabel_for_currency */ "\u20AE",
     };
 
     /* Language nb: Norwegian Bokmål */
@@ -2367,16 +2459,7 @@
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        /* 2 */ null,
+        /* more_keys_for_a */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101",
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
@@ -2384,90 +2467,96 @@
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D",
+        /* more_keys_for_o */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D",
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
-        /* 5~ */
+        /* more_keys_for_u */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        /* more_keys_for_i */ null,
+        /* double_quotes */ "!text/double_9qm_rqm",
+        /* single_quotes */ "!text/single_9qm_rqm",
+        /* more_keys_for_c ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~19 */
+        /* ~ more_keys_for_k */
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
+        /* keylabel_for_nordic_row1_11 */ "\u00E5",
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 21 */ "\u00F8",
+        /* keylabel_for_nordic_row2_10 */ "\u00F8",
         // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 22 */ "\u00E6",
+        /* keylabel_for_nordic_row2_11 */ "\u00E6",
+        /* more_keys_for_cyrillic_ie */ null,
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 23 */ "\u00F6",
+        /* more_keys_for_nordic_row2_10 */ "\u00F6",
+        /* keylabel_for_east_slavic_row1_9 ~ */
+        null, null, null, null, null, null, null,
+        /* ~ more_keys_for_punctuation */
         // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 24 */ "\u00E4",
-        /* 25~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
+        /* more_keys_for_nordic_row2_11 */ "\u00E4",
     };
 
     /* Language ne_NP: Nepali (Nepal) */
     private static final String[] LANGUAGE_ne_NP = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
-        /* 51 */ "\u0915\u0916\u0917",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
+        /* label_to_alpha_key */ "\u0915\u0916\u0917",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ double_angle_quotes */
         // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
-        /* 57 */ "\u0930\u0941.",
-        /* 58~ */
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~69 */
+        /* keylabel_for_currency */ "\u0930\u0941.",
+        /* more_keys_for_r ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_nordic_row2_11 */
         // U+0967: "१" DEVANAGARI DIGIT ONE
-        /* 70 */ "\u0967",
+        /* keylabel_for_symbols_1 */ "\u0967",
         // U+0968: "२" DEVANAGARI DIGIT TWO
-        /* 71 */ "\u0968",
+        /* keylabel_for_symbols_2 */ "\u0968",
         // U+0969: "३" DEVANAGARI DIGIT THREE
-        /* 72 */ "\u0969",
+        /* keylabel_for_symbols_3 */ "\u0969",
         // U+096A: "४" DEVANAGARI DIGIT FOUR
-        /* 73 */ "\u096A",
+        /* keylabel_for_symbols_4 */ "\u096A",
         // U+096B: "५" DEVANAGARI DIGIT FIVE
-        /* 74 */ "\u096B",
+        /* keylabel_for_symbols_5 */ "\u096B",
         // U+096C: "६" DEVANAGARI DIGIT SIX
-        /* 75 */ "\u096C",
+        /* keylabel_for_symbols_6 */ "\u096C",
         // U+096D: "७" DEVANAGARI DIGIT SEVEN
-        /* 76 */ "\u096D",
+        /* keylabel_for_symbols_7 */ "\u096D",
         // U+096E: "८" DEVANAGARI DIGIT EIGHT
-        /* 77 */ "\u096E",
+        /* keylabel_for_symbols_8 */ "\u096E",
         // U+096F: "९" DEVANAGARI DIGIT NINE
-        /* 78 */ "\u096F",
+        /* keylabel_for_symbols_9 */ "\u096F",
         // U+0966: "०" DEVANAGARI DIGIT ZERO
-        /* 79 */ "\u0966",
+        /* keylabel_for_symbols_0 */ "\u0966",
         // Label for "switch to symbols" key.
-        /* 80 */ "?\u0967\u0968\u0969",
+        /* label_to_symbol_key */ "?\u0967\u0968\u0969",
         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
         // part because it'll be appended by the code.
-        /* 81 */ "\u0967\u0968\u0969",
-        /* 82 */ "1",
-        /* 83 */ "2",
-        /* 84 */ "3",
-        /* 85 */ "4",
-        /* 86 */ "5",
-        /* 87 */ "6",
-        /* 88 */ "7",
-        /* 89 */ "8",
-        /* 90 */ "9",
-        /* 91 */ "0",
+        /* label_to_symbol_with_microphone_key */ "\u0967\u0968\u0969",
+        /* additional_more_keys_for_symbols_1 */ "1",
+        /* additional_more_keys_for_symbols_2 */ "2",
+        /* additional_more_keys_for_symbols_3 */ "3",
+        /* additional_more_keys_for_symbols_4 */ "4",
+        /* additional_more_keys_for_symbols_5 */ "5",
+        /* additional_more_keys_for_symbols_6 */ "6",
+        /* additional_more_keys_for_symbols_7 */ "7",
+        /* additional_more_keys_for_symbols_8 */ "8",
+        /* additional_more_keys_for_symbols_9 */ "9",
+        /* additional_more_keys_for_symbols_0 */ "0",
     };
 
     /* Language nl: Dutch */
@@ -2480,23 +2569,7 @@
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
+        /* more_keys_for_a */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
@@ -2505,27 +2578,39 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        /* more_keys_for_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
-        /* 5 */ null,
+        /* more_keys_for_u */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* more_keys_for_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
+        /* double_quotes */ "!text/double_9qm_rqm",
+        /* single_quotes */ "!text/single_9qm_rqm",
+        /* more_keys_for_c */ null,
+        /* more_keys_for_s */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7 */ null,
+        /* more_keys_for_n */ "\u00F1,\u0144",
+        /* label_to_alpha_key */ null,
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 8 */ "\u0133",
-        /* 9~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
+        /* more_keys_for_y */ "\u0133",
     };
 
     /* Language pl: Polish */
@@ -2539,16 +2624,7 @@
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
-        /* 2 */ null,
+        /* more_keys_for_a */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
@@ -2557,36 +2633,40 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        /* 4 */ null,
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u015B,\u00DF,\u0161",
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u0144,\u00F1",
+        /* more_keys_for_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        /* more_keys_for_u */ null,
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
+        /* more_keys_for_i */ null,
+        /* double_quotes */ "!text/double_9qm_rqm",
+        /* single_quotes */ "!text/single_9qm_rqm",
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u0107,\u00E7,\u010D",
-        /* 8~ */
-        null, null, null, null,
-        /* ~11 */
+        /* more_keys_for_c */ "\u0107,\u00E7,\u010D",
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* more_keys_for_s */ "\u015B,\u00DF,\u0161",
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* more_keys_for_n */ "\u0144,\u00F1",
+        /* label_to_alpha_key ~ */
+        null, null, null,
+        /* ~ more_keys_for_d */
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017C,\u017A,\u017E",
-        /* 13 */ null,
+        /* more_keys_for_z */ "\u017C,\u017A,\u017E",
+        /* more_keys_for_t */ null,
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u0142",
-        /* 15~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
+        /* more_keys_for_l */ "\u0142",
     };
 
     /* Language pt: Portuguese */
@@ -2599,22 +2679,7 @@
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        /* 1 */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
@@ -2624,26 +2689,39 @@
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA",
+        /* more_keys_for_o */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        /* 6 */ null,
+        /* more_keys_for_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        /* more_keys_for_e */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u00E7,\u010D,\u0107",
+        /* more_keys_for_c */ "\u00E7,\u010D,\u0107",
     };
 
     /* Language rm: Raeto-Romance */
     private static final String[] LANGUAGE_rm = {
-        /* 0~ */
-        null, null, null,
-        /* ~2 */
+        /* more_keys_for_a */ null,
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
@@ -2651,7 +2729,7 @@
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8",
+        /* more_keys_for_o */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8",
     };
 
     /* Language ro: Romanian */
@@ -2665,72 +2743,65 @@
         // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101",
-        /* 1 */ null,
+        /* more_keys_for_a */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101",
+        /* more_keys_for_o ~ */
+        null, null, null,
+        /* ~ more_keys_for_e */
         // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
         // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        /* 3 */ null,
-        /* 4 */ null,
+        /* more_keys_for_i */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* double_quotes */ "!text/double_9qm_rqm",
+        /* single_quotes */ "!text/single_9qm_rqm",
+        /* more_keys_for_c */ null,
         // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u0219,\u00DF,\u015B,\u0161",
-        /* 6~ */
+        /* more_keys_for_s */ "\u0219,\u00DF,\u015B,\u0161",
+        /* more_keys_for_n ~ */
         null, null, null, null, null,
-        /* ~10 */
+        /* ~ more_keys_for_z */
         // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW
-        /* 11 */ "\u021B",
-        /* 12~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
+        /* more_keys_for_t */ "\u021B",
     };
 
     /* Language ru: Russian */
     private static final String[] LANGUAGE_ru = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 26 */ "\u044A",
-        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        /* 30~ */
-        null, null, null, null, null, null, null,
-        /* ~36 */
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
+        /* more_keys_for_a ~ */
         null, null, null, null, null,
-        /* ~42 */
-        // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
+        /* ~ more_keys_for_i */
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        /* more_keys_for_c ~ */
+        null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
+        /* label_to_alpha_key */ "\u0410\u0411\u0412",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ keylabel_for_nordic_row2_11 */
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* more_keys_for_cyrillic_ie */ "\u0451",
+        /* more_keys_for_nordic_row2_10 */ null,
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* keylabel_for_east_slavic_row1_9 */ "\u0449",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* keylabel_for_east_slavic_row1_12 */ "\u044A",
+        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
+        /* keylabel_for_east_slavic_row2_1 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* keylabel_for_east_slavic_row2_11 */ "\u044D",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* keylabel_for_east_slavic_row3_5 */ "\u0438",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* more_keys_for_cyrillic_soft_sign */ "\u044A",
     };
 
     /* Language sk: Slovak */
@@ -2744,24 +2815,7 @@
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        /* 0 */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        /* 1 */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
+        /* more_keys_for_a */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
@@ -2770,7 +2824,7 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8",
+        /* more_keys_for_o */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
@@ -2779,95 +2833,131 @@
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171",
+        /* more_keys_for_u */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        /* more_keys_for_e */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* more_keys_for_i */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* more_keys_for_c */ "\u010D,\u00E7,\u0107",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F",
         // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0148,\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
+        /* more_keys_for_n */ "\u0148,\u0146,\u00F1,\u0144,\u0144",
+        /* label_to_alpha_key */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
+        /* more_keys_for_y */ "\u00FD,\u00FF",
         // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        /* 10 */ "\u0155,\u0159,\u0157",
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-        /* 11 */ "\u0165,\u0163",
+        /* more_keys_for_d */ "\u010F",
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
+        /* more_keys_for_z */ "\u017E,\u017C,\u017A",
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+        /* more_keys_for_t */ "\u0165,\u0163",
         // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
         // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
         // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u013E,\u013A,\u013C,\u0142",
+        /* more_keys_for_l */ "\u013E,\u013A,\u013C,\u0142",
         // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
+        /* more_keys_for_g */ "\u0123,\u011F",
+        /* single_angle_quotes */ "!text/single_raqm_laqm",
+        /* double_angle_quotes */ "!text/double_raqm_laqm",
+        /* keylabel_for_currency */ null,
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        /* more_keys_for_r */ "\u0155,\u0159,\u0157",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        /* more_keys_for_k */ "\u0137",
     };
 
     /* Language sl: Slovenian */
     private static final String[] LANGUAGE_sl = {
-        /* 0~ */
+        /* more_keys_for_a ~ */
         null, null, null, null, null,
-        /* ~4 */
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u0161",
-        /* 6 */ null,
+        /* ~ more_keys_for_i */
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u0107",
-        /* 8 */ null,
+        /* more_keys_for_c */ "\u010D,\u0107",
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* more_keys_for_s */ "\u0161",
+        /* more_keys_for_n ~ */
+        null, null, null,
+        /* ~ more_keys_for_y */
         // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u0111",
-        /* 10 */ null,
-        /* 11 */ null,
+        /* more_keys_for_d */ "\u0111",
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017E",
-        /* 13~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
+        /* more_keys_for_z */ "\u017E",
+        /* more_keys_for_t ~ */
+        null, null, null,
+        /* ~ more_keys_for_g */
+        /* single_angle_quotes */ "!text/single_raqm_laqm",
+        /* double_angle_quotes */ "!text/double_raqm_laqm",
     };
 
     /* Language sr: Serbian */
     private static final String[] LANGUAGE_sr = {
-        /* 0~ */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null,
+        /* ~ more_keys_for_i */
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        /* more_keys_for_c ~ */
+        null, null, null,
+        /* ~ more_keys_for_n */
+        // END: More keys definitions for Serbian (Cyrillic)
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* label_to_alpha_key */ "\u0410\u0411\u0412",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null,
+        /* ~ more_keys_for_g */
+        /* single_angle_quotes */ "!text/single_raqm_laqm",
+        /* double_angle_quotes */ "!text/double_raqm_laqm",
+        /* keylabel_for_currency ~ */
+        null, null, null, null, null, null,
+        /* ~ keylabel_for_nordic_row2_11 */
+        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
+        /* more_keys_for_cyrillic_ie */ "\u0450",
+        /* more_keys_for_nordic_row2_10 ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~38 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_cyrillic_o */
         // TODO: Move these to sr-Latn once we can handle IETF language tag with script name specified.
         // BEGIN: More keys definitions for Serbian (Latin)
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
@@ -2887,30 +2977,15 @@
         // END: More keys definitions for Serbian (Latin)
         // BEGIN: More keys definitions for Serbian (Cyrillic)
         // U+0437: "з" CYRILLIC SMALL LETTER ZE
-        /* 39 */ "\u0437",
+        /* keylabel_for_south_slavic_row1_6 */ "\u0437",
         // U+045B: "ћ" CYRILLIC SMALL LETTER TSHE
-        /* 40 */ "\u045B",
+        /* keylabel_for_south_slavic_row2_11 */ "\u045B",
         // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
-        /* 41 */ "\u0455",
+        /* keylabel_for_south_slavic_row3_1 */ "\u0455",
         // U+0452: "ђ" CYRILLIC SMALL LETTER DJE
-        /* 42 */ "\u0452",
-        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
-        /* 43 */ "\u0450",
+        /* keylabel_for_south_slavic_row3_8 */ "\u0452",
         // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
-        /* 44 */ "\u045D",
-        /* 45~ */
-        null, null, null, null, null, null,
-        /* ~50 */
-        // END: More keys definitions for Serbian (Cyrillic)
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
+        /* more_keys_for_cyrillic_i */ "\u045D",
     };
 
     /* Language sv: Swedish */
@@ -2920,82 +2995,84 @@
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
         // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u0105,\u00E3",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        /* 2 */ "\u00ED,\u00EC,\u00EE,\u00EF",
+        /* more_keys_for_a */ "\u00E1,\u00E0,\u00E2,\u0105,\u00E3",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F2,\u00F4,\u00F5,\u014D",
+        /* more_keys_for_o */ "\u00F3,\u00F2,\u00F4,\u00F5,\u014D",
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FA,\u00F9,\u00FB,\u016B",
+        /* more_keys_for_u */ "\u00FC,\u00FA,\u00F9,\u00FB,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        /* more_keys_for_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        /* more_keys_for_i */ "\u00ED,\u00EC,\u00EE,\u00EF",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* more_keys_for_c */ "\u00E7,\u0107,\u010D",
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u015B,\u0161,\u015F,\u00DF",
+        /* more_keys_for_s */ "\u015B,\u0161,\u015F,\u00DF",
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        /* 6 */ "\u0144,\u00F1,\u0148",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* more_keys_for_n */ "\u0144,\u00F1,\u0148",
+        /* label_to_alpha_key */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF,\u00FC",
+        /* more_keys_for_y */ "\u00FD,\u00FF,\u00FC",
         // U+00F0: "ð" LATIN SMALL LETTER ETH
         // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u00F0,\u010F",
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        /* 10 */ "\u0159",
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 11 */ "\u0165,\u00FE",
+        /* more_keys_for_d */ "\u00F0,\u010F",
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017A,\u017E,\u017C",
-        /* 13 */ null,
+        /* more_keys_for_z */ "\u017A,\u017E,\u017C",
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        /* more_keys_for_t */ "\u0165,\u00FE",
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u0142",
-        /* 15~ */
-        null, null, null, null, null,
-        /* ~19 */
+        /* more_keys_for_l */ "\u0142",
+        /* more_keys_for_g */ null,
+        /* single_angle_quotes */ "!text/single_raqm_laqm",
+        /* double_angle_quotes */ "!text/double_raqm_laqm",
+        /* keylabel_for_currency */ null,
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        /* more_keys_for_r */ "\u0159",
+        /* more_keys_for_k */ null,
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
+        /* keylabel_for_nordic_row1_11 */ "\u00E5",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 21 */ "\u00F6",
+        /* keylabel_for_nordic_row2_10 */ "\u00F6",
         // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 22 */ "\u00E4",
+        /* keylabel_for_nordic_row2_11 */ "\u00E4",
+        /* more_keys_for_cyrillic_ie */ null,
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+0153: "œ" LATIN SMALL LIGATURE OE
-        /* 23 */ "\u00F8,\u0153",
+        /* more_keys_for_nordic_row2_10 */ "\u00F8,\u0153",
+        /* keylabel_for_east_slavic_row1_9 ~ */
+        null, null, null, null, null, null, null,
+        /* ~ more_keys_for_punctuation */
         // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 24 */ "\u00E6",
-        /* 25~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~53 */
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
+        /* more_keys_for_nordic_row2_11 */ "\u00E6",
     };
 
     /* Language sw: Swahili */
@@ -3009,19 +3086,7 @@
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        /* more_keys_for_a */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
@@ -3030,43 +3095,54 @@
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
+        /* more_keys_for_o */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u00F1",
+        /* more_keys_for_u */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        /* more_keys_for_i */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u00E7",
-        /* 8~ */
-        null, null, null, null, null, null, null,
-        /* ~14 */
-        /* 15 */ "g\'",
+        /* more_keys_for_c */ "\u00E7",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* more_keys_for_s */ "\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* more_keys_for_n */ "\u00F1",
+        /* label_to_alpha_key ~ */
+        null, null, null, null, null, null,
+        /* ~ more_keys_for_l */
+        /* more_keys_for_g */ "g\'",
     };
 
     /* Language th: Thai */
     private static final String[] LANGUAGE_th = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0E01: "ก" THAI CHARACTER KO KAI
         // U+0E02: "ข" THAI CHARACTER KHO KHAI
         // U+0E04: "ค" THAI CHARACTER KHO KHWAI
-        /* 51 */ "\u0E01\u0E02\u0E04",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
+        /* label_to_alpha_key */ "\u0E01\u0E02\u0E04",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ double_angle_quotes */
         // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
-        /* 57 */ "\u0E3F",
+        /* keylabel_for_currency */ "\u0E3F",
     };
 
     /* Language tl: Tagalog */
@@ -3081,22 +3157,7 @@
         // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
         // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
@@ -3106,36 +3167,44 @@
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
+        /* more_keys_for_o */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
+        /* more_keys_for_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* more_keys_for_c */ "\u00E7,\u0107,\u010D",
+        /* more_keys_for_s */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* more_keys_for_n */ "\u00F1,\u0144",
     };
 
     /* Language tr: Turkish */
     private static final String[] LANGUAGE_tr = {
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        /* 0 */ "\u00E2",
-        /* 1 */ null,
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* more_keys_for_a */ "\u00E2",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+0153: "œ" LATIN SMALL LIGATURE OE
@@ -3144,72 +3213,85 @@
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
+        /* more_keys_for_o */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        /* more_keys_for_u */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        /* more_keys_for_e */ null,
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* more_keys_for_i */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* more_keys_for_c */ "\u00E7,\u0107,\u010D",
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
-        /* 6 */ null,
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
+        /* more_keys_for_s */ "\u015F,\u00DF,\u015B,\u0161",
+        /* more_keys_for_n ~ */
         null, null, null, null, null, null, null,
-        /* ~14 */
+        /* ~ more_keys_for_l */
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u011F",
+        /* more_keys_for_g */ "\u011F",
     };
 
     /* Language uk: Ukrainian */
     private static final String[] LANGUAGE_uk = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+0457: "ї" CYRILLIC SMALL LETTER YI
-        /* 26 */ "\u0457",
-        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-        /* 27 */ "\u0456",
-        // U+0454: "є" CYRILLIC SMALL LETTER UKRAINIAN IE
-        /* 28 */ "\u0454",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        /* 30~ */
+        /* more_keys_for_a ~ */
+        null, null, null, null, null,
+        /* ~ more_keys_for_i */
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* single_quotes */ "!text/single_9qm_lqm",
+        /* more_keys_for_c ~ */
         null, null, null,
-        /* ~32 */
-        // U+0491: "ґ" CYRILLIC SMALL LETTER GHE WITH UPTURN
-        /* 33 */ "\u0491",
-        // U+0457: "ї" CYRILLIC SMALL LETTER YI
-        /* 34 */ "\u0457",
-        /* 35 */ null,
-        /* 36 */ null,
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~50 */
+        /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54~ */
-        null, null, null,
-        /* ~56 */
+        /* label_to_alpha_key */ "\u0410\u0411\u0412",
+        /* more_keys_for_y ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ double_angle_quotes */
         // U+20B4: "₴" HRYVNIA SIGN
-        /* 57 */ "\u20B4",
+        /* keylabel_for_currency */ "\u20B4",
+        /* more_keys_for_r ~ */
+        null, null, null, null, null, null, null,
+        /* ~ more_keys_for_nordic_row2_10 */
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* keylabel_for_east_slavic_row1_9 */ "\u0449",
+        // U+0457: "ї" CYRILLIC SMALL LETTER YI
+        /* keylabel_for_east_slavic_row1_12 */ "\u0457",
+        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        /* keylabel_for_east_slavic_row2_1 */ "\u0456",
+        // U+0454: "є" CYRILLIC SMALL LETTER UKRAINIAN IE
+        /* keylabel_for_east_slavic_row2_11 */ "\u0454",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* keylabel_for_east_slavic_row3_5 */ "\u0438",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* more_keys_for_cyrillic_soft_sign */ "\u044A",
+        /* more_keys_for_punctuation ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null,
+        /* ~ more_keys_for_cyrillic_en */
+        // U+0491: "ґ" CYRILLIC SMALL LETTER GHE WITH UPTURN
+        /* more_keys_for_cyrillic_ghe */ "\u0491",
+        // U+0457: "ї" CYRILLIC SMALL LETTER YI
+        /* more_keys_for_east_slavic_row2_1 */ "\u0457",
     };
 
     /* Language vi: Vietnamese */
@@ -3231,25 +3313,7 @@
         // U+1EA9: "ẩ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
         // U+1EAB: "ẫ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
         // U+1EAD: "ậ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
-        /* 0 */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+1EBB: "ẻ" LATIN SMALL LETTER E WITH HOOK ABOVE
-        // U+1EBD: "ẽ" LATIN SMALL LETTER E WITH TILDE
-        // U+1EB9: "ẹ" LATIN SMALL LETTER E WITH DOT BELOW
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+1EC1: "ề" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
-        // U+1EBF: "ế" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
-        // U+1EC3: "ể" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
-        // U+1EC5: "ễ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
-        // U+1EC7: "ệ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
-        /* 1 */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7",
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+1EC9: "ỉ" LATIN SMALL LETTER I WITH HOOK ABOVE
-        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
-        // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW
-        /* 2 */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
+        /* more_keys_for_a */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD",
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+1ECF: "ỏ" LATIN SMALL LETTER O WITH HOOK ABOVE
@@ -3267,7 +3331,7 @@
         // U+1EDF: "ở" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
         // U+1EE1: "ỡ" LATIN SMALL LETTER O WITH HORN AND TILDE
         // U+1EE3: "ợ" LATIN SMALL LETTER O WITH HORN AND DOT BELOW
-        /* 3 */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3",
+        /* more_keys_for_o */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3",
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+1EE7: "ủ" LATIN SMALL LETTER U WITH HOOK ABOVE
@@ -3279,26 +3343,41 @@
         // U+1EED: "ử" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
         // U+1EEF: "ữ" LATIN SMALL LETTER U WITH HORN AND TILDE
         // U+1EF1: "ự" LATIN SMALL LETTER U WITH HORN AND DOT BELOW
-        /* 4 */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1",
-        /* 5~ */
-        null, null, null,
-        /* ~7 */
+        /* more_keys_for_u */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+1EBB: "ẻ" LATIN SMALL LETTER E WITH HOOK ABOVE
+        // U+1EBD: "ẽ" LATIN SMALL LETTER E WITH TILDE
+        // U+1EB9: "ẹ" LATIN SMALL LETTER E WITH DOT BELOW
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+1EC1: "ề" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+        // U+1EBF: "ế" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+        // U+1EC3: "ể" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+        // U+1EC5: "ễ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+        // U+1EC7: "ệ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+        /* more_keys_for_e */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7",
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+1EC9: "ỉ" LATIN SMALL LETTER I WITH HOOK ABOVE
+        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
+        // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW
+        /* more_keys_for_i */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
+        /* double_quotes ~ */
+        null, null, null, null, null, null,
+        /* ~ label_to_alpha_key */
         // U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+1EF7: "ỷ" LATIN SMALL LETTER Y WITH HOOK ABOVE
         // U+1EF9: "ỹ" LATIN SMALL LETTER Y WITH TILDE
         // U+1EF5: "ỵ" LATIN SMALL LETTER Y WITH DOT BELOW
-        /* 8 */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5",
+        /* more_keys_for_y */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5",
         // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u0111",
-        /* 10~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null,
-        /* ~56 */
+        /* more_keys_for_d */ "\u0111",
+        /* more_keys_for_z ~ */
+        null, null, null, null, null, null,
+        /* ~ double_angle_quotes */
         // U+20AB: "₫" DONG SIGN
-        /* 57 */ "\u20AB",
+        /* keylabel_for_currency */ "\u20AB",
     };
 
     /* Language zu: Zulu */
@@ -3312,19 +3391,7 @@
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        /* more_keys_for_a */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
@@ -3333,19 +3400,33 @@
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
+        /* more_keys_for_o */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u00F1",
+        /* more_keys_for_u */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* more_keys_for_e */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        /* more_keys_for_i */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u00E7",
+        /* more_keys_for_c */ "\u00E7",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* more_keys_for_s */ "\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* more_keys_for_n */ "\u00F1",
     };
 
     /* Language zz: Alphabet */
@@ -3361,28 +3442,7 @@
         // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
         // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
         // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        // U+0115: "ĕ" LATIN SMALL LETTER E WITH BREVE
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B",
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+012D: "ĭ" LATIN SMALL LETTER I WITH BREVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
+        /* more_keys_for_a */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
@@ -3394,7 +3454,7 @@
         // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA",
+        /* more_keys_for_o */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA",
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
@@ -3405,130 +3465,167 @@
         // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
         // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
+        /* more_keys_for_u */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        // U+0115: "ĕ" LATIN SMALL LETTER E WITH BREVE
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        /* more_keys_for_e */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B",
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+012D: "ĭ" LATIN SMALL LETTER I WITH BREVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* more_keys_for_i */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
+        // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* more_keys_for_c */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+017F: "ſ" LATIN SMALL LETTER LONG S
-        /* 5 */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F",
+        /* more_keys_for_s */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
         // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
         // U+014B: "ŋ" LATIN SMALL LETTER ENG
-        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
-        // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
+        /* more_keys_for_n */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
+        /* label_to_alpha_key */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 8 */ "\u00FD,\u0177,\u00FF,\u0133",
+        /* more_keys_for_y */ "\u00FD,\u0177,\u00FF,\u0133",
         // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
         // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
         // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 9 */ "\u010F,\u0111,\u00F0",
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        /* 10 */ "\u0155,\u0157,\u0159",
+        /* more_keys_for_d */ "\u010F,\u0111,\u00F0",
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* more_keys_for_z */ "\u017A,\u017C,\u017E",
         // U+00FE: "þ" LATIN SMALL LETTER THORN
         // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
         // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
         // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
-        /* 11 */ "\u00FE,\u0163,\u0165,\u0167",
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017A,\u017C,\u017E",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        // U+0138: "ĸ" LATIN SMALL LETTER KRA
-        /* 13 */ "\u0137,\u0138",
+        /* more_keys_for_t */ "\u00FE,\u0163,\u0165,\u0167",
         // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
         // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
         // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
         // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
+        /* more_keys_for_l */ "\u013A,\u013C,\u013E,\u0140,\u0142",
         // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
         // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE
         // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
-        /* 15 */ "\u011D,\u011F,\u0121,\u0123",
-        /* 16 */ null,
+        /* more_keys_for_g */ "\u011D,\u011F,\u0121,\u0123",
+        /* single_angle_quotes ~ */
+        null, null, null,
+        /* ~ keylabel_for_currency */
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        /* more_keys_for_r */ "\u0155,\u0157,\u0159",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        // U+0138: "ĸ" LATIN SMALL LETTER KRA
+        /* more_keys_for_k */ "\u0137,\u0138",
+        /* keylabel_for_nordic_row1_11 ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null,
+        /* ~ more_keys_for_question */
         // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
-        /* 17 */ "\u0125",
-        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
-        /* 18 */ "\u0135",
+        /* more_keys_for_h */ "\u0125",
         // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
-        /* 19 */ "\u0175",
+        /* more_keys_for_w */ "\u0175",
+        /* more_keys_for_cyrillic_u ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null,
+        /* ~ more_keys_for_v */
+        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
+        /* more_keys_for_j */ "\u0135",
     };
 
     // TODO: Use the language + "_" + region representation for the locale string key.
     // Currently we are dropping the region from the key.
     private static final Object[] LANGUAGES_AND_TEXTS = {
     // "locale", TEXT_ARRAY,  /* numberOfNonNullText/lengthOf_TEXT_ARRAY localeName */
-        "DEFAULT", LANGUAGE_DEFAULT, /* 156/156 default */
-        "af", LANGUAGE_af,    /*   8/  9 Afrikaans */
-        "ar", LANGUAGE_ar,    /*  48/120 Arabic */
-        "az", LANGUAGE_az_AZ, /*   8/ 16 Azerbaijani (Azerbaijan) */
-        "be", LANGUAGE_be_BY, /*  10/ 54 Belarusian (Belarus) */
-        "bg", LANGUAGE_bg,    /*   2/ 54 Bulgarian */
-        "ca", LANGUAGE_ca,    /*  11/ 62 Catalan */
-        "cs", LANGUAGE_cs,    /*  17/ 56 Czech */
-        "da", LANGUAGE_da,    /*  19/ 56 Danish */
-        "de", LANGUAGE_de,    /*  16/ 56 German */
-        "el", LANGUAGE_el,    /*   1/ 52 Greek */
-        "en", LANGUAGE_en,    /*   8/  8 English */
-        "eo", LANGUAGE_eo,    /*  26/126 Esperanto */
-        "es", LANGUAGE_es,    /*   8/ 60 Spanish */
-        "et", LANGUAGE_et_EE, /*  22/ 54 Estonian (Estonia) */
-        "fa", LANGUAGE_fa,    /*  49/120 Persian */
-        "fi", LANGUAGE_fi,    /*  10/ 25 Finnish */
-        "fr", LANGUAGE_fr,    /*  13/ 51 French */
-        "hi", LANGUAGE_hi,    /*  24/ 92 Hindi */
-        "hr", LANGUAGE_hr,    /*   9/ 56 Croatian */
-        "hu", LANGUAGE_hu,    /*   9/ 56 Hungarian */
-        "hy", LANGUAGE_hy_AM, /*   7/118 Armenian (Armenia) */
-        "is", LANGUAGE_is,    /*  13/ 54 Icelandic */
+        "DEFAULT", LANGUAGE_DEFAULT, /* 172/172 default */
+        "af", LANGUAGE_af,    /*   8/ 12 Afrikaans */
+        "ar", LANGUAGE_ar,    /*  58/110 Arabic */
+        "az", LANGUAGE_az_AZ, /*   8/ 17 Azerbaijani (Azerbaijan) */
+        "be", LANGUAGE_be_BY, /*  10/ 33 Belarusian (Belarus) */
+        "bg", LANGUAGE_bg,    /*   2/ 11 Bulgarian */
+        "ca", LANGUAGE_ca,    /*  11/117 Catalan */
+        "cs", LANGUAGE_cs,    /*  17/ 21 Czech */
+        "da", LANGUAGE_da,    /*  19/ 35 Danish */
+        "de", LANGUAGE_de,    /*  16/ 93 German */
+        "el", LANGUAGE_el,    /*   1/ 11 Greek */
+        "en", LANGUAGE_en,    /*   8/ 10 English */
+        "eo", LANGUAGE_eo,    /*  26/129 Esperanto */
+        "es", LANGUAGE_es,    /*   8/ 34 Spanish */
+        "et", LANGUAGE_et_EE, /*  22/ 27 Estonian (Estonia) */
+        "fa", LANGUAGE_fa,    /*  61/120 Persian */
+        "fi", LANGUAGE_fi,    /*  10/ 35 Finnish */
+        "fr", LANGUAGE_fr,    /*  13/ 93 French */
+        "hi", LANGUAGE_hi,    /*  24/ 57 Hindi */
+        "hr", LANGUAGE_hr,    /*   9/ 19 Croatian */
+        "hu", LANGUAGE_hu,    /*   9/ 19 Hungarian */
+        "hy", LANGUAGE_hy_AM, /*   8/123 Armenian (Armenia) */
+        "is", LANGUAGE_is,    /*  13/ 25 Icelandic */
         "it", LANGUAGE_it,    /*   5/  5 Italian */
-        "iw", LANGUAGE_iw,    /*  14/ 69 Hebrew */
-        "ka", LANGUAGE_ka_GE, /*   3/ 54 Georgian (Georgia) */
-        "kk", LANGUAGE_kk,    /*  16/ 52 Kazakh */
-        "km", LANGUAGE_km_KH, /*   2/ 57 Khmer (Cambodia) */
-        "ky", LANGUAGE_ky,    /*  11/ 52 Kirghiz */
-        "lo", LANGUAGE_lo_LA, /*   2/ 58 Lao (Laos) */
-        "lt", LANGUAGE_lt,    /*  18/ 54 Lithuanian */
-        "lv", LANGUAGE_lv,    /*  18/ 54 Latvian */
-        "mk", LANGUAGE_mk,    /*   9/ 54 Macedonian */
-        "mn", LANGUAGE_mn_MN, /*   2/ 58 Mongolian (Mongolia) */
-        "nb", LANGUAGE_nb,    /*  11/ 54 Norwegian Bokmål */
-        "ne", LANGUAGE_ne_NP, /*  24/ 92 Nepali (Nepal) */
-        "nl", LANGUAGE_nl,    /*   9/ 54 Dutch */
-        "pl", LANGUAGE_pl,    /*  10/ 54 Polish */
+        "iw", LANGUAGE_iw,    /*  20/118 Hebrew */
+        "ka", LANGUAGE_ka_GE, /*   3/ 11 Georgian (Georgia) */
+        "kk", LANGUAGE_kk,    /*  16/115 Kazakh */
+        "km", LANGUAGE_km_KH, /*   2/116 Khmer (Cambodia) */
+        "ky", LANGUAGE_ky,    /*  11/ 82 Kirghiz */
+        "lo", LANGUAGE_lo_LA, /*   2/ 20 Lao (Laos) */
+        "lt", LANGUAGE_lt,    /*  18/ 22 Lithuanian */
+        "lv", LANGUAGE_lv,    /*  18/ 22 Latvian */
+        "mk", LANGUAGE_mk,    /*   9/ 87 Macedonian */
+        "mn", LANGUAGE_mn_MN, /*   2/ 20 Mongolian (Mongolia) */
+        "nb", LANGUAGE_nb,    /*  11/ 35 Norwegian Bokmål */
+        "ne", LANGUAGE_ne_NP, /*  24/ 57 Nepali (Nepal) */
+        "nl", LANGUAGE_nl,    /*   9/ 12 Dutch */
+        "pl", LANGUAGE_pl,    /*  10/ 16 Polish */
         "pt", LANGUAGE_pt,    /*   6/  8 Portuguese */
-        "rm", LANGUAGE_rm,    /*   1/  4 Raeto-Romance */
-        "ro", LANGUAGE_ro,    /*   6/ 54 Romanian */
-        "ru", LANGUAGE_ru,    /*  10/ 54 Russian */
-        "sk", LANGUAGE_sk,    /*  20/ 56 Slovak */
-        "sl", LANGUAGE_sl,    /*   8/ 56 Slovenian */
-        "sr", LANGUAGE_sr,    /*  11/ 56 Serbian */
-        "sv", LANGUAGE_sv,    /*  21/ 56 Swedish */
-        "sw", LANGUAGE_sw,    /*   9/ 16 Swahili */
-        "th", LANGUAGE_th,    /*   2/ 58 Thai */
-        "tl", LANGUAGE_tl,    /*   7/  8 Tagalog */
-        "tr", LANGUAGE_tr,    /*   7/ 16 Turkish */
-        "uk", LANGUAGE_uk,    /*  12/ 58 Ukrainian */
-        "vi", LANGUAGE_vi,    /*   8/ 58 Vietnamese */
-        "zu", LANGUAGE_zu,    /*   8/  8 Zulu */
-        "zz", LANGUAGE_zz,    /*  19/ 20 Alphabet */
+        "rm", LANGUAGE_rm,    /*   1/  2 Raeto-Romance */
+        "ro", LANGUAGE_ro,    /*   6/ 15 Romanian */
+        "ru", LANGUAGE_ru,    /*  10/ 33 Russian */
+        "sk", LANGUAGE_sk,    /*  20/ 22 Slovak */
+        "sl", LANGUAGE_sl,    /*   8/ 19 Slovenian */
+        "sr", LANGUAGE_sr,    /*  11/ 87 Serbian */
+        "sv", LANGUAGE_sv,    /*  21/ 35 Swedish */
+        "sw", LANGUAGE_sw,    /*   9/ 17 Swahili */
+        "th", LANGUAGE_th,    /*   2/ 20 Thai */
+        "tl", LANGUAGE_tl,    /*   7/ 10 Tagalog */
+        "tr", LANGUAGE_tr,    /*   7/ 17 Turkish */
+        "uk", LANGUAGE_uk,    /*  12/ 81 Ukrainian */
+        "vi", LANGUAGE_vi,    /*   8/ 20 Vietnamese */
+        "zu", LANGUAGE_zu,    /*   8/ 10 Zulu */
+        "zz", LANGUAGE_zz,    /*  19/112 Alphabet */
     };
 
     static {
diff --git a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
index 319bf89..56ef476 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
@@ -46,15 +46,14 @@
     public final String mOutputText;
     public final int mIconId;
 
-    public MoreKeySpec(final String moreKeySpec, boolean needsToUpperCase, final Locale locale,
-            final KeyboardCodesSet codesSet) {
+    public MoreKeySpec(final String moreKeySpec, boolean needsToUpperCase, final Locale locale) {
         if (TextUtils.isEmpty(moreKeySpec)) {
             throw new KeySpecParser.KeySpecParserError("Empty more key spec");
         }
         mLabel = StringUtils.toUpperCaseOfStringForLocale(
                 KeySpecParser.getLabel(moreKeySpec), needsToUpperCase, locale);
         final int code = StringUtils.toUpperCaseOfCodeForLocale(
-                KeySpecParser.getCode(moreKeySpec, codesSet), needsToUpperCase, locale);
+                KeySpecParser.getCode(moreKeySpec), needsToUpperCase, locale);
         if (code == Constants.CODE_UNSPECIFIED) {
             // Some letter, for example German Eszett (U+00DF: "ß"), has multiple characters
             // upper case representation ("SS").
diff --git a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
index a787ef1..d626ff9 100644
--- a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
@@ -29,7 +29,6 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.latin.personalization.AccountUtils;
 import com.android.inputmethod.latin.utils.StringUtils;
 
@@ -73,8 +72,13 @@
     private final boolean mUseFirstLastBigrams;
 
     public ContactsBinaryDictionary(final Context context, final Locale locale) {
-        super(context, getDictNameWithLocale(NAME, locale), locale,
-                Dictionary.TYPE_CONTACTS, false /* isUpdatable */);
+        this(context, locale, null /* dictFile */);
+    }
+
+    public ContactsBinaryDictionary(final Context context, final Locale locale,
+            final File dictFile) {
+        super(context, getDictName(NAME, locale, dictFile), locale, Dictionary.TYPE_CONTACTS,
+                false /* isUpdatable */, dictFile);
         mLocale = locale;
         mUseFirstLastBigrams = useFirstLastBigramsForLocale(locale);
         registerObserver(context);
@@ -84,12 +88,6 @@
         loadDictionary();
     }
 
-    // Dummy constructor for tests.
-    @UsedForTesting
-    public ContactsBinaryDictionary(final Context context, final Locale locale, final File file) {
-        this(context, locale);
-    }
-
     private synchronized void registerObserver(final Context context) {
         // Perform a managed query. The Activity will handle closing and requerying the cursor
         // when needed.
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index c2451ce..3b9be43 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -122,7 +122,7 @@
             new DictionaryUpdateController();
 
     /* A extension for a binary dictionary file. */
-    public static final String DICT_FILE_EXTENSION = ".dict";
+    protected static final String DICT_FILE_EXTENSION = ".dict";
 
     private final AtomicReference<Runnable> mUnfinishedFlushingTask =
             new AtomicReference<Runnable>();
@@ -148,10 +148,6 @@
         return mBinaryDictionary.isValidDictionary();
     }
 
-    private File getDictFile() {
-        return mDictFile;
-    }
-
     /**
      * Gets the dictionary update controller for the given dictionary name.
      */
@@ -213,15 +209,10 @@
      * @param dictType the dictionary type, as a human-readable string
      * @param isUpdatable whether to support dynamically updating the dictionary. Please note that
      *        dynamic dictionary has negative effects on memory space and computation time.
+     * @param dictFile dictionary file path. if null, use default dictionary path based on
+     *        dictionary type.
      */
     public ExpandableBinaryDictionary(final Context context, final String dictName,
-            final Locale locale, final String dictType, final boolean isUpdatable) {
-        this(context, dictName, locale, dictType, isUpdatable,
-                new File(context.getFilesDir(), dictName + DICT_FILE_EXTENSION));
-    }
-
-    // Creates an instance that uses a given dictionary file.
-    public ExpandableBinaryDictionary(final Context context, final String dictName,
             final Locale locale, final String dictType, final boolean isUpdatable,
             final File dictFile) {
         super(dictType);
@@ -229,15 +220,22 @@
         mContext = context;
         mLocale = locale;
         mIsUpdatable = isUpdatable;
-        mDictFile = dictFile;
+        mDictFile = getDictFile(context, dictName, dictFile);
         mBinaryDictionary = null;
         mDictNameDictionaryUpdateController = getDictionaryUpdateController(dictName);
         // Currently, only dynamic personalization dictionary is updatable.
         mDictionaryWriter = getDictionaryWriter(isUpdatable);
     }
 
-    protected static String getDictNameWithLocale(final String name, final Locale locale) {
-        return name + "." + locale.toString();
+    public static File getDictFile(final Context context, final String dictName,
+            final File dictFile) {
+        return (dictFile != null) ? dictFile
+                : new File(context.getFilesDir(), dictName + DICT_FILE_EXTENSION);
+    }
+
+    public static String getDictName(final String name, final Locale locale,
+            final File dictFile) {
+        return dictFile != null ? dictFile.getName() : name + "." + locale.toString();
     }
 
     /**
@@ -279,6 +277,7 @@
     }
 
     protected void clear() {
+        final File dictFile = mDictFile;
         getExecutor(mDictName).execute(new Runnable() {
             @Override
             public void run() {
@@ -286,14 +285,13 @@
                     if (mBinaryDictionary != null) {
                         mBinaryDictionary.close();
                     }
-                    final File file = getDictFile();
-                    if (file.exists() && !FileUtils.deleteRecursively(file)) {
-                        Log.e(TAG, "Can't remove a file: " + file.getName());
+                    if (dictFile.exists() && !FileUtils.deleteRecursively(dictFile)) {
+                        Log.e(TAG, "Can't remove a file: " + dictFile.getName());
                     }
-                    BinaryDictionary.createEmptyDictFile(file.getAbsolutePath(),
+                    BinaryDictionary.createEmptyDictFile(dictFile.getAbsolutePath(),
                             DICTIONARY_FORMAT_VERSION, mLocale, getHeaderAttributeMap());
                     mBinaryDictionary = new BinaryDictionary(
-                            file.getAbsolutePath(), 0 /* offset */, file.length(),
+                            dictFile.getAbsolutePath(), 0 /* offset */, dictFile.length(),
                             true /* useFullEditDistance */, mLocale, mDictType, mIsUpdatable);
                 } else {
                     mDictionaryWriter.clear();
@@ -544,9 +542,8 @@
             }
         }
 
-        final File file = getDictFile();
-        final String filename = file.getAbsolutePath();
-        final long length = file.length();
+        final String filename = mDictFile.getAbsolutePath();
+        final long length = mDictFile.length();
 
         // Build the new binary dictionary
         final BinaryDictionary newBinaryDictionary = new BinaryDictionary(filename, 0 /* offset */,
@@ -585,17 +582,16 @@
         if (needsToReloadBeforeWriting()) {
             mDictionaryWriter.clear();
             loadDictionaryAsync();
-            mDictionaryWriter.write(getDictFile(), getHeaderAttributeMap());
+            mDictionaryWriter.write(mDictFile, getHeaderAttributeMap());
         } else {
             if (mBinaryDictionary == null || !isValidDictionary()
                     // TODO: remove the check below
                     || !matchesExpectedBinaryDictFormatVersionForThisType(
                             mBinaryDictionary.getFormatVersion())) {
-                final File file = getDictFile();
-                if (file.exists() && !FileUtils.deleteRecursively(file)) {
-                    Log.e(TAG, "Can't remove a file: " + file.getName());
+                if (mDictFile.exists() && !FileUtils.deleteRecursively(mDictFile)) {
+                    Log.e(TAG, "Can't remove a file: " + mDictFile.getName());
                 }
-                BinaryDictionary.createEmptyDictFile(file.getAbsolutePath(),
+                BinaryDictionary.createEmptyDictFile(mDictFile.getAbsolutePath(),
                         DICTIONARY_FORMAT_VERSION, mLocale, getHeaderAttributeMap());
             } else {
                 if (mBinaryDictionary.needsToRunGC(false /* mindsBlockByGC */)) {
@@ -719,7 +715,7 @@
 
     // TODO: cache the file's existence so that we avoid doing a disk access each time.
     private boolean dictionaryFileExists() {
-        return getDictFile().exists();
+        return mDictFile.exists();
     }
 
     /**
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 30bb505..7b72e80 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1734,13 +1734,7 @@
         final int keyboardMode = keyboard != null ? keyboard.mId.mMode : -1;
         p.println("  Keyboard mode = " + keyboardMode);
         final SettingsValues settingsValues = mSettings.getCurrent();
-        p.println("  mIsSuggestionsRequested = " + settingsValues.isSuggestionsRequested());
-        p.println("  mCorrectionEnabled=" + settingsValues.mCorrectionEnabled);
-        p.println("  isComposingWord=" + mInputLogic.mWordComposer.isComposingWord());
-        p.println("  mSoundOn=" + settingsValues.mSoundOn);
-        p.println("  mVibrateOn=" + settingsValues.mVibrateOn);
-        p.println("  mKeyPreviewPopupOn=" + settingsValues.mKeyPreviewPopupOn);
-        p.println("  inputAttributes=" + settingsValues.mInputAttributes);
+        p.println(settingsValues.dump());
         // TODO: Dump all settings values
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java b/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java
index 9ccd9e4..801fb5b 100644
--- a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java
@@ -28,12 +28,12 @@
     private final Object mLock = new Object();
 
     public SynchronouslyLoadedUserBinaryDictionary(final Context context, final Locale locale) {
-        this(context, locale, false);
+        this(context, locale, false /* alsoUseMoreRestrictiveLocales */);
     }
 
     public SynchronouslyLoadedUserBinaryDictionary(final Context context, final Locale locale,
             final boolean alsoUseMoreRestrictiveLocales) {
-        super(context, locale, alsoUseMoreRestrictiveLocales);
+        super(context, locale, alsoUseMoreRestrictiveLocales, null /* dictFile */);
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java b/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java
index 8011247..2a195f5 100644
--- a/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java
@@ -28,7 +28,6 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.compat.UserDictionaryCompatUtils;
 import com.android.inputmethod.latin.utils.LocaleUtils;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
@@ -78,19 +77,17 @@
     final public boolean mEnabled;
 
     public UserBinaryDictionary(final Context context, final Locale locale) {
-        this(context, locale, false);
+        this(context, locale, false /* alsoUseMoreRestrictiveLocales */, null /* dictFile */);
     }
 
-    // Dummy constructor for tests.
-    @UsedForTesting
-    public UserBinaryDictionary(final Context context, final Locale locale, final File file) {
-        this(context, locale);
+    public UserBinaryDictionary(final Context context, final Locale locale, final File dictFile) {
+        this(context, locale, false /* alsoUseMoreRestrictiveLocales */, dictFile);
     }
 
     public UserBinaryDictionary(final Context context, final Locale locale,
-            final boolean alsoUseMoreRestrictiveLocales) {
-        super(context, getDictNameWithLocale(NAME, locale), locale, Dictionary.TYPE_USER,
-                false /* isUpdatable */);
+            final boolean alsoUseMoreRestrictiveLocales, final File dictFile) {
+        super(context, getDictName(NAME, locale, dictFile), locale, Dictionary.TYPE_USER,
+                false /* isUpdatable */, dictFile);
         if (null == locale) throw new NullPointerException(); // Catch the error earlier
         final String localeStr = locale.toString();
         if (SubtypeLocaleUtils.NO_LANGUAGE.equals(localeStr)) {
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index 6e90505..bd114eb 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -973,7 +973,13 @@
                 } else {
                     final int codePointBeforeCursor = mConnection.getCodePointBeforeCursor();
                     if (codePointBeforeCursor == Constants.NOT_A_CODE) {
-                        // Nothing to delete before the cursor.
+                        // HACK for backward compatibility with broken apps that haven't realized
+                        // yet that hardware keyboards are not the only way of inputting text.
+                        // Nothing to delete before the cursor. We should not do anything, but many
+                        // broken apps expect something to happen in this case so that they can
+                        // catch it and have their broken interface react. If you need the keyboard
+                        // to do this, you're doing it wrong -- please fix your app.
+                        mConnection.deleteSurroundingText(1, 0);
                         return;
                     }
                     final int lengthToDelete =
@@ -1355,6 +1361,7 @@
         final String previousWord = mLastComposedWord.mPrevWord;
         final CharSequence originallyTypedWord = mLastComposedWord.mTypedWord;
         final CharSequence committedWord = mLastComposedWord.mCommittedWord;
+        final String committedWordString = committedWord.toString();
         final int cancelLength = committedWord.length();
         // We want java chars, not codepoints for the following.
         final int separatorLength = mLastComposedWord.mSeparatorString.length();
@@ -1376,33 +1383,44 @@
         if (!TextUtils.isEmpty(previousWord) && !TextUtils.isEmpty(committedWord)) {
             if (mSuggest != null) {
                 mSuggest.mDictionaryFacilitator.cancelAddingUserHistory(
-                        previousWord, committedWord.toString());
+                        previousWord, committedWordString);
             }
         }
         final String stringToCommit = originallyTypedWord + mLastComposedWord.mSeparatorString;
         final SpannableString textToCommit = new SpannableString(stringToCommit);
         if (committedWord instanceof SpannableString) {
-            final int lastCharIndex = textToCommit.length() - 1;
-            // Add the auto-correction to the list of suggestions.
-            textToCommit.setSpan(new SuggestionSpan(settingsValues.mLocale,
-                    new String[] { committedWord.toString() }, 0 /* flags */),
-                    0 /* start */, lastCharIndex /* end */, 0 /* flags */);
             final SpannableString committedWordWithSuggestionSpans = (SpannableString)committedWord;
             final Object[] spans = committedWordWithSuggestionSpans.getSpans(0,
                     committedWord.length(), Object.class);
+            final int lastCharIndex = textToCommit.length() - 1;
+            // We will collect all suggestions in the following array.
+            final ArrayList<String> suggestions = CollectionUtils.newArrayList();
+            // First, add the committed word to the list of suggestions.
+            suggestions.add(committedWordString);
             for (final Object span : spans) {
-                // Put all the spans in the original text on this new text. We could remove the
-                // typed word from the suggestions, but we'd have to make more dynamic instanceof
-                // checks, to copy the span, copy all suggestions and attributes... And there is
-                // the risk to drop the originally typed string if there is a subtle bug. There is
-                // still the committed auto-correction that we reverted from, which is not included
-                // in the suggestions, that's why we added it with another call to setSpan a few
-                // lines above.
-                // The code that re-reads these spans already knows to do the right thing whether
-                // the typed word is included or not. That should be enough.
-                textToCommit.setSpan(span, 0 /* start */, lastCharIndex /* end */,
-                        committedWordWithSuggestionSpans.getSpanFlags(span));
+                // If this is a suggestion span, we check that the locale is the right one, and
+                // that the word is not the committed word. That should mostly be the case.
+                // Given this, we add it to the list of suggestions, otherwise we discard it.
+                if (span instanceof SuggestionSpan) {
+                    final SuggestionSpan suggestionSpan = (SuggestionSpan)span;
+                    if (!suggestionSpan.getLocale().equals(settingsValues.mLocale.toString())) {
+                        continue;
+                    }
+                    for (final String suggestion : suggestionSpan.getSuggestions()) {
+                        if (!suggestion.equals(committedWordString)) {
+                            suggestions.add(suggestion);
+                        }
+                    }
+                } else {
+                    // If this is not a suggestion span, we just add it as is.
+                    textToCommit.setSpan(span, 0 /* start */, lastCharIndex /* end */,
+                            committedWordWithSuggestionSpans.getSpanFlags(span));
+                }
             }
+            // Add the suggestion list to the list of suggestions.
+            textToCommit.setSpan(new SuggestionSpan(settingsValues.mLocale,
+                    suggestions.toArray(new String[suggestions.size()]), 0 /* flags */),
+                    0 /* start */, lastCharIndex /* end */, 0 /* flags */);
         }
         if (settingsValues.mSpacingAndPunctuations.mCurrentLanguageHasSpaces) {
             // For languages with spaces, we revert to the typed string, but the cursor is still
diff --git a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
index 6a7a336..8f7378c 100644
--- a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
+++ b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
@@ -51,22 +51,10 @@
 
     private final String mDictName;
 
-    /* package */ DecayingExpandableBinaryDictionaryBase(final Context context,
-            final Locale locale, final String dictionaryType, final String dictName) {
-        super(context, dictName, locale, dictionaryType, true);
-        mLocale = locale;
-        mDictName = dictName;
-        if (mLocale != null && mLocale.toString().length() > 1) {
-            reloadDictionaryIfRequired();
-        }
-    }
-
-    // Creates an instance that uses a given dictionary file for testing.
-    @UsedForTesting
-    /* package */ DecayingExpandableBinaryDictionaryBase(final Context context,
-            final Locale locale, final String dictionaryType, final String dictName,
+    protected DecayingExpandableBinaryDictionaryBase(final Context context,
+            final String dictName, final Locale locale, final String dictionaryType,
             final File dictFile) {
-        super(context, dictName, locale, dictionaryType, true, dictFile);
+        super(context, dictName, locale, dictionaryType, true /* isUpdatable */, dictFile);
         mLocale = locale;
         mDictName = dictName;
         if (mLocale != null && mLocale.toString().length() > 1) {
diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
index 6526148..4afd5b4 100644
--- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
@@ -16,27 +16,23 @@
 
 package com.android.inputmethod.latin.personalization;
 
-import com.android.inputmethod.annotations.UsedForTesting;
+import android.content.Context;
+
 import com.android.inputmethod.latin.Dictionary;
 
 import java.io.File;
 import java.util.Locale;
 
-import android.content.Context;
-
 public class PersonalizationDictionary extends DecayingExpandableBinaryDictionaryBase {
     /* package */ static final String NAME = PersonalizationDictionary.class.getSimpleName();
 
     /* package */ PersonalizationDictionary(final Context context, final Locale locale) {
-        super(context, locale, Dictionary.TYPE_PERSONALIZATION,
-                getDictNameWithLocale(NAME, locale));
+        this(context, locale, null /* dictFile */);
     }
 
-    // Creates an instance that uses a given dictionary file for testing.
-    @UsedForTesting
     public PersonalizationDictionary(final Context context, final Locale locale,
             final File dictFile) {
-        super(context, locale, Dictionary.TYPE_PERSONALIZATION, getDictNameWithLocale(NAME, locale),
+        super(context, getDictName(NAME, locale, dictFile), locale, Dictionary.TYPE_PERSONALIZATION,
                 dictFile);
     }
 
diff --git a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
index 6778c23..504e9b2 100644
--- a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
@@ -16,29 +16,27 @@
 
 package com.android.inputmethod.latin.personalization;
 
-import com.android.inputmethod.annotations.UsedForTesting;
+import android.content.Context;
+
 import com.android.inputmethod.latin.Dictionary;
 
 import java.io.File;
 import java.util.Locale;
 
-import android.content.Context;
-
 /**
  * Locally gathers stats about the words user types and various other signals like auto-correction
  * cancellation or manual picks. This allows the keyboard to adapt to the typist over time.
  */
 public class UserHistoryDictionary extends DecayingExpandableBinaryDictionaryBase {
     /* package */ static final String NAME = UserHistoryDictionary.class.getSimpleName();
+
     /* package */ UserHistoryDictionary(final Context context, final Locale locale) {
-        super(context, locale, Dictionary.TYPE_USER_HISTORY, getDictNameWithLocale(NAME, locale));
+        this(context, locale, null /* dictFile */);
     }
 
-    // Creates an instance that uses a given dictionary file for testing.
-    @UsedForTesting
     public UserHistoryDictionary(final Context context, final Locale locale,
             final File dictFile) {
-        super(context, locale, Dictionary.TYPE_USER_HISTORY, getDictNameWithLocale(NAME, locale),
+        super(context, getDictName(NAME, locale, dictFile), locale, Dictionary.TYPE_USER_HISTORY,
                 dictFile);
     }
 
diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
index 90d3519..77968f7 100644
--- a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
@@ -329,4 +329,86 @@
         }
         return prefs.getBoolean(Settings.PREF_VOICE_INPUT_KEY, true);
     }
+
+    public String dump() {
+        final StringBuilder sb = new StringBuilder("Current settings :");
+        sb.append("\n   mSpacingAndPunctuations = ");
+        sb.append("" + mSpacingAndPunctuations.dump());
+        sb.append("\n   mDelayUpdateOldSuggestions = ");
+        sb.append("" + mDelayUpdateOldSuggestions);
+        sb.append("\n   mAutoCap = ");
+        sb.append("" + mAutoCap);
+        sb.append("\n   mVibrateOn = ");
+        sb.append("" + mVibrateOn);
+        sb.append("\n   mSoundOn = ");
+        sb.append("" + mSoundOn);
+        sb.append("\n   mKeyPreviewPopupOn = ");
+        sb.append("" + mKeyPreviewPopupOn);
+        sb.append("\n   mShowsVoiceInputKey = ");
+        sb.append("" + mShowsVoiceInputKey);
+        sb.append("\n   mIncludesOtherImesInLanguageSwitchList = ");
+        sb.append("" + mIncludesOtherImesInLanguageSwitchList);
+        sb.append("\n   mShowsLanguageSwitchKey = ");
+        sb.append("" + mShowsLanguageSwitchKey);
+        sb.append("\n   mUseContactsDict = ");
+        sb.append("" + mUseContactsDict);
+        sb.append("\n   mUsePersonalizedDicts = ");
+        sb.append("" + mUsePersonalizedDicts);
+        sb.append("\n   mUseDoubleSpacePeriod = ");
+        sb.append("" + mUseDoubleSpacePeriod);
+        sb.append("\n   mBlockPotentiallyOffensive = ");
+        sb.append("" + mBlockPotentiallyOffensive);
+        sb.append("\n   mBigramPredictionEnabled = ");
+        sb.append("" + mBigramPredictionEnabled);
+        sb.append("\n   mGestureInputEnabled = ");
+        sb.append("" + mGestureInputEnabled);
+        sb.append("\n   mGestureTrailEnabled = ");
+        sb.append("" + mGestureTrailEnabled);
+        sb.append("\n   mGestureFloatingPreviewTextEnabled = ");
+        sb.append("" + mGestureFloatingPreviewTextEnabled);
+        sb.append("\n   mSlidingKeyInputPreviewEnabled = ");
+        sb.append("" + mSlidingKeyInputPreviewEnabled);
+        sb.append("\n   mPhraseGestureEnabled = ");
+        sb.append("" + mPhraseGestureEnabled);
+        sb.append("\n   mKeyLongpressTimeout = ");
+        sb.append("" + mKeyLongpressTimeout);
+        sb.append("\n   mLocale = ");
+        sb.append("" + mLocale);
+        sb.append("\n   mInputAttributes = ");
+        sb.append("" + mInputAttributes);
+        sb.append("\n   mKeypressVibrationDuration = ");
+        sb.append("" + mKeypressVibrationDuration);
+        sb.append("\n   mKeypressSoundVolume = ");
+        sb.append("" + mKeypressSoundVolume);
+        sb.append("\n   mKeyPreviewPopupDismissDelay = ");
+        sb.append("" + mKeyPreviewPopupDismissDelay);
+        sb.append("\n   mAutoCorrectEnabled = ");
+        sb.append("" + mAutoCorrectEnabled);
+        sb.append("\n   mAutoCorrectionThreshold = ");
+        sb.append("" + mAutoCorrectionThreshold);
+        sb.append("\n   mCorrectionEnabled = ");
+        sb.append("" + mCorrectionEnabled);
+        sb.append("\n   mSuggestionVisibility = ");
+        sb.append("" + mSuggestionVisibility);
+        sb.append("\n   mUseOnlyPersonalizationDictionaryForDebug = ");
+        sb.append("" + mUseOnlyPersonalizationDictionaryForDebug);
+        sb.append("\n   mDisplayOrientation = ");
+        sb.append("" + mDisplayOrientation);
+        sb.append("\n   mAppWorkarounds = ");
+        final AppWorkaroundsUtils awu = mAppWorkarounds.get(null, 0);
+        sb.append("" + (null == awu ? "null" : awu.toString()));
+        sb.append("\n   mAdditionalFeaturesSettingValues = ");
+        sb.append("" + Arrays.toString(mAdditionalFeaturesSettingValues));
+        sb.append("\n   mIsInternal = ");
+        sb.append("" + mIsInternal);
+        sb.append("\n   mKeyPreviewShowUpDuration = ");
+        sb.append("" + mKeyPreviewShowUpDuration);
+        sb.append("\n   mKeyPreviewDismissDuration = ");
+        sb.append("" + mKeyPreviewDismissDuration);
+        sb.append("\n   mKeyPreviewShowUpStartScale = ");
+        sb.append("" + mKeyPreviewShowUpStartScale);
+        sb.append("\n   mKeyPreviewDismissEndScale = ");
+        sb.append("" + mKeyPreviewDismissEndScale);
+        return sb.toString();
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java b/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java
index 60ca5ba..03883a4 100644
--- a/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java
+++ b/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java
@@ -115,4 +115,29 @@
     public boolean isSentenceSeparator(final int code) {
         return code == mSentenceSeparator;
     }
+
+    public String dump() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("mSortedSymbolsPrecededBySpace = ");
+        sb.append("" + Arrays.toString(mSortedSymbolsPrecededBySpace));
+        sb.append("\n   mSortedSymbolsFollowedBySpace = ");
+        sb.append("" + Arrays.toString(mSortedSymbolsFollowedBySpace));
+        sb.append("\n   mSortedWordConnectors = ");
+        sb.append("" + Arrays.toString(mSortedWordConnectors));
+        sb.append("\n   mSortedWordSeparators = ");
+        sb.append("" + Arrays.toString(mSortedWordSeparators));
+        sb.append("\n   mSuggestPuncList = ");
+        sb.append("" + mSuggestPuncList);
+        sb.append("\n   mSentenceSeparator = ");
+        sb.append("" + mSentenceSeparator);
+        sb.append("\n   mSentenceSeparatorAndSpace = ");
+        sb.append("" + mSentenceSeparatorAndSpace);
+        sb.append("\n   mCurrentLanguageHasSpaces = ");
+        sb.append("" + mCurrentLanguageHasSpaces);
+        sb.append("\n   mUsesAmericanTypography = ");
+        sb.append("" + mUsesAmericanTypography);
+        sb.append("\n   mUsesGermanRules = ");
+        sb.append("" + mUsesGermanRules);
+        return sb.toString();
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
index 4063edc..5f05b48 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
@@ -65,7 +65,7 @@
     public final int mPadding;
     public final int mDividerWidth;
     public final int mSuggestionsStripHeight;
-    public final int mSuggestionsCountInStrip;
+    private final int mSuggestionsCountInStrip;
     public final int mMoreSuggestionsRowHeight;
     private int mMaxMoreSuggestionsRow;
     public final float mMinMoreSuggestionsWidth;
@@ -288,54 +288,65 @@
         params.gravity = Gravity.CENTER;
     }
 
-    public void layout(final SuggestedWords suggestedWords, final ViewGroup stripView,
-            final ViewGroup placerView) {
+    /**
+     * Layout suggestions to the suggestions strip. And returns the number of suggestions displayed
+     * in the suggestions strip.
+     *
+     * @param suggestedWords suggestions to be shown in the suggestions strip.
+     * @param stripView the suggestions strip view.
+     * @param placerView the view where the debug info will be placed.
+     * @return the number of suggestions displayed in the suggestions strip
+     */
+    public int layoutAndReturnSuggestionCountInStrip(final SuggestedWords suggestedWords,
+            final ViewGroup stripView, final ViewGroup placerView) {
         if (suggestedWords.mIsPunctuationSuggestions) {
-            layoutPunctuationSuggestions(suggestedWords, stripView);
-            return;
+            return layoutPunctuationSuggestionsAndReturnSuggestionCountInStrip(
+                    suggestedWords, stripView);
         }
 
-        final int countInStrip = mSuggestionsCountInStrip;
-        setupWordViewsTextAndColor(suggestedWords, countInStrip);
+        setupWordViewsTextAndColor(suggestedWords, mSuggestionsCountInStrip);
         final TextView centerWordView = mWordViews.get(mCenterPositionInStrip);
         final int availableStripWidth = placerView.getWidth()
                 - placerView.getPaddingRight() - placerView.getPaddingLeft();
         final int centerWidth = getSuggestionWidth(mCenterPositionInStrip, availableStripWidth);
-        if (getTextScaleX(centerWordView.getText(), centerWidth, centerWordView.getPaint())
-                < MIN_TEXT_XSCALE) {
+        final int countInStrip;
+        if (suggestedWords.size() == 1 || getTextScaleX(centerWordView.getText(), centerWidth,
+                centerWordView.getPaint()) < MIN_TEXT_XSCALE) {
             // Layout only the most relevant suggested word at the center of the suggestion strip
             // by consolidating all slots in the strip.
-            mMoreSuggestionsAvailable = (suggestedWords.size() > 1);
+            countInStrip = 1;
+            mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
             layoutWord(mCenterPositionInStrip, availableStripWidth - mPadding);
             stripView.addView(centerWordView);
             setLayoutWeight(centerWordView, 1.0f, ViewGroup.LayoutParams.MATCH_PARENT);
             if (SuggestionStripView.DBG) {
                 layoutDebugInfo(mCenterPositionInStrip, placerView, availableStripWidth);
             }
-            return;
-        }
+        } else {
+            countInStrip = mSuggestionsCountInStrip;
+            mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
+            int x = 0;
+            for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) {
+                if (positionInStrip != 0) {
+                    final View divider = mDividerViews.get(positionInStrip);
+                    // Add divider if this isn't the left most suggestion in suggestions strip.
+                    addDivider(stripView, divider);
+                    x += divider.getMeasuredWidth();
+                }
 
-        mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
-        int x = 0;
-        for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) {
-            if (positionInStrip != 0) {
-                final View divider = mDividerViews.get(positionInStrip);
-                // Add divider if this isn't the left most suggestion in suggestions strip.
-                addDivider(stripView, divider);
-                x += divider.getMeasuredWidth();
-            }
+                final int width = getSuggestionWidth(positionInStrip, availableStripWidth);
+                final TextView wordView = layoutWord(positionInStrip, width);
+                stripView.addView(wordView);
+                setLayoutWeight(wordView, getSuggestionWeight(positionInStrip),
+                        ViewGroup.LayoutParams.MATCH_PARENT);
+                x += wordView.getMeasuredWidth();
 
-            final int width = getSuggestionWidth(positionInStrip, availableStripWidth);
-            final TextView wordView = layoutWord(positionInStrip, width);
-            stripView.addView(wordView);
-            setLayoutWeight(wordView, getSuggestionWeight(positionInStrip),
-                    ViewGroup.LayoutParams.MATCH_PARENT);
-            x += wordView.getMeasuredWidth();
-
-            if (SuggestionStripView.DBG) {
-                layoutDebugInfo(positionInStrip, placerView, x);
+                if (SuggestionStripView.DBG) {
+                    layoutDebugInfo(positionInStrip, placerView, x);
+                }
             }
         }
+        return countInStrip;
     }
 
     /**
@@ -435,8 +446,8 @@
         }
     }
 
-    private void layoutPunctuationSuggestions(final SuggestedWords suggestedWords,
-            final ViewGroup stripView) {
+    private int layoutPunctuationSuggestionsAndReturnSuggestionCountInStrip(
+            final SuggestedWords suggestedWords, final ViewGroup stripView) {
         final int countInStrip = Math.min(suggestedWords.size(), PUNCTUATIONS_IN_STRIP);
         for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) {
             if (positionInStrip != 0) {
@@ -457,6 +468,7 @@
             setLayoutWeight(wordView, 1.0f, mSuggestionsStripHeight);
         }
         mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
+        return countInStrip;
     }
 
     public void layoutAddToDictionaryHint(final String word, final ViewGroup addToDictionaryStrip,
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index 29c0613..cf0a7a2 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -77,6 +77,7 @@
 
     Listener mListener;
     private SuggestedWords mSuggestedWords = SuggestedWords.EMPTY;
+    private int mSuggestionsCountInStrip;
 
     private final SuggestionStripLayoutHelper mLayoutHelper;
     private final StripVisibilityGroup mStripVisibilityGroup;
@@ -189,7 +190,8 @@
         clear();
         mStripVisibilityGroup.setLayoutDirection(isRtlLanguage);
         mSuggestedWords = suggestedWords;
-        mLayoutHelper.layout(mSuggestedWords, mSuggestionsStrip, this);
+        mSuggestionsCountInStrip = mLayoutHelper.layoutAndReturnSuggestionCountInStrip(
+                mSuggestedWords, mSuggestionsStrip, this);
         if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
             ResearchLogger.suggestionStripView_setSuggestions(mSuggestedWords);
         }
@@ -312,7 +314,7 @@
         final View container = mMoreSuggestionsContainer;
         final int maxWidth = stripWidth - container.getPaddingLeft() - container.getPaddingRight();
         final MoreSuggestions.Builder builder = mMoreSuggestionsBuilder;
-        builder.layout(mSuggestedWords, layoutHelper.mSuggestionsCountInStrip, maxWidth,
+        builder.layout(mSuggestedWords, mSuggestionsCountInStrip, maxWidth,
                 (int)(maxWidth * layoutHelper.mMinMoreSuggestionsWidth),
                 layoutHelper.getMaxMoreSuggestionsRow(), parentKeyboard);
         mMoreSuggestionsView.setKeyboard(builder.build());
@@ -326,7 +328,7 @@
         mMoreSuggestionsMode = MORE_SUGGESTIONS_CHECKING_MODAL_OR_SLIDING;
         mOriginX = mLastX;
         mOriginY = mLastY;
-        for (int i = 0; i < layoutHelper.mSuggestionsCountInStrip; i++) {
+        for (int i = 0; i < mSuggestionsCountInStrip; i++) {
             mWordViews.get(i).setPressed(false);
         }
         return true;
diff --git a/native/jni/src/suggest/core/dictionary/bloom_filter.h b/native/jni/src/suggest/core/dictionary/bloom_filter.h
index 5f97004..e22c3ae 100644
--- a/native/jni/src/suggest/core/dictionary/bloom_filter.h
+++ b/native/jni/src/suggest/core/dictionary/bloom_filter.h
@@ -17,6 +17,7 @@
 #ifndef LATINIME_BLOOM_FILTER_H
 #define LATINIME_BLOOM_FILTER_H
 
+#include <cstring>
 #include <stdint.h>
 
 #include "defines.h"
@@ -35,6 +36,7 @@
  public:
     BloomFilter() {
         ASSERT(BIGRAM_FILTER_BYTE_SIZE * 8 >= BIGRAM_FILTER_MODULO);
+        memset(mFilter, 0, sizeof(mFilter));
     }
 
     // TODO: uint32_t position
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.cpp b/native/jni/src/suggest/core/dictionary/dictionary.cpp
index 9b71eff..035232f 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.cpp
+++ b/native/jni/src/suggest/core/dictionary/dictionary.cpp
@@ -46,7 +46,7 @@
 int Dictionary::getSuggestions(ProximityInfo *proximityInfo, DicTraverseSession *traverseSession,
         int *xcoordinates, int *ycoordinates, int *times, int *pointerIds, int *inputCodePoints,
         int inputSize, int *prevWordCodePoints, int prevWordLength, int commitPoint,
-        const SuggestOptions *const suggestOptions, int *outWords, int *frequencies,
+        const SuggestOptions *const suggestOptions, int *outWords, int *outputScores,
         int *spaceIndices, int *outputTypes, int *outputAutoCommitFirstWordConfidence) const {
     TimeKeeper::setCurrentTime();
     int result = 0;
@@ -55,9 +55,9 @@
                 traverseSession, this, prevWordCodePoints, prevWordLength, suggestOptions);
         result = mGestureSuggest.get()->getSuggestions(proximityInfo, traverseSession, xcoordinates,
                 ycoordinates, times, pointerIds, inputCodePoints, inputSize, commitPoint, outWords,
-                frequencies, spaceIndices, outputTypes, outputAutoCommitFirstWordConfidence);
+                outputScores, spaceIndices, outputTypes, outputAutoCommitFirstWordConfidence);
         if (DEBUG_DICT) {
-            DUMP_RESULT(outWords, frequencies);
+            DUMP_RESULT(outWords, outputScores);
         }
         return result;
     } else {
@@ -65,20 +65,20 @@
                 traverseSession, this, prevWordCodePoints, prevWordLength, suggestOptions);
         result = mTypingSuggest.get()->getSuggestions(proximityInfo, traverseSession, xcoordinates,
                 ycoordinates, times, pointerIds, inputCodePoints, inputSize, commitPoint,
-                outWords, frequencies, spaceIndices, outputTypes,
+                outWords, outputScores, spaceIndices, outputTypes,
                 outputAutoCommitFirstWordConfidence);
         if (DEBUG_DICT) {
-            DUMP_RESULT(outWords, frequencies);
+            DUMP_RESULT(outWords, outputScores);
         }
         return result;
     }
 }
 
-int Dictionary::getBigrams(const int *word, int length, int *outWords, int *frequencies,
+int Dictionary::getBigrams(const int *word, int length, int *outWords, int *outputScores,
         int *outputTypes) const {
     TimeKeeper::setCurrentTime();
     if (length <= 0) return 0;
-    return mBigramDictionary.get()->getPredictions(word, length, outWords, frequencies,
+    return mBigramDictionary.get()->getPredictions(word, length, outWords, outputScores,
             outputTypes);
 }
 
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.h b/native/jni/src/suggest/core/dictionary/dictionary.h
index 7f311f3..c58be84 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.h
+++ b/native/jni/src/suggest/core/dictionary/dictionary.h
@@ -64,10 +64,10 @@
     int getSuggestions(ProximityInfo *proximityInfo, DicTraverseSession *traverseSession,
             int *xcoordinates, int *ycoordinates, int *times, int *pointerIds, int *inputCodePoints,
             int inputSize, int *prevWordCodePoints, int prevWordLength, int commitPoint,
-            const SuggestOptions *const suggestOptions, int *outWords, int *frequencies,
+            const SuggestOptions *const suggestOptions, int *outWords, int *outputScores,
             int *spaceIndices, int *outputTypes, int *outputAutoCommitFirstWordConfidence) const;
 
-    int getBigrams(const int *word, int length, int *outWords, int *frequencies,
+    int getBigrams(const int *word, int length, int *outWords, int *outputScores,
             int *outputTypes) const;
 
     int getProbability(const int *word, int length) const;
diff --git a/native/jni/src/suggest/core/dictionary/suggestions_output_utils.cpp b/native/jni/src/suggest/core/dictionary/suggestions_output_utils.cpp
index e37811b..07c2e6e 100644
--- a/native/jni/src/suggest/core/dictionary/suggestions_output_utils.cpp
+++ b/native/jni/src/suggest/core/dictionary/suggestions_output_utils.cpp
@@ -31,7 +31,7 @@
 // TODO: Split this method.
 /* static */ int SuggestionsOutputUtils::outputSuggestions(
         const Scoring *const scoringPolicy, DicTraverseSession *traverseSession,
-        int *frequencies, int *outputCodePoints, int *outputIndicesToPartialCommit,
+        int *outputScores, int *outputCodePoints, int *outputIndicesToPartialCommit,
         int *outputTypes, int *outputAutoCommitFirstWordConfidence) {
 #if DEBUG_EVALUATE_MOST_PROBABLE_STRING
     const int terminalSize = 0;
@@ -52,7 +52,7 @@
     // Insert most probable word at index == 0 as long as there is one terminal at least
     const bool hasMostProbableString =
             scoringPolicy->getMostProbableString(traverseSession, terminalSize, languageWeight,
-                    &outputCodePoints[0], &outputTypes[0], &frequencies[0]);
+                    &outputCodePoints[0], &outputTypes[0], &outputScores[0]);
     if (hasMostProbableString) {
         outputIndicesToPartialCommit[outputWordIndex] = NOT_AN_INDEX;
         ++outputWordIndex;
@@ -97,7 +97,7 @@
         const bool isExactMatch =
                 ErrorTypeUtils::isExactMatch(terminalDicNode->getContainedErrorTypes());
         const bool isFirstCharUppercase = terminalDicNode->isFirstCharUppercase();
-        // Heuristic: We exclude freq=0 first-char-uppercase words from exact match.
+        // Heuristic: We exclude probability=0 first-char-uppercase words from exact match.
         // (e.g. "AMD" and "and")
         const bool isSafeExactMatch = isExactMatch
                 && !(isPossiblyOffensiveWord && isFirstCharUppercase);
@@ -123,7 +123,7 @@
         // Don't output invalid words. However, we still need to submit their shortcuts if any.
         if (isValidWord) {
             outputTypes[outputWordIndex] = Dictionary::KIND_CORRECTION | outputTypeFlags;
-            frequencies[outputWordIndex] = finalScore;
+            outputScores[outputWordIndex] = finalScore;
             if (outputSecondWordFirstLetterInputIndex) {
                 outputIndicesToPartialCommit[outputWordIndex] =
                         terminalDicNode->getSecondWordFirstInputIndex(
@@ -151,7 +151,7 @@
                              terminalDicNode->getContainedErrorTypes(),
                              true /* forceCommit */, boostExactMatches) : finalScore;
             const int updatedOutputWordIndex = outputShortcuts(&shortcutIt,
-                    outputWordIndex, shortcutBaseScore, outputCodePoints, frequencies, outputTypes,
+                    outputWordIndex, shortcutBaseScore, outputCodePoints, outputScores, outputTypes,
                     sameAsTyped);
             const int secondWordFirstInputIndex = terminalDicNode->getSecondWordFirstInputIndex(
                     traverseSession->getProximityInfoState(0));
@@ -168,8 +168,8 @@
     }
 
     if (hasMostProbableString) {
-        scoringPolicy->safetyNetForMostProbableString(terminalSize, maxScore,
-                &outputCodePoints[0], &frequencies[0]);
+        scoringPolicy->safetyNetForMostProbableString(outputWordIndex, maxScore,
+                &outputCodePoints[0], outputScores);
     }
     return outputWordIndex;
 }
@@ -229,7 +229,7 @@
 /* static */ int SuggestionsOutputUtils::outputShortcuts(
         BinaryDictionaryShortcutIterator *const shortcutIt,
         int outputWordIndex, const int finalScore, int *const outputCodePoints,
-        int *const frequencies, int *const outputTypes, const bool sameAsTyped) {
+        int *const outputScores, int *const outputTypes, const bool sameAsTyped) {
     int shortcutTarget[MAX_WORD_LENGTH];
     while (shortcutIt->hasNextShortcutTarget() && outputWordIndex < MAX_RESULTS) {
         bool isWhilelist;
@@ -249,8 +249,8 @@
             kind = Dictionary::KIND_SHORTCUT;
         }
         outputTypes[outputWordIndex] = kind;
-        frequencies[outputWordIndex] = shortcutScore;
-        frequencies[outputWordIndex] = max(S_INT_MIN + 1, shortcutScore) - 1;
+        outputScores[outputWordIndex] = shortcutScore;
+        outputScores[outputWordIndex] = max(S_INT_MIN + 1, shortcutScore) - 1;
         const int startIndex2 = outputWordIndex * MAX_WORD_LENGTH;
         DicNodeUtils::appendTwoWords(0, 0, shortcutTarget, shortcutTargetStringLength,
                 &outputCodePoints[startIndex2]);
diff --git a/native/jni/src/suggest/core/dictionary/suggestions_output_utils.h b/native/jni/src/suggest/core/dictionary/suggestions_output_utils.h
index 460e260..d456a54 100644
--- a/native/jni/src/suggest/core/dictionary/suggestions_output_utils.h
+++ b/native/jni/src/suggest/core/dictionary/suggestions_output_utils.h
@@ -32,7 +32,7 @@
      * Outputs the final list of suggestions (i.e., terminal nodes).
      */
     static int outputSuggestions(const Scoring *const scoringPolicy,
-            DicTraverseSession *traverseSession, int *frequencies, int *outputCodePoints,
+            DicTraverseSession *traverseSession, int *outputScores, int *outputCodePoints,
             int *outputIndicesToPartialCommit, int *outputTypes,
             int *outputAutoCommitFirstWordConfidence);
 
@@ -46,7 +46,7 @@
 
     static int outputShortcuts(BinaryDictionaryShortcutIterator *const shortcutIt,
             int outputWordIndex, const int finalScore, int *const outputCodePoints,
-            int *const frequencies, int *const outputTypes, const bool sameAsTyped);
+            int *const outputScores, int *const outputTypes, const bool sameAsTyped);
 };
 } // namespace latinime
 #endif // LATINIME_SUGGESTIONS_OUTPUT_UTILS
diff --git a/native/jni/src/suggest/core/policy/scoring.h b/native/jni/src/suggest/core/policy/scoring.h
index e581a97..0251475 100644
--- a/native/jni/src/suggest/core/policy/scoring.h
+++ b/native/jni/src/suggest/core/policy/scoring.h
@@ -33,8 +33,8 @@
     virtual bool getMostProbableString(const DicTraverseSession *const traverseSession,
             const int terminalSize, const float languageWeight, int *const outputCodePoints,
             int *const type, int *const freq) const = 0;
-    virtual void safetyNetForMostProbableString(const int terminalSize,
-            const int maxScore, int *const outputCodePoints, int *const frequencies) const = 0;
+    virtual void safetyNetForMostProbableString(const int scoreCount,
+            const int maxScore, int *const outputCodePoints, int *const scores) const = 0;
     virtual float getAdjustedLanguageWeight(DicTraverseSession *const traverseSession,
             DicNode *const terminals, const int size) const = 0;
     virtual float getDoubleLetterDemotionDistanceCost(
diff --git a/native/jni/src/suggest/core/suggest.cpp b/native/jni/src/suggest/core/suggest.cpp
index 7cd2372..56acc2d 100644
--- a/native/jni/src/suggest/core/suggest.cpp
+++ b/native/jni/src/suggest/core/suggest.cpp
@@ -44,7 +44,7 @@
  */
 int Suggest::getSuggestions(ProximityInfo *pInfo, void *traverseSession,
         int *inputXs, int *inputYs, int *times, int *pointerIds, int *inputCodePoints,
-        int inputSize, int commitPoint, int *outWords, int *frequencies, int *outputIndices,
+        int inputSize, int commitPoint, int *outWords, int *outputScores, int *outputIndices,
         int *outputTypes, int *outputAutoCommitFirstWordConfidence) const {
     PROF_OPEN;
     PROF_START(0);
@@ -66,7 +66,7 @@
     }
     PROF_END(1);
     PROF_START(2);
-    const int size = SuggestionsOutputUtils::outputSuggestions(SCORING, tSession, frequencies,
+    const int size = SuggestionsOutputUtils::outputSuggestions(SCORING, tSession, outputScores,
             outWords, outputIndices, outputTypes, outputAutoCommitFirstWordConfidence);
     PROF_END(2);
     PROF_CLOSE;
diff --git a/native/jni/src/suggest/core/suggest.h b/native/jni/src/suggest/core/suggest.h
index 5feb04f..b1d12ad 100644
--- a/native/jni/src/suggest/core/suggest.h
+++ b/native/jni/src/suggest/core/suggest.h
@@ -48,7 +48,7 @@
     AK_FORCE_INLINE virtual ~Suggest() {}
     int getSuggestions(ProximityInfo *pInfo, void *traverseSession, int *inputXs, int *inputYs,
             int *times, int *pointerIds, int *inputCodePoints, int inputSize, int commitPoint,
-            int *outWords, int *frequencies, int *outputIndices, int *outputTypes,
+            int *outWords, int *outputScores, int *outputIndices, int *outputTypes,
             int *outputAutoCommitFirstWordConfidence) const;
 
  private:
diff --git a/native/jni/src/suggest/core/suggest_interface.h b/native/jni/src/suggest/core/suggest_interface.h
index 4deb4d9..9a07580 100644
--- a/native/jni/src/suggest/core/suggest_interface.h
+++ b/native/jni/src/suggest/core/suggest_interface.h
@@ -27,7 +27,7 @@
  public:
     virtual int getSuggestions(ProximityInfo *pInfo, void *traverseSession, int *inputXs,
             int *inputYs, int *times, int *pointerIds, int *inputCodePoints, int inputSize,
-            int commitPoint, int *outWords, int *frequencies, int *outputIndices,
+            int commitPoint, int *outWords, int *outputScores, int *outputIndices,
             int *outputTypes, int *outputAutoCommitFirstWordConfidence) const = 0;
     SuggestInterface() {}
     virtual ~SuggestInterface() {}
diff --git a/native/jni/src/suggest/policyimpl/typing/typing_scoring.h b/native/jni/src/suggest/policyimpl/typing/typing_scoring.h
index 8b405e8..7ef905d 100644
--- a/native/jni/src/suggest/policyimpl/typing/typing_scoring.h
+++ b/native/jni/src/suggest/policyimpl/typing/typing_scoring.h
@@ -39,8 +39,8 @@
         return false;
     }
 
-    AK_FORCE_INLINE void safetyNetForMostProbableString(const int terminalSize,
-            const int maxScore, int *const outputCodePoints, int *const frequencies) const {
+    AK_FORCE_INLINE void safetyNetForMostProbableString(const int scoreCount,
+            const int maxScore, int *const outputCodePoints, int *const scores) const {
     }
 
     AK_FORCE_INLINE float getAdjustedLanguageWeight(DicTraverseSession *const traverseSession,
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java
index 9e43bd4..8e26e7f 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java
@@ -33,7 +33,7 @@
         final String actualLabel = KeySpecParser.getLabel(keySpecResolved);
         final String actualOutputText = KeySpecParser.getOutputText(keySpecResolved);
         final int actualIcon = KeySpecParser.getIconId(keySpecResolved);
-        final int actualCode = KeySpecParser.getCode(keySpecResolved, mCodesSet);
+        final int actualCode = KeySpecParser.getCode(keySpecResolved);
         assertEquals(message + " [label]", expectedLabel, actualLabel);
         assertEquals(message + " [ouptputText]", expectedOutputText, actualOutputText);
         assertEquals(message + " [icon]",
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
index edeb6a6..c342533 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
@@ -32,7 +32,6 @@
 
 abstract class KeySpecParserTestsBase extends AndroidTestCase {
     private final static Locale TEST_LOCALE = Locale.ENGLISH;
-    protected final KeyboardCodesSet mCodesSet = new KeyboardCodesSet();
     protected final KeyboardTextsSet mTextsSet = new KeyboardTextsSet();
 
     private static final String CODE_SETTINGS_NAME = "key_settings";
@@ -52,7 +51,6 @@
     protected void setUp() throws Exception {
         super.setUp();
 
-        mCodesSet.setLocale(TEST_LOCALE);
         mTextsSet.setLocale(TEST_LOCALE);
         final Context context = getContext();
         new RunInLocale<Void>() {
@@ -63,8 +61,8 @@
             }
         }.runInLocale(context.getResources(), TEST_LOCALE);
 
-        mCodeSettings = mCodesSet.getCode(CODE_SETTINGS_NAME);
-        mCodeActionNext = mCodesSet.getCode("key_action_next");
+        mCodeSettings = KeyboardCodesSet.getCode(CODE_SETTINGS_NAME);
+        mCodeActionNext = KeyboardCodesSet.getCode("key_action_next");
         mSettingsIconId = KeyboardIconsSet.getIconId(ICON_SETTINGS_NAME);
     }
 
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java
index ea25bcf..6c0d749 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java
@@ -33,8 +33,8 @@
             final String expectedLabel, final String expectedOutputText, final int expectedIconId,
             final int expectedCode) {
         final String labelResolved = mTextsSet.resolveTextReference(moreKeySpec);
-        final MoreKeySpec spec = new MoreKeySpec(labelResolved, false /* needsToUpperCase */,
-                Locale.US, mCodesSet);
+        final MoreKeySpec spec = new MoreKeySpec(
+                labelResolved, false /* needsToUpperCase */, Locale.US);
         assertEquals(message + " [label]", expectedLabel, spec.mLabel);
         assertEquals(message + " [ouptputText]", expectedOutputText, spec.mOutputText);
         assertEquals(message + " [icon]",
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
index 7d664c8..5702a62 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
@@ -55,8 +55,8 @@
 
     @Override
     protected void tearDown() throws Exception {
-        super.tearDown();
         stopTestModeInNativeCode();
+        super.tearDown();
     }
 
     private void addUnigramWord(final BinaryDictionary binaryDictionary, final String word,
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
index 1370041..c1adf65 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
@@ -43,16 +43,6 @@
     private static final String TEST_DICT_FILE_EXTENSION = ".testDict";
     private static final String TEST_LOCALE = "test";
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
     private File createEmptyDictionaryAndGetFile(final String dictId,
             final int formatVersion) throws IOException {
        if (formatVersion == FormatSpec.VERSION4) {
diff --git a/tests/src/com/android/inputmethod/latin/BlueUnderlineTests.java b/tests/src/com/android/inputmethod/latin/BlueUnderlineTests.java
index cdd8f6b..6e894de 100644
--- a/tests/src/com/android/inputmethod/latin/BlueUnderlineTests.java
+++ b/tests/src/com/android/inputmethod/latin/BlueUnderlineTests.java
@@ -50,8 +50,7 @@
         final SpanGetter spanBefore = new SpanGetter(mEditText.getText(), SuggestionSpan.class);
         assertEquals("extend blue underline, span start", EXPECTED_SPAN_START, spanBefore.mStart);
         assertEquals("extend blue underline, span end", EXPECTED_SPAN_END, spanBefore.mEnd);
-        assertEquals("extend blue underline, span color", true,
-                spanBefore.isAutoCorrectionIndicator());
+        assertTrue("extend blue underline, span color", spanBefore.isAutoCorrectionIndicator());
         sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
         runMessages();
         // Now we have been able to re-evaluate the word, there shouldn't be an auto-correction span
@@ -80,8 +79,8 @@
         sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
         runMessages();
         final SpanGetter suggestionSpan = new SpanGetter(mEditText.getText(), SuggestionSpan.class);
-        assertEquals("show no blue underline after backspace, span start should be -1",
-                EXPECTED_SUGGESTION_SPAN_START, suggestionSpan.mStart);
+        assertFalse("show no blue underline after backspace, span should not be the auto-"
+                + "correction indicator", suggestionSpan.isAutoCorrectionIndicator());
         final SpanGetter underlineSpan = new SpanGetter(mEditText.getText(), UnderlineSpan.class);
         assertEquals("should be composing, so should have an underline span",
                 EXPECTED_UNDERLINE_SPAN_START, underlineSpan.mStart);
@@ -107,7 +106,8 @@
         sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
         runMessages();
         final SpanGetter span = new SpanGetter(mEditText.getText(), SuggestionSpan.class);
-        assertNull("blue underline removed when cursor is moved", span.mSpan);
+        assertFalse("blue underline removed when cursor is moved",
+                span.isAutoCorrectionIndicator());
     }
 
     public void testComposingStopsOnSpace() {
diff --git a/tests/src/com/android/inputmethod/latin/EditDistanceTests.java b/tests/src/com/android/inputmethod/latin/EditDistanceTests.java
index 0b7fcbb..ffec20a 100644
--- a/tests/src/com/android/inputmethod/latin/EditDistanceTests.java
+++ b/tests/src/com/android/inputmethod/latin/EditDistanceTests.java
@@ -21,16 +21,6 @@
 
 @SmallTest
 public class EditDistanceTests extends AndroidTestCase {
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
     /*
      * dist(kitten, sitting) == 3
      *
diff --git a/tests/src/com/android/inputmethod/latin/InputTestsBase.java b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
index b267bc5..06b64b4 100644
--- a/tests/src/com/android/inputmethod/latin/InputTestsBase.java
+++ b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
@@ -38,6 +38,8 @@
 import com.android.inputmethod.keyboard.Key;
 import com.android.inputmethod.keyboard.Keyboard;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.settings.DebugSettings;
+import com.android.inputmethod.latin.settings.Settings;
 import com.android.inputmethod.latin.utils.LocaleUtils;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
@@ -47,8 +49,6 @@
 public class InputTestsBase extends ServiceTestCase<LatinIMEForTests> {
     private static final String TAG = InputTestsBase.class.getSimpleName();
 
-    private static final String PREF_DEBUG_MODE = "debug_mode";
-    private static final String PREF_AUTO_CORRECTION_THRESHOLD = "auto_correction_threshold";
     // Default value for auto-correction threshold. This is the string representation of the
     // index in the resources array of auto-correction threshold settings.
     private static final String DEFAULT_AUTO_CORRECTION_THRESHOLD = "1";
@@ -65,6 +65,7 @@
     protected View mInputView;
     protected InputConnection mInputConnection;
     private boolean mPreviousDebugSetting;
+    private boolean mPreviousBigramPredictionSettings;
     private String mPreviousAutoCorrectSetting;
 
     // A helper class to ease span tests
@@ -163,7 +164,7 @@
 
     // returns the previous setting value
     protected boolean setDebugMode(final boolean value) {
-        return setBooleanPreference(PREF_DEBUG_MODE, value, false);
+        return setBooleanPreference(DebugSettings.PREF_DEBUG_MODE, value, false);
     }
 
     protected EditorInfo enrichEditorInfo(final EditorInfo ei) {
@@ -184,7 +185,9 @@
         setupService();
         mLatinIME = getService();
         mPreviousDebugSetting = setDebugMode(true);
-        mPreviousAutoCorrectSetting = setStringPreference(PREF_AUTO_CORRECTION_THRESHOLD,
+        mPreviousBigramPredictionSettings = setBooleanPreference(Settings.PREF_BIGRAM_PREDICTIONS,
+                true, true /* defaultValue */);
+        mPreviousAutoCorrectSetting = setStringPreference(Settings.PREF_AUTO_CORRECTION_THRESHOLD,
                 DEFAULT_AUTO_CORRECTION_THRESHOLD, DEFAULT_AUTO_CORRECTION_THRESHOLD);
         mLatinIME.onCreate();
         EditorInfo ei = new EditorInfo();
@@ -202,16 +205,21 @@
         mInputConnection = ic;
         changeLanguage("en_US");
         // Run messages to avoid the messages enqueued by startInputView() and its friends
-        // to run on a later call and ruin things.
+        // to run on a later call and ruin things. We need to wait first because some of them
+        // can be posted with a delay (notably,  MSG_RESUME_SUGGESTIONS)
+        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
         runMessages();
     }
 
     @Override
-    protected void tearDown() {
+    protected void tearDown() throws Exception {
         mLatinIME.mHandler.removeAllMessages();
-        setStringPreference(PREF_AUTO_CORRECTION_THRESHOLD, mPreviousAutoCorrectSetting,
+        setBooleanPreference(Settings.PREF_BIGRAM_PREDICTIONS, mPreviousBigramPredictionSettings,
+                true /* defaultValue */);
+        setStringPreference(Settings.PREF_AUTO_CORRECTION_THRESHOLD, mPreviousAutoCorrectSetting,
                 DEFAULT_AUTO_CORRECTION_THRESHOLD);
         setDebugMode(mPreviousDebugSetting);
+        super.tearDown();
     }
 
     // We need to run the messages added to the handler from LatinIME. The only way to do
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
index 75a1aa3..141730d 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
@@ -115,9 +115,9 @@
 
     @Override
     protected void tearDown() throws Exception {
-        super.tearDown();
         // Quit test mode.
         BinaryDictionary.setCurrentTimeForTest(-1);
+        super.tearDown();
     }
 
     private void generateWords(final int number, final Random random) {
diff --git a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
index a629773..dff5a77 100644
--- a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
@@ -22,6 +22,7 @@
 
 import com.android.inputmethod.latin.ExpandableBinaryDictionary;
 import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.utils.FileUtils;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -46,7 +47,7 @@
     /**
      * Generates a random word.
      */
-    private String generateWord(final int value) {
+    private static String generateWord(final int value) {
         final int lengthOfChars = CHARACTERS.length;
         StringBuilder builder = new StringBuilder();
         long lvalue = Math.abs((long)value);
@@ -57,7 +58,7 @@
         return builder.toString();
     }
 
-    private List<String> generateWords(final int number, final Random random) {
+    private static List<String> generateWords(final int number, final Random random) {
         final Set<String> wordSet = CollectionUtils.newHashSet();
         while (wordSet.size() < number) {
             wordSet.add(generateWord(random.nextInt()));
@@ -65,7 +66,7 @@
         return new ArrayList<String>(wordSet);
     }
 
-    private void addToDict(final UserHistoryDictionary dict, final List<String> words) {
+    private static void addToDict(final UserHistoryDictionary dict, final List<String> words) {
         String prevWord = null;
         for (String word : words) {
             dict.addToDictionary(prevWord, word, true,
@@ -78,12 +79,11 @@
      * @param checkContents if true, checks whether written words are actually in the dictionary
      * or not.
      */
-    private void addAndWriteRandomWords(final String testFilenameSuffix, final int numberOfWords,
+    private void addAndWriteRandomWords(final Locale locale, final int numberOfWords,
             final Random random, final boolean checkContents) {
         final List<String> words = generateWords(numberOfWords, random);
-        final UserHistoryDictionary dict =
-                PersonalizationHelper.getUserHistoryDictionary(getContext(),
-                        new Locale(testFilenameSuffix));
+        final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary(
+                mContext, locale);
         // Add random words to the user history dictionary.
         addToDict(dict, words);
         if (checkContents) {
@@ -99,12 +99,11 @@
 
     /**
      * Clear all entries in the user history dictionary.
-     * @param testFilenameSuffix file name suffix used for testing.
+     * @param locale dummy locale for testing.
      */
-    private void clearHistory(final String testFilenameSuffix) {
-        final UserHistoryDictionary dict =
-                PersonalizationHelper.getUserHistoryDictionary(getContext(),
-                        new Locale(testFilenameSuffix));
+    private void clearHistory(final Locale locale) {
+        final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary(
+                mContext, locale);
         dict.waitAllTasksForTests();
         dict.clearAndFlushDictionary();
         dict.close();
@@ -113,37 +112,35 @@
 
     /**
      * Shut down executer and wait until all operations of user history are done.
-     * @param testFilenameSuffix file name suffix used for testing.
+     * @param locale dummy locale for testing.
      */
-    private void waitForWriting(final String testFilenameSuffix) {
-        final UserHistoryDictionary dict =
-                PersonalizationHelper.getUserHistoryDictionary(getContext(),
-                        new Locale(testFilenameSuffix));
+    private void waitForWriting(final Locale locale) {
+        final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary(
+                mContext, locale);
         dict.waitAllTasksForTests();
     }
 
     public void testRandomWords() {
         Log.d(TAG, "This test can be used for profiling.");
         Log.d(TAG, "Usage: please set UserHistoryDictionary.PROFILE_SAVE_RESTORE to true.");
-        final String testFilenameSuffix = "test_random_words" + System.currentTimeMillis();
-        final String fileName = UserHistoryDictionary.NAME + "." + testFilenameSuffix
-                + ExpandableBinaryDictionary.DICT_FILE_EXTENSION;
+        final Locale dummyLocale = new Locale("test_random_words" + System.currentTimeMillis());
+        final String dictName = ExpandableBinaryDictionary.getDictName(
+                UserHistoryDictionary.NAME, dummyLocale, null /* dictFile */);
+        final File dictFile = ExpandableBinaryDictionary.getDictFile(
+                mContext, dictName, null /* dictFile */);
 
         final int numberOfWords = 1000;
         final Random random = new Random(123456);
 
         try {
-            clearHistory(testFilenameSuffix);
-            addAndWriteRandomWords(testFilenameSuffix, numberOfWords, random,
+            clearHistory(dummyLocale);
+            addAndWriteRandomWords(dummyLocale, numberOfWords, random,
                     true /* checksContents */);
         } finally {
             Log.d(TAG, "waiting for writing ...");
-            waitForWriting(testFilenameSuffix);
-            final File dictFile = new File(getContext().getFilesDir(), fileName);
-            if (dictFile != null) {
-                assertTrue(dictFile.exists());
-                dictFile.delete();
-            }
+            waitForWriting(dummyLocale);
+            assertTrue("check exisiting of " + dictFile, dictFile.exists());
+            FileUtils.deleteRecursively(dictFile);
         }
     }
 
@@ -153,17 +150,18 @@
         final int numberOfWordsInsertedForEachLanguageSwitch = 100;
 
         final File dictFiles[] = new File[numberOfLanguages];
-        final String testFilenameSuffixes[] = new String[numberOfLanguages];
+        final Locale dummyLocales[] = new Locale[numberOfLanguages];
         try {
             final Random random = new Random(123456);
 
             // Create filename suffixes for this test.
             for (int i = 0; i < numberOfLanguages; i++) {
-                testFilenameSuffixes[i] = "test_switching_languages" + i;
-                final String fileName = UserHistoryDictionary.NAME + "." + testFilenameSuffixes[i]
-                        + ExpandableBinaryDictionary.DICT_FILE_EXTENSION;
-                dictFiles[i] = new File(getContext().getFilesDir(), fileName);
-                clearHistory(testFilenameSuffixes[i]);
+                dummyLocales[i] = new Locale("test_switching_languages" + i);
+                final String dictName = ExpandableBinaryDictionary.getDictName(
+                        UserHistoryDictionary.NAME, dummyLocales[i], null /* dictFile */);
+                dictFiles[i] = ExpandableBinaryDictionary.getDictFile(
+                        mContext, dictName, null /* dictFile */);
+                clearHistory(dummyLocales[i]);
             }
 
             final long start = System.currentTimeMillis();
@@ -171,7 +169,7 @@
             for (int i = 0; i < numberOfLanguageSwitching; i++) {
                 final int index = i % numberOfLanguages;
                 // Switch languages to testFilenameSuffixes[index].
-                addAndWriteRandomWords(testFilenameSuffixes[index],
+                addAndWriteRandomWords(dummyLocales[index],
                         numberOfWordsInsertedForEachLanguageSwitch, random,
                         false /* checksContents */);
             }
@@ -182,36 +180,31 @@
         } finally {
             Log.d(TAG, "waiting for writing ...");
             for (int i = 0; i < numberOfLanguages; i++) {
-                waitForWriting(testFilenameSuffixes[i]);
+                waitForWriting(dummyLocales[i]);
             }
-            for (final File file : dictFiles) {
-                if (file != null) {
-                    assertTrue(file.exists());
-                    file.delete();
-                }
+            for (final File dictFile : dictFiles) {
+                assertTrue("check exisiting of " + dictFile, dictFile.exists());
+                FileUtils.deleteRecursively(dictFile);
             }
         }
     }
 
     public void testAddManyWords() {
-        final String testFilenameSuffix = "test_random_words" + System.currentTimeMillis();
+        final Locale dummyLocale = new Locale("test_random_words" + System.currentTimeMillis());
+        final String dictName = ExpandableBinaryDictionary.getDictName(
+                UserHistoryDictionary.NAME, dummyLocale, null /* dictFile */);
+        final File dictFile = ExpandableBinaryDictionary.getDictFile(
+                mContext, dictName, null /* dictFile */);
         final int numberOfWords = 10000;
         final Random random = new Random(123456);
-        clearHistory(testFilenameSuffix);
+        clearHistory(dummyLocale);
         try {
-            addAndWriteRandomWords(testFilenameSuffix, numberOfWords, random,
-                    true /* checksContents */);
+            addAndWriteRandomWords(dummyLocale, numberOfWords, random, true /* checksContents */);
         } finally {
             Log.d(TAG, "waiting for writing ...");
-            waitForWriting(testFilenameSuffix);
-            final String fileName = UserHistoryDictionary.NAME + "." + testFilenameSuffix
-                    + ExpandableBinaryDictionary.DICT_FILE_EXTENSION;
-            final File dictFile = new File(getContext().getFilesDir(), fileName);
-            if (dictFile != null) {
-                assertTrue(dictFile.exists());
-                dictFile.delete();
-            }
+            waitForWriting(dummyLocale);
+            assertTrue("check exisiting of " + dictFile, dictFile.exists());
+            FileUtils.deleteRecursively(dictFile);
         }
     }
-
 }
diff --git a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
index eadeb1e..f56cfd9 100644
--- a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
+++ b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
@@ -63,6 +63,7 @@
     }
 
     private static final String[] NAMES = {
+    //  /* index:histogram */ "name",
         /* @NAMES@ */
     };
 
diff --git a/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml
index f8050a3..9b0a059 100644
--- a/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml
@@ -95,18 +95,28 @@
          http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
     <!-- U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
          U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS -->
-    <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!4,&#xFD3E;|&#xFD3F;,&lt;|&gt;,{|},[|]</string>
-    <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!4,&#xFD3F;|&#xFD3E;,&gt;|&lt;,}|{,]|[</string>
+    <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!4,&#xFD3E;|&#xFD3F;,!text/keyspecs_for_left_parenthesis_more_keys</string>
+    <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!4,&#xFD3F;|&#xFD3E;,!text/keyspecs_for_right_parenthesis_more_keys</string>
     <!-- U+2264: "≤" LESS-THAN OR EQUAL TO
          U+2265: "≥" GREATER-THAN EQUAL TO
          U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
          U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -->
-    <string name="more_keys_for_less_than">!fixedColumnOrder!3,&#x2039;|&#x203A;,&#x2264;|&#x2265;,&#x00AB;|&#x00BB;</string>
-    <string name="more_keys_for_greater_than">!fixedColumnOrder!3,&#x203A;|&#x2039;,&#x2265;|&#x2264;,&#x00BB;|&#x00AB;</string>
-    <string name="single_angle_quotes">!text/single_laqm_raqm_rtl</string>
-    <string name="double_angle_quotes">!text/double_laqm_raqm_rtl</string>
+    <string name="keyspec_left_parenthesis">(|)</string>
+    <string name="keyspec_right_parenthesis">)|(</string>
+    <string name="keyspec_left_square_bracket">[|]</string>
+    <string name="keyspec_right_square_bracket">]|[</string>
+    <string name="keyspec_left_curly_bracket">{|}</string>
+    <string name="keyspec_right_curly_bracket">}|{</string>
+    <string name="keyspec_less_than">&lt;|&gt;</string>
+    <string name="keyspec_greater_than">&gt;|&lt;</string>
+    <string name="keyspec_less_than_equal">&#x2264;|&#x2265;</string>
+    <string name="keyspec_greater_than_equal">&#x2265;|&#x2264;</string>
+    <string name="keyspec_left_double_angle_quote">&#x00AB;|&#x00BB;</string>
+    <string name="keyspec_right_double_angle_quote">&#x00BB;|&#x00AB;</string>
+    <string name="keyspec_left_single_angle_quote">&#x2039;|&#x203A;</string>
+    <string name="keyspec_right_single_angle_quote">&#x203A;|&#x2039;</string>
     <!-- U+0655: "ٕ" ARABIC HAMZA BELOW
          U+0654: "ٔ" ARABIC HAMZA ABOVE
          U+0652: "ْ" ARABIC SUKUN
diff --git a/tools/make-keyboard-text/res/values-fa/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-fa/donottranslate-more-keys.xml
index a053a88..3f12784 100644
--- a/tools/make-keyboard-text/res/values-fa/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-fa/donottranslate-more-keys.xml
@@ -86,13 +86,13 @@
          U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
     <string name="keylabel_for_tablet_comma">"&#x060C;"</string>
     <string name="keyhintlabel_for_tablet_comma">"&#x061F;"</string>
-    <string name="more_keys_for_tablet_comma">"!fixedColumnOrder!4,:,!,&#x061F;,&#x061B;,-,/,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;"</string>
+    <string name="more_keys_for_tablet_comma">"!fixedColumnOrder!4,:,!,&#x061F;,&#x061B;,-,/,!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote"</string>
     <!-- U+FDFC: "﷼" RIAL SIGN -->
     <string name="keylabel_for_currency">&#xFDFC;</string>
     <!-- U+061F: "؟" ARABIC QUESTION MARK
          U+060C: "،" ARABIC COMMA
          U+061B: "؛" ARABIC SEMICOLON -->
-    <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,\",\',#,-,:,!,&#x060C;,&#x061F;,\@,&amp;,\\%,+,&#x061B;,/,(|),)|("</string>
+    <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,\",\',#,-,:,!,&#x060C;,&#x061F;,\@,&amp;,\\%,+,&#x061B;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis"</string>
     <!-- U+266A: "♪" EIGHTH NOTE -->
     <string name="more_keys_for_bullet">&#x266A;</string>
     <!-- U+2605: "★" BLACK STAR
@@ -102,18 +102,30 @@
          http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
     <!-- U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
          U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS -->
-    <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!4,&#xFD3E;|&#xFD3F;,&lt;|&gt;,{|},[|]</string>
-    <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!4,&#xFD3F;|&#xFD3E;,&gt;|&lt;,}|{,]|[</string>
+    <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!4,&#xFD3E;|&#xFD3F;,!text/keyspecs_for_left_parenthesis_more_keys</string>
+    <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!4,&#xFD3F;|&#xFD3E;,!text/keyspecs_for_right_parenthesis_more_keys</string>
     <!-- U+2264: "≤" LESS-THAN OR EQUAL TO
          U+2265: "≥" GREATER-THAN EQUAL TO
          U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
          U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -->
-    <string name="more_keys_for_less_than">!fixedColumnOrder!3,&#x2039;|&#x203A;,&#x2264;|&#x2265;,&lt;|&gt;</string>
-    <string name="more_keys_for_greater_than">!fixedColumnOrder!3,&#x203A;|&#x2039;,&#x2265;|&#x2264;,&gt;|&lt;</string>
-    <string name="single_angle_quotes">!text/single_laqm_raqm_rtl</string>
-    <string name="double_angle_quotes">!text/double_laqm_raqm_rtl</string>
+    <string name="more_keys_for_less_than">!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote;,!text/keyspec_less_than_equal;,!text/keyspec_less_than</string>
+    <string name="more_keys_for_greater_than">!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote;,!text/keyspec_greater_than_equal;,!text/keyspec_greater_than</string>
+    <string name="keyspec_left_parenthesis">(|)</string>
+    <string name="keyspec_right_parenthesis">)|(</string>
+    <string name="keyspec_left_square_bracket">[|]</string>
+    <string name="keyspec_right_square_bracket">]|[</string>
+    <string name="keyspec_left_curly_bracket">{|}</string>
+    <string name="keyspec_right_curly_bracket">}|{</string>
+    <string name="keyspec_less_than">&lt;|&gt;</string>
+    <string name="keyspec_greater_than">&gt;|&lt;</string>
+    <string name="keyspec_less_than_equal">&#x2264;|&#x2265;</string>
+    <string name="keyspec_greater_than_equal">&#x2265;|&#x2264;</string>
+    <string name="keyspec_left_double_angle_quote">&#x00AB;|&#x00BB;</string>
+    <string name="keyspec_right_double_angle_quote">&#x00BB;|&#x00AB;</string>
+    <string name="keyspec_left_single_angle_quote">&#x2039;|&#x203A;</string>
+    <string name="keyspec_right_single_angle_quote">&#x203A;|&#x2039;</string>
     <!-- U+0655: "ٕ" ARABIC HAMZA BELOW
          U+0652: "ْ" ARABIC SUKUN
          U+0651: "ّ" ARABIC SHADDA
diff --git a/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml
index 73fe927..a17dc10 100644
--- a/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml
@@ -18,6 +18,11 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Label for "switch to alphabetic" key.
+         U+0531: "Ա" ARMENIAN CAPITAL LETTER AYB
+         U+0532: "Բ" ARMENIAN CAPITAL LETTER BEN
+         U+0533: "Գ" ARMENIAN CAPITAL LETTER GIM -->
+    <string name="label_to_alpha_key">&#x0531;&#x0532;&#x0533;</string>
     <!-- U+058A: "֊" ARMENIAN HYPHEN -->
     <!-- U+055C: "՜" ARMENIAN EXCLAMATION MARK -->
     <!-- U+055D: "՝" ARMENIAN COMMA -->
diff --git a/tools/make-keyboard-text/res/values-iw/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-iw/donottranslate-more-keys.xml
index e231a39..8314ae5 100644
--- a/tools/make-keyboard-text/res/values-iw/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-iw/donottranslate-more-keys.xml
@@ -28,31 +28,30 @@
     <!-- U+00B1: "±" PLUS-MINUS SIGN
          U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN -->
     <string name="more_keys_for_plus">&#x00B1;,&#xFB29;</string>
-    <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,;,/,(|),)|(,#,!,\\,,\?,&amp;,\\%,+,\",-,:,',\@"</string>
-    <string name="more_keys_for_tablet_punctuation">"!fixedColumnOrder!7,;,/,(|),)|(,#,',\\,,&amp;,\\%,+,\",-,:,\@"</string>
     <!-- The all letters need to be mirrored are found at
          http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
-    <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!3,&lt;|&gt;,{|},[|]</string>
-    <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!3,&gt;|&lt;,}|{,]|[</string>
     <!-- U+2264: "≤" LESS-THAN OR EQUAL TO
          U+2265: "≥" GREATER-THAN EQUAL TO
          U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
          U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -->
-    <string name="more_keys_for_less_than">!fixedColumnOrder!3,&#x2039;|&#x203A;,&#x2264;|&#x2265;,&#x00AB;|&#x00BB;</string>
-    <string name="more_keys_for_greater_than">!fixedColumnOrder!3,&#x203A;|&#x2039;,&#x2265;|&#x2264;,&#x00BB;|&#x00AB;</string>
-    <!-- The following characters don't need BIDI mirroring.
-         U+2018: "‘" LEFT SINGLE QUOTATION MARK
-         U+2019: "’" RIGHT SINGLE QUOTATION MARK
-         U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-         U+201C: "“" LEFT DOUBLE QUOTATION MARK
-         U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-         U+201E: "„" DOUBLE LOW-9 QUOTATION MARK -->
-    <string name="single_quotes">&#x2018;,&#x2019;,&#x201A;</string>
-    <string name="double_quotes">&#x201C;,&#x201D;,&#x201E;</string>
-    <string name="single_angle_quotes">!text/single_laqm_raqm_rtl</string>
-    <string name="double_angle_quotes">!text/double_laqm_raqm_rtl</string>
+    <string name="keyspec_left_parenthesis">(|)</string>
+    <string name="keyspec_right_parenthesis">)|(</string>
+    <string name="keyspec_left_square_bracket">[|]</string>
+    <string name="keyspec_right_square_bracket">]|[</string>
+    <string name="keyspec_left_curly_bracket">{|}</string>
+    <string name="keyspec_right_curly_bracket">}|{</string>
+    <string name="keyspec_less_than">&lt;|&gt;</string>
+    <string name="keyspec_greater_than">&gt;|&lt;</string>
+    <string name="keyspec_less_than_equal">&#x2264;|&#x2265;</string>
+    <string name="keyspec_greater_than_equal">&#x2265;|&#x2264;</string>
+    <string name="keyspec_left_double_angle_quote">&#x00AB;|&#x00BB;</string>
+    <string name="keyspec_right_double_angle_quote">&#x00BB;|&#x00AB;</string>
+    <string name="keyspec_left_single_angle_quote">&#x2039;|&#x203A;</string>
+    <string name="keyspec_right_single_angle_quote">&#x203A;|&#x2039;</string>
+    <string name="single_quotes">!text/single_rqm_9qm</string>
+    <string name="double_quotes">!text/double_rqm_9qm</string>
     <!-- U+20AA: "₪" NEW SHEQEL SIGN -->
     <string name="keylabel_for_currency">&#x20AA;</string>
 </resources>
diff --git a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
index 7f1c803..8d3d61c 100644
--- a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
@@ -83,8 +83,8 @@
     <string name="more_keys_for_currency_dollar">&#x00A2;,&#x00A3;,&#x20AC;,&#x00A5;,&#x20B1;</string>
     <string name="keylabel_for_currency">$</string>
     <string name="more_keys_for_currency">$,&#x00A2;,&#x20AC;,&#x00A3;,&#x00A5;,&#x20B1;</string>
-    <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,;,/,(,),#,!,\\,,\?,&amp;,\\%,+,\",-,:,',\@"</string>
-    <string name="more_keys_for_tablet_punctuation">"!fixedColumnOrder!7,;,/,(,),#,',\\,,&amp;,\\%,+,\",-,:,\@"</string>
+    <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,#,!,\\,,\?,&amp;,\\%,+,\",-,:,',\@"</string>
+    <string name="more_keys_for_tablet_punctuation">"!fixedColumnOrder!7,;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,#,',\\,,&amp;,\\%,+,\",-,:,\@"</string>
     <!-- U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE -->
     <string name="keylabel_for_spanish_row2_10">&#x00F1;</string>
     <!-- U+2020: "†" DAGGER
@@ -99,18 +99,10 @@
     <string name="more_keys_for_bullet">&#x266A;,&#x2665;,&#x2660;,&#x2666;,&#x2663;</string>
     <!-- U+00B1: "±" PLUS-MINUS SIGN -->
     <string name="more_keys_for_plus">&#x00B1;</string>
-    <!-- The all letters need to be mirrored are found at
-         http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
-    <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!3,&lt;,{,[</string>
-    <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!3,&gt;,},]</string>
-    <!-- U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-         U+2264: "≤" LESS-THAN OR EQUAL TO
-         U+2265: "≥" GREATER-THAN EQUAL TO
-         U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-         U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
-    <string name="more_keys_for_less_than">!fixedColumnOrder!3,&#x2039;,&#x2264;,&#x00AB;</string>
-    <string name="more_keys_for_greater_than">!fixedColumnOrder!3,&#x203A;,&#x2265;,&#x00BB;</string>
+    <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!3,!text/keyspecs_for_left_parenthesis_more_keys</string>
+    <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!3,!text/keyspecs_for_right_parenthesis_more_keys</string>
+    <string name="more_keys_for_less_than">!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_left_double_angle_quote</string>
+    <string name="more_keys_for_greater_than">!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_right_double_angle_quote</string>
     <string name="more_keys_for_arabic_diacritics"></string>
     <string name="keylabel_for_symbols_1">1</string>
     <string name="keylabel_for_symbols_2">2</string>
@@ -162,6 +154,28 @@
     <!-- U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
          U+2205: "∅" EMPTY SET -->
     <string name="more_keys_for_symbols_0">&#x207F;,&#x2205;</string>
+    <!-- The all letters need to be mirrored are found at
+         http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
+         U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+         U+2264: "≤" LESS-THAN OR EQUAL TO
+         U+2265: "≥" GREATER-THAN EQUAL TO
+         U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+         U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
+    <string name="keyspec_left_parenthesis">(</string>
+    <string name="keyspec_right_parenthesis">)</string>
+    <string name="keyspec_left_square_bracket">[</string>
+    <string name="keyspec_right_square_bracket">]</string>
+    <string name="keyspec_left_curly_bracket">{</string>
+    <string name="keyspec_right_curly_bracket">}</string>
+    <string name="keyspec_less_than">&lt;</string>
+    <string name="keyspec_greater_than">&gt;</string>
+    <string name="keyspec_less_than_equal">&#x2264;</string>
+    <string name="keyspec_greater_than_equal">&#x2265;</string>
+    <string name="keyspec_left_double_angle_quote">&#x00AB;</string>
+    <string name="keyspec_right_double_angle_quote">&#x00BB;</string>
+    <string name="keyspec_left_single_angle_quote">&#x2039;</string>
+    <string name="keyspec_right_single_angle_quote">&#x203A;</string>
     <!-- Comma key -->
     <string name="keylabel_for_comma">,</string>
     <string name="more_keys_for_comma"></string>
@@ -215,11 +229,9 @@
     <string name="keylabel_for_popular_domain">".com"</string>
     <!-- popular web domains for the locale - most popular, displayed on the keyboard -->
     <string name="more_keys_for_popular_domain">"!hasLabels!,.net,.org,.gov,.edu"</string>
-    <!-- U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-         U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-         U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-         The following characters don't need BIDI mirroring.
+    <string name="keyspecs_for_left_parenthesis_more_keys">!text/keyspec_less_than,!text/keyspec_left_curly_bracket,!text/keyspec_left_square_bracket</string>
+    <string name="keyspecs_for_right_parenthesis_more_keys">!text/keyspec_greater_than,!text/keyspec_right_curly_bracket,!text/keyspec_right_square_bracket</string>
+    <!-- The following characters don't need BIDI mirroring.
          U+2018: "‘" LEFT SINGLE QUOTATION MARK
          U+2019: "’" RIGHT SINGLE QUOTATION MARK
          U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
@@ -229,28 +241,27 @@
     <!-- Abbreviations are:
          laqm: LEFT-POINTING ANGLE QUOTATION MARK
          raqm: RIGHT-POINTING ANGLE QUOTATION MARK
-         rtl: Right-To-Left script order
          lqm: LEFT QUOTATION MARK
          rqm: RIGHT QUOTATION MARK
          9qm: LOW-9 QUOTATION MARK -->
     <!--  The following each quotation mark pair consist of
             <opening quotation mark>, <closing quotation mark>
           and is named after (single|double)_<opening quotation mark>_<closing quotation mark>. -->
-    <string name="single_laqm_raqm">&#x2039;,&#x203A;</string>
-    <string name="single_laqm_raqm_rtl">&#x2039;|&#x203A;,&#x203A;|&#x2039;</string>
-    <string name="single_raqm_laqm">&#x203A;,&#x2039;</string>
-    <string name="double_laqm_raqm">&#x00AB;,&#x00BB;</string>
-    <string name="double_laqm_raqm_rtl">&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
-    <string name="double_raqm_laqm">&#x00BB;,&#x00AB;</string>
+    <string name="single_laqm_raqm">!text/keyspec_left_single_angle_quote,!text/keyspec_right_single_angle_quote</string>
+    <string name="single_raqm_laqm">!text/keyspec_right_single_angle_quote,!text/keyspec_left_single_angle_quote</string>
+    <string name="double_laqm_raqm">!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote</string>
+    <string name="double_raqm_laqm">!text/keyspec_right_double_angle_quote,!text/keyspec_left_double_angle_quote</string>
     <!-- The following each quotation mark triplet consists of
            <another quotation mark>, <opening quotation mark>, <closing quotation mark>
          and is named after (single|double)_<opening quotation mark>_<closing quotation mark>. -->
     <string name="single_lqm_rqm">&#x201A;,&#x2018;,&#x2019;</string>
     <string name="single_9qm_lqm">&#x2019;,&#x201A;,&#x2018;</string>
     <string name="single_9qm_rqm">&#x2018;,&#x201A;,&#x2019;</string>
+    <string name="single_rqm_9qm">&#x2018;,&#x2019;,&#x201A;</string>
     <string name="double_lqm_rqm">&#x201E;,&#x201C;,&#x201D;</string>
     <string name="double_9qm_lqm">&#x201D;,&#x201E;,&#x201C;</string>
     <string name="double_9qm_rqm">&#x201C;,&#x201E;,&#x201D;</string>
+    <string name="double_rqm_9qm">&#x201C;,&#x201D;,&#x201E;</string>
     <string name="more_keys_for_single_quote">!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes</string>
     <string name="more_keys_for_double_quote">!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes</string>
     <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes</string>
diff --git a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/ArrayInitializerFormatter.java b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/ArrayInitializerFormatter.java
index d2763e0..48bf801 100644
--- a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/ArrayInitializerFormatter.java
+++ b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/ArrayInitializerFormatter.java
@@ -22,17 +22,22 @@
     private final PrintStream mOut;
     private final int mMaxWidth;
     private final String mIndent;
+    // String resource names array; indexed by {@link #CurrentIndex} and
+    // {@link #mStartIndexOfBuffer}.
+    private final String[] mResourceNames;
 
     private int mCurrentIndex = 0;
-    private String mFixedElement;
+    private String mLastElement;
     private final StringBuilder mBuffer = new StringBuilder();
     private int mBufferedLen;
-    private int mBufferedIndex = Integer.MIN_VALUE;
+    private int mStartIndexOfBuffer = Integer.MIN_VALUE;
 
-    public ArrayInitializerFormatter(final PrintStream out, final int width, final String indent) {
+    public ArrayInitializerFormatter(final PrintStream out, final int width, final String indent,
+            final String[] resourceNames) {
         mOut = out;
         mMaxWidth = width - indent.length();
         mIndent = indent;
+        mResourceNames = resourceNames;
     }
 
     public int getCurrentIndex() {
@@ -44,20 +49,24 @@
             return;
         }
         final int lastIndex = mCurrentIndex - 1;
-        if (mBufferedIndex == lastIndex) {
-            mOut.format("%s/* %d */ %s\n", mIndent, mBufferedIndex, mBuffer);
-        } else if (mBufferedIndex == lastIndex - 1) {
-            final String[] elements = mBuffer.toString().split(" ");
-            mOut.format("%s/* %d */ %s\n"
-                    + "%s/* %d */ %s\n",
-                    mIndent, mBufferedIndex, elements[0],
-                    mIndent, lastIndex, elements[1]);
+        if (mStartIndexOfBuffer == lastIndex) {
+            mOut.format("%s/* %s */ %s\n",
+                    mIndent, mResourceNames[mStartIndexOfBuffer], mBuffer);
+        } else if (mStartIndexOfBuffer == lastIndex - 1) {
+            final String startElement = mBuffer.toString()
+                    .substring(0, mBuffer.length() - mLastElement.length())
+                    .trim();
+            mOut.format("%s/* %s */ %s\n"
+                    + "%s/* %s */ %s\n",
+                    mIndent, mResourceNames[mStartIndexOfBuffer], startElement,
+                    mIndent, mResourceNames[lastIndex], mLastElement);
         } else {
-            mOut.format("%s/* %d~ */\n"
+            mOut.format("%s/* %s ~ */\n"
                     + "%s%s\n"
-                    + "%s/* ~%d */\n", mIndent, mBufferedIndex,
+                    + "%s/* ~ %s */\n",
+                    mIndent, mResourceNames[mStartIndexOfBuffer],
                     mIndent, mBuffer,
-                    mIndent, lastIndex);
+                    mIndent, mResourceNames[lastIndex]);
         }
         mBuffer.setLength(0);
         mBufferedLen = 0;
@@ -66,20 +75,22 @@
     public void outCommentLines(final String lines) {
         flush();
         mOut.print(lines);
-        mFixedElement = null;
+        mLastElement = null;
     }
 
     public void outElement(final String element) {
-        if (!element.equals(mFixedElement)) {
+        if (!element.equals(mLastElement)) {
             flush();
-            mBufferedIndex = mCurrentIndex;
+            mStartIndexOfBuffer = mCurrentIndex;
         }
         final int nextLen = mBufferedLen + " ".length() + element.length();
         if (mBufferedLen != 0 && nextLen < mMaxWidth) {
+            // Element can fit in the current line.
             mBuffer.append(' ');
             mBuffer.append(element);
             mBufferedLen = nextLen;
         } else {
+            // Element should be on the next line.
             if (mBufferedLen != 0) {
                 mBuffer.append('\n');
                 mBuffer.append(mIndent);
@@ -88,6 +99,6 @@
             mBufferedLen = element.length();
         }
         mCurrentIndex++;
-        mFixedElement = element;
+        mLastElement = element;
     }
 }
diff --git a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
index 97a12d7..872ef19 100644
--- a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
+++ b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
@@ -25,6 +25,7 @@
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.jar.JarFile;
@@ -47,8 +48,19 @@
     // Language to string resources map.
     private final HashMap<String, StringResourceMap> mResourcesMap =
             new HashMap<String, StringResourceMap>();
-    // Name to id map.
-    private final HashMap<String, Integer> mNameToIdMap = new HashMap<String,Integer>();
+    // Sorted languages list. The language is taken from string resource directories
+    // (values-<language>/) or {@link #DEFAULT_LANGUAGE_NAME} for the default string resource
+    // directory (values/).
+    private final ArrayList<String> mSortedLanguagesList = new ArrayList<String>();
+    // Default string resources map.
+    private final StringResourceMap mDefaultResourceMap;
+    // Histogram of string resource names. This is used to sort {@link #mSortedResourceNames}.
+    private final HashMap<String, Integer> mNameHistogram = new HashMap<String, Integer>();
+    // Sorted string resource names array; Descending order of histogram count.
+    // The string resource name is specified as an attribute "name" in string resource files.
+    // The string resource can be accessed by specifying name "!text/<name>"
+    // via {@link KeyboardTextsSet#getText(String)}.
+    private final String[] mSortedResourceNames;
 
     public MoreKeysResources(final JarFile jar) {
         mJar = jar;
@@ -65,6 +77,45 @@
                 close(stream);
             }
         }
+        mDefaultResourceMap = mResourcesMap.get(DEFAULT_LANGUAGE_NAME);
+        mSortedLanguagesList.addAll(mResourcesMap.keySet());
+        Collections.sort(mSortedLanguagesList);
+
+        // Initialize name histogram and names list.
+        final HashMap<String, Integer> nameHistogram = mNameHistogram;
+        final ArrayList<String> resourceNamesList = new ArrayList<String>();
+        for (final StringResource res : mDefaultResourceMap.getResources()) {
+            nameHistogram.put(res.mName, 0); // Initialize histogram value.
+            resourceNamesList.add(res.mName);
+        }
+        // Make name histogram.
+        for (final String language : mResourcesMap.keySet()) {
+            final StringResourceMap resMap = mResourcesMap.get(language);
+            if (resMap == mDefaultResourceMap) continue;
+            for (final StringResource res : resMap.getResources()) {
+                if (!mDefaultResourceMap.contains(res.mName)) {
+                    throw new RuntimeException(res.mName + " in " + language
+                            + " doesn't have default resource");
+                }
+                final int histogramValue = nameHistogram.get(res.mName);
+                nameHistogram.put(res.mName, histogramValue + 1);
+            }
+        }
+        // Sort names list.
+        Collections.sort(resourceNamesList, new Comparator<String>() {
+            @Override
+            public int compare(final String leftName, final String rightName) {
+                final int leftCount = nameHistogram.get(leftName);
+                final int rightCount = nameHistogram.get(rightName);
+                // Descending order of histogram count.
+                if (leftCount > rightCount) return -1;
+                if (leftCount < rightCount) return 1;
+                // TODO: Add further criteria to order the same histogram value names to be able to
+                // minimize footprints of string resources arrays.
+                return 0;
+            }
+        });
+        mSortedResourceNames = resourceNamesList.toArray(new String[resourceNamesList.size()]);
     }
 
     private static String getLanguageFromResDir(final String dirName) {
@@ -132,19 +183,17 @@
     }
 
     private void dumpNames(final PrintStream out) {
-        final StringResourceMap defaultResMap = mResourcesMap.get(DEFAULT_LANGUAGE_NAME);
-        int id = 0;
-        for (final StringResource res : defaultResMap.getResources()) {
-            out.format("        /* %2d */ \"%s\",\n", id, res.mName);
-            mNameToIdMap.put(res.mName, id);
-            id++;
+        final int namesCount = mSortedResourceNames.length;
+        for (int index = 0; index < namesCount; index++) {
+            final String name = mSortedResourceNames[index];
+            final int histogramValue = mNameHistogram.get(name);
+            out.format("        /* %3d:%2d */ \"%s\",\n", index, histogramValue, name);
         }
     }
 
     private void dumpDefaultTexts(final PrintStream out) {
-        final StringResourceMap defaultResMap = mResourcesMap.get(DEFAULT_LANGUAGE_NAME);
-        final int outputArraySize = dumpTextsInternal(out, defaultResMap, defaultResMap);
-        defaultResMap.setOutputArraySize(outputArraySize);
+        final int outputArraySize = dumpTextsInternal(out, mDefaultResourceMap);
+        mDefaultResourceMap.setOutputArraySize(outputArraySize);
     }
 
     private static String getArrayNameForLanguage(final String language) {
@@ -152,35 +201,20 @@
     }
 
     private void dumpTexts(final PrintStream out) {
-        final StringResourceMap defaultResMap = mResourcesMap.get(DEFAULT_LANGUAGE_NAME);
-        final ArrayList<String> allLanguages = new ArrayList<String>();
-        allLanguages.addAll(mResourcesMap.keySet());
-        Collections.sort(allLanguages);
-        for (final String language : allLanguages) {
-            if (language.equals(DEFAULT_LANGUAGE_NAME)) {
-                continue;
-            }
+        for (final String language : mSortedLanguagesList) {
+            final StringResourceMap resMap = mResourcesMap.get(language);
+            if (resMap == mDefaultResourceMap) continue;
             out.format("    /* Language %s: %s */\n", language, getLanguageDisplayName(language));
             out.format("    private static final String[] " + getArrayNameForLanguage(language)
                     + " = {\n");
-            final StringResourceMap resMap = mResourcesMap.get(language);
-            for (final StringResource res : resMap.getResources()) {
-                if (!defaultResMap.contains(res.mName)) {
-                    throw new RuntimeException(res.mName + " in " + language
-                            + " doesn't have default resource");
-                }
-            }
-            final int outputArraySize = dumpTextsInternal(out, resMap, defaultResMap);
+            final int outputArraySize = dumpTextsInternal(out, resMap);
             resMap.setOutputArraySize(outputArraySize);
             out.format("    };\n\n");
         }
     }
 
     private void dumpLanguageMap(final PrintStream out) {
-        final ArrayList<String> allLanguages = new ArrayList<String>();
-        allLanguages.addAll(mResourcesMap.keySet());
-        Collections.sort(allLanguages);
-        for (final String language : allLanguages) {
+        for (final String language : mSortedLanguagesList) {
             final StringResourceMap resMap = mResourcesMap.get(language);
             final Locale locale = LocaleUtils.constructLocaleFromString(language);
             final String languageKeyToDump = locale.getCountry().isEmpty()
@@ -201,15 +235,17 @@
         return locale.getDisplayName(Locale.ENGLISH);
     }
 
-    private static int dumpTextsInternal(final PrintStream out, final StringResourceMap resMap,
-            final StringResourceMap defaultResMap) {
+    private int dumpTextsInternal(final PrintStream out, final StringResourceMap resMap) {
         final ArrayInitializerFormatter formatter =
-                new ArrayInitializerFormatter(out, 100, "        ");
+                new ArrayInitializerFormatter(out, 100, "        ", mSortedResourceNames);
         int outputArraySize = 0;
         boolean successiveNull = false;
-        for (final StringResource defaultRes : defaultResMap.getResources()) {
-            if (resMap.contains(defaultRes.mName)) {
-                final StringResource res = resMap.get(defaultRes.mName);
+        final int namesCount = mSortedResourceNames.length;
+        for (int index = 0; index < namesCount; index++) {
+            final String name = mSortedResourceNames[index];
+            final StringResource res = resMap.get(name);
+            if (res != null) {
+                // TODO: Check whether the resource value is equal to the default.
                 if (res.mComment != null) {
                     formatter.outCommentLines(addPrefix("        // ", res. mComment));
                 }
@@ -270,7 +306,7 @@
         return t;
     }
 
-    private static void close(Closeable stream) {
+    private static void close(final Closeable stream) {
         try {
             if (stream != null) {
                 stream.close();