Merge "Fix proguard flags."
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 75bdda1..02361e1 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Nápověda:"</b>" Příště zkuste vyslovit interpunkci, například „tečka“, „čárka“ nebo „otazník“."</string>
     <string name="cancel" msgid="6830980399865683324">"Zrušit"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Hlasový vstup"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Hlasový vstup"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"Na hlavní klávesnici"</item>
+    <item msgid="8529385602829095903">"Na klávesnici se symboly"</item>
+    <item msgid="7283103513488381103">"Vypnout"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Mikrofon na hlavní klávesnici"</item>
+    <item msgid="6907837061058876770">"Mikrofon na klávesnici se symboly"</item>
+    <item msgid="3664304608587798036">"Hlasový vstup je deaktivován"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Po hlasovém vstupu automaticky odeslat"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Při vyhledávání nebo přechodu na další pole automaticky stisknout Enter."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otevřete klávesnici"\n</b></font><font size="3">\n</font>"Dotkněte se jakéhokoli textového pole."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".net"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".eu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Metoda zadávání dat"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Vstupní jazyky"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Jazyk můžete změnit posunutím prstu po mezerníku."</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Uložte slovo opětovným klepnutím"</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 70ba547..15f6b1c 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Tip:"</b>" Næste gang kan du forsøge at sige tegnsætning, f.eks. \"punktum\", \"komma\" eller \"spørgsmålstegn\"."</string>
     <string name="cancel" msgid="6830980399865683324">"Annuller"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Stemmeinput"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Stemmeinput"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"På hovedtastatur"</item>
+    <item msgid="8529385602829095903">"På symboltastatur"</item>
+    <item msgid="7283103513488381103">"Fra"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Mikrofon på hovedtastatur"</item>
+    <item msgid="6907837061058876770">"Mikrofon på symboltastatur"</item>
+    <item msgid="3664304608587798036">"Stemmeinput er deaktiveret"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Send automatisk efter stemme"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Tryk automatisk på enter, når du søger eller går til det næste felt."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Åbn tastaturet"\n</b></font><font size="3">\n</font>"Tryk på et hvilket som helst tekstfelt."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Inputmetode"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Inputsprog"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Træk fingeren på mellemrumstasten for at skifte sprog"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Tast igen for at gemme"</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 1d82189..e203fb3 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Hinweis:"</b>" Versuchen Sie beim nächsten Mal, Satzzeichen wie \"Punkt\", \"Komma\" oder \"Fragezeichen\" per Sprachbefehl einzugeben."</string>
     <string name="cancel" msgid="6830980399865683324">"Abbrechen"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Spracheingabe"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Spracheingabe"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"Auf Haupttastatur"</item>
+    <item msgid="8529385602829095903">"Auf Symboltastatur"</item>
+    <item msgid="7283103513488381103">"Aus"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Mikrofon auf Haupttastatur"</item>
+    <item msgid="6907837061058876770">"Mikrofon auf Symboltastatur"</item>
+    <item msgid="3664304608587798036">"Spracheingabe ist deaktiviert"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Nach Sprachaufnahme automatisch senden"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Drücken Sie auf die Eingabetaste, wenn Sie einen Suchvorgang durchführen oder zum nächsten Feld wechseln."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Tastatur öffnen"\n</b></font><font size="3">\n</font>"Berühren Sie ein beliebiges Textfeld."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Eingabemethode"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Eingabesprachen"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Finger über die Leertaste bewegen, um die Sprache zu ändern"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Zum Speichern erneut tippen"</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index acbe294..85c18df 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Υπόδειξη:"</b>" Την επόμενη φορά, προσπαθήστε να προφέρετε σημεία στίξης, όπως \"τελεία\", \"κόμμα\" ή \"ερωτηματικό\"."</string>
     <string name="cancel" msgid="6830980399865683324">"Ακύρωση"</string>
     <string name="ok" msgid="7898366843681727667">"ΟΚ"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Φωνητική είσοδος"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Φωνητική είσοδος"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"Στο κύριο πληκτρολόγιο"</item>
+    <item msgid="8529385602829095903">"Πληκτρολόγιο συμβόλων ενεργοποίησης"</item>
+    <item msgid="7283103513488381103">"Απενεργοποίηση"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Μικρόφωνο στο κύριο πληκτρολόγιο"</item>
+    <item msgid="6907837061058876770">"Μικρόφωνο στο πληκτρολόγιο συμβόλων"</item>
+    <item msgid="3664304608587798036">"Η φωνητική είσοδος είναι απενεργοποιημένη"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Αυτόματη υποβολή μετά από ήχο"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Πατήστε enter αυτόματα κατά την αναζήτηση ή τη μετάβαση στο επόμενο πεδίο."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Ανοίξτε το πληκτρολόγιο"\n</b></font><font size="3">\n</font>"Αγγίξτε οποιοδήποτε πεδίο κειμένου."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Μέθοδος εισόδου"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Γλώσσες εισόδου"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Πατήστε ξανά για αποθήκευση"</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 8a8ded8..541e153 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Sugerencia:"</b>" La próxima vez intenta decir la puntuación como \"punto\", \"coma\" o \"signo de pregunta\"."</string>
     <string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
     <string name="ok" msgid="7898366843681727667">"Aceptar"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Entrada por voz"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Entrada por voz"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"En el teclado principal"</item>
+    <item msgid="8529385602829095903">"En el teclado de símbolos"</item>
+    <item msgid="7283103513488381103">"Apagado"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Micrófono en el teclado principal"</item>
+    <item msgid="6907837061058876770">"Micrófono en el teclado de símbolos"</item>
+    <item msgid="3664304608587798036">"La entrada por voz está inhabilitada."</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Enviar automáticamente después del audio"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Presionar automáticamente Ingresar al buscar o ir al campo siguiente."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abrir el teclado"\n</b></font><font size="3">\n</font>"Tocar cualquier campo de texto."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Método de entrada"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Deslizarse manualmente por la barra espaciadora para cambiar el idioma"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Presionar nuevamente para guardar"</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 4977cba..fbc597e 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -83,7 +83,7 @@
     <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar la función de introducción de voz, accede a la configuración del teclado."</string>
     <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para utilizar la función de introducción de voz, pulsa el botón de micrófono o desliza el dedo por el teclado en pantalla."</string>
     <string name="voice_listening" msgid="467518160751321844">"Hablar ahora"</string>
-    <string name="voice_working" msgid="6666937792815731889">"Trabajando"</string>
+    <string name="voice_working" msgid="6666937792815731889">"En curso"</string>
     <!-- no translation found for voice_initializing (661962047129906646) -->
     <skip />
     <string name="voice_error" msgid="5140896300312186162">"Se ha producido un error. Inténtalo de nuevo."</string>
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Sugerencia:"</b>" la próxima vez, prueba a indicar signos de puntuación como, por ejemplo, \"punto\", \"coma\" o \"signo de interrogación\"."</string>
     <string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
     <string name="ok" msgid="7898366843681727667">"Aceptar"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Introducción de voz"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Introducción de voz"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"En teclado principal"</item>
+    <item msgid="8529385602829095903">"En teclado de símbolos"</item>
+    <item msgid="7283103513488381103">"Desactivado"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Micrófono en teclado principal"</item>
+    <item msgid="6907837061058876770">"Micrófono en teclado de símbolos"</item>
+    <item msgid="3664304608587798036">"La función de introducción de voz no está habilitada."</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Enviar automáticamente después de la introducción de voz"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Pulsar Intro automáticamente al buscar o al pasar al siguiente campo"</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abrir el teclado"\n</b></font><font size="3">\n</font>"Pulsa cualquier campo de texto."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Método de introducción de texto"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Deslizar el dedo por la barra espaciadora para cambiar el idioma"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Volver a tocar para guardar"</string>
 </resources>
diff --git a/res/values-fr/donottranslate.xml b/res/values-fr/donottranslate.xml
index 527f15e..b79df7b 100644
--- a/res/values-fr/donottranslate.xml
+++ b/res/values-fr/donottranslate.xml
@@ -19,7 +19,7 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Symbols that are commonly considered word separators in this language -->
-    <string name="word_separators">.\u0020,;:!?\'\n()[]*&amp;@{}/&lt;&gt;_+=|\u0022</string>
+    <string name="word_separators">.\u0009\u0020,;:!?\'\n()[]*&amp;@{}/&lt;&gt;_+=|\u0022</string>
     <!-- Symbols that are sentence separators, for purposes of making it hug the last sentence. -->
     <string name="sentence_separators">.,</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index f4834da..0859414 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Astuce :"</b>" La prochaine fois, essayez de prononcer la ponctuation, en énonçant des termes tels que \"point\", \"virgule\" ou \"point d\'interrogation\"."</string>
     <string name="cancel" msgid="6830980399865683324">"Annuler"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Saisie vocale"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Saisie vocale"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"Sur le clavier principal"</item>
+    <item msgid="8529385602829095903">"Sur le clavier des symboles"</item>
+    <item msgid="7283103513488381103">"Désactivée"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Micro sur le clavier principal"</item>
+    <item msgid="6907837061058876770">"Micro sur le clavier des symboles"</item>
+    <item msgid="3664304608587798036">"Saisie vocale désactivée"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Envoi automatique après la saisie vocale"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Appuyez automatiquement sur Entrée pour effectuer une recherche ou accéder au champ suivant."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Ouvrir le clavier"\n</b></font><font size="3">\n</font>"Appuyez sur un champ de texte."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gouv"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Mode de saisie"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Faites glisser votre doigt sur la barre d\'espacement pour changer la langue."</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Appuyer de nouveau pour enregistrer"</string>
 </resources>
diff --git a/res/values-it/donottranslate.xml b/res/values-it/donottranslate.xml
index 5cb72ad..3e3f3ef 100644
--- a/res/values-it/donottranslate.xml
+++ b/res/values-it/donottranslate.xml
@@ -19,5 +19,5 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Symbols that are commonly considered word separators in this language -->
-    <string name="word_separators">.\u0020,;:!?\'\n()[]*&amp;@{}/&lt;&gt;_+=|\u0022</string>
+    <string name="word_separators">.\u0009\u0020,;:!?\'\n()[]*&amp;@{}/&lt;&gt;_+=|\u0022</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 94478ce..1135dd0 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Suggerimento."</b>" La prossima volta, prova a pronunciare termini relativi alla punteggiatura come \"punto\", \"virgola\" o \"punto di domanda\"."</string>
     <string name="cancel" msgid="6830980399865683324">"Annulla"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Comandi vocali"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Comandi vocali"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"Su tastiera principale"</item>
+    <item msgid="8529385602829095903">"Su tastiera simboli"</item>
+    <item msgid="7283103513488381103">"Non attivi"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Microfono su tastiera principale"</item>
+    <item msgid="6907837061058876770">"Microfono su tastiera simboli"</item>
+    <item msgid="3664304608587798036">"Comandi vocali disabilitati"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Invia automaticamente dopo comando vocale"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Premi automaticamente \"Invio\" durante una ricerca o un passaggio al campo successivo."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Apertura tastiera"\n</b></font><font size="3">\n</font>"Tocca qualsiasi campo di testo."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Metodo inserimento"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Lingue comandi"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Scorri il dito sulla barra spaziatrice per cambiare la lingua"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Tocca di nuovo per salvare"</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 3f29eb9..9097bd9 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"ヒント:"</b>" 次回は句読点として「period」、「comma」、「question mark」などの音声入力を試してみてください。"</string>
     <string name="cancel" msgid="6830980399865683324">"キャンセル"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"音声入力"</string>
+    <string name="voice_input" msgid="2466640768843347841">"音声入力"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"メインキーボード上"</item>
+    <item msgid="8529385602829095903">"記号キーボード上"</item>
+    <item msgid="7283103513488381103">"OFF"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"メインキーボードのマイク"</item>
+    <item msgid="6907837061058876770">"記号キーボードのマイク"</item>
+    <item msgid="3664304608587798036">"音声入力は無効です"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"入力後に自動送信する"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"検索または次のフィールドに進む際、Enterキーが自動的に押されます。"</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"キーボードを開く"\n</b></font><font size="3">\n</font>"テキストフィールドをタップします。"</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"入力方法"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"入力言語"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"スペースバーで指をスライドさせて言語を変更する"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"←保存するにはもう一度タップ"</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 1d9e0bd..15000e6 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"도움말:"</b>" 다음 번에는 \'마침표\', \'쉼표\', \'물음표\'와 같은 구두점을 말해 보세요."</string>
     <string name="cancel" msgid="6830980399865683324">"취소"</string>
     <string name="ok" msgid="7898366843681727667">"확인"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"음성 입력"</string>
+    <string name="voice_input" msgid="2466640768843347841">"음성 입력"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"기본 키보드"</item>
+    <item msgid="8529385602829095903">"기호 키보드"</item>
+    <item msgid="7283103513488381103">"사용 안함"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"기본 키보드의 마이크"</item>
+    <item msgid="6907837061058876770">"기호 키보드의 마이크"</item>
+    <item msgid="3664304608587798036">"음성 입력이 사용 중지됨"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"음성을 입력한 다음 자동 제출"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"검색하거나 다음 입력란으로 이동할 때 자동으로 Enter 키를 누릅니다."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"키보드 열기"\n</b></font><font size="3">\n</font>"아무 텍스트 입력란이나 터치하세요."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"입력 방법"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"입력 언어"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← 저장하려면 다시 누르세요."</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 971bc14..a7ddc75 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Hint:"</b>" Neste gang kan du prøve å tale inn tegnsettingen ved for eksempel å si «punktum», «komma» eller «spørsmålstegn»."</string>
     <string name="cancel" msgid="6830980399865683324">"Avbryt"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Stemmedata"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Talekommando"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"På hovedtastatur"</item>
+    <item msgid="8529385602829095903">"På talltastatur"</item>
+    <item msgid="7283103513488381103">"Av"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Mikronfon på hovedtastatur"</item>
+    <item msgid="6907837061058876770">"Mikronfon på talltastatur"</item>
+    <item msgid="3664304608587798036">"Talekommando er deaktivert"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Send inn automatisk etter tale"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Trykk Enter automatisk ved søk eller flytting til neste felt."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Åpne tastaturet"\n</b></font><font size="3">\n</font>"Trykk på et tekstfelt."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".net"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".org"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".info"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Inndatametode"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Inndataspråk"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Dra fingeren på mellomromstasten for å endre språk"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Trykk på nytt for å lagre"</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index beeb0af..9a69c12 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Hint:"</b>" spreek de volgende keer interpunctie uit, zoals \'period\' (punt), \'comma\' (komma) of \'question mark\' (vraagteken)."</string>
     <string name="cancel" msgid="6830980399865683324">"Annuleren"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Spraakinvoer"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Spraakinvoer"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"Op hoofdtoetsenbord"</item>
+    <item msgid="8529385602829095903">"Op toetsenbord voor symbolen"</item>
+    <item msgid="7283103513488381103">"Uit"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Microfoon op hoofdtoetsenbord"</item>
+    <item msgid="6907837061058876770">"Microfoon op toetsenbord voor symbolen"</item>
+    <item msgid="3664304608587798036">"Spraakinvoer is uitgeschakeld"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Automatisch verzenden na spraak"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Drukt automatisch op Enter tijdens het zoeken of wanneer u naar het volgende veld wilt gaan."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Het toetsenbord openen"\n</b></font><font size="3">\n</font>"Raak een tekstveld aan."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Invoermethode"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Invoertalen"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Schuif uw vinger over de spatiebalk om de taal te wijzigen"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Tik nogmaals om op te slaan"</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 2da0207..a411cc2 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Wskazówka:"</b>" następnym razem spróbuj wypowiadać nazwy znaków interpunkcyjnych: „kropka”, „przecinek” lub „pytajnik”."</string>
     <string name="cancel" msgid="6830980399865683324">"Anuluj"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Wprowadzanie głosowe"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Wprowadzanie głosowe"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"Na klawiaturze głównej"</item>
+    <item msgid="8529385602829095903">"Na klawiaturze z symbolami"</item>
+    <item msgid="7283103513488381103">"Wyłączone"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Mikrofon na klawiaturze głównej"</item>
+    <item msgid="6907837061058876770">"Mikrofon na klawiaturze z symbolami"</item>
+    <item msgid="3664304608587798036">"Wprowadzanie głosowe jest wyłączone"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Automatyczne przesyłanie uruchamiane głosem"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Podczas wyszukiwania lub przechodzenia do następnego pola automatycznie naciśnij klawisz Enter."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otwórz klawiaturę"\n</b></font><font size="3">\n</font>"Dotknij dowolnego pola tekstowego."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Metoda wprowadzania"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Przesuń palcem po spacji, aby zmienić język"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Dotknij ponownie, aby zapisać"</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index ec397b6..399975d8 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Sugestão:"</b>" Da próxima vez, experimente dizer a pontuação como \"ponto final\", \"vírgula\" ou \"ponto de interrogação\"."</string>
     <string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Entrada de voz"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Entrada de voz"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"No teclado principal"</item>
+    <item msgid="8529385602829095903">"No teclado de símbolos"</item>
+    <item msgid="7283103513488381103">"Desactivada"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Microfone no teclado principal"</item>
+    <item msgid="6907837061058876770">"Microfone no teclado de símbolos"</item>
+    <item msgid="3664304608587798036">"A entrada de voz está desactivada"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Enviar automaticamente depois da voz"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Premir automaticamente ENTER ao pesquisar ou avançar para o campo seguinte."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abra o teclado"\n</b></font><font size="3">\n</font>"Toque em qualquer campo de texto."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
+    <string name="inputMethod" msgid="7854532062009028116">"Método de entrada"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Deslize o dedo pela barra de espaço para alterar o idioma"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Toque novamente para guardar"</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 64042b3..18ffdf0 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Dica:"</b>" Da próxima vez, tente falar o nome da pontuação como \"ponto\", \"vírgula\" ou \"ponto de interrogação\"."</string>
     <string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Entrada de voz"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Entrada de voz"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"No teclado principal"</item>
+    <item msgid="8529385602829095903">"No teclado de símbolos"</item>
+    <item msgid="7283103513488381103">"Desativado"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Microfone no teclado principal"</item>
+    <item msgid="6907837061058876770">"Microfone no teclado de símbolos"</item>
+    <item msgid="3664304608587798036">"Entrada de voz desativada"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Enviar automaticamente depois de falar"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Pressione Enter automaticamente ao pesquisar ou ir para o próximo campo."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abra o teclado"\n</b></font><font size="3">\n</font>"Toque em qualquer campo de texto."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
+    <string name="inputMethod" msgid="7854532062009028116">"Método de entrada"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Deslize o dedo na barra de espaços para alterar o idioma"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Toque novamente para salvar"</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 6e81f7d..d4ebc6d 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Совет"</b>". В следующий раз проговаривайте знаки препинания, например \"точка\", \"запятая\", \"вопросительный знак\"."</string>
     <string name="cancel" msgid="6830980399865683324">"Отмена"</string>
     <string name="ok" msgid="7898366843681727667">"ОК"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Голосовой ввод"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Голосовой ввод"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"На основной клавиатуре"</item>
+    <item msgid="8529385602829095903">"На клавиатуре символов"</item>
+    <item msgid="7283103513488381103">"Выкл."</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Микрофон на основной клавиатуре"</item>
+    <item msgid="6907837061058876770">"Микрофон на клавиатуре символов"</item>
+    <item msgid="3664304608587798036">"Голосовой ввод отключен"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Автоматически отправлять по окончании голосового ввода"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Автоматически нажимать \"Ввод\" при поиске или переходе к следующему полю."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Откройте клавиатуру"\n</b></font><font size="3">\n</font>"Нажмите на любое текстовое поле."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Способ ввода"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Языки ввода"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Для изменения языка проведите пальцем по пробелу"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Нажмите повторно, чтобы сохранить"</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 8027eb3..2d07a07 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Tips!"</b>" Nästa gång testar du att säga skiljetecknen, som \"punkt\", \"komma\" eller \"frågetecken\"."</string>
     <string name="cancel" msgid="6830980399865683324">"Avbryt"</string>
     <string name="ok" msgid="7898366843681727667">"OK"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Röstindata"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Röstindata"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"På huvudtangentbordet"</item>
+    <item msgid="8529385602829095903">"På symboltangentbordet"</item>
+    <item msgid="7283103513488381103">"Av"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Mikrofon på huvudtangentbordet"</item>
+    <item msgid="6907837061058876770">"Mikrofon på symboltangentbordet"</item>
+    <item msgid="3664304608587798036">"Röstindata är inaktiverat"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Skicka automatiskt efter röst"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Tryck automatiskt på retur vid sökning eller när du fortsätter till nästa fält."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Öppna tangentbordet"\n</b></font><font size="3">\n</font>"Tryck på ett textfält."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Indatametod"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Inmatningsspråk"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Dra med fingret på blanksteg om du vill ändra språk"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Peka igen för att spara"</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 069abeb..e150a5e 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -98,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"İpucu:"</b>" Sonraki sefer, \"nokta\", \"virgül\" veya \"soru işareti\" gibi noktalama işaretlerini telaffuz etmeyi deneyin."</string>
     <string name="cancel" msgid="6830980399865683324">"İptal"</string>
     <string name="ok" msgid="7898366843681727667">"Tamam"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"Ses girişi"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Ses girişi"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"Ana klavyede"</item>
+    <item msgid="8529385602829095903">"Simge klavyesinde"</item>
+    <item msgid="7283103513488381103">"Kapalı"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"Ana klavyedeki mikrofon"</item>
+    <item msgid="6907837061058876770">"Simge klavyesindeki mikrofon"</item>
+    <item msgid="3664304608587798036">"Sesle giriş devre dışı bırakıldı"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Sesten sonra otomatik gönder"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Arama yaparken veya bir sonraki alana giderken enter tuşuna otomatik olarak basın."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Klavyeyi açın"\n</b></font><font size="3">\n</font>"Herhangi bir metin alanına dokunun."</string>
@@ -110,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"Giriş yöntemi"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Giriş dilleri"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Kaydetmek için tekrar dokunun"</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 034f327..f372991 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -57,7 +57,6 @@
     <string name="alternates_for_n" msgid="6257322556221886400">"ñ"</string>
     <string name="alternates_for_c" msgid="151699780720639892">"ç"</string>
     <string name="alternates_for_y" msgid="1722776806607271199">"ýÿ"</string>
-    <string name="key_i" msgid="6483655742552255124">"i"</string>
     <string name="tip_long_press" msgid="6101270866284343344">"按住某个键可看到重音符号(例如 ø、ö 等)"</string>
     <string name="tip_dismiss" msgid="7585579046862204381">"随时可以通过按后退键 ↶ 关闭键盘"</string>
     <string name="tip_access_symbols" msgid="6344098517525531652">"访问数字和符号"</string>
@@ -99,7 +98,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"提示:"</b>"稍后,请尝试使用语音输入标点符号,如“句号”、“逗号”或“问号”。"</string>
     <string name="cancel" msgid="6830980399865683324">"取消"</string>
     <string name="ok" msgid="7898366843681727667">"确定"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"语音输入"</string>
+    <string name="voice_input" msgid="2466640768843347841">"语音输入"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"主键盘上"</item>
+    <item msgid="8529385602829095903">"符号键盘上"</item>
+    <item msgid="7283103513488381103">"关"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"主键盘上的麦克风"</item>
+    <item msgid="6907837061058876770">"符号键盘上的麦克风"</item>
+    <item msgid="3664304608587798036">"已停用语音输入"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"语音结束后自动提交"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"搜索或转到下一字段时自动按 Enter。"</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"打开键盘"\n</b></font><font size="3">\n</font>"轻触任意文本字段。"</string>
@@ -111,7 +120,8 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"输入法"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"输入语言"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"在空格键上滑动手指可更改语言"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← 再次点按即可保存"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 9603c6b..c4efd00 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -98,7 +98,14 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"提示:"</b>"下次可嘗試說出標點符號,例如「句號」、「逗號」或「問號」。"</string>
     <string name="cancel" msgid="6830980399865683324">"取消"</string>
     <string name="ok" msgid="7898366843681727667">"確定"</string>
-    <string name="enable_voice" msgid="8299503298530853956">"語音輸入"</string>
+    <!-- no translation found for voice_input (2466640768843347841) -->
+    <skip />
+    <!-- no translation found for voice_input_modes:0 (1349082139076086774) -->
+    <!-- no translation found for voice_input_modes:1 (8529385602829095903) -->
+    <!-- no translation found for voice_input_modes:2 (7283103513488381103) -->
+    <!-- no translation found for voice_input_modes_summary:0 (554248625705084903) -->
+    <!-- no translation found for voice_input_modes_summary:1 (6907837061058876770) -->
+    <!-- no translation found for voice_input_modes_summary:2 (3664304608587798036) -->
     <string name="auto_submit" msgid="9151008027068358518">"說話後自動提交"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"搜尋或前往下一個欄位時自動按下輸入。"</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"開啟鍵盤"\n</b></font><font size="3">\n</font>"輕觸任何文字欄位。"</string>
@@ -110,7 +117,11 @@
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
-    <!-- no translation found for language_selection_title (530749890984542339) -->
-    <skip />
     <string name="inputMethod" msgid="7854532062009028116">"輸入方式"</string>
+    <!-- no translation found for language_selection_title (1651299598555326750) -->
+    <skip />
+    <!-- no translation found for language_selection_summary (187110938289512256) -->
+    <skip />
+    <!-- no translation found for hint_add_to_dictionary (8058519710062071085) -->
+    <skip />
 </resources>
diff --git a/res/values/donottranslate.xml b/res/values/donottranslate.xml
index edf2300..87c28ae 100644
--- a/res/values/donottranslate.xml
+++ b/res/values/donottranslate.xml
@@ -19,7 +19,7 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Symbols that are commonly considered word separators in this language -->
-    <string name="word_separators">.\u0020,;:!?\n()[]*&amp;@{}/&lt;&gt;_+=|\u0022</string>
+    <string name="word_separators">.\u0009\u0020,;:!?\n()[]*&amp;@{}/&lt;&gt;_+=|\u0022</string>
     <!-- Symbols that are sentence separators, for purposes of making it hug the last sentence. -->
     <string name="sentence_separators">.,!?</string>
     <!-- Symbols that are suggested between words -->
diff --git a/res/xml/kbd_symbols.xml b/res/xml/kbd_symbols.xml
index 067932b..ede7b50 100755
--- a/res/xml/kbd_symbols.xml
+++ b/res/xml/kbd_symbols.xml
@@ -77,7 +77,7 @@
         />
         <Key android:codes="45" android:keyLabel="-"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="–—"
+                android:popupCharacters="_–—"
         />
         <Key android:keyLabel="+"
                 android:popupKeyboard="@xml/kbd_popup_template"
diff --git a/res/xml/kbd_symbols_shift.xml b/res/xml/kbd_symbols_shift.xml
index d83594a..09b5c3f 100755
--- a/res/xml/kbd_symbols_shift.xml
+++ b/res/xml/kbd_symbols_shift.xml
@@ -42,7 +42,7 @@
     </Row>
     
     <Row>
-        <Key android:keyLabel="¥" android:keyEdgeFlags="left"/>
+        <Key android:codes="9" android:keyLabel="\u21E5" android:keyEdgeFlags="left"/>
         <Key android:keyLabel="£"/>
         <Key android:keyLabel="¢"/>
         <Key android:keyLabel="€"/>
diff --git a/res/xml/popup_punctuation.xml b/res/xml/popup_punctuation.xml
index 518e3f1..a29fb52 100644
--- a/res/xml/popup_punctuation.xml
+++ b/res/xml/popup_punctuation.xml
@@ -26,8 +26,8 @@
     >
 
     <Row android:rowEdgeFlags="top">
-        <Key android:keyLabel=";" android:keyEdgeFlags="left" />
-        <Key android:keyLabel="," />
+        <Key android:keyLabel=":" android:keyEdgeFlags="left" />
+        <Key android:keyLabel="/" />
         <Key android:keyLabel="&amp;" />
         <Key android:keyLabel="(" />
         <Key android:keyLabel=")" />
@@ -35,12 +35,12 @@
         <Key android:keyLabel="+" android:keyEdgeFlags="right" />
     </Row>
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="58" android:keyLabel=":" android:keyEdgeFlags="left" />
-        <Key android:codes="47" android:keyLabel="/" />
-        <Key android:codes="64" android:keyLabel="\@" />
-        <Key android:codes="39" android:keyLabel="\'" />
-        <Key android:codes="34" android:keyLabel="&quot;" />
-        <Key android:codes="63" android:keyLabel="\?" />
-        <Key android:codes="33" android:keyLabel="!" android:keyEdgeFlags="right" />
+        <Key android:keyLabel=";" android:keyEdgeFlags="left" />
+        <Key android:keyLabel="," />
+        <Key android:keyLabel="\@" />
+        <Key android:keyLabel="\'" />
+        <Key android:keyLabel="&quot;" />
+        <Key android:keyLabel="\?" />
+        <Key android:keyLabel="!" android:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/src/com/android/inputmethod/latin/AutoDictionary.java b/src/com/android/inputmethod/latin/AutoDictionary.java
new file mode 100644
index 0000000..3d76dc3
--- /dev/null
+++ b/src/com/android/inputmethod/latin/AutoDictionary.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.
+ */
+
+package com.android.inputmethod.latin;
+
+import java.util.HashMap;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.provider.BaseColumns;
+import android.provider.UserDictionary.Words;
+import android.util.Log;
+
+/**
+ * Stores new words temporarily until they are promoted to the user dictionary
+ * for longevity. Words in the auto dictionary are used to determine if it's ok
+ * to accept a word that's not in the main or user dictionary. Using a new word
+ * repeatedly will promote it to the user dictionary.
+ */
+public class AutoDictionary extends ExpandableDictionary {
+    // Weight added to a user picking a new word from the suggestion strip
+    static final int FREQUENCY_FOR_PICKED = 3;
+    // Weight added to a user typing a new word that doesn't get corrected (or is reverted)
+    static final int FREQUENCY_FOR_TYPED = 1;
+    // A word that is frequently typed and gets promoted to the user dictionary, uses this
+    // frequency.
+    static final int FREQUENCY_FOR_AUTO_ADD = 250;
+    // If the user touches a typed word 2 times or more, it will become valid.
+    private static final int VALIDITY_THRESHOLD = 2 * FREQUENCY_FOR_PICKED;
+    // If the user touches a typed word 4 times or more, it will be added to the user dict.
+    private static final int PROMOTION_THRESHOLD = 4 * FREQUENCY_FOR_PICKED;
+
+    private LatinIME mIme;
+    // Locale for which this auto dictionary is storing words
+    private String mLocale;
+
+    private static final String DATABASE_NAME = "auto_dict.db";
+    private static final int DATABASE_VERSION = 1;
+
+    // These are the columns in the dictionary
+    // TODO: Consume less space by using a unique id for locale instead of the whole
+    // 2-5 character string.
+    private static final String COLUMN_ID = BaseColumns._ID;
+    private static final String COLUMN_WORD = "word";
+    private static final String COLUMN_FREQUENCY = "freq";
+    private static final String COLUMN_LOCALE = "locale";
+
+    /** Sort by descending order of frequency. */
+    public static final String DEFAULT_SORT_ORDER = COLUMN_FREQUENCY + " DESC";
+
+    /** Name of the words table in the auto_dict.db */
+    private static final String AUTODICT_TABLE_NAME = "words";
+
+    private static HashMap<String, String> sDictProjectionMap;
+
+    static {
+        sDictProjectionMap = new HashMap<String, String>();
+        sDictProjectionMap.put(COLUMN_ID, COLUMN_ID);
+        sDictProjectionMap.put(COLUMN_WORD, COLUMN_WORD);
+        sDictProjectionMap.put(COLUMN_FREQUENCY, COLUMN_FREQUENCY);
+        sDictProjectionMap.put(COLUMN_LOCALE, COLUMN_LOCALE);
+    }
+
+    private DatabaseHelper mOpenHelper;
+
+    public AutoDictionary(Context context, LatinIME ime, String locale) {
+        super(context);
+        mIme = ime;
+        mLocale = locale;
+        mOpenHelper = new DatabaseHelper(getContext());
+        if (mLocale != null && mLocale.length() > 1) {
+            loadDictionary();
+        }
+    }
+
+    @Override
+    public boolean isValidWord(CharSequence word) {
+        final int frequency = getWordFrequency(word);
+        return frequency >= VALIDITY_THRESHOLD;
+    }
+
+    public void close() {
+        mOpenHelper.close();
+    }
+
+    private void loadDictionary() {
+        // Load the words that correspond to the current input locale
+        Cursor cursor = query(COLUMN_LOCALE + "=?", new String[] { mLocale });
+        if (cursor.moveToFirst()) {
+            int wordIndex = cursor.getColumnIndex(COLUMN_WORD);
+            int frequencyIndex = cursor.getColumnIndex(COLUMN_FREQUENCY);
+            while (!cursor.isAfterLast()) {
+                String word = cursor.getString(wordIndex);
+                int frequency = cursor.getInt(frequencyIndex);
+                // Safeguard against adding really long words. Stack may overflow due
+                // to recursive lookup
+                if (word.length() < getMaxWordLength()) {
+                    super.addWord(word, frequency);
+                }
+                cursor.moveToNext();
+            }
+        }
+        cursor.close();
+    }
+
+    @Override
+    public void addWord(String word, int addFrequency) {
+        final int length = word.length();
+        // Don't add very short or very long words.
+        if (length < 2 || length > getMaxWordLength()) return;
+        if (mIme.getCurrentWord().isAutoCapitalized()) {
+            // Remove caps before adding
+            word = Character.toLowerCase(word.charAt(0)) + word.substring(1);
+        }
+        int freq = getWordFrequency(word);
+        freq = freq < 0 ? addFrequency : freq + addFrequency;
+        super.addWord(word, freq);
+        if (freq >= PROMOTION_THRESHOLD) {
+            mIme.promoteToUserDictionary(word, FREQUENCY_FOR_AUTO_ADD);
+            // Delete the word (for input locale) from the auto dictionary db, as it
+            // is now in the user dictionary provider.
+            delete(COLUMN_WORD + "=? AND " + COLUMN_LOCALE + "=?",
+                    new String[] { word, mLocale });
+        } else {
+            update(word, freq, mLocale);
+        }
+    }
+
+    /**
+     * This class helps open, create, and upgrade the database file.
+     */
+    private static class DatabaseHelper extends SQLiteOpenHelper {
+
+        DatabaseHelper(Context context) {
+            super(context, DATABASE_NAME, null, DATABASE_VERSION);
+        }
+
+        @Override
+        public void onCreate(SQLiteDatabase db) {
+            db.execSQL("CREATE TABLE " + AUTODICT_TABLE_NAME + " ("
+                    + COLUMN_ID + " INTEGER PRIMARY KEY,"
+                    + COLUMN_WORD + " TEXT,"
+                    + COLUMN_FREQUENCY + " INTEGER,"
+                    + COLUMN_LOCALE + " TEXT"
+                    + ");");
+        }
+
+        @Override
+        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+            Log.w("AutoDictionary", "Upgrading database from version " + oldVersion + " to "
+                    + newVersion + ", which will destroy all old data");
+            db.execSQL("DROP TABLE IF EXISTS " + AUTODICT_TABLE_NAME);
+            onCreate(db);
+        }
+    }
+
+    private Cursor query(String selection, String[] selectionArgs) {
+        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+        qb.setTables(AUTODICT_TABLE_NAME);
+        qb.setProjectionMap(sDictProjectionMap);
+
+        // Get the database and run the query
+        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+        Cursor c = qb.query(db, null, selection, selectionArgs, null, null,
+                DEFAULT_SORT_ORDER);
+        return c;
+    }
+
+    private boolean insert(ContentValues values) {
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        long rowId = db.insert(AUTODICT_TABLE_NAME, Words.WORD, values);
+        if (rowId > 0) {
+            return true;
+        }
+        return false;
+    }
+
+    private int delete(String where, String[] whereArgs) {
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        int count = db.delete(AUTODICT_TABLE_NAME, where, whereArgs);
+        return count;
+    }
+
+    private int update(String word, int frequency, String locale) {
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        long count = db.delete(AUTODICT_TABLE_NAME, COLUMN_WORD + "=? AND " + COLUMN_LOCALE + "=?",
+                new String[] { word, locale });
+        count = db.insert(AUTODICT_TABLE_NAME, null,
+                getContentValues(word, frequency, locale));
+        return (int) count;
+    }
+
+    private ContentValues getContentValues(String word, int frequency, String locale) {
+        ContentValues values = new ContentValues(4);
+        values.put(COLUMN_WORD, word);
+        values.put(COLUMN_FREQUENCY, frequency);
+        values.put(COLUMN_LOCALE, locale);
+        return values;
+    }
+}
diff --git a/src/com/android/inputmethod/latin/InputLanguageSelection.java b/src/com/android/inputmethod/latin/InputLanguageSelection.java
index 2c5fec6..73298e3 100644
--- a/src/com/android/inputmethod/latin/InputLanguageSelection.java
+++ b/src/com/android/inputmethod/latin/InputLanguageSelection.java
@@ -19,7 +19,6 @@
 import java.text.Collator;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 import java.util.Locale;
 
 import android.content.SharedPreferences;
@@ -29,7 +28,7 @@
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceManager;
-import android.util.Log;
+import android.text.TextUtils;
 
 public class InputLanguageSelection extends PreferenceActivity {
 
@@ -91,7 +90,9 @@
     }
 
     private String get5Code(Locale locale) {
-        return locale.getLanguage() + "_" + locale.getCountry();
+        String country = locale.getCountry();
+        return locale.getLanguage()
+                + (TextUtils.isEmpty(country) ? "" : "_" + country);
     }
 
     @Override
diff --git a/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index 529edeb..4322997 100644
--- a/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -178,11 +178,13 @@
                 mPreferSymbols);
     }
 
-    void setKeyboardMode(int mode, int imeOptions,
-            boolean enableVoice, boolean isSymbols) {
+    void setKeyboardMode(int mode, int imeOptions, boolean enableVoice, boolean isSymbols) {
+        if (mInputView == null) return;
         mMode = mode;
         mImeOptions = imeOptions;
-        mHasVoice = enableVoice;
+        if (enableVoice != mHasVoice) {
+            setVoiceMode(mHasVoice, mVoiceOnPrimary);
+        }
         mIsSymbols = isSymbols;
 
         mInputView.setPreviewEnabled(true);
@@ -210,7 +212,8 @@
             conf.locale = mInputLocale;
             orig.updateConfiguration(conf, null);
             LatinKeyboard keyboard = new LatinKeyboard(
-                mContext, id.mXml, id.mKeyboardMode, id.mHasVoice);
+                mContext, id.mXml, id.mKeyboardMode);
+            keyboard.setVoiceMode(hasVoiceButton(id.mXml == R.xml.kbd_symbols), mHasVoice);
             keyboard.setLanguageSwitcher(mLanguageSwitcher);
             if (id.mKeyboardMode == KEYBOARDMODE_NORMAL
                     || id.mKeyboardMode == KEYBOARDMODE_URL
diff --git a/src/com/android/inputmethod/latin/LanguageSwitcher.java b/src/com/android/inputmethod/latin/LanguageSwitcher.java
index 68d0d15..1204512 100644
--- a/src/com/android/inputmethod/latin/LanguageSwitcher.java
+++ b/src/com/android/inputmethod/latin/LanguageSwitcher.java
@@ -21,6 +21,7 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.preference.PreferenceManager;
+import android.text.TextUtils;
 
 /**
  * Keeps track of list of selected input languages and the current
@@ -88,8 +89,9 @@
 
     private void loadDefaults() {
         mDefaultInputLocale = mIme.getResources().getConfiguration().locale;
-        mDefaultInputLanguage = mDefaultInputLocale.getLanguage() + "_"
-                + mDefaultInputLocale.getCountry();
+        String country = mDefaultInputLocale.getCountry();
+        mDefaultInputLanguage = mDefaultInputLocale.getLanguage() +
+                (TextUtils.isEmpty(country) ? "" : "_" + country);
     }
 
     private void constructLocales() {
diff --git a/src/com/android/inputmethod/latin/LatinIME.java b/src/com/android/inputmethod/latin/LatinIME.java
index 2af59d6..18b277c 100644
--- a/src/com/android/inputmethod/latin/LatinIME.java
+++ b/src/com/android/inputmethod/latin/LatinIME.java
@@ -130,24 +130,14 @@
     // ignored, since it may in fact be two key presses in quick succession.
     private static final long MIN_MILLIS_AFTER_TYPING_BEFORE_SWIPE = 1000;
 
-    // If we detect a swipe gesture, and the user types N ms later, cancel the
-    // swipe since it was probably a false trigger.
-    private static final long MIN_MILLIS_AFTER_SWIPE_TO_WAIT_FOR_TYPING = 500;
-
     // How many continuous deletes at which to start deleting at a higher speed.
     private static final int DELETE_ACCELERATE_AT = 20;
     // Key events coming any faster than this are long-presses.
     private static final int QUICK_PRESS = 200;
-    // Weight added to a user picking a new word from the suggestion strip
-    static final int FREQUENCY_FOR_PICKED = 3;
-    // Weight added to a user typing a new word that doesn't get corrected (or is reverted)
-    static final int FREQUENCY_FOR_TYPED = 1;
-    // A word that is frequently typed and get's promoted to the user dictionary, uses this
-    // frequency.
-    static final int FREQUENCY_FOR_AUTO_ADD = 250;
 
     static final int KEYCODE_ENTER = '\n';
     static final int KEYCODE_SPACE = ' ';
+    static final int KEYCODE_PERIOD = '.';
 
     // Contextual menu positions
     private static final int POS_SETTINGS = 0;
@@ -318,23 +308,24 @@
         Resources orig = getResources();
         Configuration conf = orig.getConfiguration();
         Locale saveLocale = conf.locale;
-        boolean different = !conf.locale.getCountry().equalsIgnoreCase(locale.substring(0, 2));
         conf.locale = new Locale(locale);
         orig.updateConfiguration(conf, orig.getDisplayMetrics());
         if (mSuggest != null) {
             mSuggest.close();
         }
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
+        mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true);
         mSuggest = new Suggest(this, R.raw.main);
-        mSuggest.setAutoTextEnabled(!different);
+        updateAutoTextEnabled(saveLocale);
         if (mUserDictionary != null) mUserDictionary.close();
-        mUserDictionary = new UserDictionary(this);
+        mUserDictionary = new UserDictionary(this, mLocale);
         if (mContactsDictionary == null) {
             mContactsDictionary = new ContactsDictionary(this);
         }
-        // TODO: Save and restore the dictionary for the current input language.
-        if (mAutoDictionary == null) {
-            mAutoDictionary = new AutoDictionary(this);
+        if (mAutoDictionary != null) {
+            mAutoDictionary.close();
         }
+        mAutoDictionary = new AutoDictionary(this, this, mLocale);
         mSuggest.setUserDictionary(mUserDictionary);
         mSuggest.setContactsDictionary(mContactsDictionary);
         mSuggest.setAutoDictionary(mAutoDictionary);
@@ -359,8 +350,18 @@
 
     @Override
     public void onConfigurationChanged(Configuration conf) {
+        // If the system locale changes and is different from the saved
+        // locale (mLocale), then reload the input locale list from the 
+        // latin ime settings (shared prefs) and reset the input locale
+        // to the first one.
         if (!TextUtils.equals(conf.locale.toString(), mLocale)) {
-            initSuggest(conf.locale.toString());
+            if (mLanguageSwitcher != null) {
+                mLanguageSwitcher.loadLocales(
+                        PreferenceManager.getDefaultSharedPreferences(this));
+                toggleLanguage(true, true);
+            } else {
+                reloadKeyboards();
+            }
         }
         // If orientation changed while predicting, commit the change
         if (conf.orientation != mOrientation) {
@@ -368,8 +369,8 @@
             commitTyped(ic);
             if (ic != null) ic.finishComposingText(); // For voice input
             mOrientation = conf.orientation;
+            reloadKeyboards();
         }
-        reloadKeyboards();
         super.onConfigurationChanged(conf);
     }
 
@@ -447,7 +448,6 @@
         mShowingVoiceSuggestions = false;
         mImmediatelyAfterVoiceSuggestions = false;
         mVoiceInputHighlighted = false;
-        boolean disableAutoCorrect = false;
         mWordToSuggestions.clear();
         mInputTypeNoAutoCorrect = false;
         mPredictionOn = false;
@@ -534,24 +534,18 @@
         mDeleteCount = 0;
         mJustAddedAutoSpace = false;
         loadSettings();
+        updateShiftKeyState(attribute);
 
         setCandidatesViewShown(false);
         setSuggestions(null, false, false, false);
 
-        // Override auto correct
-        if (disableAutoCorrect) {
-            mAutoCorrectOn = false;
-            if (mCorrectionMode == Suggest.CORRECTION_FULL) {
-                mCorrectionMode = Suggest.CORRECTION_BASIC;
-            }
-        }
         // If the dictionary is not big enough, don't auto correct
         mHasDictionary = mSuggest.hasMainDictionary();
 
         updateCorrectionMode();
 
         mInputView.setProximityCorrectionEnabled(true);
-        mPredictionOn = mPredictionOn && mCorrectionMode > 0;
+        mPredictionOn = mPredictionOn && (mCorrectionMode > 0 || mShowSuggestions);
         checkTutorial(attribute.privateImeOptions);
         if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
     }
@@ -797,7 +791,7 @@
         }
         mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher);
         if (mInputView != null) {
-            mKeyboardSwitcher.setVoiceMode(mEnableVoice, mVoiceOnPrimary);
+            mKeyboardSwitcher.setVoiceMode(mEnableVoice && mEnableVoiceButton, mVoiceOnPrimary);
         }
         mKeyboardSwitcher.makeKeyboards(true);
     }
@@ -811,7 +805,7 @@
                 }
                 mCommittedLength = mComposing.length();
                 TextEntryState.acceptedTyped(mComposing);
-                mAutoDictionary.addWord(mComposing.toString(), FREQUENCY_FOR_TYPED);
+                checkAddToDictionary(mComposing, AutoDictionary.FREQUENCY_FOR_TYPED);
             }
             updateSuggestions();
         }
@@ -854,6 +848,22 @@
         }
     }
 
+    private void reswapPeriodAndSpace() {
+        final InputConnection ic = getCurrentInputConnection();
+        if (ic == null) return;
+        CharSequence lastThree = ic.getTextBeforeCursor(3, 0);
+        if (lastThree != null && lastThree.length() == 3
+                && lastThree.charAt(0) == KEYCODE_PERIOD
+                && lastThree.charAt(1) == KEYCODE_SPACE
+                && lastThree.charAt(2) == KEYCODE_PERIOD) {
+            ic.beginBatchEdit();
+            ic.deleteSurroundingText(3, 0);
+            ic.commitText(" ..", 1);
+            ic.endBatchEdit();
+            updateShiftKeyState(getCurrentInputEditorInfo());
+        }
+    }
+
     private void doubleSpace() {
         //if (!mAutoPunctuate) return;
         if (mCorrectionMode == Suggest.CORRECTION_NONE) return;
@@ -879,8 +889,9 @@
         // When the text's first character is '.', remove the previous period
         // if there is one.
         CharSequence lastOne = ic.getTextBeforeCursor(1, 0);
-        if (lastOne != null && lastOne.length() == 1 && lastOne.charAt(0) == '.'
-                && text.charAt(0) == '.') {
+        if (lastOne != null && lastOne.length() == 1
+                && lastOne.charAt(0) == KEYCODE_PERIOD
+                && text.charAt(0) == KEYCODE_PERIOD) {
             ic.deleteSurroundingText(1, 0);
         }
     }
@@ -976,6 +987,9 @@
     }
 
     public void onText(CharSequence text) {
+        if (VOICE_INSTALLED && mVoiceInputHighlighted) {
+            commitVoiceInput();
+        }
         InputConnection ic = getCurrentInputConnection();
         if (ic == null) return;
         ic.beginBatchEdit();
@@ -1117,6 +1131,14 @@
             mJustAddedAutoSpace = false;
         }
         sendKeyChar((char)primaryCode);
+
+        // Handle the case of ". ." -> " .." with auto-space if necessary
+        // before changing the TextEntryState.
+        if (TextEntryState.getState() == TextEntryState.STATE_PUNCTUATION_AFTER_ACCEPTED
+                && primaryCode == KEYCODE_PERIOD) {
+            reswapPeriodAndSpace();
+        }
+
         TextEntryState.typedCharacter((char) primaryCode, true);
         if (TextEntryState.getState() == TextEntryState.STATE_PUNCTUATION_AFTER_ACCEPTED
                 && primaryCode != KEYCODE_ENTER) {
@@ -1164,7 +1186,6 @@
 
     private boolean isPredictionOn() {
         boolean predictionOn = mPredictionOn;
-        //if (isFullscreenMode()) predictionOn &= mPredictionLandscape;
         return predictionOn;
     }
 
@@ -1419,6 +1440,8 @@
             TextEntryState.acceptedDefault(mWord.getTypedWord(), mBestWord);
             mJustAccepted = true;
             pickSuggestion(mBestWord);
+            // Add the word to the auto dictionary if it's not a known word
+            checkAddToDictionary(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED);
         }
     }
 
@@ -1456,6 +1479,8 @@
         }
         mJustAccepted = true;
         pickSuggestion(suggestion);
+        // Add the word to the auto dictionary if it's not a known word
+        checkAddToDictionary(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED);
         TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion);
         // Follow it with a space
         if (mAutoSpace) {
@@ -1464,7 +1489,7 @@
         }
         // Fool the state watcher so that a subsequent backspace will not do a revert
         TextEntryState.typedCharacter((char) KEYCODE_SPACE, true);
-        if (index == 0 && !mSuggest.isValidWord(suggestion)) {
+        if (index == 0 && mCorrectionMode > 0 && !mSuggest.isValidWord(suggestion)) {
             mCandidateView.showAddToDictionaryHint(suggestion);
         }
         if (ic != null) {
@@ -1489,12 +1514,9 @@
                 ic.commitText(suggestion, 1);
             }
         }
-        // Add the word to the auto dictionary if it's not a known word
-        if (mAutoDictionary.isValidWord(suggestion) || !mSuggest.isValidWord(suggestion)) {
-            mAutoDictionary.addWord(suggestion.toString(), FREQUENCY_FOR_PICKED);
-        }
         mPredicting = false;
         mCommittedLength = suggestion.length();
+        ((LatinKeyboard) mInputView.getKeyboard()).setPreferredLetters(null);
         setNextSuggestions();
         updateShiftKeyState(getCurrentInputEditorInfo());
     }
@@ -1503,6 +1525,13 @@
         setSuggestions(mSuggestPuncList, false, false, false);
     }
 
+    private void checkAddToDictionary(CharSequence suggestion, int frequencyDelta) {
+        if (mAutoDictionary.isValidWord(suggestion)
+                || !mSuggest.isValidWord(suggestion.toString().toLowerCase())) {
+            mAutoDictionary.addWord(suggestion.toString(), frequencyDelta);
+        }
+    }
+
     private boolean isCursorTouchingWord() {
         InputConnection ic = getCurrentInputConnection();
         if (ic == null) return false;
@@ -1646,11 +1675,6 @@
                 && !mVoiceInput.isBlacklistedField(fieldContext);
     }
 
-    private boolean fieldIsRecommendedForVoice(FieldContext fieldContext) {
-        // TODO: Move this logic into the VoiceInput method.
-        return !mPasswordText && !mEmailText && mVoiceInput.isRecommendedField(fieldContext);
-    }
-
     private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) {
         return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext)
                 && !(attribute != null && attribute.privateImeOptions != null
@@ -1681,21 +1705,6 @@
             > MIN_MILLIS_AFTER_TYPING_BEFORE_SWIPE;
     }
 
-    /*
-     * Only trigger a swipe action if the user hasn't typed X millis before
-     * now, and if they don't type Y millis after the swipe is detected. This
-     * delays the onset of the swipe action by Y millis.
-     */
-    private void conservativelyTriggerSwipeAction(final Runnable action) {
-        if (userHasNotTypedRecently()) {
-            mSwipeTriggerTimeMillis = System.currentTimeMillis();
-            mHandler.sendMessageDelayed(
-                    mHandler.obtainMessage(MSG_START_LISTENING_AFTER_SWIPE),
-                    MIN_MILLIS_AFTER_SWIPE_TO_WAIT_FOR_TYPING);
-        }
-    }
-
-
     private void playKeyClick(int primaryCode) {
         // if mAudioManager is null, we don't have the ringer state yet
         // mAudioManager will be set by updateRingerMode
@@ -1759,18 +1768,28 @@
         mUserDictionary.addWord(word, frequency);
     }
 
+    WordComposer getCurrentWord() {
+        return mWord;
+    }
+
     private void updateCorrectionMode() {
         mHasDictionary = mSuggest != null ? mSuggest.hasMainDictionary() : false;
         mAutoCorrectOn = (mAutoCorrectEnabled || mQuickFixes)
                 && !mInputTypeNoAutoCorrect && mHasDictionary;
-        mCorrectionMode = mAutoCorrectOn
+        mCorrectionMode = (mAutoCorrectOn && mAutoCorrectEnabled)
                 ? Suggest.CORRECTION_FULL
-                : (mQuickFixes ? Suggest.CORRECTION_BASIC : Suggest.CORRECTION_NONE);
+                : (mAutoCorrectOn ? Suggest.CORRECTION_BASIC : Suggest.CORRECTION_NONE);
         if (mSuggest != null) {
             mSuggest.setCorrectionMode(mCorrectionMode);
         }
     }
 
+    private void updateAutoTextEnabled(Locale systemLocale) {
+        if (mSuggest == null) return;
+        boolean different = !systemLocale.getLanguage().equalsIgnoreCase(mLocale.substring(0, 2));
+        mSuggest.setAutoTextEnabled(!different && mQuickFixes);
+    }
+
     protected void launchSettings() {
         launchSettings(LatinIMESettings.class);
     }
@@ -1808,15 +1827,13 @@
 
         mLocaleSupportedForVoiceInput = voiceInputSupportedLocales.contains(mLocale);
 
-        // If there is no auto text data, then quickfix is forced to "on", so that the other options
-        // will continue to work
-
-        if (AutoText.getSize(mInputView) < 1) mQuickFixes = true;
-        mShowSuggestions = sp.getBoolean(PREF_SHOW_SUGGESTIONS, true) & mQuickFixes;
+        mShowSuggestions = sp.getBoolean(PREF_SHOW_SUGGESTIONS, true);
 
         if (VOICE_INSTALLED) {
-            final String voiceMode = sp.getString(PREF_VOICE_MODE, "");
-            boolean enableVoice = !voiceMode.equals(getString(R.string.voice_mode_off));
+            final String voiceMode = sp.getString(PREF_VOICE_MODE,
+                    getString(R.string.voice_mode_main));
+            boolean enableVoice = !voiceMode.equals(getString(R.string.voice_mode_off))
+                    && mEnableVoiceButton;
             boolean voiceOnPrimary = voiceMode.equals(getString(R.string.voice_mode_main));
             if (mKeyboardSwitcher != null &&
                     (enableVoice != mEnableVoice || voiceOnPrimary != mVoiceOnPrimary)) {
@@ -1828,6 +1845,7 @@
         mAutoCorrectEnabled = sp.getBoolean(PREF_AUTO_COMPLETE,
                 mResources.getBoolean(R.bool.enable_autocorrect)) & mShowSuggestions;
         updateCorrectionMode();
+        updateAutoTextEnabled(mResources.getConfiguration().locale);
         mLanguageSwitcher.loadLocales(sp);
     }
 
@@ -1932,38 +1950,4 @@
         System.out.println("CPS = " + ((CPS_BUFFER_SIZE * 1000f) / total));
     }
 
-    class AutoDictionary extends ExpandableDictionary {
-        // If the user touches a typed word 2 times or more, it will become valid.
-        private static final int VALIDITY_THRESHOLD = 2 * FREQUENCY_FOR_PICKED;
-        // If the user touches a typed word 5 times or more, it will be added to the user dict.
-        private static final int PROMOTION_THRESHOLD = 4 * FREQUENCY_FOR_PICKED;
-
-        public AutoDictionary(Context context) {
-            super(context);
-        }
-
-        @Override
-        public boolean isValidWord(CharSequence word) {
-            final int frequency = getWordFrequency(word);
-            return frequency >= VALIDITY_THRESHOLD;
-        }
-
-        @Override
-        public void addWord(String word, int addFrequency) {
-            final int length = word.length();
-            // Don't add very short or very long words.
-            if (length < 2 || length > getMaxWordLength()) return;
-            if (mWord.isAutoCapitalized()) {
-                // Remove caps before adding
-                word = Character.toLowerCase(word.charAt(0))
-                        + word.substring(1);
-            }
-            int freq = getWordFrequency(word);
-            freq = freq < 0 ? addFrequency : freq + addFrequency;
-            super.addWord(word, freq);
-            if (freq >= PROMOTION_THRESHOLD) {
-                LatinIME.this.promoteToUserDictionary(word, FREQUENCY_FOR_AUTO_ADD);
-            }
-        }
-    }
 }
diff --git a/src/com/android/inputmethod/latin/LatinIMESettings.java b/src/com/android/inputmethod/latin/LatinIMESettings.java
index f87c56c..82f5d54 100644
--- a/src/com/android/inputmethod/latin/LatinIMESettings.java
+++ b/src/com/android/inputmethod/latin/LatinIMESettings.java
@@ -86,8 +86,6 @@
         if (autoTextSize < 1) {
             ((PreferenceGroup) findPreference(PREDICTION_SETTINGS_KEY))
                     .removePreference(mQuickFixes);
-        } else {
-            mShowSuggestions.setDependency(QUICK_FIXES_KEY);
         }
         if (!LatinIME.VOICE_INSTALLED
                 || !RecognitionManager.isRecognitionAvailable(this)) {
diff --git a/src/com/android/inputmethod/latin/LatinKeyboard.java b/src/com/android/inputmethod/latin/LatinKeyboard.java
index 9b742a5..58e1dc7 100644
--- a/src/com/android/inputmethod/latin/LatinKeyboard.java
+++ b/src/com/android/inputmethod/latin/LatinKeyboard.java
@@ -69,7 +69,12 @@
     private Resources mRes;
     private Context mContext;
     private int mMode;
-    private boolean mHasVoice;
+    // Whether this keyboard has voice icon on it
+    private boolean mHasVoiceButton;
+    // Whether voice icon is enabled at all
+    private boolean mVoiceEnabled;
+    private boolean mIsAlphaKeyboard;
+    private CharSequence m123Label;
     private boolean mCurrentlyInSpace;
     private SlidingLocaleDrawable mSlidingLocaleIcon;
     private Rect mBounds = new Rect();
@@ -95,16 +100,15 @@
     static int sSpacebarVerticalCorrection;
 
     public LatinKeyboard(Context context, int xmlLayoutResId) {
-        this(context, xmlLayoutResId, 0, false);
+        this(context, xmlLayoutResId, 0);
     }
 
-    public LatinKeyboard(Context context, int xmlLayoutResId, int mode, boolean hasVoice) {
+    public LatinKeyboard(Context context, int xmlLayoutResId, int mode) {
         super(context, xmlLayoutResId, mode);
         final Resources res = context.getResources();
         mContext = context;
         mMode = mode;
         mRes = res;
-        mHasVoice = hasVoice;
         mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked);
         mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked);
         mShiftLockPreviewIcon.setBounds(0, 0, 
@@ -122,7 +126,7 @@
         setDefaultBounds(m123MicPreviewIcon);
         sSpacebarVerticalCorrection = res.getDimensionPixelOffset(
                 R.dimen.spacebar_vertical_correction);
-        setF1Key(xmlLayoutResId == R.xml.kbd_qwerty);
+        mIsAlphaKeyboard = xmlLayoutResId == R.xml.kbd_qwerty;
         mSpaceKeyIndex = indexOf((int) ' ');
     }
 
@@ -147,6 +151,7 @@
             break;
         case KEYCODE_MODE_CHANGE:
             m123Key = key;
+            m123Label = key.label;
             break;
         }
         return key;
@@ -284,23 +289,36 @@
         drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
     }
 
-    private void setF1Key(boolean isAlphaKeyboard) {
+    public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) {
+        mHasVoiceButton = hasVoiceButton;
+        mVoiceEnabled = hasVoice;
+        updateF1Key();
+    }
+
+    private void updateF1Key() {
         if (mF1Key == null) return;
-        if (!mHasVoice) {
-            mF1Key.label = ",";
-            mF1Key.codes = new int[] { ',' };
-            mF1Key.icon = null;
-            mF1Key.iconPreview = null;
-            if (isAlphaKeyboard && m123Key != null) {
+        if (m123Key != null && mIsAlphaKeyboard) {
+            if (mVoiceEnabled && !mHasVoiceButton) {
                 m123Key.icon = m123MicIcon;
                 m123Key.iconPreview = m123MicPreviewIcon;
                 m123Key.label = null;
+            } else {
+                m123Key.icon = null;
+                m123Key.iconPreview = null;
+                m123Key.label = m123Label;
             }
-        } else {
+        }
+
+        if (mHasVoiceButton && mVoiceEnabled) {
             mF1Key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE };
             mF1Key.label = null;
             mF1Key.icon = mMicIcon;
             mF1Key.iconPreview = mMicPreviewIcon;
+        } else {
+            mF1Key.label = ",";
+            mF1Key.codes = new int[] { ',' };
+            mF1Key.icon = null;
+            mF1Key.iconPreview = null;
         }
     }
 
diff --git a/src/com/android/inputmethod/latin/Suggest.java b/src/com/android/inputmethod/latin/Suggest.java
index e806dc5..712b9cf 100755
--- a/src/com/android/inputmethod/latin/Suggest.java
+++ b/src/com/android/inputmethod/latin/Suggest.java
@@ -194,7 +194,8 @@
                     mContactsDictionary.getWords(wordComposer, this, mNextLettersFrequencies);
                 }
 
-                if (mSuggestions.size() > 0 && isValidWord(mOriginalWord)) {
+                if (mSuggestions.size() > 0 && isValidWord(mOriginalWord)
+                        && mCorrectionMode == CORRECTION_FULL) {
                     mHaveCorrection = true;
                 }
             }
diff --git a/src/com/android/inputmethod/latin/UserDictionary.java b/src/com/android/inputmethod/latin/UserDictionary.java
index edd82aa..4b98eac 100644
--- a/src/com/android/inputmethod/latin/UserDictionary.java
+++ b/src/com/android/inputmethod/latin/UserDictionary.java
@@ -21,9 +21,11 @@
 import java.util.Locale;
 
 import android.content.ContentResolver;
+import android.content.ContentValues;
 import android.content.Context;
 import android.database.ContentObserver;
 import android.database.Cursor;
+import android.net.Uri;
 import android.provider.UserDictionary.Words;
 
 public class UserDictionary extends ExpandableDictionary {
@@ -40,9 +42,11 @@
     private ContentObserver mObserver;
     
     private boolean mRequiresReload;
-    
-    public UserDictionary(Context context) {
+    private String mLocale;
+
+    public UserDictionary(Context context, String locale) {
         super(context);
+        mLocale = locale;
         // Perform a managed query. The Activity will handle closing and requerying the cursor
         // when needed.
         ContentResolver cres = context.getContentResolver();
@@ -67,7 +71,7 @@
     private synchronized void loadDictionary() {
         Cursor cursor = getContext().getContentResolver()
                 .query(Words.CONTENT_URI, PROJECTION, "(locale IS NULL) or (locale=?)", 
-                        new String[] { Locale.getDefault().toString() }, null);
+                        new String[] { mLocale }, null);
         addWords(cursor);
         mRequiresReload = false;
     }
@@ -88,7 +92,14 @@
 
         super.addWord(word, frequency);
 
-        Words.addWord(getContext(), word, frequency, Words.LOCALE_TYPE_CURRENT);
+        // Update the user dictionary provider
+        ContentValues values = new ContentValues(5);
+        values.put(Words.WORD, word);
+        values.put(Words.FREQUENCY, frequency);
+        values.put(Words.LOCALE, mLocale);
+        values.put(Words.APP_ID, 0);
+
+        getContext().getContentResolver().insert(Words.CONTENT_URI, values);
         // In case the above does a synchronous callback of the change observer
         mRequiresReload = false;
     }