Merge "[Rlog1] Track time of log statements"
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 5bfd9d9..18e63f3 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -44,10 +44,8 @@
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Verstek"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"Stel kontakname voor"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Gebruik name van kontakte vir voorstelle en korreksies"</string>
-    <!-- no translation found for use_double_space_period (8781529969425082860) -->
-    <skip />
-    <!-- no translation found for use_double_space_period_summary (6532892187247952799) -->
-    <skip />
+    <string name="use_double_space_period" msgid="8781529969425082860">"Dubbelspasie-punt"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dubbeltik op spasiebalk voeg \'n punt in, gevolg deur \'n spasie"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Outohoofletters"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Die eerste woord van elke sin moet met \'n hoofletter begin"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Voeg woordeboeke by"</string>
@@ -76,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Vorige"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Klaar"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Stuur"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Laat wag"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Wag"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Koppel \'n kopstuk om te hoor hoe wagwoordsleutels hardop gesê word."</string>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
index 9794d2e..4f66a16 100644
--- a/java/res/values-am/strings.xml
+++ b/java/res/values-am/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"ቀዳሚ"</string>
     <string name="label_done_key" msgid="2441578748772529288">"ተከናውኗል"</string>
     <string name="label_send_key" msgid="2815056534433717444">" ይላኩ"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"ላፍታ አቁም"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"ቆይ"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"የይለፍቃል ቁልፎች ጮክ በለው ሲነገሩ ለመስማት የጆሮ ማዳመጫ ሰካ::"</string>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index f4897a8..a3877ed 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -44,10 +44,8 @@
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"افتراضي"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"اقتراح أسماء جهات الاتصال"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"استخدام الأسماء من جهات الاتصال للاقتراحات والتصحيحات"</string>
-    <!-- no translation found for use_double_space_period (8781529969425082860) -->
-    <skip />
-    <!-- no translation found for use_double_space_period_summary (6532892187247952799) -->
-    <skip />
+    <string name="use_double_space_period" msgid="8781529969425082860">"نقطة المسافة المزدوجة"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"يؤدي النقر نقرًا مزدوجًا على مفتاح المسافة إلى إدخال نقطة متبوعة بمسافة"</string>
     <string name="auto_cap" msgid="1719746674854628252">"أحرف كبيرة تلقائيًا"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"كتابة الحرف الأول من كل جملة بحرف كبير."</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"القواميس الإضافية"</string>
@@ -76,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"السابق"</string>
     <string name="label_done_key" msgid="2441578748772529288">"تم"</string>
     <string name="label_send_key" msgid="2815056534433717444">"إرسال"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"أ ب ج"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"٣٢١؟"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"٣٢١"</string>
     <string name="label_pause_key" msgid="181098308428035340">"توقف مؤقت"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"انتظار"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"يمكنك توصيل سماعة رأس لسماع مفاتيح كلمة المرور منطوقة بصوت عالٍ."</string>
diff --git a/java/res/values-be/strings.xml b/java/res/values-be/strings.xml
index f5716b7..bf39694 100644
--- a/java/res/values-be/strings.xml
+++ b/java/res/values-be/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Назад"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Гатова"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Адправіць"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Паўза"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Чакае"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Каб праслухаць паролi, падключыце гарнiтуру."</string>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index 20d398e..27d3ac7 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Пред."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Изпращане"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Чака"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Включете слушалки, за да чуете клавишите за паролата на висок глас."</string>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index bf6122f..0182dd4 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Ant."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Fet"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Envia"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Connecta un auricular per escoltar les claus de la contrasenya en veu alta."</string>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index 9c80863..806ac12 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Před."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Odeslat"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Čekat"</string>
     <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>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index 6cb1050..4fbfe90 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Forr."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Udfør"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Send"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Vent"</string>
     <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>
diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml
index c844ec8..1fad9e7 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Zurück"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Fertig"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Senden"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Warten"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Schließen Sie ein Headset an, um das Passwort gesprochen zu hören."</string>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index 1ab64f9..2b99e7e 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -44,7 +44,7 @@
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Προεπιλογή"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"Πρόταση ονομάτων επαφών"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Χρησιμοποιήστε ονόματα από τις Επαφές για προτάσεις και διορθ."</string>
-    <string name="use_double_space_period" msgid="8781529969425082860">"Τελεία με διπλό πάτημα πλήκρου διαστ."</string>
+    <string name="use_double_space_period" msgid="8781529969425082860">"Τελεία με διπλό πάτημα πλήκτρ.διαστ."</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Το διπλό πάτημα του πλήκτρ.διαστ. εισάγει μια τελεία και ένα κενό"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Αυτόματη χρήση κεφαλαίων"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Χρήση κεφαλαίου στην πρώτη λέξη κάθε πρότασης"</string>
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Προηγ"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Τέλος"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Αποστολή"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ΑΒΓ"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Παύση"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Αναμ."</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Συνδέστε ένα σετ ακουστικών για να ακούσετε τα πλήκτρα του κωδικού πρόσβασης να εκφωνούνται δυνατά."</string>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index adfd9e3..652d5aa 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -76,9 +76,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Prev"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Done"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Send"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Wait"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Plug in a headset to hear password keys spoken aloud."</string>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index b430222..9e87970 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -44,8 +44,8 @@
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predeterminada"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sugerir nombres de contacto"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Usar nombres de los contactos para sugerencias y correcciones"</string>
-    <string name="use_double_space_period" msgid="8781529969425082860">"Doble espacio después de punto"</string>
-    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Si tocas dos veces la barra espaciadora, se inserta un punto seguido de un espacio."</string>
+    <string name="use_double_space_period" msgid="8781529969425082860">"Punto y doble espacio"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Tocar dos veces la barra espaciadora inserta un punto y espacio."</string>
     <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Escribe con mayúscula la primera palabra de cada frase"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Diccionarios complementarios"</string>
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Ant."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Listo"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Enchufa tus auriculares para escuchar en voz alta qué teclas presionas al ingresar una contraseña."</string>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index 37aa2c8..24335e6 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -44,7 +44,7 @@
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predeterminado"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sugerir contactos"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizar nombres de contactos para sugerencias y correcciones"</string>
-    <string name="use_double_space_period" msgid="8781529969425082860">"Punto y doble espacio"</string>
+    <string name="use_double_space_period" msgid="8781529969425082860">"Punto y espacio"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Si tocas dos veces el espacio, se inserta un punto seguido de un espacio."</string>
     <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Poner la primera letra de cada palabra en mayúscula"</string>
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Anterior"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Ok"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Conecta un auricular para escuchar las contraseñas en voz alta."</string>
diff --git a/java/res/values-et/strings.xml b/java/res/values-et/strings.xml
index 35997b2..25dcdca 100644
--- a/java/res/values-et/strings.xml
+++ b/java/res/values-et/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Eelm."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Valmis"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Saada"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Peata"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Oota"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Ühendage peakomplekt, et kuulata paroole."</string>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index dbc32c5..d4a0e66 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -44,10 +44,8 @@
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"پیش‌فرض"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"پیشنهاد نام‌های مخاطب"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"برای پیشنهاد و تصحیح از نام مخاطبین استفاده شود"</string>
-    <!-- no translation found for use_double_space_period (8781529969425082860) -->
-    <skip />
-    <!-- no translation found for use_double_space_period_summary (6532892187247952799) -->
-    <skip />
+    <string name="use_double_space_period" msgid="8781529969425082860">"نقطه با دو فاصله"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"با دوبار ضربه روی دکمه فاصله نقطه با یک فاصله بعد آن درج می‌شود"</string>
     <string name="auto_cap" msgid="1719746674854628252">"بزرگ‌کردن خودکار حروف"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"بزرگ‌نویسی کلمه اول هر جمله"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"فرهنگ‌های لغت افزودنی"</string>
@@ -76,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"قبلی"</string>
     <string name="label_done_key" msgid="2441578748772529288">"انجام شد"</string>
     <string name="label_send_key" msgid="2815056534433717444">"ارسال"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"اب‌پ"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"۳۲۱؟"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"۳۲۱"</string>
     <string name="label_pause_key" msgid="181098308428035340">"توقف موقت"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"منتظر بمانید"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"برای شنیدن کلیدهای گذرواژه که با صدای بلند خوانده می‌شوند، از هدست استفاده کنید."</string>
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
index 8e444dc..36890d9 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Edell"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Valmis"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Lähetä"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Tauko"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Odota"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Liitä kuulokkeet kuullaksesi, mitä näppäimiä painat kirjoittaessasi salasanaa."</string>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index 182f39a..3f89532 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Préc."</string>
     <string name="label_done_key" msgid="2441578748772529288">"OK"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Envoi"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Délai"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Branchez des écouteurs pour entendre l\'énoncé à haute voix des touches lors de la saisie du mot de passe."</string>
diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml
index dbb94eb..6537b85 100644
--- a/java/res/values-hi/strings.xml
+++ b/java/res/values-hi/strings.xml
@@ -44,7 +44,7 @@
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"डिफ़ॉल्ट"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"संपर्क नाम सुझाएं"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"सुझाव और सुधार के लिए संपर्क से नामों का उपयोग करें"</string>
-    <string name="use_double_space_period" msgid="8781529969425082860">"दोहरी रिक्ति वाला पीरियड"</string>
+    <string name="use_double_space_period" msgid="8781529969425082860">"दोहरे स्पेस वाला पीरियड"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"स्पेसबार पर डबल टैप करने से पीरियड शामिल हो जाता है जिसके बाद एक रिक्ति होती है"</string>
     <string name="auto_cap" msgid="1719746674854628252">"स्‍वत: अक्षर बड़े करना"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"प्रत्येक वाक्य के पहले शब्द को बड़ा लिखें"</string>
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"पिछला"</string>
     <string name="label_done_key" msgid="2441578748772529288">"पूर्ण"</string>
     <string name="label_send_key" msgid="2815056534433717444">"भेजें"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"कखग"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?१२३"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"१२३"</string>
     <string name="label_pause_key" msgid="181098308428035340">"पॉज़ करें"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"प्रतीक्षा करें"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"ज़ोर से बोली गई पासवर्ड कुंजियां सुनने के लिए हेडसेट प्‍लग इन करें."</string>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index a0963e5..d788c1f 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Pret."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Gotovo"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Pošalji"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Pričekaj"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Priključite slušalice da biste čuli tipke zaporke izgovorene naglas."</string>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index e9972d2..1df8639 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Előző"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Kész"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Küldés"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Szün."</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Vár"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Csatlakoztasson egy headsetet, ha hallani szeretné a jelszót felolvasva."</string>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index d761ffc..f26ad38 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -45,7 +45,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sarankan nama Kontak"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Menggunakan nama dari Kontak untuk saran dan koreksi"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Titik spasi ganda"</string>
-    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Mengetuk dua kali bilah spasi akan memasukkan titik diikuti satu spasi"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Mengetuk tombol spasi dua kali akan memasukkan titik diikuti satu spasi"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Kapitalisasi otomatis"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Kapitalisasi kata pertama di setiap kalimat"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Kamus pengaya"</string>
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Sblm"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Selesai"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Kirimkan"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Jeda"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Tunggu"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Pasang headset untuk mendengar tombol sandi yang diucapkan dengan keras."</string>
diff --git a/java/res/values-is/strings.xml b/java/res/values-is/strings.xml
index 9dc37ed..8ea7461 100644
--- a/java/res/values-is/strings.xml
+++ b/java/res/values-is/strings.xml
@@ -123,11 +123,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Fyrra"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Lokið"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Senda"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
-    <skip />
-    <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
-    <skip />
     <!-- no translation found for label_pause_key (181098308428035340) -->
     <skip />
     <!-- no translation found for label_wait_key (6402152600878093134) -->
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index a3ed5dd..a78c5c5 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Indietro"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Fine"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Invia"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Attesa"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Collega gli auricolari per ascoltare la pronuncia dei tasti premuti per la password."</string>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 3c58b9c..6542b9f 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"הקודם"</string>
     <string name="label_done_key" msgid="2441578748772529288">"סיום"</string>
     <string name="label_send_key" msgid="2815056534433717444">"שלח"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"אבג"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"השהה"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"המתן"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"חבר אוזניות כדי לשמוע הקראה של מפתחות סיסמה."</string>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index 182e66e..2b341e1 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"前へ"</string>
     <string name="label_done_key" msgid="2441578748772529288">"完了"</string>
     <string name="label_send_key" msgid="2815056534433717444">"送信"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"停止"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"待機"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"パスワードのキーが音声出力されるのでヘッドセットを接続してください。"</string>
diff --git a/java/res/values-ka/strings.xml b/java/res/values-ka/strings.xml
index bf12855..ef30144 100644
--- a/java/res/values-ka/strings.xml
+++ b/java/res/values-ka/strings.xml
@@ -123,11 +123,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"წინა"</string>
     <string name="label_done_key" msgid="2441578748772529288">"შესრულებულია"</string>
     <string name="label_send_key" msgid="2815056534433717444">"გაგზავნა"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
-    <skip />
-    <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
-    <skip />
     <!-- no translation found for label_pause_key (181098308428035340) -->
     <skip />
     <!-- no translation found for label_wait_key (6402152600878093134) -->
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index 6206d46..e7b9d5a 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"이전"</string>
     <string name="label_done_key" msgid="2441578748772529288">"완료"</string>
     <string name="label_send_key" msgid="2815056534433717444">"전송"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"일시 중지"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"대기"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"비밀번호 키를 음성으로 들으려면 헤드셋을 연결하세요."</string>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index 4d7de25..5c66e1f 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Anks."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Atlikta"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Siųsti"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Prist."</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Lauk."</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Prijunkite ausines, kad išgirstumėte sakomus slaptažodžio klavišus."</string>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
index fa66c2d..a0cf78e 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Iepr."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Gatavs"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Sūtīt"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pauze"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Gaidīt"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Pievienojiet austiņas, lai dzirdētu paroles rakstzīmes."</string>
diff --git a/java/res/values-mk/strings.xml b/java/res/values-mk/strings.xml
index 7baba30..e199e03 100644
--- a/java/res/values-mk/strings.xml
+++ b/java/res/values-mk/strings.xml
@@ -123,11 +123,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Претходно"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Испрати"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
-    <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
-    <skip />
-    <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
-    <skip />
     <!-- no translation found for label_pause_key (181098308428035340) -->
     <skip />
     <!-- no translation found for label_wait_key (6402152600878093134) -->
diff --git a/java/res/values-mn/strings.xml b/java/res/values-mn/strings.xml
index 7a9f529..41bf551 100644
--- a/java/res/values-mn/strings.xml
+++ b/java/res/values-mn/strings.xml
@@ -123,11 +123,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Өмнөх"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Хийгдлээ"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Илгээх"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
-    <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
-    <skip />
-    <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
-    <skip />
     <!-- no translation found for label_pause_key (181098308428035340) -->
     <skip />
     <!-- no translation found for label_wait_key (6402152600878093134) -->
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
index 5cfe745..c1a2f0d 100644
--- a/java/res/values-ms/strings.xml
+++ b/java/res/values-ms/strings.xml
@@ -45,7 +45,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Cadangkan nama Kenalan"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Menggunakan nama daripada Kenalan untuk cadangan dan pembetulan"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Titik ruang berganda"</string>
-    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Ketik dua kali pada bar ruang memasukkan titik diikuti dengan ruang"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Mengetik 2X pada bar ruang memasukkan titik diikuti dengan ruang"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Huruf besar auto"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Besarkan perkataan pertama setiap ayat"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Kamus tambahan"</string>
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Sblm"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Selesai"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Hantar"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Jeda"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Tnggu"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Pasangkan set kepala untuk mendengar kekunci kata laluan disebut dengan kuat."</string>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index d21c4e9..f56ce11 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -44,8 +44,8 @@
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standard"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"Foreslå kontaktnavn"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Bruk navn fra Kontakter til forslag og korrigeringer"</string>
-    <string name="use_double_space_period" msgid="8781529969425082860">"To mellomrom for punktum"</string>
-    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Trykk to ganger på mellomromstasten for å sette inn et punktum etterfulgt av et mellomrom"</string>
+    <string name="use_double_space_period" msgid="8781529969425082860">"Punktum ved doble mellomrom"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dobbeltrykk på mellomromstasten for punktum etterfulgt av mellomrom"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Stor forbokstav"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Sett stor bokstav i det første ordet i hver setning"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Tilleggsordbøker"</string>
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Forr."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Utfør"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Send"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Vent"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Koble til hodetelefoner for å høre opplesing av bokstavene i passordet."</string>
diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
index daa65a4..6bd474a 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Vorig"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Gereed"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Zenden"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pauze"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Wacht"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Sluit een headset aan om wachtwoordtoetsen hardop te laten voorlezen."</string>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index 5ee44cc..27fcf60 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Wstecz"</string>
     <string name="label_done_key" msgid="2441578748772529288">"OK"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Wyślij"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Czekaj"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Podłącz zestaw słuchawkowy, aby usłyszeć znaki hasła wypowiadane na głos."</string>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 1d88fbb..46bd34d 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Ant."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Feito"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Esp."</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Ligar auscultadores com microfone integrado para ouvir as teclas da palavra-passe."</string>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index da0ed5d..ce61e0c 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Volt."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Feito"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Esp."</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Conecte um fone de ouvido para ouvir as chaves de senha em voz alta."</string>
diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml
index 584f332..5a315f5 100644
--- a/java/res/values-rm/strings.xml
+++ b/java/res/values-rm/strings.xml
@@ -119,12 +119,6 @@
     <skip />
     <string name="label_done_key" msgid="2441578748772529288">"Finì"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Trametter"</string>
-    <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
-    <skip />
-    <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
-    <skip />
-    <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
-    <skip />
     <!-- no translation found for label_pause_key (181098308428035340) -->
     <skip />
     <!-- no translation found for label_wait_key (6402152600878093134) -->
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index 9d397ac..99b82a5 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Înapoi"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Terminat"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Trimiteţi"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pauză"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Aşt."</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Conectaţi un set căşti-microfon pentru a auzi tastele apăsate când introduceţi parola."</string>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index 30daeaa..1075d29 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Пред."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Отправить"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Ждать"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Подключите гарнитуру, чтобы услышать пароль."</string>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index cfb51ed..1ee4f33 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -31,7 +31,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Zobraziť znaky pri stlačení klávesu"</string>
     <string name="general_category" msgid="1859088467017573195">"Všeobecné"</string>
     <string name="correction_category" msgid="2236750915056607613">"Oprava textu"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"Písanie gest"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"Písanie gestami"</string>
     <string name="misc_category" msgid="6894192814868233453">"Ďalšie možnosti"</string>
     <string name="advanced_settings" msgid="362895144495591463">"Rozšírené nastavenia"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Možnosti pre odborníkov"</string>
@@ -44,7 +44,7 @@
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predvolená"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"Navrhnúť mená kontaktov"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Používať mená z Kontaktov na návrhy a opravy"</string>
-    <string name="use_double_space_period" msgid="8781529969425082860">"Bodka dvojitou medzerou"</string>
+    <string name="use_double_space_period" msgid="8781529969425082860">"Bodka s medzerou"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dvojitým klepnutím na medzerník vložíte bodku a medzeru."</string>
     <string name="auto_cap" msgid="1719746674854628252">"Veľké písmená automaticky"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Písanie prvého slova v každej vete veľkým písmenom"</string>
@@ -63,7 +63,7 @@
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Veľmi agresívne"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Návrhy ďalšieho slova"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Návrhy podľa predchádzajúceho slova"</string>
-    <string name="gesture_input" msgid="826951152254563827">"Povoliť písanie gest"</string>
+    <string name="gesture_input" msgid="826951152254563827">"Povoliť písanie gestami"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Vkladanie slov prejdením prstom po písmenách"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Zobrazovať stopu gesta"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamická plávajúca ukážka"</string>
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Pred."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Odoslať"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pozastaviť"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Čakajte"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Ak si chcete pri zadávaní hesla vypočuť nahlas vyslovené klávesy, pripojte náhlavnú súpravu."</string>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
index b7dcfba..6ac7406 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Nazaj"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Dokončano"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Pošlji"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Premor"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Čakaj"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Priključite slušalke, če želite slišati izgovorjene tipke gesla."</string>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index 93b8da3..1456ae9 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Прет."</string>
     <string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Пошаљи"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Чекај"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Укључите слушалице да бисте чули наглас изговорене тастере за лозинку."</string>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index 95b6692..f6426f9 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Föreg"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Färdig"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Skicka"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Vänta"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Anslut hörlurar om du vill att lösenordet ska läsas upp."</string>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
index 95d6734..81b9003 100644
--- a/java/res/values-sw/strings.xml
+++ b/java/res/values-sw/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Iliyotangulia"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Kwisha"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Tuma"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"? 123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pumzisha"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Subiri"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Chomeka plagi ya kifaa cha kichwa cha kusikiza ili kusikiliza msimbo wa nenosiri inayozungumwa kwa sauti ya juu."</string>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index 254bb25..d089098 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"ก่อนหน้า"</string>
     <string name="label_done_key" msgid="2441578748772529288">"เสร็จสิ้น"</string>
     <string name="label_send_key" msgid="2815056534433717444">"ส่ง"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"กขค"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"หยุดชั่วคราว"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"รอ"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"เสียบชุดหูฟังเพื่อฟังเสียงเมื่อพิมพ์รหัสผ่าน"</string>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index e4257b2..a16032e 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Nkrn"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Tapos na"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Ipadala"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Intay"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Mag-plug in ng headset upang marinig ang mga password key na binabanggit nang malakas."</string>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index f49e6f2..7b3748c 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Önceki"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Bitti"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Gönder"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Durkl"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Bekle"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Şifre tuşlarının sesli okunmasını dinlemek için mikrofonlu kulaklık takın."</string>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index fa81ba6..532f671 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Назад"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Надісл."</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Чек."</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Підключіть гарнітуру, щоб прослухати відтворені вголос символи пароля."</string>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index ee2153c..2b29120 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Trước"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Xong"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Gửi"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Tạm dừng"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Đợi"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Cắm tai nghe để nghe mật khẩu."</string>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index c4cb39a..ed663b7 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -45,7 +45,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"联系人姓名建议"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"使用联系人中的姓名提供建议和更正"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"双击空格插入句号"</string>
-    <string name="use_double_space_period_summary" msgid="6532892187247952799">"双击空格键可在空格后插入句号"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"双击空格键可插入句号并后跟空格"</string>
     <string name="auto_cap" msgid="1719746674854628252">"自动大写"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"句首字词大写"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"附加词典"</string>
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"后退"</string>
     <string name="label_done_key" msgid="2441578748772529288">"完成"</string>
     <string name="label_send_key" msgid="2815056534433717444">"发送"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"暂停"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"等待"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"需要插入耳机才能听到密码的按键声。"</string>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index eee46ce..28d32cf 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"上一步"</string>
     <string name="label_done_key" msgid="2441578748772529288">"完成"</string>
     <string name="label_send_key" msgid="2815056534433717444">"傳送"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"暫停"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"等候"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"連接耳機即可聽取系統朗讀密碼按鍵。"</string>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index a4db664..575a687 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -74,9 +74,6 @@
     <string name="label_previous_key" msgid="1211868118071386787">"Eledlule"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Kwenziwe"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Thumela"</string>
-    <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
-    <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
-    <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
     <string name="label_pause_key" msgid="181098308428035340">"Misa okwesikhashana"</string>
     <string name="label_wait_key" msgid="6402152600878093134">"Linda"</string>
     <string name="spoken_use_headphones" msgid="896961781287283493">"Plaka ku-headset ukuze uzwe okhiye bephasiwedi ezindlebeni zakho bezwakala kakhulu."</string>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 3eb27e7..2f1a209 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -389,6 +389,7 @@
         <attr name="passwordInput" format="boolean" />
         <attr name="clobberSettingsKey" format="boolean" />
         <attr name="shortcutKeyEnabled" format="boolean" />
+        <attr name="shortcutKeyOnSymbols" format="boolean" />
         <attr name="hasShortcutKey" format="boolean" />
         <attr name="languageSwitchKeyEnabled" format="boolean" />
         <attr name="isMultiLine" format="boolean" />
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index a842dc8..2affdeb 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -147,13 +147,6 @@
     <string name="label_done_key">Done</string>
     <!-- Label for soft enter key when it performs SEND action.  Must be short to fit on key! [CHAR LIMIT=5] -->
     <string name="label_send_key">Send</string>
-    <!-- Label for "switch to alphabetic" key.  Must be short to fit on key! [CHAR LIMIT=3] -->
-    <string name="label_to_alpha_key">ABC</string>
-    <!-- Label for "switch to symbols" key.  Must be short to fit on key! [CHAR LIMIT=4] -->
-    <string name="label_to_symbol_key">\?123</string>
-    <!-- Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-         part because it'll be appended by the code. Must be short to fit on key! [CHAR LIMIT=3] -->
-    <string name="label_to_symbol_with_microphone_key">123</string>
     <!-- Label for "Pause" key of phone number keyboard.  Must be short to fit on key! [CHAR LIMIT=5] -->
     <string name="label_pause_key">Pause</string>
     <!-- Label for "Wait" key of phone number keyboard.  Must be short to fit on key! [CHAR LIMIT=5]-->
diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index bf2e76a..6b06ce7 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -154,31 +154,30 @@
         </default>
     </switch>
     <key-style
-        latin:styleName="toSymbolKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_symbol_key"
+        latin:styleName="baseForLayoutSwitchKeyStyle"
         latin:keyLabelFlags="preserveCase"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <key-style
+        latin:styleName="toSymbolKeyStyle"
+        latin:code="!code/key_switch_alpha_symbol"
+        latin:keyLabel="!text/label_to_symbol_key"
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
+    <key-style
         latin:styleName="toAlphaKeyStyle"
         latin:code="!code/key_switch_alpha_symbol"
         latin:keyLabel="!text/label_to_alpha_key"
-        latin:keyLabelFlags="preserveCase"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional" />
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toMoreSymbolKeyStyle"
         latin:code="!code/key_shift"
         latin:keyLabel="!text/label_to_more_symbol_for_tablet_key"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional" />
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="backFromMoreSymbolKeyStyle"
         latin:code="!code/key_shift"
         latin:keyLabel="!text/label_to_symbol_key"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional" />
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="comKeyStyle"
         latin:keyLabel="!text/keylabel_for_popular_domain"
diff --git a/java/res/xml-sw768dp/key_styles_common.xml b/java/res/xml-sw768dp/key_styles_common.xml
index 537e768..4d10f5b 100644
--- a/java/res/xml-sw768dp/key_styles_common.xml
+++ b/java/res/xml-sw768dp/key_styles_common.xml
@@ -144,33 +144,30 @@
         </default>
     </switch>
     <key-style
-        latin:styleName="toSymbolKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_symbol_key"
+        latin:styleName="baseForLayoutSwitchKeyStyle"
         latin:keyLabelFlags="fontNormal|preserveCase"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <key-style
+        latin:styleName="toSymbolKeyStyle"
+        latin:code="!code/key_switch_alpha_symbol"
+        latin:keyLabel="!text/label_to_symbol_key"
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
+    <key-style
         latin:styleName="toAlphaKeyStyle"
         latin:code="!code/key_switch_alpha_symbol"
         latin:keyLabel="!text/label_to_alpha_key"
-        latin:keyLabelFlags="fontNormal|preserveCase"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional" />
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toMoreSymbolKeyStyle"
         latin:code="!code/key_shift"
         latin:keyLabel="!text/label_to_more_symbol_for_tablet_key"
-        latin:keyLabelFlags="fontNormal"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional" />
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="backFromMoreSymbolKeyStyle"
         latin:code="!code/key_shift"
         latin:keyLabel="!text/label_to_symbol_key"
-        latin:keyLabelFlags="fontNormal"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional" />
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="comKeyStyle"
         latin:keyLabel="!text/keylabel_for_popular_domain"
diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index 162119d..91ebac1 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -134,52 +134,50 @@
         latin:code="!code/key_tab"
         latin:keyIcon="!icon/tab_key"
         latin:keyIconPreview="!icon/tab_key_preview" />
+    <key-style
+        latin:styleName="baseForLayoutSwitchKeyStyle"
+        latin:keyLabelFlags="preserveCase"
+        latin:keyActionFlags="noKeyPreview"
+        latin:backgroundType="functional" />
     <switch>
         <!-- When this qwerty keyboard has no shortcut keys but shortcut key is enabled, then symbol
              keyboard will have a shortcut key. That means we should use label_to_symbol_key label
              and shortcut_for_label icon. -->
         <case
-            latin:shortcutKeyEnabled="true"
-            latin:hasShortcutKey="false"
+            latin:shortcutKeyOnSymbols="true"
         >
             <key-style
-                latin:styleName="toSymbolKeyStyle"
-                latin:code="!code/key_switch_alpha_symbol"
+                latin:styleName="baseForToSymbolKeyStyle"
                 latin:keyIcon="!icon/shortcut_for_label"
                 latin:keyLabel="!text/label_to_symbol_with_microphone_key"
                 latin:keyLabelFlags="withIconRight|preserveCase"
-                latin:keyActionFlags="noKeyPreview"
-                latin:backgroundType="functional" />
+                latin:parentStyle="baseForLayoutSwitchKeyStyle" />
         </case>
         <default>
             <key-style
-                latin:styleName="toSymbolKeyStyle"
-                latin:code="!code/key_switch_alpha_symbol"
+                latin:styleName="baseForToSymbolKeyStyle"
                 latin:keyLabel="!text/label_to_symbol_key"
-                latin:keyLabelFlags="preserveCase"
-                latin:keyActionFlags="noKeyPreview"
-                latin:backgroundType="functional" />
+                latin:parentStyle="baseForLayoutSwitchKeyStyle" />
         </default>
     </switch>
     <key-style
+        latin:styleName="toSymbolKeyStyle"
+        latin:code="!code/key_switch_alpha_symbol"
+        latin:parentStyle="baseForToSymbolKeyStyle" />
+    <key-style
         latin:styleName="toAlphaKeyStyle"
         latin:code="!code/key_switch_alpha_symbol"
         latin:keyLabel="!text/label_to_alpha_key"
-        latin:keyLabelFlags="preserveCase"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional" />
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toMoreSymbolKeyStyle"
         latin:code="!code/key_shift"
         latin:keyLabel="!text/label_to_more_symbol_key"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional" />
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="backFromMoreSymbolKeyStyle"
         latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_symbol_key"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional" />
+        latin:parentStyle="baseForToSymbolKeyStyle" />
     <key-style
         latin:styleName="punctuationKeyStyle"
         latin:keyLabel="."
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
index 5e8a8f6..b413615 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -71,34 +71,39 @@
     private final EditorInfo mEditorInfo;
     public final boolean mClobberSettingsKey;
     public final boolean mShortcutKeyEnabled;
-    public final boolean mHasShortcutKey;
+    public final boolean mShortcutKeyOnSymbols;
     public final boolean mLanguageSwitchKeyEnabled;
     public final String mCustomActionLabel;
+    public final boolean mHasShortcutKey;
 
     private final int mHashCode;
 
-    public KeyboardId(int elementId, InputMethodSubtype subtype, int deviceFormFactor,
-            int orientation, int width, int mode, EditorInfo editorInfo, boolean clobberSettingsKey,
-            boolean shortcutKeyEnabled, boolean hasShortcutKey, boolean languageSwitchKeyEnabled) {
-        mSubtype = subtype;
-        mLocale = SubtypeLocale.getSubtypeLocale(subtype);
-        mDeviceFormFactor = deviceFormFactor;
-        mOrientation = orientation;
-        mWidth = width;
-        mMode = mode;
+    public KeyboardId(final int elementId, final KeyboardLayoutSet.Params params) {
+        mSubtype = params.mSubtype;
+        mLocale = SubtypeLocale.getSubtypeLocale(mSubtype);
+        mDeviceFormFactor = params.mDeviceFormFactor;
+        mOrientation = params.mOrientation;
+        mWidth = params.mWidth;
+        mMode = params.mMode;
         mElementId = elementId;
-        mEditorInfo = editorInfo;
-        mClobberSettingsKey = clobberSettingsKey;
-        mShortcutKeyEnabled = shortcutKeyEnabled;
-        mHasShortcutKey = hasShortcutKey;
-        mLanguageSwitchKeyEnabled = languageSwitchKeyEnabled;
-        mCustomActionLabel = (editorInfo.actionLabel != null)
-                ? editorInfo.actionLabel.toString() : null;
+        mEditorInfo = params.mEditorInfo;
+        mClobberSettingsKey = params.mNoSettingsKey;
+        mShortcutKeyEnabled = params.mVoiceKeyEnabled;
+        mShortcutKeyOnSymbols = mShortcutKeyEnabled && !params.mVoiceKeyOnMain;
+        mLanguageSwitchKeyEnabled = params.mLanguageSwitchKeyEnabled;
+        mCustomActionLabel = (mEditorInfo.actionLabel != null)
+                ? mEditorInfo.actionLabel.toString() : null;
+        final boolean alphabetMayHaveShortcutKey = isAlphabetKeyboard(elementId)
+                && !mShortcutKeyOnSymbols;
+        final boolean symbolsMayHaveShortcutKey = (elementId == KeyboardId.ELEMENT_SYMBOLS)
+                && mShortcutKeyOnSymbols;
+        mHasShortcutKey = mShortcutKeyEnabled
+                && (alphabetMayHaveShortcutKey || symbolsMayHaveShortcutKey);
 
         mHashCode = computeHashCode(this);
     }
 
-    private static int computeHashCode(KeyboardId id) {
+    private static int computeHashCode(final KeyboardId id) {
         return Arrays.hashCode(new Object[] {
                 id.mDeviceFormFactor,
                 id.mOrientation,
@@ -108,7 +113,7 @@
                 id.passwordInput(),
                 id.mClobberSettingsKey,
                 id.mShortcutKeyEnabled,
-                id.mHasShortcutKey,
+                id.mShortcutKeyOnSymbols,
                 id.mLanguageSwitchKeyEnabled,
                 id.isMultiLine(),
                 id.imeAction(),
@@ -119,7 +124,7 @@
         });
     }
 
-    private boolean equals(KeyboardId other) {
+    private boolean equals(final KeyboardId other) {
         if (other == this)
             return true;
         return other.mDeviceFormFactor == mDeviceFormFactor
@@ -130,7 +135,7 @@
                 && other.passwordInput() == passwordInput()
                 && other.mClobberSettingsKey == mClobberSettingsKey
                 && other.mShortcutKeyEnabled == mShortcutKeyEnabled
-                && other.mHasShortcutKey == mHasShortcutKey
+                && other.mShortcutKeyOnSymbols == mShortcutKeyOnSymbols
                 && other.mLanguageSwitchKeyEnabled == mLanguageSwitchKeyEnabled
                 && other.isMultiLine() == isMultiLine()
                 && other.imeAction() == imeAction()
@@ -140,8 +145,12 @@
                 && other.mSubtype.equals(mSubtype);
     }
 
+    private static boolean isAlphabetKeyboard(final int elementId) {
+        return elementId < ELEMENT_SYMBOLS;
+    }
+
     public boolean isAlphabetKeyboard() {
-        return mElementId < ELEMENT_SYMBOLS;
+        return isAlphabetKeyboard(mElementId);
     }
 
     public boolean navigateNext() {
@@ -181,7 +190,7 @@
     }
 
     @Override
-    public boolean equals(Object other) {
+    public boolean equals(final Object other) {
         return other instanceof KeyboardId && equals((KeyboardId) other);
     }
 
@@ -192,7 +201,7 @@
 
     @Override
     public String toString() {
-        return String.format("[%s %s:%s %s-%s:%d %s %s %s%s%s%s%s%s%s%s]",
+        return String.format("[%s %s:%s %s-%s:%d %s %s %s%s%s%s%s%s%s%s%s]",
                 elementIdToName(mElementId),
                 mLocale,
                 mSubtype.getExtraValueOf(KEYBOARD_LAYOUT_SET),
@@ -204,13 +213,14 @@
                 (mClobberSettingsKey ? " clobberSettingsKey" : ""),
                 (passwordInput() ? " passwordInput" : ""),
                 (mShortcutKeyEnabled ? " shortcutKeyEnabled" : ""),
+                (mShortcutKeyOnSymbols ? " shortcutKeyOnSymbols" : ""),
                 (mHasShortcutKey ? " hasShortcutKey" : ""),
                 (mLanguageSwitchKeyEnabled ? " languageSwitchKeyEnabled" : ""),
                 (isMultiLine() ? "isMultiLine" : "")
         );
     }
 
-    public static boolean equivalentEditorInfoForKeyboard(EditorInfo a, EditorInfo b) {
+    public static boolean equivalentEditorInfoForKeyboard(final EditorInfo a, final EditorInfo b) {
         if (a == null && b == null) return true;
         if (a == null || b == null) return false;
         return a.inputType == b.inputType
@@ -218,7 +228,7 @@
                 && TextUtils.equals(a.privateImeOptions, b.privateImeOptions);
     }
 
-    public static String elementIdToName(int elementId) {
+    public static String elementIdToName(final int elementId) {
         switch (elementId) {
         case ELEMENT_ALPHABET: return "alphabet";
         case ELEMENT_ALPHABET_MANUAL_SHIFTED: return "alphabetManualShifted";
@@ -234,8 +244,8 @@
         }
     }
 
-    public static String deviceFormFactor(int devoceFormFactor) {
-        switch (devoceFormFactor) {
+    public static String deviceFormFactor(final int deviceFormFactor) {
+        switch (deviceFormFactor) {
         case FORM_FACTOR_PHONE: return "phone";
         case FORM_FACTOR_TABLET7: return "tablet7";
         case FORM_FACTOR_TABLET10: return "tablet10";
@@ -243,7 +253,7 @@
         }
     }
 
-    public static String modeName(int mode) {
+    public static String modeName(final int mode) {
         switch (mode) {
         case MODE_TEXT: return "text";
         case MODE_URL: return "url";
@@ -258,7 +268,7 @@
         }
     }
 
-    public static String actionName(int actionId) {
+    public static String actionName(final int actionId) {
         return (actionId == IME_ACTION_CUSTOM_LABEL) ? "actionCustomLabel"
                 : EditorInfoCompatUtils.imeActionName(actionId);
     }
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
index 4d5d7e1..2950475 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
@@ -78,6 +78,7 @@
             CollectionUtils.newHashMap();
     private static final KeysCache sKeysCache = new KeysCache();
 
+    @SuppressWarnings("serial")
     public static final class KeyboardLayoutSetException extends RuntimeException {
         public final KeyboardId mKeyboardId;
 
@@ -93,7 +94,7 @@
         public ElementParams() {}
     }
 
-    private static final class Params {
+    public static final class Params {
         String mKeyboardLayoutSetName;
         int mMode;
         EditorInfo mEditorInfo;
@@ -109,7 +110,6 @@
         // Sparse array of KeyboardLayoutSet element parameters indexed by element's id.
         final SparseArray<ElementParams> mKeyboardLayoutSetElementIdToParamsMap =
                 CollectionUtils.newSparseArray();
-        public Params() {}
     }
 
     public static void clearKeyboardCache() {
@@ -149,7 +149,11 @@
             elementParams = mParams.mKeyboardLayoutSetElementIdToParamsMap.get(
                     KeyboardId.ELEMENT_ALPHABET);
         }
-        final KeyboardId id = getKeyboardId(keyboardLayoutSetElementId);
+        // Note: The keyboard for each shift state, and mode are represented as an elementName
+        // attribute in a keyboard_layout_set XML file.  Also each keyboard layout XML resource is
+        // specified as an elementKeyboard attribute in the file.
+        // The KeyboardId is an internal key for a Keyboard object.
+        final KeyboardId id = new KeyboardId(keyboardLayoutSetElementId, mParams);
         try {
             return getKeyboard(elementParams, id);
         } catch (RuntimeException e) {
@@ -187,22 +191,6 @@
         return keyboard;
     }
 
-    // Note: The keyboard for each locale, shift state, and mode are represented as
-    // KeyboardLayoutSet element id that is a key in keyboard_set.xml.  Also that file specifies
-    // which XML layout should be used for each keyboard.  The KeyboardId is an internal key for
-    // Keyboard object.
-    private KeyboardId getKeyboardId(final int keyboardLayoutSetElementId) {
-        final Params params = mParams;
-        final boolean isSymbols = (keyboardLayoutSetElementId == KeyboardId.ELEMENT_SYMBOLS
-                || keyboardLayoutSetElementId == KeyboardId.ELEMENT_SYMBOLS_SHIFTED);
-        final boolean hasShortcutKey = params.mVoiceKeyEnabled
-                && (isSymbols != params.mVoiceKeyOnMain);
-        return new KeyboardId(keyboardLayoutSetElementId, params.mSubtype, params.mDeviceFormFactor,
-                params.mOrientation, params.mWidth, params.mMode, params.mEditorInfo,
-                params.mNoSettingsKey, params.mVoiceKeyEnabled, hasShortcutKey,
-                params.mLanguageSwitchKeyEnabled);
-    }
-
     public static final class Builder {
         private final Context mContext;
         private final String mPackageName;
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index db16917..61d3874 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -1013,7 +1013,7 @@
     public void closing() {
         dismissAllKeyPreviews();
         cancelAllMessages();
-
+        onCancelMoreKeysPanel();
         mInvalidateAllKeys = true;
         requestLayout();
     }
@@ -1032,11 +1032,10 @@
     }
 
     @Override
-    public boolean dismissMoreKeysPanel() {
+    public void onCancelMoreKeysPanel() {
         if (isShowingMoreKeysPanel()) {
-            return mMoreKeysPanel.dismissMoreKeysPanel();
+            mMoreKeysPanel.dismissMoreKeysPanel();
         }
-        return false;
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 7d7eedb..584d2fe 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -135,7 +135,6 @@
     private int mAltCodeKeyWhileTypingAnimAlpha = Constants.Color.ALPHA_OPAQUE;
 
     // More keys keyboard
-    private int mMoreKeysPanelPointerTrackerId;
     private final WeakHashMap<Key, MoreKeysPanel> mMoreKeysPanelCache =
             new WeakHashMap<Key, MoreKeysPanel>();
     private final boolean mConfigShowMoreKeysKeyboardAtTouchedPoint;
@@ -662,7 +661,6 @@
             }
             mMoreKeysPanelCache.put(parentKey, moreKeysPanel);
         }
-        mMoreKeysPanelPointerTrackerId = tracker.mPointerId;
 
         final int[] lastCoords = CoordinateUtils.newInstance();
         tracker.getLastCoordinates(lastCoords);
@@ -732,14 +730,9 @@
         final long eventTime = me.getEventTime();
         final int index = me.getActionIndex();
         final int id = me.getPointerId(index);
-        final int x, y;
-        if (mMoreKeysPanel != null && id == mMoreKeysPanelPointerTrackerId) {
-            x = mMoreKeysPanel.translateX((int)me.getX(index));
-            y = mMoreKeysPanel.translateY((int)me.getY(index));
-        } else {
-            x = (int)me.getX(index);
-            y = (int)me.getY(index);
-        }
+        final int x = (int)me.getX(index);
+        final int y = (int)me.getY(index);
+
         // TODO: This might be moved to the tracker.processMotionEvent() call below.
         if (ENABLE_USABILITY_STUDY_LOG && action != MotionEvent.ACTION_MOVE) {
             writeUsabilityStudyLog(me, action, eventTime, index, id, x, y);
@@ -800,19 +793,9 @@
                 final int pointerId = me.getPointerId(i);
                 final PointerTracker tracker = PointerTracker.getPointerTracker(
                         pointerId, this);
-                final int px, py;
-                final MotionEvent motionEvent;
-                if (mMoreKeysPanel != null
-                        && tracker.mPointerId == mMoreKeysPanelPointerTrackerId) {
-                    px = mMoreKeysPanel.translateX((int)me.getX(i));
-                    py = mMoreKeysPanel.translateY((int)me.getY(i));
-                    motionEvent = null;
-                } else {
-                    px = (int)me.getX(i);
-                    py = (int)me.getY(i);
-                    motionEvent = me;
-                }
-                tracker.onMoveEvent(px, py, eventTime, motionEvent);
+                final int px = (int)me.getX(i);
+                final int py = (int)me.getY(i);
+                tracker.onMoveEvent(px, py, eventTime, me);
                 if (ENABLE_USABILITY_STUDY_LOG) {
                     writeUsabilityStudyLog(me, action, eventTime, i, pointerId, px, py);
                 }
@@ -861,13 +844,18 @@
     @Override
     public void closing() {
         super.closing();
-        dismissMoreKeysPanel();
+        onCancelMoreKeysPanel();
         mMoreKeysPanelCache.clear();
     }
 
     @Override
+    public void onCancelMoreKeysPanel() {
+        super.onCancelMoreKeysPanel();
+        PointerTracker.dismissAllMoreKeysPanels();
+    }
+
+    @Override
     public boolean onDismissMoreKeysPanel() {
-        mMoreKeysPanelPointerTrackerId = -1;
         dimEntireKeyboard(false /* dimmed */);
         return super.onDismissMoreKeysPanel();
     }
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
index 16606a1..8a5b7da 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
@@ -19,76 +19,28 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.util.AttributeSet;
+import android.view.MotionEvent;
 import android.view.View;
 
-import com.android.inputmethod.keyboard.PointerTracker.DrawingProxy;
-import com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
 import com.android.inputmethod.latin.Constants;
 import com.android.inputmethod.latin.CoordinateUtils;
-import com.android.inputmethod.latin.InputPointers;
 import com.android.inputmethod.latin.R;
 
 /**
  * A view that renders a virtual {@link MoreKeysKeyboard}. It handles rendering of keys and
  * detecting key presses and touch movements.
  */
-public final class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel {
+public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel {
     private final int[] mCoordinates = CoordinateUtils.newInstance();
 
     private final KeyDetector mKeyDetector;
-
     private Controller mController;
-    private KeyboardActionListener mListener;
+    protected KeyboardActionListener mListener;
     private int mOriginX;
     private int mOriginY;
+    private Key mCurrentKey;
 
-    private static final TimerProxy EMPTY_TIMER_PROXY = new TimerProxy.Adapter();
-
-    private final KeyboardActionListener mMoreKeysKeyboardListener =
-            new KeyboardActionListener.Adapter() {
-        @Override
-        public void onCodeInput(final int primaryCode, final int x, final int y) {
-            // Because a more keys keyboard doesn't need proximity characters correction, we don't
-            // send touch event coordinates.
-            mListener.onCodeInput(
-                    primaryCode, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
-        }
-
-        @Override
-        public void onTextInput(final String text) {
-            mListener.onTextInput(text);
-        }
-
-        @Override
-        public void onStartBatchInput() {
-            mListener.onStartBatchInput();
-        }
-
-        @Override
-        public void onUpdateBatchInput(final InputPointers batchPointers) {
-            mListener.onUpdateBatchInput(batchPointers);
-        }
-
-        @Override
-        public void onEndBatchInput(final InputPointers batchPointers) {
-            mListener.onEndBatchInput(batchPointers);
-        }
-
-        @Override
-        public void onCancelInput() {
-            mListener.onCancelInput();
-        }
-
-        @Override
-        public void onPressKey(final int primaryCode) {
-            mListener.onPressKey(primaryCode);
-        }
-
-        @Override
-        public void onReleaseKey(final int primaryCode, final boolean withSliding) {
-            mListener.onReleaseKey(primaryCode, withSliding);
-        }
-    };
+    private int mActivePointerId;
 
     public MoreKeysKeyboardView(final Context context, final AttributeSet attrs) {
         this(context, attrs, R.attr.moreKeysKeyboardViewStyle);
@@ -124,26 +76,6 @@
     }
 
     @Override
-    public KeyDetector getKeyDetector() {
-        return mKeyDetector;
-    }
-
-    @Override
-    public KeyboardActionListener getKeyboardActionListener() {
-        return mMoreKeysKeyboardListener;
-    }
-
-    @Override
-    public DrawingProxy getDrawingProxy() {
-        return this;
-    }
-
-    @Override
-    public TimerProxy getTimerProxy() {
-        return EMPTY_TIMER_PROXY;
-    }
-
-    @Override
     public void setKeyPreviewPopupEnabled(final boolean previewEnabled, final int delay) {
         // More keys keyboard needs no pop-up key preview displayed, so we pass always false with a
         // delay of 0. The delay does not matter actually since the popup is not shown anyway.
@@ -156,16 +88,14 @@
         mController = controller;
         mListener = listener;
         final View container = getContainerView();
-        final MoreKeysKeyboard pane = (MoreKeysKeyboard)getKeyboard();
-        final int defaultCoordX = pane.getDefaultCoordX();
         // The coordinates of panel's left-top corner in parentView's coordinate system.
-        final int x = pointX - defaultCoordX - container.getPaddingLeft();
+        final int x = pointX - getDefaultCoordX() - container.getPaddingLeft();
         final int y = pointY - container.getMeasuredHeight() + container.getPaddingBottom();
 
         parentView.getLocationInWindow(mCoordinates);
         // Ensure the horizontal position of the panel does not extend past the screen edges.
         final int maxX = parentView.getMeasuredWidth() - container.getMeasuredWidth();
-        final int panelX = Math.max(0, Math.min(maxX, x + CoordinateUtils.x(mCoordinates)));
+        final int panelX = Math.max(0, Math.min(maxX, x)) + CoordinateUtils.x(mCoordinates);
         final int panelY = y + CoordinateUtils.y(mCoordinates);
         container.setX(panelX);
         container.setY(panelY);
@@ -175,6 +105,81 @@
         controller.onShowMoreKeysPanel(this);
     }
 
+    /**
+     * Returns the default x coordinate for showing this panel.
+     */
+    protected int getDefaultCoordX() {
+        return ((MoreKeysKeyboard)getKeyboard()).getDefaultCoordX();
+    }
+
+    @Override
+    public void onDownEvent(final int x, final int y, final int pointerId, final long eventTime) {
+        mActivePointerId = pointerId;
+        onMoveKeyInternal(x, y, pointerId);
+    }
+
+    @Override
+    public void onMoveEvent(int x, int y, final int pointerId, long eventTime) {
+        if (mActivePointerId != pointerId) {
+            return;
+        }
+        final boolean hasOldKey = (mCurrentKey != null);
+        onMoveKeyInternal(x, y, pointerId);
+        if (hasOldKey && mCurrentKey == null) {
+            // If the pointer has moved too far away from any target then cancel the panel.
+            mController.onCancelMoreKeysPanel();
+        }
+    }
+
+    @Override
+    public void onUpEvent(final int x, final int y, final int pointerId, final long eventTime) {
+        if (mCurrentKey != null && mActivePointerId == pointerId) {
+            updateReleaseKeyGraphics(mCurrentKey);
+            onCodeInput(mCurrentKey.mCode, x, y);
+            mCurrentKey = null;
+        }
+    }
+
+    /**
+     * Performs the specific action for this panel when the user presses a key on the panel.
+     */
+    protected void onCodeInput(final int code, final int x, final int y) {
+        if (code == Constants.CODE_OUTPUT_TEXT) {
+            mListener.onTextInput(mCurrentKey.getOutputText());
+        } else if (code != Constants.CODE_UNSPECIFIED) {
+            mListener.onCodeInput(code, x, y);
+        }
+    }
+
+    private void onMoveKeyInternal(int x, int y, int pointerId) {
+        if (mActivePointerId != pointerId) {
+            // Ignore old pointers when newer pointer is active.
+            return;
+        }
+        final Key oldKey = mCurrentKey;
+        final Key newKey = mKeyDetector.detectHitKey(x, y);
+        if (newKey != oldKey) {
+            mCurrentKey = newKey;
+            invalidateKey(mCurrentKey);
+            if (oldKey != null) {
+                updateReleaseKeyGraphics(oldKey);
+            }
+            if (newKey != null) {
+                updatePressKeyGraphics(newKey);
+            }
+        }
+    }
+
+    private void updateReleaseKeyGraphics(final Key key) {
+        key.onReleased();
+        invalidateKey(key);
+    }
+
+    private void updatePressKeyGraphics(final Key key) {
+        key.onPressed();
+        invalidateKey(key);
+    }
+
     @Override
     public boolean dismissMoreKeysPanel() {
         if (mController == null) return false;
@@ -192,6 +197,35 @@
     }
 
     @Override
+    public boolean onTouchEvent(final MotionEvent me) {
+        final int action = me.getActionMasked();
+        final long eventTime = me.getEventTime();
+        final int index = me.getActionIndex();
+        final int x = (int)me.getX(index);
+        final int y = (int)me.getY(index);
+        final int pointerId = me.getPointerId(index);
+        processMotionEvent(action, x, y, pointerId, eventTime);
+        return true;
+    }
+
+    public void processMotionEvent(final int action, final int x, final int y,
+            final int pointerId, final long eventTime) {
+        switch (action) {
+        case MotionEvent.ACTION_DOWN:
+        case MotionEvent.ACTION_POINTER_DOWN:
+            onDownEvent(x, y, pointerId, eventTime);
+            break;
+        case MotionEvent.ACTION_UP:
+        case MotionEvent.ACTION_POINTER_UP:
+            onUpEvent(x, y, pointerId, eventTime);
+            break;
+        case MotionEvent.ACTION_MOVE:
+            onMoveEvent(x, y, pointerId, eventTime);
+            break;
+        }
+    }
+
+    @Override
     public View getContainerView() {
         return (View)getParent();
     }
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java b/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java
index 8bcddcc..9c677e5 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java
@@ -18,7 +18,7 @@
 
 import android.view.View;
 
-public interface MoreKeysPanel extends PointerTracker.KeyEventHandler {
+public interface MoreKeysPanel {
     public interface Controller {
         /**
          * Add the {@link MoreKeysPanel} to the target view.
@@ -27,9 +27,14 @@
         public void onShowMoreKeysPanel(final MoreKeysPanel panel);
 
         /**
-         * Remove the current {@link MoreKeysPanel} to the target view.
+         * Remove the current {@link MoreKeysPanel} from the target view.
          */
         public boolean onDismissMoreKeysPanel();
+
+        /**
+         * Instructs the parent to cancel the panel (e.g., when entering a different input mode).
+         */
+        public void onCancelMoreKeysPanel();
     }
 
     /**
@@ -55,6 +60,36 @@
     public boolean dismissMoreKeysPanel();
 
     /**
+     * Process a move event on the more keys panel.
+     *
+     * @param x translated x coordinate of the touch point
+     * @param y translated y coordinate of the touch point
+     * @param pointerId pointer id touch point
+     * @param eventTime timestamp of touch point
+     */
+    public void onMoveEvent(final int x, final int y, final int pointerId, final long eventTime);
+
+    /**
+     * Process a down event on the more keys panel.
+     *
+     * @param x translated x coordinate of the touch point
+     * @param y translated y coordinate of the touch point
+     * @param pointerId pointer id touch point
+     * @param eventTime timestamp of touch point
+     */
+    public void onDownEvent(final int x, final int y, final int pointerId, final long eventTime);
+
+    /**
+     * Process an up event on the more keys panel.
+     *
+     * @param x translated x coordinate of the touch point
+     * @param y translated y coordinate of the touch point
+     * @param pointerId pointer id touch point
+     * @param eventTime timestamp of touch point
+     */
+    public void onUpEvent(final int x, final int y, final int pointerId, final long eventTime);
+
+    /**
      * Translate X-coordinate of touch event to the local X-coordinate of this
      * {@link MoreKeysPanel}.
      *
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index a44f3ed..0f55607 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -84,7 +84,6 @@
         public void showSlidingKeyInputPreview(PointerTracker tracker);
         public void dismissSlidingKeyInputPreview();
         public void showGesturePreviewTrail(PointerTracker tracker, boolean isOldestTracker);
-        public boolean dismissMoreKeysPanel();
     }
 
     public interface TimerProxy {
@@ -319,8 +318,8 @@
     // true if this pointer is no longer tracking touch event.
     private boolean mIsTrackingCanceled;
 
-    // true if this pointer has been long-pressed and is showing a more keys panel.
-    private boolean mIsShowingMoreKeysPanel;
+    // the more keys panel currently being shown. equals null if no panel is active.
+    private MoreKeysPanel mMoreKeysPanel;
 
     // true if this pointer is in a sliding key input.
     boolean mIsInSlidingKeyInput;
@@ -413,6 +412,17 @@
         }
     }
 
+    public static void dismissAllMoreKeysPanels() {
+        final int trackersSize = sTrackers.size();
+        for (int i = 0; i < trackersSize; ++i) {
+            final PointerTracker tracker = sTrackers.get(i);
+            if (tracker.isShowingMoreKeysPanel()) {
+                tracker.mMoreKeysPanel.dismissMoreKeysPanel();
+                tracker.mMoreKeysPanel = null;
+            }
+        }
+    }
+
     private PointerTracker(final int id, final KeyEventHandler handler) {
         if (handler == null) {
             throw new NullPointerException();
@@ -716,6 +726,7 @@
             sLastRecognitionPointSize = 0;
             sLastRecognitionTime = 0;
             mListener.onStartBatchInput();
+            dismissAllMoreKeysPanels();
         }
         mTimerProxy.cancelLongPressTimer();
         mDrawingProxy.showGesturePreviewTrail(this, isOldestTrackerInQueue(this));
@@ -812,7 +823,6 @@
         if (DEBUG_EVENT) {
             printTouchEvent("onDownEvent:", x, y, eventTime);
         }
-
         mDrawingProxy = handler.getDrawingProxy();
         mTimerProxy = handler.getTimerProxy();
         setKeyboardActionListener(handler.getKeyboardActionListener());
@@ -848,7 +858,7 @@
         }
         // A gesture should start only from a non-modifier key.
         mIsDetectingGesture = (mKeyboard != null) && mKeyboard.mId.isAlphabetKeyboard()
-                && !mIsShowingMoreKeysPanel && key != null && !key.isModifier();
+                && key != null && !key.isModifier();
         if (mIsDetectingGesture) {
             if (getActivePointerTrackerCount() == 1) {
                 sGestureFirstDownTime = eventTime;
@@ -858,6 +868,10 @@
         }
     }
 
+    private boolean isShowingMoreKeysPanel() {
+        return (mMoreKeysPanel != null);
+    }
+
     private void onDownEventInternal(final int x, final int y, final long eventTime) {
         Key key = onDownKey(x, y, eventTime);
         // Sliding key is allowed when 1) enabled by configuration, 2) this pointer starts sliding
@@ -905,6 +919,11 @@
                 cancelBatchInput();
                 return;
             }
+            // If the MoreKeysPanel is showing then do not attempt to enter gesture mode. However,
+            // the gestured touch points are still being recorded in case the panel is dismissed.
+            if (isShowingMoreKeysPanel()) {
+                return;
+            }
             mayStartBatchInput(key);
             if (sInGesture) {
                 mayUpdateBatchInput(eventTime, key);
@@ -920,6 +939,12 @@
             return;
         }
 
+        if (isShowingMoreKeysPanel()) {
+            final int translatedX = mMoreKeysPanel.translateX(x);
+            final int translatedY = mMoreKeysPanel.translateY(y);
+            mMoreKeysPanel.onMoveEvent(translatedX, translatedY, mPointerId, eventTime);
+        }
+
         if (sShouldHandleGesture && me != null) {
             // Add historical points to gesture path.
             final int pointerIndex = me.findPointerIndex(mPointerId);
@@ -933,6 +958,10 @@
             }
         }
 
+        if (isShowingMoreKeysPanel()) {
+            // Do not handle sliding keys (or show key pop-ups) when the MoreKeysPanel is visible.
+            return;
+        }
         onMoveEventInternal(x, y, eventTime);
     }
 
@@ -964,7 +993,7 @@
         if (ProductionFlag.IS_EXPERIMENTAL) {
             ResearchLogger.pointerTracker_onMoveEvent(x, y, lastX, lastY);
         }
-        onUpEventInternal(eventTime);
+        onUpEventInternal(x, y, eventTime);
         onDownEventInternal(x, y, eventTime);
     }
 
@@ -983,7 +1012,7 @@
                     lastX, lastY, Constants.printableCode(oldKey.mCode),
                     x, y, Constants.printableCode(key.mCode)));
         }
-        onUpEventInternal(eventTime);
+        onUpEventInternal(x, y, eventTime);
         onDownEventInternal(x, y, eventTime);
     }
 
@@ -1099,7 +1128,7 @@
                 sPointerTrackerQueue.releaseAllPointersOlderThan(this, eventTime);
             }
         }
-        onUpEventInternal(eventTime);
+        onUpEventInternal(x, y, eventTime);
         sPointerTrackerQueue.remove(this);
     }
 
@@ -1111,11 +1140,14 @@
         if (DEBUG_EVENT) {
             printTouchEvent("onPhntEvent:", mLastX, mLastY, eventTime);
         }
-        onUpEventInternal(eventTime);
+        if (isShowingMoreKeysPanel()) {
+            return;
+        }
+        onUpEventInternal(mLastX, mLastY, eventTime);
         cancelTracking();
     }
 
-    private void onUpEventInternal(final long eventTime) {
+    private void onUpEventInternal(final int x, final int y, final long eventTime) {
         mTimerProxy.cancelKeyTimers();
         resetSlidingKeyInput();
         mIsDetectingGesture = false;
@@ -1123,9 +1155,16 @@
         mCurrentKey = null;
         // Release the last pressed key.
         setReleasedKeyGraphics(currentKey);
-        if (mIsShowingMoreKeysPanel) {
-            mDrawingProxy.dismissMoreKeysPanel();
-            mIsShowingMoreKeysPanel = false;
+
+        if (isShowingMoreKeysPanel()) {
+            if (!mIsTrackingCanceled) {
+                final int translatedX = mMoreKeysPanel.translateX(x);
+                final int translatedY = mMoreKeysPanel.translateY(y);
+                mMoreKeysPanel.onUpEvent(translatedX, translatedY, mPointerId, eventTime);
+            }
+            mMoreKeysPanel.dismissMoreKeysPanel();
+            mMoreKeysPanel = null;
+            return;
         }
 
         if (sInGesture) {
@@ -1144,10 +1183,12 @@
         }
     }
 
-    public void onShowMoreKeysPanel(final int x, final int y, final KeyEventHandler handler) {
-        onLongPressed();
-        mIsShowingMoreKeysPanel = true;
-        onDownEvent(x, y, SystemClock.uptimeMillis(), handler);
+    public void onShowMoreKeysPanel(final int translatedX, final int translatedY,
+                final MoreKeysPanel panel) {
+        setReleasedKeyGraphics(mCurrentKey);
+        final long eventTime = SystemClock.uptimeMillis();
+        mMoreKeysPanel = panel;
+        mMoreKeysPanel.onDownEvent(translatedX, translatedY, mPointerId, eventTime);
     }
 
     @Override
@@ -1179,9 +1220,9 @@
         mTimerProxy.cancelKeyTimers();
         setReleasedKeyGraphics(mCurrentKey);
         resetSlidingKeyInput();
-        if (mIsShowingMoreKeysPanel) {
-            mDrawingProxy.dismissMoreKeysPanel();
-            mIsShowingMoreKeysPanel = false;
+        if (isShowingMoreKeysPanel()) {
+            mMoreKeysPanel.dismissMoreKeysPanel();
+            mMoreKeysPanel = null;
         }
     }
 
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
index 3634268..da418f4 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
@@ -622,6 +622,8 @@
                     R.styleable.Keyboard_Case_clobberSettingsKey, id.mClobberSettingsKey);
             final boolean shortcutKeyEnabledMatched = matchBoolean(a,
                     R.styleable.Keyboard_Case_shortcutKeyEnabled, id.mShortcutKeyEnabled);
+            final boolean shortcutKeyOnSymbolsMatched = matchBoolean(a,
+                    R.styleable.Keyboard_Case_shortcutKeyOnSymbols, id.mShortcutKeyOnSymbols);
             final boolean hasShortcutKeyMatched = matchBoolean(a,
                     R.styleable.Keyboard_Case_hasShortcutKey, id.mHasShortcutKey);
             final boolean languageSwitchKeyEnabledMatched = matchBoolean(a,
@@ -640,12 +642,12 @@
             final boolean selected = keyboardLayoutSetElementMatched && modeMatched
                     && navigateNextMatched && navigatePreviousMatched && passwordInputMatched
                     && clobberSettingsKeyMatched && shortcutKeyEnabledMatched
-                    && hasShortcutKeyMatched && languageSwitchKeyEnabledMatched
-                    && isMultiLineMatched && imeActionMatched && localeCodeMatched
-                    && languageCodeMatched && countryCodeMatched;
+                    && shortcutKeyOnSymbolsMatched && hasShortcutKeyMatched
+                    && languageSwitchKeyEnabledMatched && isMultiLineMatched && imeActionMatched
+                    && localeCodeMatched && languageCodeMatched && countryCodeMatched;
 
             if (DEBUG) {
-                startTag("<%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s>%s", TAG_CASE,
+                startTag("<%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s>%s", TAG_CASE,
                         textAttr(a.getString(
                                 R.styleable.Keyboard_Case_keyboardLayoutSetElement),
                                 "keyboardLayoutSetElement"),
@@ -662,6 +664,8 @@
                                 "passwordInput"),
                         booleanAttr(a, R.styleable.Keyboard_Case_shortcutKeyEnabled,
                                 "shortcutKeyEnabled"),
+                        booleanAttr(a, R.styleable.Keyboard_Case_shortcutKeyOnSymbols,
+                                "shortcutKeyOnSymbols"),
                         booleanAttr(a, R.styleable.Keyboard_Case_hasShortcutKey,
                                 "hasShortcutKey"),
                         booleanAttr(a, R.styleable.Keyboard_Case_languageSwitchKeyEnabled,
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
index 9d05643..6fefb80 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
@@ -97,9 +97,6 @@
         "label_done_key",
         "label_previous_key",
         // Other labels.
-        "label_to_alpha_key",
-        "label_to_symbol_key",
-        "label_to_symbol_with_microphone_key",
         "label_pause_key",
         "label_wait_key",
     };
@@ -147,92 +144,95 @@
         /* 39 */ "keylabel_for_south_slavic_row3_8",
         /* 40 */ "more_keys_for_cyrillic_ie",
         /* 41 */ "more_keys_for_cyrillic_i",
-        /* 42 */ "more_keys_for_single_quote",
-        /* 43 */ "more_keys_for_double_quote",
-        /* 44 */ "more_keys_for_tablet_double_quote",
-        /* 45 */ "more_keys_for_currency_dollar",
-        /* 46 */ "keylabel_for_currency_generic",
-        /* 47 */ "more_keys_for_currency_generic",
-        /* 48 */ "more_keys_for_punctuation",
-        /* 49 */ "more_keys_for_star",
-        /* 50 */ "more_keys_for_bullet",
-        /* 51 */ "more_keys_for_plus",
-        /* 52 */ "more_keys_for_left_parenthesis",
-        /* 53 */ "more_keys_for_right_parenthesis",
-        /* 54 */ "more_keys_for_less_than",
-        /* 55 */ "more_keys_for_greater_than",
-        /* 56 */ "more_keys_for_arabic_diacritics",
-        /* 57 */ "keyhintlabel_for_arabic_diacritics",
-        /* 58 */ "keylabel_for_symbols_1",
-        /* 59 */ "keylabel_for_symbols_2",
-        /* 60 */ "keylabel_for_symbols_3",
-        /* 61 */ "keylabel_for_symbols_4",
-        /* 62 */ "keylabel_for_symbols_5",
-        /* 63 */ "keylabel_for_symbols_6",
-        /* 64 */ "keylabel_for_symbols_7",
-        /* 65 */ "keylabel_for_symbols_8",
-        /* 66 */ "keylabel_for_symbols_9",
-        /* 67 */ "keylabel_for_symbols_0",
-        /* 68 */ "additional_more_keys_for_symbols_1",
-        /* 69 */ "additional_more_keys_for_symbols_2",
-        /* 70 */ "additional_more_keys_for_symbols_3",
-        /* 71 */ "additional_more_keys_for_symbols_4",
-        /* 72 */ "additional_more_keys_for_symbols_5",
-        /* 73 */ "additional_more_keys_for_symbols_6",
-        /* 74 */ "additional_more_keys_for_symbols_7",
-        /* 75 */ "additional_more_keys_for_symbols_8",
-        /* 76 */ "additional_more_keys_for_symbols_9",
-        /* 77 */ "additional_more_keys_for_symbols_0",
-        /* 78 */ "more_keys_for_symbols_1",
-        /* 79 */ "more_keys_for_symbols_2",
-        /* 80 */ "more_keys_for_symbols_3",
-        /* 81 */ "more_keys_for_symbols_4",
-        /* 82 */ "more_keys_for_symbols_5",
-        /* 83 */ "more_keys_for_symbols_6",
-        /* 84 */ "more_keys_for_symbols_7",
-        /* 85 */ "more_keys_for_symbols_8",
-        /* 86 */ "more_keys_for_symbols_9",
-        /* 87 */ "more_keys_for_symbols_0",
-        /* 88 */ "keylabel_for_comma",
-        /* 89 */ "more_keys_for_comma",
-        /* 90 */ "keylabel_for_symbols_question",
-        /* 91 */ "keylabel_for_symbols_semicolon",
-        /* 92 */ "keylabel_for_symbols_percent",
-        /* 93 */ "more_keys_for_symbols_exclamation",
-        /* 94 */ "more_keys_for_symbols_question",
-        /* 95 */ "more_keys_for_symbols_semicolon",
-        /* 96 */ "more_keys_for_symbols_percent",
-        /* 97 */ "keylabel_for_tablet_comma",
-        /* 98 */ "keyhintlabel_for_tablet_comma",
-        /* 99 */ "more_keys_for_tablet_comma",
-        /* 100 */ "keyhintlabel_for_tablet_period",
-        /* 101 */ "more_keys_for_tablet_period",
-        /* 102 */ "keylabel_for_apostrophe",
-        /* 103 */ "keyhintlabel_for_apostrophe",
-        /* 104 */ "more_keys_for_apostrophe",
-        /* 105 */ "more_keys_for_q",
-        /* 106 */ "more_keys_for_x",
-        /* 107 */ "keylabel_for_q",
-        /* 108 */ "keylabel_for_w",
-        /* 109 */ "keylabel_for_y",
-        /* 110 */ "keylabel_for_x",
-        /* 111 */ "keylabel_for_spanish_row2_10",
-        /* 112 */ "more_keys_for_am_pm",
-        /* 113 */ "settings_as_more_key",
-        /* 114 */ "shortcut_as_more_key",
-        /* 115 */ "action_next_as_more_key",
-        /* 116 */ "action_previous_as_more_key",
-        /* 117 */ "label_to_more_symbol_key",
-        /* 118 */ "label_to_more_symbol_for_tablet_key",
-        /* 119 */ "label_tab_key",
-        /* 120 */ "label_to_phone_numeric_key",
-        /* 121 */ "label_to_phone_symbols_key",
-        /* 122 */ "label_time_am",
-        /* 123 */ "label_time_pm",
-        /* 124 */ "label_to_symbol_key_pcqwerty",
-        /* 125 */ "keylabel_for_popular_domain",
-        /* 126 */ "more_keys_for_popular_domain",
-        /* 127 */ "more_keys_for_smiley",
+        /* 42 */ "label_to_alpha_key",
+        /* 43 */ "more_keys_for_single_quote",
+        /* 44 */ "more_keys_for_double_quote",
+        /* 45 */ "more_keys_for_tablet_double_quote",
+        /* 46 */ "more_keys_for_currency_dollar",
+        /* 47 */ "keylabel_for_currency_generic",
+        /* 48 */ "more_keys_for_currency_generic",
+        /* 49 */ "more_keys_for_punctuation",
+        /* 50 */ "more_keys_for_star",
+        /* 51 */ "more_keys_for_bullet",
+        /* 52 */ "more_keys_for_plus",
+        /* 53 */ "more_keys_for_left_parenthesis",
+        /* 54 */ "more_keys_for_right_parenthesis",
+        /* 55 */ "more_keys_for_less_than",
+        /* 56 */ "more_keys_for_greater_than",
+        /* 57 */ "more_keys_for_arabic_diacritics",
+        /* 58 */ "keyhintlabel_for_arabic_diacritics",
+        /* 59 */ "keylabel_for_symbols_1",
+        /* 60 */ "keylabel_for_symbols_2",
+        /* 61 */ "keylabel_for_symbols_3",
+        /* 62 */ "keylabel_for_symbols_4",
+        /* 63 */ "keylabel_for_symbols_5",
+        /* 64 */ "keylabel_for_symbols_6",
+        /* 65 */ "keylabel_for_symbols_7",
+        /* 66 */ "keylabel_for_symbols_8",
+        /* 67 */ "keylabel_for_symbols_9",
+        /* 68 */ "keylabel_for_symbols_0",
+        /* 69 */ "label_to_symbol_key",
+        /* 70 */ "label_to_symbol_with_microphone_key",
+        /* 71 */ "additional_more_keys_for_symbols_1",
+        /* 72 */ "additional_more_keys_for_symbols_2",
+        /* 73 */ "additional_more_keys_for_symbols_3",
+        /* 74 */ "additional_more_keys_for_symbols_4",
+        /* 75 */ "additional_more_keys_for_symbols_5",
+        /* 76 */ "additional_more_keys_for_symbols_6",
+        /* 77 */ "additional_more_keys_for_symbols_7",
+        /* 78 */ "additional_more_keys_for_symbols_8",
+        /* 79 */ "additional_more_keys_for_symbols_9",
+        /* 80 */ "additional_more_keys_for_symbols_0",
+        /* 81 */ "more_keys_for_symbols_1",
+        /* 82 */ "more_keys_for_symbols_2",
+        /* 83 */ "more_keys_for_symbols_3",
+        /* 84 */ "more_keys_for_symbols_4",
+        /* 85 */ "more_keys_for_symbols_5",
+        /* 86 */ "more_keys_for_symbols_6",
+        /* 87 */ "more_keys_for_symbols_7",
+        /* 88 */ "more_keys_for_symbols_8",
+        /* 89 */ "more_keys_for_symbols_9",
+        /* 90 */ "more_keys_for_symbols_0",
+        /* 91 */ "keylabel_for_comma",
+        /* 92 */ "more_keys_for_comma",
+        /* 93 */ "keylabel_for_symbols_question",
+        /* 94 */ "keylabel_for_symbols_semicolon",
+        /* 95 */ "keylabel_for_symbols_percent",
+        /* 96 */ "more_keys_for_symbols_exclamation",
+        /* 97 */ "more_keys_for_symbols_question",
+        /* 98 */ "more_keys_for_symbols_semicolon",
+        /* 99 */ "more_keys_for_symbols_percent",
+        /* 100 */ "keylabel_for_tablet_comma",
+        /* 101 */ "keyhintlabel_for_tablet_comma",
+        /* 102 */ "more_keys_for_tablet_comma",
+        /* 103 */ "keyhintlabel_for_tablet_period",
+        /* 104 */ "more_keys_for_tablet_period",
+        /* 105 */ "keylabel_for_apostrophe",
+        /* 106 */ "keyhintlabel_for_apostrophe",
+        /* 107 */ "more_keys_for_apostrophe",
+        /* 108 */ "more_keys_for_q",
+        /* 109 */ "more_keys_for_x",
+        /* 110 */ "keylabel_for_q",
+        /* 111 */ "keylabel_for_w",
+        /* 112 */ "keylabel_for_y",
+        /* 113 */ "keylabel_for_x",
+        /* 114 */ "keylabel_for_spanish_row2_10",
+        /* 115 */ "more_keys_for_am_pm",
+        /* 116 */ "settings_as_more_key",
+        /* 117 */ "shortcut_as_more_key",
+        /* 118 */ "action_next_as_more_key",
+        /* 119 */ "action_previous_as_more_key",
+        /* 120 */ "label_to_more_symbol_key",
+        /* 121 */ "label_to_more_symbol_for_tablet_key",
+        /* 122 */ "label_tab_key",
+        /* 123 */ "label_to_phone_numeric_key",
+        /* 124 */ "label_to_phone_symbols_key",
+        /* 125 */ "label_time_am",
+        /* 126 */ "label_time_pm",
+        /* 127 */ "label_to_symbol_key_pcqwerty",
+        /* 128 */ "keylabel_for_popular_domain",
+        /* 129 */ "more_keys_for_popular_domain",
+        /* 130 */ "more_keys_for_smiley",
     };
 
     private static final String EMPTY = "";
@@ -245,38 +245,40 @@
         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
         EMPTY, EMPTY, EMPTY,
         /* ~41 */
-        /* 42 */ "!fixedColumnOrder!4,\u2018,\u2019,\u201A,\u201B",
+        // Label for "switch to alphabetic" key.
+        /* 42 */ "ABC",
+        /* 43 */ "!fixedColumnOrder!4,\u2018,\u2019,\u201A,\u201B",
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
         // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;</string>
-        /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB,\u00BB",
+        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB,\u00BB",
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
+        /* 45 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
         // U+00A2: "¢" CENT SIGN
         // U+00A3: "£" POUND SIGN
         // U+20AC: "€" EURO SIGN
         // U+00A5: "¥" YEN SIGN
         // U+20B1: "₱" PESO SIGN
-        /* 45 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
-        /* 46 */ "$",
-        /* 47 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
-        /* 48 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\\,,?,@,&,\\%,+,;,/,(,)",
+        /* 46 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
+        /* 47 */ "$",
+        /* 48 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
+        /* 49 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\\,,?,@,&,\\%,+,;,/,(,)",
         // U+2020: "†" DAGGER
         // U+2021: "‡" DOUBLE DAGGER
         // U+2605: "★" BLACK STAR
-        /* 49 */ "\u2020,\u2021,\u2605",
+        /* 50 */ "\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
-        /* 50 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
+        /* 51 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
         // U+00B1: "±" PLUS-MINUS SIGN
-        /* 51 */ "\u00B1",
+        /* 52 */ "\u00B1",
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 52 */ "!fixedColumnOrder!3,<,{,[",
-        /* 53 */ "!fixedColumnOrder!3,>,},]",
+        /* 53 */ "!fixedColumnOrder!3,<,{,[",
+        /* 54 */ "!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
@@ -292,103 +294,108 @@
         // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
         // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
         // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        /* 54 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
-        /* 55 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
-        /* 56 */ EMPTY,
+        /* 55 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
+        /* 56 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
         /* 57 */ EMPTY,
-        /* 58 */ "1",
-        /* 59 */ "2",
-        /* 60 */ "3",
-        /* 61 */ "4",
-        /* 62 */ "5",
-        /* 63 */ "6",
-        /* 64 */ "7",
-        /* 65 */ "8",
-        /* 66 */ "9",
-        /* 67 */ "0",
-        /* 68~ */
+        /* 58 */ EMPTY,
+        /* 59 */ "1",
+        /* 60 */ "2",
+        /* 61 */ "3",
+        /* 62 */ "4",
+        /* 63 */ "5",
+        /* 64 */ "6",
+        /* 65 */ "7",
+        /* 66 */ "8",
+        /* 67 */ "9",
+        /* 68 */ "0",
+        // Label for "switch to symbols" key.
+        /* 69 */ "?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.
+        /* 70 */ "123",
+        /* 71~ */
         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~77 */
+        /* ~80 */
         // 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
-        /* 78 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
+        /* 81 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
         // U+00B2: "²" SUPERSCRIPT TWO
         // U+2154: "⅔" VULGAR FRACTION TWO THIRDS
-        /* 79 */ "\u00B2,\u2154",
+        /* 82 */ "\u00B2,\u2154",
         // U+00B3: "³" SUPERSCRIPT THREE
         // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
         // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
-        /* 80 */ "\u00B3,\u00BE,\u215C",
+        /* 83 */ "\u00B3,\u00BE,\u215C",
         // U+2074: "⁴" SUPERSCRIPT FOUR
-        /* 81 */ "\u2074",
+        /* 84 */ "\u2074",
         // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
-        /* 82 */ "\u215D",
-        /* 83 */ EMPTY,
-        // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
-        /* 84 */ "\u215E",
-        /* 85 */ EMPTY,
+        /* 85 */ "\u215D",
         /* 86 */ EMPTY,
+        // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
+        /* 87 */ "\u215E",
+        /* 88 */ EMPTY,
+        /* 89 */ EMPTY,
         // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
         // U+2205: "∅" EMPTY SET
-        /* 87 */ "\u207F,\u2205",
-        /* 88 */ ",",
-        /* 89 */ EMPTY,
-        /* 90 */ "?",
-        /* 91 */ ";",
-        /* 92 */ "%",
+        /* 90 */ "\u207F,\u2205",
+        /* 91 */ ",",
+        /* 92 */ EMPTY,
+        /* 93 */ "?",
+        /* 94 */ ";",
+        /* 95 */ "%",
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 93 */ "\u00A1",
+        /* 96 */ "\u00A1",
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 94 */ "\u00BF",
-        /* 95 */ EMPTY,
+        /* 97 */ "\u00BF",
+        /* 98 */ EMPTY,
         // U+2030: "‰" PER MILLE SIGN
-        /* 96 */ "\u2030",
-        /* 97 */ ",",
-        /* 98 */ "!",
-        /* 99 */ "!",
-        /* 100 */ "?",
-        /* 101 */ "?",
-        /* 102 */ "\'",
-        /* 103 */ "\"",
-        /* 104 */ "\"",
-        /* 105 */ EMPTY,
-        /* 106 */ EMPTY,
-        /* 107 */ "q",
-        /* 108 */ "w",
-        /* 109 */ "y",
-        /* 110 */ "x",
+        /* 99 */ "\u2030",
+        /* 100 */ ",",
+        /* 101 */ "!",
+        /* 102 */ "!",
+        /* 103 */ "?",
+        /* 104 */ "?",
+        /* 105 */ "\'",
+        /* 106 */ "\"",
+        /* 107 */ "\"",
+        /* 108 */ EMPTY,
+        /* 109 */ EMPTY,
+        /* 110 */ "q",
+        /* 111 */ "w",
+        /* 112 */ "y",
+        /* 113 */ "x",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 111 */ "\u00F1",
-        /* 112 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
-        /* 113 */ "!icon/settings_key|!code/key_settings",
-        /* 114 */ "!icon/shortcut_key|!code/key_shortcut",
-        /* 115 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
-        /* 116 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
+        /* 114 */ "\u00F1",
+        /* 115 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
+        /* 116 */ "!icon/settings_key|!code/key_settings",
+        /* 117 */ "!icon/shortcut_key|!code/key_shortcut",
+        /* 118 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
+        /* 119 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
         // Label for "switch to more symbol" modifier key.  Must be short to fit on key!
-        /* 117 */ "= \\ <",
+        /* 120 */ "= \\ <",
         // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
-        /* 118 */ "~ \\ {",
+        /* 121 */ "~ \\ {",
         // Label for "Tab" key.  Must be short to fit on key!
-        /* 119 */ "Tab",
+        /* 122 */ "Tab",
         // Label for "switch to phone numeric" key.  Must be short to fit on key!
-        /* 120 */ "123",
+        /* 123 */ "123",
         // Label for "switch to phone symbols" key.  Must be short to fit on key!
         // U+FF0A: "*" FULLWIDTH ASTERISK
         // U+FF03: "#" FULLWIDTH NUMBER SIGN
-        /* 121 */ "\uFF0A\uFF03",
+        /* 124 */ "\uFF0A\uFF03",
         // Key label for "ante meridiem"
-        /* 122 */ "AM",
+        /* 125 */ "AM",
         // Key label for "post meridiem"
-        /* 123 */ "PM",
+        /* 126 */ "PM",
         // Label for "switch to symbols" key on PC QWERTY layout
-        /* 124 */ "Sym",
-        /* 125 */ ".com",
+        /* 127 */ "Sym",
+        /* 128 */ ".com",
         // popular web domains for the locale - most popular, displayed on the keyboard
-        /* 126 */ "!hasLabels!,.net,.org,.gov,.edu",
-        /* 127 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
+        /* 129 */ "!hasLabels!,.net,.org,.gov,.edu",
+        /* 130 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
     };
 
     /* Language af: Afrikaans */
@@ -449,39 +456,46 @@
         /* 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,
-        /* ~42 */
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~41 */
+        // 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
+        /* 42 */ "\u0623\u200C\u0628\u200C\u062C",
+        /* 43 */ null,
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
         // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
-        /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB",
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
+        /* 45 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
         // U+00A2: "¢" CENT SIGN
         // U+00A3: "£" POUND SIGN
         // U+20AC: "€" EURO SIGN
         // U+00A5: "¥" YEN SIGN
         // U+20B1: "₱" PESO SIGN
         // U+FDFC: "﷼" RIAL SIGN
-        /* 45 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1,\uFDFC",
-        /* 46 */ null,
+        /* 46 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1,\uFDFC",
         /* 47 */ null,
+        /* 48 */ null,
         // U+061F: "؟" ARABIC QUESTION MARK
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
-        /* 48 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
+        /* 49 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
         // U+2605: "★" BLACK STAR
         // U+066D: "٭" ARABIC FIVE POINTED STAR
-        /* 49 */ "\u2605,\u066D",
+        /* 50 */ "\u2605,\u066D",
         // U+266A: "♪" EIGHTH NOTE
-        /* 50 */ "\u266A",
-        /* 51 */ null,
+        /* 51 */ "\u266A",
+        /* 52 */ 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
-        /* 52 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 53 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        /* 53 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
+        /* 54 */ "!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
@@ -497,8 +511,8 @@
         // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
         // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
         // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        /* 54 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 55 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+        /* 55 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
+        /* 56 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
         // U+0655: "ٕ" ARABIC HAMZA BELOW
         // U+0654: "ٔ" ARABIC HAMZA ABOVE
         // U+0652: "ْ" ARABIC SUKUN
@@ -514,64 +528,70 @@
         // U+064E: "َ" ARABIC FATHA
         // U+0640: "ـ" ARABIC TATWEEL
         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
-        /* 56 */ "!fixedColumnOrder!7,\u0655,\u0654,\u0652,\u064D,\u064C,\u064B,\u0651,\u0656,\u0670,\u0653,\u0650,\u064F,\u064E,\u0640\u0640\u0640|\u0640",
-        /* 57 */ "\u0651",
+        /* 57 */ "!fixedColumnOrder!7,\u0655,\u0654,\u0652,\u064D,\u064C,\u064B,\u0651,\u0656,\u0670,\u0653,\u0650,\u064F,\u064E,\u0640\u0640\u0640|\u0640",
+        /* 58 */ "\u0651",
         // U+0661: "١" ARABIC-INDIC DIGIT ONE
-        /* 58 */ "\u0661",
+        /* 59 */ "\u0661",
         // U+0662: "٢" ARABIC-INDIC DIGIT TWO
-        /* 59 */ "\u0662",
+        /* 60 */ "\u0662",
         // U+0663: "٣" ARABIC-INDIC DIGIT THREE
-        /* 60 */ "\u0663",
+        /* 61 */ "\u0663",
         // U+0664: "٤" ARABIC-INDIC DIGIT FOUR
-        /* 61 */ "\u0664",
+        /* 62 */ "\u0664",
         // U+0665: "٥" ARABIC-INDIC DIGIT FIVE
-        /* 62 */ "\u0665",
+        /* 63 */ "\u0665",
         // U+0666: "٦" ARABIC-INDIC DIGIT SIX
-        /* 63 */ "\u0666",
+        /* 64 */ "\u0666",
         // U+0667: "٧" ARABIC-INDIC DIGIT SEVEN
-        /* 64 */ "\u0667",
+        /* 65 */ "\u0667",
         // U+0668: "٨" ARABIC-INDIC DIGIT EIGHT
-        /* 65 */ "\u0668",
+        /* 66 */ "\u0668",
         // U+0669: "٩" ARABIC-INDIC DIGIT NINE
-        /* 66 */ "\u0669",
+        /* 67 */ "\u0669",
         // U+0660: "٠" ARABIC-INDIC DIGIT ZERO
-        /* 67 */ "\u0660",
-        /* 68 */ "1",
-        /* 69 */ "2",
-        /* 70 */ "3",
-        /* 71 */ "4",
-        /* 72 */ "5",
-        /* 73 */ "6",
-        /* 74 */ "7",
-        /* 75 */ "8",
-        /* 76 */ "9",
+        /* 68 */ "\u0660",
+        // Label for "switch to symbols" key.
+        // U+061F: "؟" ARABIC QUESTION MARK
+        /* 69 */ "\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.
+        /* 70 */ "\u0663\u0662\u0661",
+        /* 71 */ "1",
+        /* 72 */ "2",
+        /* 73 */ "3",
+        /* 74 */ "4",
+        /* 75 */ "5",
+        /* 76 */ "6",
+        /* 77 */ "7",
+        /* 78 */ "8",
+        /* 79 */ "9",
         // U+066B: "٫" ARABIC DECIMAL SEPARATOR
         // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
-        /* 77 */ "0,\u066B,\u066C",
-        /* 78~ */
+        /* 80 */ "0,\u066B,\u066C",
+        /* 81~ */
         null, null, null, null, null, null, null, null, null, null,
-        /* ~87 */
+        /* ~90 */
         // U+060C: "،" ARABIC COMMA
-        /* 88 */ "\u060C",
-        /* 89 */ "\\,",
-        /* 90 */ "\u061F",
-        /* 91 */ "\u061B",
+        /* 91 */ "\u060C",
+        /* 92 */ "\\,",
+        /* 93 */ "\u061F",
+        /* 94 */ "\u061B",
         // U+066A: "٪" ARABIC PERCENT SIGN
-        /* 92 */ "\u066A",
-        /* 93 */ null,
-        /* 94 */ "?",
-        /* 95 */ ";",
+        /* 95 */ "\u066A",
+        /* 96 */ null,
+        /* 97 */ "?",
+        /* 98 */ ";",
         // U+2030: "‰" PER MILLE SIGN
-        /* 96 */ "\\%,\u2030",
-        /* 97~ */
+        /* 99 */ "\\%,\u2030",
+        /* 100~ */
         null, null, null, null, null,
-        /* ~101 */
+        /* ~104 */
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
         // U+061F: "؟" ARABIC QUESTION MARK
-        /* 102 */ "\u060C",
-        /* 103 */ "\u061F",
-        /* 104 */ "\u061F,\u061B,!,:,-,/,\',\"",
+        /* 105 */ "\u060C",
+        /* 106 */ "\u061F",
+        /* 107 */ "\u061F,\u061B,!,:,-,/,\',\"",
     };
 
     /* Language be: Belarusian */
@@ -600,6 +620,26 @@
         /* ~39 */
         // U+0451: "ё" CYRILLIC SMALL LETTER IO
         /* 40 */ "\u0451",
+        /* 41 */ null,
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 42 */ "\u0410\u0411\u0412",
+    };
+
+    /* 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,
+        /* ~41 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 42 */ "\u0410\u0411\u0412",
     };
 
     /* Language ca: Catalan */
@@ -835,6 +875,20 @@
         /* 6 */ "\u00F1,\u0144",
     };
 
+    /* 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,
+        /* ~41 */
+        // Label for "switch to alphabetic" key.
+        // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
+        // U+0392: "Β" GREEK CAPITAL LETTER BETA
+        // U+0393: "Γ" GREEK CAPITAL LETTER GAMMA
+        /* 42 */ "\u0391\u0392\u0393",
+    };
+
     /* Language en: English */
     private static final String[] LANGUAGE_en = {
         // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
@@ -1003,20 +1057,20 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~104 */
-        /* 105 */ "q",
-        /* 106 */ "x",
+        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~107 */
+        /* 108 */ "q",
+        /* 109 */ "x",
         // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
-        /* 107 */ "\u015D",
+        /* 110 */ "\u015D",
         // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
-        /* 108 */ "\u011D",
+        /* 111 */ "\u011D",
         // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
-        /* 109 */ "\u016D",
+        /* 112 */ "\u016D",
         // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
-        /* 110 */ "\u0109",
+        /* 113 */ "\u0109",
         // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
-        /* 111 */ "\u0135",
+        /* 114 */ "\u0135",
     };
 
     /* Language es: Spanish */
@@ -1074,25 +1128,25 @@
         /* 8~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~47 */
+        null, null, null, null, null, null, null, null, null, null, null,
+        /* ~48 */
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 48 */ "!fixedColumnOrder!9,\u00A1,\",\',#,-,:,!,\\,,?,\u00BF,@,&,\\%,+,;,/,(,)",
-        /* 49~ */
+        /* 49 */ "!fixedColumnOrder!9,\u00A1,\",\',#,-,:,!,\\,,?,\u00BF,@,&,\\%,+,;,/,(,)",
+        /* 50~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null,
-        /* ~98 */
+        null, null, null, null, null, null, null,
+        /* ~101 */
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 99 */ "!,\u00A1",
-        /* 100 */ null,
+        /* 102 */ "!,\u00A1",
+        /* 103 */ null,
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 101 */ "?,\u00BF",
-        /* 102 */ "\"",
-        /* 103 */ "\'",
-        /* 104 */ "\'",
+        /* 104 */ "?,\u00BF",
+        /* 105 */ "\"",
+        /* 106 */ "\'",
+        /* 107 */ "\'",
     };
 
     /* Language et: Estonian */
@@ -1200,15 +1254,22 @@
         /* 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,
-        /* ~42 */
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~41 */
+        // 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
+        /* 42 */ "\u0627\u200C\u0628\u200C\u067E",
+        /* 43 */ null,
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
         // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
-        /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\",\'",
+        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\",\'",
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
-        /* 45 */ null,
+        /* 45 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
+        /* 46 */ null,
         // U+FDFC: "﷼" RIAL SIGN
         // U+060B: "؋" AFGHANI SIGN
         // U+00A2: "¢" CENT SIGN
@@ -1216,24 +1277,24 @@
         // U+20AC: "€" EURO SIGN
         // U+00A5: "¥" YEN SIGN
         // U+20B1: "₱" PESO SIGN
-        /* 46 */ "\uFDFC",
-        /* 47 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1,\u060B",
+        /* 47 */ "\uFDFC",
+        /* 48 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1,\u060B",
         // U+061F: "؟" ARABIC QUESTION MARK
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
-        /* 48 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
+        /* 49 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
         // U+2605: "★" BLACK STAR
         // U+066D: "٭" ARABIC FIVE POINTED STAR
-        /* 49 */ "\u2605,\u066D",
+        /* 50 */ "\u2605,\u066D",
         // U+266A: "♪" EIGHTH NOTE
-        /* 50 */ "\u266A",
-        /* 51 */ null,
+        /* 51 */ "\u266A",
+        /* 52 */ 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
-        /* 52 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 53 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        /* 53 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
+        /* 54 */ "!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
@@ -1249,8 +1310,8 @@
         // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
         // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
         // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        /* 54 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
-        /* 55 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
+        /* 55 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
+        /* 56 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
         // U+0655: "ٕ" ARABIC HAMZA BELOW
         // U+0652: "ْ" ARABIC SUKUN
         // U+0651: "ّ" ARABIC SHADDA
@@ -1266,68 +1327,74 @@
         // U+064E: "َ" ARABIC FATHA
         // U+0640: "ـ" ARABIC TATWEEL
         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
-        /* 56 */ "!fixedColumnOrder!7,\u0655,\u0652,\u0651,\u064C,\u064D,\u064B,\u0654,\u0656,\u0670,\u0653,\u064F,\u0650,\u064E,\u0640\u0640\u0640|\u0640",
-        /* 57 */ "\u064B",
+        /* 57 */ "!fixedColumnOrder!7,\u0655,\u0652,\u0651,\u064C,\u064D,\u064B,\u0654,\u0656,\u0670,\u0653,\u064F,\u0650,\u064E,\u0640\u0640\u0640|\u0640",
+        /* 58 */ "\u064B",
         // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE
-        /* 58 */ "\u06F1",
+        /* 59 */ "\u06F1",
         // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO
-        /* 59 */ "\u06F2",
+        /* 60 */ "\u06F2",
         // U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE
-        /* 60 */ "\u06F3",
+        /* 61 */ "\u06F3",
         // U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR
-        /* 61 */ "\u06F4",
+        /* 62 */ "\u06F4",
         // U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE
-        /* 62 */ "\u06F5",
+        /* 63 */ "\u06F5",
         // U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX
-        /* 63 */ "\u06F6",
+        /* 64 */ "\u06F6",
         // U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN
-        /* 64 */ "\u06F7",
+        /* 65 */ "\u06F7",
         // U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT
-        /* 65 */ "\u06F8",
+        /* 66 */ "\u06F8",
         // U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE
-        /* 66 */ "\u06F9",
+        /* 67 */ "\u06F9",
         // U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO
-        /* 67 */ "\u06F0",
-        /* 68 */ "1",
-        /* 69 */ "2",
-        /* 70 */ "3",
-        /* 71 */ "4",
-        /* 72 */ "5",
-        /* 73 */ "6",
-        /* 74 */ "7",
-        /* 75 */ "8",
-        /* 76 */ "9",
+        /* 68 */ "\u06F0",
+        // Label for "switch to symbols" key.
+        // U+061F: "؟" ARABIC QUESTION MARK
+        /* 69 */ "\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.
+        /* 70 */ "\u06F3\u06F2\u06F1",
+        /* 71 */ "1",
+        /* 72 */ "2",
+        /* 73 */ "3",
+        /* 74 */ "4",
+        /* 75 */ "5",
+        /* 76 */ "6",
+        /* 77 */ "7",
+        /* 78 */ "8",
+        /* 79 */ "9",
         // U+066B: "٫" ARABIC DECIMAL SEPARATOR
         // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
-        /* 77 */ "0,\u066B,\u066C",
-        /* 78~ */
+        /* 80 */ "0,\u066B,\u066C",
+        /* 81~ */
         null, null, null, null, null, null, null, null, null, null,
-        /* ~87 */
+        /* ~90 */
         // U+060C: "،" ARABIC COMMA
-        /* 88 */ "\u060C",
-        /* 89 */ "\\,",
-        /* 90 */ "\u061F",
-        /* 91 */ "\u061B",
+        /* 91 */ "\u060C",
+        /* 92 */ "\\,",
+        /* 93 */ "\u061F",
+        /* 94 */ "\u061B",
         // U+066A: "٪" ARABIC PERCENT SIGN
-        /* 92 */ "\u066A",
-        /* 93 */ null,
-        /* 94 */ "?",
-        /* 95 */ ";",
+        /* 95 */ "\u066A",
+        /* 96 */ null,
+        /* 97 */ "?",
+        /* 98 */ ";",
         // U+2030: "‰" PER MILLE SIGN
-        /* 96 */ "\\%,\u2030",
+        /* 99 */ "\\%,\u2030",
         // 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
-        /* 97 */ "\u060C",
-        /* 98 */ "!",
-        /* 99 */ "!,\\,",
-        /* 100 */ "\u061F",
-        /* 101 */ "\u061F,?",
-        /* 102 */ "\u060C",
+        /* 100 */ "\u060C",
+        /* 101 */ "!",
+        /* 102 */ "!,\\,",
         /* 103 */ "\u061F",
-        /* 104 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 104 */ "\u061F,?",
+        /* 105 */ "\u060C",
+        /* 106 */ "\u061F",
+        /* 107 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
     };
 
     /* Language fi: Finnish */
@@ -1435,44 +1502,56 @@
         /* 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,
-        /* ~45 */
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~41 */
+        // Label for "switch to alphabetic" key.
+        // U+0915: "क" DEVANAGARI LETTER KA
+        // U+0916: "ख" DEVANAGARI LETTER KHA
+        // U+0917: "ग" DEVANAGARI LETTER GA
+        /* 42 */ "\u0915\u0916\u0917",
+        /* 43~ */
+        null, null, null, null,
+        /* ~46 */
         // U+20B9: "₹" INDIAN RUPEE SIGN
-        /* 46 */ "\u20B9",
-        /* 47~ */
+        /* 47 */ "\u20B9",
+        /* 48~ */
         null, null, null, null, null, null, null, null, null, null, null,
-        /* ~57 */
+        /* ~58 */
         // U+0967: "१" DEVANAGARI DIGIT ONE
-        /* 58 */ "\u0967",
+        /* 59 */ "\u0967",
         // U+0968: "२" DEVANAGARI DIGIT TWO
-        /* 59 */ "\u0968",
+        /* 60 */ "\u0968",
         // U+0969: "३" DEVANAGARI DIGIT THREE
-        /* 60 */ "\u0969",
+        /* 61 */ "\u0969",
         // U+096A: "४" DEVANAGARI DIGIT FOUR
-        /* 61 */ "\u096A",
+        /* 62 */ "\u096A",
         // U+096B: "५" DEVANAGARI DIGIT FIVE
-        /* 62 */ "\u096B",
+        /* 63 */ "\u096B",
         // U+096C: "६" DEVANAGARI DIGIT SIX
-        /* 63 */ "\u096C",
+        /* 64 */ "\u096C",
         // U+096D: "७" DEVANAGARI DIGIT SEVEN
-        /* 64 */ "\u096D",
+        /* 65 */ "\u096D",
         // U+096E: "८" DEVANAGARI DIGIT EIGHT
-        /* 65 */ "\u096E",
+        /* 66 */ "\u096E",
         // U+096F: "९" DEVANAGARI DIGIT NINE
-        /* 66 */ "\u096F",
+        /* 67 */ "\u096F",
         // U+0966: "०" DEVANAGARI DIGIT ZERO
-        /* 67 */ "\u0966",
-        /* 68 */ "1",
-        /* 69 */ "2",
-        /* 70 */ "3",
-        /* 71 */ "4",
-        /* 72 */ "5",
-        /* 73 */ "6",
-        /* 74 */ "7",
-        /* 75 */ "8",
-        /* 76 */ "9",
-        /* 77 */ "0",
+        /* 68 */ "\u0966",
+        // Label for "switch to symbols" key.
+        /* 69 */ "?\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.
+        /* 70 */ "\u0967\u0968\u0969",
+        /* 71 */ "1",
+        /* 72 */ "2",
+        /* 73 */ "3",
+        /* 74 */ "4",
+        /* 75 */ "5",
+        /* 76 */ "6",
+        /* 77 */ "7",
+        /* 78 */ "8",
+        /* 79 */ "9",
+        /* 80 */ "0",
     };
 
     /* Language hr: Croatian */
@@ -1660,29 +1739,35 @@
         /* 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,
-        /* ~42 */
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~41 */
+        // Label for "switch to alphabetic" key.
+        // U+05D0: "א" HEBREW LETTER ALEF
+        // U+05D1: "ב" HEBREW LETTER BET
+        // U+05D2: "ג" HEBREW LETTER GIMEL
+        /* 42 */ "\u05D0\u05D1\u05D2",
+        /* 43 */ null,
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
         // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
-        /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB",
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
-        /* 45 */ null,
+        /* 45 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
+        /* 46 */ null,
         // U+20AA: "₪" NEW SHEQEL SIGN
-        /* 46 */ "\u20AA",
-        /* 47 */ null,
+        /* 47 */ "\u20AA",
         /* 48 */ null,
+        /* 49 */ null,
         // U+2605: "★" BLACK STAR
-        /* 49 */ "\u2605",
-        /* 50 */ null,
+        /* 50 */ "\u2605",
+        /* 51 */ null,
         // U+00B1: "±" PLUS-MINUS SIGN
         // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
-        /* 51 */ "\u00B1,\uFB29",
+        /* 52 */ "\u00B1,\uFB29",
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 52 */ "!fixedColumnOrder!3,<|>,{|},[|]",
-        /* 53 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
+        /* 53 */ "!fixedColumnOrder!3,<|>,{|},[|]",
+        /* 54 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
@@ -1698,8 +1783,22 @@
         // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
         // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
         // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        /* 54 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 55 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+        /* 55 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
+        /* 56 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+    };
+
+    /* Language ka: Georgian */
+    private static final String[] LANGUAGE_ka = {
+        /* 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,
+        /* ~41 */
+        // Label for "switch to alphabetic" key.
+        // U+10D0: "ა" GEORGIAN LETTER AN
+        // U+10D1: "ბ" GEORGIAN LETTER BAN
+        // U+10D2: "გ" GEORGIAN LETTER GAN
+        /* 42 */ "\u10D0\u10D1\u10D2",
     };
 
     /* Language ky: Kirghiz */
@@ -1733,6 +1832,12 @@
         /* ~39 */
         // U+0451: "ё" CYRILLIC SMALL LETTER IO
         /* 40 */ "\u0451",
+        /* 41 */ null,
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 42 */ "\u0410\u0411\u0412",
     };
 
     /* Language lt: Lithuanian */
@@ -1933,7 +2038,12 @@
         /* 40 */ "\u0450",
         // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
         /* 41 */ "\u045D",
-        /* 42 */ null,
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 42 */ "\u0410\u0411\u0412",
+        /* 43 */ null,
         // U+2018: "‘" LEFT SINGLE QUOTATION MARK
         // U+2019: "’" RIGHT SINGLE QUOTATION MARK
         // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
@@ -1944,10 +2054,10 @@
         // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
         // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string>
-        /* 43 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB",
+        /* 44 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB",
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 44 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
+        /* 45 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
     };
 
     /* Language mn: Mongolian */
@@ -1955,11 +2065,18 @@
         /* 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,
-        /* ~45 */
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~41 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 42 */ "\u0410\u0411\u0412",
+        /* 43~ */
+        null, null, null, null,
+        /* ~46 */
         // U+20AE: "₮" TUGRIK SIGN
-        /* 46 */ "\u20AE",
+        /* 47 */ "\u20AE",
     };
 
     /* Language nb: Norwegian Bokmål */
@@ -2239,6 +2356,12 @@
         /* ~39 */
         // U+0451: "ё" CYRILLIC SMALL LETTER IO
         /* 40 */ "\u0451",
+        /* 41 */ null,
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 42 */ "\u0410\u0411\u0412",
     };
 
     /* Language sk: Slovak */
@@ -2388,8 +2511,13 @@
         /* 40 */ "\u0450",
         // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
         /* 41 */ "\u045D",
-        /* 42 */ null,
         // 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
+        /* 42 */ "\u0410\u0411\u0412",
+        /* 43 */ null,
         // U+2018: "‘" LEFT SINGLE QUOTATION MARK
         // U+2019: "’" RIGHT SINGLE QUOTATION MARK
         // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
@@ -2400,10 +2528,10 @@
         // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
         // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string>
-        /* 43 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB",
+        /* 44 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB",
         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 44 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
+        /* 45 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
     };
 
     /* Language sv: Swedish */
@@ -2504,11 +2632,18 @@
         /* 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,
-        /* ~45 */
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~41 */
+        // Label for "switch to alphabetic" key.
+        // U+0E01: "ก" THAI CHARACTER KO KAI
+        // U+0E02: "ข" THAI CHARACTER KHO KHAI
+        // U+0E04: "ค" THAI CHARACTER KHO KHWAI
+        /* 42 */ "\u0E01\u0E02\u0E04",
+        /* 43~ */
+        null, null, null, null,
+        /* ~46 */
         // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
-        /* 46 */ "\u0E3F",
+        /* 47 */ "\u0E3F",
     };
 
     /* Language tl: Tagalog */
@@ -2636,10 +2771,18 @@
         // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
         /* 35 */ "\u044A",
         /* 36~ */
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~45 */
+        null, null, null, null, null, null,
+        /* ~41 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 42 */ "\u0410\u0411\u0412",
+        /* 43~ */
+        null, null, null, null,
+        /* ~46 */
         // U+20B4: "₴" HRYVNIA SIGN
-        /* 46 */ "\u20B4",
+        /* 47 */ "\u20B4",
     };
 
     /* Language vi: Vietnamese */
@@ -2724,10 +2867,10 @@
         /* 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,
-        /* ~45 */
+        null, null, null, null, null, null, null,
+        /* ~46 */
         // U+20AB: "₫" DONG SIGN
-        /* 46 */ "\u20AB",
+        /* 47 */ "\u20AB",
     };
 
     /* Language zu: Zulu */
@@ -2905,10 +3048,12 @@
         "af", LANGUAGE_af, /* Afrikaans */
         "ar", LANGUAGE_ar, /* Arabic */
         "be", LANGUAGE_be, /* Belarusian */
+        "bg", LANGUAGE_bg, /* Bulgarian */
         "ca", LANGUAGE_ca, /* Catalan */
         "cs", LANGUAGE_cs, /* Czech */
         "da", LANGUAGE_da, /* Danish */
         "de", LANGUAGE_de, /* German */
+        "el", LANGUAGE_el, /* Greek */
         "en", LANGUAGE_en, /* English */
         "eo", LANGUAGE_eo, /* Esperanto */
         "es", LANGUAGE_es, /* Spanish */
@@ -2922,6 +3067,7 @@
         "is", LANGUAGE_is, /* Icelandic */
         "it", LANGUAGE_it, /* Italian */
         "iw", LANGUAGE_iw, /* Hebrew */
+        "ka", LANGUAGE_ka, /* Georgian */
         "ky", LANGUAGE_ky, /* Kirghiz */
         "lt", LANGUAGE_lt, /* Lithuanian */
         "lv", LANGUAGE_lv, /* Latvian */
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index dcbbfca..9d52f3a 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -824,6 +824,7 @@
         }
         // Remove pending messages related to update suggestions
         mHandler.cancelUpdateSuggestionStrip();
+        resetComposingState(true /* alsoResetLastComposedWord */);
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
index fb1eb27..f1a7e97 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
@@ -1412,8 +1412,6 @@
     private static WeightedString getWordAtAddressWithParentAddress(
             final FusionDictionaryBufferInterface buffer, final int headerSize, final int address,
             final FormatOptions options) {
-        final StringBuilder builder = new StringBuilder();
-
         int currentAddress = address;
         int index = FormatSpec.MAX_WORD_LENGTH - 1;
         int frequency = Integer.MIN_VALUE;
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
index 2f146f8..89d6c90 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -294,6 +294,8 @@
             final String[] gatheredSuggestions;
             final boolean hasRecommendedSuggestions;
             if (0 == mLength) {
+                // TODO: the comment below describes what is intended, but in the practice
+                // mBestSuggestion is only ever set to null so it doesn't work. Fix this.
                 // Either we found no suggestions, or we found some BUT the max length was 0.
                 // If we found some mBestSuggestion will not be null. If it is null, then
                 // we found none, regardless of the max length.
diff --git a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java
index f0017c0..26a304e 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java
@@ -17,66 +17,17 @@
 package com.android.inputmethod.latin.suggestions;
 
 import android.content.Context;
-import android.content.res.Resources;
 import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
 
-import com.android.inputmethod.keyboard.KeyDetector;
 import com.android.inputmethod.keyboard.Keyboard;
-import com.android.inputmethod.keyboard.KeyboardActionListener;
-import com.android.inputmethod.keyboard.KeyboardView;
-import com.android.inputmethod.keyboard.MoreKeysDetector;
-import com.android.inputmethod.keyboard.MoreKeysPanel;
-import com.android.inputmethod.keyboard.PointerTracker;
-import com.android.inputmethod.keyboard.PointerTracker.DrawingProxy;
-import com.android.inputmethod.keyboard.PointerTracker.KeyEventHandler;
-import com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
-import com.android.inputmethod.latin.CoordinateUtils;
+import com.android.inputmethod.keyboard.MoreKeysKeyboardView;
 import com.android.inputmethod.latin.R;
 
 /**
  * A view that renders a virtual {@link MoreSuggestions}. It handles rendering of keys and detecting
  * key presses and touch movements.
  */
-public final class MoreSuggestionsView extends KeyboardView implements MoreKeysPanel {
-    private final int[] mCoordinates = CoordinateUtils.newInstance();
-
-    final KeyDetector mModalPanelKeyDetector;
-    private final KeyDetector mSlidingPanelKeyDetector;
-
-    private Controller mController;
-    KeyboardActionListener mListener;
-    private int mOriginX;
-    private int mOriginY;
-
-    static final TimerProxy EMPTY_TIMER_PROXY = new TimerProxy.Adapter();
-
-    final KeyboardActionListener mSuggestionsPaneListener =
-            new KeyboardActionListener.Adapter() {
-        @Override
-        public void onPressKey(final int primaryCode) {
-            mListener.onPressKey(primaryCode);
-        }
-
-        @Override
-        public void onReleaseKey(final int primaryCode, final boolean withSliding) {
-            mListener.onReleaseKey(primaryCode, withSliding);
-        }
-
-        @Override
-        public void onCodeInput(final int primaryCode, final int x, final int y) {
-            final int index = primaryCode - MoreSuggestions.SUGGESTION_CODE_BASE;
-            if (index >= 0 && index < SuggestionStripView.MAX_SUGGESTIONS) {
-                mListener.onCustomRequest(index);
-            }
-        }
-
-        @Override
-        public void onCancelInput() {
-            mListener.onCancelInput();
-        }
-    };
+public final class MoreSuggestionsView extends MoreKeysKeyboardView {
 
     public MoreSuggestionsView(final Context context, final AttributeSet attrs) {
         this(context, attrs, R.attr.moreSuggestionsViewStyle);
@@ -85,12 +36,12 @@
     public MoreSuggestionsView(final Context context, final AttributeSet attrs,
             final int defStyle) {
         super(context, attrs, defStyle);
+    }
 
-        final Resources res = context.getResources();
-        mModalPanelKeyDetector = new KeyDetector(/* keyHysteresisDistance */ 0);
-        mSlidingPanelKeyDetector = new MoreKeysDetector(
-                res.getDimension(R.dimen.more_suggestions_slide_allowance));
-        setKeyPreviewPopupEnabled(false, 0);
+    @Override
+    protected int getDefaultCoordX() {
+        final MoreSuggestions pane = (MoreSuggestions)getKeyboard();
+        return pane.mOccupiedWidth / 2;
     }
 
     @Override
@@ -110,119 +61,11 @@
     }
 
     @Override
-    public void setKeyboard(final Keyboard keyboard) {
-        super.setKeyboard(keyboard);
-        mModalPanelKeyDetector.setKeyboard(keyboard, -getPaddingLeft(), -getPaddingTop());
-        mSlidingPanelKeyDetector.setKeyboard(keyboard, -getPaddingLeft(),
-                -getPaddingTop() + mVerticalCorrection);
-    }
-
-    @Override
-    public KeyDetector getKeyDetector() {
-        return mSlidingPanelKeyDetector;
-    }
-
-    @Override
-    public KeyboardActionListener getKeyboardActionListener() {
-        return mSuggestionsPaneListener;
-    }
-
-    @Override
-    public DrawingProxy getDrawingProxy() {
-        return this;
-    }
-
-    @Override
-    public TimerProxy getTimerProxy() {
-        return EMPTY_TIMER_PROXY;
-    }
-
-    @Override
-    public void setKeyPreviewPopupEnabled(final boolean previewEnabled, final int delay) {
-        // Suggestions pane needs no pop-up key preview displayed, so we pass always false with a
-        // delay of 0. The delay does not matter actually since the popup is not shown anyway.
-        super.setKeyPreviewPopupEnabled(false, 0);
-    }
-
-    @Override
-    public void showMoreKeysPanel(final View parentView, final Controller controller,
-            final int pointX, final int pointY, final KeyboardActionListener listener) {
-        mController = controller;
-        mListener = listener;
-        final View container = getContainerView();
-        final MoreSuggestions pane = (MoreSuggestions)getKeyboard();
-        final int defaultCoordX = pane.mOccupiedWidth / 2;
-        // The coordinates of panel's left-top corner in parentView's coordinate system.
-        final int x = pointX - defaultCoordX - container.getPaddingLeft();
-        final int y = pointY - container.getMeasuredHeight() + container.getPaddingBottom();
-
-        parentView.getLocationInWindow(mCoordinates);
-        // Ensure the horizontal position of the panel does not extend past the screen edges.
-        final int maxX = parentView.getMeasuredWidth() - container.getMeasuredWidth();
-        final int panelX = Math.max(0, Math.min(maxX, x + CoordinateUtils.x(mCoordinates)));
-        final int panelY = y + CoordinateUtils.y(mCoordinates);
-        container.setX(panelX);
-        container.setY(panelY);
-
-        mOriginX = x + container.getPaddingLeft();
-        mOriginY = y + container.getPaddingTop();
-        controller.onShowMoreKeysPanel(this);
-    }
-
-    @Override
-    public boolean dismissMoreKeysPanel() {
-        if (mController == null) return false;
-        return mController.onDismissMoreKeysPanel();
-    }
-
-    @Override
-    public int translateX(final int x) {
-        return x - mOriginX;
-    }
-
-    @Override
-    public int translateY(final int y) {
-        return y - mOriginY;
-    }
-
-    private final KeyEventHandler mModalPanelKeyEventHandler = new KeyEventHandler() {
-        @Override
-        public KeyDetector getKeyDetector() {
-            return mModalPanelKeyDetector;
+    public void onCodeInput(final int primaryCode, final int x, final int y) {
+        final int index = primaryCode - MoreSuggestions.SUGGESTION_CODE_BASE;
+        if (index >= 0 && index < SuggestionStripView.MAX_SUGGESTIONS) {
+            mListener.onCustomRequest(index);
         }
-
-        @Override
-        public KeyboardActionListener getKeyboardActionListener() {
-            return mSuggestionsPaneListener;
-        }
-
-        @Override
-        public DrawingProxy getDrawingProxy() {
-            return MoreSuggestionsView.this;
-        }
-
-        @Override
-        public TimerProxy getTimerProxy() {
-            return EMPTY_TIMER_PROXY;
-        }
-    };
-
-    @Override
-    public boolean onTouchEvent(final MotionEvent me) {
-        final int action = me.getAction();
-        final long eventTime = me.getEventTime();
-        final int index = me.getActionIndex();
-        final int id = me.getPointerId(index);
-        final PointerTracker tracker = PointerTracker.getPointerTracker(id, this);
-        final int x = (int)me.getX(index);
-        final int y = (int)me.getY(index);
-        tracker.processMotionEvent(action, x, y, eventTime, mModalPanelKeyEventHandler);
-        return true;
-    }
-
-    @Override
-    public View getContainerView() {
-        return (View)getParent();
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index e27fc2a..d7b514e 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -54,7 +54,6 @@
 import com.android.inputmethod.keyboard.KeyboardSwitcher;
 import com.android.inputmethod.keyboard.KeyboardView;
 import com.android.inputmethod.keyboard.MoreKeysPanel;
-import com.android.inputmethod.keyboard.PointerTracker;
 import com.android.inputmethod.keyboard.ViewLayoutUtils;
 import com.android.inputmethod.latin.AutoCorrection;
 import com.android.inputmethod.latin.CollectionUtils;
@@ -685,6 +684,11 @@
         public void onShowMoreKeysPanel(MoreKeysPanel panel) {
             mKeyboardView.onShowMoreKeysPanel(panel);
         }
+
+        @Override
+        public void onCancelMoreKeysPanel() {
+            dismissMoreSuggestions();
+        }
     };
 
     boolean dismissMoreSuggestions() {
@@ -771,7 +775,6 @@
         final long eventTime = me.getEventTime();
         final int index = me.getActionIndex();
         final int id = me.getPointerId(index);
-        final PointerTracker tracker = PointerTracker.getPointerTracker(id, moreKeysPanel);
         final int x = (int)me.getX(index);
         final int y = (int)me.getY(index);
         final int translatedX = moreKeysPanel.translateX(x);
@@ -783,7 +786,6 @@
                 // Decided to be in the sliding input mode only when the touch point has been moved
                 // upward.
                 mMoreSuggestionsMode = MORE_SUGGESTIONS_IN_SLIDING_MODE;
-                tracker.onShowMoreKeysPanel(translatedX, translatedY, moreKeysPanel);
             } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP) {
                 // Decided to be in the modal input mode
                 mMoreSuggestionsMode = MORE_SUGGESTIONS_IN_MODAL_MODE;
@@ -792,7 +794,7 @@
         }
 
         // MORE_SUGGESTIONS_IN_SLIDING_MODE
-        tracker.processMotionEvent(action, translatedX, translatedY, eventTime, moreKeysPanel);
+        mMoreSuggestionsView.processMotionEvent(action, translatedX, translatedY, id, eventTime);
         return true;
     }
 
diff --git a/native/jni/src/correction.cpp b/native/jni/src/correction.cpp
index 50f33fe..46ca911 100644
--- a/native/jni/src/correction.cpp
+++ b/native/jni/src/correction.cpp
@@ -14,11 +14,6 @@
  * limitations under the License.
  */
 
-#include <cassert>
-#include <cctype>
-#include <cmath>
-#include <cstring>
-
 #define LOG_TAG "LatinIME: correction.cpp"
 
 #include "char_utils.h"
@@ -1002,7 +997,7 @@
 float Correction::RankingAlgorithm::calcNormalizedScore(const int *before, const int beforeLength,
         const int *after, const int afterLength, const int score) {
     if (0 == beforeLength || 0 == afterLength) {
-        return 0;
+        return 0.0f;
     }
     const int distance = editDistance(before, beforeLength, after, afterLength);
     int spaceCount = 0;
@@ -1013,7 +1008,7 @@
     }
 
     if (spaceCount == afterLength) {
-        return 0;
+        return 0.0f;
     }
 
     const float maxScore = score >= S_INT_MAX ? static_cast<float>(S_INT_MAX)
diff --git a/native/jni/src/correction.h b/native/jni/src/correction.h
index 912cd83..4184c64 100644
--- a/native/jni/src/correction.h
+++ b/native/jni/src/correction.h
@@ -19,7 +19,6 @@
 
 #include <cassert>
 #include <cstring> // for memset()
-#include <stdint.h>
 
 #include "correction_state.h"
 #include "defines.h"
@@ -237,7 +236,7 @@
     int mTerminalOutputIndex;
     int mMaxErrors;
 
-    uint8_t mTotalTraverseCount;
+    int mTotalTraverseCount;
 
     // The following arrays are state buffer.
     int mWord[MAX_WORD_LENGTH_INTERNAL];
@@ -352,7 +351,7 @@
     const int prevCO = outputLength >= 2 ? toBaseLowerCase(output[outputLength - 2]) : 0;
     for (int i = 1; i <= inputSize; ++i) {
         const int ci = toBaseLowerCase(input[i - 1]);
-        const uint16_t cost = (ci == co) ? 0 : 1;
+        const int cost = (ci == co) ? 0 : 1;
         current[i] = min(current[i - 1] + 1, min(prev[i] + 1, prev[i - 1] + cost));
         if (i >= 2 && prevprev && ci == prevCO && co == toBaseLowerCase(input[i - 2])) {
             current[i] = min(current[i], prevprev[i - 2] + 1);
diff --git a/native/jni/src/defines.h b/native/jni/src/defines.h
index a6dd2fd..90f714b 100644
--- a/native/jni/src/defines.h
+++ b/native/jni/src/defines.h
@@ -237,9 +237,6 @@
 
 #endif // FLAG_DBG
 
-#ifndef U_SHORT_MAX
-#define U_SHORT_MAX 65535    // ((1 << 16) - 1)
-#endif
 #ifndef S_INT_MAX
 #define S_INT_MAX 2147483647 // ((1 << 31) - 1)
 #endif
@@ -376,6 +373,7 @@
 #define MIN_USER_TYPED_LENGTH_FOR_EXCESSIVE_CHARACTER_SUGGESTION 3
 
 // TODO: Remove
+#define MAX_POINTER_COUNT 1
 #define MAX_POINTER_COUNT_FOR_G 2
 
 // Size, in bytes, of the bloom filter index for bigrams
diff --git a/native/jni/src/proximity_info.cpp b/native/jni/src/proximity_info.cpp
index d38ea67..ffe12ce 100644
--- a/native/jni/src/proximity_info.cpp
+++ b/native/jni/src/proximity_info.cpp
@@ -15,7 +15,6 @@
  */
 
 #include <cassert>
-#include <cmath>
 #include <cstring>
 
 #define LOG_TAG "LatinIME: proximity_info.cpp"
diff --git a/native/jni/src/proximity_info_state.cpp b/native/jni/src/proximity_info_state.cpp
index 39d53fb..549ac35 100644
--- a/native/jni/src/proximity_info_state.cpp
+++ b/native/jni/src/proximity_info_state.cpp
@@ -39,12 +39,8 @@
         const ProximityInfo *proximityInfo, const int *const inputCodes, const int inputSize,
         const int *const xCoordinates, const int *const yCoordinates, const int *const times,
         const int *const pointerIds, const bool isGeometric) {
-    if (isGeometric) {
-        mIsContinuationPossible = checkAndReturnIsContinuationPossible(
-                inputSize, xCoordinates, yCoordinates, times);
-    } else {
-        mIsContinuationPossible = false;
-    }
+    mIsContinuationPossible = checkAndReturnIsContinuationPossible(
+            inputSize, xCoordinates, yCoordinates, times, isGeometric);
 
     mProximityInfo = proximityInfo;
     mHasTouchPositionCorrectionData = proximityInfo->hasTouchPositionCorrectionData();
@@ -466,13 +462,27 @@
 }
 
 bool ProximityInfoState::checkAndReturnIsContinuationPossible(const int inputSize,
-        const int *const xCoordinates, const int *const yCoordinates, const int *const times) {
-    for (int i = 0; i < mSampledInputSize; ++i) {
-        const int index = mInputIndice[i];
-        if (index > inputSize || xCoordinates[index] != mSampledInputXs[i] ||
-                yCoordinates[index] != mSampledInputYs[i] || times[index] != mTimes[i]) {
+        const int *const xCoordinates, const int *const yCoordinates, const int *const times,
+        const bool isGeometric) const {
+    if (isGeometric) {
+        for (int i = 0; i < mSampledInputSize; ++i) {
+            const int index = mInputIndice[i];
+            if (index > inputSize || xCoordinates[index] != mSampledInputXs[i] ||
+                    yCoordinates[index] != mSampledInputYs[i] || times[index] != mTimes[i]) {
+                return false;
+            }
+        }
+    } else {
+        if (inputSize < mSampledInputSize) {
+            // Assuming the cache is invalid if the previous input size is larger than the new one.
             return false;
         }
+        for (int i = 0; i < mSampledInputSize && i < MAX_WORD_LENGTH_INTERNAL; ++i) {
+            if (xCoordinates[i] != mSampledInputXs[i]
+                    || yCoordinates[i] != mSampledInputYs[i]) {
+                return false;
+            }
+        }
     }
     return true;
 }
@@ -658,11 +668,15 @@
     return 0;
 }
 
-float ProximityInfoState::getPointToKeyLength(const int inputIndex, const int codePoint) const {
+// TODO: Remove the "scale" parameter
+// This function basically converts from a length to an edit distance. Accordingly, it's obviously
+// wrong to compare with mMaxPointToKeyLength.
+float ProximityInfoState::getPointToKeyLength(
+        const int inputIndex, const int codePoint, const float scale) const {
     const int keyId = mProximityInfo->getKeyIndexOf(codePoint);
     if (keyId != NOT_AN_INDEX) {
         const int index = inputIndex * mProximityInfo->getKeyCount() + keyId;
-        return min(mDistanceCache[index], mMaxPointToKeyLength);
+        return min(mDistanceCache[index] * scale, mMaxPointToKeyLength);
     }
     if (isSkippableCodePoint(codePoint)) {
         return 0.0f;
@@ -671,15 +685,27 @@
     return MAX_POINT_TO_KEY_LENGTH;
 }
 
-float ProximityInfoState::getPointToKeyByIdLength(const int inputIndex, const int keyId) const {
+float ProximityInfoState::getPointToKeyLength(const int inputIndex, const int codePoint) const {
+    return getPointToKeyLength(inputIndex, codePoint, 1.0f);
+}
+
+// TODO: Remove the "scale" parameter
+// This function basically converts from a length to an edit distance. Accordingly, it's obviously
+// wrong to compare with mMaxPointToKeyLength.
+float ProximityInfoState::getPointToKeyByIdLength(
+        const int inputIndex, const int keyId, const float scale) const {
     if (keyId != NOT_AN_INDEX) {
         const int index = inputIndex * mProximityInfo->getKeyCount() + keyId;
-        return min(mDistanceCache[index], mMaxPointToKeyLength);
+        return min(mDistanceCache[index] * scale, mMaxPointToKeyLength);
     }
     // If the char is not a key on the keyboard then return the max length.
     return static_cast<float>(MAX_POINT_TO_KEY_LENGTH);
 }
 
+float ProximityInfoState::getPointToKeyByIdLength(const int inputIndex, const int keyId) const {
+    return getPointToKeyByIdLength(inputIndex, keyId, 1.0f);
+}
+
 // In the following function, c is the current character of the dictionary word currently examined.
 // currentChars is an array containing the keys close to the character the user actually typed at
 // the same position. We want to see if c is in it: if so, then the word contains at that position
diff --git a/native/jni/src/proximity_info_state.h b/native/jni/src/proximity_info_state.h
index d3b4062..b1ad373 100644
--- a/native/jni/src/proximity_info_state.h
+++ b/native/jni/src/proximity_info_state.h
@@ -155,8 +155,10 @@
         return mIsContinuationPossible;
     }
 
-    float getPointToKeyLength(const int inputIndex, const int charCode) const;
+    float getPointToKeyByIdLength(const int inputIndex, const int keyId, const float scale) const;
     float getPointToKeyByIdLength(const int inputIndex, const int keyId) const;
+    float getPointToKeyLength(const int inputIndex, const int codePoint, const float scale) const;
+    float getPointToKeyLength(const int inputIndex, const int codePoint) const;
 
     ProximityType getMatchedProximityId(const int index, const int c,
             const bool checkProximityChars, int *proximityIndex = 0) const;
@@ -242,7 +244,7 @@
             const NearKeysDistanceMap *const prevNearKeysDistances,
             const NearKeysDistanceMap *const prevPrevNearKeysDistances) const;
     bool checkAndReturnIsContinuationPossible(const int inputSize, const int *const xCoordinates,
-            const int *const yCoordinates, const int *const times);
+            const int *const yCoordinates, const int *const times, const bool isGeometric) const;
     void popInputData();
     void updateAlignPointProbabilities(const int start);
     bool suppressCharProbabilities(const int index1, const int index2);
diff --git a/native/jni/src/terminal_attributes.h b/native/jni/src/terminal_attributes.h
index fed3c72..6c2e0dc 100644
--- a/native/jni/src/terminal_attributes.h
+++ b/native/jni/src/terminal_attributes.h
@@ -17,6 +17,7 @@
 #ifndef LATINIME_TERMINAL_ATTRIBUTES_H
 #define LATINIME_TERMINAL_ATTRIBUTES_H
 
+#include <stdint.h>
 #include "binary_format.h"
 
 namespace latinime {
diff --git a/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl b/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
index 00637af..a134923 100644
--- a/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
+++ b/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
@@ -97,9 +97,6 @@
         "label_done_key",
         "label_previous_key",
         // Other labels.
-        "label_to_alpha_key",
-        "label_to_symbol_key",
-        "label_to_symbol_with_microphone_key",
         "label_pause_key",
         "label_wait_key",
     };
diff --git a/tools/maketext/res/values-ar/donottranslate-more-keys.xml b/tools/maketext/res/values-ar/donottranslate-more-keys.xml
index 8028bb2..c404bed 100644
--- a/tools/maketext/res/values-ar/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-ar/donottranslate-more-keys.xml
@@ -18,6 +18,12 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- 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 -->
+    <string name="label_to_alpha_key">&#x0623;&#x200C;&#x0628;&#x200C;&#x062C;</string>
     <!-- U+0661: "١" ARABIC-INDIC DIGIT ONE -->
     <string name="keylabel_for_symbols_1">&#x0661;</string>
     <!-- U+0662: "٢" ARABIC-INDIC DIGIT TWO -->
@@ -38,6 +44,12 @@
     <string name="keylabel_for_symbols_9">&#x0669;</string>
     <!-- U+0660: "٠" ARABIC-INDIC DIGIT ZERO -->
     <string name="keylabel_for_symbols_0">&#x0660;</string>
+    <!-- Label for "switch to symbols" key.
+         U+061F: "؟" ARABIC QUESTION MARK -->
+    <string name="label_to_symbol_key">&#x0663;&#x0662;&#x0661;&#x061F;</string>
+    <!-- Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+         part because it'll be appended by the code. -->
+    <string name="label_to_symbol_with_microphone_key">&#x0663;&#x0662;&#x0661;</string>
     <string name="additional_more_keys_for_symbols_1">1</string>
     <string name="additional_more_keys_for_symbols_2">2</string>
     <string name="additional_more_keys_for_symbols_3">3</string>
diff --git a/tools/maketext/res/values-be/donottranslate-more-keys.xml b/tools/maketext/res/values-be/donottranslate-more-keys.xml
index a2056e9..c8f2167 100644
--- a/tools/maketext/res/values-be/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-be/donottranslate-more-keys.xml
@@ -32,4 +32,9 @@
     <string name="more_keys_for_cyrillic_ie">&#x0451;</string>
     <!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN -->
     <string name="more_keys_for_cyrillic_soft_sign">&#x044A;</string>
+    <!-- Label for "switch to alphabetic" key.
+         U+0410: "А" CYRILLIC CAPITAL LETTER A
+         U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+         U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
+    <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
 </resources>
diff --git a/tools/maketext/res/values-bg/donottranslate-more-keys.xml b/tools/maketext/res/values-bg/donottranslate-more-keys.xml
new file mode 100644
index 0000000..e7570df
--- /dev/null
+++ b/tools/maketext/res/values-bg/donottranslate-more-keys.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Label for "switch to alphabetic" key.
+         U+0410: "А" CYRILLIC CAPITAL LETTER A
+         U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+         U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
+    <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
+</resources>
diff --git a/tools/maketext/res/values-el/donottranslate-more-keys.xml b/tools/maketext/res/values-el/donottranslate-more-keys.xml
new file mode 100644
index 0000000..964dba0
--- /dev/null
+++ b/tools/maketext/res/values-el/donottranslate-more-keys.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Label for "switch to alphabetic" key.
+         U+0391: "Α" GREEK CAPITAL LETTER ALPHA
+         U+0392: "Β" GREEK CAPITAL LETTER BETA
+         U+0393: "Γ" GREEK CAPITAL LETTER GAMMA -->
+    <string name="label_to_alpha_key">&#x0391;&#x0392;&#x0393;</string>
+</resources>
diff --git a/tools/maketext/res/values-fa/donottranslate-more-keys.xml b/tools/maketext/res/values-fa/donottranslate-more-keys.xml
index 544426c..47f21cc 100644
--- a/tools/maketext/res/values-fa/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-fa/donottranslate-more-keys.xml
@@ -18,6 +18,12 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- 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 -->
+    <string name="label_to_alpha_key">&#x0627;&#x200C;&#x0628;&#x200C;&#x067E;</string>
     <!-- U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE -->
     <string name="keylabel_for_symbols_1">&#x06F1;</string>
     <!-- U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO -->
@@ -38,6 +44,12 @@
     <string name="keylabel_for_symbols_9">&#x06F9;</string>
     <!-- U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO -->
     <string name="keylabel_for_symbols_0">&#x06F0;</string>
+    <!-- Label for "switch to symbols" key.
+         U+061F: "؟" ARABIC QUESTION MARK -->
+    <string name="label_to_symbol_key">&#x06F3;&#x06F2;&#x06F1;&#x061F;</string>
+    <!-- Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+         part because it'll be appended by the code. -->
+    <string name="label_to_symbol_with_microphone_key">&#x06F3;&#x06F2;&#x06F1;</string>
     <string name="additional_more_keys_for_symbols_1">1</string>
     <string name="additional_more_keys_for_symbols_2">2</string>
     <string name="additional_more_keys_for_symbols_3">3</string>
diff --git a/tools/maketext/res/values-hi/donottranslate-more-keys.xml b/tools/maketext/res/values-hi/donottranslate-more-keys.xml
index 00fd5bf..98ad2cb 100644
--- a/tools/maketext/res/values-hi/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-hi/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+0915: "क" DEVANAGARI LETTER KA
+         U+0916: "ख" DEVANAGARI LETTER KHA
+         U+0917: "ग" DEVANAGARI LETTER GA -->
+    <string name="label_to_alpha_key">&#x0915;&#x0916;&#x0917;</string>
     <!-- U+0967: "१" DEVANAGARI DIGIT ONE -->
     <string name="keylabel_for_symbols_1">&#x0967;</string>
     <!-- U+0968: "२" DEVANAGARI DIGIT TWO -->
@@ -38,6 +43,11 @@
     <string name="keylabel_for_symbols_9">&#x096F;</string>
     <!-- U+0966: "०" DEVANAGARI DIGIT ZERO -->
     <string name="keylabel_for_symbols_0">&#x0966;</string>
+    <!-- Label for "switch to symbols" key. -->
+    <string name="label_to_symbol_key">\?&#x0967;&#x0968;&#x0969;</string>
+    <!-- Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+         part because it'll be appended by the code. -->
+    <string name="label_to_symbol_with_microphone_key">&#x0967;&#x0968;&#x0969;</string>
     <string name="additional_more_keys_for_symbols_1">1</string>
     <string name="additional_more_keys_for_symbols_2">2</string>
     <string name="additional_more_keys_for_symbols_3">3</string>
diff --git a/tools/maketext/res/values-iw/donottranslate-more-keys.xml b/tools/maketext/res/values-iw/donottranslate-more-keys.xml
index 4e7ad48..20b4c6a 100644
--- a/tools/maketext/res/values-iw/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-iw/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+05D0: "א" HEBREW LETTER ALEF
+         U+05D1: "ב" HEBREW LETTER BET
+         U+05D2: "ג" HEBREW LETTER GIMEL -->
+    <string name="label_to_alpha_key">&#x05D0;&#x05D1;&#x05D2;</string>
     <!-- U+2605: "★" BLACK STAR -->
     <string name="more_keys_for_star">&#x2605;</string>
     <!-- U+00B1: "±" PLUS-MINUS SIGN
diff --git a/tools/maketext/res/values-ka/donottranslate-more-keys.xml b/tools/maketext/res/values-ka/donottranslate-more-keys.xml
new file mode 100644
index 0000000..c516c59
--- /dev/null
+++ b/tools/maketext/res/values-ka/donottranslate-more-keys.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Label for "switch to alphabetic" key.
+         U+10D0: "ა" GEORGIAN LETTER AN
+         U+10D1: "ბ" GEORGIAN LETTER BAN
+         U+10D2: "გ" GEORGIAN LETTER GAN -->
+    <string name="label_to_alpha_key">&#x10D0;&#x10D1;&#x10D2;</string>
+</resources>
diff --git a/tools/maketext/res/values-ky/donottranslate-more-keys.xml b/tools/maketext/res/values-ky/donottranslate-more-keys.xml
index a11ecf9..8d8c5fb 100644
--- a/tools/maketext/res/values-ky/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-ky/donottranslate-more-keys.xml
@@ -38,4 +38,9 @@
     <string name="more_keys_for_cyrillic_o">&#x04E9;</string>
     <!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN -->
     <string name="more_keys_for_cyrillic_soft_sign">&#x044A;</string>
+    <!-- Label for "switch to alphabetic" key.
+         U+0410: "А" CYRILLIC CAPITAL LETTER A
+         U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+         U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
+    <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
 </resources>
diff --git a/tools/maketext/res/values-mk/donottranslate-more-keys.xml b/tools/maketext/res/values-mk/donottranslate-more-keys.xml
index d0cccf6..d0fa1e4 100644
--- a/tools/maketext/res/values-mk/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-mk/donottranslate-more-keys.xml
@@ -30,6 +30,11 @@
     <string name="more_keys_for_cyrillic_ie">&#x0450;</string>
     <!-- U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE -->
     <string name="more_keys_for_cyrillic_i">&#x045D;</string>
+    <!-- Label for "switch to alphabetic" key.
+         U+0410: "А" CYRILLIC CAPITAL LETTER A
+         U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+         U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
+    <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
     <!-- U+2018: "‘" LEFT SINGLE QUOTATION MARK
          U+2019: "’" RIGHT SINGLE QUOTATION MARK
          U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
diff --git a/tools/maketext/res/values-mn/donottranslate-more-keys.xml b/tools/maketext/res/values-mn/donottranslate-more-keys.xml
index c6736e4..fd1853e 100644
--- a/tools/maketext/res/values-mn/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-mn/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+0410: "А" CYRILLIC CAPITAL LETTER A
+         U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+         U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
+    <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
     <!-- U+20AE: "₮" TUGRIK SIGN -->
     <string name="keylabel_for_currency_generic">&#x20AE;</string>
 </resources>
diff --git a/tools/maketext/res/values-ru/donottranslate-more-keys.xml b/tools/maketext/res/values-ru/donottranslate-more-keys.xml
index 82bed78..bb47fec 100644
--- a/tools/maketext/res/values-ru/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-ru/donottranslate-more-keys.xml
@@ -32,4 +32,9 @@
     <string name="more_keys_for_cyrillic_ie">&#x0451;</string>
     <!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN -->
     <string name="more_keys_for_cyrillic_soft_sign">&#x044A;</string>
+    <!-- Label for "switch to alphabetic" key.
+         U+0410: "А" CYRILLIC CAPITAL LETTER A
+         U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+         U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
+    <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
 </resources>
diff --git a/tools/maketext/res/values-sr/donottranslate-more-keys.xml b/tools/maketext/res/values-sr/donottranslate-more-keys.xml
index dcf0e85..c41ca95 100644
--- a/tools/maketext/res/values-sr/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-sr/donottranslate-more-keys.xml
@@ -49,6 +49,11 @@
     <!-- U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE -->
     <string name="more_keys_for_cyrillic_i">&#x045D;</string>
     <!-- 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 -->
+    <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
     <!-- U+2018: "‘" LEFT SINGLE QUOTATION MARK
          U+2019: "’" RIGHT SINGLE QUOTATION MARK
          U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
diff --git a/tools/maketext/res/values-th/donottranslate-more-keys.xml b/tools/maketext/res/values-th/donottranslate-more-keys.xml
index 1f2a820..6350d4b 100644
--- a/tools/maketext/res/values-th/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-th/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+0E01: "ก" THAI CHARACTER KO KAI
+         U+0E02: "ข" THAI CHARACTER KHO KHAI
+         U+0E04: "ค" THAI CHARACTER KHO KHWAI -->
+    <string name="label_to_alpha_key">&#x0E01;&#x0E02;&#x0E04;</string>
     <!-- U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT -->
     <string name="keylabel_for_currency_generic">&#x0E3F;</string>
 </resources>
diff --git a/tools/maketext/res/values-uk/donottranslate-more-keys.xml b/tools/maketext/res/values-uk/donottranslate-more-keys.xml
index 6df9c0a..09e246b 100644
--- a/tools/maketext/res/values-uk/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-uk/donottranslate-more-keys.xml
@@ -36,4 +36,9 @@
     <string name="more_keys_for_cyrillic_soft_sign">&#x044A;</string>
     <!-- U+20B4: "₴" HRYVNIA SIGN -->
     <string name="keylabel_for_currency_generic">&#x20B4;</string>
+    <!-- Label for "switch to alphabetic" key.
+         U+0410: "А" CYRILLIC CAPITAL LETTER A
+         U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+         U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
+    <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
 </resources>
diff --git a/tools/maketext/res/values/donottranslate-more-keys.xml b/tools/maketext/res/values/donottranslate-more-keys.xml
index 4d8ad10..a5be348 100644
--- a/tools/maketext/res/values/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values/donottranslate-more-keys.xml
@@ -60,6 +60,8 @@
     <string name="keylabel_for_south_slavic_row3_8"></string>
     <string name="more_keys_for_cyrillic_ie"></string>
     <string name="more_keys_for_cyrillic_i"></string>
+    <!-- Label for "switch to alphabetic" key. -->
+    <string name="label_to_alpha_key">ABC</string>
     <string name="more_keys_for_single_quote">!fixedColumnOrder!4,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
     <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
     <!-- <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;</string> -->
@@ -121,6 +123,11 @@
     <string name="keylabel_for_symbols_8">8</string>
     <string name="keylabel_for_symbols_9">9</string>
     <string name="keylabel_for_symbols_0">0</string>
+    <!-- Label for "switch to symbols" key. -->
+    <string name="label_to_symbol_key">\?123</string>
+    <!-- Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+         part because it'll be appended by the code. -->
+    <string name="label_to_symbol_with_microphone_key">123</string>
     <string name="additional_more_keys_for_symbols_1"></string>
     <string name="additional_more_keys_for_symbols_2"></string>
     <string name="additional_more_keys_for_symbols_3"></string>