Merge "Remove redundant override methods and extended classes"
diff --git a/dictionaries/es_wordlist.combined.gz b/dictionaries/es_wordlist.combined.gz
index c0a5264..41a914c 100644
--- a/dictionaries/es_wordlist.combined.gz
+++ b/dictionaries/es_wordlist.combined.gz
Binary files differ
diff --git a/java/res/raw/main_es.dict b/java/res/raw/main_es.dict
index 0911b70..3c99e73 100644
--- a/java/res/raw/main_es.dict
+++ b/java/res/raw/main_es.dict
Binary files differ
diff --git a/java/res/values-af/strings-action-keys.xml b/java/res/values-af/strings-action-keys.xml
index bef175b..c7ae3f7 100644
--- a/java/res/values-af/strings-action-keys.xml
+++ b/java/res/values-af/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Vorige"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Klaar"</string>
     <string name="label_send_key" msgid="482252074224462163">"Stuur"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Soek"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Laat wag"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Wag"</string>
 </resources>
diff --git a/java/res/values-af/strings-letter-descriptions.xml b/java/res/values-af/strings-letter-descriptions.xml
new file mode 100644
index 0000000..1238a43
--- /dev/null
+++ b/java/res/values-af/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Vroulike rangtelwoordaanwyser"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikroteken"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Manlike rangtelwoordaanwyser"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Stemlose S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, gravis"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, akuut"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, kappie"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, deelteken"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, sirkel bo"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, koppelletter"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cédille"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, gravis"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, akuut"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, kappie"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, deelteken"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, gravis"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, akuut"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, kappie"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, deelteken"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, gravis"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, akuut"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, kappie"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, deelteken"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, deurhaal"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, gravis"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, akuut"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, kappie"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, deelteken"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, akuut"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, deelteken"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, makron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, brevis"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, akuut"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, kappie"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, kol bo"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, deurhaal"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, makron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, brevis"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, kol bo"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, kappie"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, brevis"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, kol bo"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cédille"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, kappie"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, deurhaal"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, makron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, brevis"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Kollose I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, koppelletter"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, kappie"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cédille"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, akuut"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cédille"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middelkol"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, deurhaal"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, akuut"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cédille"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, voorafgegaan deur apostroof"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, makron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, brevis"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, dubbelakuut"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, koppelletter"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, akuut"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cédille"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, akuut"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, kappie"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cédille"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cédille"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, deurhaal"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, makron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, brevis"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, sirkel bo"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, dubbelakuut"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, kappie"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, kappie"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, akuut"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, kol bo"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Lang S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horing"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horing"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, komma onder"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, komma onder"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Sjwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, kol onder"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, haak bo"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, kappie en akuut"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, kappie en gravis"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, kappie en haak bo"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, kappie en tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, kappie en kol onder"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, brevis en akuut"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, brevis en gravis"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, brevis en haak bo"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, brevis en tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, brevis en kol onder"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, kol onder"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, haak bo"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, kappie en akuut"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, kappie en gravis"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, kappie en haak bo"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, kappie en tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, kappie en kol onder"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, haak bo"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, kol onder"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, kol onder"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, haak bo"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, kappie en akuut"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, kappie en gravis"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, kappie en haak bo"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, kappie en tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, kappie en kol onder"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horing en akuut"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horing en gravis"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horing en haak bo"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horing en tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horing en kol onder"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, kol onder"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, haak bo"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horing en akuut"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horing en gravis"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horing en haak bo"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horing en tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horing en kol onder"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, gravis"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, kol onder"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, haak bo"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Onderstebo uitroepteken"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dubbele hoekaanhalingsteken na links"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middelkol"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Boskrif-een"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dubbele hoekaanhalingsteken na regs"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Onderstebo vraagteken"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Enkele linkeraanhalingsteken"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Enkele regteraanhalingsteken"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Enkele lae-9-aanhalingsteken"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Dubbele linkeraanhalingsteken"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Dubbele regteraanhalingsteken"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kruisie"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dubbelkruisie"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per-duisend-teken"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Aksent"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dubbelaksent"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Enkele hoekaanhalingsteken na links"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Enkele hoekaanhalingsteken na regs"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Boskrif-vier"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Klein Latynse boskrif-letter-n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso-teken"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Per adres"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Pyl na regs"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Pyl na onder"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Leë versameling"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Vermeerdering"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Minder as of gelyk aan"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Meer as of gelyk aan"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Swart ster"</string>
+</resources>
diff --git a/java/res/values-af/strings-talkback-descriptions.xml b/java/res/values-af/strings-talkback-descriptions.xml
index 09abb5f..3b6ba0a 100644
--- a/java/res/values-af/strings-talkback-descriptions.xml
+++ b/java/res/values-af/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Geen teks is ingevoer nie"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> korrigeer <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> voer outokorrigering uit"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Onbekende karakter"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Meer simbole"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Plekke"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simbole"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emosiekone"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Hoofletter-<xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Hoofletter-I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Hoofletter-I, kol bo"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Onbekende simbool"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Onbekende emosiekoon"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatiewe karakters is beskikbaar"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatiewe karakters is toegemaak"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatiewe voorstelle is beskikbaar"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatiewe voorstelle is toegemaak"</string>
 </resources>
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 0367c47..295c855 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Stel kontakname voor"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Gebruik name van kontakte vir voorstelle en korreksies"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Gepersonaliseerde voorstelle"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Verbeter <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Dubbelspasie-punt"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dubbeltik op spasiebalk voeg \'n punt in, gevolg deur \'n spasie"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Outohoofletters"</string>
diff --git a/java/res/values-am/strings-action-keys.xml b/java/res/values-am/strings-action-keys.xml
index 26e4513..51c2538 100644
--- a/java/res/values-am/strings-action-keys.xml
+++ b/java/res/values-am/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"ቀዳሚ"</string>
     <string name="label_done_key" msgid="7564866296502630852">"ተደርጓል"</string>
     <string name="label_send_key" msgid="482252074224462163">"ላክ"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"ፈልግ"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"ቆም በል"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"ጠብቅ"</string>
 </resources>
diff --git a/java/res/values-am/strings-letter-descriptions.xml b/java/res/values-am/strings-letter-descriptions.xml
new file mode 100644
index 0000000..5c94869
--- /dev/null
+++ b/java/res/values-am/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"እንስት የደረጃ አመልካች"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"የማይክሮ ምልክት"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"ተባዕታይ የደረጃ አመልካች"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ሻርፕ ኤስ"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"ኤ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"ኤ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"ኤ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"ኤ፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"ኤ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"ኤ፣ ቀለበት ከላይ"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"ኤ፣ ኢ፣ ማሰሪያ"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"ሲ፣ ጭራ"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"ኢ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"ኢ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"ኢ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"ኢ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"አይ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"አይ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"አይ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"አይ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"ኤት"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"ኤን፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"ኦ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"ኦ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"ኦ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"ኦ፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"ኦ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"ኦ፣ ሰያፍ ሰረዝ"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"ዩ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"ዩ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"ዩ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"ዩ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"ዋይ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"ቶርን"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"ዋይ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"ኤ፣ ማክሮን"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"ኤ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"ኤ፣ ኦጎነክ"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"ሲ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"ሲ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"ሲ፣ ነጥብ ከላይ"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"ሲ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"ዲ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"ዲ፣ ሰያፍ ሰረዝ"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"ኢ፣ ማክሮን"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"ኢ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"ኢ፣ ነጥብ ከላይ"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"ኢ፣ ኦጎነክ"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"ኢ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"ጂ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"ጂ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"ጂ፣ ነጥብ ከላይ"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"ጂ፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"ኤች፣ ድፋት"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"ኤች፣ ሰያፍ ሰረዝ"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"አይ፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"አይ፣ ማክሮን"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"አይ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"አይ፣ ኦጎነክ"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"ነጥብ አልባ አይ"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"አይ፣ ጄ፣ ማሰሪያ"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"ጄ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"ኬ፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"ክራ"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"ኤል፣ ይዘት"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"ኤል፣ ጭራ"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"ኤል፣ ካሮን"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"ኤል፣ የመሃል ነጥብ"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"ኤል፣ ሰያፍ ሰረዝ"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"ኤን፣ ይዘት"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"ኤን፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"ኤን፣ ካሮን"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"ኤን፣ በትእምርተ ጭረት የተቀደመ"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"እንግ"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"ኦ፣ ማክሮን"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"ኦ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"ኦ፣ ድርብ ይዘት"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"ኦ፣ ኢ፣ ማሰሪያ"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"አር፣ ይዘት"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"አር፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"አር፣ ካሮን"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"ኤስ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"ኤስ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"ኤስ፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"ኤስ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"ቲ፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"ቲ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"ቲ፣ ሰያፍ ሰረዝ"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"ዩ፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"ዩ፣ ማክሮን"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"ዩ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"ዩ፣ ቀለበት ከላይ"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"ዩ፣ ድርብ ይዘት"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"ዩ፣ ኦጎነክ"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"ደብልዩ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"ዋይ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"ዜድ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"ዜድ፣ ነጥብ ከላይ"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"ዜድ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"ረጅም ኤስ"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"ኦ፣ ቀንድ"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"ዩ፣ ቀንድ"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"ኤስ፣ ኮማ ከታች"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"ቲ፣ ኮማ ከታች"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ሽዋ"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"ኤ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"ኤ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"ኤ፣ ድፋት እና ይዘት"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"ኤ፣ ድፋት እና ጭረት"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"ኤ፣ ድፋት እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"ኤ፣ ድፋት እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"ኤ፣ ድፋት እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"ኤ፣ ቁንጽል እና ይዘት"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"ኤ፣ ቁንጽል እና ጭረት"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"ኤ፣ ቁንጽል እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"ኤ፣ ቁንጽል እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"ኤ፣ ቁንጽል እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"ኢ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"ኢ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"ኢ፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"ኢ፣ ድፋት እና ይዘት"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"ኢ፣ ድፋት እና ጭረት"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"ኢ፣ ድፋት እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"ኢ፣ ድፋት እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"ኢ፣ ድፋት እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"አይ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"አይ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"ኦ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"ኦ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"ኦ፣ ድፋት እና ይዘት"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"ኦ፣ ድፋት እና ጭረት"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"ኦ፣ ድፋት እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"ኦ፣ ድፋት እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"ኦ፣ ድፋት እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"ኦ፣ ቀንድ እና ይዘት"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"ኦ፣ ቀንድ እና ጭረት"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"ኦ፣ ቀንድ እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"ኦ፣ ቀንድ እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"ኦ፣ ቀንድ እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"ዩ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"ዩ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"ዩ፣ ቀንድ እና ይዘት"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"ዩ፣ ቀንድ እና ጭረት"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"ዩ፣ ቀንድ እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"ዩ፣ ቀንድ እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"ዩ፣ ቀንድ እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"ዋይ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"ዋይ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"ዋይ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"ዋይ፣ ድፋትቅናት"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"የተገለበጠ ቃለ አጋኖ"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"ግራ ጠቋሚ ድርብ የማዕዘን ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"የመሃል ነጥብ"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"ራስጌ አደር አንድ"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"ቀኝ ጠቋሚ ድርብ የማዕዘን ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"የተገለበጠ የጥያቄ ምልክት"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"የግራ  ነጠላ ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"የቀኝ ነጠላ ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"ነጠላ ዝቅተኛ-9 ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"የግራ ድርብ ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"የቀኝ ድርብ ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"ሾተል"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"ድርብ ሾተል"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"የሺኛ ምልክት"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"ፕራይም"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"ድርብ ፕራይም"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"ነጠላ ግራ ጠቋሚ የማዕዘን ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"ነጠላ ቀኝ ጠቋሚ የማዕዘን ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"ራስጌ አደር አራት"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"የራስጌ አደር ላቲን ንዑስ ሆሄ ኤን"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"የፔሶ ምልክት"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"ባለአደራ"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"የቀኝ ቀስት"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"የታች ቀስት"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"ባዶ ስብስብ"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"ጨምር"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"ያንሳል ወይም እክሉ ነው ከ"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"ይበልጣል ወይም እክሉ ነው ከ"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"ጥቁር ኮከብ"</string>
+</resources>
diff --git a/java/res/values-am/strings-talkback-descriptions.xml b/java/res/values-am/strings-talkback-descriptions.xml
index 1b1da01..84c3cb0 100644
--- a/java/res/values-am/strings-talkback-descriptions.xml
+++ b/java/res/values-am/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"ምንም ፅሁፍ አልገባም"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>ን ወደ <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> ያርመዋል"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> የራስ ሰር እርማት ያከናውናል"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"ያልታወቀ ቁምፊ"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"ቀይር"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"ተጨማሪ ምልክቶች"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ቦታዎች"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"ምልክቶች"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ስሜት ገላጭ አዶዎች"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"አቢይ ሆሄ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"አቢይ ሆሄ አይ"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"አቢይ ሆሄ አይ፣ ነጥብ ከላይ"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"ያልታወቀ ምልክት"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"ያልታወቀ ስሜት ገላጭ ምስል"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ተለዋጭ ቁምፊዎች ይገኛሉ"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ተለዋጭ ቁምፊዎች ተሰናብተዋል"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ተለዋጭ የአስተያየት ጥቆማዎች ይገኛሉ"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ተለዋጭ የአስተያየት ጥቆማዎች ተሰናብተዋል"</string>
 </resources>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
index b201757..35eb17c 100644
--- a/java/res/values-am/strings.xml
+++ b/java/res/values-am/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"የዕውቂያ ስም ጠቁም"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ከዕውቂያዎች ለጥቆማዎች እና ማስተካከያዎች ስሞች ተጠቀም"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"ግላዊ የጥቆማ አስተያየቶች"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ን አሻሽል"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"የድርብ-ክፍተት ነጥብ"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"የክፍተት አሞሌው ላይ ሁለቴ መታ ማድረግ አንድ ነጥብ እና ክፍተት አስከትሎ ያስገባል"</string>
     <string name="auto_cap" msgid="1719746674854628252">"ራስ-ሰር አቢይ ማድረግ"</string>
diff --git a/java/res/values-ca/strings-action-keys.xml b/java/res/values-ca/strings-action-keys.xml
index 5dcf4a3..2760fb0 100644
--- a/java/res/values-ca/strings-action-keys.xml
+++ b/java/res/values-ca/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Ant."</string>
     <string name="label_done_key" msgid="7564866296502630852">"Fet"</string>
     <string name="label_send_key" msgid="482252074224462163">"Envia"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Cerca"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Atura"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Esp."</string>
 </resources>
diff --git a/java/res/values-ca/strings-letter-descriptions.xml b/java/res/values-ca/strings-letter-descriptions.xml
new file mode 100644
index 0000000..a6569ec
--- /dev/null
+++ b/java/res/values-ca/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicador ordinal femení"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Signe de micro"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicador ordinal masculí"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S sonora"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, accent obert"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, accent tancat"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, titlla"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, dièresi"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anell"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, lligadura"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, ce trencada"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, accent obert"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, accent tancat"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, dièresi"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, accent obert"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, accent tancat"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, dièresi"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, titlla"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, accent obert"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, accent tancat"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, titlla"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, dièresi"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, conjunt buit"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, accent obert"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, accent tancat"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"O, dièresi"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, accent tancat"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, dièresi"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, màcron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breu"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, croc polonès"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, accent tancat"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punt superior"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, anticircumflex"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, anticircumflex"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, barra"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, anticircumflex"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breu"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punt superior"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, croc polonès"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, anticircumflex"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breu"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punt superior"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, vírgula"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, barra"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, titlla"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, màcron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breu"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, croc polonès"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sense punt"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, lligadura"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, vírgula"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, accent tancat"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, vírgula"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, anticircumflex"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punt volat"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, barra"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, accent tancat"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, vírgula"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, anticircumflex"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedida d\'apòstrof"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, màcron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breu"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, accent tancat doble"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, lligadura"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, accent tancat"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, vírgula"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, anticircumflex"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, accent tancat"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, vírgula"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, anticircumflex"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, vírgula"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, anticircumflex"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, barra"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, titlla"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, màcron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breu"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anell"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, accent tancat doble"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, croc polonès"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, accent tancat"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punt superior"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, anticircumflex"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S llarga"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, banya"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, banya"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, coma inferior"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, coma inferior"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Neutra"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punt inferior"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, vírgula superior"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex i accent tancat"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex i accent obert"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex i vírgula superior"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex i titlla"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex i punt inferior"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breu i accent tancat"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breu i accent obert"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breu i vírgula superior"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breu i titlla"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breu i punt inferior"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punt inferior"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, vírgula superior"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, titlla"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex i accent tancat"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex i accent obert"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex i vírgula superior"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex i titlla"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex i punt inferior"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, vírgula superior"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punt inferior"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punt inferior"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, vírgula superior"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex i accent tancat"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex i accent obert"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex i vírgula superior"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex i titlla"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex i punt inferior"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, banya i accent tancat"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, banya i accent obert"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, banya i vírgula superior"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, banya i titlla"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, banya i punt inferior"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punt inferior"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, vírgula superior"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, banya i accent tancat"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, banya i accent obert"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, banya i vírgula superior"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, banya i titlla"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, banya i punt inferior"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, accent obert"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punt inferior"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, vírgula superior"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, titlla"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Signe d\'exclamació invertit"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Doble cometa angular d\'obertura"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"punt volat"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superíndex d\'u"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Doble cometa angular de tancament"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Signe d\'interrogació invertit"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Cometes simples d\'obertura"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Cometes simples de tancament"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Cometes alemanyes simples d\'obertura"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Cometes dobles d\'obertura"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Cometes dobles de tancament"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Obelisc"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Doble obelisc"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Signe per mil"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Cometa"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Cometa doble"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Cometes angulars simples d\'obertura"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Cometes angulars simples de tancament"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superíndex de quatre"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superíndex de lletra minúscula llatina n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Signe del peso"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Percentatge"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Fletxa cap a la dreta"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Fletxa cap avall"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conjunt buit"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Més petit o igual que"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Més gran o igual que"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrella negra"</string>
+</resources>
diff --git a/java/res/values-ca/strings-talkback-descriptions.xml b/java/res/values-ca/strings-talkback-descriptions.xml
index 5bbf655..9b01c75 100644
--- a/java/res/values-ca/strings-talkback-descriptions.xml
+++ b/java/res/values-ca/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"No s\'ha introduït cap text."</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corregeix <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> per <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>."</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> executa la correcció automàtica."</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Caràcter desconegut"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Maj"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Més símbols"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Maj"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Llocs"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Símbols"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticones"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> majúscula"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"I majúscula"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"I majúscula, punt superior"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbol desconegut"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji desconegut"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Hi ha caràcters alternatius disponibles."</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Els caràcters alternatius s\'ignoren."</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Hi ha suggeriments alternatius disponibles."</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Els suggeriments alternatius s\'ignoren."</string>
 </resources>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index cd5e1d4..7f0782d 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Suggereix noms de contactes"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilitza els noms de contactes per fer suggeriments i correccions"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Suggeriments personalitz."</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Millora <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Punt amb doble espai"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Picar dues vegades la barra d\'espai insereix punt i espai blanc"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Majúscules automàtiques"</string>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index fe51c79..abbdcbe 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -52,7 +52,7 @@
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dvojím klepnutím na mezerník vložíte tečku následovanou mezerou."</string>
     <string name="auto_cap" msgid="1719746674854628252">"Velká písmena automaticky"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Kapitalizace prvního slova každé věty"</string>
-    <string name="edit_personal_dictionary" msgid="3996910038952940420">"Osobní slovník"</string>
+    <string name="edit_personal_dictionary" msgid="3996910038952940420">"Vlastní slovník"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Doplňkové slovníky"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Hlavní slovník"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobrazit návrhy oprav"</string>
diff --git a/java/res/values-en-rGB/strings-action-keys.xml b/java/res/values-en-rGB/strings-action-keys.xml
index b8b02e1..6514e85 100644
--- a/java/res/values-en-rGB/strings-action-keys.xml
+++ b/java/res/values-en-rGB/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Prev"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Finished"</string>
     <string name="label_send_key" msgid="482252074224462163">"Send"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Search"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Wait"</string>
 </resources>
diff --git a/java/res/values-en-rGB/strings-letter-descriptions.xml b/java/res/values-en-rGB/strings-letter-descriptions.xml
new file mode 100644
index 0000000..514bc6c
--- /dev/null
+++ b/java/res/values-en-rGB/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro sign"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middle dot"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Left double quotation mark"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Right double quotation mark"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Single left-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Single right-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript latin small letter n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso sign"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Rightwards arrow"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Downwards arrow"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Less than or equal to"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Greater than or equal to"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Black star"</string>
+</resources>
diff --git a/java/res/values-en-rGB/strings-talkback-descriptions.xml b/java/res/values-en-rGB/strings-talkback-descriptions.xml
index 3956777..e209b54 100644
--- a/java/res/values-en-rGB/strings-talkback-descriptions.xml
+++ b/java/res/values-en-rGB/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"No text entered"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> performs auto-correction"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Unknown character"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"More symbols"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Places"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symbols"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticons"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Capital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Capital I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Unknown symbol"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Unknown emoji"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternative characters are available"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternative characters are dismissed"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternative suggestions are available"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternative suggestions are dismissed"</string>
 </resources>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index 0375ad2..75697ad 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Suggest Contact names"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Use names from Contacts for suggestions and corrections"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Personalised suggestions"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Improve <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Double-space full stop"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Double tap on spacebar inserts a full stop followed by a space"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string>
diff --git a/java/res/values-en-rIN/strings-action-keys.xml b/java/res/values-en-rIN/strings-action-keys.xml
index b8b02e1..6514e85 100644
--- a/java/res/values-en-rIN/strings-action-keys.xml
+++ b/java/res/values-en-rIN/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Prev"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Finished"</string>
     <string name="label_send_key" msgid="482252074224462163">"Send"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Search"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Wait"</string>
 </resources>
diff --git a/java/res/values-en-rIN/strings-letter-descriptions.xml b/java/res/values-en-rIN/strings-letter-descriptions.xml
new file mode 100644
index 0000000..514bc6c
--- /dev/null
+++ b/java/res/values-en-rIN/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro sign"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middle dot"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Left double quotation mark"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Right double quotation mark"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Single left-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Single right-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript latin small letter n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso sign"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Rightwards arrow"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Downwards arrow"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Less than or equal to"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Greater than or equal to"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Black star"</string>
+</resources>
diff --git a/java/res/values-en-rIN/strings-talkback-descriptions.xml b/java/res/values-en-rIN/strings-talkback-descriptions.xml
index 3956777..e209b54 100644
--- a/java/res/values-en-rIN/strings-talkback-descriptions.xml
+++ b/java/res/values-en-rIN/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"No text entered"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> performs auto-correction"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Unknown character"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"More symbols"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Places"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symbols"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticons"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Capital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Capital I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Unknown symbol"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Unknown emoji"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternative characters are available"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternative characters are dismissed"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternative suggestions are available"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternative suggestions are dismissed"</string>
 </resources>
diff --git a/java/res/values-en-rIN/strings.xml b/java/res/values-en-rIN/strings.xml
index 0375ad2..75697ad 100644
--- a/java/res/values-en-rIN/strings.xml
+++ b/java/res/values-en-rIN/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Suggest Contact names"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Use names from Contacts for suggestions and corrections"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Personalised suggestions"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Improve <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Double-space full stop"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Double tap on spacebar inserts a full stop followed by a space"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string>
diff --git a/java/res/values-fa/strings-action-keys.xml b/java/res/values-fa/strings-action-keys.xml
index ae393bb..859877c 100644
--- a/java/res/values-fa/strings-action-keys.xml
+++ b/java/res/values-fa/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"قبلی"</string>
     <string name="label_done_key" msgid="7564866296502630852">"اتمام"</string>
     <string name="label_send_key" msgid="482252074224462163">"ارسال"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"جستجو"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"مکث"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"انتظار"</string>
 </resources>
diff --git a/java/res/values-fa/strings-letter-descriptions.xml b/java/res/values-fa/strings-letter-descriptions.xml
new file mode 100644
index 0000000..4687f1b
--- /dev/null
+++ b/java/res/values-fa/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"نشانگر ترتیبی زنانه"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"علامت میکرو"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"نشانگر ترتیبی مردانه"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"‏شارپ S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"‏A با اکسان گراو"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"‏A با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"‏A با هشتک"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"‏A با مدک"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"‏A با دو نقطه"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"‏A با حلقه"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"‏A، ‏E متصل به هم"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"‏C با سدیلا"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"‏E با اکسان گراو"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"‏E با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"‏E با هشتک"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"‏E با دو نقطه"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"‏I با اکسان گراو"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"‏I با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"‏I با هشتک"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"‏I با دونقطه"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"‏N با مدک"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"‏O با اکسان گراو"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"‏O با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"‏O با هشتک"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"‏O با مدک"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"‏O با دونقطه"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"‏O با خط مورب"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"‏U با اکسان گراو"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"‏U با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"‏U با هشتک"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"‏U با دو نقطه"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"‏Y با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"‏Y با دو نقطه"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"‏A با ماکرون"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"‏A کوتاه"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"‏A با اگنک"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"‏C با اکسان اگو"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"‏C با هشتک"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"‏C با نقطه"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"‏C با هفتک"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"‏D با هفتک"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"‏D با خط مورب"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"‏E با ماکرون"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"‏E کوتاه"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"‏E با نقطه"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"‏E با اگنک"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"‏E با هفتک"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"‏G با هشتک"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"‏G کوتاه"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"‏G با نقطه"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"‏G با سدیلا"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"‏H با هشتک"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"‏H با خط مورب"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"‏I با مدک"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"‏I با ماکرون"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"‏I کوتاه"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"‏I با اگنک"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"‏I بی‌نقطه"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"‏I، ‏J متصل به هم"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"‏I با هشتک"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"‏K با سدیلا"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"‏L با اکسان اگو"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"‏L با سدیلا"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"‏L با هفتک"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"‏L با نقطه وسط"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"‏L با خط مورب"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"‏N با اکسان اگو"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"‏N با سدیلا"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"‏N با هفتک"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"‏N بعد از آپاستراف"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"‏O با ماکرون"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"‏O کوتاه"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"‏O با اکسان اگوی دوتایی"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"‏O، ‏E متصل به هم"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"‏R با اکسان اگو"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"‏R با سدیلا"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"‏R با هفتک"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"‏S با اکسان اگو"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"‏S با هشتک"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"‏S با سدیلا"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"‏S با هفتک"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"‏T با سدیلا"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"‏T با کارون"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"‏T با خط مورب"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"‏U با مدک"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"‏U با ماکرون"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"‏U کوتاه"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"‏U با حلقه"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"‏U با اکسان اگو دوتایی"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"‏U با اگنک"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"‏W با هشتک"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"‏Y با هشتک"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"‏Z با اکسان اگو"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"‏Z با دو نقطه"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"‏Z با هفتک"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"‏S طولانی"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"‏O با شاخ"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"‏U با شاخ"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"‏S با کامای زیرین"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"‏T با کامای زیرین"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"واکه بی‌رنگ"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"‏A با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"‏A با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"‏A با هشتک و اکسان اگو"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"‏A با هشتک و اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"‏A با هشتک و کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"‏A با هشتک و مدک"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"‏A با هشتک و نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"‏A کوتاه با اکسان اگو"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"‏A کوتاه با اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"‏A کوتاه با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"‏A کوتاه با مدک"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"‏A کوتاه با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"‏E با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"‏E با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"‏E با مدک"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"‏E با هشتک و اکسان اگو"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"‏E با هشتک و اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"‏E با هشتک و کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"‏E با هشتک و مدک"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"‏E با هشتک و نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"‏I با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"‏I با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"‏O با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"‏O با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"‏O با هشتک و اکسان اگو"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"‏O با هشتک و اکسان گراو"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"‏O با هشتک و کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"‏O با هشتک و مدک"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"‏O با هشتک و نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"‏O با شاخ و اکسان اگو"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"‏O با شاخ و اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"‏O با شاخ و کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"‏O با شاخ و مدک"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"‏O با شاخ و نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"‏U با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"‏U با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"‏U با شاخ و اکسان اگو"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"‏U با شاخ و اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"‏U با شاخ و کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"‏U با شاخ و مدک"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"‏U با شاخ و نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"‏Y اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"‏Y با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"‏Y با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"‏Y با مدک"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"علامت تعجب وارونه"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"گیومه رو به چپ"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"نقطه وسط"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"بالانویس یک"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"گیومه رو به راست"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"علامت سؤال وارونه"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"علامت نقل قول تکی سمت چپ"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"علامت نقل قول تکی سمت راست"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"علامت نقل قول تکی ۹ پایین"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"علامت نقل قول دوتایی سمت چپ"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"علامت نقل قول دوتایی سمت راست"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"نماد خنجر"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"نماد خنجر دوتایی"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"علامت در هزار"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"پریم"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"پریم دوتایی"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"گیومه تکی رو به چپ"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"گیومه تکی رو به راست"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"بالانویس چهار"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"‏بالانویس حرف n کوچک لاتین"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"علامت پسو"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"توسط"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"پیکان سمت راست"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"پیکان رو به پایین"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"مجموعه تهی"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"افزایش"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"کمتر یا مساوی"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"بزرگتر یا مساوی"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"ستاره سیاه"</string>
+</resources>
diff --git a/java/res/values-fa/strings-talkback-descriptions.xml b/java/res/values-fa/strings-talkback-descriptions.xml
index c70040f..988dd5c 100644
--- a/java/res/values-fa/strings-talkback-descriptions.xml
+++ b/java/res/values-fa/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"نوشتاری وارد نشده است"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g>، ‏<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> را به <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> تصحیح می‌کند"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> تصحیح خودکار را انجام می‌دهد"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"نویسه نامشخص"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"نمادهای بیشتر"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"تبدیل"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"مکان‌ها"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"نمادها"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"شکلک‌ها"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"حرف بزرگ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"‏I بزرگ"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"‏I بزرگ با نقطه بالایی"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"نماد نامشخص"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"‏شکلک emoji نامشخص"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"نویسه‌های جایگزین در دسترس هستند"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"از نویسه‌های جایگزین صرفنظر می‌شود"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"پیشنهادهای جایگزین در دسترس هستند"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"از پیشنهادهای جایگزین صرفنظر می‌شود"</string>
 </resources>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index 0c466c2..bda2756 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"پیشنهاد نام‌های مخاطب"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"برای پیشنهاد و تصحیح از نام مخاطبین استفاده شود"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"پیشنهادات شخصی شده"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"بهبود <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"نقطه با دو فاصله"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"با دوبار ضربه روی دکمه فاصله نقطه با یک فاصله بعد آن درج می‌شود"</string>
     <string name="auto_cap" msgid="1719746674854628252">"بزرگ‌کردن خودکار حروف"</string>
diff --git a/java/res/values-in/strings-action-keys.xml b/java/res/values-in/strings-action-keys.xml
index 052798d..7f1a28e 100644
--- a/java/res/values-in/strings-action-keys.xml
+++ b/java/res/values-in/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Balik"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Beres"</string>
     <string name="label_send_key" msgid="482252074224462163">"Kirim"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Telusur"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Jeda"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Tunggu"</string>
 </resources>
diff --git a/java/res/values-in/strings-letter-descriptions.xml b/java/res/values-in/strings-letter-descriptions.xml
new file mode 100644
index 0000000..711f689
--- /dev/null
+++ b/java/res/values-in/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indikator ordinal feminin"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Simbol mikro"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indikator ordinal maskulin"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Eszett"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A dengan aksen nontirus (tanda coret miring ke arah kiri di bagian atas)"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A dengan aksen tirus (tanda coret miring ke arah kanan di bagian atas)"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A dengan aksen sirkumfleks (tanda aksen di bagian atas)"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A dengan aksen tilda (tanda gelombang di bagian atas)"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A dengan aksen diaeresis (titik dua di bagian atas)"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A dengan aksen lingkaran di bagian atas"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A E ligatur (Karakter A dan E yang digabungkan menjadi satu kesatuan unit)"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C dengan aksen cedilla (tanda kait di bagian bawah)"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E dengan aksen nontirus"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E dengan aksen diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I dengan aksen nontirus"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I dengan aksen diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N dengan aksen tilda"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O dengan aksen nontirus"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O dengan aksen tilda"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O dengan aksen diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O coret"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U dengan aksen nontirus"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U dengan aksen diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn (sekarang diganti dengan huruf th)"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y dengan aksen diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A dengan aksen makron (tanda pengulur/makron di bagian atas)"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A dengan aksen breve (tanda breve di bagian atas)"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A dengan aksen ogonek (tanda ekor di sebelah kanan bawah untuk menunjukkan bunyi sengau)"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C dengan titik di bagian atas"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C dengan aksen caron (tanda caron di bagian atas)"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D dengan aksen caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D coret"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E dengan aksen makron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E dengan aksen breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E dengan titik di bagian atas"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E dengan aksen ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E dengan aksen caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G dengan aksen breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G dengan aksen titik di bagian atas"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H coret"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I dengan aksen tilda"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I dengan aksen makron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I dengan aksen breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I dengan aksen ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I tanpa titik"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I dan J ligatur"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L dengan aksen caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L dengan titik di tengah"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L coret"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N dengan aksen caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N yang didahului tanda apostrof"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O dengan aksen makron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O dengan aksen breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O dengan aksen tirus ganda"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O dan E ligatur"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R dengan aksen caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S dengan aksen caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T dengan aksen caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T coret"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U dengan aksen tilda"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U dengan aksen makron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U dengan aksen breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U dengan aksen lingkaran di bagian atas"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U dengan aksen tirus ganda"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U dengan aksen ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z dengan titik di bagian atas"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z dengan aksen caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S Panjang"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O dengan aksen tanduk"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U dengan aksen tanduk"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S dengan aksen koma di bagian bawah"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T dengan aksen koma di bagian bawah"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa (aksen pepet)"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A dengan aksen sirkumfleks dan tirus"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A dengan aksen sirkumfleks dan nontirus"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A dengan aksen sirkumfleks dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A dengan aksen sirkumfleks dan tilda"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A dengan aksen sirkumfleks dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A dengan aksen breve dan tirus"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A dengan aksen breve dan nontirus"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A dengan aksen breve dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A dengan aksen breve dan tilda"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A dengan aksen breve dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E dengan aksen tilda"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E dengan aksen sirkumfleks dan tirus"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E dengan aksen sirkumfleks dan nontirus"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E dengan aksen sirkumfleks dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E dengan aksen sirkumfleks dan tilda"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E dengan aksen sirkumfleks dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O dengan aksen sirkumfleks dan tirus"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O dengan aksen sirkumfleks dan nontirus"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O dengan aksen sirkumfleks dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O dengan aksen sirkumfleks dan tilda"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O dengan aksen sirkumfleks dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O dengan aksen tanduk dan tirus"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O dengan aksen tanduk dan nontirus"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O dengan aksen tanduk dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O dengan aksen tanduk dan tilda"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O dengan aksen tanduk dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U dengan aksen tanduk dan tirus"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U dengan aksen tanduk dan nontirus"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U dengan aksen tanduk dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U dengan aksen tanduk dan tilda"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U dengan aksen tanduk dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y dengan aksen nontirus"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y dengan aksen tilda"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Tanda seru terbalik"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dua tanda kurung sudut kiri"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Titik tengah"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript satu"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dua tanda kurung sudut kanan"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Tanda tanya terbalik"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Tanda petik tunggal kiri"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Tanda petik tunggal kanan"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Tanda petik tunggal di bagian bawah"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Tanda petik ganda kiri"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Tanda petik ganda kanan"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger (Tanda belati)"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dagger ganda"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Simbol per mil"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Tanda petik"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Tanda petik ganda"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Tanda kurung sudut kiri tunggal"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Tanda kurung sudut kanan tunggal"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript empat"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript huruf latin kecil n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Simbol peso"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Dengan alamat"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Panah ke kanan"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Panah ke bawah"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Himpunan kosong"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Penambahan"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Kurang dari atau sama dengan"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Lebih dari atau sama dengan"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Bintang hitam"</string>
+</resources>
diff --git a/java/res/values-in/strings-talkback-descriptions.xml b/java/res/values-in/strings-talkback-descriptions.xml
index 6f29707..f7334d9 100644
--- a/java/res/values-in/strings-talkback-descriptions.xml
+++ b/java/res/values-in/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Tidak ada teks yang dimasukkan"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> mengoreksi <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> menjadi <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> melakukan koreksi otomatis"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Karakter tak dikenal"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Simbol lainnya"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Tempat"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simbol"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikon"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Huruf kapital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Huruf kapital I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Huruf kapital I dengan aksen titik di bagian atas"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Simbol tak dikenal"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji tak dikenal"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Karakter alternatif tersedia"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Karakter alternatif ditolak"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Saran alternatif tersedia"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Saran alternatif ditolak"</string>
 </resources>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 160b2ee..a5babcd 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sarankan nama Kontak"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Menggunakan nama dari Kontak untuk saran dan koreksi"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Saran hasil personalisasi"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Tingkatkan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Titik spasi ganda"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Mengetuk tombol spasi dua kali akan memasukkan titik diikuti satu spasi"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Kapitalisasi otomatis"</string>
diff --git a/java/res/values-iw/strings-action-keys.xml b/java/res/values-iw/strings-action-keys.xml
index 398c081..f72a6fe 100644
--- a/java/res/values-iw/strings-action-keys.xml
+++ b/java/res/values-iw/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"הקודם"</string>
     <string name="label_done_key" msgid="7564866296502630852">"בוצע"</string>
     <string name="label_send_key" msgid="482252074224462163">"שלח"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"חפש"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"השהה"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"המתן"</string>
 </resources>
diff --git a/java/res/values-iw/strings-letter-descriptions.xml b/java/res/values-iw/strings-letter-descriptions.xml
new file mode 100644
index 0000000..1b0e72f
--- /dev/null
+++ b/java/res/values-iw/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"סימן סידורי נקבי"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"סימן מיקרו"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"סימן סידורי זכרי"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"‏S חדה"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"‏A‏, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"‏A, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"‏A, גג"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"‏A, טילדה"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"‏A, עלית כפולה"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"‏A, טבעת מעל"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"‏A‏, E, ליגטורה"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"‏C, סדיליה"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"‏E, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"‏E, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"‏E, גג"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"‏E, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"‏I, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"‏I, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"‏I, גג"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"‏I, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"‏N, טילדה"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"‏O, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"‏O, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"‏O, גג"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"‏O, טילדה"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"‏O, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"‏O, קו חוצה"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"‏U, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"‏U, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"‏U, גג"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"‏U, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"‏Y, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"‏Y, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"‏A, קו עלי"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"‏A, ברווה"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"‏A, זנבון"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"‏C, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"‏C, גג"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"‏C, נקודה מעל"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"‏C, וי קטן"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"‏D, וי קטן"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"‏D, קו חוצה"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"‏E, קו עלי"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"‏E, ברווה"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"‏E, נקודה מעל"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"‏E, זנבון"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"‏E, וי קטן"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"‏G, גג"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"‏G, ברווה"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"‏G, נקודה מעל"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"‏G, סדיליה"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"‏H, גג"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"‏H, קו חוצה"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"‏I, טילדה"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"‏I, קו עלי"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"‏I, ברווה"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"‏I, זנבון"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"‏I ללא נקודות"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"‏I‏, J, ליגטורה"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"‏J, גג"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"‏K, סדיליה"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"‏L, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"‏L, סדיליה"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"‏L, וי קטן"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"‏L, נקודה אמצעית"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"‏L, קו חוצה"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"‏N, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"‏N, סדיליה"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"‏N, וי קטן"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"‏N, עם גרש לפני"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"‏O, קו עלי"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"‏O, ברווה"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"‏O, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"‏O‏, E, ליגטורה"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"‏R, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"‏R, סדיליה"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"‏R, וי קטן"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"‏S, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"‏S, גג"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"‏S, סדיליה"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"‏S, וי קטן"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"‏T, סדיליה"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"‏T, וי קטן"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"‏T, קו חוצה"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"‏U, טילדה"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"‏U, קו עלי"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"‏U, ברווה"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"‏U, טבעת מעל"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"‏U, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"‏U, זנבון"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"‏W, גג"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"‏Y, גג"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"‏Z, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"‏Z, נקודה מעל"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"‏Z, וי קטן"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"‏S ארוכה"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"‏O, קרן"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"‏U, קרן"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"‏S, פסיק מתחת"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"‏T, פסיק מתחת"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"‏A, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"‏A, קרס מעל"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"‏A, גג והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"‏A, גג והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"‏A, גג וקרס מעל"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"‏A, גג וטילדה"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"‏A, גג ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"‏A, ברווה והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"‏A, ברווה והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"‏A, ברווה וקרס מעל"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"‏A, ברווה וטילדה"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"‏A, ברווה ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"‏E, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"‏E, קרס מעל"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"‏E, טילדה"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"‏E, גג והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"‏E, גג והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"‏E, גג וקרס מעל"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"‏E, גג וטילדה"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"‏E, גג ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"‏I, קרס מעל"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"‏I, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"‏O, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"‏O, קרס מעל"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"‏O, גג והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"‏O, גג והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"‏O, גג וקרס מעל"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"‏O, גג וטילדה"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"‏O, גג ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"‏O, קרן והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"‏O, קרן והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"‏O, קרן וקרס מעל"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"‏O, קרן וטילדה"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"‏O, קרן ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"‏U, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"‏U, קרס מעל"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"‏U, קרן והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"‏U, קרן והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"‏U, קרן וקרס מעל"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"‏U, קרן וטילדה"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"‏U, קרן ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"‏Y, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"‏Y, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"‏Y, קרס מעל"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"‏Y, טילדה"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"סימן קריאה הפוך"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"סימן ציטוט זוויתי כפול הפונה שמאלה"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"נקודה אמצעית"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"אחד בכתב עלי"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"סימן ציטוט זוויתי כפול הפונה ימינה"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"סימן שאלה הפוך"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"גרש שמאלי יחיד"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"גרש ימני יחיד"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"גרש יחיד תחתון"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"מירכאות כפולות שמאליות"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"מירכאות כפולות ימניות"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"צלבון"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"צלבון כפול"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"סימן פרומיל"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"‏Prime כפול"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"סימן ציטוט זוויתי יחיד הפונה שמאלה"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"סימן ציטוט זוויתי יחיד הפונה ימינה"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"ארבע בכתב עלי"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"‏n לטינית קטנה בכתב עלי"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"סימן פזו"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"סימן \"לכבוד\""</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"חץ ימינה"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"חץ מטה"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty Set"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"הגדל"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"קטן מ- או שווה ל-"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"גדול מ- או שווה ל-"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"כוכב שחור"</string>
+</resources>
diff --git a/java/res/values-iw/strings-talkback-descriptions.xml b/java/res/values-iw/strings-talkback-descriptions.xml
index 435aaba..a43b64e 100644
--- a/java/res/values-iw/strings-talkback-descriptions.xml
+++ b/java/res/values-iw/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"לא הוזן טקסט"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> מתקן את <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ל-<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> מבצע תיקון אוטומטי"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"תו לא מוכר"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"סמלים נוספים"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"מקומות"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"סמלים"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"רגשונים"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> גדולה"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"‏I גדולה"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"‏I גדולה, נקודה מעל"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"סמל לא מוכר"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"‏Emoji לא מוכר"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"תווים חלופיים זמינים"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"תווים חלופיים נדחים"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"הצעות חלופיות זמינות"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"הצעות חלופיות נדחות"</string>
 </resources>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 297048c..705121e 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"הצע שמות של אנשי קשר"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"השתמש בשמות מרשימת אנשי הקשר עבור הצעות ותיקונים"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"הצעות מותאמות אישית"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"שפר את <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"רווח כפול לנקודה"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"הקשה פעמיים על מקש הרווח מזינה נקודה ואחריה רווח"</string>
     <string name="auto_cap" msgid="1719746674854628252">"הפיכת אותיות לרישיות באופן אוטומטי"</string>
diff --git a/java/res/values-ka-rGE/strings-action-keys.xml b/java/res/values-ka-rGE/strings-action-keys.xml
index 3ad6c33..5fa9235 100644
--- a/java/res/values-ka-rGE/strings-action-keys.xml
+++ b/java/res/values-ka-rGE/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"წინა"</string>
     <string name="label_done_key" msgid="7564866296502630852">"დასრ."</string>
     <string name="label_send_key" msgid="482252074224462163">"გაგზ."</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"ძიება"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"პაუზა"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"მოცდა"</string>
 </resources>
diff --git a/java/res/values-ka-rGE/strings-letter-descriptions.xml b/java/res/values-ka-rGE/strings-letter-descriptions.xml
new file mode 100644
index 0000000..ae3ddab
--- /dev/null
+++ b/java/res/values-ka-rGE/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"ნიშანი მიკრო"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middle dot"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"ერთიანი ზედა ინდექსში"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Left double quotation mark"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Right double quotation mark"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"მარცხნივ მიმართლი კუთხოვანი ერთმაგი ბრჭყალი"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"მარჯვნივ მიმართლი კუთხოვანი ერთმაგი ბრჭყალი"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"ოთხიანი ზედა ინდექსში"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"ლათინური ასო n ზედა ინდექსში"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"პესოს ნიშანი"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"მარჯვნივ მიმართული ისარი"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"ქვევით მიმართლი ისარი"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"ნაკლებობა ან ტოლობა"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"მეტობა ან ტოლობა"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"შავი ვარსკვლავი"</string>
+</resources>
diff --git a/java/res/values-ka-rGE/strings-talkback-descriptions.xml b/java/res/values-ka-rGE/strings-talkback-descriptions.xml
index 0cf7e7c..5d23b09 100644
--- a/java/res/values-ka-rGE/strings-talkback-descriptions.xml
+++ b/java/res/values-ka-rGE/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"ტექსტი შეყვანილი არ არის"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> შეასწორებს <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-ს <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>-ად"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ასრულებს ავტოკორექციას"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"უცნობი სიმბოლო"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"დამატებითი სიმბოლოები"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ადგილები"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"სიმბოლოები"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"სიცილაკები"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"დიდი <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"დიდი I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"უცნობი სიმბოლო"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"უცნობი emoji"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ალტერნატიული სიმბოლოები ხელმისაწვდომია"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ალტერნატიული სიმბოლოები გამოტოვებულია"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ალტერნატიული შეთავაზებები ხელმისაწვდომია"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ალტერნატიული შეთავაზებები გამოტოვებულია"</string>
 </resources>
diff --git a/java/res/values-ka-rGE/strings.xml b/java/res/values-ka-rGE/strings.xml
index 7c0026e..43dcc63 100644
--- a/java/res/values-ka-rGE/strings.xml
+++ b/java/res/values-ka-rGE/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"კონტაქტის სახელების შეთავაზება"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"კონტაქტებიდან სახელების გამოყენება შეთავაზებებისთვის და კორექციისთვის"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"პერსონალიზებული შეთავაზებები"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-ის გაუმჯობესება"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"წერტილი ორმაგი შორისით"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"შორისზე ორჯერ შეხება დაწერს წერტილს და შორისის სიმბოლოს"</string>
     <string name="auto_cap" msgid="1719746674854628252">"ავტო-კაპიტალიზაცია"</string>
diff --git a/java/res/values-km-rKH/strings-action-keys.xml b/java/res/values-km-rKH/strings-action-keys.xml
index d6b11b7..3ff6d49 100644
--- a/java/res/values-km-rKH/strings-action-keys.xml
+++ b/java/res/values-km-rKH/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"មុន"</string>
     <string name="label_done_key" msgid="7564866296502630852">"រួចរាល់"</string>
     <string name="label_send_key" msgid="482252074224462163">"ផ្ញើ"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"ស្វែងរក"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"ផ្អាក"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"រង់ចាំ"</string>
 </resources>
diff --git a/java/res/values-km-rKH/strings-emoji-descriptions.xml b/java/res/values-km-rKH/strings-emoji-descriptions.xml
index 9f1d997..757df50 100644
--- a/java/res/values-km-rKH/strings-emoji-descriptions.xml
+++ b/java/res/values-km-rKH/strings-emoji-descriptions.xml
@@ -25,16 +25,16 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="spoken_emoji_00A9" msgid="2859822817116803638">"សញ្ញា​រក្សា​សិទ្ធ"</string>
+    <string name="spoken_emoji_00A9" msgid="2859822817116803638">"សញ្ញា​រក្សា​សិទ្ធ​"</string>
     <string name="spoken_emoji_00AE" msgid="7708335454134589027">"សញ្ញា​​​ចុះ​បញ្ជី"</string>
     <string name="spoken_emoji_203C" msgid="153340916701508663">"សញ្ញា​ឧទាន​​ពីរ"</string>
-    <string name="spoken_emoji_2049" msgid="4877256448299555371">"សញ្ញា​​ឧទាន​សញ្ញា​សួរ"</string>
+    <string name="spoken_emoji_2049" msgid="4877256448299555371">"សញ្ញា​​ឧទាន​សញ្ញា​សួរ​​"</string>
     <string name="spoken_emoji_2122" msgid="9188440722954720429">"សញ្ញា​​​និក្ខិត្តសញ្ញា"</string>
     <string name="spoken_emoji_2139" msgid="9114342638917304327">"ប្រភព​ព័ត៌មាន"</string>
     <string name="spoken_emoji_2194" msgid="8055202727034946680">"ព្រួញ​ឆ្វេងស្ដាំ"</string>
     <string name="spoken_emoji_2195" msgid="8028122253301087407">"ព្រួញ​ឡើង​លើ​ចុះក្រោម"</string>
     <string name="spoken_emoji_2196" msgid="4019164898967854363">"ព្រួញ​ទិសពាយព្យ"</string>
-    <string name="spoken_emoji_2197" msgid="4255723717709017801">"ព្រួញ​​ទិស​ឥសាន្ត​ឦសាន្ត"</string>
+    <string name="spoken_emoji_2197" msgid="4255723717709017801">"ព្រួញ​​ទិស​ឥសាន្ត​ឦសាន្ត​"</string>
     <string name="spoken_emoji_2198" msgid="1452063451313622090">"ព្រួញ​​ទិស​អាគ្នេយ៍"</string>
     <string name="spoken_emoji_2199" msgid="6942722693368807849">"ព្រួញ​​ទិស​និរតី"</string>
     <string name="spoken_emoji_21A9" msgid="5204750172335111188">"ព្រួញ​ទៅ​ឆ្វេង​មាន​ទំពក់"</string>
@@ -45,7 +45,7 @@
     <string name="spoken_emoji_23EA" msgid="2251396938087774944">"ត្រីកោណ​ខ្មៅ​ពីរ​ចង្អុល​ទៅ​ឆ្វេង"</string>
     <string name="spoken_emoji_23EB" msgid="3746885195641491865">"ត្រីកោណ​ខ្មៅ​ពីរ​ចង្អុល​​ឡើង​លើ"</string>
     <string name="spoken_emoji_23EC" msgid="7852372752901163416">"ត្រីកោណ​ខ្មៅ​ពីរ​ចង្អុល​​ចុះក្រោម"</string>
-    <string name="spoken_emoji_23F0" msgid="8474219588750627870">"នាឡិកា​រោទ៍"</string>
+    <string name="spoken_emoji_23F0" msgid="8474219588750627870">"នាឡិកា​រោទ៍​"</string>
     <string name="spoken_emoji_23F3" msgid="166900119581024371">"កែវ​ពិសោធន៍​មាន​ខ្សាច់ហូរ"</string>
     <string name="spoken_emoji_24C2" msgid="3948348737566038470">"អក្សរ​អឹម​ធំ​ក្នុង​រង្វង់"</string>
     <string name="spoken_emoji_25AA" msgid="7865181015100227349">"ការ៉េ​តូច​​ពណ៌ខ្មៅ"</string>
@@ -195,7 +195,7 @@
     <string name="spoken_emoji_1F312" msgid="4458575672576125401">"ព្រះ​ចន្ទ​មួយ​ចំណិត​ស្ដាំ"</string>
     <string name="spoken_emoji_1F313" msgid="7599181787989497294">"ព្រះ​ចន្ទ​ពាក់​កណ្ដាល"</string>
     <string name="spoken_emoji_1F314" msgid="4898293184964365413">"ព្រះ​ចន្ទ​មួយ​ចំណិត​ឆ្វេង"</string>
-    <string name="spoken_emoji_1F315" msgid="3218117051779496309">"ព្រះចន្ទ​ពេញ​វង់"</string>
+    <string name="spoken_emoji_1F315" msgid="3218117051779496309">"ព្រះចន្ទ​ពេញ​វង់​"</string>
     <string name="spoken_emoji_1F316" msgid="2061317145777689569">"ព្រះ​ចន្ទ​ភ្លឺ​មួយ​ចំហៀង"</string>
     <string name="spoken_emoji_1F317" msgid="2721090687319539049">"ព្រះ​ចន្ទ​ភ្លឺ​ពាក់​កណ្ដាល"</string>
     <string name="spoken_emoji_1F318" msgid="3814091755648887570">"ព្រះ​ចន្ទ​ភ្លឺ​មួយ​ចំណិត​ឆ្វេង"</string>
@@ -262,7 +262,7 @@
     <string name="spoken_emoji_1F365" msgid="4963815540953316307">"នំ​ត្រី​រាង​មូល"</string>
     <string name="spoken_emoji_1F366" msgid="7862401745277049404">"ការ៉េម​​បំពង់"</string>
     <string name="spoken_emoji_1F367" msgid="7447972978281980414">"ការ៉េម​កែវ"</string>
-    <string name="spoken_emoji_1F368" msgid="7790003146142724913">"ការ៉េម"</string>
+    <string name="spoken_emoji_1F368" msgid="7790003146142724913">"ការ៉េម​"</string>
     <string name="spoken_emoji_1F369" msgid="7383712944084857350">"ដូណាត់"</string>
     <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"ខូគី"</string>
     <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"​​សូកូឡា"</string>
@@ -280,7 +280,7 @@
     <string name="spoken_emoji_1F377" msgid="1762398562314172075">"កែវ​ស្រា"</string>
     <string name="spoken_emoji_1F378" msgid="5528234560590117516">"កែវ​ស្រា​ក្រឡុក"</string>
     <string name="spoken_emoji_1F379" msgid="790581290787943325">"ភេសជ្ជៈ​​​ត្រូពិក"</string>
-    <string name="spoken_emoji_1F37A" msgid="391966822450619516">"កែវ​​ស្រាបៀ"</string>
+    <string name="spoken_emoji_1F37A" msgid="391966822450619516">"កែវ​​ស្រាបៀ​"</string>
     <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"ជល់​កែវ​ស្រាបៀ"</string>
     <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"ដប​ទឹកដោះ​គោ"</string>
     <string name="spoken_emoji_1F380" msgid="3487363857092458827">"ខ្សែ​បូ"</string>
@@ -313,7 +313,7 @@
     <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"កាស"</string>
     <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"ក្ដារ​លាយ​ពណ៌​វិចិត្រករ"</string>
     <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"មួក​​​សម្ដែង​សិល្បៈ"</string>
-    <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"តង់​សៀក"</string>
+    <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"តង់​សៀក​"</string>
     <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"សំបុត្រ"</string>
     <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"បន្ទះកណ្ដឹង"</string>
     <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"សម្ដែង​សិល្បៈ"</string>
@@ -334,10 +334,10 @@
     <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"និមិត្តសញ្ញា​តន្ត្រី"</string>
     <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"អាវ​កីឡា​​មាន​ខ្សែ​ឆៀង"</string>
     <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"រ៉ាកែត និង​បាល់"</string>
-    <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"ជិះ​ស្គី ​និង​ក្ដារ​​ស្គី"</string>
+    <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"ជិះ​ស្គី ​និង​ក្ដារ​​ស្គី​"</string>
     <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"បាល់​បោះ​ និង​វណ្ណ​មូល"</string>
     <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"ទង់ជាតិ​ប្រណាំង​ម៉ូតូ"</string>
-    <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"អ្នក​ជិះ​​ក្ដារ​រំអិល​លើ​ព្រិល"</string>
+    <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"អ្នក​ជិះ​​ក្ដារ​រំអិល​លើ​ព្រិល​"</string>
     <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"អ្នក​រត់"</string>
     <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"អ្នក​ជិះ​ទូក​រអិល​លើ​ទឹក"</string>
     <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"ពាន​រង្វាន់"</string>
@@ -354,7 +354,7 @@
     <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"ធនាគារ"</string>
     <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"ម៉ាស៊ីន​​អេធីអឹម"</string>
     <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"សណ្ឋាគារ"</string>
-    <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"សណ្ឋាគារ​ក្ដី​ស្រឡាញ់"</string>
+    <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"សណ្ឋាគារ​ក្ដី​ស្រឡាញ់​"</string>
     <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"ហាង​​ទំនិញ ២៤​ម៉ោង"</string>
     <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"សាលារៀន"</string>
     <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"ហាង​​ទំនិញធំៗ"</string>
@@ -439,12 +439,12 @@
     <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"​មេដៃ​ឡើង​លើ"</string>
     <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"​មេដៃ​ចុះ​ក្រោម"</string>
     <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"ទះ​ដៃ"</string>
-    <string name="spoken_emoji_1F450" msgid="1012021072085157054">"លា​ដៃ"</string>
+    <string name="spoken_emoji_1F450" msgid="1012021072085157054">"លា​ដៃ​"</string>
     <string name="spoken_emoji_1F451" msgid="8257466714629051320">"មកុដ"</string>
     <string name="spoken_emoji_1F452" msgid="4567394011149905466">"មួក​​ស្ត្រី"</string>
     <string name="spoken_emoji_1F453" msgid="5978410551173163010">"វ៉ែនតា"</string>
-    <string name="spoken_emoji_1F454" msgid="348469036193323252">"ក្រ​វ៉ាត់​ករ"</string>
-    <string name="spoken_emoji_1F455" msgid="5665118831861433578">"អាវ​យឺត"</string>
+    <string name="spoken_emoji_1F454" msgid="348469036193323252">"ក្រ​វ៉ាត់​ករ​"</string>
+    <string name="spoken_emoji_1F455" msgid="5665118831861433578">"អាវ​យឺត​​"</string>
     <string name="spoken_emoji_1F456" msgid="1890991330923356408">"ខោ​ខោវប៊យ"</string>
     <string name="spoken_emoji_1F457" msgid="3904310482655702620">"សំលៀក​បំពាក់"</string>
     <string name="spoken_emoji_1F458" msgid="5704243858031107692">"គី​ម៉ូណូ"</string>
@@ -463,8 +463,8 @@
     <string name="spoken_emoji_1F465" msgid="4461307702499679879">"គណនី"</string>
     <string name="spoken_emoji_1F466" msgid="1938873085514108889">"ក្មេង​​ប្រុស"</string>
     <string name="spoken_emoji_1F467" msgid="8237080594860144998">"ក្មេង​ស្រី"</string>
-    <string name="spoken_emoji_1F468" msgid="6081300722526675382">"បុរស"</string>
-    <string name="spoken_emoji_1F469" msgid="1090140923076108158">"ស្ត្រី"</string>
+    <string name="spoken_emoji_1F468" msgid="6081300722526675382">"បុរស​"</string>
+    <string name="spoken_emoji_1F469" msgid="1090140923076108158">"ស្ត្រី​"</string>
     <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"គ្រួសារ"</string>
     <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"បុរស​​ និង​ស្ត្រី​កាន់ដៃ​គ្នា"</string>
     <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"បុរស​ពីរ​នាក់​កាន់​ដៃ​គ្នា"</string>
@@ -490,16 +490,16 @@
     <string name="spoken_emoji_1F480" msgid="3696253485164878739">"លលាដ៍​ក្បាល"</string>
     <string name="spoken_emoji_1F481" msgid="320408708521966893">"អ្នក​ផ្ដល់​ព័ត៌មាន"</string>
     <string name="spoken_emoji_1F482" msgid="3424354860245608949">"អ្នក​យាម"</string>
-    <string name="spoken_emoji_1F483" msgid="3221113594843849083">"អ្នក​រាំ"</string>
+    <string name="spoken_emoji_1F483" msgid="3221113594843849083">"អ្នក​រាំ​"</string>
     <string name="spoken_emoji_1F484" msgid="7348014979080444885">"ក្រេម​លាប​បបូរ​មាត់"</string>
     <string name="spoken_emoji_1F485" msgid="6133507975565116339">"ថ្នាំ​លាប​​​ក្រចក"</string>
     <string name="spoken_emoji_1F486" msgid="9085459968247394155">"ម៉ាស្សា​មុខ"</string>
     <string name="spoken_emoji_1F487" msgid="1479113637259592150">"កាត់សក់"</string>
     <string name="spoken_emoji_1F488" msgid="6922559285234100252">"ស្លាក​សញ្ញា​កាត់សក់"</string>
     <string name="spoken_emoji_1F489" msgid="8114863680950147305">"ស៊ីរ៉ាំង"</string>
-    <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"ថ្នាំ​គ្រាប់"</string>
+    <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"ថ្នាំ​គ្រាប់​"</string>
     <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"ស្នាម​ថើប"</string>
-    <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"លិខិត​ស្នេហា"</string>
+    <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"លិខិត​ស្នេហា​"</string>
     <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"រោទ៍"</string>
     <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"ត្បូង​ថ្ម"</string>
     <string name="spoken_emoji_1F48F" msgid="741593675183677907">"ថើប"</string>
@@ -525,7 +525,7 @@
     <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"គ្រាប់បែក"</string>
     <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"និមិត្ត​សញ្ញា​​ដេក"</string>
     <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"និមិត្ត​សញ្ញា​​ប៉ះ​ទង្គិច​គ្នា"</string>
-    <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"និមិត្ត​សញ្ញា​​ស្រក់​ញើស"</string>
+    <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"និមិត្ត​សញ្ញា​​ស្រក់​ញើស​"</string>
     <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"ដំណក់​ទឹក"</string>
     <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"និមិត្ត​សញ្ញា​​ដកឃ្លា"</string>
     <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"គំនរ​ធូលី"</string>
@@ -539,7 +539,7 @@
     <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"ប្ដូរ​​រូបិយប័ណ្ណ"</string>
     <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"សញ្ញា​ដុល្លារ"</string>
     <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"កាត​​ឥណទាន"</string>
-    <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"ក្រដាស​ប្រាក់​​ធនាគារ​មាន​សញ្ញា​​យ៉េន"</string>
+    <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"ក្រដាស​ប្រាក់​​ធនាគារ​មាន​សញ្ញា​​យ៉េន​​"</string>
     <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"លុយដុល្លារ"</string>
     <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"ក្រដាស​ប្រាក់​​ធនាគារ​មាន​សញ្ញា​អឺរ៉ូ"</string>
     <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"ក្រដាស​ប្រាក់​​ធនាគារ​មាន​សញ្ញា​​​ផោន"</string>
@@ -547,7 +547,7 @@
     <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"ក្រាហ្វិក​និន្នាការ​ឡើង​​មាន​​សញ្ញា​យ៉េន"</string>
     <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"កៅអី"</string>
     <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"កុំព្យូទ័រ​ផ្ទាល់ខ្លួន"</string>
-    <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"វ៉ា​លី"</string>
+    <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"វ៉ា​លី​"</string>
     <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"ឌីស​​តូច"</string>
     <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"ថា​ស​​ទន់"</string>
     <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"ថាស"</string>
@@ -557,7 +557,7 @@
     <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"ទំព័រ​​កោង"</string>
     <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"ទំព័រ​បញ្ឈរ"</string>
     <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"ប្រតិទិន"</string>
-    <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"ហែក​ប្រតិទិន"</string>
+    <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"ហែក​ប្រតិទិន​"</string>
     <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"​កាត​រៀប​តាម​អក្សរ"</string>
     <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"ក្រាហ្វិក​មាន​និន្នាការ​ឡើង"</string>
     <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"ក្រាហ្វិក​មាន​និន្នាការ​ចុះ"</string>
@@ -573,11 +573,11 @@
     <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"សៀវភៅ"</string>
     <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"សៀវភៅ​មាន​ក្រប​ពណ៌"</string>
     <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"សៀវភៅ​​បិទ"</string>
-    <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"សៀវភៅ​បើក"</string>
+    <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"សៀវភៅ​បើក​​"</string>
     <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"សៀវភៅ​​ពណ៌​បៃតង"</string>
     <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"សៀវភៅ​​ពណ៌​ខៀវ"</string>
     <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"សៀវភៅ​​ពណ៌​ទឹកក្រូច"</string>
-    <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"សៀវភៅ"</string>
+    <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"សៀវភៅ​"</string>
     <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"ស្លាកឈ្មោះ"</string>
     <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"ក្រដាស​រមូរ"</string>
     <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"កំណត់ចំណាំ"</string>
@@ -589,7 +589,7 @@
     <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"ឧបករណ៍​បំពង​សំឡេង"</string>
     <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"ថា​ស​​​ចេញ"</string>
     <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"ថា​ស​ចូល"</string>
-    <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"កញ្ចប់"</string>
+    <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"កញ្ចប់​"</string>
     <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"និមិត្ត​សញ្ញា​អ៊ីមែល"</string>
     <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"ស្រោម​​សំបុត្រ​ចូល"</string>
     <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"ស្រោម​សំបុត្រ​​មាន​សញ្ញា​ព្រួញ​ពី​លើ"</string>
@@ -626,7 +626,7 @@
     <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"ដុយ​អគ្គិសនី"</string>
     <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"កែវ​ពង្រីក​ចង្អុល​ខាង​ឆ្វេង"</string>
     <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"កែវ​ពង្រីក​ចង្អុល​ខាង​ស្ដាំ"</string>
-    <string name="spoken_emoji_1F50F" msgid="915079280472199605">"ចាក់សោ​​​ដោយ​ប្រើ​​ប៊ិច"</string>
+    <string name="spoken_emoji_1F50F" msgid="915079280472199605">"ចាក់សោ​​​ដោយ​ប្រើ​​ប៊ិច​"</string>
     <string name="spoken_emoji_1F510" msgid="7658381761691758318">"បិទ​​សោ​ដោយ​ប្រើ​​​​កូនសោ"</string>
     <string name="spoken_emoji_1F511" msgid="262319867774655688">"សោ"</string>
     <string name="spoken_emoji_1F512" msgid="5628688337255115175">"ចាក់សោ"</string>
@@ -645,15 +645,15 @@
     <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"គ្រាប់​ចុច​ ១០"</string>
     <string name="spoken_emoji_1F520" msgid="7335109890337048900">"និមិត្ត​សញ្ញា​បញ្ចូល​សម្រាប់​អក្សរ​ឡាតាំង​ធំ"</string>
     <string name="spoken_emoji_1F521" msgid="2693185864450925778">"និមិត្ត​សញ្ញា​បញ្ចូល​សម្រាប់​អក្សរ​ឡាតាំង​តូច"</string>
-    <string name="spoken_emoji_1F522" msgid="8419130286280673347">"និមិត្ត​សញ្ញា​បញ្ចូល​សម្រាប់​​លេខ"</string>
+    <string name="spoken_emoji_1F522" msgid="8419130286280673347">"និមិត្ត​សញ្ញា​បញ្ចូល​សម្រាប់​​លេខ​"</string>
     <string name="spoken_emoji_1F523" msgid="3318053476401719421">"ការ​បញ្ចូល​និមិត្តសញ្ញា"</string>
     <string name="spoken_emoji_1F524" msgid="1625073997522316331">"និមិត្ត​សញ្ញា​បញ្ចូល​សម្រាប់​អក្សរ​ឡាតាំង"</string>
     <string name="spoken_emoji_1F525" msgid="4083884189172963790">"ភ្លើង"</string>
     <string name="spoken_emoji_1F526" msgid="2035494936742643580">"ពិល​​អគ្គិសនី"</string>
     <string name="spoken_emoji_1F527" msgid="134257142354034271">"ម៉ាឡេត"</string>
     <string name="spoken_emoji_1F528" msgid="700627429570609375">"ញញួរ"</string>
-    <string name="spoken_emoji_1F529" msgid="7480548235904988573">"ឡោ​ស៊ី"</string>
-    <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"កាំបិត"</string>
+    <string name="spoken_emoji_1F529" msgid="7480548235904988573">"ឡោ​ស៊ី​​"</string>
+    <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"កាំបិត​​"</string>
     <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"កាំភ្លើង​ខ្លី"</string>
     <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"មីក្រូទស្សន៍"</string>
     <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"កែវ​យឹត"</string>
@@ -662,7 +662,7 @@
     <string name="spoken_emoji_1F530" msgid="3572898444281774023">"និមិត្តសញ្ញា​ជប៉ុន​សម្រាប់​អ្នក​ចាប់ផ្ដើម"</string>
     <string name="spoken_emoji_1F531" msgid="5225633376450025396">"លំពែង​មុខ​បី"</string>
     <string name="spoken_emoji_1F532" msgid="9169568490485180779">"ប៊ូតុង​ការេ​ពណ៌​ខ្មៅ"</string>
-    <string name="spoken_emoji_1F533" msgid="6554193837201918598">"ប៊ូតុង​ការ៉េ​ពណ៌​ស"</string>
+    <string name="spoken_emoji_1F533" msgid="6554193837201918598">"ប៊ូតុង​ការ៉េ​ពណ៌​ស​"</string>
     <string name="spoken_emoji_1F534" msgid="8339298801331865340">"រង្វង់​ពណ៌​ក្រហម​​​ធំ"</string>
     <string name="spoken_emoji_1F535" msgid="1227403104835533512">"រង្វង់​ពណ៌​ខៀវ​ធំ"</string>
     <string name="spoken_emoji_1F536" msgid="5477372445510469331">"ពេជ្រ​ពណ៌​ទឹកក្រូច​ធំ"</string>
@@ -745,8 +745,8 @@
     <string name="spoken_emoji_1F628" msgid="8875777401624904224">"មុខ​ភ័យ​ខ្លាច"</string>
     <string name="spoken_emoji_1F629" msgid="1411538490319190118">"មុខ​​នឿយហត់"</string>
     <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"មុខ​​ងងុយ​គេង"</string>
-    <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"មុខ​អស់កម្លាំង"</string>
-    <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"មុខ​ក្រញេវក្រញូវ"</string>
+    <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"មុខ​អស់កម្លាំង​​"</string>
+    <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"មុខ​ក្រញេវក្រញូវ​"</string>
     <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"មុខ​យំ​លឺៗ"</string>
     <string name="spoken_emoji_1F62E" msgid="726083405284353894">"មុខ​បើក​មាត់"</string>
     <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"មុខ​ស្ងៀមស្ងាត់"</string>
@@ -784,7 +784,7 @@
     <string name="spoken_emoji_1F683" msgid="8772750354339223092">"ទូរ​​រថភ្លើង"</string>
     <string name="spoken_emoji_1F684" msgid="346396777356203608">"រថភ្លើង​ល្បឿន​លឿន"</string>
     <string name="spoken_emoji_1F685" msgid="1237059817190832730">"រថភ្លើង​ល្បឿន​លឿន​​មាន​ច្រមុះ"</string>
-    <string name="spoken_emoji_1F686" msgid="3525197227223620343">"រថភ្លើង"</string>
+    <string name="spoken_emoji_1F686" msgid="3525197227223620343">"រថភ្លើង​"</string>
     <string name="spoken_emoji_1F687" msgid="5110143437960392837">"មេត្រូ"</string>
     <string name="spoken_emoji_1F688" msgid="4702085029871797965">"រថភ្លើង​ប្រើ​​​ពន្លឺ"</string>
     <string name="spoken_emoji_1F689" msgid="2375851019798817094">"ស្ថានីយ"</string>
@@ -803,7 +803,7 @@
     <string name="spoken_emoji_1F696" msgid="6391604457418285404">"តាក់ស៊ី​ខាង​មុខ"</string>
     <string name="spoken_emoji_1F697" msgid="7978399334396733790">"រថយន្ត"</string>
     <string name="spoken_emoji_1F698" msgid="7006050861129732018">"រថយន្ត​ខាង​មុខ"</string>
-    <string name="spoken_emoji_1F699" msgid="630317052666590607">"រថយន្ត​​​សម្រាប់​កម្សាន្ត"</string>
+    <string name="spoken_emoji_1F699" msgid="630317052666590607">"រថយន្ត​​​សម្រាប់​កម្សាន្ត​"</string>
     <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"រថយន្ត​​ចែក​ចាយ"</string>
     <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"ឡាន​កាមីយ៉ុង"</string>
     <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"ត្រាក់ទ័រ"</string>
@@ -819,7 +819,7 @@
     <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"ភ្លើង​ចរាចរណ៍​បញ្ឈរ"</string>
     <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"សញ្ញា​​សំណង់"</string>
     <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"រថយន្ត​​ប៉ូលិស​បើក​សារ៉ែន​វិល"</string>
-    <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"បង្គោល​ទង់ជាតិ​រាង​ត្រីកោណ"</string>
+    <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"បង្គោល​ទង់ជាតិ​រាង​ត្រីកោណ​"</string>
     <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"ទ្វារ"</string>
     <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"សញ្ញា​ហាម​ចូល"</string>
     <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"​សញ្ញា​ជក់​បារី"</string>
diff --git a/java/res/values-km-rKH/strings-letter-descriptions.xml b/java/res/values-km-rKH/strings-letter-descriptions.xml
new file mode 100644
index 0000000..f58eff4
--- /dev/null
+++ b/java/res/values-km-rKH/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"សញ្ញា ª"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"សញ្ញា µ"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"សញ្ញា º"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"សញ្ញា ß"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"សញ្ញា à"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"សញ្ញា á"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"សញ្ញា â"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"សញ្ញា ã"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"សញ្ញា ä"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"សញ្ញា å"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"សញ្ញា æ"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"សញ្ញា ç"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"សញ្ញា è"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"សញ្ញា é"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"សញ្ញា ê"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"សញ្ញា ë"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"សញ្ញា ì"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"សញ្ញា í"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"សញ្ញា î"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"សញ្ញា ï"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"សញ្ញា ð"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"សញ្ញា ñ"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"សញ្ញា ò"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"សញ្ញា ó"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"សញ្ញា ô"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"សញ្ញា õ"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"សញ្ញា ö"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"សញ្ញា ø"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"សញ្ញា ù"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"សញ្ញា ú"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"សញ្ញា û"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"សញ្ញា ü"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"សញ្ញា ý"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"សញ្ញា þ"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"សញ្ញា ÿ"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"សញ្ញា ā"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"សញ្ញា ă"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"សញ្ញា ą"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"សញ្ញា ć"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"សញ្ញា ĉ"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"សញ្ញា ċ"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"សញ្ញា č"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"សញ្ញា ď"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"សញ្ញា đ"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"សញ្ញា ē"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"សញ្ញា ĕ"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"សញ្ញា ė"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"សញ្ញា ę"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"សញ្ញា ě"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"សញ្ញា ĝ"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"សញ្ញា ğ"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"សញ្ញា ġ"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"សញ្ញា ģ"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"សញ្ញា ĥ"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"សញ្ញា ħ"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"សញ្ញា ĩ"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"សញ្ញា ī"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"សញ្ញា ĭ"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"សញ្ញា į"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"សញ្ញា ı"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"សញ្ញា ij"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"សញ្ញា ĵ"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"សញ្ញា ķ"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"សញ្ញា ĸ"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"សញ្ញា ĺ"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"សញ្ញា ļ"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"សញ្ញា ľ"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"សញ្ញា ŀ"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"សញ្ញា ł"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"សញ្ញា ń"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"សញ្ញា ņ"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"សញ្ញា ň"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"សញ្ញា ʼn"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"សញ្ញា ŋ"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"សញ្ញា ō"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"សញ្ញា ŏ"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"សញ្ញា ő"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"សញ្ញា œ"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"សញ្ញា ŕ"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"សញ្ញា ŗ"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"សញ្ញា ř"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"សញ្ញា ś"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"សញ្ញា ŝ"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"សញ្ញា ş"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"សញ្ញា š"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"សញ្ញា ţ"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"សញ្ញា ť"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"សញ្ញា ŧ"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"សញ្ញា ũ"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"សញ្ញា ū"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"សញ្ញា ŭ"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"សញ្ញា ů"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"សញ្ញា ű"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"សញ្ញា ų"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"សញ្ញា ŵ"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"សញ្ញា ŷ"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"សញ្ញា ź"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"សញ្ញា ż"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"សញ្ញា ž"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"សញ្ញា ſ"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"សញ្ញា ơ"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"សញ្ញា ư"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"សញ្ញា ș"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"សញ្ញា ț"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"សញ្ញា ə"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"សញ្ញា ạ"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"សញ្ញា ả"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"សញ្ញា ấ"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"សញ្ញា ầ"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"សញ្ញា ẩ"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"សញ្ញា ẫ"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"សញ្ញា ậ"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"សញ្ញា ắ"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"សញ្ញា ằ"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"សញ្ញា ẳ"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"សញ្ញា ẵ"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"សញ្ញា ặ"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"សញ្ញា ẹ"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"សញ្ញា ẻ"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"សញ្ញា ẽ"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"សញ្ញា ế"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"សញ្ញា ề"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"សញ្ញា ể"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"សញ្ញា ễ"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"សញ្ញា ệ"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"សញ្ញា ỉ"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"សញ្ញា ị"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"សញ្ញា ọ"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"សញ្ញា ỏ"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"សញ្ញា ố"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"សញ្ញា ồ"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"សញ្ញា ổ"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"សញ្ញា ỗ"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"សញ្ញា ộ"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"សញ្ញា ớ"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"សញ្ញា ờ"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"សញ្ញា ở"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"សញ្ញា ỡ"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"សញ្ញា ợ"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"សញ្ញា ụ"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"សញ្ញា ủ"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"សញ្ញា ứ"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"សញ្ញា ừ"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"សញ្ញា ử"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"សញ្ញា ữ"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"សញ្ញា ự"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"សញ្ញា ỳ"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"សញ្ញា ỵ"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"សញ្ញា ỷ"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"សញ្ញា ỹ"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"សញ្ញា ¡"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"សញ្ញា «"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"សញ្ញា ·"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"សញ្ញា ¹"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"សញ្ញា »"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"សញ្ញា ¿"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"សញ្ញា ‘"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"សញ្ញា ’"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"សញ្ញា ‚"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"សញ្ញា “"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"សញ្ញា ”"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"សញ្ញា †"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"សញ្ញា ‡"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"សញ្ញា ‰"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"សញ្ញា ′"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"សញ្ញា ″"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"សញ្ញា ‹"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"សញ្ញា ›"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"សញ្ញា ⁴"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"សញ្ញា ⁿ"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"សញ្ញា ₱"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"សញ្ញា ℅"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"សញ្ញា →"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"សញ្ញា ↓"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"សញ្ញា ∅"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"សញ្ញា ∆"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"សញ្ញា ≤"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"សញ្ញា ≥"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"សញ្ញា ★"</string>
+</resources>
diff --git a/java/res/values-km-rKH/strings-talkback-descriptions.xml b/java/res/values-km-rKH/strings-talkback-descriptions.xml
index 0f0ac56..e5b7860 100644
--- a/java/res/values-km-rKH/strings-talkback-descriptions.xml
+++ b/java/res/values-km-rKH/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"គ្មាន​អត្ថបទ​​​បាន​បញ្ចូល"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> កែ <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ទៅ​ជា <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> អនុវត្ត​ការ​កែ​ស្វ័យ​ប្រវត្តិ"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"មិន​ស្គាល់​តួអក្សរ"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"និមិត្ត​សញ្ញា​​ច្រើន​ទៀត"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ទីកន្លែង"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"និមិត្តសញ្ញា"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"សញ្ញា​អារម្មណ៍"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"អក្សរ​ធំ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"សញ្ញា I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"សញ្ញា İ"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"មិន​ស្គាល់​និមិត្តសញ្ញា"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"មិន​ស្គាល់​សញ្ញា​អារម្មណ៍"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"តួអក្សរ​ជំនួស​អាច​ប្រើ​បាន"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"បាន​បដិសេធ​តួអក្សរ​ជំនួស"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ការ​ស្នើ​ជំនួស​អាច​ប្រើ​បាន"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"បាន​បដិសេធ​ការ​ស្នើ​ជំនួស"</string>
 </resources>
diff --git a/java/res/values-km-rKH/strings.xml b/java/res/values-km-rKH/strings.xml
index 2cf51d8..c55c036 100644
--- a/java/res/values-km-rKH/strings.xml
+++ b/java/res/values-km-rKH/strings.xml
@@ -28,7 +28,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"លេច​ឡើង​នៅ​​ពេល​ចុច​គ្រាប់​ចុច"</string>
     <string name="general_category" msgid="1859088467017573195">"ទូទៅ"</string>
     <string name="correction_category" msgid="2236750915056607613">"ការ​កែ​អត្ថបទ"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"បញ្ចូល​ដោយ​ប្រើ​កាយវិការ"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"បញ្ចូល​ដោយ​ប្រើ​កាយវិការ​"</string>
     <string name="misc_category" msgid="6894192814868233453">"ជម្រើស​ផ្សេងទៀត"</string>
     <string name="advanced_settings" msgid="362895144495591463">"ការ​កំណត់​កម្រិត​ខ្ពស់"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"ជម្រើស​សម្រាប់​អ្នក​ជំនាញ"</string>
@@ -38,7 +38,7 @@
     <string name="show_language_switch_key_summary" msgid="7343403647474265713">"បង្ហាញ​នៅ​ពេល​ដែល​បើក​ភាសា​បញ្ចូល​ច្រើន"</string>
     <string name="sliding_key_input_preview" msgid="6604262359510068370">"បង្ហាញ​ទ្រនិច​បង្ហាញ​ស្លាយ"</string>
     <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"បង្ហាញ​​សញ្ញា​មើល​​ឃើញ​ខណៈ​ពេល​ដែល​រុញ​ពី​ឆ្វេង ឬ​​គ្រាប់​ចុច​​និមិត្ត​សញ្ញា"</string>
-    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"​សោ​លេចឡើង​បោះបង់​ការ​​ពន្យារពេល"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"​សោ​លេចឡើង​បោះបង់​ការ​​ពន្យារពេល​"</string>
     <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"គ្មាន​ការ​ពន្យារពេល"</string>
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"លំនាំដើម"</string>
     <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> មិល្លី​វិនាទី"</string>
@@ -46,11 +46,10 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"ស្នើ​ឈ្មោះ​ទំនាក់ទំនង"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ប្រើ​ឈ្មោះ​ពី​ទំនាក់ទំនង​សម្រាប់​ការ​​ស្នើ និង​​​កែ"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"ការ​ស្នើ​ផ្ទាល់​ខ្លួន"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"ធ្វើឲ្យ <xliff:g id="APPLICATION_NAME">%s</xliff:g> ប្រសើរ​ឡើង"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"រយៈ​ពេល​ចុច​ដកឃ្លា​ពីរដង"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"ប៉ះ​ដកឃ្លា​ពីរ​​ដង​បញ្ចូល​​​រយៈ​ពេល​ដែល​អនុវត្ត​តាម​ដកឃ្លា"</string>
-    <string name="auto_cap" msgid="1719746674854628252">"ការ​សរសេរ​ជា​អក្សរ​ធំ​​ស្វ័យប្រវត្តិ"</string>
+    <string name="auto_cap" msgid="1719746674854628252">"ការ​សរសេរ​ជា​អក្សរ​ធំ​​ស្វ័យប្រវត្តិ​"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"សរសេរ​ពាក្យ​ដំបូង​​​ជា​អក្សរ​ធំ​​នៃ​ប្រយោគ​នីមួយ​ៗ"</string>
     <string name="edit_personal_dictionary" msgid="3996910038952940420">"វចនានុក្រម​ផ្ទាល់ខ្លួន"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"ផ្នែក​បន្ថែម​វចនានុក្រម"</string>
@@ -61,7 +60,7 @@
     <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"បង្ហាញ​នៅ​ក្នុង​របៀប​បញ្ឈរ"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"លាក់​ជានិច្ច"</string>
     <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"ទប់ស្កាត់​​ពាក្យ​​បំពាន"</string>
-    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"កុំ​ស្នើ​ឲ្យ​ពាក្យ​បំពាន​មាន​សក្ដានុពល"</string>
+    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"កុំ​ស្នើ​ឲ្យ​ពាក្យ​បំពាន​មាន​សក្ដានុពល​"</string>
     <string name="auto_correction" msgid="7630720885194996950">"ការ​កែ​​​ស្វ័យប្រវត្តិ"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"ចន្លោះ​មិន​ឃើញ ​និង​សញ្ញា​​វណ្ណយុត្ត​កែ​ពាក្យ​ដែល​បាន​វាយ​ខុស​ស្វ័យប្រវត្តិ"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"បិទ"</string>
@@ -121,7 +120,7 @@
     <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"ថិរវេលា​​ញ័រ​​ពេល​ចុច​គ្រាប់ចុច"</string>
     <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"កម្រិត​សំឡេង​ពេល​ចុច​គ្រាប់​ចុច"</string>
     <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"អាន​ឯកសារ​វចនានុក្រម​ខាង​ក្រៅ"</string>
-    <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"គ្មាន​ឯកសារ​វចនានុក្រម​នៅ​ក្នុង​ថត​ទាញ​យក"</string>
+    <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"គ្មាន​ឯកសារ​វចនានុក្រម​នៅ​ក្នុង​ថត​ទាញ​យក​​"</string>
     <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ជ្រើស​ឯកសារ​វចនានុក្រម​ ដើម្បី​ដំឡើង"</string>
     <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"ពិត​ជា​ដំឡើង​ឯកសារ​នេះ​សម្រាប់ <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string>
     <string name="error" msgid="8940763624668513648">"មាន​កំហុស"</string>
@@ -148,7 +147,7 @@
     <string name="dictionary_provider_name" msgid="3027315045397363079">"កម្មវិធី​ផ្ដល់​វចនានុក្រម"</string>
     <string name="dictionary_service_name" msgid="6237472350693511448">"សេវាកម្ម​​វចនានុក្រម"</string>
     <string name="download_description" msgid="6014835283119198591">"ព័ត៌មាន​បច្ចុប្បន្នភាព​វចនានុក្រម"</string>
-    <string name="dictionary_settings_title" msgid="8091417676045693313">"ផ្នែក​បន្ថែម​វចនានុក្រម"</string>
+    <string name="dictionary_settings_title" msgid="8091417676045693313">"ផ្នែក​បន្ថែម​វចនានុក្រម​​"</string>
     <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"វចនានុក្រម​​​​​អាច​ប្រើ​បាន"</string>
     <string name="dictionary_settings_summary" msgid="5305694987799824349">"ការ​កំណត់​សម្រាប់​វចនានុក្រម"</string>
     <string name="user_dictionaries" msgid="3582332055892252845">"វចនានុក្រម​​​អ្នក​ប្រើ"</string>
@@ -164,10 +163,10 @@
     <string name="message_updating" msgid="4457761393932375219">"ពិនិត្យមើល​បច្ចុប្បន្នភាព"</string>
     <string name="message_loading" msgid="5638680861387748936">"កំពុង​ផ្ទុក..."</string>
     <string name="main_dict_description" msgid="3072821352793492143">"វចនានុក្រម​ចម្បង"</string>
-    <string name="cancel" msgid="6830980399865683324">"បោះ​បង់"</string>
+    <string name="cancel" msgid="6830980399865683324">"បោះ​បង់​"</string>
     <string name="go_to_settings" msgid="3876892339342569259">"ការ​កំណត់"</string>
     <string name="install_dict" msgid="180852772562189365">"ដំឡើង"</string>
-    <string name="cancel_download_dict" msgid="7843340278507019303">"បោះ​បង់"</string>
+    <string name="cancel_download_dict" msgid="7843340278507019303">"បោះ​បង់​"</string>
     <string name="delete_dict" msgid="756853268088330054">"លុប"</string>
     <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"ភាសា​ដែល​បាន​ជ្រើស​នៅ​លើ​ឧបករណ៍​ចល័ត​មាន​វចនានុក្រម​អាច​ប្រើ​បាន។&lt;br/&gt; យើង​ផ្ដល់​អនុសាសន៍​ឲ្យ &lt;b&gt;ទាញ​យក&lt;/b&gt; វចនានុក្រម​ភាសា <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ដើម្បី​បង្កើន​បទពិសោធន៍​វាយ​បញ្ចូល​របស់​អ្នក។&lt;br/&gt; &lt;br/&gt; ការ​ទាញ​យក​អាច​ចំណាយ​ពេល​ប្រហែល​ពីរ​នាទី​នៅ​តាម 3G។ ការ​គិត​ថ្លៃ​អាច​អនុវត្ត​ប្រសិន​បើ​អ្នក​មិន​ប្រើ &lt;b&gt;ផែនការ​ទិន្នន័យ​គ្មាន​ដែន​កំណត់&lt;/b&gt;.&lt;br/&gt; បើ​អ្នក​មិន​ប្រាកដ​​ថា​ផែនការ​ណា​មួយ​ដែល​អ្នក​មាន យើង​ផ្ដល់​អនុសាសន៍​ឲ្យ​​ភ្ជាប់​វ៉ាយហ្វាយ ដើម្បី​ចាប់ផ្ដើម​ទាញ​យក​ដោយ​ស្វ័យ​ប្រវត្តិ។&lt;br/&gt; &lt;br/&gt; ជំនួយ៖ អ្នក​អាច​ទាញ​យក និង​លុប​វចនានុក្រម​ដោយ​ចូល​ទៅ​ &lt;b&gt;ភាសា &amp; ការ​បញ្ចូល&lt;/b&gt; នៅ​ក្នុង​ម៉ឺនុយ &lt;b&gt;ការ​កំណត់&lt;/b&gt; សម្រាប់​ឧបករណ៍​ចល័ត។"</string>
     <string name="download_over_metered" msgid="1643065851159409546">"ទាញ​យក​ឥឡូវ​នេះ (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> មេកាបៃ)"</string>
@@ -185,7 +184,7 @@
     <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"ពាក្យ៖"</string>
     <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"ផ្លូវកាត់​៖"</string>
     <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"ភាសា៖"</string>
-    <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"វាយ​បញ្ចូល​ពាក្យ"</string>
+    <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"វាយ​បញ្ចូល​ពាក្យ​"</string>
     <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ផ្លូវកាត់​ជា​ជម្រើស"</string>
     <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"កែ​ពាក្យ"</string>
     <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"កែ"</string>
diff --git a/java/res/values-lo-rLA/strings-action-keys.xml b/java/res/values-lo-rLA/strings-action-keys.xml
index 2399305..e1cd913 100644
--- a/java/res/values-lo-rLA/strings-action-keys.xml
+++ b/java/res/values-lo-rLA/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"ກ່ອນໜ້າ"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Done"</string>
     <string name="label_send_key" msgid="482252074224462163">"ສົ່ງ"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"ຊອກຫາ"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"ຢຸດຊົ່ວຄາວ"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"ລໍຖ້າ"</string>
 </resources>
diff --git a/java/res/values-lo-rLA/strings-emoji-descriptions.xml b/java/res/values-lo-rLA/strings-emoji-descriptions.xml
index 83a702e..0747fa6 100644
--- a/java/res/values-lo-rLA/strings-emoji-descriptions.xml
+++ b/java/res/values-lo-rLA/strings-emoji-descriptions.xml
@@ -210,7 +210,7 @@
     <string name="spoken_emoji_1F330" msgid="3115760035618051575">"​ລູກ​ເກົາ​ລັດ"</string>
     <string name="spoken_emoji_1F331" msgid="5658888205290008691">"​ກ້າ​ໄມ້"</string>
     <string name="spoken_emoji_1F332" msgid="2935650450421165938">"ຕົ້ນ​ໄມ້​ບໍ່​ຜັດ​ໃບ"</string>
-    <string name="spoken_emoji_1F333" msgid="5898847427062482675">"​ຕົ້ນ​ໄມ້​ຜັດໃບ"</string>
+    <string name="spoken_emoji_1F333" msgid="5898847427062482675">"​ຕົ້ນ​ໄມ້​ຜັດໃບ​"</string>
     <string name="spoken_emoji_1F334" msgid="6183375224678417894">"​ຕົ້ນ​ປາມ"</string>
     <string name="spoken_emoji_1F335" msgid="5352418412103584941">"​ກະ​ບອງ​ເພັດ"</string>
     <string name="spoken_emoji_1F337" msgid="3839107352363566289">"​ທິວ​ລິບ"</string>
@@ -450,7 +450,7 @@
     <string name="spoken_emoji_1F458" msgid="5704243858031107692">"​ກິ​ໂມ​ໂນ"</string>
     <string name="spoken_emoji_1F459" msgid="3553148747050035251">"​ບິ​ກີ​ນີ"</string>
     <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"​ເສື້ອ​ຜ້າ​ຜູ່​ຍິງ"</string>
-    <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"ກະ​ເປົາ"</string>
+    <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"ກະ​ເປົາ​"</string>
     <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"ກະ​ເປົາ"</string>
     <string name="spoken_emoji_1F45D" msgid="812176504300064819">"​ກະ​ເປົາ"</string>
     <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"​ເກີບ​ຜູ່​ຊາຍ"</string>
diff --git a/java/res/values-lo-rLA/strings-letter-descriptions.xml b/java/res/values-lo-rLA/strings-letter-descriptions.xml
new file mode 100644
index 0000000..ecc0b7a
--- /dev/null
+++ b/java/res/values-lo-rLA/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ໂຕ​ບົ່ງ​ຊີ້​ລຳ​ດັບ​ເພດ​ຍິງ"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"ສັນຍາລັກໄມໂຄຣ"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"​ໂຕ​ບົ່ງ​ຊີ້​ລຳ​ດັບ​ເພດ​ຊາຍ"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"​​ຈ້ຳ​ເມັດ​ທາງ​ກາງ"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"​ເຄື່ອງ​ໝາຍ​ວົງ​ຢືມ​ຊ້າຍ"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"​ເຄື່ອງ​ໝາຍ​ວົງ​ຢືມ​ຂວາ​"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"​ເຄື່ອງ​ໝາຍ​ຕໍ່​ໄມລ໌"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Single left-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Single right-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"ໂຕ​ຍົກ​ເລກ​ສີ່"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"ໂຕ​ຍົກ​ n ໂຕ​ນ້ອຍ"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"ເຄື່ອງ​ໝາຍເປ​ໂຊ"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"CARE OF"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"​ລູກ​ສອນ​ຊີ້​ໄປ​ຂວາ"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"ລູກ​ສອນ​ຊີ້​ລົງ"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"​ຊຸດ​ຫວ່າງ​ເປົ່າ"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"ເພີ່ມ"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"​ໜ້ອຍກວ່າ ຫຼື​ເທົ່າ​ກັບ"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"ຫຼາຍກວ່າ ຫຼື​ເທົ່າ​ກັບ"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"​ດາວ​ດຳ"</string>
+</resources>
diff --git a/java/res/values-lo-rLA/strings-talkback-descriptions.xml b/java/res/values-lo-rLA/strings-talkback-descriptions.xml
index c6140fd..187b63a 100644
--- a/java/res/values-lo-rLA/strings-talkback-descriptions.xml
+++ b/java/res/values-lo-rLA/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"ບໍ່ມີ​ການໃສ່​ຂໍ້ຄວາມ"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ແກ້​ໄຂ​ <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ເປັນ <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ດຳ​ເນີນ​ການ​ແກ້​ໄຂ​ອັດ​ຕະ​ໂນ​ມັດ"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"​ໂຕ​ອັກ​ສອນ​ທີ່ບໍ່​ຮູ້​ຈັກ"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"​ສັນ​ຍາ​ລັກ​ເພີ່ມ​ເຕີມ"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ສະຖານທີ່"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"ສັນຍາລັກ"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"​ອີ​ໂມ​ຕິ​ຄອນ"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"ໂຕ​ພິມ​ໃຫຍ່ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"ໂຕ​ພິມ​ໃຫຍ່ I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"​ໂຕພິມ​ໃຫຍ່ I ມີ​ຈ້ຳ​ເມັດ​ຢູ່​ເທິງ"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"ສັນ​ຍາ​ລັກ​ທີ່ບໍ່​ຮູ້​ຈັກ"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"ອີ​ໂມ​ຈິ​ທີ່ບໍ່​ຮູ້​ຈັກ"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"​ມີ​ໂຕ​ອັກ​ສອນ​ສຳ​ຮອງ​ໃຫ້​ເລືອກ"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"​ປິດ​ໂຕ​ອັກ​ສອນ​ສຳ​ຮອງ​ແລ້ວ"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"​ມີ​ຄຳ​ແນະ​ນຳ​ສຳ​ຮອງ​ໃຫ້​ເລືອກ"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"​ປິດ​ການ​ແນະ​ນຳ​ສຳ​ຮອງ​ແລ້ວ"</string>
 </resources>
diff --git a/java/res/values-lo-rLA/strings.xml b/java/res/values-lo-rLA/strings.xml
index c8ef7ac..8947a8b 100644
--- a/java/res/values-lo-rLA/strings.xml
+++ b/java/res/values-lo-rLA/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"ແນະນຳລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ໃຊ້ຊື່ຈາກລາຍຊື່ຜູ່ຕິດຕໍ່ສຳລັບການແນະນຳ ແລະ ການຊ່ວຍແກ້ຄຳ"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"ຄຳແນະນຳຕາມການນຳໃຊ້ຂອງທ່ານ"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"ປັບ​ປຸງ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"ຍະຫວ່າງສອງເທື່ອເພື່ອໃສ່ຈ້ຳເມັດ"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"ກົດທີ່ປຸ່ມຍະຫວ່າງສອງເທື່ອເພື່ອໃສ່ຈ້ຳເມັດແລ້ວຕາມດ້ວຍການຍະຫວ່າງ"</string>
     <string name="auto_cap" msgid="1719746674854628252">"ເຮັດໂຕພິມໃຫຍ່ອັດຕະໂນມັດ"</string>
diff --git a/java/res/values-mn-rMN/strings-action-keys.xml b/java/res/values-mn-rMN/strings-action-keys.xml
index a855386..8ebb5bb 100644
--- a/java/res/values-mn-rMN/strings-action-keys.xml
+++ b/java/res/values-mn-rMN/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Өмнөх"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Дууссан"</string>
     <string name="label_send_key" msgid="482252074224462163">"Илгээх"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Хайлт"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Түр зогсоох"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Хүлээх"</string>
 </resources>
diff --git a/java/res/values-mn-rMN/strings-letter-descriptions.xml b/java/res/values-mn-rMN/strings-letter-descriptions.xml
new file mode 100644
index 0000000..b8f8d85
--- /dev/null
+++ b/java/res/values-mn-rMN/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Эм хүйсийн дугаар заагч"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Микро тэмдэг"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Эр хүйсийн дугаар заагч"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Хурц S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"А, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"А, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"А, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"А, долгионтой"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"А, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, дээрээ цагирагтай"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, залгагдсан"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Зураастай ди"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, долгионтой"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, долгионтой"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, хөндлөн зураастай"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Гэдэстэй багана"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, хөндлөн малгайтай"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"А, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"А, сүүлтэй"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"С, дээрээ цэгтэй"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, хөндлөн зураастай"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, хөндлөн малгайтай"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, дээрээ цэгтэй"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, сүүлтэй"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, дээрээ цэгтэй"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, хөндлөн зураастай"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, долгионтой"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, хөндлөн малгайтай"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, сүүлтэй"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Цэггүй I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, залгагдсан"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, дунд цэгтэй"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, хөндлөн зураастай"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N,"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Инг"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, хөндлөн малгайтай"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, давхар баруун малгайтай"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, залгагдсан"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, хөндлөн зураастай"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, долгионтой"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, хөндлөн малгайтай"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, дээрээ цагирагтай"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, давхар баруун малгайтай"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, сүүлтэй"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, дээрээ цэгтэй"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Урт S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, эвэртэй"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, эвэртэй"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, доор таслалтай"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, доор таслалтай"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"А, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"А, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, дээвэр болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"А, дээвэр болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"А, дээвэр болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"А, дээвэр болон долгионтой"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"А, дээвэр болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"А, тавган болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"А, тавган болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"А, тавган болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"А, тавган болон долгионтой"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"А, тавган болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, долгионтой"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, дээвэр болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, дээвэр болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, дээвэр болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, дээвэр болон долгионтой"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, дээвэр болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, дээвэр болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, дээвэр болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, дээвэр болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, дээвэр болон долгионтой"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, дээвэр болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, эвэр болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, эвэр болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, эвэр болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, эвэр болон долгионтой"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, эвэр болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, эвэр болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, эвэр болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, эвэр болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, эвэр болон долгионтой"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, эвэр болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, долгионтой"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Урвуу анхаарлын тэмдэг"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Зүүн заасан давхар хашилт"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Дунд цэг"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Мөрний дээрх нэг"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Баруун заасан давхар хашилт"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Урвуу асуултын тэмдэг"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Зүүн дан хашилт"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Баруун дан хашилт"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Дан доогуур-9 хашилт"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Зүүн давхар хашилт"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Баруун давхар хашилт"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Чинжаал"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Давхар чинжаал"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Нэг мильд тэмдэг"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Штрих"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Давхар штрих"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Зүүн заасан дан хашилт"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Баруун заасан дан хашилт"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Мөрний дээрх дөрөв"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Мөрний дээрх жижиг латин n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Песо тэмдэг"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Анхааралд"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Баруун сум"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Доош сум"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Хоосон олонлог"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Өсөлт"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Бага буюу тэнцүү"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Их буюу тэнцүү"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Хар од"</string>
+</resources>
diff --git a/java/res/values-mn-rMN/strings-talkback-descriptions.xml b/java/res/values-mn-rMN/strings-talkback-descriptions.xml
index 1c1e6e7..d2c583e 100644
--- a/java/res/values-mn-rMN/strings-talkback-descriptions.xml
+++ b/java/res/values-mn-rMN/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Текст оруулаагүй"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> нь <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-г <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> руу залруулна"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> авто-залруулалт хийдэг"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Үл мэдэгдэх тэмдэгт"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Шифт"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Өөр тэмдэгтүүд"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Шифт"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Газар"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Симбол"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Эмотикон"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Том <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Том I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Том I, дээрээ цэгтэй"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Үл мэдэгдэх симбол"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Үл мэдэгдэх эможи"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Бусад тэмдэгтүүд ашиглах боломжтой"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Бусад тэмдэгтүүдийг хаагдсан"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Бусад санал болголтууд ашиглах боломжтой"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Бусад санал болголтууд хаагдсан"</string>
 </resources>
diff --git a/java/res/values-mn-rMN/strings.xml b/java/res/values-mn-rMN/strings.xml
index bfce751..67e8b4e 100644
--- a/java/res/values-mn-rMN/strings.xml
+++ b/java/res/values-mn-rMN/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Харилцагчдын нэрс санал болгох"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Санал болгох, залруулахда Харилцагчдын нэрсээс ашиглах"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Хувийн тохиргоотой зөвлөмжүүд"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> сайжруулах"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Давхар зайтай цэг"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Ардаа зайтай цэг оруулахын тулд Зай авах дээр давхар товшино уу"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Автоматаар томруулах"</string>
diff --git a/java/res/values-pt-rPT/strings-action-keys.xml b/java/res/values-pt-rPT/strings-action-keys.xml
index 1b5921f..73a6c49 100644
--- a/java/res/values-pt-rPT/strings-action-keys.xml
+++ b/java/res/values-pt-rPT/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Ant."</string>
     <string name="label_done_key" msgid="7564866296502630852">"Conc."</string>
     <string name="label_send_key" msgid="482252074224462163">"Env."</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Pesquisar"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Pausa"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Esp."</string>
 </resources>
diff --git a/java/res/values-pt-rPT/strings-letter-descriptions.xml b/java/res/values-pt-rPT/strings-letter-descriptions.xml
new file mode 100644
index 0000000..377b157
--- /dev/null
+++ b/java/res/values-pt-rPT/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicador ordinal feminino"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Sinal de micro"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicador ordinal masculino"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S curto"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, agudo"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circunflexo"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, til"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diérese"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anel sobreposto"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligadura"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilha"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, agudo"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circunflexo"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diérese"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, agudo"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circunflexo"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diérese"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, til"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, agudo"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circunflexo"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, til"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diérese"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, traço"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, agudo"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circunflexo"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diérese"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, agudo"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diérese"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, mácron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, agudo"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circunflexo"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, ponto sobreposto"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, traço"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, mácron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, ponto sobreposto"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circunflexo"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, ponto sobreposto"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilha"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circunflexo"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, traço"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, til"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, mácron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sem ponto"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligadura"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circunflexo"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilha"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, agudo"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilha"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, ponto intermédio"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, traço"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, agudo"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilha"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedido de apóstrofe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, mácron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, duplo agudo"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligadura"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, agudo"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilha"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, agudo"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circunflexo"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilha"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilha"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, traço"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, til"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, mácron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anel sobreposto"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, duplo agudo"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circunflexo"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circunflexo"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, agudo"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, ponto sobreposto"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S longo"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, chifre"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, chifre"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, vírgula subposta"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, vírgula subposta"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, ponto subposto"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circunflexo e agudo"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circunflexo e grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circunflexo e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circunflexo e til"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circunflexo e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve e agudo"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve e grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve e til"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, ponto subposto"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, til"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circunflexo e agudo"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circunflexo e grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circunflexo e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circunflexo e til"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circunflexo e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, ponto subposto"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, ponto subposto"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circunflexo e agudo"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circunflexo e grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circunflexo e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circunflexo e til"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circunflexo e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, chifre e agudo"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, chifre e grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, chifre e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, chifre e til"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, chifre e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, ponto subposto"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, chifre e agudo"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, chifre e grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, chifre e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, chifre e til"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, chifre e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, ponto subposto"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, til"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Ponto de exclamação invertido"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Aspas angulares duplas esquerdas"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Ponto intermédio"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Um sobrescrito"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Aspas angulares duplas direitas"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Ponto de interrogação invertido"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Aspa simples esquerda"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Aspa simples direita"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Aspa simples subposta"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Aspas duplas esquerdas"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Aspas duplas direitas"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Adaga"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Adaga dupla"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Sinal de permilagem"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Plica"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Plica dupla"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Aspa angular simples esquerda"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Aspa angular simples direita"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Quatro sobrescrito"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"N latino minúsculo sobrescrito"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Sinal de peso"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Ao cuidado de"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Seta para a direita"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Seta para baixo"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conjunto vazio"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Delta"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menor do que ou igual a"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Maior do que ou igual a"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrela negra"</string>
+</resources>
diff --git a/java/res/values-pt-rPT/strings-talkback-descriptions.xml b/java/res/values-pt-rPT/strings-talkback-descriptions.xml
index 91d187e..30bbd3f 100644
--- a/java/res/values-pt-rPT/strings-talkback-descriptions.xml
+++ b/java/res/values-pt-rPT/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nenhum texto digitado"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> para <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> executa a correção automática"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Caráter desconhecido"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Mais símbolos"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Locais"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Símbolos"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Ícones expressivos"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> maiúsculo"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"I maiúsculo"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"I maiúsculo, ponto sobreposto"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbolo desconhecido"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji desconhecido"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Os carateres alternativos estão disponíveis"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Os carateres alternativos são ignorados"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"As sugestões alternativas estão disponíveis"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"As sugestões alternativas são ignoradas"</string>
 </resources>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 7db5ccf..2129588 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sugerir nomes de Contactos"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizar nomes dos Contactos para sugestões e correções"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Sugestões personalizadas"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Melhorar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Ponto de espaço duplo"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Tocar duas vezes na barra espaço insere ponto seguido de espaço"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Letras maiúsculas automáticas"</string>
diff --git a/java/res/values-ro/strings-action-keys.xml b/java/res/values-ro/strings-action-keys.xml
index bee4b12..1a15415 100644
--- a/java/res/values-ro/strings-action-keys.xml
+++ b/java/res/values-ro/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Înap."</string>
     <string name="label_done_key" msgid="7564866296502630852">"Gata"</string>
     <string name="label_send_key" msgid="482252074224462163">"Trim."</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Căutați"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Pauză"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Așt."</string>
 </resources>
diff --git a/java/res/values-ro/strings-letter-descriptions.xml b/java/res/values-ro/strings-letter-descriptions.xml
new file mode 100644
index 0000000..46cbd1a
--- /dev/null
+++ b/java/res/values-ro/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicator de ordine feminin"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Semnul miu"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicator de ordine masculin"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S ascuțit"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, accent grav"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, accent circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tildă"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, semn diacritic"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, cerc deasupra"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligatură"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, sedilă"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, accent grav"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, accent circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, semn diacritic"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, accent grav"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, accent circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, semn diacritic"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tildă"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, accent grav"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, accent circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tildă"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, semn diacritic"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, tăiat cu linie"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, accent grav"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, accent circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, semn diacritic"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, semn diacritic"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, căciulă"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, accent ascuțit"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, accent circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punct deasupra"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, tăiat cu linie"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, căciulă"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punct deasupra"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, accent circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, căciulă"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punct deasupra"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, sedilă"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, accent circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, tăiat cu linie"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tildă"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, căciulă"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I fără punct"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligatură"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, accent circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, sedilă"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, accent ascuțit"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, sedilă"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punct la mijloc"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, tăiat cu linie"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, accent ascuțit"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, sedilă"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedat de apostrof"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, căciulă"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, accent ascuțit dublu"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligatură"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, accent ascuțit"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, sedilă"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, accent ascuțit"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, accent circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, sedilă"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, sedilă"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, tăiat cu linie"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tildă"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, căciulă"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, cerc deasupra"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, accent ascuțit dublu"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, accent circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, accent circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, accent ascuțit"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punct deasupra"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S lung"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, corn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, corn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, virgulă dedesubt"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, virgulă dedesubt"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, accent circumflex și ascuțit"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, accent circumflex și grav"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, accent circumflex și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, accent circumflex și tildă"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, accent circumflex și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, căciulă și accent ascuțit"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, căciulă și accent grav"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, căciulă și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, căciulă și tildă"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, căciulă și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tildă"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, accent circumflex și ascuțit"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, accent circumflex și grav"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, accent circumflex și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, accent circumflex și tildă"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, accent circumflex și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, accent circumflex și ascuțit"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, accent circumflex și grav"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, accent circumflex și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, accent circumflex și tildă"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, accent circumflex și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, corn și accent ascuțit"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, corn și accent grav"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, corn și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, corn și tildă"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, corn și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, corn și accent ascuțit"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, corn și accent grav"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, corn și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, corn și tildă"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, corn și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, accent grav"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tildă"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Semnul exclamării inversat"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Ghilimele duble la stânga"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Punct la mijloc"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Unu exponent"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Ghilimele duble la dreapta"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Semnul întrebării inversat"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ghilimele simple la stânga"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Ghilimele simple la dreapta"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Ghilimele simple jos"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ghilimele duble la stânga"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Ghilimele duble la dreapta"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Cruce"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Cruce dublă"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Semnul la mie"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prim"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Prim dublu"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ghilimele simple la stânga"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Ghilimele simple la dreapta"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Patru exponent"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"n latin exponent"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Semnul peso"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"În atenția"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Săgeată la dreapta"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Săgeată în jos"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Zero barat"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Mai mic sau egal cu"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Mai mare sau egal cu"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Stea neagră"</string>
+</resources>
diff --git a/java/res/values-ro/strings-talkback-descriptions.xml b/java/res/values-ro/strings-talkback-descriptions.xml
index 6e5db4d..52885c8 100644
--- a/java/res/values-ro/strings-talkback-descriptions.xml
+++ b/java/res/values-ro/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nu a fost introdus text"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corectează <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> cu <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> efectuează corectare automată"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Caracter necunoscut"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Mai multe simboluri"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Locații"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simboluri"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticonuri"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> mare"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"I mare"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"I mare, punct deasupra"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Simbol necunoscut"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji necunoscut"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Sunt disponibile caracterele alternative"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"S-au închis caracterele alternative"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Sunt disponibile sugestiile alternative"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"S-au închis sugestiile alternative"</string>
 </resources>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index 628b1a2..8e1bb1c 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sugeraţi nume din Agendă"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizaţi numele din Agendă pentru sugestii şi corecţii"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Sugestii personalizate"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Îmbunătățiți <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Inserează punct spațiu"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dubla atingere a barei de spațiu inserează punct urmat de spațiu"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Scriere automată cu majuscule"</string>
diff --git a/java/res/values-sk/strings-action-keys.xml b/java/res/values-sk/strings-action-keys.xml
index ffc5be2..84e1c31 100644
--- a/java/res/values-sk/strings-action-keys.xml
+++ b/java/res/values-sk/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Pred."</string>
     <string name="label_done_key" msgid="7564866296502630852">"OK"</string>
     <string name="label_send_key" msgid="482252074224462163">"Posl."</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Hľadať"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Pauza"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Čakať"</string>
 </resources>
diff --git a/java/res/values-sk/strings-letter-descriptions.xml b/java/res/values-sk/strings-letter-descriptions.xml
new file mode 100644
index 0000000..e6bba4a
--- /dev/null
+++ b/java/res/values-sk/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indikátor radovej číslovky ženského rodu"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Znak mikro"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indikátor radovej číslovky mužského rodu"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Ostré S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A s dĺžňom"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A s vokáňom"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A s vlnovkou"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A s krúžkom"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Ligatúra písmen A, E"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E s dĺžňom"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E s vokáňom"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I s dĺžňom"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I s vokáňom"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N s vlnovkou"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O s dĺžňom"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O s vokáňom"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O s vlnovkou"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Prečiarknuté O"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U s dĺžňom"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U s vokáňom"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y s dĺžňom"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A s vodorovnou čiarkou"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A s oblúčikom"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A s nožičkou"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C s dĺžňom"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C s vokáňom"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C s bodkou nad písmenom"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C s mäkčeňom"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D s mäkčeňom"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"Prečiarknuté D"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E s vodorovnou čiarkou"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E s oblúčikom"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E s bodkou nad písmenom"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E s nožičkou"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E s mäkčeňom"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G s vokáňom"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G s oblúčikom"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G s bodkou nad písmenom"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H s vokáňom"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"Prečiarknuté H"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I s vlnovkou"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I s vodorovnou čiarkou"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I s oblúčikom"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I s nožičkou"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I bez bodky"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Ligatúra písmen I, J"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J s vokáňom"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L s dĺžňom"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L s mäkčeňom"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L s bodkou uprostred"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"Prečiarknuté L"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N s dĺžňom"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N s mäkčeňom"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N s apostrofom na začiatku"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O s vodorovnou čiarkou"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O s oblúčikom"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O s dvoma dĺžňami"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Ligatúra písmen O, E"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R s dĺžňom"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R s mäkčeňom"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S s dĺžňom"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S s vokáňom"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S s mäkčeňom"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T s mäkčeňom"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"Prečiarknuté T"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U s vlnovkou"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U s vodorovnou čiarkou"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U s oblúčikom"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U s krúžkom"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U s dvoma dĺžňami"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U s nožičkou"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W s vokáňom"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y s vokáňom"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z s dĺžňom"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z s bokou nad písmenom"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z s mäkčeňom"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Dlhé S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O s rohom"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U s rohom"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S s čiarkou pod písmenom"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T s čiarkou pod písmenom"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A s vokáňom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A s vokáňom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A s vokáňom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A s vokáňom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A s vokáňom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A s oblúčikom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A s oblúčikom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A s oblúčikom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A s oblúčikom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A s oblúčikom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E s vlnovkou"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E s vokáňom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E s vokáňom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E s vokáňom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E s vokáňom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E s vokáňom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O s vokáňom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O s vokáňom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O s vokáňom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O s vokáňom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O s vokáňom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O s rohom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O s rohom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O s rohom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O s rohom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O s rohom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U s rohom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U s rohom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U s rohom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U s rohom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U s rohom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y s vlnovkou"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Obrátený výkričník"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Lomené ľavé dvojité úvodzovky"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Bodka uprostred"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Jednotka v hornom indexe"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Lomené pravé dvojité úvodzovky"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Obrátený otáznik"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ľavé jednoduché úvodzovky"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Pravé jednoduché úvodzovky"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Dolné jednoduché úvodzovky"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ľavé dvojité úvodzovky"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Pravé dvojité úvodzovky"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Krížik"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dvojitý krížik"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Znak promile"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Indexová čiarka"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dvojitá indexová čiarka"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Jednoduché ľavé úvodzovky"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Jednoduché pravé úvodzovky"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Štvorka v hornom indexe"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Latinka – malé písmeno n v hornom indexe"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Znak pesa"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Malé písmená c a o oddelené lomkou"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Šípka vpravo"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Šípka nadol"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Prázdna množina"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Prírastok"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menšie alebo rovné ako"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Väčšie alebo rovné ako"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Čierna hviezda"</string>
+</resources>
diff --git a/java/res/values-sk/strings-talkback-descriptions.xml b/java/res/values-sk/strings-talkback-descriptions.xml
index 9fde012..2cd094e 100644
--- a/java/res/values-sk/strings-talkback-descriptions.xml
+++ b/java/res/values-sk/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nie je zadaný žiadny text"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"Klávesom <xliff:g id="KEY_NAME">%1$s</xliff:g> opravíte slovo <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Klávesom <xliff:g id="KEY_NAME">%1$s</xliff:g> spustíte automatické opravy"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Neznámy znak"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Ďalšie symboly"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Miesta"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symboly"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikony"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Veľké písmeno – <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Veľké I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Veľké I s bodkou nad písmenom"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Neznámy symbol"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Neznámy symbol Emodži"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatívne znaky sú dostupné"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatívne znaky boli zrušené"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatívne návrhy sú dostupné"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatívne návrhy boli zrušené"</string>
 </resources>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index f439bd0..023193b 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Navrhnúť mená kontaktov"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Používať mená z Kontaktov na návrhy a opravy"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Prispôsobené návrhy"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Zlepšiť aplikáciu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Bodka s medzerou"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dvojitým klepnutím na medzerník vložíte bodku a medzeru."</string>
     <string name="auto_cap" msgid="1719746674854628252">"Veľké písmená automaticky"</string>
diff --git a/java/res/values-uk/strings-action-keys.xml b/java/res/values-uk/strings-action-keys.xml
index 8b71498..206fcf0 100644
--- a/java/res/values-uk/strings-action-keys.xml
+++ b/java/res/values-uk/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Назад"</string>
     <string name="label_done_key" msgid="7564866296502630852">"ОК"</string>
     <string name="label_send_key" msgid="482252074224462163">"Слати"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Пошук"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Пауза"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Ждати"</string>
 </resources>
diff --git a/java/res/values-uk/strings-letter-descriptions.xml b/java/res/values-uk/strings-letter-descriptions.xml
new file mode 100644
index 0000000..1199771
--- /dev/null
+++ b/java/res/values-uk/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Індикатор порядкового числівника жіночого роду"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Знак мікро"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Індикатор порядкового числівника чоловічого роду"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Есцет"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, гравіс"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, акут"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, циркумфлекс"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, тильда"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, трема"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, кільце вгорі"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, лігатура"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, седиль"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, гравіс"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, акут"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, циркумфлекс"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, трема"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, гравіс"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, акут"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, циркумфлекс"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, трема"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Ет"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, тильда"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, гравіс"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, акут"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, циркумфлекс"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, тильда"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, трема"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, риска"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, гравіс"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, акут"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, циркумфлекс"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, трема"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, акут"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Торн"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, трема"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, макрон"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, бреве"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, хвостик"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, акут"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, циркумфлекс"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, крапка вгорі"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, гачек"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, гачек"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, риска"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, макрон"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, бреве"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, крапка вгорі"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, хвостик"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, гачек"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, циркумфлекс"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, бреве"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, крапка вгорі"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, седиль"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, циркумфлекс"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, риска"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, тильда"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, макрон"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, бреве"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, хвостик"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I без крапки"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, лігатура"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, циркумфлекс"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, седиль"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, акут"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, седіль"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, гачек"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, інтерпункт"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, риска"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, акут"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, седиль"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, гачек"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, після апострофа"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Енг"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, макрон"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, бреве"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, подвійний акут"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, лігатура"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, акут"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, седиль"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, гачек"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, акут"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, циркумфлекс"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, седиль"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, гачек"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, седиль"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, гачек"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, риска"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, тильда"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, макрон"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, бреве"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, кільце вгорі"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, подвійний акут"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, хвостик"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, циркумфлекс"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, циркумфлекс"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, акут"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, крапка вгорі"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, гачек"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Довгий звук S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, ріг"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, ріг"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, кома внизу"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, кома внизу"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, крапка внизу"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, гачок угорі"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, циркумфлекс і акут"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, циркумфлекс і гравіс"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, циркумфлекс і гачок угорі"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, циркумфлекс і тильда"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, циркумфлекс і крапка внизу"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, бреве й акут"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, бреве та гравіс"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, бреве та гачок угорі"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, бреве та тильда"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, бреве та крапка внизу"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, крапка внизу"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, гачок угорі"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, тильда"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, циркумфлекс і акут"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, циркумфлекс і гравіс"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, циркумфлекс і гачок угорі"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, циркумфлекс і тильда"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, циркумфлекс і крапка внизу"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, гачок угорі"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, крапка внизу"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, крапка внизу"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, гачок угорі"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, циркумфлекс і акут"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, циркумфлекс і гравіс"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, циркумфлекс і гачок угорі"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, циркумфлекс і тильда"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, циркумфлекс і крапка внизу"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, ріг і акут"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, ріг і гравіс"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, ріг і гачок угорі"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, ріг і тильда"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, ріг і крапка внизу"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, крапка внизу"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, гачок угорі"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, ріг і акут"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, ріг і гравіс"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, ріг і гачок угорі"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, ріг і тильда"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, ріг і крапка внизу"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, гравіс"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, крапка внизу"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, гачок угорі"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, тильда"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Перевернутий знак оклику"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Ліві подвійні кутові лапки"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Інтерпункт"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Верхній індекс, один"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Праві подвійні кутові лапки"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Перевернутий знак запитання"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ліві одинарні лапки"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Праві одинарні лапки"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Ліві нижні одинарні лапки"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ліві подвійні лапки"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Праві подвійні лапки"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Хрестик"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Подвійний хрестик"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Знак проміле"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Штрих"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Подвійний штрих"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ліві одинарні кутові лапки"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Праві одинарні кутові лапки"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Верхній індекс, чотири"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Верхній індекс, мала латинська літера n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Знак песо"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Через"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Стрілка праворуч"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Стрілка вниз"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Порожня множина"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Крок"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Менше або дорівнює"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Більше або дорівнює"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Чорна зірка"</string>
+</resources>
diff --git a/java/res/values-uk/strings-talkback-descriptions.xml b/java/res/values-uk/strings-talkback-descriptions.xml
index e4df115..80e4710 100644
--- a/java/res/values-uk/strings-talkback-descriptions.xml
+++ b/java/res/values-uk/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Текст не введено"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> виправляє слово \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" на \"<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>\""</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> автоматично виправляє"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Невідомий символ"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Більше символів"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Клавіша Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Місця"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Символи"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Смайли"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Велика <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Велика I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Велика I, крапка вгорі"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Невідомий символ"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Невідомий смайл Emoji"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Доступні альтернативні символи"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Альтернативні символи відхилено"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Доступні альтернативні пропозиції"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Альтернативні пропозиції відхилено"</string>
 </resources>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 1d146a5..a7fcfd4 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Пропон. імена контактів"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Використ. імена зі списку контактів для пропозицій і виправлень"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Персональні пропозиції"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Покращувати додаток <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Крапка подвійним пробілом"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Подвійне натискання пробілу вставляє крапку з пробілом після неї"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Авто викор. вел. літер"</string>
diff --git a/java/res/values-vi/strings-action-keys.xml b/java/res/values-vi/strings-action-keys.xml
index 16b7c95..3c40608 100644
--- a/java/res/values-vi/strings-action-keys.xml
+++ b/java/res/values-vi/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Trước"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Xong"</string>
     <string name="label_send_key" msgid="482252074224462163">"Gửi"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Tìm kiếm"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Tdừng"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Đợi"</string>
 </resources>
diff --git a/java/res/values-vi/strings-letter-descriptions.xml b/java/res/values-vi/strings-letter-descriptions.xml
new file mode 100644
index 0000000..74f199f
--- /dev/null
+++ b/java/res/values-vi/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Chỉ báo thứ tự giống cái"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Ký hiệu micrô"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Chỉ báo thứ tự giống đực"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, dấu huyền"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, dấu sắc"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, dấu mũ"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, dấu ngã"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, dấu nhẫn phía trên"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, dấu gạch nối"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, dấu huyền"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, dấu sắc"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, dấu mũ"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, dấu huyền"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, dấu sắc"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, dấu mũ"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, dấu ngã"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, dấu huyền"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, dấu sắc"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, dấu mũ"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, dấu ngã"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, nét gạch"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, dấu huyền"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, dấu sắc"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, dấu mũ"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, dấu sắc"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Dấu móc"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, sự làm dấu"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, dấu ngân"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, một cái đuôi nhỏ"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, dấu sắc"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, dấu mũ"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dấu chấm phía trên"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, nét gạch"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, sự làm dấu"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, dấu ngân"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dấu chấm phía trên"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, một cái đuôi nhỏ"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, dấu mũ"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, dấu ngân"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dấu chấm phía trên"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, dấu mũ"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, nét gạch"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, dấu ngã"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, sự làm dấu"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, dấu ngân"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, một cái đuôi nhỏ"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I không dấu chấm"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, dấu gạch nối"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, dấu mũ"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, dấu sắc"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, chấm ở giữa"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, nét gạch"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, dấu sắc"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, theo sau dấu móc lửng"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, sự làm dấu"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, dấu ngân"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, hai dấu sắc"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, dấu gạch nối"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, dấu sắc"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, dấu sắc"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, dấu mũ"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, nét gạch"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, dấu ngã"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, sự làm dấu"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, dấu ngân"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, dấu nhẫn ở trên"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, hai dấu sắc"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, một cái đuôi nhỏ"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, dấu mũ"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, dấu mũ"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, dấu sắc"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dấu chấm phía trên"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S dài"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, dấu móc"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, dấu móc"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, dấu phẩy phía dưới"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, dấu phẩy phía dưới"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Âm Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, dấu móc phía trên"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, dấu mũ và dấu sắc"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, dấu mũ và dấu huyền"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, dấu mũ và móc phía trên"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, dấu mũ và dấu ngã"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, dấu mũ và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, dấu ngân và dấu sắc"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, dấu ngân và dấu huyền"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, dấu ngân và móc phía trên"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, dấu ngân và dấu ngã"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, dấu ngân và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, móc phía trên"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, dấu ngã"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, dấu mũ và dấu sắc"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, dấu mũ và dấu huyền"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, dấu mũ và móc phía trên"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, dấu mũ và dấu ngã"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, dấu mũ và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, móc phía trên"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, móc phía trên"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, dấu mũ và dấu sắc"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, dấu mũ và dấu huyền"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, dấu mũ và móc phía trên"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, dấu mũ và dấu ngã"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, dấu mũ và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, dấu móc và dấu sắc"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, dấu móc và dấu huyền"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, dấu móc và móc phía trên"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, dấu móc và dấu ngã"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, dấu móc và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, móc phía trên"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, dấu móc và dấu sắc"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, dấu móc và dấu huyền"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, dấu móc và móc phía trên"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, dấu móc và dấu ngã"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, dấu móc và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, dấu huyền"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, móc phía trên"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, dấu ngã"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Dấu cảm thán đảo ngược"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dấu ngoặc kép mở"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Dấu chấm ở giữa"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Chỉ số trên một"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dấu ngoặc kép đóng"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Dấu hỏi đảo ngược"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Dấu ngoặc đơn mở"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Dấu ngoặc đơn đóng"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Dấu trích dẫn đơn"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Dấu ngoặc kép mở"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Dấu ngoặc kép đóng"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dấu chữ thập"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dấu chữ thập kép"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Dấu cho mỗi ngàn"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Dấu phẩy"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Hai phẩy"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Dấu ngoặc đơn mở"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Dấu ngoặc đơn đóng"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Chỉ số trên bốn"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Chỉ số trên của n thường"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Ký hiệu đồng Pêsô"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Dấu phần trăm"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Mũi tên về phía phải"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Mũi tên xuống dưới"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tập rỗng"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Tăng dần"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Nhỏ hơn hoặc bằng"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Lớn hơn hoặc bằng"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Sao đen"</string>
+</resources>
diff --git a/java/res/values-vi/strings-talkback-descriptions.xml b/java/res/values-vi/strings-talkback-descriptions.xml
index ad63fa5..659b1d3 100644
--- a/java/res/values-vi/strings-talkback-descriptions.xml
+++ b/java/res/values-vi/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Không có ký tự nào được nhập"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> sửa <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> thành <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> tự động sửa"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Ký tự không xác định"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Biểu tượng khác"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Địa điểm"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Biểu tượng"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Biểu tượng cảm xúc"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> hoa"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"I hoa"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"I hoa, dấu chấm phía trên"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Ký hiệu không xác định"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Biểu tượng cảm xúc không xác định"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Có ký tự thay thế"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Ký tự thay thế đã bị loại bỏ"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Có đề xuất thay thế"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Đề xuất thay thế đã bị loại bỏ"</string>
 </resources>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index 100175f..d95ff61 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Đề xuất tên liên hệ"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Sử dụng tên từ Danh bạ cho các đề xuất và chỉnh sửa"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Đề xuất được cá nhân hóa"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Cải thiện <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Dấu cách đôi"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Nhấn đúp vào phím cách sẽ chèn thêm một dấu sau dấu cách"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Tự động viết hoa"</string>
diff --git a/java/res/values-zu/strings-action-keys.xml b/java/res/values-zu/strings-action-keys.xml
index 5d60a6c..fe36678 100644
--- a/java/res/values-zu/strings-action-keys.xml
+++ b/java/res/values-zu/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Okwedlule"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Kwenziwe"</string>
     <string name="label_send_key" msgid="482252074224462163">"Thumela"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Sesha"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Misa isikhashana"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Linda"</string>
 </resources>
diff --git a/java/res/values-zu/strings-letter-descriptions.xml b/java/res/values-zu/strings-letter-descriptions.xml
new file mode 100644
index 0000000..54eb6e5
--- /dev/null
+++ b/java/res/values-zu/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Isikhombi sobesifazane"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Uphawu olukhulu"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Isikhombi sowesilisa"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring ngenhla"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, icashazi ngenhla"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, icashazi ngenhla"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, icashazi ngenhla"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, icashazi eliphakathi"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, kulandele i-apostrophe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, indingilizi ngenhla"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, icashazi ngenhla"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, ukhefana ngezansi"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, ukhefana ngezansi"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, icashazi ngenhla"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, ihhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex ne-acute"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex ne-grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex ne-tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex necashazi ngenhla"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve ne-acute"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve ne-grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve ne-tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve necashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, icashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, ihhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex ne-acute"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex ne-grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex ne-tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex necashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, ihhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, icashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, icashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, ihhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex ne-acute"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex ne-grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex ne-tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex necashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn ne-acute"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn ne-grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn ne-tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn necashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, icashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, uhhuku ngehla"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn ne-acute"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn ne-grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn ne-tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn necashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, icashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, ihhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Umbabazi okokushiwo"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Umaki wokukopisha onama-engeli amabili okhombe ngakwesokunxele"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Icashazi eliphakathi"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"I-Superscript one"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Umaki wokukopisha onama-engeli amabili okhombe ngakwesokudla"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Umbuzi okokushiwo"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Umaki wokukopisha oyedwa ongakwesokunxele"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Umaki wokukopisha oyedwa ongakwesokudla"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Umaki wokukopisha owodwa ophansi 9"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Umaki wokukopisha ongakubili ongakwekunxele"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Umaki wokukopisha ongakubili ongakwekudla"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Umaki wokukopisha oyedwa ngokhombe ngakwesokunxele"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Umaki wokukopisha oyedwa ngokhombe ngakwesokudla"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"I-Superscript latin uhlambu oluncane u-n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Uphawu lwe-Peso"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Ukunakekela ko"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Umcibisholo wangakwesokudla"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Umcibisholo oyaphansi"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Isethi engenalutho"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Nciphisa"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Okuncane noma okulinganayo"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Okukhulu noma okulinganayo"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Inkanyezi emnyama"</string>
+</resources>
diff --git a/java/res/values-zu/strings-talkback-descriptions.xml b/java/res/values-zu/strings-talkback-descriptions.xml
index 9f344d8..6d3de70 100644
--- a/java/res/values-zu/strings-talkback-descriptions.xml
+++ b/java/res/values-zu/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Awukho umbhalo ofakiwe"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"I-<xliff:g id="KEY_NAME">%1$s</xliff:g> ilungisa i-<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> kube yi-<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"I-<xliff:g id="KEY_NAME">%1$s</xliff:g> yenza ukulungisa okuzenzakalelayo"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Uhlamvu olungaziwa"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"U-Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Amasimbuli amaningi"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"U-Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Izindawo"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Amasimbuli"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Izithombe-mzwelo"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Ufeleba <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Ufeleba I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Ufeleba I, icashazi ngenhla"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Uphawu olungaziwa"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"I-emoji engaziwa"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Ezinye izinhlamvu ziyatholakala"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Ezinye izinhlamvu ziyalahlwa"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Ezinye iziphakamiso ziyatholakala"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Ezinye iziphakamiso ziyalahlwa"</string>
 </resources>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index 8e3942f..c72352d 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sikisela amagama Othintana nabo"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Amagama abasebenzisi kusuka Kothintana nabo bokusikisela nokulungisa"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Iziphakamiso ezenziwe okomuntu siqu"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Thuthukisa i-<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Isikhathi se-Double-space"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Ukuthepha kabili kubha yesikhala kufaka isikhathi esilandelwa yisikhala"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Ukwenza ofeleba okuzenzakalelayo"</string>
diff --git a/java/res/xml-sw600dp/rows_sinhala.xml b/java/res/xml-sw600dp/rows_sinhala.xml
new file mode 100644
index 0000000..23c3f3a
--- /dev/null
+++ b/java/res/xml-sw600dp/rows_sinhala.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <include
+        latin:keyboardLayout="@xml/key_styles_common" />
+    <Row
+        latin:keyWidth="8.182%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_sinhala1" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyWidth="fillRight" />
+    </Row>
+    <Row
+        latin:keyWidth="8.182%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_sinhala2" />
+        <Key
+            latin:keyStyle="enterKeyStyle"
+            latin:keyWidth="fillRight" />
+    </Row>
+    <Row
+        latin:keyWidth="8.182%p"
+    >
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="10.0%p" />
+        <include
+            latin:keyboardLayout="@xml/rowkeys_sinhala3" />
+        <include
+            latin:keyboardLayout="@xml/keys_exclamation_question" />
+    </Row>
+    <include
+        latin:keyboardLayout="@xml/row_qwerty4" />
+</merge>
diff --git a/java/res/xml/kbd_sinhala.xml b/java/res/xml/kbd_sinhala.xml
new file mode 100644
index 0000000..6c0f4bc
--- /dev/null
+++ b/java/res/xml/kbd_sinhala.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <include
+        latin:keyboardLayout="@xml/rows_sinhala" />
+</Keyboard>
diff --git a/java/res/xml/keyboard_layout_set_sinhala.xml b/java/res/xml/keyboard_layout_set_sinhala.xml
new file mode 100644
index 0000000..8e6e619
--- /dev/null
+++ b/java/res/xml/keyboard_layout_set_sinhala.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<KeyboardLayoutSet
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin">
+    <Element
+        latin:elementName="alphabet"
+        latin:elementKeyboard="@xml/kbd_sinhala"
+        latin:enableProximityCharsCorrection="true" />
+    <Element
+        latin:elementName="alphabetAutomaticShifted"
+        latin:elementKeyboard="@xml/kbd_sinhala"
+        latin:enableProximityCharsCorrection="true" />
+    <!-- On these shifted alphabet layouts the proximity characters correction should be disabled
+         because the letters on these layouts aren't the ones in different case of the above
+         unshifted layouts. -->
+    <Element
+        latin:elementName="alphabetManualShifted"
+        latin:elementKeyboard="@xml/kbd_sinhala" />
+    <Element
+        latin:elementName="alphabetShiftLocked"
+        latin:elementKeyboard="@xml/kbd_sinhala" />
+    <Element
+        latin:elementName="alphabetShiftLockShifted"
+        latin:elementKeyboard="@xml/kbd_sinhala" />
+    <Element
+        latin:elementName="symbols"
+        latin:elementKeyboard="@xml/kbd_symbols" />
+    <Element
+        latin:elementName="symbolsShifted"
+        latin:elementKeyboard="@xml/kbd_symbols_shift" />
+    <Element
+        latin:elementName="phone"
+        latin:elementKeyboard="@xml/kbd_phone" />
+    <Element
+        latin:elementName="phoneSymbols"
+        latin:elementKeyboard="@xml/kbd_phone_symbols" />
+    <Element
+        latin:elementName="number"
+        latin:elementKeyboard="@xml/kbd_number" />
+</KeyboardLayoutSet>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index 777a13d..68dce8a 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -81,6 +81,7 @@
     pt_PT: Portuguese (Portugal)/qwerty
     ro: Romanian/qwerty
     ru: Russian/east_slavic
+    (si_LK: Sinhala (Sri Lanka)/sinhala) # This is a preliminary keyboard layout.
     sk: Slovak/qwerty
     sl: Slovenian/qwerty
     sr: Serbian/south_slavic
@@ -332,7 +333,6 @@
     />
     <!-- TODO: This hindi_compact keyboard is a preliminary layout.
                This isn't based on the final specification. -->
-    <!--
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
             android:label="@string/subtype_generic_compact"
             android:subtypeId="0xe49c89a1"
@@ -341,7 +341,6 @@
             android:imeSubtypeExtraValue="KeyboardLayoutSet=hindi_compact,EmojiCapable"
             android:isAsciiCapable="false"
     />
-    -->
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
             android:label="@string/subtype_generic"
             android:subtypeId="0x35b7526a"
@@ -482,7 +481,6 @@
     />
     <!-- TODO: This marathi keyboard is a preliminary layout.
                This isn't based on the final specification. -->
-    <!--
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
             android:label="@string/subtype_generic"
             android:subtypeId="0x747b9f03"
@@ -491,7 +489,6 @@
             android:imeSubtypeExtraValue="KeyboardLayoutSet=marathi,EmojiCapable"
             android:isAsciiCapable="false"
     />
-    -->
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
             android:label="@string/subtype_generic"
             android:subtypeId="0x84c87c61"
@@ -502,7 +499,6 @@
     />
     <!-- TODO: This Myanmar keyboard is a preliminary layout.
                This isn't based on the final specification. -->
-    <!--
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
             android:label="@string/subtype_generic"
             android:subtypeId="0xea266ea4"
@@ -511,7 +507,6 @@
             android:imeSubtypeExtraValue="KeyboardLayoutSet=myanmar,EmojiCapable,CombiningRules=MyanmarReordering"
             android:isAsciiCapable="false"
     />
-    -->
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
             android:label="@string/subtype_generic"
             android:subtypeId="0x3f12ee14"
@@ -592,6 +587,16 @@
             android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable"
             android:isAsciiCapable="false"
     />
+    <!-- TODO: This sinhala keyboard is a preliminary layout.
+               This isn't based on the final specification. -->
+    <subtype android:icon="@drawable/ic_ime_switcher_dark"
+            android:label="@string/subtype_generic"
+            android:subtypeId="0x5c6b3bde"
+            android:imeSubtypeLocale="si_LK"
+            android:imeSubtypeMode="keyboard"
+            android:imeSubtypeExtraValue="KeyboardLayoutSet=sinhala,EmojiCapable"
+            android:isAsciiCapable="false"
+    />
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
             android:label="@string/subtype_generic"
             android:subtypeId="0x8e94d413"
diff --git a/java/res/xml/rowkeys_sinhala1.xml b/java/res/xml/rowkeys_sinhala1.xml
new file mode 100644
index 0000000..f258ae2
--- /dev/null
+++ b/java/res/xml/rowkeys_sinhala1.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <switch>
+        <case
+            latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"
+        >
+            <!-- U+0DD6: "ූ" SINHALA VOWEL SIGN DIGA PAA-PILLA -->
+            <Key
+                latin:keySpec="&#x0DD6;"
+                latin:additionalMoreKeys="1" />
+            <!-- U+0D8B: "උ" SINHALA LETTER UYANNA -->
+            <Key
+                latin:keySpec="&#x0D8B;"
+                latin:additionalMoreKeys="2" />
+            <!-- U+0DD1: "ෑ" SINHALA VOWEL SIGN DIGA AEDA-PILLA -->
+            <Key
+                latin:keySpec="&#x0DD1;"
+                latin:additionalMoreKeys="3" />
+            <!-- U+0D8D: "ඍ" SINHALA LETTER IRUYANNA -->
+            <Key
+                latin:keySpec="&#x0D8D;"
+                latin:additionalMoreKeys="4" />
+            <!-- U+0D94: "ඔ" SINHALA LETTER OYANNA -->
+            <Key
+                latin:keySpec="&#x0D94;"
+                latin:additionalMoreKeys="5" />
+            <!-- U+0DC1: "ශ" SINHALA LETTER TAALUJA SAYANNA -->
+            <Key
+                latin:keySpec="&#x0DC1;"
+                latin:additionalMoreKeys="6" />
+            <!-- U+0DB9: "ඹ" SINHALA LETTER AMBA BAYANNA -->
+            <Key
+                latin:keySpec="&#x0DB9;"
+                latin:additionalMoreKeys="7" />
+            <!-- U+0DC2: "ෂ" SINHALA LETTER MUURDHAJA SAYANNA -->
+            <Key
+                latin:keySpec="&#x0DC2;"
+                latin:additionalMoreKeys="8" />
+            <!-- U+0DB0: "ධ" SINHALA LETTER MAHAAPRAANA DAYANNA -->
+            <Key
+                latin:keySpec="&#x0DB0;"
+                latin:additionalMoreKeys="9" />
+            <!-- U+0DA1: "ඡ" SINHALA LETTER MAHAAPRAANA CAYANNA -->
+            <Key
+                latin:keySpec="&#x0DA1;"
+                latin:additionalMoreKeys="0" />
+            <!-- U+0DA5: "ඥ" SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+                 U+0DF4: "෴" SINHALA PUNCTUATION KUNDDALIYA  -->
+            <Key
+                latin:keySpec="&#x0DA5;"
+                latin:moreKeys="&#x0DF4;" />
+        </case>
+        <default>
+            <!-- U+0DD4: "ු" SINHALA VOWEL SIGN KETTI PAA-PILLA -->
+            <Key
+                latin:keySpec="&#x0DD4;"
+                latin:additionalMoreKeys="1" />
+            <!-- U+0D85: "අ" SINHALA LETTER AYANNA -->
+            <Key
+                latin:keySpec="&#x0D85;"
+                latin:additionalMoreKeys="2" />
+            <!-- U+0DD0: "ැ" SINHALA VOWEL SIGN KETTI AEDA-PILLA -->
+            <Key
+                latin:keySpec="&#x0DD0;"
+                latin:additionalMoreKeys="3" />
+            <!-- U+0DBB: "ර" SINHALA LETTER RAYANNA -->
+            <Key
+                latin:keySpec="&#x0DBB;"
+                latin:additionalMoreKeys="4" />
+            <!-- U+0D91: "එ" SINHALA LETTER EYANNA -->
+            <Key
+                latin:keySpec="&#x0D91;"
+                latin:additionalMoreKeys="5" />
+            <!-- U+0DC4: "හ" SINHALA LETTER HAYANNA -->
+            <Key
+                latin:keySpec="&#x0DC4;"
+                latin:additionalMoreKeys="6" />
+            <!-- U+0DB8: "ම" SINHALA LETTER MAYANNA -->
+            <Key
+                latin:keySpec="&#x0DB8;"
+                latin:additionalMoreKeys="7" />
+            <!-- U+0DC3: "ස" SINHALA LETTER DANTAJA SAYANNA -->
+            <Key
+                latin:keySpec="&#x0DC3;"
+                latin:additionalMoreKeys="8" />
+            <!-- U+0DAF: "ද" SINHALA LETTER ALPAPRAANA DAYANNA
+                 U+0DB3: "ඳ" SINHALA LETTER SANYAKA DAYANNA -->
+            <Key
+                latin:keySpec="&#x0DAF;"
+                latin:moreKeys="&#x0DB3;"
+                latin:additionalMoreKeys="9" />
+            <!-- U+0DA0: "ච" SINHALA LETTER ALPAPRAANA CAYANNA -->
+            <Key
+                latin:keySpec="&#x0DA0;"
+                latin:additionalMoreKeys="0" />
+            <!-- U+0DA4: "ඤ" SINHALA LETTER TAALUJA NAASIKYAYA
+                 U+0DF4: "෴" SINHALA PUNCTUATION KUNDDALIYA -->
+            <Key
+                latin:keySpec="&#x0DA4;"
+                latin:moreKeys="&#x0DF4;" />
+         </default>
+    </switch>
+</merge>
diff --git a/java/res/xml/rowkeys_sinhala2.xml b/java/res/xml/rowkeys_sinhala2.xml
new file mode 100644
index 0000000..91c1928
--- /dev/null
+++ b/java/res/xml/rowkeys_sinhala2.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <switch>
+        <case
+            latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"
+        >
+            <!-- U+0DDF: "ෟ" SINHALA VOWEL SIGN GAYANUKITTA -->
+            <Key
+                latin:keySpec="&#x0DDF;" />
+            <!-- U+0DD3: "ී" SINHALA VOWEL SIGN DIGA IS-PILLA -->
+            <Key
+                latin:keySpec="&#x0DD3;" />
+            <!-- U+0DD8: "ෘ" SINHALA VOWEL SIGN GAETTA-PILLA -->
+            <Key
+                latin:keySpec="&#x0DD8;" />
+            <!-- U+0DC6: "ෆ" SINHALA LETTER FAYANNA -->
+            <Key
+                latin:keySpec="&#x0DC6;" />
+            <!-- U+0DA8: "ඨ" SINHALA LETTER MAHAAPRAANA TTAYANNA -->
+            <Key
+                latin:keySpec="&#x0DA8;" />
+            <!-- U+0DCA/U+200D/U+0DBA: "්‍ය" SINHALA SIGN AL-LAKUNA/ZERO WIDTH JOINER/SINHALA LETTER YAYANNA -->
+            <Key
+                latin:keySpec="&#x0DCA;&#x200D;&#x0DBA;" />
+            <!-- U+0DC5/U+0DD4: "ළු" SINHALA LETTER MUURDHAJA LAYANNA/SINHALA VOWEL SIGN KETTI PAA-PILLA -->
+            <Key
+                latin:keySpec="&#x0DC5;&#x0DD4;" />
+            <!-- U+0DAB: "ණ" SINHALA LETTER MUURDHAJA NAYANNA -->
+            <Key
+                latin:keySpec="&#x0DAB;" />
+            <!-- U+0D9B: "ඛ" SINHALA LETTER MAHAAPRAANA KAYANNA -->
+            <Key
+                latin:keySpec="&#x0D9B;" />
+            <!-- U+0DAE: "ථ" SINHALA LETTER MAHAAPRAANA TAYANNA -->
+            <Key
+                latin:keySpec="&#x0DAE;" />
+            <!-- U+0DCA/U+200D/U+0DBB: "්‍ර" SINHALA SIGN AL-LAKUNA/ZERO WIDTH JOINER/SINHALA LETTER RAYANNA -->
+            <Key
+                latin:keySpec="&#x0DCA;&#x200D;&#x0DBB;" />
+        </case>
+        <default>
+            <!-- U+0DCA: "්" SINHALA SIGN AL-LAKUNA -->
+            <Key
+                latin:keySpec="&#x0DCA;" />
+            <!-- U+0DD2: "ි" SINHALA VOWEL SIGN KETTI IS-PILLA -->
+            <Key
+                latin:keySpec="&#x0DD2;" />
+            <!-- U+0DCF: "ා" SINHALA VOWEL SIGN AELA-PILLA -->
+            <Key
+                latin:keySpec="&#x0DCF;" />
+            <!-- U+0DD9: "ෙ" SINHALA VOWEL SIGN KOMBUVA -->
+            <Key
+                latin:keySpec="&#x0DD9;" />
+            <!-- U+0DA7: "ට" SINHALA LETTER ALPAPRAANA TTAYANNA -->
+            <Key
+                latin:keySpec="&#x0DA7;" />
+            <!-- U+0DBA: "ය" SINHALA LETTER YAYANNA -->
+            <Key
+                latin:keySpec="&#x0DBA;" />
+            <!-- U+0DC0: "ව" SINHALA LETTER VAYANNA -->
+            <Key
+                latin:keySpec="&#x0DC0;" />
+            <!-- U+0DB1: "න" SINHALA LETTER DANTAJA NAYANNA -->
+            <Key
+                latin:keySpec="&#x0DB1;" />
+            <!-- U+0D9A: "ක" SINHALA LETTER ALPAPRAANA KAYANNA -->
+            <Key
+                latin:keySpec="&#x0D9A;" />
+            <!-- U+0DAD: "ත" SINHALA LETTER ALPAPRAANA TAYANNA -->
+            <Key
+                latin:keySpec="&#x0DAD;" />
+            <!-- U+0D8F: "ඏ" SINHALA LETTER ILUYANNA -->
+            <Key
+                latin:keySpec="&#x0D8F;" />
+         </default>
+    </switch>
+</merge>
diff --git a/java/res/xml/rowkeys_sinhala3.xml b/java/res/xml/rowkeys_sinhala3.xml
new file mode 100644
index 0000000..64ba9f3
--- /dev/null
+++ b/java/res/xml/rowkeys_sinhala3.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <switch>
+        <case
+            latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"
+        >
+            <!-- U+0D9E: "ඞ" SINHALA LETTER KANTAJA NAASIKYAYA -->
+            <Key
+                latin:keySpec="&#x0D9E;" />
+            <!-- U+0DA3: "ඣ" SINHALA LETTER MAHAAPRAANA JAYANNA -->
+            <Key
+                latin:keySpec="&#x0DA3;" />
+            <!-- U+0DAA: "ඪ" SINHALA LETTER MAHAAPRAANA DDAYANNA -->
+            <Key
+                latin:keySpec="&#x0DAA;" />
+            <!-- U+0D8A: "ඊ" SINHALA LETTER IIYANNA -->
+            <Key
+                latin:keySpec="&#x0D8A;" />
+            <!-- U+0DB7: "භ" SINHALA LETTER MAHAAPRAANA BAYANNA -->
+            <Key
+                latin:keySpec="&#x0DB7;" />
+            <!-- U+0DB5: "ඵ" SINHALA LETTER MAHAAPRAANA PAYANNA -->
+            <Key
+                latin:keySpec="&#x0DB5;" />
+            <!-- U+0DC5: "ළ" SINHALA LETTER MUURDHAJA LAYANNA -->
+            <Key
+                latin:keySpec="&#x0DC5;" />
+            <!-- U+0D9D: "ඝ" SINHALA LETTER MAHAAPRAANA GAYANNA -->
+            <Key
+                latin:keySpec="&#x0D9D;" />
+            <!-- U+0DBB/U+0DCA/U+200D: "ර්‍" SINHALA LETTER RAYANNA/SINHALA SIGN AL-LAKUNA/ZERO WIDTH JOINER -->
+            <Key
+                latin:keySpec="&#x0DBB;&#x0DCA;&#x200D;" />
+        </case>
+        <default>
+            <!-- U+0D82: "ං" SINHALA SIGN ANUSVARAYA
+                 U+0D83: "ඃ" SINHALA SIGN VISARGAYA -->
+            <Key
+                latin:keySpec="&#x0D82;"
+                latin:moreKeys="&#x0D83;" />
+            <!-- U+0DA2: "ජ" SINHALA LETTER ALPAPRAANA JAYANNA
+                 U+0DA6: "ඦ" SINHALA LETTER SANYAKA JAYANNA -->
+            <Key
+                latin:keySpec="&#x0DA2;"
+                latin:moreKeys="&#x0DA6;" />
+            <!-- U+0DA9: "ඩ" SINHALA LETTER ALPAPRAANA DDAYANNA
+                 U+0DAC: "ඬ" SINHALA LETTER SANYAKA DDAYANNA -->
+            <Key
+                latin:keySpec="&#x0DA9;"
+                latin:moreKeys="&#x0DAC;" />
+            <!-- U+0D89: "ඉ" SINHALA LETTER IYANNA -->
+            <Key
+                latin:keySpec="&#x0D89;" />
+            <!-- U+0DB6: "බ" SINHALA LETTER ALPAPRAANA BAYANNA -->
+            <Key
+                latin:keySpec="&#x0DB6;" />
+            <!-- U+0DB4: "ප" SINHALA LETTER ALPAPRAANA PAYANNA -->
+            <Key
+                latin:keySpec="&#x0DB4;" />
+            <!-- U+0DBD: "ල" SINHALA LETTER DANTAJA LAYANNA -->
+            <Key
+                latin:keySpec="&#x0DBD;" />
+            <!-- U+0D9C: "ග" SINHALA LETTER ALPAPRAANA GAYANNA
+                 U+0D9F: "ඟ" SINHALA LETTER SANYAKA GAYANNA -->
+            <Key
+                latin:keySpec="&#x0D9C;"
+                latin:moreKeys="&#x0D9F;" />
+            <!-- U+0DF3: "ෳ" SINHALA VOWEL SIGN DIGA GAYANUKITTA -->
+            <Key
+                latin:keySpec="&#x0DF3;" />
+         </default>
+    </switch>
+</merge>
diff --git a/java/res/xml/rows_sinhala.xml b/java/res/xml/rows_sinhala.xml
new file mode 100644
index 0000000..b47b373
--- /dev/null
+++ b/java/res/xml/rows_sinhala.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <include
+        latin:keyboardLayout="@xml/key_styles_common" />
+    <Row
+        latin:keyWidth="9.091%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_sinhala1" />
+    </Row>
+    <Row
+            latin:keyWidth="9.091%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_sinhala2" />
+    </Row>
+    <Row
+        latin:keyWidth="8.711%p"
+    >
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="10.8%p" />
+        <include
+            latin:keyboardLayout="@xml/rowkeys_sinhala3" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyWidth="fillRight" />
+    </Row>
+    <include
+        latin:keyboardLayout="@xml/row_qwerty4" />
+</merge>
diff --git a/java/src/com/android/inputmethod/event/Event.java b/java/src/com/android/inputmethod/event/Event.java
index 4a9163c..d257441 100644
--- a/java/src/com/android/inputmethod/event/Event.java
+++ b/java/src/com/android/inputmethod/event/Event.java
@@ -225,6 +225,13 @@
                 null /* suggestedWordInfo */, FLAG_NONE, null);
     }
 
+    // Returns whether this is a function key like backspace, ctrl, settings... as opposed to keys
+    // that result in input like letters or space.
+    public boolean isFunctionalKeyEvent() {
+        // This logic may need to be refined in the future
+        return NOT_A_CODE_POINT == mCodePoint;
+    }
+
     // Returns whether this event is for a dead character. @see {@link #FLAG_DEAD}
     public boolean isDead() {
         return 0 != (FLAG_DEAD & mFlags);
diff --git a/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java b/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java
index 05ba999..c61f45e 100644
--- a/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java
+++ b/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java
@@ -74,7 +74,7 @@
             }
             // If not Enter, then this is just a regular keypress event for a normal character
             // that can be committed right away, taking into account the current state.
-            return Event.createHardwareKeypressEvent(keyCode, codePointAndFlags, null /* next */,
+            return Event.createHardwareKeypressEvent(codePointAndFlags, keyCode, null /* next */,
                     isKeyRepeat);
         }
         return Event.createNotHandledEvent();
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
index ab25558..13b174e 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -89,9 +89,9 @@
         /*   3:29 */ "morekeys_e",
         /*   4:28 */ "morekeys_i",
         /*   5:23 */ "morekeys_c",
-        /*   6:23 */ "double_quotes",
-        /*   7:22 */ "morekeys_n",
-        /*   8:22 */ "keylabel_to_alpha",
+        /*   6:23 */ "keylabel_to_alpha",
+        /*   7:23 */ "double_quotes",
+        /*   8:22 */ "morekeys_n",
         /*   9:22 */ "single_quotes",
         /*  10:20 */ "morekeys_s",
         /*  11:14 */ "morekeys_y",
@@ -260,10 +260,10 @@
         /* morekeys_a ~ */
         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
         /* ~ morekeys_c */
-        /* double_quotes */ "!text/double_lqm_rqm",
-        /* morekeys_n */ EMPTY,
         // Label for "switch to alphabetic" key.
         /* keylabel_to_alpha */ "ABC",
+        /* double_quotes */ "!text/double_lqm_rqm",
+        /* morekeys_n */ EMPTY,
         /* single_quotes */ "!text/single_lqm_rqm",
         /* morekeys_s ~ */
         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
@@ -507,14 +507,14 @@
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_i */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
-        /* morekeys_c */ null,
-        /* double_quotes */ null,
+        /* morekeys_c ~ */
+        null, null, null,
+        /* ~ double_quotes */
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u00F1,\u0144",
-        /* keylabel_to_alpha ~ */
-        null, null, null,
-        /* ~ morekeys_s */
+        /* single_quotes */ null,
+        /* morekeys_s */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_y */ "\u00FD,\u0133",
@@ -523,17 +523,17 @@
     /* Locale ar: Arabic */
     private static final String[] TEXTS_ar = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
         // U+062C: "ج" ARABIC LETTER JEEM
         /* keylabel_to_alpha */ "\u0623\u200C\u0628\u200C\u062C",
-        /* single_quotes ~ */
+        /* double_quotes ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_cyrillic_soft_sign */
         // U+0661: "١" ARABIC-INDIC DIGIT ONE
         /* keyspec_symbols_1 */ "\u0661",
@@ -685,7 +685,7 @@
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
-        /* double_quotes ~ */
+        /* keylabel_to_alpha ~ */
         null, null, null, null,
         /* ~ single_quotes */
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
@@ -705,13 +705,13 @@
         /* morekeys_a ~ */
         null, null, null, null, null, null,
         /* ~ morekeys_c */
-        /* double_quotes */ "!text/double_9qm_lqm",
-        /* morekeys_n */ null,
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         /* morekeys_s ~ */
         null, null, null, null, null, null, null, null, null, null, null, null,
@@ -738,14 +738,13 @@
         /* morekeys_a ~ */
         null, null, null, null, null, null,
         /* ~ morekeys_c */
-        // single_quotes of Bulgarian is default single_quotes_right_left.
-        /* double_quotes */ "!text/double_9qm_lqm",
-        /* morekeys_n */ null,
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        // single_quotes of Bulgarian is default single_quotes_right_left.
+        /* double_quotes */ "!text/double_9qm_lqm",
     };
 
     /* Locale ca: Catalan */
@@ -796,12 +795,13 @@
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u00F1,\u0144",
-        /* keylabel_to_alpha ~ */
-        null, null, null, null, null, null, null,
+        /* single_quotes ~ */
+        null, null, null, null, null, null,
         /* ~ morekeys_t */
         // U+00B7: "·" MIDDLE DOT
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
@@ -870,12 +870,12 @@
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u00E7,\u0107",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u0148,\u00F1,\u0144",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
@@ -930,11 +930,11 @@
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         /* morekeys_i */ "\u00ED,\u00EF",
         /* morekeys_c */ null,
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u00F1,\u0144",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
@@ -1004,13 +1004,13 @@
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
         // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
         /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
-        /* morekeys_i */ null,
-        /* morekeys_c */ null,
+        /* morekeys_i ~ */
+        null, null, null,
+        /* ~ keylabel_to_alpha */
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u00F1,\u0144",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
@@ -1043,8 +1043,8 @@
     /* Locale el: Greek */
     private static final String[] TEXTS_el = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
         // U+0392: "Β" GREEK CAPITAL LETTER BETA
@@ -1092,10 +1092,10 @@
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u012B,\u00EC",
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u00E7",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         /* morekeys_n */ "\u00F1",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ null,
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         /* morekeys_s */ "\u00DF",
@@ -1161,6 +1161,7 @@
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
         /* morekeys_c */ "\u0107,\u010D,\u00E7,\u010B",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
@@ -1169,7 +1170,6 @@
         // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
         // U+014B: "ŋ" LATIN SMALL LETTER ENG
         /* morekeys_n */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ null,
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
@@ -1297,15 +1297,15 @@
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u00F1,\u0144",
-        /* keylabel_to_alpha ~ */
+        /* single_quotes ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null,
         /* ~ morekeys_nordic_row2_11 */
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
         // U+00BF: "¿" INVERTED QUESTION MARK
@@ -1363,12 +1363,12 @@
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u00E7,\u0107",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u0146,\u00F1,\u0144",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
@@ -1463,6 +1463,7 @@
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
@@ -1472,16 +1473,16 @@
     /* Locale fa: Persian */
     private static final String[] TEXTS_fa = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0627: "ا" ARABIC LETTER ALEF
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
         // U+067E: "پ" ARABIC LETTER PEH
         /* keylabel_to_alpha */ "\u0627\u200C\u0628\u200C\u067E",
-        /* single_quotes ~ */
-        null, null, null, null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_l */
         // U+FDFC: "﷼" RIAL SIGN
         /* keyspec_currency */ "\uFDFC",
@@ -1710,7 +1711,7 @@
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,%,\u0107,\u010D",
-        /* double_quotes ~ */
+        /* keylabel_to_alpha ~ */
         null, null, null, null, null,
         /* ~ morekeys_s */
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
@@ -1782,6 +1783,7 @@
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
@@ -1791,15 +1793,15 @@
     /* Locale hi: Hindi */
     private static final String[] TEXTS_hi = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
         /* keylabel_to_alpha */ "\u0915\u0916\u0917",
-        /* single_quotes ~ */
-        null, null, null, null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_l */
         // U+20B9: "₹" INDIAN RUPEE SIGN
         /* keyspec_currency */ "\u20B9",
@@ -1849,11 +1851,11 @@
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u010D,\u0107,\u00E7",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u00F1,\u0144",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_rqm",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
@@ -1917,9 +1919,9 @@
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
         /* morekeys_c */ null,
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         /* morekeys_n */ null,
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_rqm",
         /* morekeys_s ~ */
         null, null, null, null, null, null, null, null,
@@ -1931,17 +1933,18 @@
     /* Locale hy_AM: Armenian (Armenia) */
     private static final String[] TEXTS_hy_AM = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0531: "Ա" ARMENIAN CAPITAL LETTER AYB
         // U+0532: "Բ" ARMENIAN CAPITAL LETTER BEN
         // U+0533: "Գ" ARMENIAN CAPITAL LETTER GIM
         /* keylabel_to_alpha */ "\u0531\u0532\u0533",
-        /* single_quotes ~ */
+        /* double_quotes ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
         /* ~ morekeys_nordic_row2_11 */
         // U+055E: "՞" ARMENIAN QUESTION MARK
         // U+055C: "՜" ARMENIAN EXCLAMATION MARK
@@ -2027,9 +2030,9 @@
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
         /* morekeys_c */ null,
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         /* morekeys_s */ null,
         // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
@@ -2110,13 +2113,13 @@
         /* morekeys_a ~ */
         null, null, null, null, null, null,
         /* ~ morekeys_c */
-        /* double_quotes */ "!text/double_rqm_9qm",
-        /* morekeys_n */ null,
         // Label for "switch to alphabetic" key.
         // U+05D0: "א" HEBREW LETTER ALEF
         // U+05D1: "ב" HEBREW LETTER BET
         // U+05D2: "ג" HEBREW LETTER GIMEL
         /* keylabel_to_alpha */ "\u05D0\u05D1\u05D2",
+        /* double_quotes */ "!text/double_rqm_9qm",
+        /* morekeys_n */ null,
         /* single_quotes */ "!text/single_rqm_9qm",
         /* morekeys_s ~ */
         null, null, null, null, null, null,
@@ -2167,28 +2170,28 @@
         /* morekeys_a ~ */
         null, null, null, null, null, null,
         /* ~ morekeys_c */
-        /* double_quotes */ "!text/double_9qm_lqm",
-        /* morekeys_n */ null,
         // Label for "switch to alphabetic" key.
         // U+10D0: "ა" GEORGIAN LETTER AN
         // U+10D1: "ბ" GEORGIAN LETTER BAN
         // U+10D2: "გ" GEORGIAN LETTER GAN
         /* keylabel_to_alpha */ "\u10D0\u10D1\u10D2",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
     };
 
     /* Locale kk: Kazakh */
     private static final String[] TEXTS_kk = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* single_quotes ~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_k */
         // U+0451: "ё" CYRILLIC SMALL LETTER IO
         /* morekeys_cyrillic_ie */ "\u0451",
@@ -2237,14 +2240,14 @@
     /* Locale km_KH: Khmer (Cambodia) */
     private static final String[] TEXTS_km_KH = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+1780: "ក" KHMER LETTER KA
         // U+1781: "ខ" KHMER LETTER KHA
         // U+1782: "គ" KHMER LETTER KO
         /* keylabel_to_alpha */ "\u1780\u1781\u1782",
-        /* single_quotes ~ */
+        /* double_quotes ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@@ -2252,7 +2255,7 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_cyrillic_a */
         // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
         /* morekeys_currency_dollar */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
@@ -2261,15 +2264,15 @@
     /* Locale ky: Kirghiz */
     private static final String[] TEXTS_ky = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* single_quotes ~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_k */
         // U+0451: "ё" CYRILLIC SMALL LETTER IO
         /* morekeys_cyrillic_ie */ "\u0451",
@@ -2304,15 +2307,15 @@
     /* Locale lo_LA: Lao (Laos) */
     private static final String[] TEXTS_lo_LA = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0E81: "ກ" LAO LETTER KO
         // U+0E82: "ຂ" LAO LETTER KHO SUNG
         // U+0E84: "ຄ" LAO LETTER KHO TAM
         /* keylabel_to_alpha */ "\u0E81\u0E82\u0E84",
-        /* single_quotes ~ */
-        null, null, null, null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_l */
         // U+20AD: "₭" KIP SIGN
         /* keyspec_currency */ "\u20AD",
@@ -2370,12 +2373,12 @@
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u00E7,\u0107",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u0146,\u00F1,\u0144",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
@@ -2464,12 +2467,12 @@
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u00E7,\u0107",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u0146,\u00F1,\u0144",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
@@ -2512,13 +2515,13 @@
         /* morekeys_a ~ */
         null, null, null, null, null, null,
         /* ~ morekeys_c */
-        /* double_quotes */ "!text/double_9qm_lqm",
-        /* morekeys_n */ null,
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         /* morekeys_s ~ */
         null, null, null, null, null, null, null, null, null, null, null, null,
@@ -2547,15 +2550,15 @@
     /* Locale mn_MN: Mongolian (Mongolia) */
     private static final String[] TEXTS_mn_MN = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* single_quotes ~ */
-        null, null, null, null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_l */
         // U+20AE: "₮" TUGRIK SIGN
         /* keyspec_currency */ "\u20AE",
@@ -2564,15 +2567,15 @@
     /* Locale mr_IN: Marathi (India) */
     private static final String[] TEXTS_mr_IN = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
         /* keylabel_to_alpha */ "\u0915\u0916\u0917",
-        /* single_quotes ~ */
-        null, null, null, null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_l */
         // U+20B9: "₹" INDIAN RUPEE SIGN
         /* keyspec_currency */ "\u20B9",
@@ -2616,17 +2619,18 @@
     /* Locale my_MM: Burmese (Myanmar) */
     private static final String[] TEXTS_my_MM = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+1000: "က" MYANMAR LETTER KA
         // U+1001: "ခ" MYANMAR LETTER KHA
         // U+1002: "ဂ" MYANMAR LETTER GA
         /* keylabel_to_alpha */ "\u1000\u1001\u1002",
-        /* single_quotes ~ */
+        /* double_quotes ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
         /* ~ morekeys_nordic_row2_11 */
         /* morekeys_punctuation */ "!autoColumnOrder!9,\u104A,.,?,!,#,),(,/,;,...,',@,:,-,\",+,\\%,&",
         // U+104A: "၊" MYANMAR SIGN LITTLE SECTION
@@ -2681,11 +2685,11 @@
         // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
         // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
         /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        /* morekeys_i */ null,
-        /* morekeys_c */ null,
+        /* morekeys_i ~ */
+        null, null, null,
+        /* ~ keylabel_to_alpha */
         /* double_quotes */ "!text/double_9qm_rqm",
         /* morekeys_n */ null,
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_rqm",
         /* morekeys_s ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null,
@@ -2709,15 +2713,15 @@
     /* Locale ne_NP: Nepali (Nepal) */
     private static final String[] TEXTS_ne_NP = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
         /* keylabel_to_alpha */ "\u0915\u0916\u0917",
-        /* single_quotes ~ */
-        null, null, null, null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_l */
         // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
         /* keyspec_currency */ "\u0930\u0941.",
@@ -2801,11 +2805,11 @@
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
         /* morekeys_c */ null,
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u00F1,\u0144",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_rqm",
         /* morekeys_s */ null,
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
@@ -2847,11 +2851,11 @@
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u0107,\u00E7,\u010D",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         /* morekeys_n */ "\u0144,\u00F1",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_rqm",
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
@@ -2952,9 +2956,9 @@
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
         /* morekeys_c */ null,
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         /* morekeys_n */ null,
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_rqm",
         // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
@@ -2973,13 +2977,13 @@
         /* morekeys_a ~ */
         null, null, null, null, null, null,
         /* ~ morekeys_c */
-        /* double_quotes */ "!text/double_9qm_lqm",
-        /* morekeys_n */ null,
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         /* morekeys_s ~ */
         null, null, null, null, null, null, null, null, null, null, null, null,
@@ -3001,6 +3005,17 @@
         /* morekeys_cyrillic_soft_sign */ "\u044A",
     };
 
+    /* Locale si_LK: Sinhalese (Sri Lanka) */
+    private static final String[] TEXTS_si_LK = {
+        /* morekeys_a ~ */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
+        // Label for "switch to alphabetic" key.
+        // U+0D85: "අ" SINHALA LETTER AYANNA
+        // U+0D86: "ආ" SINHALA LETTER AAYANNA
+        /* keylabel_to_alpha */ "\u0D85,\u0D86",
+    };
+
     /* Locale sk: Slovak */
     private static final String[] TEXTS_sk = {
         // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
@@ -3052,13 +3067,13 @@
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u00E7,\u0107",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u0148,\u0146,\u00F1,\u0144",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
@@ -3104,9 +3119,9 @@
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u0107",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
         /* morekeys_s */ "\u0161",
@@ -3127,14 +3142,14 @@
         /* morekeys_a ~ */
         null, null, null, null, null, null,
         /* ~ morekeys_c */
-        /* double_quotes */ "!text/double_9qm_lqm",
-        /* morekeys_n */ null,
         // END: More keys definitions for Serbian (Cyrillic)
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         /* morekeys_s ~ */
         null, null, null, null, null, null, null, null,
@@ -3217,12 +3232,12 @@
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
         /* morekeys_n */ "\u0144,\u00F1,\u0148",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ null,
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
@@ -3310,10 +3325,10 @@
         /* morekeys_i */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u00E7",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         /* morekeys_n */ "\u00F1",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ null,
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         /* morekeys_s */ "\u00DF",
@@ -3326,15 +3341,15 @@
     /* Locale th: Thai */
     private static final String[] TEXTS_th = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null, null, null,
-        /* ~ morekeys_n */
+        null, null, null, null, null, null,
+        /* ~ morekeys_c */
         // Label for "switch to alphabetic" key.
         // U+0E01: "ก" THAI CHARACTER KO KAI
         // U+0E02: "ข" THAI CHARACTER KHO KHAI
         // U+0E04: "ค" THAI CHARACTER KHO KHWAI
         /* keylabel_to_alpha */ "\u0E01\u0E02\u0E04",
-        /* single_quotes ~ */
-        null, null, null, null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_l */
         // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
         /* keyspec_currency */ "\u0E3F",
@@ -3388,6 +3403,7 @@
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
@@ -3426,7 +3442,7 @@
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
-        /* double_quotes ~ */
+        /* keylabel_to_alpha ~ */
         null, null, null, null,
         /* ~ single_quotes */
         // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
@@ -3446,13 +3462,13 @@
         /* morekeys_a ~ */
         null, null, null, null, null, null,
         /* ~ morekeys_c */
-        /* double_quotes */ "!text/double_9qm_lqm",
-        /* morekeys_n */ null,
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* double_quotes */ "!text/double_9qm_lqm",
+        /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         /* morekeys_s ~ */
         null, null, null, null, null, null,
@@ -3613,10 +3629,10 @@
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u012B,\u00EC",
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u00E7",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         /* morekeys_n */ "\u00F1",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ null,
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         /* morekeys_s */ "\u00DF",
@@ -3686,6 +3702,7 @@
         // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
+        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
@@ -3694,7 +3711,6 @@
         // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
         // U+014B: "ŋ" LATIN SMALL LETTER ENG
         /* morekeys_n */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
-        /* keylabel_to_alpha */ null,
         /* single_quotes */ null,
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
         // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
@@ -3767,21 +3783,21 @@
         "ar"     , TEXTS_ar,    /*  55/110 Arabic */
         "az_AZ"  , TEXTS_az_AZ, /*   8/ 18 Azerbaijani (Azerbaijan) */
         "be_BY"  , TEXTS_be_BY, /*   9/ 32 Belarusian (Belarus) */
-        "bg"     , TEXTS_bg,    /*   2/  9 Bulgarian */
+        "bg"     , TEXTS_bg,    /*   2/  8 Bulgarian */
         "ca"     , TEXTS_ca,    /*  11/ 95 Catalan */
         "cs"     , TEXTS_cs,    /*  17/ 21 Czech */
         "da"     , TEXTS_da,    /*  19/ 54 Danish */
         "de"     , TEXTS_de,    /*  16/ 62 German */
-        "el"     , TEXTS_el,    /*   1/  9 Greek */
+        "el"     , TEXTS_el,    /*   1/  7 Greek */
         "en"     , TEXTS_en,    /*   8/ 11 English */
         "eo"     , TEXTS_eo,    /*  26/118 Esperanto */
         "es"     , TEXTS_es,    /*   8/ 55 Spanish */
         "et_EE"  , TEXTS_et_EE, /*  22/ 27 Estonian (Estonia) */
-        "eu_ES"  , TEXTS_eu_ES, /*   7/  8 Basque (Spain) */
+        "eu_ES"  , TEXTS_eu_ES, /*   7/  9 Basque (Spain) */
         "fa"     , TEXTS_fa,    /*  58/125 Persian */
         "fi"     , TEXTS_fi,    /*  10/ 54 Finnish */
         "fr"     , TEXTS_fr,    /*  13/ 62 French */
-        "gl_ES"  , TEXTS_gl_ES, /*   7/  8 Gallegan (Spain) */
+        "gl_ES"  , TEXTS_gl_ES, /*   7/  9 Gallegan (Spain) */
         "hi"     , TEXTS_hi,    /*  23/ 53 Hindi */
         "hr"     , TEXTS_hr,    /*   9/ 20 Croatian */
         "hu"     , TEXTS_hu,    /*   9/ 20 Hungarian */
@@ -3808,13 +3824,14 @@
         "rm"     , TEXTS_rm,    /*   1/  2 Raeto-Romance */
         "ro"     , TEXTS_ro,    /*   6/ 15 Romanian */
         "ru"     , TEXTS_ru,    /*   9/ 32 Russian */
+        "si_LK"  , TEXTS_si_LK, /*   1/  7 Sinhalese (Sri Lanka) */
         "sk"     , TEXTS_sk,    /*  20/ 22 Slovak */
         "sl"     , TEXTS_sl,    /*   8/ 20 Slovenian */
         "sr"     , TEXTS_sr,    /*  11/ 93 Serbian */
         "sv"     , TEXTS_sv,    /*  21/ 54 Swedish */
         "sw"     , TEXTS_sw,    /*   9/ 18 Swahili */
         "th"     , TEXTS_th,    /*   2/ 17 Thai */
-        "tl"     , TEXTS_tl,    /*   7/  8 Tagalog */
+        "tl"     , TEXTS_tl,    /*   7/  9 Tagalog */
         "tr"     , TEXTS_tr,    /*   7/ 18 Turkish */
         "uk"     , TEXTS_uk,    /*  11/ 87 Ukrainian */
         "vi"     , TEXTS_vi,    /*   8/ 17 Vietnamese */
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 335e52f..1b57918 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -174,8 +174,8 @@
     private static native int getFormatVersionNative(long dict);
     private static native int getProbabilityNative(long dict, int[] word);
     private static native int getMaxProbabilityOfExactMatchesNative(long dict, int[] word);
-    private static native int getBigramProbabilityNative(long dict, int[] word0,
-            boolean isBeginningOfSentence, int[] word1);
+    private static native int getNgramProbabilityNative(long dict, int[][] prevWordCodePointArrays,
+            boolean[] isBeginningOfSentenceArray, int[] word);
     private static native void getWordPropertyNative(long dict, int[] word,
             boolean isBeginningOfSentence, int[] outCodePoints, boolean[] outFlags,
             int[] outProbabilityInfo, ArrayList<int[]> outBigramTargets,
@@ -186,18 +186,19 @@
     private static native void getSuggestionsNative(long dict, long proximityInfo,
             long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times,
             int[] pointerIds, int[] inputCodePoints, int inputSize, int[] suggestOptions,
-            int[] prevWordCodePointArray, boolean isBeginningOfSentence,
+            int[][] prevWordCodePointArrays, boolean[] isBeginningOfSentenceArray,
             int[] outputSuggestionCount, int[] outputCodePoints, int[] outputScores,
             int[] outputIndices, int[] outputTypes, int[] outputAutoCommitFirstWordConfidence,
             float[] inOutLanguageWeight);
-    private static native boolean addUnigramWordNative(long dict, int[] word, int probability,
+    private static native boolean addUnigramEntryNative(long dict, int[] word, int probability,
             int[] shortcutTarget, int shortcutProbability, boolean isBeginningOfSentence,
             boolean isNotAWord, boolean isBlacklisted, int timestamp);
-    private static native boolean removeUnigramWordNative(long dict, int[] word);
-    private static native boolean addBigramWordsNative(long dict, int[] word0,
-            boolean isBeginningOfSentence, int[] word1, int probability, int timestamp);
-    private static native boolean removeBigramWordsNative(long dict, int[] word0,
-            boolean isBeginningOfSentence, int[] word1);
+    private static native boolean removeUnigramEntryNative(long dict, int[] word);
+    private static native boolean addNgramEntryNative(long dict,
+            int[][] prevWordCodePointArrays, boolean[] isBeginningOfSentenceArray,
+            int[] word, int probability, int timestamp);
+    private static native boolean removeNgramEntryNative(long dict,
+            int[][] prevWordCodePointArrays, boolean[] isBeginningOfSentenceArray, int[] word);
     private static native int addMultipleDictionaryEntriesNative(long dict,
             LanguageModelParam[] languageModelParams, int startIndex);
     private static native String getPropertyNative(long dict, String query);
@@ -262,9 +263,8 @@
         }
         final DicTraverseSession session = getTraverseSession(sessionId);
         Arrays.fill(session.mInputCodePoints, Constants.NOT_A_CODE);
-        // TODO: toLowerCase in the native code
-        final int[] prevWordCodePointArray = (null == prevWordsInfo.mPrevWord)
-                ? null : StringUtils.toCodePointArray(prevWordsInfo.mPrevWord);
+        prevWordsInfo.outputToArray(session.mPrevWordCodePointArrays,
+                session.mIsBeginningOfSentenceArray);
         final InputPointers inputPointers = composer.getInputPointers();
         final boolean isGesture = composer.isBatchMode();
         final int inputSize;
@@ -286,13 +286,13 @@
         } else {
             session.mInputOutputLanguageWeight[0] = Dictionary.NOT_A_LANGUAGE_WEIGHT;
         }
-        // proximityInfo and/or prevWordForBigrams may not be null.
+        // TOOD: Pass multiple previous words information for n-gram.
         getSuggestionsNative(mNativeDict, proximityInfo.getNativeProximityInfo(),
                 getTraverseSession(sessionId).getSession(), inputPointers.getXCoordinates(),
                 inputPointers.getYCoordinates(), inputPointers.getTimes(),
                 inputPointers.getPointerIds(), session.mInputCodePoints, inputSize,
-                session.mNativeSuggestOptions.getOptions(), prevWordCodePointArray,
-                prevWordsInfo.mIsBeginningOfSentence, session.mOutputSuggestionCount,
+                session.mNativeSuggestOptions.getOptions(), session.mPrevWordCodePointArrays,
+                session.mIsBeginningOfSentenceArray, session.mOutputSuggestionCount,
                 session.mOutputCodePoints, session.mOutputScores, session.mSpaceIndices,
                 session.mOutputTypes, session.mOutputAutoCommitFirstWordConfidence,
                 session.mInputOutputLanguageWeight);
@@ -355,10 +355,13 @@
         if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) {
             return NOT_A_PROBABILITY;
         }
-        final int[] codePoints0 = StringUtils.toCodePointArray(prevWordsInfo.mPrevWord);
-        final int[] codePoints1 = StringUtils.toCodePointArray(word);
-        return getBigramProbabilityNative(mNativeDict, codePoints0,
-                prevWordsInfo.mIsBeginningOfSentence, codePoints1);
+        final int[][] prevWordCodePointArrays = new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
+        final boolean[] isBeginningOfSentenceArray =
+                new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        prevWordsInfo.outputToArray(prevWordCodePointArrays, isBeginningOfSentenceArray);
+        final int[] wordCodePoints = StringUtils.toCodePointArray(word);
+        return getNgramProbabilityNative(mNativeDict, prevWordCodePointArrays,
+                isBeginningOfSentenceArray, wordCodePoints);
     }
 
     public WordProperty getWordProperty(final String word, final boolean isBeginningOfSentence) {
@@ -422,7 +425,7 @@
         final int[] codePoints = StringUtils.toCodePointArray(word);
         final int[] shortcutTargetCodePoints = (shortcutTarget != null) ?
                 StringUtils.toCodePointArray(shortcutTarget) : null;
-        if (!addUnigramWordNative(mNativeDict, codePoints, probability, shortcutTargetCodePoints,
+        if (!addUnigramEntryNative(mNativeDict, codePoints, probability, shortcutTargetCodePoints,
                 shortcutProbability, isBeginningOfSentence, isNotAWord, isBlacklisted, timestamp)) {
             return false;
         }
@@ -436,7 +439,7 @@
             return false;
         }
         final int[] codePoints = StringUtils.toCodePointArray(word);
-        if (!removeUnigramWordNative(mNativeDict, codePoints)) {
+        if (!removeUnigramEntryNative(mNativeDict, codePoints)) {
             return false;
         }
         mHasUpdated = true;
@@ -449,10 +452,13 @@
         if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) {
             return false;
         }
-        final int[] codePoints0 = StringUtils.toCodePointArray(prevWordsInfo.mPrevWord);
-        final int[] codePoints1 = StringUtils.toCodePointArray(word);
-        if (!addBigramWordsNative(mNativeDict, codePoints0, prevWordsInfo.mIsBeginningOfSentence,
-                codePoints1, probability, timestamp)) {
+        final int[][] prevWordCodePointArrays = new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
+        final boolean[] isBeginningOfSentenceArray =
+                new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        prevWordsInfo.outputToArray(prevWordCodePointArrays, isBeginningOfSentenceArray);
+        final int[] wordCodePoints = StringUtils.toCodePointArray(word);
+        if (!addNgramEntryNative(mNativeDict, prevWordCodePointArrays,
+                isBeginningOfSentenceArray, wordCodePoints, probability, timestamp)) {
             return false;
         }
         mHasUpdated = true;
@@ -464,10 +470,13 @@
         if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) {
             return false;
         }
-        final int[] codePoints0 = StringUtils.toCodePointArray(prevWordsInfo.mPrevWord);
-        final int[] codePoints1 = StringUtils.toCodePointArray(word);
-        if (!removeBigramWordsNative(mNativeDict, codePoints0, prevWordsInfo.mIsBeginningOfSentence,
-                codePoints1)) {
+        final int[][] prevWordCodePointArrays = new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
+        final boolean[] isBeginningOfSentenceArray =
+                new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        prevWordsInfo.outputToArray(prevWordCodePointArrays, isBeginningOfSentenceArray);
+        final int[] wordCodePoints = StringUtils.toCodePointArray(word);
+        if (!removeNgramEntryNative(mNativeDict, prevWordCodePointArrays,
+                isBeginningOfSentenceArray, wordCodePoints)) {
             return false;
         }
         mHasUpdated = true;
diff --git a/java/src/com/android/inputmethod/latin/Constants.java b/java/src/com/android/inputmethod/latin/Constants.java
index f933936..43af66e 100644
--- a/java/src/com/android/inputmethod/latin/Constants.java
+++ b/java/src/com/android/inputmethod/latin/Constants.java
@@ -166,6 +166,10 @@
     // Must be equal to MAX_WORD_LENGTH in native/jni/src/defines.h
     public static final int DICTIONARY_MAX_WORD_LENGTH = 48;
 
+    // (MAX_PREV_WORD_COUNT_FOR_N_GRAM + 1)-gram is supported in Java side. Needs to modify
+    // MAX_PREV_WORD_COUNT_FOR_N_GRAM in native/jni/src/defines.h for suggestions.
+    public static final int MAX_PREV_WORD_COUNT_FOR_N_GRAM = 2;
+
     // Key events coming any faster than this are long-presses.
     public static final int LONG_PRESS_MILLISECONDS = 200;
     // TODO: Set this value appropriately.
@@ -216,6 +220,7 @@
 
     public static final String REGEXP_PERIOD = "\\.";
     public static final String STRING_SPACE = " ";
+    public static final String STRING_PERIOD_AND_SPACE = ". ";
 
     /**
      * Special keys code. Must be negative.
diff --git a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
index 96160fa..ad14c06 100644
--- a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
@@ -233,19 +233,19 @@
                 final int wordLen = StringUtils.codePointCount(word);
                 if (wordLen < MAX_WORD_LENGTH && wordLen > 1) {
                     if (DEBUG) {
-                        Log.d(TAG, "addName " + name + ", " + word + ", "
-                                + prevWordsInfo.mPrevWord);
+                        Log.d(TAG, "addName " + name + ", " + word + ", "  + prevWordsInfo);
                     }
                     runGCIfRequiredLocked(true /* mindsBlockByGC */);
                     addUnigramLocked(word, FREQUENCY_FOR_CONTACTS,
                             null /* shortcut */, 0 /* shortcutFreq */, false /* isNotAWord */,
                             false /* isBlacklisted */, BinaryDictionary.NOT_A_VALID_TIMESTAMP);
-                    if (!TextUtils.isEmpty(prevWordsInfo.mPrevWord) && mUseFirstLastBigrams) {
+                    if (!prevWordsInfo.isValid() && mUseFirstLastBigrams) {
                         runGCIfRequiredLocked(true /* mindsBlockByGC */);
                         addNgramEntryLocked(prevWordsInfo, word, FREQUENCY_FOR_CONTACTS_BIGRAM,
                                 BinaryDictionary.NOT_A_VALID_TIMESTAMP);
                     }
-                    prevWordsInfo = new PrevWordsInfo(word);
+                    prevWordsInfo = prevWordsInfo.getNextPrevWordsInfo(
+                            new PrevWordsInfo.WordInfo(word));
                 }
             }
         }
diff --git a/java/src/com/android/inputmethod/latin/DicTraverseSession.java b/java/src/com/android/inputmethod/latin/DicTraverseSession.java
index 8bbf426..b341f62 100644
--- a/java/src/com/android/inputmethod/latin/DicTraverseSession.java
+++ b/java/src/com/android/inputmethod/latin/DicTraverseSession.java
@@ -28,6 +28,10 @@
     // Must be equal to MAX_RESULTS in native/jni/src/defines.h
     private static final int MAX_RESULTS = 18;
     public final int[] mInputCodePoints = new int[Constants.DICTIONARY_MAX_WORD_LENGTH];
+    public final int[][] mPrevWordCodePointArrays =
+            new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
+    public final boolean[] mIsBeginningOfSentenceArray =
+            new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
     public final int[] mOutputSuggestionCount = new int[1];
     public final int[] mOutputCodePoints =
             new int[Constants.DICTIONARY_MAX_WORD_LENGTH * MAX_RESULTS];
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
index 304c450..b8feb22 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
@@ -23,6 +23,7 @@
 
 import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.keyboard.ProximityInfo;
+import com.android.inputmethod.latin.PrevWordsInfo.WordInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 import com.android.inputmethod.latin.personalization.ContextualDictionary;
 import com.android.inputmethod.latin.personalization.PersonalizationDataChunk;
@@ -407,13 +408,14 @@
             final boolean blockPotentiallyOffensive) {
         final Dictionaries dictionaries = mDictionaries;
         final String[] words = suggestion.split(Constants.WORD_SEPARATOR);
+        PrevWordsInfo prevWordsInfoForCurrentWord = prevWordsInfo;
         for (int i = 0; i < words.length; i++) {
             final String currentWord = words[i];
-            final PrevWordsInfo prevWordsInfoForCurrentWord =
-                    (i == 0) ? prevWordsInfo : new PrevWordsInfo(words[i - 1]);
             final boolean wasCurrentWordAutoCapitalized = (i == 0) ? wasAutoCapitalized : false;
             addWordToUserHistory(dictionaries, prevWordsInfoForCurrentWord, currentWord,
                     wasCurrentWordAutoCapitalized, timeStampInSeconds, blockPotentiallyOffensive);
+            prevWordsInfoForCurrentWord =
+                    prevWordsInfoForCurrentWord.getNextPrevWordsInfo(new WordInfo(currentWord));
         }
     }
 
@@ -639,7 +641,8 @@
                 contextualDict.addNgramEntry(prevWordsInfo, phrase[i],
                         bigramProbabilityForWords, BinaryDictionary.NOT_A_VALID_TIMESTAMP);
             }
-            prevWordsInfo = new PrevWordsInfo(phrase[i]);
+            prevWordsInfo =
+                    prevWordsInfo.getNextPrevWordsInfo(new PrevWordsInfo.WordInfo(phrase[i]));
         }
     }
 
diff --git a/java/src/com/android/inputmethod/latin/PrevWordsInfo.java b/java/src/com/android/inputmethod/latin/PrevWordsInfo.java
index 42b311c..5dda444 100644
--- a/java/src/com/android/inputmethod/latin/PrevWordsInfo.java
+++ b/java/src/com/android/inputmethod/latin/PrevWordsInfo.java
@@ -16,47 +16,122 @@
 
 package com.android.inputmethod.latin;
 
+import java.util.Arrays;
+
+import com.android.inputmethod.latin.utils.StringUtils;
+
 /**
  * Class to represent information of previous words. This class is used to add n-gram entries
  * into binary dictionaries, to get predictions, and to get suggestions.
  */
-// TODO: Support multiple previous words for n-gram.
 public class PrevWordsInfo {
-    public static final PrevWordsInfo EMPTY_PREV_WORDS_INFO = new PrevWordsInfo(null);
+    public static final PrevWordsInfo EMPTY_PREV_WORDS_INFO =
+            new PrevWordsInfo(WordInfo.EMPTY_WORD_INFO);
     public static final PrevWordsInfo BEGINNING_OF_SENTENCE = new PrevWordsInfo();
 
-    // The word immediately before the considered word. null means we don't have any context
-    // including the "beginning of sentence context" - we just don't know what to predict.
-    // An example of that is after a comma.
-    // For simplicity of implementation, this may also be null transiently after the WordComposer
-    // was reset and before starting a new composing word, but we should never be calling
-    // getSuggetions* in this situation.
-    // This is an empty string when mIsBeginningOfSentence is true.
-    public final String mPrevWord;
+    /**
+     * Word information used to represent previous words information.
+     */
+    public static class WordInfo {
+        public static final WordInfo EMPTY_WORD_INFO = new WordInfo(null);
+        public static final WordInfo BEGINNING_OF_SENTENCE = new WordInfo();
 
-    // TODO: Have sentence separator.
-    // Whether the current context is beginning of sentence or not. This is true when composing at
-    // the beginning of an input field or composing a word after a sentence separator.
-    public final boolean mIsBeginningOfSentence;
+        // This is an empty string when mIsBeginningOfSentence is true.
+        public final String mWord;
+        // TODO: Have sentence separator.
+        // Whether the current context is beginning of sentence or not. This is true when composing
+        // at the beginning of an input field or composing a word after a sentence separator.
+        public final boolean mIsBeginningOfSentence;
+
+        // Beginning of sentence.
+        public WordInfo() {
+            mWord = "";
+            mIsBeginningOfSentence = true;
+        }
+
+        public WordInfo(final String word) {
+            mWord = word;
+            mIsBeginningOfSentence = false;
+        }
+
+        public boolean isValid() {
+            return mWord != null;
+        }
+    }
+
+    // The words immediately before the considered word. EMPTY_WORD_INFO element means we don't
+    // have any context for that previous word including the "beginning of sentence context" - we
+    // just don't know what to predict using the information. An example of that is after a comma.
+    // For simplicity of implementation, elements may also be EMPTY_WORD_INFO transiently after the
+    // WordComposer was reset and before starting a new composing word, but we should never be
+    // calling getSuggetions* in this situation.
+    public WordInfo[] mPrevWordsInfo = new WordInfo[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
 
     // Beginning of sentence.
     public PrevWordsInfo() {
-        mPrevWord = "";
-        mIsBeginningOfSentence = true;
+        mPrevWordsInfo[0] = WordInfo.BEGINNING_OF_SENTENCE;
+        Arrays.fill(mPrevWordsInfo, 1 /* start */, mPrevWordsInfo.length, WordInfo.EMPTY_WORD_INFO);
     }
 
-    public PrevWordsInfo(final String prevWord) {
-        mPrevWord = prevWord;
-        mIsBeginningOfSentence = false;
+    // Construct from the previous word information.
+    public PrevWordsInfo(final WordInfo prevWordInfo) {
+        mPrevWordsInfo[0] = prevWordInfo;
+        Arrays.fill(mPrevWordsInfo, 1 /* start */, mPrevWordsInfo.length, WordInfo.EMPTY_WORD_INFO);
+    }
+
+    // Construct from WordInfo array. n-th element represents (n+1)-th previous word's information.
+    public PrevWordsInfo(final WordInfo[] prevWordsInfo) {
+        for (int i = 0; i < Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM; i++) {
+            mPrevWordsInfo[i] =
+                    (prevWordsInfo.length > i) ? prevWordsInfo[i] : WordInfo.EMPTY_WORD_INFO;
+        }
+    }
+
+    // Create next prevWordsInfo using current prevWordsInfo.
+    public PrevWordsInfo getNextPrevWordsInfo(final WordInfo wordInfo) {
+        final WordInfo[] prevWordsInfo = new WordInfo[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        prevWordsInfo[0] = wordInfo;
+        for (int i = 1; i < prevWordsInfo.length; i++) {
+            prevWordsInfo[i] = mPrevWordsInfo[i - 1];
+        }
+        return new PrevWordsInfo(prevWordsInfo);
     }
 
     public boolean isValid() {
-        return mPrevWord != null;
+        return mPrevWordsInfo[0].isValid();
+    }
+
+    public void outputToArray(final int[][] codePointArrays,
+            final boolean[] isBeginningOfSentenceArray) {
+        for (int i = 0; i < mPrevWordsInfo.length; i++) {
+            final WordInfo wordInfo = mPrevWordsInfo[i];
+            if (wordInfo == null || !wordInfo.isValid()) {
+                codePointArrays[i] = new int[0];
+                isBeginningOfSentenceArray[i] = false;
+                continue;
+            }
+            codePointArrays[i] = StringUtils.toCodePointArray(wordInfo.mWord);
+            isBeginningOfSentenceArray[i] = wordInfo.mIsBeginningOfSentence;
+        }
     }
 
     @Override
     public String toString() {
-        return "PrevWord: " + mPrevWord + ", isBeginningOfSentence: "
-                    + mIsBeginningOfSentence + ".";
+        final StringBuffer builder = new StringBuffer();
+        for (int i = 0; i < mPrevWordsInfo.length; i++) {
+            final WordInfo wordInfo = mPrevWordsInfo[i];
+            builder.append("PrevWord[");
+            builder.append(i);
+            builder.append("]: ");
+            if (!wordInfo.isValid()) {
+                builder.append("Empty. ");
+                continue;
+            }
+            builder.append(wordInfo.mWord);
+            builder.append(", isBeginningOfSentence: ");
+            builder.append(wordInfo.mIsBeginningOfSentence);
+            builder.append(". ");
+        }
+        return builder.toString();
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index 96476b2..c027892 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -603,7 +603,7 @@
                 || spacingAndPunctuations.isWordConnector(lastChar)) {
             return PrevWordsInfo.EMPTY_PREV_WORDS_INFO;
         }
-        return new PrevWordsInfo(nthPrevWord);
+        return new PrevWordsInfo(new PrevWordsInfo.WordInfo(nthPrevWord));
     }
 
     /**
@@ -741,13 +741,12 @@
         // Here we test whether we indeed have a period and a space before us. This should not
         // be needed, but it's there just in case something went wrong.
         final CharSequence textBeforeCursor = getTextBeforeCursor(2, 0);
-        final String periodSpace = ". ";
-        if (!TextUtils.equals(periodSpace, textBeforeCursor)) {
+        if (!TextUtils.equals(Constants.STRING_PERIOD_AND_SPACE, textBeforeCursor)) {
             // Theoretically we should not be coming here if there isn't ". " before the
             // cursor, but the application may be changing the text while we are typing, so
             // anything goes. We should not crash.
             Log.d(TAG, "Tried to revert double-space combo but we didn't find "
-                    + "\"" + periodSpace + "\" just before the cursor.");
+                    + "\"" + Constants.STRING_PERIOD_AND_SPACE + "\" just before the cursor.");
             return false;
         }
         // Double-space results in ". ". A backspace to cancel this should result in a single
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 9d03e8a..e43db35 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -123,39 +123,27 @@
                 suggestionsContainer.set(i, transformedWordInfo);
             }
         }
-        SuggestedWordInfo.removeDups(typedWord, suggestionsContainer);
+        final boolean didRemoveTypedWord =
+                SuggestedWordInfo.removeDups(typedWord, suggestionsContainer);
 
-        // If resumed, then we don't want to upcase everything: resuming on a fully-capitalized
-        // words is rarely done to switch to another fully-capitalized word, but usually to a
-        // normal, non-capitalized suggestion.
-        final String firstSuggestion;
+        final SuggestedWordInfo firstSuggestedWordInfo;
         final String whitelistedWord;
-        if (suggestionResults.isEmpty()) {
-            whitelistedWord = firstSuggestion = null;
+        if (suggestionsContainer.isEmpty()) {
+            firstSuggestedWordInfo = null;
+            whitelistedWord = null;
         } else {
-            final SuggestedWordInfo firstSuggestedWordInfo = getTransformedSuggestedWordInfo(
-                    suggestionResults.first(), suggestionResults.mLocale,
-                    shouldMakeSuggestionsAllUpperCase, isOnlyFirstCharCapitalized,
-                    trailingSingleQuotesCount);
-            firstSuggestion = firstSuggestedWordInfo.mWord;
+            firstSuggestedWordInfo = suggestionsContainer.get(0);
             if (!firstSuggestedWordInfo.isKindOf(SuggestedWordInfo.KIND_WHITELIST)) {
                 whitelistedWord = null;
             } else {
-                whitelistedWord = firstSuggestion;
+                whitelistedWord = firstSuggestedWordInfo.mWord;
             }
         }
 
-        // We allow auto-correction if we have a whitelisted word, or if the word is not a valid
-        // word of more than 1 char, except if the first suggestion is the same as the typed string
-        // because in this case if it's strong enough to auto-correct that will mistakenly designate
-        // the second candidate for auto-correction.
-        // TODO: stop relying on indices to find where is the auto-correction in the suggested
-        // words, and correct this test.
-        final boolean allowsToBeAutoCorrected = (null != whitelistedWord
-                && !whitelistedWord.equals(typedWord))
-                || (consideredWord.length() > 1 && !mDictionaryFacilitator.isValidWord(
-                        consideredWord, isOnlyFirstCharCapitalized)
-                        && !typedWord.equals(firstSuggestion));
+        // We allow auto-correction if we have a whitelisted word, or if the word had more than
+        // one char and was not suggested.
+        final boolean allowsToBeAutoCorrected = (null != whitelistedWord)
+                || (consideredWord.length() > 1 && !didRemoveTypedWord);
 
         final boolean hasAutoCorrection;
         // TODO: using isCorrectionEnabled here is not very good. It's probably useless, because
@@ -164,10 +152,10 @@
         // the current settings. It may also be useful to know, when the setting is off, whether
         // the word *would* have been auto-corrected.
         if (!isCorrectionEnabled || !allowsToBeAutoCorrected || isPrediction
-                || suggestionResults.isEmpty() || wordComposer.hasDigits()
+                || null == firstSuggestedWordInfo || wordComposer.hasDigits()
                 || wordComposer.isMostlyCaps() || wordComposer.isResumed()
                 || !mDictionaryFacilitator.hasInitializedMainDictionary()
-                || suggestionResults.first().isKindOf(SuggestedWordInfo.KIND_SHORTCUT)) {
+                || firstSuggestedWordInfo.isKindOf(SuggestedWordInfo.KIND_SHORTCUT)) {
             // If we don't have a main dictionary, we never want to auto-correct. The reason for
             // this is, the user may have a contact whose name happens to match a valid word in
             // their language, and it will unexpectedly auto-correct. For example, if the user
@@ -179,7 +167,7 @@
             hasAutoCorrection = false;
         } else {
             hasAutoCorrection = AutoCorrectionUtils.suggestionExceedsAutoCorrectionThreshold(
-                    suggestionResults.first(), consideredWord, mAutoCorrectionThreshold);
+                    firstSuggestedWordInfo, consideredWord, mAutoCorrectionThreshold);
         }
 
         if (!TextUtils.isEmpty(typedWord)) {
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index f22af79..e587b18 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -330,29 +330,37 @@
         }
 
         // This will always remove the higher index if a duplicate is found.
-        public static void removeDups(final String typedWord,
+        public static boolean removeDups(final String typedWord,
                 ArrayList<SuggestedWordInfo> candidates) {
             if (candidates.isEmpty()) {
-                return;
+                return false;
             }
+            final boolean didRemoveTypedWord;
             if (!TextUtils.isEmpty(typedWord)) {
-                removeSuggestedWordInfoFrom(typedWord, candidates, -1 /* startIndexExclusive */);
+                didRemoveTypedWord = removeSuggestedWordInfoFrom(typedWord, candidates,
+                        -1 /* startIndexExclusive */);
+            } else {
+                didRemoveTypedWord = false;
             }
             for (int i = 0; i < candidates.size(); ++i) {
                 removeSuggestedWordInfoFrom(candidates.get(i).mWord, candidates,
                         i /* startIndexExclusive */);
             }
+            return didRemoveTypedWord;
         }
 
-        private static void removeSuggestedWordInfoFrom(final String word,
+        private static boolean removeSuggestedWordInfoFrom(final String word,
                 final ArrayList<SuggestedWordInfo> candidates, final int startIndexExclusive) {
+            boolean didRemove = false;
             for (int i = startIndexExclusive + 1; i < candidates.size(); ++i) {
                 final SuggestedWordInfo previous = candidates.get(i);
                 if (word.equals(previous.mWord)) {
+                    didRemove = true;
                     candidates.remove(i);
                     --i;
                 }
             }
+            return didRemove;
         }
     }
 
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index faa5582..ec57cd7 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -399,7 +399,7 @@
         }
 
         boolean didAutoCorrect = false;
-        if (Event.NOT_A_KEY_CODE != event.mKeyCode) {
+        if (event.isFunctionalKeyEvent()) {
             // A special key, like delete, shift, emoji, or the settings key.
             switch (event.mKeyCode) {
             case Constants.CODE_DELETE:
@@ -728,13 +728,13 @@
             mConnection.setComposingText(getTextWithUnderline(
                     mWordComposer.getTypedWord()), 1);
         } else {
-            final boolean swapWeakSpace = maybeStripSpace(inputTransaction,
-                    inputTransaction.mEvent.isSuggestionStripPress());
+            final boolean swapWeakSpace = tryStripSpaceAndReturnWhetherShouldSwapInstead(
+                    inputTransaction, inputTransaction.mEvent.isSuggestionStripPress());
 
-            sendKeyCodePoint(settingsValues, codePoint);
-
-            if (swapWeakSpace && swapSwapperAndSpace(inputTransaction)) {
+            if (swapWeakSpace && trySwapSwapperAndSpace(inputTransaction)) {
                 mSpaceState = SpaceState.WEAK;
+            } else {
+                sendKeyCodePoint(settingsValues, codePoint);
             }
             // In case the "add to dictionary" hint was still displayed.
             mSuggestionStripViewAccessor.dismissAddToDictionaryHint();
@@ -779,7 +779,8 @@
             }
         }
 
-        final boolean swapWeakSpace = maybeStripSpace(inputTransaction, isFromSuggestionStrip);
+        final boolean swapWeakSpace = tryStripSpaceAndReturnWhetherShouldSwapInstead(
+                inputTransaction, isFromSuggestionStrip);
 
         final boolean isInsideDoubleQuoteOrAfterDigit = Constants.CODE_DOUBLE_QUOTE == codePoint
                 && mConnection.isInsideDoubleQuoteOrAfterDigit();
@@ -803,14 +804,14 @@
             promotePhantomSpace(settingsValues);
         }
 
-        if (!shouldAvoidSendingCode) {
-            sendKeyCodePoint(settingsValues, codePoint);
-        }
-
-        if (Constants.CODE_SPACE == codePoint) {
-            if (maybeDoubleSpacePeriod(inputTransaction)) {
-                mSpaceState = SpaceState.DOUBLE;
-            } else if (!mSuggestedWords.isPunctuationSuggestions()) {
+        if (tryPerformDoubleSpacePeriod(inputTransaction)) {
+            mSpaceState = SpaceState.DOUBLE;
+            inputTransaction.setRequiresUpdateSuggestions();
+        } else if (swapWeakSpace && trySwapSwapperAndSpace(inputTransaction)) {
+            mSpaceState = SpaceState.SWAP_PUNCTUATION;
+            mSuggestionStripViewAccessor.setNeutralSuggestionStrip();
+        } else if (Constants.CODE_SPACE == codePoint) {
+            if (!mSuggestedWords.isPunctuationSuggestions()) {
                 mSpaceState = SpaceState.WEAK;
             }
 
@@ -818,12 +819,12 @@
             if (wasComposingWord || mSuggestedWords.isEmpty()) {
                 inputTransaction.setRequiresUpdateSuggestions();
             }
+
+            if (!shouldAvoidSendingCode) {
+                sendKeyCodePoint(settingsValues, codePoint);
+            }
         } else {
-            if (swapWeakSpace) {
-                if (swapSwapperAndSpace(inputTransaction)) {
-                    mSpaceState = SpaceState.SWAP_PUNCTUATION;
-                }
-            } else if ((SpaceState.PHANTOM == inputTransaction.mSpaceState
+            if ((SpaceState.PHANTOM == inputTransaction.mSpaceState
                     && settingsValues.isUsuallyFollowedBySpace(codePoint))
                     || (Constants.CODE_DOUBLE_QUOTE == codePoint
                             && isInsideDoubleQuoteOrAfterDigit)) {
@@ -841,6 +842,8 @@
                 mSpaceState = SpaceState.PHANTOM;
             }
 
+            sendKeyCodePoint(settingsValues, codePoint);
+
             // Set punctuation right away. onUpdateSelection will fire but tests whether it is
             // already displayed or not, so it's okay.
             mSuggestionStripViewAccessor.setNeutralSuggestionStrip();
@@ -1008,17 +1011,16 @@
      * @param inputTransaction The transaction in progress.
      * @return true if the swap has been performed, false if it was prevented by preliminary checks.
      */
-    private boolean swapSwapperAndSpace(final InputTransaction inputTransaction) {
-        final CharSequence lastTwo = mConnection.getTextBeforeCursor(2, 0);
-        // It is guaranteed lastTwo.charAt(1) is a swapper - else this method is not called.
-        if (lastTwo != null && lastTwo.length() == 2 && lastTwo.charAt(0) == Constants.CODE_SPACE) {
-            mConnection.deleteSurroundingText(2, 0);
-            final String text = lastTwo.charAt(1) + " ";
-            mConnection.commitText(text, 1);
-            inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW);
-            return true;
+    private boolean trySwapSwapperAndSpace(final InputTransaction inputTransaction) {
+        final int codePointBeforeCursor = mConnection.getCodePointBeforeCursor();
+        if (Constants.CODE_SPACE != codePointBeforeCursor) {
+            return false;
         }
-        return false;
+        mConnection.deleteSurroundingText(1, 0);
+        final String text = inputTransaction.mEvent.getTextToCommit() + " ";
+        mConnection.commitText(text, 1);
+        inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW);
+        return true;
     }
 
     /*
@@ -1027,8 +1029,8 @@
      * @param isFromSuggestionStrip Whether this code point is coming from the suggestion strip.
      * @return whether we should swap the space instead of removing it.
      */
-    private boolean maybeStripSpace(final InputTransaction inputTransaction,
-            final boolean isFromSuggestionStrip) {
+    private boolean tryStripSpaceAndReturnWhetherShouldSwapInstead(
+            final InputTransaction inputTransaction, final boolean isFromSuggestionStrip) {
         final int codePoint = inputTransaction.mEvent.mCodePoint;
         if (Constants.CODE_ENTER == codePoint &&
                 SpaceState.SWAP_PUNCTUATION == inputTransaction.mSpaceState) {
@@ -1069,36 +1071,37 @@
      * period-space sequence of characters. This typically happens when the user presses space
      * twice in a row quickly.
      * This method will check that the double-space-to-period is active in settings, that the
-     * two spaces have been input close enough together, and that the previous character allows
-     * for the transformation to take place. If all of these conditions are fulfilled, this
-     * method applies the transformation and returns true. Otherwise, it does nothing and
-     * returns false.
+     * two spaces have been input close enough together, that the typed character is a space
+     * and that the previous character allows for the transformation to take place. If all of
+     * these conditions are fulfilled, this method applies the transformation and returns true.
+     * Otherwise, it does nothing and returns false.
      *
      * @param inputTransaction The transaction in progress.
      * @return true if we applied the double-space-to-period transformation, false otherwise.
      */
-    private boolean maybeDoubleSpacePeriod(final InputTransaction inputTransaction) {
-        if (!inputTransaction.mSettingsValues.mUseDoubleSpacePeriod) return false;
-        // This can't happen right now because we don't call this method when the code is not space
-        if (Constants.CODE_SPACE != inputTransaction.mEvent.mCodePoint) return false;
-        if (!isDoubleSpacePeriodCountdownActive(inputTransaction)) return false;
-        // We only do this when we see two spaces and an accepted code point before the cursor.
-        // The code point may be a surrogate pair but the two spaces may not, so we need 4 chars.
-        final CharSequence lastThree = mConnection.getTextBeforeCursor(4, 0);
-        if (null == lastThree) return false;
-        final int length = lastThree.length();
-        if (length < 3) return false;
-        if (lastThree.charAt(length - 1) != Constants.CODE_SPACE) return false;
-        if (lastThree.charAt(length - 2) != Constants.CODE_SPACE) return false;
-        // We know there are spaces in pos -1 and -2, and we have at least three chars.
-        // If we have only three chars, isSurrogatePairs can't return true as charAt(1) is a space,
-        // so this is fine.
+    private boolean tryPerformDoubleSpacePeriod(final InputTransaction inputTransaction) {
+        // Check the setting, the typed character and the countdown. If any of the conditions is
+        // not fulfilled, return false.
+        if (!inputTransaction.mSettingsValues.mUseDoubleSpacePeriod
+                || Constants.CODE_SPACE != inputTransaction.mEvent.mCodePoint
+                || !isDoubleSpacePeriodCountdownActive(inputTransaction)) {
+            return false;
+        }
+        // We only do this when we see one space and an accepted code point before the cursor.
+        // The code point may be a surrogate pair but the space may not, so we need 3 chars.
+        final CharSequence lastTwo = mConnection.getTextBeforeCursor(3, 0);
+        if (null == lastTwo) return false;
+        final int length = lastTwo.length();
+        if (length < 2) return false;
+        if (lastTwo.charAt(length - 1) != Constants.CODE_SPACE) return false;
+        // We know there is a space in pos -1, and we have at least two chars. If we have only two
+        // chars, isSurrogatePairs can't return true as charAt(1) is a space, so this is fine.
         final int firstCodePoint =
-                Character.isSurrogatePair(lastThree.charAt(0), lastThree.charAt(1)) ?
-                        Character.codePointAt(lastThree, 0) : lastThree.charAt(length - 3);
+                Character.isSurrogatePair(lastTwo.charAt(0), lastTwo.charAt(1)) ?
+                        Character.codePointAt(lastTwo, length - 3) : lastTwo.charAt(length - 2);
         if (canBeFollowedByDoubleSpacePeriod(firstCodePoint)) {
             cancelDoubleSpacePeriodCountdown();
-            mConnection.deleteSurroundingText(2, 0);
+            mConnection.deleteSurroundingText(1, 0);
             final String textToInsert = inputTransaction.mSettingsValues.mSpacingAndPunctuations
                     .mSentenceSeparatorAndSpace;
             mConnection.commitText(textToInsert, 1);
@@ -1533,7 +1536,8 @@
         } else {
             return LastComposedWord.NOT_A_COMPOSED_WORD == mLastComposedWord ?
                     PrevWordsInfo.BEGINNING_OF_SENTENCE :
-                            new PrevWordsInfo(mLastComposedWord.mCommittedWord.toString());
+                            new PrevWordsInfo(new PrevWordsInfo.WordInfo(
+                                    mLastComposedWord.mCommittedWord.toString()));
         }
     }
 
diff --git a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
index 3916fc2..a98b0f1 100644
--- a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
@@ -60,7 +60,7 @@
     public static void addToDictionary(final ExpandableBinaryDictionary userHistoryDictionary,
             final PrevWordsInfo prevWordsInfo, final String word, final boolean isValid,
             final int timestamp, final DistracterFilter distracterFilter) {
-        final String prevWord = prevWordsInfo.mPrevWord;
+        final String prevWord = prevWordsInfo.mPrevWordsInfo[0].mWord;
         if (word.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH ||
                 (prevWord != null && prevWord.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH)) {
             return;
@@ -75,7 +75,13 @@
             return;
         }
         if (null != prevWord) {
-            userHistoryDictionary.addNgramEntry(prevWordsInfo, word, frequency, timestamp);
+            if (prevWordsInfo.mPrevWordsInfo[0].mIsBeginningOfSentence) {
+                // Beginning-of-Sentence n-gram entry is treated as a n-gram entry of invalid word.
+                userHistoryDictionary.addNgramEntry(prevWordsInfo, word,
+                        FREQUENCY_FOR_WORDS_NOT_IN_DICTS, timestamp);
+            } else {
+                userHistoryDictionary.addNgramEntry(prevWordsInfo, word, frequency, timestamp);
+            }
         }
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
index 8d49564..d031624 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -37,6 +37,7 @@
 import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
 import com.android.inputmethod.latin.utils.CollectionUtils;
 import com.android.inputmethod.latin.utils.LocaleUtils;
+import com.android.inputmethod.latin.utils.ScriptUtils;
 import com.android.inputmethod.latin.utils.StringUtils;
 
 import java.lang.ref.WeakReference;
@@ -78,40 +79,8 @@
     private final HashSet<WeakReference<DictionaryCollection>> mDictionaryCollectionsList =
             new HashSet<>();
 
-    public static final int SCRIPT_LATIN = 0;
-    public static final int SCRIPT_CYRILLIC = 1;
-    public static final int SCRIPT_GREEK = 2;
     public static final String SINGLE_QUOTE = "\u0027";
     public static final String APOSTROPHE = "\u2019";
-    private static final TreeMap<String, Integer> mLanguageToScript;
-    static {
-        // List of the supported languages and their associated script. We won't check
-        // words written in another script than the selected script, because we know we
-        // don't have those in our dictionary so we will underline everything and we
-        // will never have any suggestions, so it makes no sense checking them, and this
-        // is done in {@link #shouldFilterOut}. Also, the script is used to choose which
-        // proximity to pass to the dictionary descent algorithm.
-        // IMPORTANT: this only contains languages - do not write countries in there.
-        // Only the language is searched from the map.
-        mLanguageToScript = new TreeMap<>();
-        mLanguageToScript.put("cs", SCRIPT_LATIN);
-        mLanguageToScript.put("da", SCRIPT_LATIN);
-        mLanguageToScript.put("de", SCRIPT_LATIN);
-        mLanguageToScript.put("el", SCRIPT_GREEK);
-        mLanguageToScript.put("en", SCRIPT_LATIN);
-        mLanguageToScript.put("es", SCRIPT_LATIN);
-        mLanguageToScript.put("fi", SCRIPT_LATIN);
-        mLanguageToScript.put("fr", SCRIPT_LATIN);
-        mLanguageToScript.put("hr", SCRIPT_LATIN);
-        mLanguageToScript.put("it", SCRIPT_LATIN);
-        mLanguageToScript.put("lt", SCRIPT_LATIN);
-        mLanguageToScript.put("lv", SCRIPT_LATIN);
-        mLanguageToScript.put("nb", SCRIPT_LATIN);
-        mLanguageToScript.put("nl", SCRIPT_LATIN);
-        mLanguageToScript.put("pt", SCRIPT_LATIN);
-        mLanguageToScript.put("sl", SCRIPT_LATIN);
-        mLanguageToScript.put("ru", SCRIPT_CYRILLIC);
-    }
 
     @Override public void onCreate() {
         super.onCreate();
@@ -122,22 +91,13 @@
         onSharedPreferenceChanged(prefs, PREF_USE_CONTACTS_KEY);
     }
 
-    public static int getScriptFromLocale(final Locale locale) {
-        final Integer script = mLanguageToScript.get(locale.getLanguage());
-        if (null == script) {
-            throw new RuntimeException("We have been called with an unsupported language: \""
-                    + locale.getLanguage() + "\". Framework bug?");
-        }
-        return script;
-    }
-
     private static String getKeyboardLayoutNameForScript(final int script) {
         switch (script) {
-        case AndroidSpellCheckerService.SCRIPT_LATIN:
+        case ScriptUtils.SCRIPT_LATIN:
             return "qwerty";
-        case AndroidSpellCheckerService.SCRIPT_CYRILLIC:
+        case ScriptUtils.SCRIPT_CYRILLIC:
             return "east_slavic";
-        case AndroidSpellCheckerService.SCRIPT_GREEK:
+        case ScriptUtils.SCRIPT_GREEK:
             return "greek";
         default:
             throw new RuntimeException("Wrong script supplied: " + script);
@@ -413,7 +373,7 @@
     }
 
     public DictAndKeyboard createDictAndKeyboard(final Locale locale) {
-        final int script = getScriptFromLocale(locale);
+        final int script = ScriptUtils.getScriptFromLocale(locale);
         final String keyboardLayoutName = getKeyboardLayoutNameForScript(script);
         final InputMethodSubtype subtype = AdditionalSubtypeUtils.createAdditionalSubtype(
                 locale.toString(), keyboardLayoutName, null);
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java
index 55274cf..6bfd354 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java
@@ -61,7 +61,8 @@
             final int offset = ssi.getOffsetAt(i);
             final int length = ssi.getLengthAt(i);
             final String subText = typedText.substring(offset, offset + length);
-            final PrevWordsInfo prevWordsInfo = new PrevWordsInfo(currentWord);
+            final PrevWordsInfo prevWordsInfo =
+                    new PrevWordsInfo(new PrevWordsInfo.WordInfo(currentWord));
             currentWord = subText;
             if (!subText.contains(AndroidSpellCheckerService.SINGLE_QUOTE)) {
                 continue;
@@ -203,7 +204,8 @@
                 } else {
                     prevWord = null;
                 }
-                final PrevWordsInfo prevWordsInfo = new PrevWordsInfo(prevWord);
+                final PrevWordsInfo prevWordsInfo =
+                        new PrevWordsInfo(new PrevWordsInfo.WordInfo(prevWord));
                 retval[i] = onGetSuggestionsInternal(textInfos[i], prevWordsInfo, suggestionsLimit);
                 retval[i].setCookieAndSequence(textInfos[i].getCookie(),
                         textInfos[i].getSequence());
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
index 54eebe3..be33f33 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
@@ -36,6 +36,7 @@
 import com.android.inputmethod.latin.spellcheck.AndroidSpellCheckerService.SuggestionsGatherer;
 import com.android.inputmethod.latin.utils.CoordinateUtils;
 import com.android.inputmethod.latin.utils.LocaleUtils;
+import com.android.inputmethod.latin.utils.ScriptUtils;
 import com.android.inputmethod.latin.utils.StringUtils;
 
 import java.util.ArrayList;
@@ -72,10 +73,10 @@
 
         // TODO: Support n-gram input
         private static String generateKey(final String query, final PrevWordsInfo prevWordsInfo) {
-            if (TextUtils.isEmpty(query) || TextUtils.isEmpty(prevWordsInfo.mPrevWord)) {
+            if (TextUtils.isEmpty(query) || !prevWordsInfo.isValid()) {
                 return query;
             }
-            return query + CHAR_DELIMITER + prevWordsInfo.mPrevWord;
+            return query + CHAR_DELIMITER + prevWordsInfo;
         }
 
         public SuggestionsParams getSuggestionsFromCache(String query,
@@ -116,7 +117,7 @@
         final String localeString = getLocale();
         mDictionaryPool = mService.getDictionaryPool(localeString);
         mLocale = LocaleUtils.constructLocaleFromString(localeString);
-        mScript = AndroidSpellCheckerService.getScriptFromLocale(mLocale);
+        mScript = ScriptUtils.getScriptFromLocale(mLocale);
     }
 
     @Override
@@ -125,44 +126,6 @@
         cres.unregisterContentObserver(mObserver);
     }
 
-    /*
-     * Returns whether the code point is a letter that makes sense for the specified
-     * locale for this spell checker.
-     * The dictionaries supported by Latin IME are described in res/xml/spellchecker.xml
-     * and is limited to EFIGS languages and Russian.
-     * Hence at the moment this explicitly tests for Cyrillic characters or Latin characters
-     * as appropriate, and explicitly excludes CJK, Arabic and Hebrew characters.
-     */
-    private static boolean isLetterCheckableByLanguage(final int codePoint,
-            final int script) {
-        switch (script) {
-        case AndroidSpellCheckerService.SCRIPT_LATIN:
-            // Our supported latin script dictionaries (EFIGS) at the moment only include
-            // characters in the C0, C1, Latin Extended A and B, IPA extensions unicode
-            // blocks. As it happens, those are back-to-back in the code range 0x40 to 0x2AF,
-            // so the below is a very efficient way to test for it. As for the 0-0x3F, it's
-            // excluded from isLetter anyway.
-            return codePoint <= 0x2AF && Character.isLetter(codePoint);
-        case AndroidSpellCheckerService.SCRIPT_CYRILLIC:
-            // All Cyrillic characters are in the 400~52F block. There are some in the upper
-            // Unicode range, but they are archaic characters that are not used in modern
-            // Russian and are not used by our dictionary.
-            return codePoint >= 0x400 && codePoint <= 0x52F && Character.isLetter(codePoint);
-        case AndroidSpellCheckerService.SCRIPT_GREEK:
-            // Greek letters are either in the 370~3FF range (Greek & Coptic), or in the
-            // 1F00~1FFF range (Greek extended). Our dictionary contains both sort of characters.
-            // Our dictionary also contains a few words with 0xF2; it would be best to check
-            // if that's correct, but a web search does return results for these words so
-            // they are probably okay.
-            return (codePoint >= 0x370 && codePoint <= 0x3FF)
-                    || (codePoint >= 0x1F00 && codePoint <= 0x1FFF)
-                    || codePoint == 0xF2;
-        default:
-            // Should never come here
-            throw new RuntimeException("Impossible value of script: " + script);
-        }
-    }
-
     private static final int CHECKABILITY_CHECKABLE = 0;
     private static final int CHECKABILITY_TOO_MANY_NON_LETTERS = 1;
     private static final int CHECKABILITY_CONTAINS_PERIOD = 2;
@@ -189,7 +152,7 @@
         // Filter by first letter
         final int firstCodePoint = text.codePointAt(0);
         // Filter out words that don't start with a letter or an apostrophe
-        if (!isLetterCheckableByLanguage(firstCodePoint, script)
+        if (!ScriptUtils.isLetterCheckableByScript(firstCodePoint, script)
                 && '\'' != firstCodePoint) return CHECKABILITY_FIRST_LETTER_UNCHECKABLE;
 
         // Filter contents
@@ -210,7 +173,7 @@
             if (Constants.CODE_PERIOD == codePoint) {
                 return CHECKABILITY_CONTAINS_PERIOD;
             }
-            if (isLetterCheckableByLanguage(codePoint, script)) ++letterCount;
+            if (ScriptUtils.isLetterCheckableByScript(codePoint, script)) ++letterCount;
         }
         // Guestimate heuristic: perform spell checking if at least 3/4 of the characters
         // in this word are letters
@@ -295,7 +258,9 @@
                             return new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO
                                     | SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS,
                                     new String[] {
-                                            TextUtils.join(Constants.STRING_SPACE, splitText) });
+                                            TextUtils.join(Constants.STRING_SPACE, splitText),
+                                            TextUtils.join(Constants.STRING_PERIOD_AND_SPACE,
+                                                    splitText) });
                         }
                     }
                     return dictInfo.mDictionary.isValidWord(inText)
diff --git a/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java b/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java
index 4248beb..9ec19ef 100644
--- a/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java
+++ b/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java
@@ -117,7 +117,8 @@
                 continue;
             }
             languageModelParams.add(languageModelParam);
-            prevWordsInfo = new PrevWordsInfo(languageModelParam.mTargetWord);
+            prevWordsInfo = prevWordsInfo.getNextPrevWordsInfo(
+                    new PrevWordsInfo.WordInfo(tempWord));
         }
         return languageModelParams;
     }
@@ -153,7 +154,7 @@
             final DistracterFilter distracterFilter) {
         final String word;
         if (StringUtils.getCapitalizationType(targetWord) == StringUtils.CAPITALIZE_FIRST
-                && prevWordsInfo.mPrevWord == null && !isValidWord) {
+                && !prevWordsInfo.isValid() && !isValidWord) {
             word = targetWord.toLowerCase(locale);
         } else {
             word = targetWord;
@@ -167,7 +168,7 @@
         }
         final int unigramProbability = isValidWord ?
                 UNIGRAM_PROBABILITY_FOR_VALID_WORD : UNIGRAM_PROBABILITY_FOR_OOV_WORD;
-        if (prevWordsInfo.mPrevWord == null) {
+        if (!prevWordsInfo.isValid()) {
             if (DEBUG) {
                 Log.d(TAG, "--- add unigram: current("
                         + (isValidWord ? "Valid" : "OOV") + ") = " + word);
@@ -175,12 +176,12 @@
             return new LanguageModelParam(word, unigramProbability, timestamp);
         }
         if (DEBUG) {
-            Log.d(TAG, "--- add bigram: prev = " + prevWordsInfo.mPrevWord + ", current("
+            Log.d(TAG, "--- add bigram: prev = " + prevWordsInfo + ", current("
                     + (isValidWord ? "Valid" : "OOV") + ") = " + word);
         }
         final int bigramProbability = isValidWord ?
                 BIGRAM_PROBABILITY_FOR_VALID_WORD : BIGRAM_PROBABILITY_FOR_OOV_WORD;
-        return new LanguageModelParam(prevWordsInfo.mPrevWord, word, unigramProbability,
-                bigramProbability, timestamp);
+        return new LanguageModelParam(prevWordsInfo.mPrevWordsInfo[0].mWord, word,
+                unigramProbability, bigramProbability, timestamp);
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/utils/ScriptUtils.java b/java/src/com/android/inputmethod/latin/utils/ScriptUtils.java
new file mode 100644
index 0000000..4dfb38d
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/utils/ScriptUtils.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.latin.utils;
+
+import java.util.Locale;
+import java.util.TreeMap;
+
+/**
+ * A class to help with handling different writing scripts.
+ */
+public class ScriptUtils {
+    public static final int SCRIPT_LATIN = 0;
+    public static final int SCRIPT_CYRILLIC = 1;
+    public static final int SCRIPT_GREEK = 2;
+    public static final TreeMap<String, Integer> mLanguageToScript;
+    static {
+        // List of the supported languages and their associated script. We won't check
+        // words written in another script than the selected script, because we know we
+        // don't have those in our dictionary so we will underline everything and we
+        // will never have any suggestions, so it makes no sense checking them, and this
+        // is done in {@link #shouldFilterOut}. Also, the script is used to choose which
+        // proximity to pass to the dictionary descent algorithm.
+        // IMPORTANT: this only contains languages - do not write countries in there.
+        // Only the language is searched from the map.
+        mLanguageToScript = new TreeMap<>();
+        mLanguageToScript.put("cs", SCRIPT_LATIN);
+        mLanguageToScript.put("da", SCRIPT_LATIN);
+        mLanguageToScript.put("de", SCRIPT_LATIN);
+        mLanguageToScript.put("el", SCRIPT_GREEK);
+        mLanguageToScript.put("en", SCRIPT_LATIN);
+        mLanguageToScript.put("es", SCRIPT_LATIN);
+        mLanguageToScript.put("fi", SCRIPT_LATIN);
+        mLanguageToScript.put("fr", SCRIPT_LATIN);
+        mLanguageToScript.put("hr", SCRIPT_LATIN);
+        mLanguageToScript.put("it", SCRIPT_LATIN);
+        mLanguageToScript.put("lt", SCRIPT_LATIN);
+        mLanguageToScript.put("lv", SCRIPT_LATIN);
+        mLanguageToScript.put("nb", SCRIPT_LATIN);
+        mLanguageToScript.put("nl", SCRIPT_LATIN);
+        mLanguageToScript.put("pt", SCRIPT_LATIN);
+        mLanguageToScript.put("sl", SCRIPT_LATIN);
+        mLanguageToScript.put("ru", SCRIPT_CYRILLIC);
+    }
+    /*
+     * Returns whether the code point is a letter that makes sense for the specified
+     * locale for this spell checker.
+     * The dictionaries supported by Latin IME are described in res/xml/spellchecker.xml
+     * and is limited to EFIGS languages and Russian.
+     * Hence at the moment this explicitly tests for Cyrillic characters or Latin characters
+     * as appropriate, and explicitly excludes CJK, Arabic and Hebrew characters.
+     */
+    public static boolean isLetterCheckableByScript(final int codePoint, final int script) {
+        switch (script) {
+        case SCRIPT_LATIN:
+            // Our supported latin script dictionaries (EFIGS) at the moment only include
+            // characters in the C0, C1, Latin Extended A and B, IPA extensions unicode
+            // blocks. As it happens, those are back-to-back in the code range 0x40 to 0x2AF,
+            // so the below is a very efficient way to test for it. As for the 0-0x3F, it's
+            // excluded from isLetter anyway.
+            return codePoint <= 0x2AF && Character.isLetter(codePoint);
+        case SCRIPT_CYRILLIC:
+            // All Cyrillic characters are in the 400~52F block. There are some in the upper
+            // Unicode range, but they are archaic characters that are not used in modern
+            // Russian and are not used by our dictionary.
+            return codePoint >= 0x400 && codePoint <= 0x52F && Character.isLetter(codePoint);
+        case SCRIPT_GREEK:
+            // Greek letters are either in the 370~3FF range (Greek & Coptic), or in the
+            // 1F00~1FFF range (Greek extended). Our dictionary contains both sort of characters.
+            // Our dictionary also contains a few words with 0xF2; it would be best to check
+            // if that's correct, but a web search does return results for these words so
+            // they are probably okay.
+            return (codePoint >= 0x370 && codePoint <= 0x3FF)
+                    || (codePoint >= 0x1F00 && codePoint <= 0x1FFF)
+                    || codePoint == 0xF2;
+        default:
+            // Should never come here
+            throw new RuntimeException("Impossible value of script: " + script);
+        }
+    }
+
+    public static int getScriptFromLocale(final Locale locale) {
+        final Integer script = mLanguageToScript.get(locale.getLanguage());
+        if (null == script) {
+            throw new RuntimeException("We have been called with an unsupported language: \""
+                    + locale.getLanguage() + "\". Framework bug?");
+        }
+        return script;
+    }
+}
diff --git a/native/jni/HostUnitTests.mk b/native/jni/HostUnitTests.mk
index 572d365..6967d9b 100644
--- a/native/jni/HostUnitTests.mk
+++ b/native/jni/HostUnitTests.mk
@@ -44,7 +44,7 @@
 LOCAL_MODULE := liblatinime_host_unittests
 LOCAL_MODULE_TAGS := tests
 LOCAL_SRC_FILES := $(addprefix $(LATIN_IME_TEST_SRC_DIR)/, $(LATIN_IME_CORE_TEST_FILES))
-LOCAL_STATIC_LIBRARIES += liblatinime_host_static_for_unittests libgtest_host libgtest_main_host
+LOCAL_STATIC_LIBRARIES += liblatinime_host_static_for_unittests
 include $(BUILD_HOST_NATIVE_TEST)
 
 endif # Darwin - TODO: Remove this
diff --git a/native/jni/NativeFileList.mk b/native/jni/NativeFileList.mk
index 2dd75c4..fe21061 100644
--- a/native/jni/NativeFileList.mk
+++ b/native/jni/NativeFileList.mk
@@ -26,7 +26,6 @@
         dic_node_utils.cpp \
         dic_nodes_cache.cpp) \
     $(addprefix suggest/core/dictionary/, \
-        bigram_dictionary.cpp \
         dictionary.cpp \
         dictionary_utils.cpp \
         digraph_utils.cpp \
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index 2654a4a..22ad2d0 100644
--- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -178,7 +178,7 @@
         jlong proximityInfo, jlong dicTraverseSession, jintArray xCoordinatesArray,
         jintArray yCoordinatesArray, jintArray timesArray, jintArray pointerIdsArray,
         jintArray inputCodePointsArray, jint inputSize, jintArray suggestOptions,
-        jintArray prevWordCodePointsForBigrams, jboolean isBeginningOfSentence,
+        jobjectArray prevWordCodePointArrays, jbooleanArray isBeginningOfSentenceArray,
         jintArray outSuggestionCount, jintArray outCodePointsArray, jintArray outScoresArray,
         jintArray outSpaceIndicesArray, jintArray outTypesArray,
         jintArray outAutoCommitFirstWordConfidenceArray, jfloatArray inOutLanguageWeight) {
@@ -201,20 +201,11 @@
     int pointerIds[inputSize];
     const jsize inputCodePointsLength = env->GetArrayLength(inputCodePointsArray);
     int inputCodePoints[inputCodePointsLength];
-    const jsize prevWordCodePointsLength =
-            prevWordCodePointsForBigrams ? env->GetArrayLength(prevWordCodePointsForBigrams) : 0;
-    int prevWordCodePointsInternal[prevWordCodePointsLength];
-    int *prevWordCodePoints = nullptr;
     env->GetIntArrayRegion(xCoordinatesArray, 0, inputSize, xCoordinates);
     env->GetIntArrayRegion(yCoordinatesArray, 0, inputSize, yCoordinates);
     env->GetIntArrayRegion(timesArray, 0, inputSize, times);
     env->GetIntArrayRegion(pointerIdsArray, 0, inputSize, pointerIds);
     env->GetIntArrayRegion(inputCodePointsArray, 0, inputCodePointsLength, inputCodePoints);
-    if (prevWordCodePointsForBigrams) {
-        env->GetIntArrayRegion(prevWordCodePointsForBigrams, 0, prevWordCodePointsLength,
-                prevWordCodePointsInternal);
-        prevWordCodePoints = prevWordCodePointsInternal;
-    }
 
     const jsize numberOfOptions = env->GetArrayLength(suggestOptions);
     int options[numberOfOptions];
@@ -248,8 +239,8 @@
     float languageWeight;
     env->GetFloatArrayRegion(inOutLanguageWeight, 0, 1 /* len */, &languageWeight);
     SuggestionResults suggestionResults(MAX_RESULTS);
-    const PrevWordsInfo prevWordsInfo(prevWordCodePoints, prevWordCodePointsLength,
-            isBeginningOfSentence);
+    const PrevWordsInfo prevWordsInfo = JniDataUtils::constructPrevWordsInfo(env,
+            prevWordCodePointArrays, isBeginningOfSentenceArray);
     if (givenSuggestOptions.isGesture() || inputSize > 0) {
         // TODO: Use SuggestionResults to return suggestions.
         dictionary->getSuggestions(pInfo, traverseSession, xCoordinates, yCoordinates,
@@ -283,18 +274,17 @@
     return dictionary->getMaxProbabilityOfExactMatches(codePoints, wordLength);
 }
 
-static jint latinime_BinaryDictionary_getBigramProbability(JNIEnv *env, jclass clazz,
-        jlong dict, jintArray word0, jboolean isBeginningOfSentence, jintArray word1) {
+static jint latinime_BinaryDictionary_getNgramProbability(JNIEnv *env, jclass clazz,
+        jlong dict, jobjectArray prevWordCodePointArrays, jbooleanArray isBeginningOfSentenceArray,
+        jintArray word) {
     Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
     if (!dictionary) return JNI_FALSE;
-    const jsize word0Length = env->GetArrayLength(word0);
-    const jsize word1Length = env->GetArrayLength(word1);
-    int word0CodePoints[word0Length];
-    int word1CodePoints[word1Length];
-    env->GetIntArrayRegion(word0, 0, word0Length, word0CodePoints);
-    env->GetIntArrayRegion(word1, 0, word1Length, word1CodePoints);
-    const PrevWordsInfo prevWordsInfo(word0CodePoints, word0Length, isBeginningOfSentence);
-    return dictionary->getBigramProbability(&prevWordsInfo, word1CodePoints, word1Length);
+    const jsize wordLength = env->GetArrayLength(word);
+    int wordCodePoints[wordLength];
+    env->GetIntArrayRegion(word, 0, wordLength, wordCodePoints);
+    const PrevWordsInfo prevWordsInfo = JniDataUtils::constructPrevWordsInfo(env,
+            prevWordCodePointArrays, isBeginningOfSentenceArray);
+    return dictionary->getNgramProbability(&prevWordsInfo, wordCodePoints, wordLength);
 }
 
 // Method to iterate all words in the dictionary for makedict.
@@ -355,7 +345,7 @@
             outShortcutProbabilities);
 }
 
-static bool latinime_BinaryDictionary_addUnigramWord(JNIEnv *env, jclass clazz, jlong dict,
+static bool latinime_BinaryDictionary_addUnigramEntry(JNIEnv *env, jclass clazz, jlong dict,
         jintArray word, jint probability, jintArray shortcutTarget, jint shortcutProbability,
         jboolean isBeginningOfSentence, jboolean isNotAWord, jboolean isBlacklisted,
         jint timestamp) {
@@ -378,7 +368,7 @@
     return dictionary->addUnigramEntry(codePoints, codePointCount, &unigramProperty);
 }
 
-static bool latinime_BinaryDictionary_removeUnigramWord(JNIEnv *env, jclass clazz, jlong dict,
+static bool latinime_BinaryDictionary_removeUnigramEntry(JNIEnv *env, jclass clazz, jlong dict,
         jintArray word) {
     Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
     if (!dictionary) {
@@ -390,42 +380,39 @@
     return dictionary->removeUnigramEntry(codePoints, codePointCount);
 }
 
-static bool latinime_BinaryDictionary_addBigramWords(JNIEnv *env, jclass clazz, jlong dict,
-        jintArray word0, jboolean isBeginningOfSentence, jintArray word1, jint probability,
-        jint timestamp) {
+static bool latinime_BinaryDictionary_addNgramEntry(JNIEnv *env, jclass clazz, jlong dict,
+        jobjectArray prevWordCodePointArrays, jbooleanArray isBeginningOfSentenceArray,
+        jintArray word, jint probability, jint timestamp) {
     Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
     if (!dictionary) {
         return false;
     }
-    jsize word0Length = env->GetArrayLength(word0);
-    int word0CodePoints[word0Length];
-    env->GetIntArrayRegion(word0, 0, word0Length, word0CodePoints);
-    jsize word1Length = env->GetArrayLength(word1);
-    int word1CodePoints[word1Length];
-    env->GetIntArrayRegion(word1, 0, word1Length, word1CodePoints);
+    const PrevWordsInfo prevWordsInfo = JniDataUtils::constructPrevWordsInfo(env,
+            prevWordCodePointArrays, isBeginningOfSentenceArray);
+    jsize wordLength = env->GetArrayLength(word);
+    int wordCodePoints[wordLength];
+    env->GetIntArrayRegion(word, 0, wordLength, wordCodePoints);
     const std::vector<int> bigramTargetCodePoints(
-            word1CodePoints, word1CodePoints + word1Length);
+            wordCodePoints, wordCodePoints + wordLength);
     // Use 1 for count to indicate the bigram has inputted.
     const BigramProperty bigramProperty(&bigramTargetCodePoints, probability,
             timestamp, 0 /* level */, 1 /* count */);
-    const PrevWordsInfo prevWordsInfo(word0CodePoints, word0Length, isBeginningOfSentence);
     return dictionary->addNgramEntry(&prevWordsInfo, &bigramProperty);
 }
 
-static bool latinime_BinaryDictionary_removeBigramWords(JNIEnv *env, jclass clazz, jlong dict,
-        jintArray word0, jboolean isBeginningOfSentence, jintArray word1) {
+static bool latinime_BinaryDictionary_removeNgramEntry(JNIEnv *env, jclass clazz, jlong dict,
+        jobjectArray prevWordCodePointArrays, jbooleanArray isBeginningOfSentenceArray,
+        jintArray word) {
     Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
     if (!dictionary) {
         return false;
     }
-    jsize word0Length = env->GetArrayLength(word0);
-    int word0CodePoints[word0Length];
-    env->GetIntArrayRegion(word0, 0, word0Length, word0CodePoints);
-    jsize word1Length = env->GetArrayLength(word1);
-    int word1CodePoints[word1Length];
-    env->GetIntArrayRegion(word1, 0, word1Length, word1CodePoints);
-    const PrevWordsInfo prevWordsInfo(word0CodePoints, word0Length, isBeginningOfSentence);
-    return dictionary->removeNgramEntry(&prevWordsInfo, word1CodePoints, word1Length);
+    const PrevWordsInfo prevWordsInfo = JniDataUtils::constructPrevWordsInfo(env,
+            prevWordCodePointArrays, isBeginningOfSentenceArray);
+    jsize wordLength = env->GetArrayLength(word);
+    int wordCodePoints[wordLength];
+    env->GetIntArrayRegion(word, 0, wordLength, wordCodePoints);
+    return dictionary->removeNgramEntry(&prevWordsInfo, wordCodePoints, wordLength);
 }
 
 // Returns how many language model params are processed.
@@ -672,7 +659,7 @@
     },
     {
         const_cast<char *>("getSuggestionsNative"),
-        const_cast<char *>("(JJJ[I[I[I[I[II[I[IZ[I[I[I[I[I[I[F)V"),
+        const_cast<char *>("(JJJ[I[I[I[I[II[I[[I[Z[I[I[I[I[I[I[F)V"),
         reinterpret_cast<void *>(latinime_BinaryDictionary_getSuggestions)
     },
     {
@@ -686,9 +673,9 @@
         reinterpret_cast<void *>(latinime_BinaryDictionary_getMaxProbabilityOfExactMatches)
     },
     {
-        const_cast<char *>("getBigramProbabilityNative"),
-        const_cast<char *>("(J[IZ[I)I"),
-        reinterpret_cast<void *>(latinime_BinaryDictionary_getBigramProbability)
+        const_cast<char *>("getNgramProbabilityNative"),
+        const_cast<char *>("(J[[I[Z[I)I"),
+        reinterpret_cast<void *>(latinime_BinaryDictionary_getNgramProbability)
     },
     {
         const_cast<char *>("getWordPropertyNative"),
@@ -702,24 +689,24 @@
         reinterpret_cast<void *>(latinime_BinaryDictionary_getNextWord)
     },
     {
-        const_cast<char *>("addUnigramWordNative"),
+        const_cast<char *>("addUnigramEntryNative"),
         const_cast<char *>("(J[II[IIZZZI)Z"),
-        reinterpret_cast<void *>(latinime_BinaryDictionary_addUnigramWord)
+        reinterpret_cast<void *>(latinime_BinaryDictionary_addUnigramEntry)
     },
     {
-        const_cast<char *>("removeUnigramWordNative"),
+        const_cast<char *>("removeUnigramEntryNative"),
         const_cast<char *>("(J[I)Z"),
-        reinterpret_cast<void *>(latinime_BinaryDictionary_removeUnigramWord)
+        reinterpret_cast<void *>(latinime_BinaryDictionary_removeUnigramEntry)
     },
     {
-        const_cast<char *>("addBigramWordsNative"),
-        const_cast<char *>("(J[IZ[III)Z"),
-        reinterpret_cast<void *>(latinime_BinaryDictionary_addBigramWords)
+        const_cast<char *>("addNgramEntryNative"),
+        const_cast<char *>("(J[[I[Z[III)Z"),
+        reinterpret_cast<void *>(latinime_BinaryDictionary_addNgramEntry)
     },
     {
-        const_cast<char *>("removeBigramWordsNative"),
-        const_cast<char *>("(J[IZ[I)Z"),
-        reinterpret_cast<void *>(latinime_BinaryDictionary_removeBigramWords)
+        const_cast<char *>("removeNgramEntryNative"),
+        const_cast<char *>("(J[[I[Z[I)Z"),
+        reinterpret_cast<void *>(latinime_BinaryDictionary_removeNgramEntry)
     },
     {
         const_cast<char *>("addMultipleDictionaryEntriesNative"),
diff --git a/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp b/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp
deleted file mode 100644
index 295e760..0000000
--- a/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2010, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "LatinIME: bigram_dictionary.cpp"
-
-#include "bigram_dictionary.h"
-
-#include <algorithm>
-#include <cstring>
-
-#include "defines.h"
-#include "suggest/core/dictionary/binary_dictionary_bigrams_iterator.h"
-#include "suggest/core/dictionary/dictionary.h"
-#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
-#include "suggest/core/result/suggestion_results.h"
-#include "suggest/core/session/prev_words_info.h"
-#include "utils/char_utils.h"
-
-namespace latinime {
-
-BigramDictionary::BigramDictionary(
-        const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy)
-        : mDictionaryStructurePolicy(dictionaryStructurePolicy) {
-    if (DEBUG_DICT) {
-        AKLOGI("BigramDictionary - constructor");
-    }
-}
-
-BigramDictionary::~BigramDictionary() {
-}
-
-/* Parameters :
- * prevWordsInfo: Information of previous words to get the predictions.
- * outSuggestionResults: SuggestionResults to put the predictions.
- */
-void BigramDictionary::getPredictions(const PrevWordsInfo *const prevWordsInfo,
-        SuggestionResults *const outSuggestionResults) const {
-    int unigramProbability = 0;
-    int bigramCodePoints[MAX_WORD_LENGTH];
-    BinaryDictionaryBigramsIterator bigramsIt =
-            prevWordsInfo->getBigramsIteratorForPrediction(mDictionaryStructurePolicy);
-    while (bigramsIt.hasNext()) {
-        bigramsIt.next();
-        if (bigramsIt.getBigramPos() == NOT_A_DICT_POS) {
-            continue;
-        }
-        const int codePointCount = mDictionaryStructurePolicy->
-                getCodePointsAndProbabilityAndReturnCodePointCount(bigramsIt.getBigramPos(),
-                        MAX_WORD_LENGTH, bigramCodePoints, &unigramProbability);
-        if (codePointCount <= 0) {
-            continue;
-        }
-        // Due to space constraints, the probability for bigrams is approximate - the lower the
-        // unigram probability, the worse the precision. The theoritical maximum error in
-        // resulting probability is 8 - although in the practice it's never bigger than 3 or 4
-        // in very bad cases. This means that sometimes, we'll see some bigrams interverted
-        // here, but it can't get too bad.
-        const int probability = mDictionaryStructurePolicy->getProbability(
-                unigramProbability, bigramsIt.getProbability());
-        outSuggestionResults->addPrediction(bigramCodePoints, codePointCount, probability);
-    }
-}
-
-// Returns a pointer to the start of the bigram list.
-// If the word is not found or has no bigrams, this function returns NOT_A_DICT_POS.
-int BigramDictionary::getBigramListPositionForWord(const int *prevWord, const int prevWordLength,
-        const bool forceLowerCaseSearch) const {
-    if (0 >= prevWordLength) return NOT_A_DICT_POS;
-    int pos = mDictionaryStructurePolicy->getTerminalPtNodePositionOfWord(prevWord, prevWordLength,
-            forceLowerCaseSearch);
-    if (NOT_A_DICT_POS == pos) return NOT_A_DICT_POS;
-    return mDictionaryStructurePolicy->getBigramsPositionOfPtNode(pos);
-}
-
-int BigramDictionary::getBigramProbability(const PrevWordsInfo *const prevWordsInfo,
-        const int *word1, int length1) const {
-    int nextWordPos = mDictionaryStructurePolicy->getTerminalPtNodePositionOfWord(word1, length1,
-            false /* forceLowerCaseSearch */);
-    if (NOT_A_DICT_POS == nextWordPos) return NOT_A_PROBABILITY;
-    BinaryDictionaryBigramsIterator bigramsIt =
-            prevWordsInfo->getBigramsIteratorForPrediction(mDictionaryStructurePolicy);
-    while (bigramsIt.hasNext()) {
-        bigramsIt.next();
-        if (bigramsIt.getBigramPos() == nextWordPos
-                && bigramsIt.getProbability() != NOT_A_PROBABILITY) {
-            return mDictionaryStructurePolicy->getProbability(
-                    mDictionaryStructurePolicy->getUnigramProbabilityOfPtNode(nextWordPos),
-                    bigramsIt.getProbability());
-        }
-    }
-    return NOT_A_PROBABILITY;
-}
-
-// TODO: Move functions related to bigram to here
-} // namespace latinime
diff --git a/native/jni/src/suggest/core/dictionary/bigram_dictionary.h b/native/jni/src/suggest/core/dictionary/bigram_dictionary.h
deleted file mode 100644
index bd3aed1..0000000
--- a/native/jni/src/suggest/core/dictionary/bigram_dictionary.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef LATINIME_BIGRAM_DICTIONARY_H
-#define LATINIME_BIGRAM_DICTIONARY_H
-
-#include "defines.h"
-
-namespace latinime {
-
-class DictionaryStructureWithBufferPolicy;
-class PrevWordsInfo;
-class SuggestionResults;
-
-class BigramDictionary {
- public:
-    BigramDictionary(const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy);
-
-    void getPredictions(const PrevWordsInfo *const prevWordsInfo,
-            SuggestionResults *const outSuggestionResults) const;
-    int getBigramProbability(const PrevWordsInfo *const prevWordsInfo,
-            const int *word1, int length1) const;
-    ~BigramDictionary();
-
- private:
-    DISALLOW_IMPLICIT_CONSTRUCTORS(BigramDictionary);
-
-    int getBigramListPositionForWord(const int *prevWord, const int prevWordLength,
-            const bool forceLowerCaseSearch) const;
-
-    const DictionaryStructureWithBufferPolicy *const mDictionaryStructurePolicy;
-};
-} // namespace latinime
-#endif // LATINIME_BIGRAM_DICTIONARY_H
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.cpp b/native/jni/src/suggest/core/dictionary/dictionary.cpp
index 2282602..fb25f75 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.cpp
+++ b/native/jni/src/suggest/core/dictionary/dictionary.cpp
@@ -23,6 +23,7 @@
 #include "suggest/core/policy/dictionary_header_structure_policy.h"
 #include "suggest/core/result/suggestion_results.h"
 #include "suggest/core/session/dic_traverse_session.h"
+#include "suggest/core/session/prev_words_info.h"
 #include "suggest/core/suggest.h"
 #include "suggest/core/suggest_options.h"
 #include "suggest/policyimpl/gesture/gesture_suggest_policy_factory.h"
@@ -37,7 +38,6 @@
 Dictionary::Dictionary(JNIEnv *env, DictionaryStructureWithBufferPolicy::StructurePolicyPtr
         dictionaryStructureWithBufferPolicy)
         : mDictionaryStructureWithBufferPolicy(std::move(dictionaryStructureWithBufferPolicy)),
-          mBigramDictionary(mDictionaryStructureWithBufferPolicy.get()),
           mGestureSuggest(new Suggest(GestureSuggestPolicyFactory::getGestureSuggestPolicy())),
           mTypingSuggest(new Suggest(TypingSuggestPolicyFactory::getTypingSuggestPolicy())) {
     logDictionaryInfo(env);
@@ -62,7 +62,29 @@
 void Dictionary::getPredictions(const PrevWordsInfo *const prevWordsInfo,
         SuggestionResults *const outSuggestionResults) const {
     TimeKeeper::setCurrentTime();
-    mBigramDictionary.getPredictions(prevWordsInfo, outSuggestionResults);
+    int unigramProbability = 0;
+    int bigramCodePoints[MAX_WORD_LENGTH];
+    BinaryDictionaryBigramsIterator bigramsIt = prevWordsInfo->getBigramsIteratorForPrediction(
+            mDictionaryStructureWithBufferPolicy.get());
+    while (bigramsIt.hasNext()) {
+        bigramsIt.next();
+        if (bigramsIt.getBigramPos() == NOT_A_DICT_POS) {
+            continue;
+        }
+        if (prevWordsInfo->isNthPrevWordBeginningOfSentence(1 /* n */)
+                && bigramsIt.getProbability() == NOT_A_PROBABILITY) {
+            continue;
+        }
+        const int codePointCount = mDictionaryStructureWithBufferPolicy->
+                getCodePointsAndProbabilityAndReturnCodePointCount(bigramsIt.getBigramPos(),
+                        MAX_WORD_LENGTH, bigramCodePoints, &unigramProbability);
+        if (codePointCount <= 0) {
+            continue;
+        }
+        const int probability = mDictionaryStructureWithBufferPolicy->getProbability(
+                unigramProbability, bigramsIt.getProbability());
+        outSuggestionResults->addPrediction(bigramCodePoints, codePointCount, probability);
+    }
 }
 
 int Dictionary::getProbability(const int *word, int length) const {
@@ -81,10 +103,24 @@
             mDictionaryStructureWithBufferPolicy.get(), word, length);
 }
 
-int Dictionary::getBigramProbability(const PrevWordsInfo *const prevWordsInfo, const int *word,
+int Dictionary::getNgramProbability(const PrevWordsInfo *const prevWordsInfo, const int *word,
         int length) const {
     TimeKeeper::setCurrentTime();
-    return mBigramDictionary.getBigramProbability(prevWordsInfo, word, length);
+    int nextWordPos = mDictionaryStructureWithBufferPolicy->getTerminalPtNodePositionOfWord(word,
+            length, false /* forceLowerCaseSearch */);
+    if (NOT_A_DICT_POS == nextWordPos) return NOT_A_PROBABILITY;
+    BinaryDictionaryBigramsIterator bigramsIt = prevWordsInfo->getBigramsIteratorForPrediction(
+            mDictionaryStructureWithBufferPolicy.get());
+    while (bigramsIt.hasNext()) {
+        bigramsIt.next();
+        if (bigramsIt.getBigramPos() == nextWordPos
+                && bigramsIt.getProbability() != NOT_A_PROBABILITY) {
+            return mDictionaryStructureWithBufferPolicy->getProbability(
+                    mDictionaryStructureWithBufferPolicy->getUnigramProbabilityOfPtNode(
+                            nextWordPos), bigramsIt.getProbability());
+        }
+    }
+    return NOT_A_PROBABILITY;
 }
 
 bool Dictionary::addUnigramEntry(const int *const word, const int length,
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.h b/native/jni/src/suggest/core/dictionary/dictionary.h
index 247ee24..3b41088 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.h
+++ b/native/jni/src/suggest/core/dictionary/dictionary.h
@@ -21,7 +21,6 @@
 
 #include "defines.h"
 #include "jni.h"
-#include "suggest/core/dictionary/bigram_dictionary.h"
 #include "suggest/core/dictionary/property/word_property.h"
 #include "suggest/core/policy/dictionary_header_structure_policy.h"
 #include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
@@ -75,7 +74,7 @@
 
     int getMaxProbabilityOfExactMatches(const int *word, int length) const;
 
-    int getBigramProbability(const PrevWordsInfo *const prevWordsInfo,
+    int getNgramProbability(const PrevWordsInfo *const prevWordsInfo,
             const int *word, int length) const;
 
     bool addUnigramEntry(const int *const codePoints, const int codePointCount,
@@ -119,7 +118,6 @@
 
     const DictionaryStructureWithBufferPolicy::StructurePolicyPtr
             mDictionaryStructureWithBufferPolicy;
-    const BigramDictionary mBigramDictionary;
     const SuggestInterfacePtr mGestureSuggest;
     const SuggestInterfacePtr mTypingSuggest;
 
diff --git a/native/jni/src/suggest/core/session/prev_words_info.h b/native/jni/src/suggest/core/session/prev_words_info.h
index 640f6a2..e350c69 100644
--- a/native/jni/src/suggest/core/session/prev_words_info.h
+++ b/native/jni/src/suggest/core/session/prev_words_info.h
@@ -25,7 +25,6 @@
 namespace latinime {
 
 // TODO: Support n-gram.
-// This class does not take ownership of any code point buffers.
 class PrevWordsInfo {
  public:
     // No prev word information.
@@ -33,21 +32,52 @@
         clear();
     }
 
+    PrevWordsInfo(PrevWordsInfo &&prevWordsInfo) {
+        for (size_t i = 0; i < NELEMS(mPrevWordCodePoints); ++i) {
+            mPrevWordCodePointCount[i] = prevWordsInfo.mPrevWordCodePointCount[i];
+            memmove(mPrevWordCodePoints[i], prevWordsInfo.mPrevWordCodePoints[i],
+                    sizeof(mPrevWordCodePoints[i][0]) * mPrevWordCodePointCount[i]);
+            mIsBeginningOfSentence[i] = prevWordsInfo.mIsBeginningOfSentence[i];
+        }
+    }
+
+    // Construct from previous words.
+    PrevWordsInfo(const int prevWordCodePoints[][MAX_WORD_LENGTH],
+            const int *const prevWordCodePointCount, const bool *const isBeginningOfSentence,
+            const size_t prevWordCount) {
+        clear();
+        for (size_t i = 0; i < std::min(NELEMS(mPrevWordCodePoints), prevWordCount); ++i) {
+            if (prevWordCodePointCount[i] < 0 || prevWordCodePointCount[i] > MAX_WORD_LENGTH) {
+                continue;
+            }
+            memmove(mPrevWordCodePoints[i], prevWordCodePoints[i],
+                    sizeof(mPrevWordCodePoints[i][0]) * prevWordCodePointCount[i]);
+            mPrevWordCodePointCount[i] = prevWordCodePointCount[i];
+            mIsBeginningOfSentence[i] = isBeginningOfSentence[i];
+        }
+    }
+
+    // Construct from a previous word.
     PrevWordsInfo(const int *const prevWordCodePoints, const int prevWordCodePointCount,
             const bool isBeginningOfSentence) {
         clear();
-        mPrevWordCodePoints[0] = prevWordCodePoints;
+        if (prevWordCodePointCount > MAX_WORD_LENGTH || !prevWordCodePoints) {
+            return;
+        }
+        memmove(mPrevWordCodePoints[0], prevWordCodePoints,
+                sizeof(mPrevWordCodePoints[0][0]) * prevWordCodePointCount);
         mPrevWordCodePointCount[0] = prevWordCodePointCount;
         mIsBeginningOfSentence[0] = isBeginningOfSentence;
     }
 
     bool isValid() const {
-        for (size_t i = 0; i < NELEMS(mPrevWordCodePoints); ++i) {
-            if (mPrevWordCodePointCount[i] > MAX_WORD_LENGTH) {
-                return false;
-            }
+        if (mPrevWordCodePointCount[0] > 0) {
+            return true;
         }
-        return true;
+        if (mIsBeginningOfSentence[0]) {
+            return true;
+        }
+        return false;
     }
 
     void getPrevWordsTerminalPtNodePos(
@@ -168,13 +198,12 @@
 
     void clear() {
         for (size_t i = 0; i < NELEMS(mPrevWordCodePoints); ++i) {
-            mPrevWordCodePoints[i] = nullptr;
             mPrevWordCodePointCount[i] = 0;
             mIsBeginningOfSentence[i] = false;
         }
     }
 
-    const int *mPrevWordCodePoints[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+    int mPrevWordCodePoints[MAX_PREV_WORD_COUNT_FOR_N_GRAM][MAX_WORD_LENGTH];
     int mPrevWordCodePointCount[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
     bool mIsBeginningOfSentence[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
 };
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
index 5c62b9c..002593c 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
@@ -268,6 +268,10 @@
 
 int PatriciaTriePolicy::getProbability(const int unigramProbability,
         const int bigramProbability) const {
+    // Due to space constraints, the probability for bigrams is approximate - the lower the unigram
+    // probability, the worse the precision. The theoritical maximum error in resulting probability
+    // is 8 - although in the practice it's never bigger than 3 or 4 in very bad cases. This means
+    // that sometimes, we'll see some bigrams interverted here, but it can't get too bad.
     if (unigramProbability == NOT_A_PROBABILITY) {
         return NOT_A_PROBABILITY;
     } else if (bigramProbability == NOT_A_PROBABILITY) {
diff --git a/native/jni/src/suggest/policyimpl/dictionary/utils/dict_file_writing_utils.cpp b/native/jni/src/suggest/policyimpl/dictionary/utils/dict_file_writing_utils.cpp
index 4da339b..1d202c3 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/utils/dict_file_writing_utils.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/utils/dict_file_writing_utils.cpp
@@ -77,30 +77,6 @@
     return dictBuffers->flush(dirPath);
 }
 
-/* static */ bool DictFileWritingUtils::flushAllHeaderAndBodyToFile(const char *const filePath,
-        BufferWithExtendableBuffer *const dictHeader, BufferWithExtendableBuffer *const dictBody) {
-    const int tmpFileNameBufSize = FileUtils::getFilePathWithSuffixBufSize(filePath,
-            TEMP_FILE_SUFFIX_FOR_WRITING_DICT_FILE);
-    // Name of a temporary file used for writing that is a connected string of original name and
-    // TEMP_FILE_SUFFIX_FOR_WRITING_DICT_FILE.
-    char tmpFileName[tmpFileNameBufSize];
-    FileUtils::getFilePathWithSuffix(filePath, TEMP_FILE_SUFFIX_FOR_WRITING_DICT_FILE,
-            tmpFileNameBufSize, tmpFileName);
-    if (!DictFileWritingUtils::flushBufferToFile(tmpFileName, dictHeader)) {
-        AKLOGE("Dictionary header cannot be written to %s.", tmpFileName);
-        return false;
-    }
-    if (!DictFileWritingUtils::flushBufferToFile(tmpFileName, dictBody)) {
-        AKLOGE("Dictionary structure cannot be written to %s.", tmpFileName);
-        return false;
-    }
-    if (rename(tmpFileName, filePath) != 0) {
-        AKLOGE("Dictionary file %s cannot be renamed to %s", tmpFileName, filePath);;
-        return false;
-    }
-    return true;
-}
-
 /* static */ bool DictFileWritingUtils::flushBufferToFileWithSuffix(const char *const basePath,
         const char *const suffix, const BufferWithExtendableBuffer *const buffer) {
     const int filePathBufSize = FileUtils::getFilePathWithSuffixBufSize(basePath, suffix);
diff --git a/native/jni/src/suggest/policyimpl/dictionary/utils/dict_file_writing_utils.h b/native/jni/src/suggest/policyimpl/dictionary/utils/dict_file_writing_utils.h
index 5df5856..0dd1256 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/utils/dict_file_writing_utils.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/utils/dict_file_writing_utils.h
@@ -35,10 +35,6 @@
             const std::vector<int> localeAsCodePointVector,
             const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap);
 
-    static bool flushAllHeaderAndBodyToFile(const char *const filePath,
-            BufferWithExtendableBuffer *const dictHeader,
-            BufferWithExtendableBuffer *const dictBody);
-
     static bool flushBufferToFileWithSuffix(const char *const basePath, const char *const suffix,
             const BufferWithExtendableBuffer *const buffer);
 
diff --git a/native/jni/src/utils/jni_data_utils.h b/native/jni/src/utils/jni_data_utils.h
index 3514aee..cb82d3c 100644
--- a/native/jni/src/utils/jni_data_utils.h
+++ b/native/jni/src/utils/jni_data_utils.h
@@ -21,6 +21,7 @@
 
 #include "defines.h"
 #include "jni.h"
+#include "suggest/core/session/prev_words_info.h"
 #include "suggest/core/policy/dictionary_header_structure_policy.h"
 #include "suggest/policyimpl/dictionary/header/header_read_write_utils.h"
 #include "utils/char_utils.h"
@@ -95,6 +96,37 @@
         }
     }
 
+    static PrevWordsInfo constructPrevWordsInfo(JNIEnv *env, jobjectArray prevWordCodePointArrays,
+            jbooleanArray isBeginningOfSentenceArray) {
+        int prevWordCodePoints[MAX_PREV_WORD_COUNT_FOR_N_GRAM][MAX_WORD_LENGTH];
+        int prevWordCodePointCount[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        bool isBeginningOfSentence[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        jsize prevWordsCount = env->GetArrayLength(prevWordCodePointArrays);
+        for (size_t i = 0; i < NELEMS(prevWordCodePoints); ++i) {
+            prevWordCodePointCount[i] = 0;
+            isBeginningOfSentence[i] = false;
+            if (prevWordsCount <= static_cast<int>(i)) {
+                continue;
+            }
+            jintArray prevWord = (jintArray)env->GetObjectArrayElement(prevWordCodePointArrays, i);
+            if (!prevWord) {
+                continue;
+            }
+            jsize prevWordLength = env->GetArrayLength(prevWord);
+            if (prevWordLength > MAX_WORD_LENGTH) {
+                continue;
+            }
+            env->GetIntArrayRegion(prevWord, 0, prevWordLength, prevWordCodePoints[i]);
+            prevWordCodePointCount[i] = prevWordLength;
+            jboolean isBeginningOfSentenceBoolean = JNI_FALSE;
+            env->GetBooleanArrayRegion(isBeginningOfSentenceArray, i, 1 /* len */,
+                    &isBeginningOfSentenceBoolean);
+            isBeginningOfSentence[i] = isBeginningOfSentenceBoolean == JNI_TRUE;
+        }
+        return PrevWordsInfo(prevWordCodePoints, prevWordCodePointCount, isBeginningOfSentence,
+                MAX_PREV_WORD_COUNT_FOR_N_GRAM);
+    }
+
     static void putBooleanToArray(JNIEnv *env, jbooleanArray array, const int index,
             const jboolean value) {
         env->SetBooleanArrayRegion(array, index, 1 /* len */, &value);
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
index bf19a8b..59fe611 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
@@ -25,7 +25,7 @@
 
 @SmallTest
 public class KeyboardLayoutSetSubtypesCountTests extends KeyboardLayoutSetTestsBase {
-    private static final int NUMBER_OF_SUBTYPES = 68;
+    private static final int NUMBER_OF_SUBTYPES = 72;
     private static final int NUMBER_OF_ASCII_CAPABLE_SUBTYPES = 45;
     private static final int NUMBER_OF_PREDEFINED_ADDITIONAL_SUBTYPES = 2;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java b/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java
new file mode 100644
index 0000000..bfd94d5
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout;
+
+import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+/**
+ * The Sinhala keyboard.
+ */
+public final class Sinhala extends LayoutBase {
+    private static final String LAYOUT_NAME = "sinhala";
+
+    public Sinhala(final LayoutCustomizer customizer) {
+        super(customizer, Symbols.class, SymbolsShifted.class);
+    }
+
+    @Override
+    public String getName() { return LAYOUT_NAME; }
+
+    public static class SinhalaCustomizer extends LayoutCustomizer {
+        public SinhalaCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey getAlphabetKey() { return SINHALA_ALPHABET_KEY; }
+
+        @Override
+        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+            return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
+        }
+
+        // U+0D85: "අ" SINHALA LETTER AYANNA
+        // U+0D86: "ආ" SINHALA LETTER AAYANNA
+        private static final ExpectedKey SINHALA_ALPHABET_KEY = key(
+                "\u0D85,\u0D86", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+    }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetLayout(boolean isPhone) { return ALPHABET_COMMON; }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetShiftLayout(boolean isPhone, final int elementId) {
+        if (elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
+            return ALPHABET_COMMON;
+        }
+        return ALPHABET_SHIFTED_COMMON;
+    }
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    // U+0DD4: "ු" SINHALA VOWEL SIGN KETTI PAA-PILLA
+                    key("\u0DD4", moreKey("1")),
+                    // U+0D85: "අ" SINHALA LETTER AYANNA
+                    key("\u0D85", moreKey("2")),
+                    // U+0DD0: "ැ" SINHALA VOWEL SIGN KETTI AEDA-PILLA
+                    key("\u0DD0", moreKey("3")),
+                    // U+0DBB: "ර" SINHALA LETTER RAYANNA
+                    key("\u0DBB", moreKey("4")),
+                    // U+0D91: "එ" SINHALA LETTER EYANNA
+                    key("\u0D91", moreKey("5")),
+                    // U+0DC4: "හ" SINHALA LETTER HAYANNA
+                    key("\u0DC4", moreKey("6")),
+                    // U+0DB8: "ම" SINHALA LETTER MAYANNA
+                    key("\u0DB8", moreKey("7")),
+                    // U+0DC3: "ස" SINHALA LETTER DANTAJA SAYANNA
+                    key("\u0DC3", moreKey("8")),
+                    // U+0DAF: "ද" SINHALA LETTER ALPAPRAANA DAYANNA
+                    // U+0DB3: "ඳ" SINHALA LETTER SANYAKA DAYANNA
+                    key("\u0DAF", joinMoreKeys("9", "\u0DB3")),
+                    // U+0DA0: "ච" SINHALA LETTER ALPAPRAANA CAYANNA
+                    key("\u0DA0", moreKey("0")),
+                    // U+0DA4: "ඤ" SINHALA LETTER TAALUJA NAASIKYAYA
+                    // U+0DF4: "෴" SINHALA PUNCTUATION KUNDDALIYA
+                    key("\u0DA4", moreKey("\u0DF4")))
+            .setKeysOfRow(2,
+                    // U+0DCA: "්" SINHALA SIGN AL-LAKUNA
+                    // U+0DD2: "ි" SINHALA VOWEL SIGN KETTI IS-PILLA
+                    // U+0DCF: "ා" SINHALA VOWEL SIGN AELA-PILLA
+                    // U+0DD9: "ෙ" SINHALA VOWEL SIGN KOMBUVA
+                    // U+0DA7: "ට" SINHALA LETTER ALPAPRAANA TTAYANNA
+                    // U+0DBA: "ය" SINHALA LETTER YAYANNA
+                    // U+0DC0: "ව" SINHALA LETTER VAYANNA
+                    // U+0DB1: "න" SINHALA LETTER DANTAJA NAYANNA
+                    // U+0D9A: "ක" SINHALA LETTER ALPAPRAANA KAYANNA
+                    // U+0DAD: "ත" SINHALA LETTER ALPAPRAANA TAYANNA
+                    // U+0D8F: "ඏ" SINHALA LETTER ILUYANNA
+                    "\u0DCA", "\u0DD2", "\u0DCF", "\u0DD9", "\u0DA7", "\u0DBA", "\u0DC0", "\u0DB1",
+                    "\u0D9A", "\u0DAD", "\u0D8F")
+            .setKeysOfRow(3,
+                    // U+0D82: "ං" SINHALA SIGN ANUSVARAYA
+                    // U+0D83: "ඃ" SINHALA SIGN VISARGAYA
+                    key("\u0D82", moreKey("\u0D83")),
+                    // U+0DA2: "ජ" SINHALA LETTER ALPAPRAANA JAYANNA
+                    // U+0DA6: "ඦ" SINHALA LETTER SANYAKA JAYANNA
+                    key("\u0DA2", moreKey("\u0DA6")),
+                    // U+0DA9: "ඩ" SINHALA LETTER ALPAPRAANA DDAYANNA
+                    // U+0DAC: "ඬ" SINHALA LETTER SANYAKA DDAYANNA
+                    key("\u0DA9", moreKey("\u0DAC")),
+                    // U+0D89: "ඉ" SINHALA LETTER IYANNA
+                    // U+0DB6: "බ" SINHALA LETTER ALPAPRAANA BAYANNA
+                    // U+0DB4: "ප" SINHALA LETTER ALPAPRAANA PAYANNA
+                    // U+0DBD: "ල" SINHALA LETTER DANTAJA LAYANNA
+                    "\u0D89", "\u0DB6", "\u0DB4", "\u0DBD",
+                    // U+0D9C: "ග" SINHALA LETTER ALPAPRAANA GAYANNA
+                    // U+0D9F: "ඟ" SINHALA LETTER SANYAKA GAYANNA
+                    key("\u0D9C", moreKey("\u0D9F")),
+                    // U+0DF3: "ෳ" SINHALA VOWEL SIGN DIGA GAYANUKITTA
+                    "\u0DF3")
+            .build();
+
+    private static final ExpectedKey[][] ALPHABET_SHIFTED_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    // U+0DD6: "ූ" SINHALA VOWEL SIGN DIGA PAA-PILLA
+                    key("\u0DD6", moreKey("1")),
+                    // U+0D8B: "උ" SINHALA LETTER UYANNA
+                    key("\u0D8B", moreKey("2")),
+                    // U+0DD1: "ෑ" SINHALA VOWEL SIGN DIGA AEDA-PILLA
+                    key("\u0DD1", moreKey("3")),
+                    // U+0D8D: "ඍ" SINHALA LETTER IRUYANNA
+                    key("\u0D8D", moreKey("4")),
+                    // U+0D94: "ඔ" SINHALA LETTER OYANNA
+                    key("\u0D94", moreKey("5")),
+                    // U+0DC1: "ශ" SINHALA LETTER TAALUJA SAYANNA
+                    key("\u0DC1", moreKey("6")),
+                    // U+0DB9: "ඹ" SINHALA LETTER AMBA BAYANNA
+                    key("\u0DB9", moreKey("7")),
+                    // U+0DC2: "ෂ" SINHALA LETTER MUURDHAJA SAYANNA
+                    key("\u0DC2", moreKey("8")),
+                    // U+0DB0: "ධ" SINHALA LETTER MAHAAPRAANA DAYANNA
+                    key("\u0DB0", moreKey("9")),
+                    // U+0DA1: "ඡ" SINHALA LETTER MAHAAPRAANA CAYANNA
+                    key("\u0DA1", moreKey("0")),
+                    // U+0DA5: "ඥ" SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+                    // U+0DF4: "෴" SINHALA PUNCTUATION KUNDDALIYA
+                    key("\u0DA5", moreKey("\u0DF4")))
+            .setKeysOfRow(2,
+                    // U+0DDF: "ෟ" SINHALA VOWEL SIGN GAYANUKITTA
+                    // U+0DD3: "ී" SINHALA VOWEL SIGN DIGA IS-PILLA
+                    // U+0DD8: "ෘ" SINHALA VOWEL SIGN GAETTA-PILLA
+                    // U+0DC6: "ෆ" SINHALA LETTER FAYANNA
+                    // U+0DA8: "ඨ" SINHALA LETTER MAHAAPRAANA TTAYANNA
+                    // U+0DCA/U+200D/U+0DBA:
+                    //     "්‍ය" SINHALA SIGN AL-LAKUNA/ZERO WIDTH JOINER/SINHALA LETTER YAYANNA
+                    // U+0DC5/U+0DD4:
+                    //     "ළු" SINHALA LETTER MUURDHAJA LAYANNA/SINHALA VOWEL SIGN KETTI PAA-PILLA
+                    // U+0DAB: "ණ" SINHALA LETTER MUURDHAJA NAYANNA
+                    // U+0D9B: "ඛ" SINHALA LETTER MAHAAPRAANA KAYANNA
+                    // U+0DAE: "ථ" SINHALA LETTER MAHAAPRAANA TAYANNA
+                    // U+0DCA/U+200D/U+0DBB:
+                    //     "්‍ර" SINHALA SIGN AL-LAKUNA/ZERO WIDTH JOINER/SINHALA LETTER RAYANNA
+                    "\u0DDF", "\u0DD3", "\u0DD8", "\u0DC6", "\u0DA8", "\u0DCA\u200D\u0DBA",
+                    "\u0DC5\u0DD4", "\u0DAB", "\u0D9B", "\u0DAE", "\u0DCA\u200D\u0DBB")
+            .setKeysOfRow(3,
+                    // U+0D9E: "ඞ" SINHALA LETTER KANTAJA NAASIKYAYA
+                    // U+0DA3: "ඣ" SINHALA LETTER MAHAAPRAANA JAYANNA
+                    // U+0DAA: "ඪ" SINHALA LETTER MAHAAPRAANA DDAYANNA
+                    // U+0D8A: "ඊ" SINHALA LETTER IIYANNA
+                    // U+0DB7: "භ" SINHALA LETTER MAHAAPRAANA BAYANNA
+                    // U+0DB5: "ඵ" SINHALA LETTER MAHAAPRAANA PAYANNA
+                    // U+0DC5: "ළ" SINHALA LETTER MUURDHAJA LAYANNA
+                    // U+0D9D: "ඝ" SINHALA LETTER MAHAAPRAANA GAYANNA
+                    // U+0DBB/U+0DCA/U+200D:
+                    //     "ර්‍" SINHALA LETTER RAYANNA/SINHALA SIGN AL-LAKUNA/ZERO WIDTH JOINER
+                    "\u0d9E", "\u0DA3", "\u0DAA", "\u0D8A", "\u0DB7", "\u0DB5", "\u0DC5", "\u0D9D",
+                    "\u0DBB\u0DCA\u200D")
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java
index 6380da5..2e676df 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout.tests;
 
-import android.test.suitebuilder.annotation.Suppress;
+import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.HindiCompact;
 import com.android.inputmethod.keyboard.layout.HindiCompact.HindiCompactCustomizer;
@@ -27,7 +27,7 @@
 /**
  * hi: Hindi/hindi_compact
  */
-@Suppress
+@SmallTest
 public final class TestsHindiCompact extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("hi");
     private static final LayoutBase LAYOUT = new HindiCompact(new HindiCompactCustomizer(LOCALE));
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java
index d45d99d..b937629 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout.tests;
 
-import android.test.suitebuilder.annotation.Suppress;
+import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Marathi;
@@ -27,7 +27,7 @@
 /**
  * mr_IN: Marathi (India)/marathi
  */
-@Suppress
+@SmallTest
 public final class TestsMarathiIN extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("mr", "IN");
     private static final LayoutBase LAYOUT = new Marathi(new MarathiCustomizer(LOCALE));
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java
index a0bd50c..e6d3b3b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout.tests;
 
-import android.test.suitebuilder.annotation.Suppress;
+import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Myanmar;
@@ -27,7 +27,7 @@
 /**
  * my_MM: Myanmar (Myanmar)/myanmar
  */
-@Suppress
+@SmallTest
 public final class TestsMyanmarMM extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("my", "MM");
     private static final LayoutBase LAYOUT = new Myanmar(new MyanmarCustomizer(LOCALE));
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSinhalaLK.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSinhalaLK.java
new file mode 100644
index 0000000..1cea497
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSinhalaLK.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout.tests;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.Sinhala;
+import com.android.inputmethod.keyboard.layout.Sinhala.SinhalaCustomizer;
+
+import java.util.Locale;
+
+/**
+ * si_LK: Sinhala (Sri Lanka)/sinhala
+ */
+@SmallTest
+public final class TestsSinhalaLK extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("si", "LK");
+    private static final LayoutBase LAYOUT = new Sinhala(new SinhalaCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
index 28cce83..ae18426 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
@@ -20,6 +20,7 @@
 import android.test.suitebuilder.annotation.LargeTest;
 import android.util.Pair;
 
+import com.android.inputmethod.latin.PrevWordsInfo.WordInfo;
 import com.android.inputmethod.latin.makedict.BinaryDictIOUtils;
 import com.android.inputmethod.latin.makedict.CodePointUtils;
 import com.android.inputmethod.latin.makedict.DictDecoder;
@@ -77,13 +78,13 @@
 
     private void addBigramWords(final BinaryDictionary binaryDictionary, final String word0,
             final String word1, final int probability) {
-        binaryDictionary.addNgramEntry(new PrevWordsInfo(word0), word1, probability,
+        binaryDictionary.addNgramEntry(new PrevWordsInfo(new WordInfo(word0)), word1, probability,
                 mCurrentTime /* timestamp */);
     }
 
     private static boolean isValidBigram(final BinaryDictionary binaryDictionary,
             final String word0, final String word1) {
-        return binaryDictionary.isValidNgram(new PrevWordsInfo(word0), word1);
+        return binaryDictionary.isValidNgram(new PrevWordsInfo(new WordInfo(word0)), word1);
     }
 
     private void forcePassingShortTime(final BinaryDictionary binaryDictionary) {
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
index 83ea193..6ba18d6 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
@@ -21,6 +21,7 @@
 import android.text.TextUtils;
 import android.util.Pair;
 
+import com.android.inputmethod.latin.PrevWordsInfo.WordInfo;
 import com.android.inputmethod.latin.makedict.CodePointUtils;
 import com.android.inputmethod.latin.makedict.FormatSpec;
 import com.android.inputmethod.latin.makedict.WeightedString;
@@ -203,23 +204,23 @@
 
     private static void addBigramWords(final BinaryDictionary binaryDictionary, final String word0,
             final String word1, final int probability) {
-        binaryDictionary.addNgramEntry(new PrevWordsInfo(word0), word1, probability,
+        binaryDictionary.addNgramEntry(new PrevWordsInfo(new WordInfo(word0)), word1, probability,
                 BinaryDictionary.NOT_A_VALID_TIMESTAMP /* timestamp */);
     }
 
     private static boolean isValidBigram(final BinaryDictionary binaryDictionary,
             final String word0, final String word1) {
-        return binaryDictionary.isValidNgram(new PrevWordsInfo(word0), word1);
+        return binaryDictionary.isValidNgram(new PrevWordsInfo(new WordInfo(word0)), word1);
     }
 
     private static void removeBigramEntry(final BinaryDictionary binaryDictionary,
             final String word0, final String word1) {
-        binaryDictionary.removeNgramEntry(new PrevWordsInfo(word0), word1);
+        binaryDictionary.removeNgramEntry(new PrevWordsInfo(new WordInfo(word0)), word1);
     }
 
     private static int getBigramProbability(final BinaryDictionary binaryDictionary,
             final String word0,  final String word1) {
-        return binaryDictionary.getNgramProbability(new PrevWordsInfo(word0), word1);
+        return binaryDictionary.getNgramProbability(new PrevWordsInfo(new WordInfo(word0)), word1);
     }
 
     public void testAddUnigramWord() {
diff --git a/tests/src/com/android/inputmethod/latin/InputLogicTests.java b/tests/src/com/android/inputmethod/latin/InputLogicTests.java
index 460f600..0552c22 100644
--- a/tests/src/com/android/inputmethod/latin/InputLogicTests.java
+++ b/tests/src/com/android/inputmethod/latin/InputLogicTests.java
@@ -482,6 +482,7 @@
     }
 
     public void testPredictionsWithDoubleSpaceToPeriod() {
+        mLatinIME.clearPersonalizedDictionariesForTest();
         final String WORD_TO_TYPE = "Barack ";
         type(WORD_TO_TYPE);
         sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
@@ -516,14 +517,21 @@
                 suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null);
     }
 
-    public void testNoPredictionsAfterPeriod() {
+    public void testPredictionsAfterPeriod() {
+        mLatinIME.clearPersonalizedDictionariesForTest();
         final String WORD_TO_TYPE = "Barack. ";
         type(WORD_TO_TYPE);
         sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
         runMessages();
-        // Test the first prediction is not displayed
-        final SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest();
-        assertEquals("no prediction after period", 0, suggestedWords.size());
+        SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest();
+        assertEquals("No prediction after period after inputting once.", 0, suggestedWords.size());
+
+        type(WORD_TO_TYPE);
+        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
+        runMessages();
+        suggestedWords = mLatinIME.getSuggestedWordsForTest();
+        assertEquals("Beginning-of-Sentence prediction after inputting 2 times.", "Barack",
+                suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null);
     }
 
     public void testPredictionsAfterRecorrection() {
diff --git a/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java b/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
index 2c92bb3..5a5ec6d 100644
--- a/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
+++ b/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
@@ -156,16 +156,16 @@
     public void testGetPreviousWord() {
         // If one of the following cases breaks, the bigram suggestions won't work.
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
-                "abc def", mSpacingAndPunctuations, 2).mPrevWord, "abc");
+                "abc def", mSpacingAndPunctuations, 2).mPrevWordsInfo[0].mWord, "abc");
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
                 "abc", mSpacingAndPunctuations, 2), PrevWordsInfo.BEGINNING_OF_SENTENCE);
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
                 "abc. def", mSpacingAndPunctuations, 2), PrevWordsInfo.BEGINNING_OF_SENTENCE);
 
         assertFalse(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
-                "abc def", mSpacingAndPunctuations, 2).mIsBeginningOfSentence);
+                "abc def", mSpacingAndPunctuations, 2).mPrevWordsInfo[0].mIsBeginningOfSentence);
         assertTrue(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
-                "abc", mSpacingAndPunctuations, 2).mIsBeginningOfSentence);
+                "abc", mSpacingAndPunctuations, 2).mPrevWordsInfo[0].mIsBeginningOfSentence);
         // The following tests reflect the current behavior of the function
         // RichInputConnection#getNthPreviousWord.
         // TODO: However at this time, the code does never go
@@ -174,20 +174,20 @@
         // logical. These tests are just there to catch any unintentional
         // changes in the behavior of the RichInputConnection#getPreviousWord method.
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
-                "abc def ", mSpacingAndPunctuations, 2).mPrevWord, "abc");
+                "abc def ", mSpacingAndPunctuations, 2).mPrevWordsInfo[0].mWord, "abc");
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
-                "abc def.", mSpacingAndPunctuations, 2).mPrevWord, "abc");
+                "abc def.", mSpacingAndPunctuations, 2).mPrevWordsInfo[0].mWord, "abc");
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
-                "abc def .", mSpacingAndPunctuations, 2).mPrevWord, "def");
+                "abc def .", mSpacingAndPunctuations, 2).mPrevWordsInfo[0].mWord, "def");
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
                 "abc ", mSpacingAndPunctuations, 2), PrevWordsInfo.BEGINNING_OF_SENTENCE);
 
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
-                "abc def", mSpacingAndPunctuations, 1).mPrevWord, "def");
+                "abc def", mSpacingAndPunctuations, 1).mPrevWordsInfo[0].mWord, "def");
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
-                "abc def ", mSpacingAndPunctuations, 1).mPrevWord, "def");
+                "abc def ", mSpacingAndPunctuations, 1).mPrevWordsInfo[0].mWord, "def");
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
-                "abc 'def", mSpacingAndPunctuations, 1).mPrevWord, "'def");
+                "abc 'def", mSpacingAndPunctuations, 1).mPrevWordsInfo[0].mWord, "'def");
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
                 "abc def.", mSpacingAndPunctuations, 1), PrevWordsInfo.BEGINNING_OF_SENTENCE);
         assertEquals(RichInputConnection.getPrevWordsInfoFromNthPreviousWord(
diff --git a/tests/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java b/tests/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java
index 8f32e53..76eaef4 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java
@@ -104,7 +104,8 @@
         for (final WordProperty word0Property : dict) {
             if (null == word0Property.mBigrams) continue;
             for (final WeightedString word1 : word0Property.mBigrams) {
-                final PrevWordsInfo prevWordsInfo = new PrevWordsInfo(word0Property.mWord);
+                final PrevWordsInfo prevWordsInfo =
+                        new PrevWordsInfo(new PrevWordsInfo.WordInfo(word0Property.mWord));
                 if (!binaryDict.addNgramEntry(prevWordsInfo, word1.mWord,
                         word1.getProbability(), 0 /* timestamp */)) {
                     MakedictLog.e("Cannot add n-gram entry for "
diff --git a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
index 48d3a1c..f87f3b4 100644
--- a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
@@ -22,6 +22,7 @@
 
 import com.android.inputmethod.latin.ExpandableBinaryDictionary;
 import com.android.inputmethod.latin.PrevWordsInfo;
+import com.android.inputmethod.latin.PrevWordsInfo.WordInfo;
 import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
 import com.android.inputmethod.latin.utils.DistracterFilter;
 import com.android.inputmethod.latin.utils.FileUtils;
@@ -115,7 +116,7 @@
             UserHistoryDictionary.addToDictionary(dict, prevWordsInfo, word, true,
                     (int)TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()),
                     DistracterFilter.EMPTY_DISTRACTER_FILTER);
-            prevWordsInfo = new PrevWordsInfo(word);
+            prevWordsInfo = prevWordsInfo.getNextPrevWordsInfo(new WordInfo(word));
         }
     }
 
@@ -262,11 +263,11 @@
         final UserHistoryDictionary dict =
                 PersonalizationHelper.getUserHistoryDictionary(getContext(), dummyLocale);
         dict.waitAllTasksForTests();
-        PrevWordsInfo prevWordsInfo = new PrevWordsInfo(null);
+        PrevWordsInfo prevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO;
         for (final String word : words) {
             UserHistoryDictionary.addToDictionary(dict, prevWordsInfo, word, true, mCurrentTime,
                     DistracterFilter.EMPTY_DISTRACTER_FILTER);
-            prevWordsInfo = new PrevWordsInfo(word);
+            prevWordsInfo = prevWordsInfo.getNextPrevWordsInfo(new WordInfo(word));
             dict.waitAllTasksForTests();
             assertTrue(dict.isInDictionary(word));
         }
diff --git a/tools/make-keyboard-text/res/values-si-rLK/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-si-rLK/donottranslate-more-keys.xml
new file mode 100644
index 0000000..89c9195
--- /dev/null
+++ b/tools/make-keyboard-text/res/values-si-rLK/donottranslate-more-keys.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Label for "switch to alphabetic" key.
+         U+0D85: "අ" SINHALA LETTER AYANNA
+         U+0D86: "ආ" SINHALA LETTER AAYANNA -->
+    <string name="keylabel_to_alpha">&#x0D85;,&#x0D86;</string>
+</resources>