am 45e11a0: AI 148026: Update zh_TW translations.

Merge commit '45e11a0ca13b063788815247dcc50b631b86c990' into donut

* commit '45e11a0ca13b063788815247dcc50b631b86c990':
  AI 148026: Update zh_TW translations.
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 5f64379..745cdac 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -63,6 +63,8 @@
     <string name="alternates_for_n">"ňñ"</string>
     <string name="alternates_for_c">"čç"</string>
     <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
     <string name="tip_long_press">"Podržením klávesy zobrazíte diakritiku (ž, á atd.)"</string>
     <string name="tip_dismiss">"Stisknutím klávesy Zpět ↶ můžete klávesnici kdykoli zavřít"</string>
     <string name="tip_access_symbols">"Přístup k číslům a symbolům"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 84f24a6..243292c 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -17,7 +17,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name">"Android-Tastatur"</string>
     <string name="english_ime_settings">"Android-Tastatureinstellungen"</string>
-    <string name="vibrate_on_keypress">"Vibrieren bei Tastendruck"</string>
+    <string name="vibrate_on_keypress">"Vibrieren auf Tastendruck"</string>
     <string name="sound_on_keypress">"Sound bei Tastendruck"</string>
     <string name="hit_correction">"Eingabefehler korrigieren"</string>
     <string name="hit_correction_summary">"Korrektur von Eingabefehlern aktivieren"</string>
@@ -28,7 +28,7 @@
     <string name="prediction">"Wortvorschläge"</string>
     <string name="prediction_category">"Einstellungen für Wortvorschläge"</string>
     <string name="prediction_summary">"Automatische Vervollständigung während der Eingabe aktivieren"</string>
-    <string name="auto_complete_dialog_title">"Autom. vervollständigen"</string>
+    <string name="auto_complete_dialog_title">"Automatische Vervollständigung"</string>
     <string name="prediction_landscape">"Textfeld vergrößern"</string>
     <string name="prediction_landscape_summary">"Wortvorschläge in Querformat ausblenden"</string>
     <string name="auto_cap">"Automatische Groß-/Kleinschreibung"</string>
@@ -40,8 +40,8 @@
     <string name="quick_fixes_summary">"Korrigiert gängige Tippfehler"</string>
     <string name="show_suggestions">"Vorschläge anzeigen"</string>
     <string name="show_suggestions_summary">"Vorgeschlagene Wörter während des Tippens anzeigen"</string>
-    <string name="auto_complete">"Autom. vervollständigen"</string>
-    <string name="auto_complete_summary">"Leertaste und Interpunktion fügen autom. ein markiertes Wort ein"</string>
+    <string name="auto_complete">"Automatische Vervollständigung"</string>
+    <string name="auto_complete_summary">"Leertaste und Interpunktion fügen automatisch ein hervorgehobenes Wort ein"</string>
   <string-array name="prediction_modes">
     <item>"Keine"</item>
     <item>"Standard"</item>
@@ -54,18 +54,16 @@
     <!-- no translation found for prediction_modes_values:1 (7214414132844804570) -->
     <!-- no translation found for prediction_modes_values:2 (6678546276084314171) -->
     <string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : Gespeichert"</string>
-    <string name="alternates_for_a">"ä"</string>
-    <!-- no translation found for alternates_for_e (3900510936875547555) -->
-    <skip />
-    <!-- no translation found for alternates_for_i (7097915268629342242) -->
-    <skip />
-    <string name="alternates_for_o">"ö"</string>
-    <string name="alternates_for_u">"ü"</string>
+    <string name="alternates_for_a">"àáâãäåæ"</string>
+    <string name="alternates_for_e">"èéêë"</string>
+    <string name="alternates_for_i">"ìíîï"</string>
+    <string name="alternates_for_o">"òóôõöœø"</string>
+    <string name="alternates_for_u">"ùúûü"</string>
     <string name="alternates_for_s">"§ß"</string>
     <string name="alternates_for_n">"ñ"</string>
-    <!-- no translation found for alternates_for_c (151699780720639892) -->
-    <skip />
-    <!-- no translation found for alternates_for_y (1722776806607271199) -->
+    <string name="alternates_for_c">"ç"</string>
+    <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
     <skip />
     <string name="tip_long_press">"Zur Anzeige von Umlauten (ä, ö usw.) Taste gedrückt halten"</string>
     <string name="tip_dismiss">"Zum Schließen der Tastatur ↶ drücken"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..864e812
--- /dev/null
+++ b/res/values-es-rUS/strings.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="english_ime_name">"Teclado de Android"</string>
+    <string name="english_ime_settings">"Configuración de teclado de Android"</string>
+    <string name="vibrate_on_keypress">"Vibrar al pulsar las teclas"</string>
+    <string name="sound_on_keypress">"Sonar al pulsar las teclas"</string>
+    <string name="hit_correction">"Corregir errores de escritura"</string>
+    <string name="hit_correction_summary">"Habilitar corrección de error de entrada"</string>
+    <string name="hit_correction_land">"Errores de entrada apaisada"</string>
+    <string name="hit_correction_land_summary">"Habilitar corrección de error de entrada"</string>
+    <string name="auto_correction">"Sugerencias de palabras"</string>
+    <string name="auto_correction_summary">"Corregir automáticamente la palabra anterior"</string>
+    <string name="prediction">"Sugerencias de palabras"</string>
+    <string name="prediction_category">"Configuración de sugerencia de palabra"</string>
+    <string name="prediction_summary">"Habilitar finalización automática al escribir"</string>
+    <string name="auto_complete_dialog_title">"Finalización automática"</string>
+    <string name="prediction_landscape">"Aumentar el tamaño del campo de texto"</string>
+    <string name="prediction_landscape_summary">"Ocultar sugerencias de palabras en vista apaisada"</string>
+    <string name="auto_cap">"Mayúsculas automáticas"</string>
+    <string name="auto_cap_summary">"Poner en mayúscula el inicio de una oración"</string>
+    <string name="auto_punctuate">"Puntuación automática"</string>
+    <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
+    <skip />
+    <!-- no translation found for quick_fixes (5353213327680897927) -->
+    <skip />
+    <!-- no translation found for quick_fixes_summary (3405028402510332373) -->
+    <skip />
+    <!-- no translation found for show_suggestions (507074425254289133) -->
+    <skip />
+    <!-- no translation found for show_suggestions_summary (1989672863935759654) -->
+    <skip />
+    <!-- no translation found for auto_complete (1103196318775486023) -->
+    <skip />
+    <!-- no translation found for auto_complete_summary (6113149638718274624) -->
+    <skip />
+  <string-array name="prediction_modes">
+    <item>"Ninguno"</item>
+    <item>"Básico"</item>
+    <item>"Avanzado"</item>
+  </string-array>
+    <string name="prediction_none">"0"</string>
+    <string name="prediction_basic">"1"</string>
+    <string name="prediction_full">"2"</string>
+    <!-- no translation found for prediction_modes_values:0 (579944677836100459) -->
+    <!-- no translation found for prediction_modes_values:1 (7214414132844804570) -->
+    <!-- no translation found for prediction_modes_values:2 (6678546276084314171) -->
+    <string name="added_word">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
+    <string name="alternates_for_a">"àáâãäåæ"</string>
+    <string name="alternates_for_e">"èéêë"</string>
+    <string name="alternates_for_i">"ìíîï"</string>
+    <string name="alternates_for_o">"òóôõöœø"</string>
+    <string name="alternates_for_u">"ùúûü"</string>
+    <string name="alternates_for_s">"§ß"</string>
+    <string name="alternates_for_n">"ñ"</string>
+    <string name="alternates_for_c">"ç"</string>
+    <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
+    <string name="tip_long_press">"Mantén una tecla presionada para ver los acentos (ø, ö, etc.)"</string>
+    <string name="tip_dismiss">"Pulsa la tecla hacia atrás ↶ para cerrar el teclado en cualquier momento"</string>
+    <string name="tip_access_symbols">"Acceder a números y símbolos"</string>
+    <string name="tip_add_to_dictionary">"Presiona y mantén presionada la palabra de la izquierda para agregarla al diccionario"</string>
+    <!-- no translation found for touch_to_continue (7869803257948414531) -->
+    <skip />
+    <!-- no translation found for touch_to_finish (7990196086480585789) -->
+    <skip />
+    <!-- no translation found for tip_to_open_keyboard (6821200275486950452) -->
+    <skip />
+    <!-- no translation found for tip_to_view_accents (5433158573693308501) -->
+    <skip />
+    <!-- no translation found for tip_to_open_symbols (7345139325622444880) -->
+    <skip />
+    <!-- no translation found for tip_to_close_symbols (5227724217206927185) -->
+    <skip />
+    <!-- no translation found for tip_to_launch_settings (8402961128983196128) -->
+    <skip />
+    <!-- no translation found for tip_to_start_typing (7213843601369174313) -->
+    <skip />
+    <string name="label_go_key">"Ir"</string>
+    <string name="label_next_key">"Siguiente"</string>
+    <string name="label_done_key">"Finalizado"</string>
+    <string name="label_send_key">"Enviar"</string>
+    <string name="label_symbol_key">"?123"</string>
+    <string name="label_phone_key">"123"</string>
+    <string name="label_alpha_key">"ABC"</string>
+    <string name="label_alt_key">"ALT"</string>
+</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index e561db9..aa65ef1 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -18,7 +18,7 @@
     <string name="english_ime_name">"Teclado de Android"</string>
     <string name="english_ime_settings">"Configuración del teclado de Android"</string>
     <string name="vibrate_on_keypress">"Vibrar al pulsar tecla"</string>
-    <string name="sound_on_keypress">"Sonido al pulsar tecla"</string>
+    <string name="sound_on_keypress">"Sonido al pulsar una tecla"</string>
     <string name="hit_correction">"Corregir errores de escritura"</string>
     <string name="hit_correction_summary">"Habilitar la introducción de corrección de errores"</string>
     <string name="hit_correction_land">"Errores de introducción de datos en vista horizontal"</string>
@@ -31,7 +31,7 @@
     <string name="auto_complete_dialog_title">"Autocompletar"</string>
     <string name="prediction_landscape">"Aumentar el tamaño del campo de texto"</string>
     <string name="prediction_landscape_summary">"Ocultar sugerencias de palabras en la vista horizontal"</string>
-    <string name="auto_cap">"Uso de mayúsculas auto."</string>
+    <string name="auto_cap">"Uso de mayúsculas automático"</string>
     <string name="auto_cap_summary">"Escribir en mayúscula el principio de la frase"</string>
     <string name="auto_punctuate">"Puntuación automática"</string>
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
@@ -54,16 +54,16 @@
     <!-- no translation found for prediction_modes_values:1 (7214414132844804570) -->
     <!-- no translation found for prediction_modes_values:2 (6678546276084314171) -->
     <string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : Guardada"</string>
-    <string name="alternates_for_a">"á"</string>
-    <string name="alternates_for_e">"é"</string>
-    <string name="alternates_for_i">"í"</string>
-    <string name="alternates_for_o">"ó"</string>
-    <string name="alternates_for_u">"úü"</string>
-    <!-- no translation found for alternates_for_s (348762530927662188) -->
-    <skip />
+    <string name="alternates_for_a">"àáâãäåæ"</string>
+    <string name="alternates_for_e">"èéêë"</string>
+    <string name="alternates_for_i">"ìíîï"</string>
+    <string name="alternates_for_o">"òóôõöœø"</string>
+    <string name="alternates_for_u">"ùúûü"</string>
+    <string name="alternates_for_s">"§ß"</string>
     <string name="alternates_for_n">"ñ"</string>
     <string name="alternates_for_c">"ç"</string>
-    <!-- no translation found for alternates_for_y (1722776806607271199) -->
+    <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
     <skip />
     <string name="tip_long_press">"Mantén pulsada una tecla para ver los caracteres acentuados (ø, ö, etc.)."</string>
     <string name="tip_dismiss">"Pulsa la tecla \"Atrás\" ↶ para cerrar el teclado en cualquier momento."</string>
@@ -78,7 +78,7 @@
     <string name="tip_to_launch_settings"><b>"Mantén pulsada esta tecla para cambiar la configuración del teclado como, por ejemplo, la opción de autocompletar"</b>"."</string>
     <string name="tip_to_start_typing"><b>"¡Pruébalo!"</b></string>
     <string name="label_go_key">"Ir"</string>
-    <string name="label_next_key">"Sig."</string>
+    <string name="label_next_key">"Siguiente"</string>
     <string name="label_done_key">"Hecho"</string>
     <string name="label_send_key">"Enviar"</string>
     <string name="label_symbol_key">"?123"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 282f9a7..ce0903f 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -31,7 +31,7 @@
     <string name="auto_complete_dialog_title">"Saisie semi-automatique"</string>
     <string name="prediction_landscape">"Agrandir le champ de texte"</string>
     <string name="prediction_landscape_summary">"Masquer la saisie prédictive en mode paysage"</string>
-    <string name="auto_cap">"Majuscules auto"</string>
+    <string name="auto_cap">"Majuscules automatiques"</string>
     <string name="auto_cap_summary">"Mettre en majuscule la première lettre de chaque phrase"</string>
     <string name="auto_punctuate">"Ponctuation automatique"</string>
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
@@ -41,7 +41,7 @@
     <string name="show_suggestions">"Afficher les suggestions"</string>
     <string name="show_suggestions_summary">"Afficher les suggestions de terme lors de la saisie"</string>
     <string name="auto_complete">"Saisie semi-automatique"</string>
-    <string name="auto_complete_summary">"La barre d\'espace/ponctuation insèrent auto. le terme surligné."</string>
+    <string name="auto_complete_summary">"La barre d\'espace et la ponctuation insèrent automatiquement les termes en surbrillance."</string>
   <string-array name="prediction_modes">
     <item>"Aucun"</item>
     <item>"Simple"</item>
@@ -63,13 +63,15 @@
     <string name="alternates_for_n">"ñ"</string>
     <string name="alternates_for_c">"ç"</string>
     <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
     <string name="tip_long_press">"Maintenir une touche enfoncée pour afficher les accents (à, é, etc.)"</string>
     <string name="tip_dismiss">"Appuyez sur la touche Retour ↶ pour fermer le clavier à tout moment."</string>
     <string name="tip_access_symbols">"Accéder aux chiffres et symboles"</string>
     <string name="tip_add_to_dictionary">"Appuyer et maintenir le doigt sur le mot le plus à gauche pour l\'ajouter au dictionnaire"</string>
-    <string name="touch_to_continue">"Touchez ce conseil pour continuer »"</string>
-    <string name="touch_to_finish">"Touchez ici pour fermer ce conseil et commencer à saisir votre texte."</string>
-    <string name="tip_to_open_keyboard"><b>"Le clavier s\'affiche à chaque fois que vous touchez une zone de texte."</b></string>
+    <string name="touch_to_continue">"Appuyez sur ce conseil pour continuer »"</string>
+    <string name="touch_to_finish">"Appuyez ici pour fermer ce conseil et commencer à saisir votre texte."</string>
+    <string name="tip_to_open_keyboard"><b>"Le clavier s\'affiche à chaque fois que vous appuyez sur une zone de texte."</b></string>
     <string name="tip_to_view_accents"><b>"Maintenez une touche enfoncée pour afficher les accents"\n"(ø, ö, ô, ó, etc.)"</b></string>
     <string name="tip_to_open_symbols"><b>"Appuyez sur cette touche pour basculer vers les chiffres et les symboles."</b></string>
     <string name="tip_to_close_symbols"><b>"Retourner au clavier en appuyant de nouveau sur cette touche"</b></string>
@@ -77,7 +79,7 @@
     <string name="tip_to_start_typing"><b>"Essayez !"</b></string>
     <string name="label_go_key">"OK"</string>
     <string name="label_next_key">"Suivant"</string>
-    <string name="label_done_key">"OK"</string>
+    <string name="label_done_key">"Terminé"</string>
     <string name="label_send_key">"Envoyer"</string>
     <string name="label_symbol_key">"?123"</string>
     <string name="label_phone_key">"123"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 112acc1..8a814cb 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -17,8 +17,8 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name">"Tastiera Android"</string>
     <string name="english_ime_settings">"Impostazioni tastiera Android"</string>
-    <string name="vibrate_on_keypress">"Vibra se premi un tasto"</string>
-    <string name="sound_on_keypress">"Suona se premi un tasto"</string>
+    <string name="vibrate_on_keypress">"Vibra quando premi un tasto"</string>
+    <string name="sound_on_keypress">"Suona quando premi un tasto"</string>
     <string name="hit_correction">"Correggi errori di digitazione"</string>
     <string name="hit_correction_summary">"Attiva la correzione degli errori di inserimento"</string>
     <string name="hit_correction_land">"Errori di inserimento in visualizzazione orizzontale"</string>
@@ -33,15 +33,15 @@
     <string name="prediction_landscape_summary">"Nascondi i suggerimenti delle parole in visualizzazione orizzontale"</string>
     <string name="auto_cap">"Maiuscole automatiche"</string>
     <string name="auto_cap_summary">"Rendi maiuscole le iniziali delle frasi"</string>
-    <string name="auto_punctuate">"Punteggiatura automat."</string>
+    <string name="auto_punctuate">"Punteggiatura automatica"</string>
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
     <skip />
     <string name="quick_fixes">"Correzioni veloci"</string>
     <string name="quick_fixes_summary">"Corregge gli errori di digitazione più comuni"</string>
     <string name="show_suggestions">"Mostra suggerimenti"</string>
     <string name="show_suggestions_summary">"Visualizza le parole suggerite durante la digitazione"</string>
-    <string name="auto_complete">"Completamento autom."</string>
-    <string name="auto_complete_summary">"Barra spaziatrice e punteggiatura inseriscono la parola evidenziata"</string>
+    <string name="auto_complete">"Completamento automatico"</string>
+    <string name="auto_complete_summary">"La barra spaziatrice e la punteggiatura inseriscono automaticamente la parola evidenziata"</string>
   <string-array name="prediction_modes">
     <item>"Nessuna"</item>
     <item>"Base"</item>
@@ -54,17 +54,19 @@
     <!-- no translation found for prediction_modes_values:1 (7214414132844804570) -->
     <!-- no translation found for prediction_modes_values:2 (6678546276084314171) -->
     <string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : parola salvata"</string>
-    <string name="alternates_for_a">"àá"</string>
-    <string name="alternates_for_e">"èé"</string>
-    <string name="alternates_for_i">"ìí"</string>
-    <string name="alternates_for_o">"òó"</string>
-    <string name="alternates_for_u">"ùú"</string>
-    <string name="alternates_for_s">"§"</string>
+    <string name="alternates_for_a">"àáâãäåæ"</string>
+    <string name="alternates_for_e">"èéêë"</string>
+    <string name="alternates_for_i">"ìíîï"</string>
+    <string name="alternates_for_o">"òóôõöœø"</string>
+    <string name="alternates_for_u">"ùúûü"</string>
+    <string name="alternates_for_s">"§ß"</string>
     <string name="alternates_for_n">"ñ"</string>
     <string name="alternates_for_c">"ç"</string>
     <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
     <string name="tip_long_press">"Tieni premuto un tasto per vedere le lettere con segni diacritici (ø, ö etc.)"</string>
-    <string name="tip_dismiss">"Premi il tasto Indietro ↶ per chiudere la tastiera"</string>
+    <string name="tip_dismiss">"Premi il tasto Indietro ↶ per chiudere la tastiera in qualsiasi punto"</string>
     <string name="tip_access_symbols">"Accedi a numeri e simboli"</string>
     <string name="tip_add_to_dictionary">"Tieni premuto sulla parola all\'estrema sinistra per aggiungerla al dizionario"</string>
     <string name="touch_to_continue">"Tocca questo suggerimento per continuare »"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 53bc60f..67c9a5e 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -17,10 +17,10 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name">"Androidキーボード"</string>
     <string name="english_ime_settings">"Androidキーボードの設定"</string>
-    <string name="vibrate_on_keypress">"キー操作バイブ"</string>
+    <string name="vibrate_on_keypress">"キーのバイブレーション"</string>
     <string name="sound_on_keypress">"キー操作音"</string>
-    <string name="hit_correction">"入力ミス補正"</string>
-    <string name="hit_correction_summary">"入力間違いを自動修正する"</string>
+    <string name="hit_correction">"入力エラー修正"</string>
+    <string name="hit_correction_summary">"入力エラーを推測修正する"</string>
     <string name="hit_correction_land">"横表示での入力修正"</string>
     <string name="hit_correction_land_summary">"入力間違いを自動修正する"</string>
     <string name="auto_correction">"入力候補表示"</string>
@@ -32,7 +32,7 @@
     <string name="prediction_landscape">"入力作業スペースを広げる"</string>
     <string name="prediction_landscape_summary">"横表示では入力候補を表示しない"</string>
     <string name="auto_cap">"自動大文字変換"</string>
-    <string name="auto_cap_summary">"英字入力で文頭文字を大文字にする"</string>
+    <string name="auto_cap_summary">"先頭文字を大文字に変換する"</string>
     <string name="auto_punctuate">"句読点を自動入力"</string>
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
     <skip />
@@ -41,7 +41,7 @@
     <string name="show_suggestions">"入力候補を表示"</string>
     <string name="show_suggestions_summary">"入力時に入力候補を表示します"</string>
     <string name="auto_complete">"オートコンプリート"</string>
-    <string name="auto_complete_summary">"スペースまたは句読点キーで反転表示されている変換候補を挿入する"</string>
+    <string name="auto_complete_summary">"スペースまたは句読点キーを押すと、ハイライトされたキーワードが自動入力されます"</string>
   <string-array name="prediction_modes">
     <item>"なし"</item>
     <item>"基本"</item>
@@ -63,10 +63,12 @@
     <string name="alternates_for_n">"ñ"</string>
     <string name="alternates_for_c">"ç"</string>
     <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
     <string name="tip_long_press">"キー長押しでアクセント文字を表示(ø、öなど)"</string>
     <string name="tip_dismiss">"戻るキーでキーボードを閉じます"</string>
     <string name="tip_access_symbols">"数字と記号"</string>
-    <string name="tip_add_to_dictionary">"一番左の単語を長押しすると辞書に追加されます"</string>
+    <string name="tip_add_to_dictionary">"一番左の語句を長押しすると辞書に追加されます"</string>
     <string name="touch_to_continue">"続けるにはヒントをタッチ &gt;&gt;"</string>
     <string name="touch_to_finish">"タッチしてこのヒントを終了し、入力を開始してください。"</string>
     <string name="tip_to_open_keyboard"><b>"テキストフィールドを選択するとキーボードが表示されます"</b></string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 32d5d15..654a1f0 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -63,6 +63,8 @@
     <string name="alternates_for_n">"ñ"</string>
     <string name="alternates_for_c">"ç"</string>
     <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
     <string name="tip_long_press">"키를 길게 누르면 악센트(ø, ö 등)가 표시됩니다."</string>
     <string name="tip_dismiss">"키보드를 닫으려면 언제든지 뒤로 키(↶)를 누르세요."</string>
     <string name="tip_access_symbols">"숫자 및 기호 액세스"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 28df4d4..87273dd 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -36,12 +36,18 @@
     <string name="auto_punctuate">"Automatisk punktum"</string>
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
     <skip />
-    <string name="quick_fixes">"Autokorrektur"</string>
-    <string name="quick_fixes_summary">"Retter vanlige stavefeil"</string>
-    <string name="show_suggestions">"Vis forslag"</string>
-    <string name="show_suggestions_summary">"Vis foreslåtte ord under skriving"</string>
-    <string name="auto_complete">"Autokomplettering"</string>
-    <string name="auto_complete_summary">"Mellomrom og punktum setter automatisk inn valgt ord"</string>
+    <!-- no translation found for quick_fixes (5353213327680897927) -->
+    <skip />
+    <!-- no translation found for quick_fixes_summary (3405028402510332373) -->
+    <skip />
+    <!-- no translation found for show_suggestions (507074425254289133) -->
+    <skip />
+    <!-- no translation found for show_suggestions_summary (1989672863935759654) -->
+    <skip />
+    <!-- no translation found for auto_complete (1103196318775486023) -->
+    <skip />
+    <!-- no translation found for auto_complete_summary (6113149638718274624) -->
+    <skip />
   <string-array name="prediction_modes">
     <item>"Ingen"</item>
     <item>"Grunnleggende"</item>
@@ -66,22 +72,33 @@
     <string name="alternates_for_n">"ñ"</string>
     <string name="alternates_for_c">"ç"</string>
     <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
     <string name="tip_long_press">"Hold en tast nede for å se aksenterte tegn (ø, ö, osv.)"</string>
     <string name="tip_dismiss">"Trykk tilbakeknappen, ↶, for å lukke tastaturet"</string>
     <string name="tip_access_symbols">"Få tilgang til tall og symboler"</string>
     <string name="tip_add_to_dictionary">"Trykk lenge på ordet lengst til venstre for å legge det til i ordlisten"</string>
-    <string name="touch_to_continue">"Trykk på dette hintet for å forsette »"</string>
-    <string name="touch_to_finish">"Trykk her for å lukke dette hintet og begynne å skrive!"</string>
-    <string name="tip_to_open_keyboard"><b>"Tastaturet åpnes når du tar på et tekstfelt"</b></string>
-    <string name="tip_to_view_accents"><b>"Trykk på og hold nede en tast for å se aksenter"\n"(ø, ö, ô, ó, osv.)"</b></string>
-    <string name="tip_to_open_symbols"><b>"Bytt til tall og symboler ved å trykke på denne tasten"</b></string>
-    <string name="tip_to_close_symbols"><b>"Gå tilbake til bokstaver igjen ved å trykke på denne tasten"</b></string>
-    <string name="tip_to_launch_settings"><b>"Trykk på og hold nede denne tasten for å endre tastaturinnstillinger, som autofullføring"</b></string>
-    <string name="tip_to_start_typing"><b>"Prøv det!"</b></string>
+    <!-- no translation found for touch_to_continue (7869803257948414531) -->
+    <skip />
+    <!-- no translation found for touch_to_finish (7990196086480585789) -->
+    <skip />
+    <!-- no translation found for tip_to_open_keyboard (6821200275486950452) -->
+    <skip />
+    <!-- no translation found for tip_to_view_accents (5433158573693308501) -->
+    <skip />
+    <!-- no translation found for tip_to_open_symbols (7345139325622444880) -->
+    <skip />
+    <!-- no translation found for tip_to_close_symbols (5227724217206927185) -->
+    <skip />
+    <!-- no translation found for tip_to_launch_settings (8402961128983196128) -->
+    <skip />
+    <!-- no translation found for tip_to_start_typing (7213843601369174313) -->
+    <skip />
     <string name="label_go_key">"Gå"</string>
     <string name="label_next_key">"Neste"</string>
     <string name="label_done_key">"Utfør"</string>
-    <string name="label_send_key">"Send"</string>
+    <!-- no translation found for label_send_key (2815056534433717444) -->
+    <skip />
     <string name="label_symbol_key">"?123"</string>
     <string name="label_phone_key">"123"</string>
     <string name="label_alpha_key">"ABC"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 73d5e3f..467fdbc 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -63,6 +63,8 @@
     <string name="alternates_for_n">"ñ"</string>
     <string name="alternates_for_c">"ç"</string>
     <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
     <string name="tip_long_press">"Houd een toets ingedrukt om diakritische tekens weer te geven (ø, ö, enzovoort)"</string>
     <string name="tip_dismiss">"Druk op elk gewenst moment op de toets Terug ↶ om het toetsenbord te sluiten"</string>
     <string name="tip_access_symbols">"Toegang tot cijfers en symbolen"</string>
@@ -70,7 +72,7 @@
     <string name="touch_to_continue">"Raak deze tip aan om door te gaan »"</string>
     <string name="touch_to_finish">"Raak dit punt aan om deze tip te sluiten en te beginnen met typen."</string>
     <string name="tip_to_open_keyboard"><b>"Het toetsenbord wordt geopend wanneer u een tekstveld aanraakt"</b></string>
-    <string name="tip_to_view_accents"><b>"Blijf een toets aanraken om diakritische tekens weer te geven"\n"(ø, ö, ô, ó, enzovoort)"</b></string>
+    <string name="tip_to_view_accents"><b>"Blijf een toets aanraken om diakritische tekens weer te geven"\n" (ø, ö, ô, ó, enzovoort)"</b></string>
     <string name="tip_to_open_symbols"><b>"Schakel over naar cijfers en symbolen door deze toets aan te raken"</b></string>
     <string name="tip_to_close_symbols"><b>"Ga terug naar letters door deze toets nogmaals aan te raken"</b></string>
     <string name="tip_to_launch_settings"><b>"Blijf deze toets aanraken om toetsenbordinstellingen te wijzigen, zoals auto-aanvullen"</b></string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index a10731c..2cbf131 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -17,8 +17,8 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name">"Klawiatura Android"</string>
     <string name="english_ime_settings">"Ustawienia klawiatury Android"</string>
-    <string name="vibrate_on_keypress">"Wibracja przy naciśnięciu"</string>
-    <string name="sound_on_keypress">"Dźwięk przy naciśnięciu"</string>
+    <string name="vibrate_on_keypress">"Wibruj przy naciśnięciu klawisza"</string>
+    <string name="sound_on_keypress">"Dźwięk przy naciśnięciu klawisza"</string>
     <string name="hit_correction">"Popraw błędy pisowni"</string>
     <string name="hit_correction_summary">"Włącz poprawianie błędów wprowadzania"</string>
     <string name="hit_correction_land">"Błędy wprowadzania w orientacji poziomej"</string>
@@ -31,7 +31,7 @@
     <string name="auto_complete_dialog_title">"Autouzupełnianie"</string>
     <string name="prediction_landscape">"Zwiększ rozmiar pola tekstowego"</string>
     <string name="prediction_landscape_summary">"Wyłącz propozycje słów w orientacji poziomej"</string>
-    <string name="auto_cap">"Wstawiaj wielkie litery"</string>
+    <string name="auto_cap">"Automatyczna zamiana na wielkie litery"</string>
     <string name="auto_cap_summary">"Zamieniaj na wielką pierwszą literę zdania"</string>
     <string name="auto_punctuate">"Automatyczna interpunkcja"</string>
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
@@ -41,7 +41,7 @@
     <string name="show_suggestions">"Pokaż sugestie"</string>
     <string name="show_suggestions_summary">"Wyświetl sugerowane słowa podczas wpisywania"</string>
     <string name="auto_complete">"Autouzupełnianie"</string>
-    <string name="auto_complete_summary">"Spacja i znaki przestankowe wstawiają wyróżnione słowo"</string>
+    <string name="auto_complete_summary">"Spacja i znaki przestankowe automatycznie wstawiają wyróżnione słowo"</string>
   <string-array name="prediction_modes">
     <item>"Brak"</item>
     <item>"Podstawowy"</item>
@@ -54,26 +54,28 @@
     <!-- no translation found for prediction_modes_values:1 (7214414132844804570) -->
     <!-- no translation found for prediction_modes_values:2 (6678546276084314171) -->
     <string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : Zapisano"</string>
-    <string name="alternates_for_a">"ą"</string>
-    <string name="alternates_for_e">"ę"</string>
-    <string name="alternates_for_i">""</string>
-    <string name="alternates_for_o">"ó"</string>
-    <string name="alternates_for_u">""</string>
-    <string name="alternates_for_s">"ś"</string>
-    <string name="alternates_for_n">"ń"</string>
-    <string name="alternates_for_c">"ć"</string>
-    <string name="alternates_for_y">""</string>
-    <string name="tip_long_press">"Przytrzymaj klawisz, aby wyświetlić znaki akcentowane (ą, ó itp.)"</string>
+    <string name="alternates_for_a">"àáâãäåæ"</string>
+    <string name="alternates_for_e">"èéêë"</string>
+    <string name="alternates_for_i">"ìíîï"</string>
+    <string name="alternates_for_o">"òóôõöœø"</string>
+    <string name="alternates_for_u">"ùúûü"</string>
+    <string name="alternates_for_s">"§ß"</string>
+    <string name="alternates_for_n">"ñ"</string>
+    <string name="alternates_for_c">"ç"</string>
+    <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
+    <string name="tip_long_press">"Przytrzymaj klawisz, aby wyświetlić znaki akcentowane (ø, ö itp.)"</string>
     <string name="tip_dismiss">"Naciśnij klawisz cofania ↶, aby zamknąć klawiaturę w dowolnym momencie"</string>
     <string name="tip_access_symbols">"Przejdź do cyfr i symboli"</string>
     <string name="tip_add_to_dictionary">"Naciśnij i przytrzymaj słowo po lewej stronie w celu dodania go do słownika"</string>
     <string name="touch_to_continue">"Dotknij tej podpowiedzi, aby kontynuować »"</string>
     <string name="touch_to_finish">"Dotknij tutaj, aby zamknąć tę podpowiedź i zacząć pisać!"</string>
-    <string name="tip_to_open_keyboard"><b>"Klawiatura jest otwierana po każdym dotknięciu pola tekstowego."</b></string>
-    <string name="tip_to_view_accents"><b>"Dotknij i przytrzymaj klawisz, aby wyświetlić znaki akcentowane"\n"(ą, ę, ł, ó itd.)."</b></string>
-    <string name="tip_to_open_symbols"><b>"Przełącz na cyfry i symbole, dotykając tego klawisza."</b></string>
-    <string name="tip_to_close_symbols"><b>"Wróć do trybu liter, dotykając ponownie tego klawisza."</b></string>
-    <string name="tip_to_launch_settings"><b>"Dotknij i przytrzymaj ten klawisz, aby zmienić ustawienia klawiatury, takie jak autouzupełnianie."</b></string>
+    <string name="tip_to_open_keyboard"><b>"Klawiatura jest otwierana po każdym dotknięciu pola tekstowego"</b></string>
+    <string name="tip_to_view_accents"><b>"Dotknij i przytrzymaj klawisz, aby wyświetlić znaki akcentowane"\n"(ø, ö, ô, ó itd.)"</b></string>
+    <string name="tip_to_open_symbols"><b>"Przełącz na cyfry i symbole, dotykając tego klawisza"</b></string>
+    <string name="tip_to_close_symbols"><b>"Wróć do trybu liter, dotykając ponownie tego klawisza"</b></string>
+    <string name="tip_to_launch_settings"><b>"Dotknij i przytrzymaj ten klawisz, aby zmienić ustawienia klawiatury, takie jak autouzupełnianie"</b></string>
     <string name="tip_to_start_typing"><b>"Wypróbuj!"</b></string>
     <string name="label_go_key">"Przejdź"</string>
     <string name="label_next_key">"Dalej"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 672aa77..6449099 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -63,6 +63,8 @@
     <string name="alternates_for_n">"ñ"</string>
     <string name="alternates_for_c">"ç"</string>
     <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
     <string name="tip_long_press">"Удерживайте клавишу, чтобы увидеть варианты с диакритическими знаками (ø, ö и т.д.)"</string>
     <string name="tip_dismiss">"Нажмите клавишу \"Назад\" ↶, чтобы закрыть клавиатуру в любой момент"</string>
     <string name="tip_access_symbols">"Открыть цифры и символы"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index ac6c6d9..789656d 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -69,6 +69,8 @@
     <string name="alternates_for_n">"ñ"</string>
     <string name="alternates_for_c">"ç"</string>
     <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
     <string name="tip_long_press">"按住某个键可以查看重音符号(ø、ö 等)"</string>
     <string name="tip_dismiss">"随时可以通过按后退键 ↶ 关闭键盘"</string>
     <string name="tip_access_symbols">"访问数字和符号"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 9ef9b6d..ffa9f05 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -63,6 +63,8 @@
     <string name="alternates_for_n">"ñ"</string>
     <string name="alternates_for_c">"ç"</string>
     <string name="alternates_for_y">"ýÿ"</string>
+    <!-- no translation found for alternates_for_z (8206774143334512268) -->
+    <skip />
     <string name="tip_long_press">"按住按鍵可查看重音符號 (ø、ö 等)"</string>
     <string name="tip_dismiss">"隨時可以透過按後退鍵 ↶ 關閉鍵盤"</string>
     <string name="tip_access_symbols">"使用數字和符號"</string>
diff --git a/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index b3fcbda..92b7cd4 100644
--- a/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -16,9 +16,8 @@
 
 package com.android.inputmethod.latin;
 
-import android.inputmethodservice.Keyboard;
-
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 
 public class KeyboardSwitcher {
 
@@ -37,31 +36,28 @@
     public static final int KEYBOARDMODE_URL = R.id.mode_url;
     public static final int KEYBOARDMODE_EMAIL = R.id.mode_email;
     public static final int KEYBOARDMODE_IM = R.id.mode_im;
-    
 
     LatinKeyboardView mInputView;
     LatinIME mContext;
     
-    private LatinKeyboard mPhoneKeyboard;
-    private LatinKeyboard mPhoneSymbolsKeyboard;
-    private LatinKeyboard mSymbolsKeyboard;
-    private LatinKeyboard mSymbolsShiftedKeyboard;
-    private LatinKeyboard mQwertyKeyboard;
-    private LatinKeyboard mAlphaKeyboard;
-    private LatinKeyboard mUrlKeyboard;
-    private LatinKeyboard mEmailKeyboard;
-    private LatinKeyboard mIMKeyboard;
-    
-    List<Keyboard> mKeyboards;
+    private KeyboardId mSymbolsId;
+    private KeyboardId mSymbolsShiftedId;
+
+    private KeyboardId mCurrentId;
+    private Map<KeyboardId, LatinKeyboard> mKeyboards;
     
     private int mMode;
     private int mImeOptions;
     private int mTextMode = MODE_TEXT_QWERTY;
+    private boolean mIsSymbols;
 
     private int mLastDisplayWidth;
 
     KeyboardSwitcher(LatinIME context) {
         mContext = context;
+        mKeyboards = new HashMap<KeyboardId, LatinKeyboard>();
+        mSymbolsId = new KeyboardId(R.xml.kbd_symbols);
+        mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift);
     }
 
     void setInputView(LatinKeyboardView inputView) {
@@ -72,92 +68,109 @@
         // Configuration change is coming after the keyboard gets recreated. So don't rely on that.
         // If keyboards have already been made, check if we have a screen width change and 
         // create the keyboard layouts again at the correct orientation
-        if (mKeyboards != null) {
-            int displayWidth = mContext.getMaxWidth();
-            if (displayWidth == mLastDisplayWidth) return;
-            mLastDisplayWidth = displayWidth;
+        int displayWidth = mContext.getMaxWidth();
+        if (displayWidth == mLastDisplayWidth) return;
+        mLastDisplayWidth = displayWidth;
+        mKeyboards.clear();
+        mSymbolsId = new KeyboardId(R.xml.kbd_symbols);
+        mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift);
+    }
+
+    /**
+     * Represents the parameters necessary to construct a new LatinKeyboard,
+     * which also serve as a unique identifier for each keyboard type.
+     */
+    private static class KeyboardId {
+        public int mXml;
+        public int mMode;
+        public boolean mEnableShiftLock;
+
+        public KeyboardId(int xml, int mode, boolean enableShiftLock) {
+            this.mXml = xml;
+            this.mMode = mode;
+            this.mEnableShiftLock = enableShiftLock;
         }
-        // Delayed creation when keyboard mode is set.
-        mQwertyKeyboard = null;
-        mAlphaKeyboard = null;
-        mUrlKeyboard = null;
-        mEmailKeyboard = null;
-        mIMKeyboard = null;
-        mPhoneKeyboard = null;
-        mPhoneSymbolsKeyboard = null;
-        mSymbolsKeyboard = null;
-        mSymbolsShiftedKeyboard = null;
+
+        public KeyboardId(int xml) {
+            this(xml, 0, false);
+        }
+
+        public boolean equals(Object other) {
+            return other instanceof KeyboardId && equals((KeyboardId) other);
+        }
+
+        public boolean equals(KeyboardId other) {
+            return other.mXml == this.mXml && other.mMode == this.mMode;
+        }
+
+        public int hashCode() {
+            return (mXml + 1) * (mMode + 1) * (mEnableShiftLock ? 2 : 1);
+        }
     }
 
     void setKeyboardMode(int mode, int imeOptions) {
+        setKeyboardMode(mode, imeOptions, false);
+    }
+
+    void setKeyboardMode(int mode, int imeOptions, boolean isSymbols) {
         mMode = mode;
         mImeOptions = imeOptions;
-        LatinKeyboard keyboard = (LatinKeyboard) mInputView.getKeyboard();
+        mIsSymbols = isSymbols;
         mInputView.setPreviewEnabled(true);
-        switch (mode) {
-            case MODE_TEXT:
-                if (mTextMode == MODE_TEXT_QWERTY) {
-                    if (mQwertyKeyboard == null) {
-                        mQwertyKeyboard = new LatinKeyboard(mContext, R.xml.kbd_qwerty,
-                                KEYBOARDMODE_NORMAL);
-                        mQwertyKeyboard.enableShiftLock();
-                    }
-                    keyboard = mQwertyKeyboard;
-                } else if (mTextMode == MODE_TEXT_ALPHA) {
-                    if (mAlphaKeyboard == null) {
-                        mAlphaKeyboard = new LatinKeyboard(mContext, R.xml.kbd_alpha,
-                                KEYBOARDMODE_NORMAL);
-                        mAlphaKeyboard.enableShiftLock();
-                    }
-                    keyboard = mAlphaKeyboard;
-                }
-                break;
-            case MODE_SYMBOLS:
-                if (mSymbolsKeyboard == null) {
-                    mSymbolsKeyboard = new LatinKeyboard(mContext, R.xml.kbd_symbols);
-                }
-                if (mSymbolsShiftedKeyboard == null) {
-                    mSymbolsShiftedKeyboard = new LatinKeyboard(mContext, R.xml.kbd_symbols_shift);
-                }
-                keyboard = mSymbolsKeyboard;
-                break;
-            case MODE_PHONE:
-                if (mPhoneKeyboard == null) {
-                    mPhoneKeyboard = new LatinKeyboard(mContext, R.xml.kbd_phone);
-                }
-                mInputView.setPhoneKeyboard(mPhoneKeyboard);
-                if (mPhoneSymbolsKeyboard == null) {
-                    mPhoneSymbolsKeyboard = new LatinKeyboard(mContext, R.xml.kbd_phone_symbols);
-                }
-                keyboard = mPhoneKeyboard;
-                mInputView.setPreviewEnabled(false);
-                break;
-            case MODE_URL:
-                if (mUrlKeyboard == null) {
-                    mUrlKeyboard = new LatinKeyboard(mContext, R.xml.kbd_qwerty, KEYBOARDMODE_URL);
-                    mUrlKeyboard.enableShiftLock();
-                }
-                keyboard = mUrlKeyboard;
-                break;
-            case MODE_EMAIL:
-                if (mEmailKeyboard == null) {
-                    mEmailKeyboard = new LatinKeyboard(mContext, R.xml.kbd_qwerty, KEYBOARDMODE_EMAIL);
-                    mEmailKeyboard.enableShiftLock();
-                }
-                keyboard = mEmailKeyboard;
-                break;
-            case MODE_IM:
-                if (mIMKeyboard == null) {
-                    mIMKeyboard = new LatinKeyboard(mContext, R.xml.kbd_qwerty, KEYBOARDMODE_IM);
-                    mIMKeyboard.enableShiftLock();
-                }
-                keyboard = mIMKeyboard;
-                break;
+        KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols);
+        LatinKeyboard keyboard = getKeyboard(id);
+
+        if (mode == MODE_PHONE) {
+            mInputView.setPhoneKeyboard(keyboard);
+            mInputView.setPreviewEnabled(false);
         }
+
+        mCurrentId = id;
         mInputView.setKeyboard(keyboard);
         keyboard.setShifted(false);
         keyboard.setShiftLocked(keyboard.isShiftLocked());
         keyboard.setImeOptions(mContext.getResources(), mMode, imeOptions);
+
+    }
+
+    private LatinKeyboard getKeyboard(KeyboardId id) {
+        if (!mKeyboards.containsKey(id)) {
+            LatinKeyboard keyboard = new LatinKeyboard(
+                mContext, id.mXml, id.mMode);
+            if (id.mEnableShiftLock) {
+                keyboard.enableShiftLock();
+            }
+            mKeyboards.put(id, keyboard);
+        }
+        return mKeyboards.get(id);
+    }
+
+    private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) {
+        if (isSymbols) {
+            return (mode == MODE_PHONE)
+                ? new KeyboardId(R.xml.kbd_phone_symbols) : new KeyboardId(R.xml.kbd_symbols);
+        }
+
+        switch (mode) {
+            case MODE_TEXT:
+                if (mTextMode == MODE_TEXT_QWERTY) {
+                    return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_NORMAL, true);
+                } else if (mTextMode == MODE_TEXT_ALPHA) {
+                    return new KeyboardId(R.xml.kbd_alpha, KEYBOARDMODE_NORMAL, true);
+                }
+                break;
+            case MODE_SYMBOLS:
+                return new KeyboardId(R.xml.kbd_symbols);
+            case MODE_PHONE:
+                return new KeyboardId(R.xml.kbd_phone);
+            case MODE_URL:
+                return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_URL, true);
+            case MODE_EMAIL:
+                return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_EMAIL, true);
+            case MODE_IM:
+                return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_IM, true);
+        }
+        return null;
     }
 
     int getKeyboardMode() {
@@ -186,56 +199,34 @@
     }
 
     boolean isAlphabetMode() {
-        Keyboard current = mInputView.getKeyboard();
-        if (current == mQwertyKeyboard
-                || current == mAlphaKeyboard
-                || current == mUrlKeyboard
-                || current == mIMKeyboard
-                || current == mEmailKeyboard) {
-            return true;
-        }
-        return false;
+        KeyboardId current = mCurrentId;
+        return current.mMode == KEYBOARDMODE_NORMAL
+            || current.mMode == KEYBOARDMODE_URL
+            || current.mMode == KEYBOARDMODE_EMAIL
+            || current.mMode == KEYBOARDMODE_IM;
     }
 
     void toggleShift() {
-        Keyboard currentKeyboard = mInputView.getKeyboard();
-        if (currentKeyboard == mSymbolsKeyboard) {
-            mSymbolsKeyboard.setShifted(true);
-            mInputView.setKeyboard(mSymbolsShiftedKeyboard);
-            mSymbolsShiftedKeyboard.setShifted(true);
-            mSymbolsShiftedKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
-        } else if (currentKeyboard == mSymbolsShiftedKeyboard) {
-            mSymbolsShiftedKeyboard.setShifted(false);
-            mInputView.setKeyboard(mSymbolsKeyboard);
-            mSymbolsKeyboard.setShifted(false);
-            mSymbolsKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
+        if (mCurrentId.equals(mSymbolsId)) {
+            LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId);
+            LatinKeyboard symbolsShiftedKeyboard = getKeyboard(mSymbolsShiftedId);
+            symbolsKeyboard.setShifted(true);
+            mCurrentId = mSymbolsShiftedId;
+            mInputView.setKeyboard(symbolsShiftedKeyboard);
+            symbolsShiftedKeyboard.setShifted(true);
+            symbolsShiftedKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
+        } else if (mCurrentId.equals(mSymbolsShiftedId)) {
+            LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId);
+            LatinKeyboard symbolsShiftedKeyboard = getKeyboard(mSymbolsShiftedId);
+            symbolsShiftedKeyboard.setShifted(false);
+            mCurrentId = mSymbolsId;
+            mInputView.setKeyboard(getKeyboard(mSymbolsId));
+            symbolsKeyboard.setShifted(false);
+            symbolsKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
         }
     }
 
     void toggleSymbols() {
-        Keyboard current = mInputView.getKeyboard();
-        if (mSymbolsKeyboard == null) {
-            mSymbolsKeyboard = new LatinKeyboard(mContext, R.xml.kbd_symbols);
-        }
-        if (mSymbolsShiftedKeyboard == null) {
-            mSymbolsShiftedKeyboard = new LatinKeyboard(mContext, R.xml.kbd_symbols_shift);
-        }
-        if (current == mSymbolsKeyboard || current == mSymbolsShiftedKeyboard) {
-            setKeyboardMode(mMode, mImeOptions); // Could be qwerty, alpha, url, email or im
-            return;
-        } else if (current == mPhoneKeyboard) {
-            current = mPhoneSymbolsKeyboard;
-            mPhoneSymbolsKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
-        } else if (current == mPhoneSymbolsKeyboard) {
-            current = mPhoneKeyboard;
-            mPhoneKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
-        } else {
-            current = mSymbolsKeyboard;
-            mSymbolsKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
-        }
-        mInputView.setKeyboard(current);
-        if (current == mSymbolsKeyboard) {
-            current.setShifted(false);
-        }
+        setKeyboardMode(mMode, mImeOptions, !mIsSymbols);
     }
 }