Merge "[Lazy4] Remove useless debug code"
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 4daf465..dc6fdf2 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Lettermodus"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Foonmodus"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Foonsimbool-modus"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Sleutelbord versteek"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Wys <xliff:g id="MODE">%s</xliff:g>-sleutelbord"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum en tyd"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pos"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"boodskappe"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"nommer"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"foon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"teks"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"tyd"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Steminvoerinstellings"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Op hoofsleutelbord"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Op simbolesleutelbord"</string>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
index d1fe341..1907dc9 100644
--- a/java/res/values-am/strings.xml
+++ b/java/res/values-am/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"የደብዳቤዎች ሁኔታ ላይ"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"የስልክ ሁኔታ ላይ"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"የስልክ ምልክቶች ሁኔታ ላይ"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"የቁልፍ ሰሌዳ ተደብቋል"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"የ<xliff:g id="MODE">%s</xliff:g> ቁልፍ ሰሌዳን በማሳየት ላይ"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"ቀን"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"ቀን እና ሰዓት"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"ኢሜይል"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"አላላክ"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"ቁጥር"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"ስልክ"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"ፅሁፍ"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"ጊዜ"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"ዩ አር ኤል"</string>
     <string name="voice_input" msgid="3583258583521397548">"የድምፅ ግቤት ቁልፍ"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"በዋናቁልፍ ሰሌዳ ላይ"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"በምልክቶች ቁልፍ ሰሌዳ ላይ"</string>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index bca3c2a..1268f43 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"وضع الأحرف"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"وضع الهاتف"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"وضع رموز الهاتف"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"لوحة المفاتيح مخفية"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"إظهار لوحة مفاتيح <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"التاريخ"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"التاريخ والوقت"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"البريد الإلكتروني"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"المراسلة"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"الرقم"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"الهاتف"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"النص"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"الوقت"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"عنوان URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"مفتاح الإدخال الصوتي"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"لوحة مفاتيح رئيسية"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"لوحة مفاتيح الرموز"</string>
diff --git a/java/res/values-be/strings.xml b/java/res/values-be/strings.xml
index 56382e4..6fc28e5 100644
--- a/java/res/values-be/strings.xml
+++ b/java/res/values-be/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Рэжым лiтар"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Рэжым тэлефона"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Рэжым тэлефонных знакаў"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Клавіятура схавана"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Паказана клавiятура ў рэжыме \" <xliff:g id="MODE">%s</xliff:g>\""</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"дата"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"дата i час"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"электронная пошта"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"абмен паведамленнямі"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"нумар"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"тэлефон"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"тэкст"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"час"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Ключ галасавога ўводу"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На асн. клавіятуры"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На сімв. клавіятуры"</string>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index 3ffebea..76bd2d1 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Режим за букви"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим  за телефон"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим за символи на телефона"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Клавиатурата е скрита"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Показва се клавиатурата за <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"дата"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"дата и час"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"имейл aдреси"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"съобщения"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"числа"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"телефонни номера"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"текст"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"часа"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL адреси"</string>
     <string name="voice_input" msgid="3583258583521397548">"Клавиш за гласово въвеждане"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На осн. клавиатура"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На клав. на симв."</string>
@@ -130,7 +141,7 @@
     <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"английски (САЩ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string>
     <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"испански (САЩ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string>
     <string name="subtype_no_language" msgid="141420857808801746">"Без език"</string>
-    <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"Без език („QWERTY“)"</string>
+    <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"без език („QWERTY“)"</string>
     <string name="subtype_no_language_qwertz" msgid="1177848172397202890">"Без език (QWERTZ)"</string>
     <string name="subtype_no_language_azerty" msgid="8721460968141187394">"Без език (AZERTY)"</string>
     <string name="subtype_no_language_dvorak" msgid="3122976737669823935">"Без език (Дворак)"</string>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index 2652738..ed88333 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mode de lletres"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode de telèfon"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode de símbols de telèfon"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclat amagat"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Es mostra el teclat <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"data i hora"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"correu electrònic"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"missatgeria"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"número"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telèfon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tecla d\'entrada de veu"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Al teclat principal"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Al teclat de símbols"</string>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index 7e12f06..b924dad 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Režim písmen"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Režim telefonu"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Režim telefonních symbolů"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klávesnice je skrytá"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Zobrazení klávesnice: <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum a čas"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"zprávy"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"čísla"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"čas"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"adresy URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Klávesa hlasového vstupu"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na hlavní klávesnici"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klávesnici se symboly"</string>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index 3ea4aaa..58ee41b 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Bogstavtilstand"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefontilstand"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefonsymboltilstand"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastaturet er skjult"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Viser tastatur til <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"dato"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"Dato og klokkeslæt"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"beskeder"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"tal"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"klokkeslæt"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"Webadresse"</string>
     <string name="voice_input" msgid="3583258583521397548">"Nøgle til stemmeinput"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På hovedtastatur"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På symboltastatur"</string>
diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml
index a50cdf0..ce620f0 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Buchstabenmodus"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonmodus"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefon-Symbolmodus"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastatur ausgeblendet"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Tastatur für <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"Datum"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"Datum &amp; Uhrzeit"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"E-Mail-Adresse"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"SMS/MMS"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"Zahl"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"Telefonnummer"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"Text"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"Zeit"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Taste für Spracheingabe"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Auf Haupttastatur"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Auf Symboltastatur"</string>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index 153dbbb..1294df0 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Λειτουργία γραμμάτων"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Λειτουργία τηλεφώνου"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Λειτουργία συμβόλων τηλεφώνου"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Απόκρυψη πληκτρολογίου"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Εμφάνιση πληκτρολογίου <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"ημερομηνία"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"ημερομηνία και ώρα"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"διεύθυνση ηλεκτρονικού ταχυδρομείου"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"ανταλλαγή μηνυμάτων"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"αριθμός"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"τηλέφωνο"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"κείμενο"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"ώρα"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"διεύθυνση URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Κλειδί φωνητικής εξόδου"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Στο κύριο πληκτρολ."</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Πληκτρ. συμβ. ενερ."</string>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index 5fbbdf6..9e7d64f 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Letters mode"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Phone mode"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Phone symbols mode"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Keyboard hidden"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Showing <xliff:g id="MODE">%s</xliff:g> keyboard"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"date"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"date and time"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"messaging"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"number"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"phone"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"time"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Voice input key"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"On main keyboard"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"On symbols keyboard"</string>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index 71841f8..7585b28 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modo Letras"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo Teléfono"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo Símbolos del teléfono"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Mostrando teclado para <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"fecha"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"fecha y hora"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"correo"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"Centro de Mensajes"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"número"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"teléfono"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"texto"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tecla de entrada por voz"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"En el teclado principal"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"En el teclado de símbolos"</string>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index 9b31884..42427fe 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modo de letras"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo de teléfono"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo de símbolos de teléfono"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Mostrando teclado <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"fecha"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"fecha y hora"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"correo electrónico"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"mensajes"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"número"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"teléfono"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"texto"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tecla de entrada de voz"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"En teclado principal"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"En teclado de símbolos"</string>
diff --git a/java/res/values-et/strings.xml b/java/res/values-et/strings.xml
index 3364abe..51eb47b 100644
--- a/java/res/values-et/strings.xml
+++ b/java/res/values-et/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Tähtede režiim"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonirežiim"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefoni sümbolite režiim"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klaviatuur on peidetud"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Näitab klaviatuuri režiimil <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"kuupäev"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"kuupäev ja kellaaeg"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-post"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"sõnumiside"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"number"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"aeg"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Häälesisendi klahv"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Peamisel klaviatuuril"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sümbol. klaviatuuril"</string>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index 54ba412..8f71f19 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -112,6 +112,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"حالت حروف"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"حالت تلفن"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"حالت نمادهای تلفن"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"صفحه کلید پنهان شد"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"نمایش صفحه کلید <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"تاریخ"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"تاریخ و زمان"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"ایمیل"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"پیام‌رسانی"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"عدد"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"تلفن"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"نوشتار"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"زمان"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"نشانی اینترنتی"</string>
     <string name="voice_input" msgid="3583258583521397548">"کلید ورودی صدا"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"در صفحه‌کلید اصلی"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"در صفحه‌کلید نمادها"</string>
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
index 2d75402..9fe8f1b 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Näppäimistötila"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Puhelintila"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Puhelinsymbolit-tila"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Näppäimistö on piilotettu"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Näytetään <xliff:g id="MODE">%s</xliff:g>-näppäimistö"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"päivämäärä"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"päivämäärä ja aika"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"sähköposti"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"viestit"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"numero"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"puhelin"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"teksti"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"aika"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL-osoite"</string>
     <string name="voice_input" msgid="3583258583521397548">"Ääniohjausavain"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Päänäppäimistössä"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Symbolinäppäimistössä"</string>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index f327f90..8b22874 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mode Lettres"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode Téléphone"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode Symboles du téléphone"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Clavier masqué"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Affichage du clavier <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"Date"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"Date et heure"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"Adresse e-mail"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"SMS/MMS"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"Chiffre"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"Numéro de téléphone"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"Texte"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"Heure"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Touche de saisie vocale"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Sur clavier principal"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sur clavier symboles"</string>
diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml
index e52143d..77081bd 100644
--- a/java/res/values-hi/strings.xml
+++ b/java/res/values-hi/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"अक्षर मोड"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"फ़ोन मोड"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"फ़ोन प्रतीक मोड"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"कीबोर्ड छिपा हुआ है"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> कीबोर्ड दिखाया जा रहा है"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"दिनांक"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"दिनांक और समय"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"ईमेल"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"संदेश सेवा"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"संख्या"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"फ़ोन"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"पाठ"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"समय"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"ध्‍वनि‍ इनपुट कुंजी"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"मुख्‍य कीबोर्ड पर"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"प्रतीक कीबोर्ड पर"</string>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index 564d48f..0710d30 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Način pisanja slova"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonski način rada"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Način unosa telefonskih simbola"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tipkovnica je skrivena"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Način prikazane tipkovnice: <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum i vrijeme"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pošta"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"slanje poruka"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"brojevi"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"vrijeme"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tipka za glasovni unos"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na glavnoj tipkovnici"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na tipkovnici simb."</string>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index 047a31a..e9c7aa0 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"\"Betű\" mód"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"\"Telefon\" mód"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"\"Telefonos szimbólumok\" mód"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Billentyűzet elrejtve"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> billentyűzet megjelenítve"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"dátum"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"dátum és idő"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"üzenetváltás"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"szám"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"szöveg"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"idő"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Hangbeviteli gomb"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"A fő billentyűzeten"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Szimbólumoknál"</string>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index ba9a7da..d573254 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mode huruf"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode telepon"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode simbol telepon"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Keyboard disembunyikan"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Menampilkan keyboard <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"tanggal"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"tanggal dan waktu"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"pesan"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"angka"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telepon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"teks"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"waktu"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tombol masukan suara"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pada keyboard utama"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pada keyboard simbol"</string>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index 56acdf8..0a62f8a 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modalità lettere"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modalità telefono"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modalità simboli telefono"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastiera nascosta"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Visualizzazione tastiera <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"data e ora"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"messaggi"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"numero"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefono"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"testo"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"ora"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tasto input vocale"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Su tastiera principale"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Su tastiera simboli"</string>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 7c55ab5..33d9fc5 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"מצב אותיות"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"מצב טלפון"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"מצב סמלי טלפון"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"המקלדת מוסתרת"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"מציג מקלדת <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"תאריך"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"תאריך ושעה"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"דוא\"ל"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"העברת הודעות"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"מספרים"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"מספרי טלפון"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"טקסט"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"זמן"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"כתובות אתרים"</string>
     <string name="voice_input" msgid="3583258583521397548">"מקש קלט קולי"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"במקלדת הראשית"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"במקלדת סמלים"</string>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index 9328f01..25b37a4 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"英数モード"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"電話モード"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"電話記号モード"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"キーボードは非表示です"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g>のキーボードを表示しています"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"日付"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"日時"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"メールアドレス"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"メッセージ"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"数値"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"電話番号"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"テキスト"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"時刻"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"音声入力キー"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"メインキーボード上"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"記号キーボード上"</string>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index f6086ee..3b0228a 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"문자 모드"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"다이얼 모드"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"전화 기호 모드"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"키보드 숨김"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> 키보드 표시"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"날짜"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"날짜 및 시간"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"이메일"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"문자 메시지"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"숫자"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"전화번호"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"텍스트"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"시간"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"음성 입력 키"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"기본 키보드"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"기호 키보드"</string>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index a815003..9bfffbc 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Raidžių režimas"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefono režimas"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefono simbolių režimas"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klaviatūra paslėpta"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Klaviatūra rodoma <xliff:g id="MODE">%s</xliff:g> režimu"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"datos"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"datos ir laiko"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"el. pašto"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"susirašinėjimo pranešimais"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"skaičių"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefonų numerių"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"teksto"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"laiko"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Įvesties balsu klavišas"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pagr. klaviatūroje"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Simbolių klaviatūr."</string>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
index 6a408cf..5dcaa01 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Burtu režīms"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Tālruņa režīms"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Tālruņa simbolu režīms"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastatūra ir paslēpta"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Tiek rādīts tastatūras režīms <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"datums"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"datums un laiks"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pasts"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"ziņojumapmaiņa"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"cipari"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"tālrunis"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"teksts"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"laiks"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Balss ievades atslēga"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Uz galv. tastatūras"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Uz simbolu tastat."</string>
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
index 0d4ccf4..4866fed 100644
--- a/java/res/values-ms/strings.xml
+++ b/java/res/values-ms/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mod huruf"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mod telefon"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mod simbol telefon"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Papan kekunci tersembunyi"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Menunjukkan <xliff:g id="MODE">%s</xliff:g> papan kekunci"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"tarikh"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"tarikh dan masa"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mel"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"pemesejan"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"nombor"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"teks"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"masa"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Kunci input suara"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Hidpkn kekunci utama"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pd ppn k’unci simbol"</string>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index f0b3a46..32793ef 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Bokstavmodus"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Ringemodus"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Ringemodus med symboler"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastaturet er skjult"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Viser <xliff:g id="MODE">%s</xliff:g>-tastatur"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"dato"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"dato og klokkeslett"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-post"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"tekstmeldinger"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"tall"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"tid"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"Nettadresse"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tast for taleinndata"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På hovedtastatur"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På talltastatur"</string>
diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
index dc3a9c3..4822617 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -108,11 +108,22 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Alfanumeriek toetsenbord"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Toetsenbord telefoon"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefoonsymbolen"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Toetsenbord verborgen"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> toetsenbord wordt weergegeven"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum en tijd"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"berichten"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"nummer"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefoon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"tijd"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Toets voor spraakinvoer"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Op hoofdtoetsenbord"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Op symbooltoetsenb."</string>
     <string name="voice_input_modes_off" msgid="3745699748218082014">"Uitgeschakeld"</string>
-    <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic op hoofdtoetsb."</string>
+    <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Microfoon op hoofdtoetsenbord"</string>
     <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic op symb.toetsb."</string>
     <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spraakinvoer is uit"</string>
     <string name="configure_input_method" msgid="373356270290742459">"Invoermethoden configureren"</string>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index de100bc..7bb8b77 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Tryb liter"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Tryb telefonu"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Tryb symboli telefonu"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klawiatura ukryta"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Pokazuję klawiaturę w trybie <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"data i godzina"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"SMS"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"liczba"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"godzina"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Klawisz rozpoznawania mowy"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na klawiaturze głównej"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klawiaturze z symbolami"</string>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 68a3457..caa4019 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modo de letras"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo de telemóvel"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo de símbolos de telemóvel"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"A mostrar teclado de <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"data e hora"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"mensagens"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"números"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telemóvel"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"texto"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URLs"</string>
     <string name="voice_input" msgid="3583258583521397548">"Chave de entrada de voz"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"No teclado principal"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"No teclado símbolos"</string>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index 00ab88c..ed8cdec 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modo de cartas"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo de telefone"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo de símbolos de telefone"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Mostrando teclado <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"data e hora"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"mensagens"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"número"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefone"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"texto"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Chave de entrada de texto por voz"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"No teclado principal"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"No teclado de símb."</string>
diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml
index 9eec7f8..5dad59f 100644
--- a/java/res/values-rm/strings.xml
+++ b/java/res/values-rm/strings.xml
@@ -187,6 +187,28 @@
     <skip />
     <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) -->
     <skip />
+    <!-- no translation found for announce_keyboard_hidden (8718927835531429807) -->
+    <skip />
+    <!-- no translation found for announce_keyboard_mode (4729081055438508321) -->
+    <skip />
+    <!-- no translation found for keyboard_mode_date (3137520166817128102) -->
+    <skip />
+    <!-- no translation found for keyboard_mode_date_time (339593358488851072) -->
+    <skip />
+    <!-- no translation found for keyboard_mode_email (6216248078128294262) -->
+    <skip />
+    <!-- no translation found for keyboard_mode_im (1137405089766557048) -->
+    <skip />
+    <!-- no translation found for keyboard_mode_number (7991623440699957069) -->
+    <skip />
+    <!-- no translation found for keyboard_mode_phone (6851627527401433229) -->
+    <skip />
+    <!-- no translation found for keyboard_mode_text (6479436687899701619) -->
+    <skip />
+    <!-- no translation found for keyboard_mode_time (4381856885582143277) -->
+    <skip />
+    <!-- no translation found for keyboard_mode_url (1519819835514911218) -->
+    <skip />
     <!-- no translation found for voice_input (3583258583521397548) -->
     <skip />
     <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) -->
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index c5a80e3..5fbcbe5 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modul Alfanumeric"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modul Telefon"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modul Telefon cu simboluri"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastatura este ascunsă"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Se afișează tastatura pentru <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"date"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"date și ore"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"adrese de e-mail"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"mesaje"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"numere"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefoane"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"ore"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"adrese URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tastă pentru intrarea vocală"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pe tastat. princip."</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pe tastat. simbol."</string>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index 13a5678..c21bbf9 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Режим ввода текста"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим набора номера"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим телефонных символов"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Клавиатура скрыта"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Включен режим <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"ввода даты"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"ввода даты и времени"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"ввода адреса электронной почты"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"ввода сообщения"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"ввода цифр"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"набора номера"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"ввода текста"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"ввода времени"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"ввода URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Кнопка голосового ввода"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Значок на основной клавиатуре"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Значок на клавиатуре символов"</string>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index 0b28bf1..aad236e 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Režim písmen"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Režim telefónu"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Režim telefónnych symbolov"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klávesnica je skrytá"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Zobrazenie klávesnice v režime <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"dátum"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"dátum a čas"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"odosielanie správ"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"číslo"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefón"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"čas"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"Adresa URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Kľúč hlasového vstupu"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na hlavnej klávesnici"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klávesnici so symbolmi"</string>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
index 50f3869..a93bf0a 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Način črk"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Način telefona"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Način simbolov telefona"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tipkovnica je skrita"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Prikaz tipkovnice: <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum in ura"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pošta"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"sporočila SMS"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"števila"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefonske številke"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"besedilo"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"ura"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tipka za glasovni vnos"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na glavni tipkovnici"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na tipk. s simboli"</string>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index 2d13db0..8450da1 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Режим слова"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим телефона"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим симбола телефона"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Тастатура је сакривена"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Приказује се тастатура у режиму <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"датум"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"датум и време"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"адреса е-поште"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"размена порука"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"број"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"телефон"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"текст"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"време"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL адреса"</string>
     <string name="voice_input" msgid="3583258583521397548">"Тастер за гласовни унос"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На главној тастатури"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На тастатури са симболима"</string>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index 608caad..be278fa 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Bokstavsläge"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonläge"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefonsymbolläge"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tangentbordet är dolt"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Tangentbord för <xliff:g id="MODE">%s</xliff:g> visas"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum och tid"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-post"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"sms"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"siffror"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefonnummer"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"klockslag"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"webbadresser"</string>
     <string name="voice_input" msgid="3583258583521397548">"Röstinmatningsknapp"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På huvudtangentbord"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På symboltangentbord"</string>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
index 104a5d4..1fc92fb 100644
--- a/java/res/values-sw/strings.xml
+++ b/java/res/values-sw/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Hali ya barua"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Hali ya simu"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Hali ya alama za simu"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Kibodi imefichwa"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Inaonyesha kibodi <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"tarehe"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"tarehe na wakati"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"barua pepe"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"inatuma ujumbe"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"nambari"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"simu"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"maandishi"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"wakati"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Kibao cha kuingizia sauti"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Kwenye kibodi kuu"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Kwenye kibodi ya ishara"</string>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index 1db5e91..84c4a03 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"โหมดตัวอักษร"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"โหมดโทรศัพท์"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"โหมดสัญลักษณ์โทรศัพท์"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"ซ่อนแป้นพิมพ์แล้ว"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"กำลังแสดงแป้นพิมพ์ <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"วันที่"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"วันที่และเวลา"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"อีเมล"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"ข้อความ"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"หมายเลข"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"โทรศัพท์"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"ข้อความ"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"เวลา"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"แป้นการป้อนข้อมูลด้วยเสียง"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"บนแป้นพิมพ์หลัก"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"บนแป้นพิมพ์สัญลักษณ์"</string>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index adf0a19..e2a59a4 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mode ng mga titik"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode ng telepono"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode ng mga simbolo ng telepono"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Nakatago ang keyboard"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Ipinapakita ang <xliff:g id="MODE">%s</xliff:g> keyboard"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"petsa"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"petsa at oras"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"pagmemensahe"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"numero"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telepono"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"teksto"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"oras"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Voice input key"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Sa pangunahing keyboard"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sa keyboard ng mga simbolo"</string>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index fd80fea..c78d56b 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Harf modu"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefon modu"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefon sembolleri modu"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klavye gizli"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> klavyesi gösteriliyor"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"tarih"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"tarih ve saat"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"e-posta"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"mesajlaşma"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"rakam"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"metin"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"saat"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Ses girişi tuşu"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Ana klavyede"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Simge klavyesinde"</string>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 2e2fdfc..2b92d03 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Режим букв і цифр"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим набору номера"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим набору символів"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Клавіатуру сховано"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Зараз клавіатура в такому режимі: <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"дата"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"дата й час"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"електронні адреси"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"повідомлення"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"цифри"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"номери телефонів"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"текст"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"час"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL-адреси"</string>
     <string name="voice_input" msgid="3583258583521397548">"Ключ голосового вводу"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На основ. клавіатурі"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Символьна клавіатура"</string>
@@ -130,7 +141,7 @@
     <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Англійська (США) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string>
     <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"іспанська (США) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string>
     <string name="subtype_no_language" msgid="141420857808801746">"Мову не вибрано"</string>
-    <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"Немає мови (QWERTY)"</string>
+    <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"QWERTY-клавіатура"</string>
     <string name="subtype_no_language_qwertz" msgid="1177848172397202890">"Без мови (QWERTZ)"</string>
     <string name="subtype_no_language_azerty" msgid="8721460968141187394">"Без мови (AZERTY)"</string>
     <string name="subtype_no_language_dvorak" msgid="3122976737669823935">"Без мови (Dvorak)"</string>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index 6721980..2dcfb19 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Chế độ chữ cái"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Chế độ điện thoại"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Chế độ biểu tượng điện thoại"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Bàn phím bị ẩn"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Hiển thị bàn phím <xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"ngày"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"ngày và giờ"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"nhắn tin"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"số"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"điện thoại"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"văn bản"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"giờ"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Khóa nhập giọng nói"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Trên bàn phím chính"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Trên bàn phím biểu tượng"</string>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index ebb6b91..3e47776 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"字母模式"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"电话模式"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"电话符号模式"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"键盘已隐藏"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"目前显示的是<xliff:g id="MODE">%s</xliff:g>键盘"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"日期"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"日期和时间"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"电子邮件"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"短信"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"数字"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"电话"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"文字"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"时间"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"网址"</string>
     <string name="voice_input" msgid="3583258583521397548">"语音输入键"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"主键盘上"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"符号键盘上"</string>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index 7d4ea72..ab6c664 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"字母模式"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"撥號模式"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"撥號符號模式"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"鍵盤已隱藏"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"目前顯示的是<xliff:g id="MODE">%s</xliff:g>鍵盤"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"日期"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"日期和時間"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"電子郵件"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"簡訊"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"數字"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"電話"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"文字"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"時間"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"網址"</string>
     <string name="voice_input" msgid="3583258583521397548">"語音輸入按鍵"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"主鍵盤上"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"符號鍵盤上"</string>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index 29ed595..677588b 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -108,6 +108,17 @@
     <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Imodi yezinhlamvu"</string>
     <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Imodi yefoni"</string>
     <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Imodi yezimpawu zefoni"</string>
+    <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Ikhibhodi ifihliwe"</string>
+    <string name="announce_keyboard_mode" msgid="4729081055438508321">"Kuboniswa ikhibhodi engu-<xliff:g id="MODE">%s</xliff:g>"</string>
+    <string name="keyboard_mode_date" msgid="3137520166817128102">"idethi"</string>
+    <string name="keyboard_mode_date_time" msgid="339593358488851072">"idethi nesikhathi"</string>
+    <string name="keyboard_mode_email" msgid="6216248078128294262">"i-imeyili"</string>
+    <string name="keyboard_mode_im" msgid="1137405089766557048">"imilayezo"</string>
+    <string name="keyboard_mode_number" msgid="7991623440699957069">"inombolo"</string>
+    <string name="keyboard_mode_phone" msgid="6851627527401433229">"ifoni"</string>
+    <string name="keyboard_mode_text" msgid="6479436687899701619">"umbhalo"</string>
+    <string name="keyboard_mode_time" msgid="4381856885582143277">"isikhathi"</string>
+    <string name="keyboard_mode_url" msgid="1519819835514911218">"I-URL"</string>
     <string name="voice_input" msgid="3583258583521397548">"Inkinobho yokufaka izwi"</string>
     <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Kwikhibhodi eyisisekelo"</string>
     <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Ikhibhodi yezimpawu"</string>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 68fa8fd..e89174b 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -223,6 +223,29 @@
     <!-- Spoken feedback after changing to the shifted phone dialer (symbols) keyboard. -->
     <string name="spoken_description_mode_phone_shift">Phone symbols mode</string>
 
+    <!-- Spoken feedback when the keyboard is hidden. -->
+    <string name="announce_keyboard_hidden">Keyboard hidden</string>
+    <!-- Spoken feedback when the keyboard mode changes. -->
+    <string name="announce_keyboard_mode">Showing <xliff:g id="mode" example="email">%s</xliff:g> keyboard</string>
+    <!-- Description of the keyboard mode for entering dates. -->
+    <string name="keyboard_mode_date">date</string>
+    <!-- Description of the keyboard mode for entering dates and times. -->
+    <string name="keyboard_mode_date_time">date and time</string>
+    <!-- Description of the keyboard mode for entering email addresses. -->
+    <string name="keyboard_mode_email">email</string>
+    <!-- Description of the keyboard mode for entering text messages. -->
+    <string name="keyboard_mode_im">messaging</string>
+    <!-- Description of the keyboard mode for entering numbers. -->
+    <string name="keyboard_mode_number">number</string>
+    <!-- Description of the keyboard mode for entering phone numbers. -->
+    <string name="keyboard_mode_phone">phone</string>
+    <!-- Description of the keyboard mode for entering generic text. -->
+    <string name="keyboard_mode_text">text</string>
+    <!-- Description of the keyboard mode for entering times. -->
+    <string name="keyboard_mode_time">time</string>
+    <!-- Description of the keyboard mode for entering URLs. -->
+    <string name="keyboard_mode_url">URL</string>
+
     <!-- Preferences item for enabling speech input -->
     <string name="voice_input">Voice input key</string>
 
diff --git a/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml b/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml
index a0e5cbb..0e3013a 100644
--- a/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml
+++ b/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml
@@ -28,19 +28,9 @@
             <Key
                 latin:keyLabel=";"
                 latin:moreKeys=":" />
-            <!-- U+2018: "‘" LEFT SINGLE QUOTATION MARK
-                 U+2019: "’" RIGHT SINGLE QUOTATION MARK
-                 U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-                 U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-                 U+201C: "“" LEFT DOUBLE QUOTATION MARK
-                 U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-                 U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-                 U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-            <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
-                 moreKeys="!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x2018;,&#x2019;,&#x201A;,&#x201B;" -->
             <Key
                 latin:keyLabel="\'"
-                latin:moreKeys="!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x2018;,&#x2019;,&#x201A;,&#x201B;,&quot;" />
+                latin:moreKeys="!fixedColumnOrder!3,!text/double_quotes,!text/single_quotes" />
         </case>
         <default>
             <Key
@@ -48,20 +38,10 @@
                 latin:keyHintLabel=":"
                 latin:moreKeys=":"
                 latin:keyStyle="hasShiftedLetterHintStyle" />
-            <!-- U+2018: "‘" LEFT SINGLE QUOTATION MARK
-                 U+2019: "’" RIGHT SINGLE QUOTATION MARK
-                 U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-                 U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-                 U+201C: "“" LEFT DOUBLE QUOTATION MARK
-                 U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-                 U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-                 U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-            <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
-                 moreKeys="!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x2018;,&#x2019;,&#x201A;,&#x201B;" -->
             <Key
                 latin:keyLabel="\'"
                 latin:keyHintLabel="&quot;"
-                latin:moreKeys="!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x2018;,&#x2019;,&#x201A;,&#x201B;,&quot;"
+                latin:moreKeys="!fixedColumnOrder!4,!text/double_quotes,&quot;,!text/single_quotes"
                 latin:keyStyle="hasShiftedLetterHintStyle" />
         </default>
     </switch>
diff --git a/java/res/xml-v16/key_hindi1_shift.xml b/java/res/xml-v16/key_hindi1_shift.xml
new file mode 100644
index 0000000..19b9643
--- /dev/null
+++ b/java/res/xml-v16/key_hindi1_shift.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0903: "ः" DEVANAGARI SIGN VISARGA -->
+    <Key
+        latin:keyLabel="&#x0903;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml-v16/key_hindi3_right.xml b/java/res/xml-v16/key_hindi3_right.xml
new file mode 100644
index 0000000..232810f
--- /dev/null
+++ b/java/res/xml-v16/key_hindi3_right.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+093C: "़" DEVANAGARI SIGN NUKTA
+         U+097D: "ॽ" DEVANAGARI LETTER GLOTTAL STOP
+         U+0970: "॰" DEVANAGARI ABBREVIATION SIGN
+         U+093D: "ऽ" DEVANAGARI SIGN AVAGRAHA -->
+    <Key
+        latin:keyLabel="&#x093C;"
+        latin:moreKeys="&#x097D;,&#x0970;,&#x093D;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml-v16/key_hindi3_shift_left.xml b/java/res/xml-v16/key_hindi3_shift_left.xml
new file mode 100644
index 0000000..1eb1768
--- /dev/null
+++ b/java/res/xml-v16/key_hindi3_shift_left.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU
+         U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E -->
+    <Key
+        latin:keyLabel="&#x0901;"
+        latin:moreKeys="&#x0945;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml-v16/key_hindi3_shift_right.xml b/java/res/xml-v16/key_hindi3_shift_right.xml
new file mode 100644
index 0000000..0f26cb5
--- /dev/null
+++ b/java/res/xml-v16/key_hindi3_shift_right.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R
+         U+0944: "ॄ" DEVANAGARI VOWEL SIGN VOCALIC RR -->
+    <Key
+        latin:keyLabel="&#x0943;"
+        latin:moreKeys="&#x0944;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml-v16/keys_hindi1_left5.xml b/java/res/xml-v16/keys_hindi1_left5.xml
new file mode 100644
index 0000000..e3ad299
--- /dev/null
+++ b/java/res/xml-v16/keys_hindi1_left5.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+094C: "ौ" DEVANAGARI VOWEL SIGN AU
+         U+094C/U+0902: "ौं" DEVANAGARI VOWEL SIGN AU/DEVANAGARI SIGN ANUSVARA
+         U+0967: "१" DEVANAGARI DIGIT ONE -->
+    <Key
+        latin:keyLabel="&#x094C;"
+        latin:moreKeys="&#x094C;&#x0902;,%"
+        latin:keyHintLabel="1"
+        latin:additionalMoreKeys="&#x0967;,1"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0948: "ै" DEVANAGARI VOWEL SIGN AI
+         U+0948/U+0902: "ैं" DEVANAGARI VOWEL SIGN AI/DEVANAGARI SIGN ANUSVARA
+         U+0968: "२" DEVANAGARI DIGIT TWO -->
+    <Key
+        latin:keyLabel="&#x0948;"
+        latin:moreKeys="&#x0948;&#x0902;,%"
+        latin:keyHintLabel="2"
+        latin:additionalMoreKeys="&#x0968;,2"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+093E: "ा" DEVANAGARI VOWEL SIGN AA
+         U+093E/U+0902: "ां" DEVANAGARI VOWEL SIGN AA/DEVANAGARI SIGN ANUSVARA
+         U+093E/U+0901: "ाँ" DEVANAGARI VOWEL SIGN AA/DEVANAGARI SIGN CANDRABINDU
+         U+0969: "३" DEVANAGARI DIGIT THREE -->
+    <Key
+        latin:keyLabel="&#x093E;"
+        latin:moreKeys="&#x093E;&#x0902;,&#x093E;&#x0901;,%"
+        latin:keyHintLabel="3"
+        latin:additionalMoreKeys="&#x0969;,3"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0940: "ी" DEVANAGARI VOWEL SIGN II
+         U+0940/U+0902: "ीं" DEVANAGARI VOWEL SIGN II/DEVANAGARI SIGN ANUSVARA
+         U+096A: "४" DEVANAGARI DIGIT FOUR -->
+    <Key
+        latin:keyLabel="&#x0940;"
+        latin:moreKeys="&#x0940;&#x0902;,%"
+        latin:keyHintLabel="4"
+        latin:additionalMoreKeys="&#x096A;,4"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0942: "ू" DEVANAGARI VOWEL SIGN UU
+         U+0942/U+0902: "ूं" DEVANAGARI VOWEL SIGN UU/DEVANAGARI SIGN ANUSVARA
+         U+0942/U+0901: "ूँ" DEVANAGARI VOWEL SIGN UU/DEVANAGARI SIGN CANDRABINDU
+         U+096B: "५" DEVANAGARI DIGIT FIVE -->
+    <Key
+        latin:keyLabel="&#x0942;"
+        latin:moreKeys="&#x0942;&#x0902;,&#x0942;&#x0901;,%"
+        latin:keyHintLabel="5"
+        latin:additionalMoreKeys="&#x096B;,5"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml-v16/keys_hindi2_left5.xml b/java/res/xml-v16/keys_hindi2_left5.xml
new file mode 100644
index 0000000..05c4f57
--- /dev/null
+++ b/java/res/xml-v16/keys_hindi2_left5.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+094B: "ो" DEVANAGARI VOWEL SIGN O
+         U+094B/U+0902: "қं" DEVANAGARI VOWEL SIGN O/DEVANAGARI SIGN ANUSVARA
+         U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O
+         U+094A: "ॊ" DEVANAGARI VOWEL SIGN SHORT O -->
+    <Key
+        latin:keyLabel="&#x094B;"
+        latin:moreKeys="&#x094B;&#x0902;,&#x0949;,&#x094A;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0947: "े" DEVANAGARI VOWEL SIGN E
+         U+0947/U+0902: "ें" DEVANAGARI VOWEL SIGN E/DEVANAGARI SIGN ANUSVARA -->
+    <Key
+        latin:keyLabel="&#x0947;"
+        latin:moreKeys="&#x0947;&#x0902;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+094D: "्" DEVANAGARI SIGN VIRAMA -->
+    <Key
+        latin:keyLabel="&#x094D;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+093F: "ि" DEVANAGARI VOWEL SIGN I
+         U+093F/U+0902: "िं" DEVANAGARI VOWEL SIGN I/DEVANAGARI SIGN ANUSVARA -->
+    <Key
+        latin:keyLabel="&#x093F;"
+        latin:moreKeys="&#x093F;&#x0902;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0941: "ु" DEVANAGARI VOWEL SIGN U
+         U+0941/U+0902: "ुं" DEVANAGARI VOWEL SIGN U/DEVANAGARI SIGN ANUSVARA
+         U+0941/U+0901: "ुँ" DEVANAGARI VOWEL SIGN U/DEVANAGARI SIGN CANDRABINDU -->
+    <Key
+        latin:keyLabel="&#x0941;"
+        latin:moreKeys="&#x0941;&#x0902;,&#x0941;&#x0901;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml-v16/keys_hindi3_left2.xml b/java/res/xml-v16/keys_hindi3_left2.xml
new file mode 100644
index 0000000..9474c17
--- /dev/null
+++ b/java/res/xml-v16/keys_hindi3_left2.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O -->
+    <Key
+        latin:keyLabel="&#x0949;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0902: "ं" DEVANAGARI SIGN ANUSVARA -->
+    <Key
+        latin:keyLabel="&#x0902;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml/key_hindi1_shift.xml b/java/res/xml/key_hindi1_shift.xml
new file mode 100644
index 0000000..0db5ae9
--- /dev/null
+++ b/java/res/xml/key_hindi1_shift.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+0903: "ः" DEVANAGARI SIGN VISARGA -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x0903;"
+        latin:code="0x0903"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+</merge>
diff --git a/java/res/xml/key_hindi3_right.xml b/java/res/xml/key_hindi3_right.xml
new file mode 100644
index 0000000..5a97355
--- /dev/null
+++ b/java/res/xml/key_hindi3_right.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+093C: "़" DEVANAGARI SIGN NUKTA
+         U+097D: "ॽ" DEVANAGARI LETTER GLOTTAL STOP
+         U+0970: "॰" DEVANAGARI ABBREVIATION SIGN
+         U+093D: "ऽ" DEVANAGARI SIGN AVAGRAHA -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x093C;"
+        latin:code="0x093C"
+        latin:moreKeys="&#x25CC;&#x097D;|&#x097D;,&#x25CC;&#x0970;|&#x0970;,&#x25CC;&#x093D;|&#x093D;"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+</merge>
diff --git a/java/res/xml/key_hindi3_shift_left.xml b/java/res/xml/key_hindi3_shift_left.xml
new file mode 100644
index 0000000..c5e2f13
--- /dev/null
+++ b/java/res/xml/key_hindi3_shift_left.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU
+         U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x0901;"
+        latin:code="0x0901"
+        latin:moreKeys="&#x25CC;&#x0945;|&#x0945;"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+</merge>
diff --git a/java/res/xml/key_hindi3_shift_right.xml b/java/res/xml/key_hindi3_shift_right.xml
new file mode 100644
index 0000000..0da116a
--- /dev/null
+++ b/java/res/xml/key_hindi3_shift_right.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R
+         U+0944: "ॄ" DEVANAGARI VOWEL SIGN VOCALIC RR -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x0943;"
+        latin:code="0x0943"
+        latin:moreKeys="&#x25CC;&#x0944;|&#x0944;"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+</merge>
diff --git a/java/res/xml/keys_hindi1_left5.xml b/java/res/xml/keys_hindi1_left5.xml
new file mode 100644
index 0000000..8757afe
--- /dev/null
+++ b/java/res/xml/keys_hindi1_left5.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+094C: "ौ" DEVANAGARI VOWEL SIGN AU
+         U+094C/U+0902: "ौं" DEVANAGARI VOWEL SIGN AU/DEVANAGARI SIGN ANUSVARA
+         U+0967: "१" DEVANAGARI DIGIT ONE -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x094C;"
+        latin:code="0x094C"
+        latin:moreKeys="&#x25CC;&#x094C;&#x0902;|&#x094C;&#x0902;,%"
+        latin:keyHintLabel="1"
+        latin:additionalMoreKeys="&#x0967;,1"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+0948: "ै" DEVANAGARI VOWEL SIGN AI
+         U+0948/U+0902: "ैं" DEVANAGARI VOWEL SIGN AI/DEVANAGARI SIGN ANUSVARA
+         U+0968: "२" DEVANAGARI DIGIT TWO -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x0948;"
+        latin:code="0x0948"
+        latin:moreKeys="&#x25CC;&#x0948;&#x0902;|&#x0948;&#x0902;,%"
+        latin:keyHintLabel="2"
+        latin:additionalMoreKeys="&#x0968;,2"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+093E: "ा" DEVANAGARI VOWEL SIGN AA
+         U+093E/U+0902: "ां" DEVANAGARI VOWEL SIGN AA/DEVANAGARI SIGN ANUSVARA
+         U+093E/U+0901: "ाँ" DEVANAGARI VOWEL SIGN AA/DEVANAGARI SIGN CANDRABINDU
+         U+0969: "३" DEVANAGARI DIGIT THREE -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x093E;"
+        latin:code="0x093E"
+        latin:moreKeys="&#x25CC;&#x093E;&#x0902;|&#x093E;&#x0902;,&#x25CC;&#x093E;&#x0901;|&#x093E;&#x0901;,%"
+        latin:keyHintLabel="3"
+        latin:additionalMoreKeys="&#x0969;,3"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+0940: "ी" DEVANAGARI VOWEL SIGN II
+         U+0940/U+0902: "ीं" DEVANAGARI VOWEL SIGN II/DEVANAGARI SIGN ANUSVARA
+         U+096A: "४" DEVANAGARI DIGIT FOUR -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x0940;"
+        latin:code="0x0940"
+        latin:moreKeys="&#x25CC;&#x0940;&#x0902;|&#x0940;&#x0902;,%"
+        latin:keyHintLabel="4"
+        latin:additionalMoreKeys="&#x096A;,4"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+0942: "ू" DEVANAGARI VOWEL SIGN UU
+         U+0942/U+0902: "ूं" DEVANAGARI VOWEL SIGN UU/DEVANAGARI SIGN ANUSVARA
+         U+0942/U+0901: "ूँ" DEVANAGARI VOWEL SIGN UU/DEVANAGARI SIGN CANDRABINDU
+         U+096B: "५" DEVANAGARI DIGIT FIVE -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x0942;"
+        latin:code="0x0942"
+        latin:moreKeys="&#x25CC;&#x0942;&#x0902;|&#x0942;&#x0902;,&#x25CC;&#x0942;&#x0901;|&#x0942;&#x0901;,%"
+        latin:keyHintLabel="5"
+        latin:additionalMoreKeys="&#x096B;,5"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+</merge>
diff --git a/java/res/xml/keys_hindi2_left5.xml b/java/res/xml/keys_hindi2_left5.xml
new file mode 100644
index 0000000..4c3a5e0
--- /dev/null
+++ b/java/res/xml/keys_hindi2_left5.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+094B: "ो" DEVANAGARI VOWEL SIGN O
+         U+094B/U+0902: "қं" DEVANAGARI VOWEL SIGN O/DEVANAGARI SIGN ANUSVARA
+         U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O
+         U+094A: "ॊ" DEVANAGARI VOWEL SIGN SHORT O -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x094B;"
+        latin:code="0x094B"
+        latin:moreKeys="&#x25CC;&#x094B;&#x0902;|&#x094B;&#x0902;,&#x25CC;&#x0949;,&#x094A;|&#x0949;,&#x094A;"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+0947: "े" DEVANAGARI VOWEL SIGN E
+         U+0947/U+0902: "ें" DEVANAGARI VOWEL SIGN E/DEVANAGARI SIGN ANUSVARA -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x0947;"
+        latin:code="0x0947"
+        latin:moreKeys="&#x25CC;&#x0947;&#x0902;|&#x0947;&#x0902;"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+094D: "्" DEVANAGARI SIGN VIRAMA -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x094D;"
+        latin:code="0x094D"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+093F: "ि" DEVANAGARI VOWEL SIGN I
+         U+093F/U+0902: "िं" DEVANAGARI VOWEL SIGN I/DEVANAGARI SIGN ANUSVARA -->
+    <Key
+        latin:keyLabel="&#x093F;&#x25CC;"
+        latin:code="0x093F"
+        latin:moreKeys="&#x093F;&#x25CC;&#x0902;|&#x093F;&#x0902;"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+0941: "ु" DEVANAGARI VOWEL SIGN U
+         U+0941/U+0902: "ुं" DEVANAGARI VOWEL SIGN U/DEVANAGARI SIGN ANUSVARA
+         U+0941/U+0901: "ुँ" DEVANAGARI VOWEL SIGN U/DEVANAGARI SIGN CANDRABINDU -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x0941;"
+        latin:code="0x0941"
+        latin:moreKeys="&#x25CC;&#x0941;&#x0902;|&#x0941;&#x0902;,&#x25CC;&#x0941;&#x0901;|&#x0941;&#x0901;"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+</merge>
diff --git a/java/res/xml/keys_hindi3_left2.xml b/java/res/xml/keys_hindi3_left2.xml
new file mode 100644
index 0000000..4f1ad16
--- /dev/null
+++ b/java/res/xml/keys_hindi3_left2.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+
+<!-- The code point U+25CC for key label is needed because the font rendering system prior to
+     API version 16 can't automatically render dotted circle for incomplete combining letter
+     of Hindi. The files named res/xml/{key,keys}_hindi*.xml have this U+25CC hack, although the
+     counterpart files named res/xml-v16/{key,keys}_hindi*.xml don't have this hack. -->
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x0949;"
+        latin:code="0x0949"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+    <!-- U+25CC: "◌" DOTTED CIRCLE
+         U+0902: "ं" DEVANAGARI SIGN ANUSVARA -->
+    <Key
+        latin:keyLabel="&#x25CC;&#x0902;"
+        latin:code="0x0902"
+        latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
+</merge>
diff --git a/java/res/xml/keys_pcqwerty3_right2.xml b/java/res/xml/keys_pcqwerty3_right2.xml
index fd9d3b8..aa150af 100644
--- a/java/res/xml/keys_pcqwerty3_right2.xml
+++ b/java/res/xml/keys_pcqwerty3_right2.xml
@@ -30,25 +30,15 @@
                 latin:moreKeys=":" />
             <Key
                 latin:keyLabel="\'"
-                latin:moreKeys="&quot;" />
+                latin:moreKeys="!fixedColumnOrder!4,!text/double_quotes,&quot;,!text/single_quotes" />
         </case>
         <!-- keyboardLayoutSetElement="alphabet*Shifted|symbols*" -->
         <default>
             <Key
                 latin:keyLabel=":" />
-            <!-- U+2018: "‘" LEFT SINGLE QUOTATION MARK
-                 U+2019: "’" RIGHT SINGLE QUOTATION MARK
-                 U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-                 U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-                 U+201C: "“" LEFT DOUBLE QUOTATION MARK
-                 U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-                 U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-                 U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-            <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
-                 moreKeys="!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x2018;,&#x2019;,&#x201A;,&#x201B;" -->
             <Key
                 latin:keyLabel="&quot;"
-                latin:moreKeys="!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x2018;,&#x2019;,&#x201A;,&#x201B;" />
+                latin:moreKeys="!fixedColumnOrder!3,!text/double_quotes,!text/single_quotes" />
         </default>
     </switch>
 </merge>
diff --git a/java/res/xml/row_symbols_shift4.xml b/java/res/xml/row_symbols_shift4.xml
index 1bfb5ec..99a685c 100644
--- a/java/res/xml/row_symbols_shift4.xml
+++ b/java/res/xml/row_symbols_shift4.xml
@@ -27,13 +27,11 @@
         <Key
             latin:keyStyle="toAlphaKeyStyle"
             latin:keyWidth="15%p" />
-        <!-- U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-        <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
-        <!-- latin:keyLabelFlags="hasPopupHint" -->
-        <!-- latin:moreKeys="&#x201F;" -->
-        <!-- U+201E: "„" DOUBLE LOW-9 QUOTATION MARK -->
+        <!-- U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+             U+201E: "„" DOUBLE LOW-9 QUOTATION MARK -->
         <Key
             latin:keyLabel="&#x201E;"
+            latin:moreKeys="&#x201A;"
             latin:backgroundType="functional" />
         <include
             latin:keyXPos="25%p"
diff --git a/java/res/xml/rowkeys_hindi1.xml b/java/res/xml/rowkeys_hindi1.xml
index 1120804..a761a6c 100644
--- a/java/res/xml/rowkeys_hindi1.xml
+++ b/java/res/xml/rowkeys_hindi1.xml
@@ -61,10 +61,11 @@
             <Key
                 latin:keyLabel="&#x092D;"
                 latin:keyLabelFlags="fontNormal" />
-            <!-- U+0903: "ः" DEVANAGARI SIGN VISARGA -->
-            <Key
-                latin:keyLabel="&#x0903;"
-                latin:keyLabelFlags="fontNormal" />
+            <!-- Because the font rendering system prior to API version 16 can't automatically
+                 render dotted circle for incomplete combining letter of Hindi, different set of
+                 Key definitions are needed based on the API version. -->
+            <include
+                latin:keyboardLayout="@xml/key_hindi1_shift" />
             <!-- U+0918: "घ" DEVANAGARI LETTER GHA -->
             <Key
                 latin:keyLabel="&#x0918;"
@@ -86,53 +87,11 @@
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
-            <!-- U+094C: "ौ" DEVANAGARI VOWEL SIGN AU
-                 U+094C/U+0902: "ौं" DEVANAGARI VOWEL SIGN AU/DEVANAGARI SIGN ANUSVARA
-                 U+0967: "१" DEVANAGARI DIGIT ONE -->
-            <Key
-                latin:keyLabel="&#x094C;"
-                latin:moreKeys="&#x094C;&#x0902;,%"
-                latin:keyHintLabel="1"
-                latin:additionalMoreKeys="&#x0967;,1"
-                latin:keyLabelFlags="fontNormal" />
-            <!-- U+0948: "ै" DEVANAGARI VOWEL SIGN AI
-                 U+0948/U+0902: "ैं" DEVANAGARI VOWEL SIGN AI/DEVANAGARI SIGN ANUSVARA
-                 U+0968: "२" DEVANAGARI DIGIT TWO -->
-            <Key
-                latin:keyLabel="&#x0948;"
-                latin:moreKeys="&#x0948;&#x0902;,%"
-                latin:keyHintLabel="2"
-                latin:additionalMoreKeys="&#x0968;,2"
-                latin:keyLabelFlags="fontNormal" />
-            <!-- U+093E: "ा" DEVANAGARI VOWEL SIGN AA
-                 U+093E/U+0902: "ां" DEVANAGARI VOWEL SIGN AA/DEVANAGARI SIGN ANUSVARA
-                 U+093E/U+0901: "ाँ" DEVANAGARI VOWEL SIGN AA/DEVANAGARI SIGN CANDRABINDU
-                 U+0969: "३" DEVANAGARI DIGIT THREE -->
-            <Key
-                latin:keyLabel="&#x093E;"
-                latin:moreKeys="&#x093E;&#x0902;,&#x093E;&#x0901;,%"
-                latin:keyHintLabel="3"
-                latin:additionalMoreKeys="&#x0969;,3"
-                latin:keyLabelFlags="fontNormal" />
-            <!-- U+0940: "ी" DEVANAGARI VOWEL SIGN II
-                 U+0940/U+0902: "ीं" DEVANAGARI VOWEL SIGN II/DEVANAGARI SIGN ANUSVARA
-                 U+096A: "४" DEVANAGARI DIGIT FOUR -->
-            <Key
-                latin:keyLabel="&#x0940;"
-                latin:moreKeys="&#x0940;&#x0902;,%"
-                latin:keyHintLabel="4"
-                latin:additionalMoreKeys="&#x096A;,4"
-                latin:keyLabelFlags="fontNormal" />
-            <!-- U+0942: "ू" DEVANAGARI VOWEL SIGN UU
-                 U+0942/U+0902: "ूं" DEVANAGARI VOWEL SIGN UU/DEVANAGARI SIGN ANUSVARA
-                 U+0942/U+0901: "ूँ" DEVANAGARI VOWEL SIGN UU/DEVANAGARI SIGN CANDRABINDU
-                 U+096B: "५" DEVANAGARI DIGIT FIVE -->
-            <Key
-                latin:keyLabel="&#x0942;"
-                latin:moreKeys="&#x0942;&#x0902;,&#x0942;&#x0901;,%"
-                latin:keyHintLabel="5"
-                latin:additionalMoreKeys="&#x096B;,5"
-                latin:keyLabelFlags="fontNormal" />
+            <!-- Because the font rendering system prior to API version 16 can't automatically
+                 render dotted circle for incomplete combining letter of Hindi, different set of
+                 Key definitions are needed based on the API version. -->
+            <include
+                latin:keyboardLayout="@xml/keys_hindi1_left5" />
             <!-- U+092C: "ब" DEVANAGARI LETTER BA
                  U+092C/U+0952: "ब॒" DEVANAGARI LETTER BA/DEVANAGARI STRESS SIGN ANUDATTA -->
             <Key
diff --git a/java/res/xml/rowkeys_hindi2.xml b/java/res/xml/rowkeys_hindi2.xml
index e7c67db..9545b84 100644
--- a/java/res/xml/rowkeys_hindi2.xml
+++ b/java/res/xml/rowkeys_hindi2.xml
@@ -96,37 +96,11 @@
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
-            <!-- U+094B: "ो" DEVANAGARI VOWEL SIGN O
-                 U+094B/U+0902: "қं" DEVANAGARI VOWEL SIGN O/DEVANAGARI SIGN ANUSVARA
-                 U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O
-                 U+094A: "ॊ" DEVANAGARI VOWEL SIGN SHORT O -->
-            <Key
-                latin:keyLabel="&#x094B;"
-                latin:moreKeys="&#x094B;&#x0902;,&#x0949;,&#x094A;"
-                latin:keyLabelFlags="fontNormal" />
-            <!-- U+0947: "े" DEVANAGARI VOWEL SIGN E
-                 U+0947/U+0902: "ें" DEVANAGARI VOWEL SIGN E/DEVANAGARI SIGN ANUSVARA -->
-            <Key
-                latin:keyLabel="&#x0947;"
-                latin:moreKeys="&#x0947;&#x0902;"
-                latin:keyLabelFlags="fontNormal" />
-            <!-- U+094D: "्" DEVANAGARI SIGN VIRAMA -->
-            <Key
-                latin:keyLabel="&#x094D;"
-                latin:keyLabelFlags="fontNormal" />
-            <!-- U+093F: "ि" DEVANAGARI VOWEL SIGN I
-                 U+093F/U+0902: "िं" DEVANAGARI VOWEL SIGN I/DEVANAGARI SIGN ANUSVARA -->
-            <Key
-                latin:keyLabel="&#x093F;"
-                latin:moreKeys="&#x093F;&#x0902;"
-                latin:keyLabelFlags="fontNormal" />
-            <!-- U+0941: "ु" DEVANAGARI VOWEL SIGN U
-                 U+0941/U+0902: "ुं" DEVANAGARI VOWEL SIGN U/DEVANAGARI SIGN ANUSVARA
-                 U+0941/U+0901: "ुँ" DEVANAGARI VOWEL SIGN U/DEVANAGARI SIGN CANDRABINDU -->
-            <Key
-                latin:keyLabel="&#x0941;"
-                latin:moreKeys="&#x0941;&#x0902;,&#x0941;&#x0901;"
-                latin:keyLabelFlags="fontNormal" />
+            <!-- Because the font rendering system prior to API version 16 can't automatically
+                 render dotted circle for incomplete combining letter of Hindi, different set of
+                 Key definitions are needed based on the API version. -->
+            <include
+                latin:keyboardLayout="@xml/keys_hindi2_left5" />
             <!-- U+092A: "प" DEVANAGARI LETTER PA -->
             <Key
                 latin:keyLabel="&#x092A;"
diff --git a/java/res/xml/rowkeys_hindi3.xml b/java/res/xml/rowkeys_hindi3.xml
index ebbff3e..3014907 100644
--- a/java/res/xml/rowkeys_hindi3.xml
+++ b/java/res/xml/rowkeys_hindi3.xml
@@ -29,12 +29,11 @@
             <Key
                 latin:keyLabel="&#x0911;"
                 latin:keyLabelFlags="fontNormal" />
-            <!-- U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU
-                 U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E-->
-            <Key
-                latin:keyLabel="&#x0901;"
-                latin:moreKeys="&#x0945;"
-                latin:keyLabelFlags="fontNormal" />
+            <!-- Because the font rendering system prior to API version 16 can't automatically
+                 render dotted circle for incomplete combining letter of Hindi, different set of
+                 Key definitions are needed based on the API version. -->
+            <include
+                latin:keyboardLayout="@xml/key_hindi3_shift_left" />
             <!-- U+0923: "ण" DEVANAGARI LETTER NNA -->
             <Key
                 latin:keyLabel="&#x0923;"
@@ -56,26 +55,22 @@
             <Key
                 latin:keyLabel="&#x0937;"
                 latin:keyLabelFlags="fontNormal" />
-            <!-- U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R
-                 U+0944: "ॄ" DEVANAGARI VOWEL SIGN VOCALIC RR -->
-            <Key
-                latin:keyLabel="&#x0943;"
-                latin:moreKeys="&#x0944;"
-                latin:keyLabelFlags="fontNormal" />
+            <!-- Because the font rendering system prior to API version 16 can't automatically
+                 render dotted circle for incomplete combining letter of Hindi, different set of
+                 Key definitions are needed based on the API version. -->
+            <include
+                latin:keyboardLayout="@xml/key_hindi3_shift_right" />
             <!-- U+091E: "ञ" DEVANAGARI LETTER NYA -->
             <Key
                 latin:keyLabel="&#x091E;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
-            <!-- U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O -->
-            <Key
-                latin:keyLabel="&#x0949;"
-                latin:keyLabelFlags="fontNormal" />
-            <!-- U+0902: "ं" DEVANAGARI SIGN ANUSVARA -->
-            <Key
-                latin:keyLabel="&#x0902;"
-                latin:keyLabelFlags="fontNormal" />
+            <!-- Because the font rendering system prior to API version 16 can't automatically
+                 render dotted circle for incomplete combining letter of Hindi, different set of
+                 Key definitions are needed based on the API version. -->
+            <include
+                latin:keyboardLayout="@xml/keys_hindi3_left2" />
             <!-- U+092E: "म" DEVANAGARI LETTER MA
                  U+0950: "ॐ" DEVANAGARI OM -->
             <Key
@@ -111,14 +106,11 @@
                 latin:keyLabel="&#x092F;"
                 latin:moreKeys="&#x095F;"
                 latin:keyLabelFlags="fontNormal" />
-            <!-- U+093C: "़" DEVANAGARI SIGN NUKTA
-                 U+097D: "ॽ" DEVANAGARI LETTER GLOTTAL STOP
-                 U+0970: "॰" DEVANAGARI ABBREVIATION SIGN
-                 U+093D: "ऽ" DEVANAGARI SIGN AVAGRAHA -->
-            <Key
-                latin:keyLabel="&#x093C;"
-                latin:moreKeys="&#x097D;,&#x0970;,&#x093D;"
-                latin:keyLabelFlags="fontNormal" />
+            <!-- Because the font rendering system prior to API version 16 can't automatically
+                 render dotted circle for incomplete combining letter of Hindi, different set of
+                 Key definitions are needed based on the API version. -->
+            <include
+                latin:keyboardLayout="@xml/key_hindi3_right" />
          </default>
     </switch>
 </merge>
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
index bf1cea9..ee52de1 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
@@ -80,16 +80,24 @@
     }
 
     /**
+     * Returns {@code true} if accessibility is enabled. Currently, this means
+     * that the kill switch is off and system accessibility is turned on.
+     *
+     * @return {@code true} if accessibility is enabled.
+     */
+    public boolean isAccessibilityEnabled() {
+        return ENABLE_ACCESSIBILITY && mAccessibilityManager.isEnabled();
+    }
+
+    /**
      * Returns {@code true} if touch exploration is enabled. Currently, this
      * means that the kill switch is off, the device supports touch exploration,
-     * and a spoken feedback service is turned on.
+     * and system accessibility is turned on.
      *
      * @return {@code true} if touch exploration is enabled.
      */
     public boolean isTouchExplorationEnabled() {
-        return ENABLE_ACCESSIBILITY
-                && mAccessibilityManager.isEnabled()
-                && mAccessibilityManager.isTouchExplorationEnabled();
+        return isAccessibilityEnabled() && mAccessibilityManager.isTouchExplorationEnabled();
     }
 
     /**
@@ -113,6 +121,7 @@
      *
      * @return {@code true} if the device should obscure password characters.
      */
+    @SuppressWarnings("deprecation")
     public boolean shouldObscureInput(final EditorInfo editorInfo) {
         if (editorInfo == null) return false;
 
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
index d05fd9e..e6b4412 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
@@ -22,8 +22,11 @@
 import android.support.v4.view.ViewCompat;
 import android.support.v4.view.accessibility.AccessibilityEventCompat;
 import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.util.SparseIntArray;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
 
 import com.android.inputmethod.keyboard.Key;
 import com.android.inputmethod.keyboard.Keyboard;
@@ -35,6 +38,21 @@
 public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat {
     private static final AccessibleKeyboardViewProxy sInstance = new AccessibleKeyboardViewProxy();
 
+    /** Map of keyboard modes to resource IDs. */
+    private static final SparseIntArray KEYBOARD_MODE_RES_IDS = new SparseIntArray();
+
+    static {
+        KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_DATE, R.string.keyboard_mode_date);
+        KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_DATETIME, R.string.keyboard_mode_date_time);
+        KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_EMAIL, R.string.keyboard_mode_email);
+        KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_IM, R.string.keyboard_mode_im);
+        KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_NUMBER, R.string.keyboard_mode_number);
+        KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_PHONE, R.string.keyboard_mode_phone);
+        KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_TEXT, R.string.keyboard_mode_text);
+        KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_TIME, R.string.keyboard_mode_time);
+        KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_URL, R.string.keyboard_mode_url);
+    }
+
     private InputMethodService mInputMethod;
     private MainKeyboardView mView;
     private AccessibilityEntityProvider mAccessibilityNodeProvider;
@@ -85,11 +103,75 @@
         mAccessibilityNodeProvider.setView(view);
     }
 
+    /**
+     * Called when the keyboard layout changes.
+     * <p>
+     * <b>Note:</b> This method will be called even if accessibility is not
+     * enabled.
+     */
     public void setKeyboard() {
-        if (mAccessibilityNodeProvider == null) {
+        if (mAccessibilityNodeProvider != null) {
+            mAccessibilityNodeProvider.setKeyboard();
+        }
+
+        // Since this method is called even when accessibility is off, make sure
+        // to check the state before announcing anything.
+        if (AccessibilityUtils.getInstance().isAccessibilityEnabled()) {
+            announceKeyboardMode();
+        }
+    }
+
+    /**
+     * Called when the keyboard is hidden and accessibility is enabled.
+     */
+    public void onHideWindow() {
+        announceKeyboardHidden();
+    }
+
+    /**
+     * Announces which type of keyboard is being displayed. If the keyboard type
+     * is unknown, no announcement is made.
+     */
+    private void announceKeyboardMode() {
+        final Keyboard keyboard = mView.getKeyboard();
+        final int resId = KEYBOARD_MODE_RES_IDS.get(keyboard.mId.mMode);
+        if (resId == 0) {
             return;
         }
-        mAccessibilityNodeProvider.setKeyboard();
+
+        final Context context = mView.getContext();
+        final String keyboardMode = context.getString(resId);
+        final String text = context.getString(R.string.announce_keyboard_mode, keyboardMode);
+
+        sendWindowStateChanged(text);
+    }
+
+    /**
+     * Announces that the keyboard has been hidden.
+     */
+    private void announceKeyboardHidden() {
+        final Context context = mView.getContext();
+        final String text = context.getString(R.string.announce_keyboard_hidden);
+
+        sendWindowStateChanged(text);
+    }
+
+    /**
+     * Sends a window state change event with the specified text.
+     *
+     * @param text
+     */
+    private void sendWindowStateChanged(final String text) {
+        final AccessibilityEvent stateChange = AccessibilityEvent.obtain(
+                AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+        mView.onInitializeAccessibilityEvent(stateChange);
+        stateChange.getText().add(text);
+        stateChange.setContentDescription(null);
+
+        final ViewParent parent = mView.getParent();
+        if (parent != null) {
+            parent.requestSendAccessibilityEvent(mView, stateChange);
+        }
     }
 
     /**
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 1e5af51..d160038 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -519,11 +519,11 @@
         // TODO: Handle "bold" here too?
         if ((mLabelFlags & LABEL_FLAGS_FONT_NORMAL) != 0) {
             return Typeface.DEFAULT;
-        } else if ((mLabelFlags & LABEL_FLAGS_FONT_MONO_SPACE) != 0) {
-            return Typeface.MONOSPACE;
-        } else {
-            return params.mTypeface;
         }
+        if ((mLabelFlags & LABEL_FLAGS_FONT_MONO_SPACE) != 0) {
+            return Typeface.MONOSPACE;
+        }
+        return params.mTypeface;
     }
 
     public final int selectTextSize(final KeyDrawParams params) {
@@ -550,28 +550,51 @@
     public final int selectHintTextSize(final KeyDrawParams params) {
         if (hasHintLabel()) {
             return params.mHintLabelSize;
-        } else if (hasShiftedLetterHint()) {
-            return params.mShiftedLetterHintSize;
-        } else {
-            return params.mHintLetterSize;
         }
+        if (hasShiftedLetterHint()) {
+            return params.mShiftedLetterHintSize;
+        }
+        return params.mHintLetterSize;
     }
 
     public final int selectHintTextColor(final KeyDrawParams params) {
         if (hasHintLabel()) {
             return params.mHintLabelColor;
-        } else if (hasShiftedLetterHint()) {
+        }
+        if (hasShiftedLetterHint()) {
             return isShiftedLetterActivated() ? params.mShiftedLetterHintActivatedColor
                     : params.mShiftedLetterHintInactivatedColor;
-        } else {
-            return params.mHintLetterColor;
         }
+        return params.mHintLetterColor;
     }
 
     public final int selectMoreKeyTextSize(final KeyDrawParams params) {
         return hasLabelsInMoreKeys() ? params.mLabelSize : params.mLetterSize;
     }
 
+    public final String getPreviewLabel() {
+        return isShiftedLetterActivated() ? mHintLabel : mLabel;
+    }
+
+    private boolean previewHasLetterSize() {
+        return (mLabelFlags & LABEL_FLAGS_FOLLOW_KEY_LETTER_RATIO) != 0
+                || StringUtils.codePointCount(getPreviewLabel()) == 1;
+    }
+
+    public final int selectPreviewTextSize(final KeyDrawParams params) {
+        if (previewHasLetterSize()) {
+            return params.mPreviewTextSize;
+        }
+        return params.mLetterSize;
+    }
+
+    public Typeface selectPreviewTypeface(final KeyDrawParams params) {
+        if (previewHasLetterSize()) {
+            return selectTypeface(params);
+        }
+        return Typeface.DEFAULT_BOLD;
+    }
+
     public final boolean isAlignLeft() {
         return (mLabelFlags & LABEL_FLAGS_ALIGN_LEFT) != 0;
     }
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index bc27f85..d37b69b 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -811,18 +811,14 @@
             background.setState(KEY_PREVIEW_BACKGROUND_DEFAULT_STATE);
             background.setAlpha(PREVIEW_ALPHA);
         }
-        final String label = key.isShiftedLetterActivated() ? key.mHintLabel : key.mLabel;
+        final String label = key.getPreviewLabel();
         // What we show as preview should match what we show on a key top in onDraw().
         if (label != null) {
             // TODO Should take care of temporaryShiftLabel here.
             previewText.setCompoundDrawables(null, null, null, null);
-            if (StringUtils.codePointCount(label) > 1) {
-                previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, drawParams.mLetterSize);
-                previewText.setTypeface(Typeface.DEFAULT_BOLD);
-            } else {
-                previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, drawParams.mPreviewTextSize);
-                previewText.setTypeface(key.selectTypeface(drawParams));
-            }
+            previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+                    key.selectPreviewTextSize(drawParams));
+            previewText.setTypeface(key.selectPreviewTypeface(drawParams));
             previewText.setText(label);
         } else {
             previewText.setCompoundDrawables(null, null, null,
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
index 493093e..d0b382e 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
@@ -145,94 +145,110 @@
         /* 40 */ "more_keys_for_cyrillic_ie",
         /* 41 */ "more_keys_for_cyrillic_i",
         /* 42 */ "label_to_alpha_key",
-        /* 43 */ "more_keys_for_single_quote",
-        /* 44 */ "more_keys_for_double_quote",
-        /* 45 */ "more_keys_for_tablet_double_quote",
-        /* 46 */ "more_keys_for_currency_dollar",
-        /* 47 */ "keylabel_for_currency_generic",
-        /* 48 */ "more_keys_for_currency_generic",
-        /* 49 */ "more_keys_for_punctuation",
-        /* 50 */ "more_keys_for_star",
-        /* 51 */ "more_keys_for_bullet",
-        /* 52 */ "more_keys_for_plus",
-        /* 53 */ "more_keys_for_left_parenthesis",
-        /* 54 */ "more_keys_for_right_parenthesis",
-        /* 55 */ "more_keys_for_less_than",
-        /* 56 */ "more_keys_for_greater_than",
-        /* 57 */ "more_keys_for_arabic_diacritics",
-        /* 58 */ "keyhintlabel_for_arabic_diacritics",
-        /* 59 */ "keylabel_for_symbols_1",
-        /* 60 */ "keylabel_for_symbols_2",
-        /* 61 */ "keylabel_for_symbols_3",
-        /* 62 */ "keylabel_for_symbols_4",
-        /* 63 */ "keylabel_for_symbols_5",
-        /* 64 */ "keylabel_for_symbols_6",
-        /* 65 */ "keylabel_for_symbols_7",
-        /* 66 */ "keylabel_for_symbols_8",
-        /* 67 */ "keylabel_for_symbols_9",
-        /* 68 */ "keylabel_for_symbols_0",
-        /* 69 */ "label_to_symbol_key",
-        /* 70 */ "label_to_symbol_with_microphone_key",
-        /* 71 */ "additional_more_keys_for_symbols_1",
-        /* 72 */ "additional_more_keys_for_symbols_2",
-        /* 73 */ "additional_more_keys_for_symbols_3",
-        /* 74 */ "additional_more_keys_for_symbols_4",
-        /* 75 */ "additional_more_keys_for_symbols_5",
-        /* 76 */ "additional_more_keys_for_symbols_6",
-        /* 77 */ "additional_more_keys_for_symbols_7",
-        /* 78 */ "additional_more_keys_for_symbols_8",
-        /* 79 */ "additional_more_keys_for_symbols_9",
-        /* 80 */ "additional_more_keys_for_symbols_0",
-        /* 81 */ "more_keys_for_symbols_1",
-        /* 82 */ "more_keys_for_symbols_2",
-        /* 83 */ "more_keys_for_symbols_3",
-        /* 84 */ "more_keys_for_symbols_4",
-        /* 85 */ "more_keys_for_symbols_5",
-        /* 86 */ "more_keys_for_symbols_6",
-        /* 87 */ "more_keys_for_symbols_7",
-        /* 88 */ "more_keys_for_symbols_8",
-        /* 89 */ "more_keys_for_symbols_9",
-        /* 90 */ "more_keys_for_symbols_0",
-        /* 91 */ "keylabel_for_comma",
-        /* 92 */ "more_keys_for_comma",
-        /* 93 */ "keylabel_for_symbols_question",
-        /* 94 */ "keylabel_for_symbols_semicolon",
-        /* 95 */ "keylabel_for_symbols_percent",
-        /* 96 */ "more_keys_for_symbols_exclamation",
-        /* 97 */ "more_keys_for_symbols_question",
-        /* 98 */ "more_keys_for_symbols_semicolon",
-        /* 99 */ "more_keys_for_symbols_percent",
-        /* 100 */ "keylabel_for_tablet_comma",
-        /* 101 */ "keyhintlabel_for_tablet_comma",
-        /* 102 */ "more_keys_for_tablet_comma",
-        /* 103 */ "keyhintlabel_for_tablet_period",
-        /* 104 */ "more_keys_for_tablet_period",
-        /* 105 */ "keylabel_for_apostrophe",
-        /* 106 */ "keyhintlabel_for_apostrophe",
-        /* 107 */ "more_keys_for_apostrophe",
-        /* 108 */ "more_keys_for_q",
-        /* 109 */ "more_keys_for_x",
-        /* 110 */ "keylabel_for_q",
-        /* 111 */ "keylabel_for_w",
-        /* 112 */ "keylabel_for_y",
-        /* 113 */ "keylabel_for_x",
-        /* 114 */ "keylabel_for_spanish_row2_10",
-        /* 115 */ "more_keys_for_am_pm",
-        /* 116 */ "settings_as_more_key",
-        /* 117 */ "shortcut_as_more_key",
-        /* 118 */ "action_next_as_more_key",
-        /* 119 */ "action_previous_as_more_key",
-        /* 120 */ "label_to_more_symbol_key",
-        /* 121 */ "label_to_more_symbol_for_tablet_key",
-        /* 122 */ "label_tab_key",
-        /* 123 */ "label_to_phone_numeric_key",
-        /* 124 */ "label_to_phone_symbols_key",
-        /* 125 */ "label_time_am",
-        /* 126 */ "label_time_pm",
-        /* 127 */ "label_to_symbol_key_pcqwerty",
-        /* 128 */ "keylabel_for_popular_domain",
-        /* 129 */ "more_keys_for_popular_domain",
-        /* 130 */ "more_keys_for_smiley",
+        /* 43 */ "single_quotes",
+        /* 44 */ "double_quotes",
+        /* 45 */ "single_angle_quotes",
+        /* 46 */ "double_angle_quotes",
+        /* 47 */ "more_keys_for_currency_dollar",
+        /* 48 */ "keylabel_for_currency_generic",
+        /* 49 */ "more_keys_for_currency_generic",
+        /* 50 */ "more_keys_for_punctuation",
+        /* 51 */ "more_keys_for_star",
+        /* 52 */ "more_keys_for_bullet",
+        /* 53 */ "more_keys_for_plus",
+        /* 54 */ "more_keys_for_left_parenthesis",
+        /* 55 */ "more_keys_for_right_parenthesis",
+        /* 56 */ "more_keys_for_less_than",
+        /* 57 */ "more_keys_for_greater_than",
+        /* 58 */ "more_keys_for_arabic_diacritics",
+        /* 59 */ "keyhintlabel_for_arabic_diacritics",
+        /* 60 */ "keylabel_for_symbols_1",
+        /* 61 */ "keylabel_for_symbols_2",
+        /* 62 */ "keylabel_for_symbols_3",
+        /* 63 */ "keylabel_for_symbols_4",
+        /* 64 */ "keylabel_for_symbols_5",
+        /* 65 */ "keylabel_for_symbols_6",
+        /* 66 */ "keylabel_for_symbols_7",
+        /* 67 */ "keylabel_for_symbols_8",
+        /* 68 */ "keylabel_for_symbols_9",
+        /* 69 */ "keylabel_for_symbols_0",
+        /* 70 */ "label_to_symbol_key",
+        /* 71 */ "label_to_symbol_with_microphone_key",
+        /* 72 */ "additional_more_keys_for_symbols_1",
+        /* 73 */ "additional_more_keys_for_symbols_2",
+        /* 74 */ "additional_more_keys_for_symbols_3",
+        /* 75 */ "additional_more_keys_for_symbols_4",
+        /* 76 */ "additional_more_keys_for_symbols_5",
+        /* 77 */ "additional_more_keys_for_symbols_6",
+        /* 78 */ "additional_more_keys_for_symbols_7",
+        /* 79 */ "additional_more_keys_for_symbols_8",
+        /* 80 */ "additional_more_keys_for_symbols_9",
+        /* 81 */ "additional_more_keys_for_symbols_0",
+        /* 82 */ "more_keys_for_symbols_1",
+        /* 83 */ "more_keys_for_symbols_2",
+        /* 84 */ "more_keys_for_symbols_3",
+        /* 85 */ "more_keys_for_symbols_4",
+        /* 86 */ "more_keys_for_symbols_5",
+        /* 87 */ "more_keys_for_symbols_6",
+        /* 88 */ "more_keys_for_symbols_7",
+        /* 89 */ "more_keys_for_symbols_8",
+        /* 90 */ "more_keys_for_symbols_9",
+        /* 91 */ "more_keys_for_symbols_0",
+        /* 92 */ "keylabel_for_comma",
+        /* 93 */ "more_keys_for_comma",
+        /* 94 */ "keylabel_for_symbols_question",
+        /* 95 */ "keylabel_for_symbols_semicolon",
+        /* 96 */ "keylabel_for_symbols_percent",
+        /* 97 */ "more_keys_for_symbols_exclamation",
+        /* 98 */ "more_keys_for_symbols_question",
+        /* 99 */ "more_keys_for_symbols_semicolon",
+        /* 100 */ "more_keys_for_symbols_percent",
+        /* 101 */ "keylabel_for_tablet_comma",
+        /* 102 */ "keyhintlabel_for_tablet_comma",
+        /* 103 */ "more_keys_for_tablet_comma",
+        /* 104 */ "keyhintlabel_for_tablet_period",
+        /* 105 */ "more_keys_for_tablet_period",
+        /* 106 */ "keylabel_for_apostrophe",
+        /* 107 */ "keyhintlabel_for_apostrophe",
+        /* 108 */ "more_keys_for_apostrophe",
+        /* 109 */ "more_keys_for_q",
+        /* 110 */ "more_keys_for_x",
+        /* 111 */ "keylabel_for_q",
+        /* 112 */ "keylabel_for_w",
+        /* 113 */ "keylabel_for_y",
+        /* 114 */ "keylabel_for_x",
+        /* 115 */ "keylabel_for_spanish_row2_10",
+        /* 116 */ "more_keys_for_am_pm",
+        /* 117 */ "settings_as_more_key",
+        /* 118 */ "shortcut_as_more_key",
+        /* 119 */ "action_next_as_more_key",
+        /* 120 */ "action_previous_as_more_key",
+        /* 121 */ "label_to_more_symbol_key",
+        /* 122 */ "label_to_more_symbol_for_tablet_key",
+        /* 123 */ "label_tab_key",
+        /* 124 */ "label_to_phone_numeric_key",
+        /* 125 */ "label_to_phone_symbols_key",
+        /* 126 */ "label_time_am",
+        /* 127 */ "label_time_pm",
+        /* 128 */ "label_to_symbol_key_pcqwerty",
+        /* 129 */ "keylabel_for_popular_domain",
+        /* 130 */ "more_keys_for_popular_domain",
+        /* 131 */ "more_keys_for_smiley",
+        /* 132 */ "single_laqm_raqm",
+        /* 133 */ "single_laqm_raqm_rtl",
+        /* 134 */ "single_raqm_laqm",
+        /* 135 */ "double_laqm_raqm",
+        /* 136 */ "double_laqm_raqm_rtl",
+        /* 137 */ "double_raqm_laqm",
+        /* 138 */ "single_lqm_rqm",
+        /* 139 */ "single_9qm_lqm",
+        /* 140 */ "single_9qm_rqm",
+        /* 141 */ "double_lqm_rqm",
+        /* 142 */ "double_9qm_lqm",
+        /* 143 */ "double_9qm_rqm",
+        /* 144 */ "more_keys_for_single_quote",
+        /* 145 */ "more_keys_for_double_quote",
+        /* 146 */ "more_keys_for_tablet_double_quote",
     };
 
     private static final String EMPTY = "";
@@ -247,155 +263,182 @@
         /* ~41 */
         // Label for "switch to alphabetic" key.
         /* 42 */ "ABC",
-        /* 43 */ "!fixedColumnOrder!4,\u2018,\u2019,\u201A,\u201B",
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
-        // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;</string>
-        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB,\u00BB",
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
-        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 45 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
+        /* 43 */ "!text/single_lqm_rqm",
+        /* 44 */ "!text/double_lqm_rqm",
+        /* 45 */ "!text/single_laqm_raqm",
+        /* 46 */ "!text/double_laqm_raqm",
         // U+00A2: "¢" CENT SIGN
         // U+00A3: "£" POUND SIGN
         // U+20AC: "€" EURO SIGN
         // U+00A5: "¥" YEN SIGN
         // U+20B1: "₱" PESO SIGN
-        /* 46 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
-        /* 47 */ "$",
-        /* 48 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
-        /* 49 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\\,,?,@,&,\\%,+,;,/,(,)",
+        /* 47 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
+        /* 48 */ "$",
+        /* 49 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
+        /* 50 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\\,,?,@,&,\\%,+,;,/,(,)",
         // U+2020: "†" DAGGER
         // U+2021: "‡" DOUBLE DAGGER
         // U+2605: "★" BLACK STAR
-        /* 50 */ "\u2020,\u2021,\u2605",
+        /* 51 */ "\u2020,\u2021,\u2605",
         // U+266A: "♪" EIGHTH NOTE
         // U+2665: "♥" BLACK HEART SUIT
         // U+2660: "♠" BLACK SPADE SUIT
         // U+2666: "♦" BLACK DIAMOND SUIT
         // U+2663: "♣" BLACK CLUB SUIT
-        /* 51 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
+        /* 52 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
         // U+00B1: "±" PLUS-MINUS SIGN
-        /* 52 */ "\u00B1",
+        /* 53 */ "\u00B1",
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 53 */ "!fixedColumnOrder!3,<,{,[",
-        /* 54 */ "!fixedColumnOrder!3,>,},]",
+        /* 54 */ "!fixedColumnOrder!3,<,{,[",
+        /* 55 */ "!fixedColumnOrder!3,>,},]",
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // The following characters don't need BIDI mirroring.
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        /* 55 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
-        /* 56 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
-        /* 57 */ EMPTY,
+        /* 56 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
+        /* 57 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
         /* 58 */ EMPTY,
-        /* 59 */ "1",
-        /* 60 */ "2",
-        /* 61 */ "3",
-        /* 62 */ "4",
-        /* 63 */ "5",
-        /* 64 */ "6",
-        /* 65 */ "7",
-        /* 66 */ "8",
-        /* 67 */ "9",
-        /* 68 */ "0",
+        /* 59 */ EMPTY,
+        /* 60 */ "1",
+        /* 61 */ "2",
+        /* 62 */ "3",
+        /* 63 */ "4",
+        /* 64 */ "5",
+        /* 65 */ "6",
+        /* 66 */ "7",
+        /* 67 */ "8",
+        /* 68 */ "9",
+        /* 69 */ "0",
         // Label for "switch to symbols" key.
-        /* 69 */ "?123",
+        /* 70 */ "?123",
         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
         // part because it'll be appended by the code.
-        /* 70 */ "123",
-        /* 71~ */
+        /* 71 */ "123",
+        /* 72~ */
         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~80 */
+        /* ~81 */
         // U+00B9: "¹" SUPERSCRIPT ONE
         // U+00BD: "½" VULGAR FRACTION ONE HALF
         // U+2153: "⅓" VULGAR FRACTION ONE THIRD
         // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
         // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH
-        /* 81 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
+        /* 82 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
         // U+00B2: "²" SUPERSCRIPT TWO
         // U+2154: "⅔" VULGAR FRACTION TWO THIRDS
-        /* 82 */ "\u00B2,\u2154",
+        /* 83 */ "\u00B2,\u2154",
         // U+00B3: "³" SUPERSCRIPT THREE
         // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
         // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
-        /* 83 */ "\u00B3,\u00BE,\u215C",
+        /* 84 */ "\u00B3,\u00BE,\u215C",
         // U+2074: "⁴" SUPERSCRIPT FOUR
-        /* 84 */ "\u2074",
+        /* 85 */ "\u2074",
         // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
-        /* 85 */ "\u215D",
-        /* 86 */ EMPTY,
+        /* 86 */ "\u215D",
+        /* 87 */ EMPTY,
         // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
-        /* 87 */ "\u215E",
-        /* 88 */ EMPTY,
+        /* 88 */ "\u215E",
         /* 89 */ EMPTY,
+        /* 90 */ EMPTY,
         // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
         // U+2205: "∅" EMPTY SET
-        /* 90 */ "\u207F,\u2205",
-        /* 91 */ ",",
-        /* 92 */ EMPTY,
-        /* 93 */ "?",
-        /* 94 */ ";",
-        /* 95 */ "%",
+        /* 91 */ "\u207F,\u2205",
+        /* 92 */ ",",
+        /* 93 */ EMPTY,
+        /* 94 */ "?",
+        /* 95 */ ";",
+        /* 96 */ "%",
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 96 */ "\u00A1",
+        /* 97 */ "\u00A1",
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 97 */ "\u00BF",
-        /* 98 */ EMPTY,
+        /* 98 */ "\u00BF",
+        /* 99 */ EMPTY,
         // U+2030: "‰" PER MILLE SIGN
-        /* 99 */ "\u2030",
-        /* 100 */ ",",
-        /* 101 */ "!",
+        /* 100 */ "\u2030",
+        /* 101 */ ",",
         /* 102 */ "!",
-        /* 103 */ "?",
+        /* 103 */ "!",
         /* 104 */ "?",
-        /* 105 */ "\'",
-        /* 106 */ "\"",
+        /* 105 */ "?",
+        /* 106 */ "\'",
         /* 107 */ "\"",
-        /* 108 */ EMPTY,
+        /* 108 */ "\"",
         /* 109 */ EMPTY,
-        /* 110 */ "q",
-        /* 111 */ "w",
-        /* 112 */ "y",
-        /* 113 */ "x",
+        /* 110 */ EMPTY,
+        /* 111 */ "q",
+        /* 112 */ "w",
+        /* 113 */ "y",
+        /* 114 */ "x",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 114 */ "\u00F1",
-        /* 115 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
-        /* 116 */ "!icon/settings_key|!code/key_settings",
-        /* 117 */ "!icon/shortcut_key|!code/key_shortcut",
-        /* 118 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
-        /* 119 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
+        /* 115 */ "\u00F1",
+        /* 116 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
+        /* 117 */ "!icon/settings_key|!code/key_settings",
+        /* 118 */ "!icon/shortcut_key|!code/key_shortcut",
+        /* 119 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
+        /* 120 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
         // Label for "switch to more symbol" modifier key.  Must be short to fit on key!
-        /* 120 */ "= \\ <",
+        /* 121 */ "= \\ <",
         // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
-        /* 121 */ "~ \\ {",
+        /* 122 */ "~ \\ {",
         // Label for "Tab" key.  Must be short to fit on key!
-        /* 122 */ "Tab",
+        /* 123 */ "Tab",
         // Label for "switch to phone numeric" key.  Must be short to fit on key!
-        /* 123 */ "123",
+        /* 124 */ "123",
         // Label for "switch to phone symbols" key.  Must be short to fit on key!
         // U+FF0A: "*" FULLWIDTH ASTERISK
         // U+FF03: "#" FULLWIDTH NUMBER SIGN
-        /* 124 */ "\uFF0A\uFF03",
+        /* 125 */ "\uFF0A\uFF03",
         // Key label for "ante meridiem"
-        /* 125 */ "AM",
+        /* 126 */ "AM",
         // Key label for "post meridiem"
-        /* 126 */ "PM",
+        /* 127 */ "PM",
         // Label for "switch to symbols" key on PC QWERTY layout
-        /* 127 */ "Sym",
-        /* 128 */ ".com",
+        /* 128 */ "Sym",
+        /* 129 */ ".com",
         // popular web domains for the locale - most popular, displayed on the keyboard
-        /* 129 */ "!hasLabels!,.net,.org,.gov,.edu",
-        /* 130 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
+        /* 130 */ "!hasLabels!,.net,.org,.gov,.edu",
+        /* 131 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // The following characters don't need BIDI mirroring.
+        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
+        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
+        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
+        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+        // Abbreviations are:
+        // laqm: LEFT-POINTING ANGLE QUOTATION MARK
+        // raqm: RIGHT-POINTING ANGLE QUOTATION MARK
+        // rtl: Right-To-Left script order
+        // lqm: LEFT QUOTATION MARK
+        // rqm: RIGHT QUOTATION MARK
+        // 9qm: LOW-9 QUOTATION MARK
+        // The following each quotation mark pair consist of
+        // <opening quotation mark>, <closing quotation mark>
+        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
+        /* 132 */ "\u2039,\u203A",
+        /* 133 */ "\u2039|\u203A,\u203A|\u2039",
+        /* 134 */ "\u203A,\u2039",
+        /* 135 */ "\u00AB,\u00BB",
+        /* 136 */ "\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 137 */ "\u00BB,\u00AB",
+        // The following each quotation mark triplet consists of
+        // <another quotation mark>, <opening quotation mark>, <closing quotation mark>
+        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
+        /* 138 */ "\u201A,\u2018,\u2019",
+        /* 139 */ "\u2019,\u201A,\u2018",
+        /* 140 */ "\u2018,\u201A,\u2019",
+        /* 141 */ "\u201E,\u201C,\u201D",
+        /* 142 */ "\u201D,\u201E,\u201C",
+        /* 143 */ "\u201C,\u201E,\u201D",
+        /* 144 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
+        /* 145 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
+        /* 146 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
     };
 
     /* Language af: Afrikaans */
@@ -465,54 +508,36 @@
         // U+062C: "پ" ARABIC LETTER PEH
         /* 42 */ "\u0623\u200C\u0628\u200C\u062C",
         /* 43 */ null,
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
-        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB",
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 45 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
-        // U+00A2: "¢" CENT SIGN
-        // U+00A3: "£" POUND SIGN
-        // U+20AC: "€" EURO SIGN
-        // U+00A5: "¥" YEN SIGN
-        // U+20B1: "₱" PESO SIGN
-        // U+FDFC: "﷼" RIAL SIGN
-        /* 46 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1,\uFDFC",
-        /* 47 */ null,
-        /* 48 */ null,
+        /* 44 */ null,
+        /* 45 */ "!text/single_laqm_raqm_rtl",
+        /* 46 */ "!text/double_laqm_raqm_rtl",
+        /* 47~ */
+        null, null, null,
+        /* ~49 */
         // U+061F: "؟" ARABIC QUESTION MARK
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
-        /* 49 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
+        /* 50 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
         // U+2605: "★" BLACK STAR
         // U+066D: "٭" ARABIC FIVE POINTED STAR
-        /* 50 */ "\u2605,\u066D",
+        /* 51 */ "\u2605,\u066D",
         // U+266A: "♪" EIGHTH NOTE
-        /* 51 */ "\u266A",
-        /* 52 */ null,
+        /* 52 */ "\u266A",
+        /* 53 */ null,
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
         // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
         // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
-        /* 53 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 54 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        /* 54 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
+        /* 55 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        // The following characters don't need BIDI mirroring.
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        /* 55 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 56 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+        /* 56 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
+        /* 57 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
         // U+0655: "ٕ" ARABIC HAMZA BELOW
         // U+0654: "ٔ" ARABIC HAMZA ABOVE
         // U+0652: "ْ" ARABIC SUKUN
@@ -529,70 +554,70 @@
         // U+0640: "ـ" ARABIC TATWEEL
         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
         // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
-        /* 57 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        /* 58 */ "\u0651",
+        /* 58 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
+        /* 59 */ "\u0651",
         // U+0661: "١" ARABIC-INDIC DIGIT ONE
-        /* 59 */ "\u0661",
+        /* 60 */ "\u0661",
         // U+0662: "٢" ARABIC-INDIC DIGIT TWO
-        /* 60 */ "\u0662",
+        /* 61 */ "\u0662",
         // U+0663: "٣" ARABIC-INDIC DIGIT THREE
-        /* 61 */ "\u0663",
+        /* 62 */ "\u0663",
         // U+0664: "٤" ARABIC-INDIC DIGIT FOUR
-        /* 62 */ "\u0664",
+        /* 63 */ "\u0664",
         // U+0665: "٥" ARABIC-INDIC DIGIT FIVE
-        /* 63 */ "\u0665",
+        /* 64 */ "\u0665",
         // U+0666: "٦" ARABIC-INDIC DIGIT SIX
-        /* 64 */ "\u0666",
+        /* 65 */ "\u0666",
         // U+0667: "٧" ARABIC-INDIC DIGIT SEVEN
-        /* 65 */ "\u0667",
+        /* 66 */ "\u0667",
         // U+0668: "٨" ARABIC-INDIC DIGIT EIGHT
-        /* 66 */ "\u0668",
+        /* 67 */ "\u0668",
         // U+0669: "٩" ARABIC-INDIC DIGIT NINE
-        /* 67 */ "\u0669",
+        /* 68 */ "\u0669",
         // U+0660: "٠" ARABIC-INDIC DIGIT ZERO
-        /* 68 */ "\u0660",
+        /* 69 */ "\u0660",
         // Label for "switch to symbols" key.
         // U+061F: "؟" ARABIC QUESTION MARK
-        /* 69 */ "\u0663\u0662\u0661\u061F",
+        /* 70 */ "\u0663\u0662\u0661\u061F",
         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
         // part because it'll be appended by the code.
-        /* 70 */ "\u0663\u0662\u0661",
-        /* 71 */ "1",
-        /* 72 */ "2",
-        /* 73 */ "3",
-        /* 74 */ "4",
-        /* 75 */ "5",
-        /* 76 */ "6",
-        /* 77 */ "7",
-        /* 78 */ "8",
-        /* 79 */ "9",
+        /* 71 */ "\u0663\u0662\u0661",
+        /* 72 */ "1",
+        /* 73 */ "2",
+        /* 74 */ "3",
+        /* 75 */ "4",
+        /* 76 */ "5",
+        /* 77 */ "6",
+        /* 78 */ "7",
+        /* 79 */ "8",
+        /* 80 */ "9",
         // U+066B: "٫" ARABIC DECIMAL SEPARATOR
         // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
-        /* 80 */ "0,\u066B,\u066C",
-        /* 81~ */
+        /* 81 */ "0,\u066B,\u066C",
+        /* 82~ */
         null, null, null, null, null, null, null, null, null, null,
-        /* ~90 */
+        /* ~91 */
         // U+060C: "،" ARABIC COMMA
-        /* 91 */ "\u060C",
-        /* 92 */ "\\,",
-        /* 93 */ "\u061F",
-        /* 94 */ "\u061B",
+        /* 92 */ "\u060C",
+        /* 93 */ "\\,",
+        /* 94 */ "\u061F",
+        /* 95 */ "\u061B",
         // U+066A: "٪" ARABIC PERCENT SIGN
-        /* 95 */ "\u066A",
-        /* 96 */ null,
-        /* 97 */ "?",
-        /* 98 */ ";",
+        /* 96 */ "\u066A",
+        /* 97 */ null,
+        /* 98 */ "?",
+        /* 99 */ ";",
         // U+2030: "‰" PER MILLE SIGN
-        /* 99 */ "\\%,\u2030",
-        /* 100~ */
+        /* 100 */ "\\%,\u2030",
+        /* 101~ */
         null, null, null, null, null,
-        /* ~104 */
+        /* ~105 */
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
         // U+061F: "؟" ARABIC QUESTION MARK
-        /* 105 */ "\u060C",
-        /* 106 */ "\u061F",
-        /* 107 */ "\u061F,\u061B,!,:,-,/,\',\"",
+        /* 106 */ "\u060C",
+        /* 107 */ "\u061F",
+        /* 108 */ "\u061F,\u061B,!,:,-,/,\',\"",
     };
 
     /* Language be: Belarusian */
@@ -627,6 +652,8 @@
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* 42 */ "\u0410\u0411\u0412",
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
     };
 
     /* Language bg: Bulgarian */
@@ -641,6 +668,9 @@
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* 42 */ "\u0410\u0411\u0412",
+        /* 43 */ null,
+        // single_quotes of Bulgarian is default single_quotes_right_left.
+        /* 44 */ "!text/double_9qm_lqm",
     };
 
     /* Language ca: Catalan */
@@ -771,6 +801,14 @@
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         /* 12 */ "\u017E,\u017A,\u017C",
+        /* 13~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
+        /* 45 */ "!text/single_raqm_laqm",
+        /* 46 */ "!text/double_raqm_laqm",
     };
 
     /* Language da: Danish */
@@ -832,6 +870,14 @@
         /* 23 */ "\u00E4",
         // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         /* 24 */ "\u00F6",
+        /* 25~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
+        /* 45 */ "!text/single_raqm_laqm",
+        /* 46 */ "!text/double_raqm_laqm",
     };
 
     /* Language de: German */
@@ -874,6 +920,15 @@
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* 6 */ "\u00F1,\u0144",
+        /* 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,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
+        /* 45 */ "!text/single_raqm_laqm",
+        /* 46 */ "!text/double_raqm_laqm",
     };
 
     /* Language el: Greek */
@@ -1058,20 +1113,20 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~107 */
-        /* 108 */ "q",
-        /* 109 */ "x",
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~108 */
+        /* 109 */ "q",
+        /* 110 */ "x",
         // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
-        /* 110 */ "\u015D",
+        /* 111 */ "\u015D",
         // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
-        /* 111 */ "\u011D",
+        /* 112 */ "\u011D",
         // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
-        /* 112 */ "\u016D",
+        /* 113 */ "\u016D",
         // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
-        /* 113 */ "\u0109",
+        /* 114 */ "\u0109",
         // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
-        /* 114 */ "\u0135",
+        /* 115 */ "\u0135",
     };
 
     /* Language es: Spanish */
@@ -1129,25 +1184,25 @@
         /* 8~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null,
-        /* ~48 */
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~49 */
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 49 */ "!fixedColumnOrder!9,\u00A1,\",\',#,-,:,!,\\,,?,\u00BF,@,&,\\%,+,;,/,(,)",
-        /* 50~ */
+        /* 50 */ "!fixedColumnOrder!9,\u00A1,\",\',#,-,:,!,\\,,?,\u00BF,@,&,\\%,+,;,/,(,)",
+        /* 51~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null,
-        /* ~101 */
+        /* ~102 */
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 102 */ "!,\u00A1",
-        /* 103 */ null,
+        /* 103 */ "!,\u00A1",
+        /* 104 */ null,
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 104 */ "?,\u00BF",
-        /* 105 */ "\"",
-        /* 106 */ "\'",
+        /* 105 */ "?,\u00BF",
+        /* 106 */ "\"",
         /* 107 */ "\'",
+        /* 108 */ "\'",
     };
 
     /* Language et: Estonian */
@@ -1248,6 +1303,12 @@
         /* 22 */ "\u00E4",
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         /* 23 */ "\u00F5",
+        /* 24~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
     };
 
     /* Language fa: Persian */
@@ -1264,55 +1325,36 @@
         // U+067E: "پ" ARABIC LETTER PEH
         /* 42 */ "\u0627\u200C\u0628\u200C\u067E",
         /* 43 */ null,
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
-        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\",\'",
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 45 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
-        /* 46 */ null,
-        // U+FDFC: "﷼" RIAL SIGN
-        // U+060B: "؋" AFGHANI SIGN
-        // U+00A2: "¢" CENT SIGN
-        // U+00A3: "£" POUND SIGN
-        // U+20AC: "€" EURO SIGN
-        // U+00A5: "¥" YEN SIGN
-        // U+20B1: "₱" PESO SIGN
-        /* 47 */ "\uFDFC",
-        /* 48 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1,\u060B",
+        /* 44 */ null,
+        /* 45 */ "!text/single_laqm_raqm_rtl",
+        /* 46 */ "!text/double_laqm_raqm_rtl",
+        /* 47~ */
+        null, null, null,
+        /* ~49 */
         // U+061F: "؟" ARABIC QUESTION MARK
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
-        /* 49 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
+        /* 50 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
         // U+2605: "★" BLACK STAR
         // U+066D: "٭" ARABIC FIVE POINTED STAR
-        /* 50 */ "\u2605,\u066D",
+        /* 51 */ "\u2605,\u066D",
         // U+266A: "♪" EIGHTH NOTE
-        /* 51 */ "\u266A",
-        /* 52 */ null,
+        /* 52 */ "\u266A",
+        /* 53 */ null,
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
         // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
         // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
-        /* 53 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 54 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        /* 54 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
+        /* 55 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        // The following characters don't need BIDI mirroring.
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        /* 55 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
-        /* 56 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
+        /* 56 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
+        /* 57 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
         // U+0655: "ٕ" ARABIC HAMZA BELOW
         // U+0652: "ْ" ARABIC SUKUN
         // U+0651: "ّ" ARABIC SHADDA
@@ -1329,74 +1371,74 @@
         // U+0640: "ـ" ARABIC TATWEEL
         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
         // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
-        /* 57 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        /* 58 */ "\u064B",
+        /* 58 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
+        /* 59 */ "\u064B",
         // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE
-        /* 59 */ "\u06F1",
+        /* 60 */ "\u06F1",
         // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO
-        /* 60 */ "\u06F2",
+        /* 61 */ "\u06F2",
         // U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE
-        /* 61 */ "\u06F3",
+        /* 62 */ "\u06F3",
         // U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR
-        /* 62 */ "\u06F4",
+        /* 63 */ "\u06F4",
         // U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE
-        /* 63 */ "\u06F5",
+        /* 64 */ "\u06F5",
         // U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX
-        /* 64 */ "\u06F6",
+        /* 65 */ "\u06F6",
         // U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN
-        /* 65 */ "\u06F7",
+        /* 66 */ "\u06F7",
         // U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT
-        /* 66 */ "\u06F8",
+        /* 67 */ "\u06F8",
         // U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE
-        /* 67 */ "\u06F9",
+        /* 68 */ "\u06F9",
         // U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO
-        /* 68 */ "\u06F0",
+        /* 69 */ "\u06F0",
         // Label for "switch to symbols" key.
         // U+061F: "؟" ARABIC QUESTION MARK
-        /* 69 */ "\u06F3\u06F2\u06F1\u061F",
+        /* 70 */ "\u06F3\u06F2\u06F1\u061F",
         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
         // part because it'll be appended by the code.
-        /* 70 */ "\u06F3\u06F2\u06F1",
-        /* 71 */ "1",
-        /* 72 */ "2",
-        /* 73 */ "3",
-        /* 74 */ "4",
-        /* 75 */ "5",
-        /* 76 */ "6",
-        /* 77 */ "7",
-        /* 78 */ "8",
-        /* 79 */ "9",
+        /* 71 */ "\u06F3\u06F2\u06F1",
+        /* 72 */ "1",
+        /* 73 */ "2",
+        /* 74 */ "3",
+        /* 75 */ "4",
+        /* 76 */ "5",
+        /* 77 */ "6",
+        /* 78 */ "7",
+        /* 79 */ "8",
+        /* 80 */ "9",
         // U+066B: "٫" ARABIC DECIMAL SEPARATOR
         // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
-        /* 80 */ "0,\u066B,\u066C",
-        /* 81~ */
+        /* 81 */ "0,\u066B,\u066C",
+        /* 82~ */
         null, null, null, null, null, null, null, null, null, null,
-        /* ~90 */
+        /* ~91 */
         // U+060C: "،" ARABIC COMMA
-        /* 91 */ "\u060C",
-        /* 92 */ "\\,",
-        /* 93 */ "\u061F",
-        /* 94 */ "\u061B",
+        /* 92 */ "\u060C",
+        /* 93 */ "\\,",
+        /* 94 */ "\u061F",
+        /* 95 */ "\u061B",
         // U+066A: "٪" ARABIC PERCENT SIGN
-        /* 95 */ "\u066A",
-        /* 96 */ null,
-        /* 97 */ "?",
-        /* 98 */ ";",
+        /* 96 */ "\u066A",
+        /* 97 */ null,
+        /* 98 */ "?",
+        /* 99 */ ";",
         // U+2030: "‰" PER MILLE SIGN
-        /* 99 */ "\\%,\u2030",
+        /* 100 */ "\\%,\u2030",
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
         // U+061F: "؟" ARABIC QUESTION MARK
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        /* 100 */ "\u060C",
-        /* 101 */ "!",
-        /* 102 */ "!,\\,",
-        /* 103 */ "\u061F",
-        /* 104 */ "\u061F,?",
-        /* 105 */ "\u060C",
-        /* 106 */ "\u061F",
-        /* 107 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 101 */ "\u060C",
+        /* 102 */ "!",
+        /* 103 */ "!,\\,",
+        /* 104 */ "\u061F",
+        /* 105 */ "\u061F,?",
+        /* 106 */ "\u060C",
+        /* 107 */ "\u061F",
+        /* 108 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
     };
 
     /* Language fi: Finnish */
@@ -1512,48 +1554,48 @@
         // U+0917: "ग" DEVANAGARI LETTER GA
         /* 42 */ "\u0915\u0916\u0917",
         /* 43~ */
-        null, null, null, null,
-        /* ~46 */
+        null, null, null, null, null,
+        /* ~47 */
         // U+20B9: "₹" INDIAN RUPEE SIGN
-        /* 47 */ "\u20B9",
-        /* 48~ */
+        /* 48 */ "\u20B9",
+        /* 49~ */
         null, null, null, null, null, null, null, null, null, null, null,
-        /* ~58 */
+        /* ~59 */
         // U+0967: "१" DEVANAGARI DIGIT ONE
-        /* 59 */ "\u0967",
+        /* 60 */ "\u0967",
         // U+0968: "२" DEVANAGARI DIGIT TWO
-        /* 60 */ "\u0968",
+        /* 61 */ "\u0968",
         // U+0969: "३" DEVANAGARI DIGIT THREE
-        /* 61 */ "\u0969",
+        /* 62 */ "\u0969",
         // U+096A: "४" DEVANAGARI DIGIT FOUR
-        /* 62 */ "\u096A",
+        /* 63 */ "\u096A",
         // U+096B: "५" DEVANAGARI DIGIT FIVE
-        /* 63 */ "\u096B",
+        /* 64 */ "\u096B",
         // U+096C: "६" DEVANAGARI DIGIT SIX
-        /* 64 */ "\u096C",
+        /* 65 */ "\u096C",
         // U+096D: "७" DEVANAGARI DIGIT SEVEN
-        /* 65 */ "\u096D",
+        /* 66 */ "\u096D",
         // U+096E: "८" DEVANAGARI DIGIT EIGHT
-        /* 66 */ "\u096E",
+        /* 67 */ "\u096E",
         // U+096F: "९" DEVANAGARI DIGIT NINE
-        /* 67 */ "\u096F",
+        /* 68 */ "\u096F",
         // U+0966: "०" DEVANAGARI DIGIT ZERO
-        /* 68 */ "\u0966",
+        /* 69 */ "\u0966",
         // Label for "switch to symbols" key.
-        /* 69 */ "?\u0967\u0968\u0969",
+        /* 70 */ "?\u0967\u0968\u0969",
         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
         // part because it'll be appended by the code.
-        /* 70 */ "\u0967\u0968\u0969",
-        /* 71 */ "1",
-        /* 72 */ "2",
-        /* 73 */ "3",
-        /* 74 */ "4",
-        /* 75 */ "5",
-        /* 76 */ "6",
-        /* 77 */ "7",
-        /* 78 */ "8",
-        /* 79 */ "9",
-        /* 80 */ "0",
+        /* 71 */ "\u0967\u0968\u0969",
+        /* 72 */ "1",
+        /* 73 */ "2",
+        /* 74 */ "3",
+        /* 75 */ "4",
+        /* 76 */ "5",
+        /* 77 */ "6",
+        /* 78 */ "7",
+        /* 79 */ "8",
+        /* 80 */ "9",
+        /* 81 */ "0",
     };
 
     /* Language hr: Croatian */
@@ -1581,6 +1623,14 @@
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         /* 12 */ "\u017E,\u017A,\u017C",
+        /* 13~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_rqm",
+        /* 44 */ "!text/double_9qm_rqm",
+        /* 45 */ "!text/single_raqm_laqm",
+        /* 46 */ "!text/double_raqm_laqm",
     };
 
     /* Language hu: Hungarian */
@@ -1626,6 +1676,15 @@
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* 4 */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
+        /* 5~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_rqm",
+        /* 44 */ "!text/double_9qm_rqm",
+        /* 45 */ "!text/single_raqm_laqm",
+        /* 46 */ "!text/double_raqm_laqm",
     };
 
     /* Language is: Icelandic */
@@ -1689,6 +1748,12 @@
         /* 21 */ "\u00E6",
         // U+00FE: "þ" LATIN SMALL LETTER THORN
         /* 22 */ "\u00FE",
+        /* 23~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
     };
 
     /* Language it: Italian */
@@ -1748,45 +1813,38 @@
         // U+05D1: "ב" HEBREW LETTER BET
         // U+05D2: "ג" HEBREW LETTER GIMEL
         /* 42 */ "\u05D0\u05D1\u05D2",
-        /* 43 */ null,
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
-        /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB",
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 45 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
-        /* 46 */ null,
-        // U+20AA: "₪" NEW SHEQEL SIGN
-        /* 47 */ "\u20AA",
-        /* 48 */ null,
-        /* 49 */ null,
+        // The following characters don't need BIDI mirroring.
+        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
+        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
+        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
+        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+        /* 43 */ "\u2018,\u2019,\u201A",
+        /* 44 */ "\u201C,\u201D,\u201E",
+        /* 45 */ "!text/single_laqm_raqm_rtl",
+        /* 46 */ "!text/double_laqm_raqm_rtl",
+        /* 47~ */
+        null, null, null, null,
+        /* ~50 */
         // U+2605: "★" BLACK STAR
-        /* 50 */ "\u2605",
-        /* 51 */ null,
+        /* 51 */ "\u2605",
+        /* 52 */ null,
         // U+00B1: "±" PLUS-MINUS SIGN
         // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
-        /* 52 */ "\u00B1,\uFB29",
+        /* 53 */ "\u00B1,\uFB29",
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 53 */ "!fixedColumnOrder!3,<|>,{|},[|]",
-        /* 54 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
+        /* 54 */ "!fixedColumnOrder!3,<|>,{|},[|]",
+        /* 55 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        // The following characters don't need BIDI mirroring.
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        /* 55 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 56 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+        /* 56 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
+        /* 57 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
     };
 
     /* Language ka: Georgian */
@@ -1801,6 +1859,8 @@
         // U+10D1: "ბ" GEORGIAN LETTER BAN
         // U+10D2: "გ" GEORGIAN LETTER GAN
         /* 42 */ "\u10D0\u10D1\u10D2",
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
     };
 
     /* Language ky: Kirghiz */
@@ -1930,6 +1990,12 @@
         // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
         /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
     };
 
     /* Language lv: Latvian */
@@ -2019,6 +2085,12 @@
         // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
         /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
     };
 
     /* Language mk: Macedonian */
@@ -2045,21 +2117,8 @@
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* 42 */ "\u0410\u0411\u0412",
-        /* 43 */ null,
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
-        // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string>
-        /* 44 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB",
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
-        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 45 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
     };
 
     /* Language mn: Mongolian */
@@ -2075,10 +2134,10 @@
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* 42 */ "\u0410\u0411\u0412",
         /* 43~ */
-        null, null, null, null,
-        /* ~46 */
+        null, null, null, null, null,
+        /* ~47 */
         // U+20AE: "₮" TUGRIK SIGN
-        /* 47 */ "\u20AE",
+        /* 48 */ "\u20AE",
     };
 
     /* Language nb: Norwegian Bokmål */
@@ -2126,6 +2185,12 @@
         /* 23 */ "\u00F6",
         // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
         /* 24 */ "\u00E4",
+        /* 25~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_rqm",
+        /* 44 */ "!text/double_9qm_rqm",
     };
 
     /* Language nl: Dutch */
@@ -2177,6 +2242,13 @@
         /* 7 */ null,
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* 8 */ "\u0133",
+        /* 9~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_rqm",
+        /* 44 */ "!text/double_9qm_rqm",
     };
 
     /* Language pl: Polish */
@@ -2231,6 +2303,12 @@
         /* 13 */ null,
         // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
         /* 14 */ "\u0142",
+        /* 15~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_rqm",
+        /* 44 */ "!text/double_9qm_rqm",
     };
 
     /* Language pt: Portuguese */
@@ -2330,6 +2408,13 @@
         /* ~10 */
         // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW
         /* 11 */ "\u021B",
+        /* 12~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_rqm",
+        /* 44 */ "!text/double_9qm_rqm",
     };
 
     /* Language ru: Russian */
@@ -2364,6 +2449,8 @@
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* 42 */ "\u0410\u0411\u0412",
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
     };
 
     /* Language sk: Slovak */
@@ -2454,6 +2541,14 @@
         // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
         /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
+        /* 45 */ "!text/single_raqm_laqm",
+        /* 46 */ "!text/double_raqm_laqm",
     };
 
     /* Language sl: Slovenian */
@@ -2474,6 +2569,14 @@
         /* 11 */ null,
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         /* 12 */ "\u017E",
+        /* 13~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~42 */
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
+        /* 45 */ "!text/single_raqm_laqm",
+        /* 46 */ "!text/double_raqm_laqm",
     };
 
     /* Language sr: Serbian */
@@ -2519,21 +2622,10 @@
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* 42 */ "\u0410\u0411\u0412",
-        /* 43 */ null,
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
-        // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string>
-        /* 44 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB",
-        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
-        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-        /* 45 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
+        /* 45 */ "!text/single_raqm_laqm",
+        /* 46 */ "!text/double_raqm_laqm",
     };
 
     /* Language sv: Swedish */
@@ -2576,6 +2668,12 @@
         /* 23 */ "\u00F8",
         // U+00E6: "æ" LATIN SMALL LETTER AE
         /* 24 */ "\u00E6",
+        /* 25~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null,
+        /* ~44 */
+        /* 45 */ "!text/single_raqm_laqm",
+        /* 46 */ "!text/double_raqm_laqm",
     };
 
     /* Language sw: Swahili */
@@ -2642,10 +2740,10 @@
         // U+0E04: "ค" THAI CHARACTER KHO KHWAI
         /* 42 */ "\u0E01\u0E02\u0E04",
         /* 43~ */
-        null, null, null, null,
-        /* ~46 */
+        null, null, null, null, null,
+        /* ~47 */
         // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
-        /* 47 */ "\u0E3F",
+        /* 48 */ "\u0E3F",
     };
 
     /* Language tl: Tagalog */
@@ -2780,11 +2878,13 @@
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* 42 */ "\u0410\u0411\u0412",
-        /* 43~ */
-        null, null, null, null,
-        /* ~46 */
+        /* 43 */ "!text/single_9qm_lqm",
+        /* 44 */ "!text/double_9qm_lqm",
+        /* 45~ */
+        null, null, null,
+        /* ~47 */
         // U+20B4: "₴" HRYVNIA SIGN
-        /* 47 */ "\u20B4",
+        /* 48 */ "\u20B4",
     };
 
     /* Language vi: Vietnamese */
@@ -2869,10 +2969,10 @@
         /* 10~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null,
-        /* ~46 */
+        null, null, null, null, null, null, null, null,
+        /* ~47 */
         // U+20AB: "₫" DONG SIGN
-        /* 47 */ "\u20AB",
+        /* 48 */ "\u20AB",
     };
 
     /* Language zu: Zulu */
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index af494c4..e7c64c6 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -958,6 +958,10 @@
         LatinImeLogger.commit();
         mKeyboardSwitcher.onHideWindow();
 
+        if (AccessibilityUtils.getInstance().isAccessibilityEnabled()) {
+            AccessibleKeyboardViewProxy.getInstance().onHideWindow();
+        }
+
         if (TRACE) Debug.stopMethodTracing();
         if (mOptionsDialog != null && mOptionsDialog.isShowing()) {
             mOptionsDialog.dismiss();
@@ -1447,7 +1451,7 @@
         } else {
             didAutoCorrect = false;
             if (SPACE_STATE_PHANTOM == spaceState) {
-                if (ProductionFlag.IS_INTERNAL) {
+                if (mSettings.isInternal()) {
                     if (mWordComposer.isComposingWord() && mWordComposer.isBatchMode()) {
                         Stats.onAutoCorrection(
                                 "", mWordComposer.getTypedWord(), " ", mWordComposer);
@@ -1502,7 +1506,7 @@
         mHandler.cancelUpdateSuggestionStrip();
         mConnection.beginBatchEdit();
         if (mWordComposer.isComposingWord()) {
-            if (ProductionFlag.IS_INTERNAL) {
+            if (mSettings.isInternal()) {
                 if (mWordComposer.isBatchMode()) {
                     Stats.onAutoCorrection("", mWordComposer.getTypedWord(), " ", mWordComposer);
                 }
@@ -1732,7 +1736,7 @@
             }
         } else {
             if (mLastComposedWord.canRevertCommit()) {
-                if (ProductionFlag.IS_INTERNAL) {
+                if (mSettings.isInternal()) {
                     Stats.onAutoCorrectionCancellation();
                 }
                 revertCommit();
@@ -1891,7 +1895,7 @@
             if (null != mSuggestionStripView) mSuggestionStripView.dismissAddToDictionaryHint();
         }
         mHandler.postUpdateSuggestionStrip();
-        if (ProductionFlag.IS_INTERNAL) {
+        if (mSettings.isInternal()) {
             Utils.Stats.onNonSeparator((char)primaryCode, x, y);
         }
     }
@@ -1958,7 +1962,7 @@
             // already displayed or not, so it's okay.
             setPunctuationSuggestions();
         }
-        if (ProductionFlag.IS_INTERNAL) {
+        if (mSettings.isInternal()) {
             Utils.Stats.onSeparator((char)primaryCode, x, y);
         }
 
@@ -2141,7 +2145,7 @@
                 throw new RuntimeException("We have an auto-correction but the typed word "
                         + "is empty? Impossible! I must commit suicide.");
             }
-            if (ProductionFlag.IS_INTERNAL) {
+            if (mSettings.isInternal()) {
                 Stats.onAutoCorrection(typedWord, autoCorrection, separatorString, mWordComposer);
             }
             if (ProductionFlag.IS_EXPERIMENTAL) {
@@ -2240,7 +2244,7 @@
                 // If the suggestion is not in the dictionary, the hint should be shown.
                 && !AutoCorrection.isValidWord(mSuggest.getUnigramDictionaries(), suggestion, true);
 
-        if (ProductionFlag.IS_INTERNAL) {
+        if (mSettings.isInternal()) {
             Stats.onSeparator((char)Constants.CODE_SPACE,
                     Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
         }
@@ -2364,7 +2368,7 @@
             mUserHistoryDictionary.cancelAddingUserHistory(previousWord, committedWord);
         }
         mConnection.commitText(originallyTypedWord + mLastComposedWord.mSeparatorString, 1);
-        if (ProductionFlag.IS_INTERNAL) {
+        if (mSettings.isInternal()) {
             Stats.onSeparator(mLastComposedWord.mSeparatorString,
                     Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
         }
@@ -2498,12 +2502,6 @@
         launchSubActivity(SettingsActivity.class);
     }
 
-    // Called from debug code only
-    public void launchDebugSettings() {
-        handleClose();
-        launchSubActivity(DebugSettingsActivity.class);
-    }
-
     public void launchKeyboardedDialogActivity(final Class<? extends Activity> activityClass) {
         // Put the text in the attached EditText into a safe, saved state before switching to a
         // new activity that will also use the soft keyboard.
diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java
index 435074b..4cbfa8e 100644
--- a/java/src/com/android/inputmethod/latin/Settings.java
+++ b/java/src/com/android/inputmethod/latin/Settings.java
@@ -70,6 +70,7 @@
     public static final String PREF_INPUT_LANGUAGE = "input_language";
     public static final String PREF_SELECTED_LANGUAGES = "selected_languages";
     public static final String PREF_DEBUG_SETTINGS = "debug_settings";
+    public static final String PREF_KEY_IS_INTERNAL = "pref_key_is_internal";
 
     // This preference key is deprecated. Use {@link #PREF_SHOW_LANGUAGE_SWITCH_KEY} instead.
     // This is being used only for the backward compatibility.
@@ -127,6 +128,10 @@
         return mSettingsValues;
     }
 
+    public boolean isInternal() {
+        return mSettingsValues.mIsInternal;
+    }
+
     // Accessed from the settings interface, hence public
     public static boolean readKeypressSoundEnabled(final SharedPreferences prefs,
             final Resources res) {
@@ -274,4 +279,8 @@
         }
         return prefs.getBoolean(Settings.PREF_SHOW_SETUP_WIZARD_ICON, false);
     }
+
+    public static boolean isInternal(final SharedPreferences prefs) {
+        return prefs.getBoolean(Settings.PREF_KEY_IS_INTERNAL, false);
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/SettingsFragment.java b/java/src/com/android/inputmethod/latin/SettingsFragment.java
index 4c90e48..cc9f168 100644
--- a/java/src/com/android/inputmethod/latin/SettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/SettingsFragment.java
@@ -92,7 +92,7 @@
 
         final Preference debugSettings = findPreference(Settings.PREF_DEBUG_SETTINGS);
         if (debugSettings != null) {
-            if (ProductionFlag.IS_INTERNAL) {
+            if (Settings.isInternal(prefs)) {
                 final Intent debugSettingsIntent = new Intent(Intent.ACTION_MAIN);
                 debugSettingsIntent.setClassName(
                         context.getPackageName(), DebugSettingsActivity.class.getName());
@@ -156,10 +156,6 @@
             removePreference(Settings.PREF_GESTURE_SETTINGS, getPreferenceScreen());
         }
 
-        final CheckBoxPreference showSetupWizardIcon =
-                (CheckBoxPreference)findPreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON);
-        showSetupWizardIcon.setChecked(Settings.readShowSetupWizardIcon(prefs, context));
-
         setupKeyLongpressTimeoutSettings(prefs, res);
         setupKeypressVibrationDurationSettings(prefs, res);
         setupKeypressSoundVolumeSettings(prefs, res);
@@ -175,6 +171,10 @@
         } else {
             getPreferenceScreen().removePreference(mVoicePreference);
         }
+        final SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
+        final CheckBoxPreference showSetupWizardIcon =
+                (CheckBoxPreference)findPreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON);
+        showSetupWizardIcon.setChecked(Settings.readShowSetupWizardIcon(prefs, getActivity()));
         updateShowCorrectionSuggestionsSummary();
         updateKeyPreviewPopupDelaySummary();
         updateCustomInputStylesSummary();
diff --git a/java/src/com/android/inputmethod/latin/SettingsValues.java b/java/src/com/android/inputmethod/latin/SettingsValues.java
index d058680..f77a928 100644
--- a/java/src/com/android/inputmethod/latin/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/SettingsValues.java
@@ -76,6 +76,9 @@
     private final boolean mVoiceKeyEnabled;
     private final boolean mVoiceKeyOnMain;
 
+    // Debug settings
+    public final boolean mIsInternal;
+
     public SettingsValues(final SharedPreferences prefs, final Resources res,
             final InputAttributes inputAttributes) {
         // Get the resources
@@ -141,6 +144,7 @@
                 Settings.PREF_SHOW_SUGGESTIONS_SETTING,
                 res.getString(R.string.prefs_suggestion_visibility_default_value));
         mSuggestionVisibility = createSuggestionVisibility(res, showSuggestionsSetting);
+        mIsInternal = Settings.isInternal(prefs);
     }
 
     public boolean isApplicationSpecifiedCompletionsOn() {
diff --git a/java/src/com/android/inputmethod/latin/StaticInnerHandlerWrapper.java b/java/src/com/android/inputmethod/latin/StaticInnerHandlerWrapper.java
index 89d9ea8..e50af4d 100644
--- a/java/src/com/android/inputmethod/latin/StaticInnerHandlerWrapper.java
+++ b/java/src/com/android/inputmethod/latin/StaticInnerHandlerWrapper.java
@@ -22,17 +22,17 @@
 import java.lang.ref.WeakReference;
 
 public class StaticInnerHandlerWrapper<T> extends Handler {
-    final private WeakReference<T> mOuterInstanceRef;
+    private final WeakReference<T> mOuterInstanceRef;
 
-    public StaticInnerHandlerWrapper(T outerInstance) {
-        super();
-        if (outerInstance == null) throw new NullPointerException("outerInstance is null");
-        mOuterInstanceRef = new WeakReference<T>(outerInstance);
+    public StaticInnerHandlerWrapper(final T outerInstance) {
+        this(outerInstance, Looper.myLooper());
     }
 
-    public StaticInnerHandlerWrapper(T outerInstance, Looper looper) {
+    public StaticInnerHandlerWrapper(final T outerInstance, final Looper looper) {
         super(looper);
-        if (outerInstance == null) throw new NullPointerException("outerInstance is null");
+        if (outerInstance == null) {
+            throw new NullPointerException("outerInstance is null");
+        }
         mOuterInstanceRef = new WeakReference<T>(outerInstance);
     }
 
diff --git a/java/src/com/android/inputmethod/latin/define/ProductionFlag.java b/java/src/com/android/inputmethod/latin/define/ProductionFlag.java
index fe9be16..3df0d04 100644
--- a/java/src/com/android/inputmethod/latin/define/ProductionFlag.java
+++ b/java/src/com/android/inputmethod/latin/define/ProductionFlag.java
@@ -22,7 +22,6 @@
     }
 
     public static final boolean IS_EXPERIMENTAL = false;
-    public static final boolean IS_INTERNAL = false;
 
     // When false, IS_EXPERIMENTAL_DEBUG suggests that all guarded class-private DEBUG flags should
     // be false, and any privacy controls should be enforced.  IS_EXPERIMENTAL_DEBUG should be false
diff --git a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
index e009fbc..7f66c6d 100644
--- a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
+++ b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
@@ -62,6 +62,9 @@
         @Override
         public void handleMessage(final Message msg) {
             final SetupActivity setupActivity = getOuterInstance();
+            if (setupActivity == null) {
+                return;
+            }
             switch (msg.what) {
             case MSG_POLLING_IME_SETTINGS:
                 if (SetupActivity.isThisImeEnabled(setupActivity)) {
diff --git a/java/src/com/android/inputmethod/research/ResearchLog.java b/java/src/com/android/inputmethod/research/ResearchLog.java
index 9016e23..f7c5fd5 100644
--- a/java/src/com/android/inputmethod/research/ResearchLog.java
+++ b/java/src/com/android/inputmethod/research/ResearchLog.java
@@ -20,11 +20,11 @@
 import android.util.JsonWriter;
 import android.util.Log;
 
+import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.latin.define.ProductionFlag;
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
@@ -54,7 +54,6 @@
     private static final String TAG = ResearchLog.class.getSimpleName();
     private static final boolean DEBUG = false && ProductionFlag.IS_EXPERIMENTAL_DEBUG;
     private static final long FLUSH_DELAY_IN_MS = 1000 * 5;
-    private static final int ABORT_TIMEOUT_IN_MS = 1000 * 4;
 
     /* package */ final ScheduledExecutorService mExecutor;
     /* package */ final File mFile;
@@ -99,8 +98,10 @@
      * output.
      *
      * See class comment for details about {@code JsonWriter} construction.
+     *
+     * @param onClosed run after the close() operation has completed asynchronously
      */
-    public synchronized void close(final Runnable onClosed) {
+    private synchronized void close(final Runnable onClosed) {
         mExecutor.submit(new Callable<Object>() {
             @Override
             public Object call() throws Exception {
@@ -131,15 +132,24 @@
         mExecutor.shutdown();
     }
 
-    private boolean mIsAbortSuccessful;
+    /**
+     * Block until the research log has shut down and spooled out all output or {@code timeout}
+     * occurs.
+     *
+     * @param timeout time to wait for close in milliseconds
+     */
+    public void blockingClose(final long timeout) {
+        close(null);
+        awaitTermination(timeout, TimeUnit.MILLISECONDS);
+    }
 
     /**
-     * Waits for publication requests to finish, closes the {@link JsonWriter}, but then deletes the
-     * backing file used for output.
+     * Waits for publication requests to finish, closes the JsonWriter, but then deletes the backing
+     * output file.
      *
-     * See class comment for details about {@code JsonWriter} construction.
+     * @param onAbort run after the abort() operation has completed asynchronously
      */
-    public synchronized void abort() {
+    private synchronized void abort(final Runnable onAbort) {
         mExecutor.submit(new Callable<Object>() {
             @Override
             public Object call() throws Exception {
@@ -151,7 +161,10 @@
                     }
                 } finally {
                     if (mFile != null) {
-                        mIsAbortSuccessful = mFile.delete();
+                        mFile.delete();
+                    }
+                    if (onAbort != null) {
+                        onAbort.run();
                     }
                 }
                 return null;
@@ -161,14 +174,25 @@
         mExecutor.shutdown();
     }
 
-    public boolean blockingAbort() throws InterruptedException {
-        abort();
-        mExecutor.awaitTermination(ABORT_TIMEOUT_IN_MS, TimeUnit.MILLISECONDS);
-        return mIsAbortSuccessful;
+    /**
+     * Block until the research log has aborted or {@code timeout} occurs.
+     *
+     * @param timeout time to wait for close in milliseconds
+     */
+    public void blockingAbort(final long timeout) {
+        abort(null);
+        awaitTermination(timeout, TimeUnit.MILLISECONDS);
     }
 
-    public void awaitTermination(int delay, TimeUnit timeUnit) throws InterruptedException {
-        mExecutor.awaitTermination(delay, timeUnit);
+    @UsedForTesting
+    public void awaitTermination(final long delay, final TimeUnit timeUnit) {
+        try {
+            if (!mExecutor.awaitTermination(delay, timeUnit)) {
+                Log.e(TAG, "ResearchLog executor timed out while awaiting terminaion");
+            }
+        } catch (final InterruptedException e) {
+            Log.e(TAG, "ResearchLog executor interrupted while awaiting terminaion", e);
+        }
     }
 
     /* package */ synchronized void flush() {
@@ -214,10 +238,10 @@
                     return null;
                 }
             });
-        } catch (RejectedExecutionException e) {
+        } catch (final RejectedExecutionException e) {
             // TODO: Add code to record loss of data, and report.
             if (DEBUG) {
-                Log.d(TAG, "ResearchLog.publish() rejecting scheduled execution");
+                Log.d(TAG, "ResearchLog.publish() rejecting scheduled execution", e);
             }
         }
     }
diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java
index e705ddd..11d1a52 100644
--- a/java/src/com/android/inputmethod/research/ResearchLogger.java
+++ b/java/src/com/android/inputmethod/research/ResearchLogger.java
@@ -154,6 +154,9 @@
     private static final int MAX_INPUTVIEW_LENGTH_TO_CAPTURE = 8192; // must be >=1
     private static final String PREF_RESEARCH_SAVED_CHANNEL = "pref_research_saved_channel";
 
+    private static final long RESEARCHLOG_CLOSE_TIMEOUT_IN_MS = 5 * 1000;
+    private static final long RESEARCHLOG_ABORT_TIMEOUT_IN_MS = 5 * 1000;
+
     private static final ResearchLogger sInstance = new ResearchLogger();
     private static String sAccountType = null;
     private static String sAllowedAccountDomain = null;
@@ -502,42 +505,29 @@
             commitCurrentLogUnit();
             mMainLogBuffer.setIsStopping();
             mMainLogBuffer.shiftAndPublishAll();
-            mMainResearchLog.close(null /* callback */);
+            mMainResearchLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS);
             mMainLogBuffer = null;
         }
         if (mFeedbackLogBuffer != null) {
-            mFeedbackLog.close(null /* callback */);
+            mFeedbackLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS);
             mFeedbackLogBuffer = null;
         }
     }
 
-    public boolean abort() {
+    public void abort() {
         if (DEBUG) {
             Log.d(TAG, "abort called");
         }
-        boolean didAbortMainLog = false;
         if (mMainLogBuffer != null) {
             mMainLogBuffer.clear();
-            try {
-                didAbortMainLog = mMainResearchLog.blockingAbort();
-            } catch (InterruptedException e) {
-                // Don't know whether this succeeded or not.  We assume not; this is reported
-                // to the caller.
-            }
+            mMainResearchLog.blockingAbort(RESEARCHLOG_ABORT_TIMEOUT_IN_MS);
             mMainLogBuffer = null;
         }
-        boolean didAbortFeedbackLog = false;
         if (mFeedbackLogBuffer != null) {
             mFeedbackLogBuffer.clear();
-            try {
-                didAbortFeedbackLog = mFeedbackLog.blockingAbort();
-            } catch (InterruptedException e) {
-                // Don't know whether this succeeded or not.  We assume not; this is reported
-                // to the caller.
-            }
+            mFeedbackLog.blockingAbort(RESEARCHLOG_ABORT_TIMEOUT_IN_MS);
             mFeedbackLogBuffer = null;
         }
-        return didAbortMainLog && didAbortFeedbackLog;
     }
 
     private void restart() {
@@ -620,7 +610,7 @@
 
     private void startRecordingInternal() {
         if (mUserRecordingLog != null) {
-            mUserRecordingLog.abort();
+            mUserRecordingLog.blockingAbort(RESEARCHLOG_ABORT_TIMEOUT_IN_MS);
         }
         mUserRecordingFile = createUserRecordingFile(mFilesDir);
         mUserRecordingLog = new ResearchLog(mUserRecordingFile, mLatinIME);
@@ -658,7 +648,7 @@
 
     private void cancelRecording() {
         if (mUserRecordingLog != null) {
-            mUserRecordingLog.abort();
+            mUserRecordingLog.blockingAbort(RESEARCHLOG_ABORT_TIMEOUT_IN_MS);
         }
         mUserRecordingLog = null;
         mUserRecordingLogBuffer = null;
@@ -670,7 +660,7 @@
     private void saveRecording() {
         commitCurrentLogUnit();
         publishLogBuffer(mUserRecordingLogBuffer, mUserRecordingLog, true);
-        mUserRecordingLog.close(null);
+        mUserRecordingLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS);
         mUserRecordingLog = null;
         mUserRecordingLogBuffer = null;
 
@@ -782,12 +772,8 @@
                 feedbackContents, accountName, recording);
         mFeedbackLogBuffer.shiftIn(feedbackLogUnit);
         publishLogBuffer(mFeedbackLogBuffer, mSavedFeedbackLog, true /* isIncludingPrivateData */);
-        mSavedFeedbackLog.close(new Runnable() {
-            @Override
-            public void run() {
-                uploadNow();
-            }
-        });
+        mSavedFeedbackLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS);
+        uploadNow();
 
         if (isIncludingRecording && DEBUG_REPLAY_AFTER_FEEDBACK) {
             final Handler handler = new Handler();
diff --git a/native/jni/src/char_utils.h b/native/jni/src/char_utils.h
index 7a4384d..58d388d 100644
--- a/native/jni/src/char_utils.h
+++ b/native/jni/src/char_utils.h
@@ -68,7 +68,7 @@
     return toLowerCase(toBaseCodePoint(c));
 }
 
-inline static bool isSkippableCodePoint(const int codePoint) {
+inline static bool isIntentionalOmissionCodePoint(const int codePoint) {
     // TODO: Do not hardcode here
     return codePoint == KEYCODE_SINGLE_QUOTE || codePoint == KEYCODE_HYPHEN_MINUS;
 }
diff --git a/native/jni/src/proximity_info_state.cpp b/native/jni/src/proximity_info_state.cpp
index fe1c433..7fcfd5d 100644
--- a/native/jni/src/proximity_info_state.cpp
+++ b/native/jni/src/proximity_info_state.cpp
@@ -165,7 +165,7 @@
         const int index = inputIndex * mProximityInfo->getKeyCount() + keyId;
         return min(mSampledDistanceCache_G[index], mMaxPointToKeyLength);
     }
-    if (isSkippableCodePoint(codePoint)) {
+    if (isIntentionalOmissionCodePoint(codePoint)) {
         return 0.0f;
     }
     // If the char is not a key on the keyboard then return the max length.
diff --git a/tools/maketext/res/values-ar/donottranslate-more-keys.xml b/tools/maketext/res/values-ar/donottranslate-more-keys.xml
index f10139e..cace240 100644
--- a/tools/maketext/res/values-ar/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-ar/donottranslate-more-keys.xml
@@ -99,31 +99,11 @@
          U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-         The following characters don't need BIDI mirroring.
-         U+2018: "‘" LEFT SINGLE QUOTATION MARK
-         U+2019: "’" RIGHT SINGLE QUOTATION MARK
-         U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-         U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-         U+201C: "“" LEFT DOUBLE QUOTATION MARK
-         U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-         U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-         U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -->
     <string name="more_keys_for_less_than">!fixedColumnOrder!3,&#x2039;|&#x203A;,&#x2264;|&#x2265;,&#x00AB;|&#x00BB;</string>
     <string name="more_keys_for_greater_than">!fixedColumnOrder!3,&#x203A;|&#x2039;,&#x2265;|&#x2264;,&#x00BB;|&#x00AB;</string>
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-    <!-- <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string> -->
-    <string name="more_keys_for_double_quote">!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-    <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string> -->
-    <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-    <!-- U+00A2: "¢" CENT SIGN
-         U+00A3: "£" POUND SIGN
-         U+20AC: "€" EURO SIGN
-         U+00A5: "¥" YEN SIGN
-         U+20B1: "₱" PESO SIGN
-         U+FDFC: "﷼" RIAL SIGN -->
-    <string name="more_keys_for_currency_dollar">&#x00A2;,&#x00A3;,&#x20AC;,&#x00A5;,&#x20B1;,&#xFDFC;</string>
+    <string name="single_angle_quotes">!text/single_laqm_raqm_rtl</string>
+    <string name="double_angle_quotes">!text/double_laqm_raqm_rtl</string>
     <!-- U+0655: "ٕ" ARABIC HAMZA BELOW
          U+0654: "ٔ" ARABIC HAMZA ABOVE
          U+0652: "ْ" ARABIC SUKUN
diff --git a/tools/maketext/res/values-be/donottranslate-more-keys.xml b/tools/maketext/res/values-be/donottranslate-more-keys.xml
index c8f2167..4723503 100644
--- a/tools/maketext/res/values-be/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-be/donottranslate-more-keys.xml
@@ -37,4 +37,6 @@
          U+0411: "Б" CYRILLIC CAPITAL LETTER BE
          U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
     <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
 </resources>
diff --git a/tools/maketext/res/values-bg/donottranslate-more-keys.xml b/tools/maketext/res/values-bg/donottranslate-more-keys.xml
index e7570df..5262133 100644
--- a/tools/maketext/res/values-bg/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-bg/donottranslate-more-keys.xml
@@ -23,4 +23,6 @@
          U+0411: "Б" CYRILLIC CAPITAL LETTER BE
          U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
     <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
+    <!-- single_quotes of Bulgarian is default single_quotes_right_left. -->
+    <string name="double_quotes">!text/double_9qm_lqm</string>
 </resources>
diff --git a/tools/maketext/res/values-cs/donottranslate-more-keys.xml b/tools/maketext/res/values-cs/donottranslate-more-keys.xml
index 9af6794..5ce1d3b 100644
--- a/tools/maketext/res/values-cs/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-cs/donottranslate-more-keys.xml
@@ -84,4 +84,8 @@
          U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
          U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE -->
     <string name="more_keys_for_z">&#x017E;,&#x017A;,&#x017C;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
+    <string name="single_angle_quotes">!text/single_raqm_laqm</string>
+    <string name="double_angle_quotes">!text/double_raqm_laqm</string>
 </resources>
diff --git a/tools/maketext/res/values-da/donottranslate-more-keys.xml b/tools/maketext/res/values-da/donottranslate-more-keys.xml
index acc0c53..cbaf9f4 100644
--- a/tools/maketext/res/values-da/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-da/donottranslate-more-keys.xml
@@ -68,4 +68,8 @@
     <string name="more_keys_for_nordic_row2_10">&#x00E4;</string>
     <!-- U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS -->
     <string name="more_keys_for_nordic_row2_11">&#x00F6;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
+    <string name="single_angle_quotes">!text/single_raqm_laqm</string>
+    <string name="double_angle_quotes">!text/double_raqm_laqm</string>
 </resources>
diff --git a/tools/maketext/res/values-de/donottranslate-more-keys.xml b/tools/maketext/res/values-de/donottranslate-more-keys.xml
index 181a3b5..9dc8717 100644
--- a/tools/maketext/res/values-de/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-de/donottranslate-more-keys.xml
@@ -55,4 +55,8 @@
     <!-- U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
          U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE -->
     <string name="more_keys_for_n">&#x00F1;,&#x0144;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
+    <string name="single_angle_quotes">!text/single_raqm_laqm</string>
+    <string name="double_angle_quotes">!text/double_raqm_laqm</string>
 </resources>
diff --git a/tools/maketext/res/values-et/donottranslate-more-keys.xml b/tools/maketext/res/values-et/donottranslate-more-keys.xml
index 69cf654..d037044 100644
--- a/tools/maketext/res/values-et/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-et/donottranslate-more-keys.xml
@@ -111,4 +111,6 @@
     <string name="keylabel_for_nordic_row2_11">&#x00E4;</string>
     <!-- U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE -->
     <string name="more_keys_for_nordic_row2_10">&#x00F5;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
 </resources>
diff --git a/tools/maketext/res/values-fa/donottranslate-more-keys.xml b/tools/maketext/res/values-fa/donottranslate-more-keys.xml
index 6acdd41..7c8496d 100644
--- a/tools/maketext/res/values-fa/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-fa/donottranslate-more-keys.xml
@@ -106,33 +106,11 @@
          U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-         The following characters don't need BIDI mirroring.
-         U+2018: "‘" LEFT SINGLE QUOTATION MARK
-         U+2019: "’" RIGHT SINGLE QUOTATION MARK
-         U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-         U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-         U+201C: "“" LEFT DOUBLE QUOTATION MARK
-         U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-         U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-         U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -->
     <string name="more_keys_for_less_than">!fixedColumnOrder!3,&#x2039;|&#x203A;,&#x2264;|&#x2265;,&lt;|&gt;</string>
     <string name="more_keys_for_greater_than">!fixedColumnOrder!3,&#x203A;|&#x2039;,&#x2265;|&#x2264;,&gt;|&lt;</string>
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-    <!-- <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string> -->
-    <string name="more_keys_for_double_quote">!fixedColumnOrder!4,&#x201C;,&#x201D;,\",\'</string>
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-    <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string> -->
-    <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-    <!-- U+FDFC: "﷼" RIAL SIGN
-         U+060B: "؋" AFGHANI SIGN
-         U+00A2: "¢" CENT SIGN
-         U+00A3: "£" POUND SIGN
-         U+20AC: "€" EURO SIGN
-         U+00A5: "¥" YEN SIGN
-         U+20B1: "₱" PESO SIGN -->
-    <string name="keylabel_for_currency_generic">&#xFDFC;</string>
-    <string name="more_keys_for_currency_generic">$,&#x00A2;,&#x20AC;,&#x00A3;,&#x00A5;,&#x20B1;,&#x060B;</string>
+    <string name="single_angle_quotes">!text/single_laqm_raqm_rtl</string>
+    <string name="double_angle_quotes">!text/double_laqm_raqm_rtl</string>
     <!-- U+0655: "ٕ" ARABIC HAMZA BELOW
          U+0652: "ْ" ARABIC SUKUN
          U+0651: "ّ" ARABIC SHADDA
diff --git a/tools/maketext/res/values-hr/donottranslate-more-keys.xml b/tools/maketext/res/values-hr/donottranslate-more-keys.xml
index 9b4005d..022bd2a 100644
--- a/tools/maketext/res/values-hr/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-hr/donottranslate-more-keys.xml
@@ -35,4 +35,8 @@
     <string name="more_keys_for_c">&#x010D;,&#x0107;,&#x00E7;</string>
     <!-- U+0111: "đ" LATIN SMALL LETTER D WITH STROKE -->
     <string name="more_keys_for_d">&#x0111;</string>
+    <string name="single_quotes">!text/single_9qm_rqm</string>
+    <string name="double_quotes">!text/double_9qm_rqm</string>
+    <string name="single_angle_quotes">!text/single_raqm_laqm</string>
+    <string name="double_angle_quotes">!text/double_raqm_laqm</string>
 </resources>
diff --git a/tools/maketext/res/values-hu/donottranslate-more-keys.xml b/tools/maketext/res/values-hu/donottranslate-more-keys.xml
index 4825910..ce2f5d0 100644
--- a/tools/maketext/res/values-hu/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-hu/donottranslate-more-keys.xml
@@ -59,4 +59,8 @@
          U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
          U+016B: "ū" LATIN SMALL LETTER U WITH MACRON -->
     <string name="more_keys_for_u">&#x00FA;,&#x00FC;,&#x0171;,&#x00FB;,&#x00F9;,&#x016B;</string>
+    <string name="single_quotes">!text/single_9qm_rqm</string>
+    <string name="double_quotes">!text/double_9qm_rqm</string>
+    <string name="single_angle_quotes">!text/single_raqm_laqm</string>
+    <string name="double_angle_quotes">!text/double_raqm_laqm</string>
 </resources>
diff --git a/tools/maketext/res/values-is/donottranslate-more-keys.xml b/tools/maketext/res/values-is/donottranslate-more-keys.xml
index 284aae9..4b4d986 100644
--- a/tools/maketext/res/values-is/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-is/donottranslate-more-keys.xml
@@ -70,4 +70,6 @@
     <string name="keylabel_for_nordic_row2_10">&#x00E6;</string>
     <!-- U+00FE: "þ" LATIN SMALL LETTER THORN -->
     <string name="keylabel_for_nordic_row2_11">&#x00FE;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
 </resources>
diff --git a/tools/maketext/res/values-iw/donottranslate-more-keys.xml b/tools/maketext/res/values-iw/donottranslate-more-keys.xml
index 20b4c6a..64d4227 100644
--- a/tools/maketext/res/values-iw/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-iw/donottranslate-more-keys.xml
@@ -37,24 +37,18 @@
          U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
          U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-         The following characters don't need BIDI mirroring.
+         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -->
+    <string name="more_keys_for_less_than">!fixedColumnOrder!3,&#x2039;|&#x203A;,&#x2264;|&#x2265;,&#x00AB;|&#x00BB;</string>
+    <string name="more_keys_for_greater_than">!fixedColumnOrder!3,&#x203A;|&#x2039;,&#x2265;|&#x2264;,&#x00BB;|&#x00AB;</string>
+    <!-- The following characters don't need BIDI mirroring.
          U+2018: "‘" LEFT SINGLE QUOTATION MARK
          U+2019: "’" RIGHT SINGLE QUOTATION MARK
          U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-         U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
          U+201C: "“" LEFT DOUBLE QUOTATION MARK
          U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-         U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-         U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-    <string name="more_keys_for_less_than">!fixedColumnOrder!3,&#x2039;|&#x203A;,&#x2264;|&#x2265;,&#x00AB;|&#x00BB;</string>
-    <string name="more_keys_for_greater_than">!fixedColumnOrder!3,&#x203A;|&#x2039;,&#x2265;|&#x2264;,&#x00BB;|&#x00AB;</string>
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-    <!-- <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string> -->
-    <string name="more_keys_for_double_quote">!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-    <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string> -->
-    <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-    <!-- U+20AA: "₪" NEW SHEQEL SIGN -->
-    <string name="keylabel_for_currency_generic">&#x20AA;</string>
+         U+201E: "„" DOUBLE LOW-9 QUOTATION MARK -->
+    <string name="single_quotes">&#x2018;,&#x2019;,&#x201A;</string>
+    <string name="double_quotes">&#x201C;,&#x201D;,&#x201E;</string>
+    <string name="single_angle_quotes">!text/single_laqm_raqm_rtl</string>
+    <string name="double_angle_quotes">!text/double_laqm_raqm_rtl</string>
 </resources>
diff --git a/tools/maketext/res/values-ka/donottranslate-more-keys.xml b/tools/maketext/res/values-ka/donottranslate-more-keys.xml
index c516c59..8c2add4 100644
--- a/tools/maketext/res/values-ka/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-ka/donottranslate-more-keys.xml
@@ -23,4 +23,6 @@
          U+10D1: "ბ" GEORGIAN LETTER BAN
          U+10D2: "გ" GEORGIAN LETTER GAN -->
     <string name="label_to_alpha_key">&#x10D0;&#x10D1;&#x10D2;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
 </resources>
diff --git a/tools/maketext/res/values-lt/donottranslate-more-keys.xml b/tools/maketext/res/values-lt/donottranslate-more-keys.xml
index 1491d95..7e2b8a0 100644
--- a/tools/maketext/res/values-lt/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-lt/donottranslate-more-keys.xml
@@ -104,4 +104,6 @@
     <!-- U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
          U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE -->
     <string name="more_keys_for_g">&#x0123;,&#x011F;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
 </resources>
diff --git a/tools/maketext/res/values-lv/donottranslate-more-keys.xml b/tools/maketext/res/values-lv/donottranslate-more-keys.xml
index d0a4448..c64e37b 100644
--- a/tools/maketext/res/values-lv/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-lv/donottranslate-more-keys.xml
@@ -103,4 +103,6 @@
     <!-- U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
          U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE -->
     <string name="more_keys_for_g">&#x0123;,&#x011F;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
 </resources>
diff --git a/tools/maketext/res/values-mk/donottranslate-more-keys.xml b/tools/maketext/res/values-mk/donottranslate-more-keys.xml
index d0fa1e4..2db75c8 100644
--- a/tools/maketext/res/values-mk/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-mk/donottranslate-more-keys.xml
@@ -35,18 +35,6 @@
          U+0411: "Б" CYRILLIC CAPITAL LETTER BE
          U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
     <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
-    <!-- U+2018: "‘" LEFT SINGLE QUOTATION MARK
-         U+2019: "’" RIGHT SINGLE QUOTATION MARK
-         U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-         U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-         U+201C: "“" LEFT DOUBLE QUOTATION MARK
-         U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-         U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-         U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
-    <!-- <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string> -->
-    <string name="more_keys_for_double_quote">!fixedColumnOrder!5,&#x201E;,&#x201C;,&#x201D;,&#x00AB;,&#x00BB;</string>
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
-    <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string> -->
-    <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!5,&#x201E;,&#x201C;,&#x201D;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
 </resources>
diff --git a/tools/maketext/res/values-nb/donottranslate-more-keys.xml b/tools/maketext/res/values-nb/donottranslate-more-keys.xml
index 49e6d5f..2cecb5e 100644
--- a/tools/maketext/res/values-nb/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-nb/donottranslate-more-keys.xml
@@ -57,4 +57,6 @@
     <string name="more_keys_for_nordic_row2_10">&#x00F6;</string>
     <!-- U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS -->
     <string name="more_keys_for_nordic_row2_11">&#x00E4;</string>
+    <string name="single_quotes">!text/single_9qm_rqm</string>
+    <string name="double_quotes">!text/double_9qm_rqm</string>
 </resources>
diff --git a/tools/maketext/res/values-nl/donottranslate-more-keys.xml b/tools/maketext/res/values-nl/donottranslate-more-keys.xml
index 73768af..e5d8295 100644
--- a/tools/maketext/res/values-nl/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-nl/donottranslate-more-keys.xml
@@ -63,4 +63,6 @@
     <string name="more_keys_for_n">&#x00F1;,&#x0144;</string>
     <!-- U+0133: "ij" LATIN SMALL LIGATURE IJ -->
     <string name="more_keys_for_y">&#x0133;</string>
+    <string name="single_quotes">!text/single_9qm_rqm</string>
+    <string name="double_quotes">!text/double_9qm_rqm</string>
 </resources>
diff --git a/tools/maketext/res/values-pl/donottranslate-more-keys.xml b/tools/maketext/res/values-pl/donottranslate-more-keys.xml
index 0f8a59b..b5cf6a0 100644
--- a/tools/maketext/res/values-pl/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-pl/donottranslate-more-keys.xml
@@ -62,4 +62,6 @@
     <string name="more_keys_for_z">&#x017C;,&#x017A;,&#x017E;</string>
     <!-- U+0142: "ł" LATIN SMALL LETTER L WITH STROKE -->
     <string name="more_keys_for_l">&#x0142;</string>
+    <string name="single_quotes">!text/single_9qm_rqm</string>
+    <string name="double_quotes">!text/double_9qm_rqm</string>
 </resources>
diff --git a/tools/maketext/res/values-ro/donottranslate-more-keys.xml b/tools/maketext/res/values-ro/donottranslate-more-keys.xml
index 44613cf..f399eb2 100644
--- a/tools/maketext/res/values-ro/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-ro/donottranslate-more-keys.xml
@@ -42,4 +42,6 @@
     <string name="more_keys_for_s">&#x0219;,&#x00DF;,&#x015B;,&#x0161;</string>
     <!-- U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW -->
     <string name="more_keys_for_t">&#x021B;</string>
+    <string name="single_quotes">!text/single_9qm_rqm</string>
+    <string name="double_quotes">!text/double_9qm_rqm</string>
 </resources>
diff --git a/tools/maketext/res/values-ru/donottranslate-more-keys.xml b/tools/maketext/res/values-ru/donottranslate-more-keys.xml
index bb47fec..f62c90f 100644
--- a/tools/maketext/res/values-ru/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-ru/donottranslate-more-keys.xml
@@ -37,4 +37,6 @@
          U+0411: "Б" CYRILLIC CAPITAL LETTER BE
          U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
     <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
 </resources>
diff --git a/tools/maketext/res/values-sk/donottranslate-more-keys.xml b/tools/maketext/res/values-sk/donottranslate-more-keys.xml
index f6e1e8d..2ed538e 100644
--- a/tools/maketext/res/values-sk/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-sk/donottranslate-more-keys.xml
@@ -104,4 +104,8 @@
     <!-- U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
          U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE -->
     <string name="more_keys_for_g">&#x0123;,&#x011F;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
+    <string name="single_angle_quotes">!text/single_raqm_laqm</string>
+    <string name="double_angle_quotes">!text/double_raqm_laqm</string>
 </resources>
diff --git a/tools/maketext/res/values-sl/donottranslate-more-keys.xml b/tools/maketext/res/values-sl/donottranslate-more-keys.xml
index ccff2ac..1e5d1d7 100644
--- a/tools/maketext/res/values-sl/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-sl/donottranslate-more-keys.xml
@@ -27,4 +27,8 @@
     <string name="more_keys_for_d">&#x0111;</string>
     <!-- U+017E: "ž" LATIN SMALL LETTER Z WITH CARON -->
     <string name="more_keys_for_z">&#x017E;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
+    <string name="single_angle_quotes">!text/single_raqm_laqm</string>
+    <string name="double_angle_quotes">!text/double_raqm_laqm</string>
 </resources>
diff --git a/tools/maketext/res/values-sr/donottranslate-more-keys.xml b/tools/maketext/res/values-sr/donottranslate-more-keys.xml
index c41ca95..c00d2a6 100644
--- a/tools/maketext/res/values-sr/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-sr/donottranslate-more-keys.xml
@@ -54,18 +54,8 @@
          U+0411: "Б" CYRILLIC CAPITAL LETTER BE
          U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
     <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
-    <!-- U+2018: "‘" LEFT SINGLE QUOTATION MARK
-         U+2019: "’" RIGHT SINGLE QUOTATION MARK
-         U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-         U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-         U+201C: "“" LEFT DOUBLE QUOTATION MARK
-         U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-         U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-         U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
-    <!-- <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string> -->
-    <string name="more_keys_for_double_quote">!fixedColumnOrder!5,&#x201E;,&#x201C;,&#x201D;,&#x00AB;,&#x00BB;</string>
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
-    <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string> -->
-    <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!5,&#x201E;,&#x201C;,&#x201D;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
+    <string name="single_angle_quotes">!text/single_raqm_laqm</string>
+    <string name="double_angle_quotes">!text/double_raqm_laqm</string>
 </resources>
diff --git a/tools/maketext/res/values-sv/donottranslate-more-keys.xml b/tools/maketext/res/values-sv/donottranslate-more-keys.xml
index d479191..a36a13e 100644
--- a/tools/maketext/res/values-sv/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-sv/donottranslate-more-keys.xml
@@ -51,4 +51,6 @@
     <string name="more_keys_for_nordic_row2_10">&#x00F8;</string>
     <!-- U+00E6: "æ" LATIN SMALL LETTER AE -->
     <string name="more_keys_for_nordic_row2_11">&#x00E6;</string>
+    <string name="single_angle_quotes">!text/single_raqm_laqm</string>
+    <string name="double_angle_quotes">!text/double_raqm_laqm</string>
 </resources>
diff --git a/tools/maketext/res/values-uk/donottranslate-more-keys.xml b/tools/maketext/res/values-uk/donottranslate-more-keys.xml
index 09e246b..cc05cc6 100644
--- a/tools/maketext/res/values-uk/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values-uk/donottranslate-more-keys.xml
@@ -41,4 +41,6 @@
          U+0411: "Б" CYRILLIC CAPITAL LETTER BE
          U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
     <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
+    <string name="single_quotes">!text/single_9qm_lqm</string>
+    <string name="double_quotes">!text/double_9qm_lqm</string>
 </resources>
diff --git a/tools/maketext/res/values/donottranslate-more-keys.xml b/tools/maketext/res/values/donottranslate-more-keys.xml
index a5be348..c2b7513 100644
--- a/tools/maketext/res/values/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values/donottranslate-more-keys.xml
@@ -62,13 +62,10 @@
     <string name="more_keys_for_cyrillic_i"></string>
     <!-- Label for "switch to alphabetic" key. -->
     <string name="label_to_alpha_key">ABC</string>
-    <string name="more_keys_for_single_quote">!fixedColumnOrder!4,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
-    <!-- <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;</string> -->
-    <string name="more_keys_for_double_quote">!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x00AB;,&#x00BB;</string>
-    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
-    <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string> -->
-    <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
+    <string name="single_quotes">!text/single_lqm_rqm</string>
+    <string name="double_quotes">!text/double_lqm_rqm</string>
+    <string name="single_angle_quotes">!text/single_laqm_raqm</string>
+    <string name="double_angle_quotes">!text/double_laqm_raqm</string>
     <!-- U+00A2: "¢" CENT SIGN
          U+00A3: "£" POUND SIGN
          U+20AC: "€" EURO SIGN
@@ -99,16 +96,7 @@
          U+2264: "≤" LESS-THAN OR EQUAL TO
          U+2265: "≥" GREATER-THAN EQUAL TO
          U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-         U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-         The following characters don't need BIDI mirroring.
-         U+2018: "‘" LEFT SINGLE QUOTATION MARK
-         U+2019: "’" RIGHT SINGLE QUOTATION MARK
-         U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-         U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
-         U+201C: "“" LEFT DOUBLE QUOTATION MARK
-         U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-         U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-         U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+         U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
     <string name="more_keys_for_less_than">!fixedColumnOrder!3,&#x2039;,&#x2264;,&#x00AB;</string>
     <string name="more_keys_for_greater_than">!fixedColumnOrder!3,&#x203A;,&#x2265;,&#x00BB;</string>
     <string name="more_keys_for_arabic_diacritics"></string>
@@ -218,4 +206,43 @@
     <!-- popular web domains for the locale - most popular, displayed on the keyboard -->
     <string name="more_keys_for_popular_domain">"!hasLabels!,.net,.org,.gov,.edu"</string>
     <string name="more_keys_for_smiley">"!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ "</string>
+    <!-- U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+         U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+         U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+         The following characters don't need BIDI mirroring.
+         U+2018: "‘" LEFT SINGLE QUOTATION MARK
+         U+2019: "’" RIGHT SINGLE QUOTATION MARK
+         U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+         U+201C: "“" LEFT DOUBLE QUOTATION MARK
+         U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+         U+201E: "„" DOUBLE LOW-9 QUOTATION MARK -->
+    <!-- Abbreviations are:
+         laqm: LEFT-POINTING ANGLE QUOTATION MARK
+         raqm: RIGHT-POINTING ANGLE QUOTATION MARK
+         rtl: Right-To-Left script order
+         lqm: LEFT QUOTATION MARK
+         rqm: RIGHT QUOTATION MARK
+         9qm: LOW-9 QUOTATION MARK -->
+    <!--  The following each quotation mark pair consist of
+            <opening quotation mark>, <closing quotation mark>
+          and is named after (single|double)_<opening quotation mark>_<closing quotation mark>. -->
+    <string name="single_laqm_raqm">&#x2039;,&#x203A;</string>
+    <string name="single_laqm_raqm_rtl">&#x2039;|&#x203A;,&#x203A;|&#x2039;</string>
+    <string name="single_raqm_laqm">&#x203A;,&#x2039;</string>
+    <string name="double_laqm_raqm">&#x00AB;,&#x00BB;</string>
+    <string name="double_laqm_raqm_rtl">&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
+    <string name="double_raqm_laqm">&#x00BB;,&#x00AB;</string>
+    <!-- The following each quotation mark triplet consists of
+           <another quotation mark>, <opening quotation mark>, <closing quotation mark>
+         and is named after (single|double)_<opening quotation mark>_<closing quotation mark>. -->
+    <string name="single_lqm_rqm">&#x201A;,&#x2018;,&#x2019;</string>
+    <string name="single_9qm_lqm">&#x2019;,&#x201A;,&#x2018;</string>
+    <string name="single_9qm_rqm">&#x2018;,&#x201A;,&#x2019;</string>
+    <string name="double_lqm_rqm">&#x201E;,&#x201C;,&#x201D;</string>
+    <string name="double_9qm_lqm">&#x201D;,&#x201E;,&#x201C;</string>
+    <string name="double_9qm_rqm">&#x201C;,&#x201E;,&#x201D;</string>
+    <string name="more_keys_for_single_quote">!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes</string>
+    <string name="more_keys_for_double_quote">!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes</string>
+    <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes</string>
 </resources>