aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/res/values-af/strings.xml4
-rw-r--r--java/res/values-am/strings.xml4
-rw-r--r--java/res/values-ar/strings.xml4
-rw-r--r--java/res/values-az-rAZ/strings.xml8
-rw-r--r--java/res/values-bg/strings.xml4
-rw-r--r--java/res/values-ca/strings.xml4
-rw-r--r--java/res/values-cs/strings.xml8
-rw-r--r--java/res/values-da/strings.xml8
-rw-r--r--java/res/values-de/strings.xml4
-rw-r--r--java/res/values-el/strings.xml4
-rw-r--r--java/res/values-en-rGB/strings.xml4
-rw-r--r--java/res/values-en-rIN/strings.xml4
-rw-r--r--java/res/values-es-rUS/strings.xml4
-rw-r--r--java/res/values-es/strings.xml4
-rw-r--r--java/res/values-et-rEE/strings.xml8
-rw-r--r--java/res/values-fa/strings.xml8
-rw-r--r--java/res/values-fi/strings.xml8
-rw-r--r--java/res/values-fr-rCA/strings.xml8
-rw-r--r--java/res/values-fr/strings.xml8
-rw-r--r--java/res/values-hi/strings.xml8
-rw-r--r--java/res/values-hr/strings.xml8
-rw-r--r--java/res/values-hu/strings.xml8
-rw-r--r--java/res/values-hy-rAM/strings.xml4
-rw-r--r--java/res/values-in/strings.xml8
-rw-r--r--java/res/values-it/strings.xml4
-rw-r--r--java/res/values-iw/strings.xml4
-rw-r--r--java/res/values-ja/strings.xml8
-rw-r--r--java/res/values-ka-rGE/strings.xml8
-rw-r--r--java/res/values-km-rKH/strings.xml8
-rw-r--r--java/res/values-ko/strings.xml8
-rw-r--r--java/res/values-lo-rLA/strings.xml4
-rw-r--r--java/res/values-lt/strings.xml8
-rw-r--r--java/res/values-lv/strings.xml8
-rw-r--r--java/res/values-mn-rMN/strings.xml4
-rw-r--r--java/res/values-ms-rMY/strings.xml8
-rw-r--r--java/res/values-nb/strings.xml8
-rw-r--r--java/res/values-ne-rNP/strings.xml8
-rw-r--r--java/res/values-nl/strings.xml4
-rw-r--r--java/res/values-pl/strings.xml4
-rw-r--r--java/res/values-pt-rPT/strings.xml4
-rw-r--r--java/res/values-pt/strings.xml8
-rw-r--r--java/res/values-ro/strings.xml8
-rw-r--r--java/res/values-ru/strings.xml8
-rw-r--r--java/res/values-sk/strings.xml8
-rw-r--r--java/res/values-sl/strings.xml8
-rw-r--r--java/res/values-sr/strings.xml8
-rw-r--r--java/res/values-sv/strings.xml4
-rw-r--r--java/res/values-sw/strings.xml8
-rw-r--r--java/res/values-th/strings.xml8
-rw-r--r--java/res/values-tl/strings.xml8
-rw-r--r--java/res/values-tr/strings.xml8
-rw-r--r--java/res/values-uk/strings.xml4
-rw-r--r--java/res/values-vi/strings.xml8
-rw-r--r--java/res/values-zh-rCN/strings.xml8
-rw-r--r--java/res/values-zh-rHK/strings.xml8
-rw-r--r--java/res/values-zh-rTW/strings.xml8
-rw-r--r--java/res/values-zu/strings.xml4
-rw-r--r--java/res/values/attrs.xml5
-rw-r--r--java/res/xml-sw600dp/key_styles_common.xml9
-rw-r--r--java/res/xml/key_styles_common.xml3
-rw-r--r--java/src/com/android/inputmethod/keyboard/Key.java29
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java1
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java11
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java26
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java77
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java7
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java13
-rw-r--r--java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java15
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java5
-rw-r--r--java/src/com/android/inputmethod/latin/Suggest.java47
-rw-r--r--java/src/com/android/inputmethod/latin/SuggestedWords.java22
-rw-r--r--java/src/com/android/inputmethod/latin/define/ProductionFlag.java3
-rw-r--r--java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java3
-rw-r--r--java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java18
-rw-r--r--java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java53
-rw-r--r--java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java30
-rw-r--r--java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java4
-rw-r--r--java/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java26
-rw-r--r--java/src/com/android/inputmethod/latin/makedict/Word.java100
-rw-r--r--java/src/com/android/inputmethod/latin/makedict/WordProperty.java164
-rw-r--r--java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java6
-rw-r--r--java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java6
-rw-r--r--java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java4
-rw-r--r--java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java99
-rw-r--r--java/src/com/android/inputmethod/latin/utils/WordProperty.java127
85 files changed, 886 insertions, 395 deletions
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index e19ddb6be..793a7170b 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Kies \'n woordeboeklêer om te installeer"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Moet hierdie lêer regtig vir <xliff:g id="LOCALE_NAME">%s</xliff:g> geïnstalleer word?"</string>
<string name="error" msgid="8940763624668513648">"Daar was \'n fout"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Gooi kontaktewoordeboek weg"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Gooi persoonlike woordeboek weg"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Gooi gebruikergeskiedeniswoordeboek weg"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Gooi personaliseringwoordeboek weg"</string>
<string name="button_default" msgid="3988017840431881491">"Verstek"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Welkom by <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"met Gebaar-tik"</string>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
index 7f73f894f..eb7023ed8 100644
--- a/java/res/values-am/strings.xml
+++ b/java/res/values-am/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"የሚጭኑት የመዝገበ-ቃላት ፋይል ይምረጡ"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"እውን ይሄ ፋይል ለ<xliff:g id="LOCALE_NAME">%s</xliff:g> ይጫን?"</string>
<string name="error" msgid="8940763624668513648">"ስህተት ተከስቶ ነበር"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"የእውቂያዎች መዝገበ-ቃላትን ያራግፉ"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"የግል መዝገበ-ቃላትን ያራግፉ"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"የተጠቃሚ ታሪክ መዝገበ-ቃላትን ያራግፉ"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"የግላዊነት ማላበሻ መዝገበ-ቃላትን ያራግፉ"</string>
<string name="button_default" msgid="3988017840431881491">"ነባሪ"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"እንኳን ወደ <xliff:g id="APPLICATION_NAME">%s</xliff:g> በደህና መጡ"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"በጣት ምልክት መተየብ"</string>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index 22d91b2a4..d9dcb0dc5 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"تحديد ملف قاموس للتثبيت"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"هل تريد حقًا تثبيت هذا الملف للغة <xliff:g id="LOCALE_NAME">%s</xliff:g>؟"</string>
<string name="error" msgid="8940763624668513648">"حدث خطأ"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"تفريغ معجم جهات الاتصال"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"تفريغ المعجم الشخصي"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"تفريغ معجم سجل المستخدم"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"تفريغ معجم التخصيص"</string>
<string name="button_default" msgid="3988017840431881491">"الافتراضية"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"مرحبا بكم في <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"مع الكتابة بالإشارة"</string>
diff --git a/java/res/values-az-rAZ/strings.xml b/java/res/values-az-rAZ/strings.xml
index b3c93e0d1..87b849f41 100644
--- a/java/res/values-az-rAZ/strings.xml
+++ b/java/res/values-az-rAZ/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Yükləmək üçün lüğət faylı seçin"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Bu faylı həqiqətən <xliff:g id="LOCALE_NAME">%s</xliff:g> adlı yerə quraşdıraq?"</string>
<string name="error" msgid="8940763624668513648">"Xəta var idi"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Defolt"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> təbiqinə xoş gəlmisiniz"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"Jest Yazısı ilə"</string>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index c23c8efbd..908815130 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Изберете файл за речника, който да инсталирате"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Наистина ли да се инсталира този файл за <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Възникна грешка"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Разтоварване на речника с контакти"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Разтоварване на частния речник"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Речник с потреб. ист.: Разтоварване"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Речник за персонализ.: Разтоварване"</string>
<string name="button_default" msgid="3988017840431881491">"Стандартни"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Добре дошли в/ъв <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"с въвеждане чрез жест"</string>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index 79382fd00..7b93aaf9b 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecció d\'un fitxer de diccionari per instal·lar"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Realment vols instal·lar aquest fitxer per a <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"S\'ha produït un error"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Esborrar el diccionari de contactes"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Esborrar el diccionari personal"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Esborrar dicc. d\'histor. d\'usuaris"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Esborrar diccionari de personalitz."</string>
<string name="button_default" msgid="3988017840431881491">"Predeterminat"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Et donem la benvinguda a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"amb Escriptura gestual"</string>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index 016f2e78a..2eaa171b2 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vyberte soubor slovníku k instalaci"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Chcete nainstalovat tento soubor pro jazyk <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Došlo k chybě"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Výchozí"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Vítá vás <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"s psaním gesty"</string>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index 81f91d395..9569e6c3c 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vælg den ordbog, som du vil installere"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Er du klar til at installere denne fil til <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Der opstod en fejl"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Standard"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Velkommen til <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"med glidende indtastning"</string>
diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml
index a80f065a2..7365d81df 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Wörterbuchdatei zum Installieren auswählen"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Möchten Sie diese Datei für <xliff:g id="LOCALE_NAME">%s</xliff:g> installieren?"</string>
<string name="error" msgid="8940763624668513648">"Es ist ein Fehler aufgetreten"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Kontaktwörterbuch sichern"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Persönliches Wörterbuch sichern"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Nutzerverlaufswörterbuch sichern"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Personalisierungswörterbuch sichern"</string>
<string name="button_default" msgid="3988017840431881491">"Standard"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Willkommen bei <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"mit Bewegungseingabe"</string>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index 6e92be014..41b983f99 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Επιλογή αρχείου λεξικού για εγκατάσταση"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Να εγκατασταθεί όντως αυτό το αρχείο για <xliff:g id="LOCALE_NAME">%s</xliff:g>;"</string>
<string name="error" msgid="8940763624668513648">"Παρουσιάστηκε σφάλμα."</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Αποτύπωση λεξικού επαφών"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Αποτύπωση προσωπικού λεξικού"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Αποτύπωση λεξικού ιστορικού χρήστη"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Αποτύπωση λεξικού εξατομίκευσης"</string>
<string name="button_default" msgid="3988017840431881491">"Προεπιλογή"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Καλώς ορίσατε στο <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"με Πληκτρολόγηση με κίνηση"</string>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index 6b50f9b8e..718bf70ff 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Select a dictionary file to install"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Really install this file for <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"There was an error"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Dump contacts dictionary"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Dump personal dictionary"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Dump user history dictionary"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Dump personalisation dictionary"</string>
<string name="button_default" msgid="3988017840431881491">"Default"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Welcome to <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"with Gesture Typing"</string>
diff --git a/java/res/values-en-rIN/strings.xml b/java/res/values-en-rIN/strings.xml
index 6b50f9b8e..718bf70ff 100644
--- a/java/res/values-en-rIN/strings.xml
+++ b/java/res/values-en-rIN/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Select a dictionary file to install"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Really install this file for <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"There was an error"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Dump contacts dictionary"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Dump personal dictionary"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Dump user history dictionary"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Dump personalisation dictionary"</string>
<string name="button_default" msgid="3988017840431881491">"Default"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Welcome to <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"with Gesture Typing"</string>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index 88d366f45..bd1e512a6 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Seleccionar archivo de diccionario para instalar"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"¿Realmente quieres instalar este archivo para <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Se produjo un error."</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Volcar diccionario de contactos"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Volcar diccionario personal"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Volcar diccionario hist. usuario"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Volcar diccionario personalización"</string>
<string name="button_default" msgid="3988017840431881491">"Predeterminado"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Te damos la bienvenida a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"con escritura gestual"</string>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index c94e5e730..d189af2f8 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecciona un archivo de diccionario para instalar"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"¿Seguro que quieres instalar este archivo para <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Se ha producido un error"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Volcar diccionario de contactos"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Volcar diccionario personal"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Volcar diccionario historial usuario"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Volcar diccionario personalización"</string>
<string name="button_default" msgid="3988017840431881491">"Predeterminado"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Te damos la bienvenida a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"con escritura gestual"</string>
diff --git a/java/res/values-et-rEE/strings.xml b/java/res/values-et-rEE/strings.xml
index 65baeb22f..71f8ddf67 100644
--- a/java/res/values-et-rEE/strings.xml
+++ b/java/res/values-et-rEE/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Installitava sõnastikufaili valimine"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Kas soovite tõesti installida faili lokaadile <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Ilmnes viga"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Vaikeväärtus"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Tere tulemast rakendusse <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"joonistusega sisestamisega"</string>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index 7f747c307..0852cc9bc 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -173,6 +173,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"یک فایل فرهنگ لغت برای نصب انتخاب کنید"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"این فایل واقعاً برای <xliff:g id="LOCALE_NAME">%s</xliff:g> نصب شود؟"</string>
<string name="error" msgid="8940763624668513648">"خطایی روی داد"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"پیش‌فرض"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"به <xliff:g id="APPLICATION_NAME">%s</xliff:g> خوش آمدید"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"با ورودی اشاره‌ای"</string>
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
index bb09eb1d8..f50b7cbc7 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Valitse asennettava sanakirjatiedosto"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Haluatko asentaa tämä tiedoston kielelle <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Tapahtui virhe"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Oletusarvot"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Tervetuloa käyttämään sovellusta <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"ja piirtokirjoitus"</string>
diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml
index d0649004b..7d00e3ce2 100644
--- a/java/res/values-fr-rCA/strings.xml
+++ b/java/res/values-fr-rCA/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Sélectionner un fichier de dictionnaire à installer"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Installer ce fichier pour la langue \"<xliff:g id="LOCALE_NAME">%s</xliff:g>\" ?"</string>
<string name="error" msgid="8940763624668513648">"Une erreur s\'est produite"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Par défaut"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Bienvenue dans <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"avec la saisie gestuelle"</string>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index 84fb4f8bf..638ec5b43 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Sélectionner un fichier de dictionnaire à installer"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Installer ce fichier pour la langue \"<xliff:g id="LOCALE_NAME">%s</xliff:g>\" ?"</string>
<string name="error" msgid="8940763624668513648">"Une erreur s\'est produite"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Par défaut"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Bienvenue dans <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"avec la saisie gestuelle"</string>
diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml
index 487e65d46..60fefb0f3 100644
--- a/java/res/values-hi/strings.xml
+++ b/java/res/values-hi/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"इंस्टॉल करने के लिए कोई शब्दकोश फ़ाइल चुनें"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"<xliff:g id="LOCALE_NAME">%s</xliff:g> के लिए वास्तव में यह फ़ाइल इंस्टॉल करें?"</string>
<string name="error" msgid="8940763624668513648">"कोई त्रुटि हुई थी"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"सामान्य"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> में आपका स्वागत है"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"हावभाव लेखन के साथ"</string>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index 8f3f86312..ba3306011 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Odabir datoteke rječnika za instaliranje"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Želite li doista instalirati ovu datoteku za <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Došlo je do pogreške"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Zadano"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Dobro došli u aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"s Pisanjem kretnjama"</string>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index 16bf050d9..12d831e83 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Válasszon ki egy szótárfájlt a telepítéshez."</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Valóban telepíti ezt a fájlt <xliff:g id="LOCALE_NAME">%s</xliff:g> nyelvhez?"</string>
<string name="error" msgid="8940763624668513648">"Hiba történt."</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Alapértelmezett"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Üdvözli a(z) <xliff:g id="APPLICATION_NAME">%s</xliff:g>!"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"kézmozdulatokkal történő bevitellel"</string>
diff --git a/java/res/values-hy-rAM/strings.xml b/java/res/values-hy-rAM/strings.xml
index 2c9c3cd0a..13c43ea30 100644
--- a/java/res/values-hy-rAM/strings.xml
+++ b/java/res/values-hy-rAM/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Ընտրեք բառարանային ֆայլը տեղադրման համար"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Իրո՞ք ուզում եք տեղադրել այս ֆայլը <xliff:g id="LOCALE_NAME">%s</xliff:g>-ում:"</string>
<string name="error" msgid="8940763624668513648">"Տեղի է ունեցել սխալ"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Բեռնել կոնտակտների բառարանը"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Բեռնել անձնական բառարանը"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Բեռնել օգտվողի պատմության բառարանը"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Բեռնել անհատականացման բառարանը"</string>
<string name="button_default" msgid="3988017840431881491">"Լռելյայնը"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Բարի գալուստ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"Ժեստային մուտքագրմամբ"</string>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 4f69df96f..992c488b1 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pilih file kamus untuk dipasang"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Yakin ingin memasang file ini untuk <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Terjadi kesalahan"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Default"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Selamat datang di <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"dengan Ketikan Isyarat"</string>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index 35fb56110..c2fde7343 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Seleziona un file di dizionario da installare"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Installare questo file per <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Si è verificato un errore"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Scarica dizionario contatti"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Scarica dizionario personale"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Scarica dizionario cronologia utente"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Scarica dizionario di personalizz."</string>
<string name="button_default" msgid="3988017840431881491">"Predefinito"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Benvenuto in <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"con la Digitazione gestuale"</string>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 5240c39df..694d8561a 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"בחירת קובץ מילון להתקנה"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"האם באמת להתקין את הקובץ הזה עבור <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"אירעה שגיאה"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"מחק את מילון אנשי הקשר"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"מחק מילון אישי"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"מחק את המילון של היסטוריית המשתמשים"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"מחק את מילון ההתאמה האישית"</string>
<string name="button_default" msgid="3988017840431881491">"ברירת מחדל"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"ברוך הבא אל <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"עם הקלדת החלקה"</string>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index 6617a275c..077e39063 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"インストールする辞書ファイルの選択"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"この<xliff:g id="LOCALE_NAME">%s</xliff:g>のファイルをインストールしてもよろしいですか?"</string>
<string name="error" msgid="8940763624668513648">"エラーが発生しました"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"デフォルト"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>へようこそ"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"新しいジェスチャー入力をお試しください"</string>
diff --git a/java/res/values-ka-rGE/strings.xml b/java/res/values-ka-rGE/strings.xml
index 18c9a4035..caa544191 100644
--- a/java/res/values-ka-rGE/strings.xml
+++ b/java/res/values-ka-rGE/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ინსტალაციისათვის აირჩიეთ ლექსიკონის ფაილი"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"ნამდვილად გსურთ ამ ფაილის <xliff:g id="LOCALE_NAME">%s</xliff:g>-ისთვის ინსტალაცია?"</string>
<string name="error" msgid="8940763624668513648">"წარმოიშვა შეცდომა"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"ნაგულისხმევი"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"კეთილი იყოს თქვენი მობრძანება <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ში"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"ჟესტებით წერით"</string>
diff --git a/java/res/values-km-rKH/strings.xml b/java/res/values-km-rKH/strings.xml
index 498240645..2bc6470ba 100644
--- a/java/res/values-km-rKH/strings.xml
+++ b/java/res/values-km-rKH/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ជ្រើស​ឯកសារ​វចនានុក្រម​ ដើម្បី​ដំឡើង"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"ពិត​ជា​ដំឡើង​ឯកសារ​នេះ​សម្រាប់ <xliff:g id="LOCALE_NAME">%s</xliff:g> ឬ?"</string>
<string name="error" msgid="8940763624668513648">"មាន​កំហុស"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"លំនាំដើម"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"សូម​ស្វាគមន៍​មក​កាន់ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"ជាមួយ​​​ការ​វាយ​បញ្ចូល​ដោយ​ប្រើ​​​កាយវិការ"</string>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index 2639bf745..e760d963e 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"설치할 사전 파일 선택"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"이 파일을 <xliff:g id="LOCALE_NAME">%s</xliff:g>(으)로 설치하시겠습니까?"</string>
<string name="error" msgid="8940763624668513648">"오류 발생"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"기본값"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>에 오신 것을 환영합니다."</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"제스처 타이핑 사용"</string>
diff --git a/java/res/values-lo-rLA/strings.xml b/java/res/values-lo-rLA/strings.xml
index e8e413640..483d2b1ef 100644
--- a/java/res/values-lo-rLA/strings.xml
+++ b/java/res/values-lo-rLA/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ເລືອກໄຟລ໌ວັດຈະນານຸກົມເພື່ອຕິດຕັ້ງ"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"ຕິດຕັ້ງໄຟລ໌ນີ້ສຳລັບ <xliff:g id="LOCALE_NAME">%s</xliff:g> ແທ້ບໍ່?"</string>
<string name="error" msgid="8940763624668513648">"ມີຂໍ້ຜິດພາດເກີດຂຶ້ນ"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"ເທຂໍ້ມູນວັດຈະນານຸກົມລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"ເທຂໍ້ມູນວັດຈະນານຸກົມສ່ວນໂຕ"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"ເທຂໍ້ມູນວັດຈະນານຸກົມປະຫວັດຜູ່ໃຊ້"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"ເທຂໍ້ມູນວັດຈະນານຸກົມຄວາມເປັນໂຕຕົນ"</string>
<string name="button_default" msgid="3988017840431881491">"ຄ່າເລີ່ມຕົ້ນ"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"ຍິນ​ດີ​ຕ້ອນ​ຮັບສູ່ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"ດ້ວຍການພິມແບບ Gesture"</string>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index 8d35e46fe..cfd136ea0 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pasirinkite diegiamą žodyno failą"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Ar tikrai įdiegti šį failą <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Įvyko klaida"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Numatytieji"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Sveiki! Tai „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"naudojant įvestį gestais"</string>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
index d764e2c6e..7eb0500f0 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Instalējamā vārdnīcas faila atlasīšana"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Vai instalēt šo failu šādai valodai: <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Radās kļūda"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Noklusējums"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Laipni lūdzam pakalpojumā <xliff:g id="APPLICATION_NAME">%s</xliff:g>,"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"kurā varat izmantot ievadi ar žestiem"</string>
diff --git a/java/res/values-mn-rMN/strings.xml b/java/res/values-mn-rMN/strings.xml
index cd3192f68..c71cff334 100644
--- a/java/res/values-mn-rMN/strings.xml
+++ b/java/res/values-mn-rMN/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Суулгах толь бичгийн файлыг сонгоно уу"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"<xliff:g id="LOCALE_NAME">%s</xliff:g>-д зориулсан энэ файлыг үнэхээр суулгах уу?"</string>
<string name="error" msgid="8940763624668513648">"Алдаа гарсан"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Харилцагчдын толь бичгийг хаях"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Хувийн толь бичгийг хаях"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Хэрэглэгчийн түүхийн толь бичгийг хаях"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Хувийн тохиргоотой толь бичгийг хаях"</string>
<string name="button_default" msgid="3988017840431881491">"Үндсэн"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Та <xliff:g id="APPLICATION_NAME">%s</xliff:g>-д тавтай морилно уу"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"Зангаагаар бичихээр"</string>
diff --git a/java/res/values-ms-rMY/strings.xml b/java/res/values-ms-rMY/strings.xml
index 364cfcab4..f55dcc272 100644
--- a/java/res/values-ms-rMY/strings.xml
+++ b/java/res/values-ms-rMY/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pilih fail kamus untuk dipasang"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Betul-betul pasang fail ini untuk <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Berlaku ralat"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Lalai"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Selamat datang ke <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"dengan Taipan Gerak Isyarat"</string>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index 91d4c54e5..735841c4f 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Velg ordboksfilen du vil installere"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Vil du virkelig installere denne filen for <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Det oppsto en feil"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Standard"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Velkommen til <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"med Ordføring"</string>
diff --git a/java/res/values-ne-rNP/strings.xml b/java/res/values-ne-rNP/strings.xml
index 168806e77..b487cb71a 100644
--- a/java/res/values-ne-rNP/strings.xml
+++ b/java/res/values-ne-rNP/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"स्थापना गर्न कुनै शब्दकोश फाइल चयन गर्नुहोस्"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"<xliff:g id="LOCALE_NAME">%s</xliff:g>का लागि साँच्चिकै यो फाइल स्थापना गर्ने हो?"</string>
<string name="error" msgid="8940763624668513648">"कुनै त्रुटि भयो"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"पूर्वनिर्धारित"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"तपाईँलाई स्वागत छ<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"इशारा टाइप गर्नेसँग"</string>
diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
index 123d2b55f..abb68db85 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecteer een woordenboekbestand om te installeren"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Wilt u dit bestand voor <xliff:g id="LOCALE_NAME">%s</xliff:g> echt installeren?"</string>
<string name="error" msgid="8940763624668513648">"Er is een fout opgetreden"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Contactenwoordenboek dumpen"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Persoonlijk woordenboek dumpen"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Woordenb. gebruikersgesch. dumpen"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Personalisatiewoordenboek dumpen"</string>
<string name="button_default" msgid="3988017840431881491">"Standaard"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Welkom bij <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"met Invoer met bewegingen"</string>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index 306c86f66..1fce7c67c 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Wybierz plik słownika do zainstalowania"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Czy na pewno zainstalować ten plik dla języka: <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Wystąpił błąd"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Zrzut słownika kontaktów"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Zrzut słownika osobistego"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Zrzut słownika historii użytkownika"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Zrzut słownika personalizacji"</string>
<string name="button_default" msgid="3988017840431881491">"Domyślne"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Witamy w aplikacji <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"z pisaniem gestami"</string>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 844c4189e..aed5ad354 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecione um ficheiro de dicionário para instalar"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Instalar mesmo este ficheiro para <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Ocorreu um erro"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Descarregar dicionário de contactos"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Descarregar dicionário pessoal"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Desc. dicion. do hist. do utiliz."</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Descarregar dicionário de personal."</string>
<string name="button_default" msgid="3988017840431881491">"Predefinido"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Bem-vindo(a) a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"com a Escrita com Gestos"</string>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index 27e5e0faf..65ab5ca84 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecione um arquivo de dicionário para instalar"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Deseja instalar este arquivo para <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Ocorreu um erro"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Padrão"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Bem-vindo ao <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"com entrada por gestos"</string>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index e9a26ff75..6dd5f840f 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selectați un fișier dicționar de instalat"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Doriți să instalați acest fișier pentru <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"A apărut o eroare"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Prestabilit"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Bun venit la <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"cu Tastarea gestuală"</string>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index 526e297e5..787eb9966 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Выберите файл словаря"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Установить этот файл для следующего языка: <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Ошибка"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"По умолчанию"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Представляем приложение \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\""</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"с непрерывным вводом"</string>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index 309e08001..9bcd26a39 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vyberte súbor slovníka, ktorý chcete nainštalovať"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Chcete nainštalovať tento súbor pre jazyk <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Vyskytla sa chyba"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Predvolené"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Vitajte v aplikácii <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"s funkciou Písanie gestami"</string>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
index 5ce458a1d..fe40b9752 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Izberite datoteko slovarja, ki jo želite namestiti"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Zares želite namestiti to datoteko za jezik <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Prišlo je do napake"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Privzeto"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Pozdravljeni v aplikaciji <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"s pisanjem s kretnjami"</string>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index 4f5b254f2..26a964b79 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Избор датотеке речника за инсталирање"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Желите ли стварно да инсталирате ову датотеку за <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Дошло је до грешке"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Подразумевано"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Добро дошли у <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"помоћу Куцања покретима"</string>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index c02884749..82338c766 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Välj en ordboksfil att installera"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Vill du verkligen installera filen för <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Ett fel uppstod"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Dumpa ordlista för kontakter"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Dumpa personlig ordlista"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Dumpa ordlista för användarhistorik"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Dumpa anpassad ordlista"</string>
<string name="button_default" msgid="3988017840431881491">"Standard"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Välkommen till <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"med svepskrivning"</string>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
index c8858c24b..222aa1f21 100644
--- a/java/res/values-sw/strings.xml
+++ b/java/res/values-sw/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Chagua faili ya kamusi ya kusakinisha"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Isakinishe faili hii kwa <xliff:g id="LOCALE_NAME">%s</xliff:g> kweli?"</string>
<string name="error" msgid="8940763624668513648">"Kulikuwa na hitilafu"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Chaguo-msingi"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Karibu kwenye <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"kwa Kuandika kwa ishara"</string>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index 0ba43ed9b..d9bd470b8 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"เลือกไฟล์พจนานุกรมที่จะติดตั้ง"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"ติดตั้งไฟล์นี้สำหรับ <xliff:g id="LOCALE_NAME">%s</xliff:g> จริงๆ หรือ"</string>
<string name="error" msgid="8940763624668513648">"เกิดข้อผิดพลาด"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"ค่าเริ่มต้น"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"ยินดีต้อนรับสู่ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"พร้อมการป้อนข้อมูลด้วยท่าทาง"</string>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index bec32e875..7b8ed4b62 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pumili ng file ng diksyunaryo na ii-install"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"I-install talaga ang file na ito para sa <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Nagkaroon ng error"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Default"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Maligayang pagdating sa <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"gamit ang Gesture na Pag-type"</string>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index 32d5f91cd..c4f796b8b 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Yüklemek için bir sözlük dosyası seçin"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"<xliff:g id="LOCALE_NAME">%s</xliff:g> için bu dosya gerçekten yüklensin mi?"</string>
<string name="error" msgid="8940763624668513648">"Bir hata oluştu"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Varsayılan"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> uygulamasına hoş geldiniz"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"Hareketle Yazmayı içerir"</string>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 7eb3ca6f5..ef2eafec4 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Вибрати файл словника, який потрібно встановити"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Справді встановити цей файл для такої мови: <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Сталася помилка"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Дамп словника контактів"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Дамп особистого словника"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Дамп словника історії користувача"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Дамп словника персоналізації"</string>
<string name="button_default" msgid="3988017840431881491">"За умовчанням"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Вітаємо в програмі <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"з функцією Ввід жестами"</string>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index f71e83e04..4ac6bd14c 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Chọn tệp từ điển để cài đặt"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Thực sự cài đặt tệp này cho <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string>
<string name="error" msgid="8940763624668513648">"Đã xảy ra lỗi"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"Mặc định"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Chào mừng bạn đến với <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"với Nhập bằng cử chỉ"</string>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index 367f85a60..fe1f321b6 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"选择要安装的词典文件"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"确定要为<xliff:g id="LOCALE_NAME">%s</xliff:g>安装此文件吗?"</string>
<string name="error" msgid="8940763624668513648">"出现错误"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"默认"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"欢迎使用 <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"体验顺畅的滑行输入体验"</string>
diff --git a/java/res/values-zh-rHK/strings.xml b/java/res/values-zh-rHK/strings.xml
index 96b8506bd..d8394863b 100644
--- a/java/res/values-zh-rHK/strings.xml
+++ b/java/res/values-zh-rHK/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"選取要安裝的字典檔案"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"準備好要為<xliff:g id="LOCALE_NAME">%s</xliff:g>版本安裝這個檔案嗎?"</string>
<string name="error" msgid="8940763624668513648">"發生錯誤"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"預設"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"歡迎使用「<xliff:g id="APPLICATION_NAME">%s</xliff:g>」"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"配備觸控輸入功能"</string>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index 4af6c2299..019960e72 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -169,6 +169,14 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"選取要安裝的字典檔案"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"準備為<xliff:g id="LOCALE_NAME">%s</xliff:g>版本安裝這個檔案嗎?"</string>
<string name="error" msgid="8940763624668513648">"發生錯誤"</string>
+ <!-- no translation found for prefs_dump_contacts_dict (7227327764402323097) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_dict (294870685041741951) -->
+ <skip />
+ <!-- no translation found for prefs_dump_user_history_dict (6821075152449554628) -->
+ <skip />
+ <!-- no translation found for prefs_dump_personalization_dict (7558387996151745284) -->
+ <skip />
<string name="button_default" msgid="3988017840431881491">"預設"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"歡迎使用 <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"含滑行輸入功能"</string>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index 561a65a6f..eaacaea94 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -169,6 +169,10 @@
<string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Khetha ifayela lesichazamazwi ukuze ulifake"</string>
<string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Ufuna ukufakela i-<xliff:g id="LOCALE_NAME">%s</xliff:g> leli fayela ngokweqiniso?"</string>
<string name="error" msgid="8940763624668513648">"Kube nephutha"</string>
+ <string name="prefs_dump_contacts_dict" msgid="7227327764402323097">"Lahla isichazamazwi soxhumana nabo"</string>
+ <string name="prefs_dump_user_dict" msgid="294870685041741951">"Lahla isichazamazwi somuntu siqu"</string>
+ <string name="prefs_dump_user_history_dict" msgid="6821075152449554628">"Lahla isichazamazwi somlando womsebenzisi"</string>
+ <string name="prefs_dump_personalization_dict" msgid="7558387996151745284">"Lahla isichazamazwi sokwenza kube ngokwakho"</string>
<string name="button_default" msgid="3988017840431881491">"Okuzenzakalelayo"</string>
<string name="setup_welcome_title" msgid="6112821709832031715">"Siyakwamukela ku-<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="setup_welcome_additional_description" msgid="8150252008545768953">"nokuthayipha ngokuthinta"</string>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index a9474a03a..5bedd4ac2 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -240,6 +240,7 @@
</declare-styleable>
<declare-styleable name="Keyboard_Key">
+ <!-- TODO: Remove code attribute and consolidate with keySpec. -->
<!-- The unicode value that this key outputs.
Code value represented in hexadecimal prefixed with "0x" or code value reference using
"!code/<code_name>" notation. -->
@@ -275,8 +276,7 @@
<flag name="altCodeWhileTyping" value="0x04" />
<flag name="enableLongPress" value="0x08" />
</attr>
- <!-- The string of characters to output when this key is pressed. -->
- <attr name="keyOutputText" format="string" />
+ <!-- TODO: Rename keyLabel to keySpec. -->
<!-- The label to display on the key. -->
<attr name="keyLabel" format="string" />
<!-- The hint label to display on the key in conjunction with the label. -->
@@ -318,6 +318,7 @@
<!-- If true, disable additionalMoreKeys. -->
<flag name="disableAdditionalMoreKeys" value="0x80000000" />
</attr>
+ <!-- TODO: Remove keyIcon attribute and consolidate with keySpec. -->
<!-- The icon to display on the key instead of the label. -->
<attr name="keyIcon" format="string" />
<!-- The icon for disabled key -->
diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index d817add11..4e4579b4f 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -101,12 +101,6 @@
latin:keyLabelFlags="hasPopupHint"
latin:keyActionFlags="noKeyPreview" />
<key-style
- latin:styleName="smileyKeyStyle"
- latin:keyLabel=":-)"
- latin:keyOutputText=":-) "
- latin:keyLabelFlags="hasPopupHint|preserveCase"
- latin:moreKeys="!text/more_keys_for_smiley" />
- <key-style
latin:styleName="shortcutKeyStyle"
latin:code="!code/key_shortcut"
latin:keyIcon="!icon/shortcut_key"
@@ -190,8 +184,7 @@
latin:parentStyle="baseForLayoutSwitchKeyStyle" />
<key-style
latin:styleName="comKeyStyle"
- latin:keyLabel="!text/keylabel_for_popular_domain"
+ latin:keyLabel="!text/keylabel_for_popular_domain|!text/keylabel_for_popular_domain"
latin:keyLabelFlags="autoXScale|fontNormal|hasPopupHint|preserveCase"
- latin:keyOutputText="!text/keylabel_for_popular_domain"
latin:moreKeys="!text/more_keys_for_popular_domain" />
</merge>
diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index d538eb8c3..9c40d627a 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -184,9 +184,8 @@
latin:parentStyle="baseForToSymbolKeyStyle" />
<key-style
latin:styleName="comKeyStyle"
- latin:keyLabel="!text/keylabel_for_popular_domain"
+ latin:keyLabel="!text/keylabel_for_popular_domain|!text/keylabel_for_popular_domain"
latin:keyLabelFlags="autoXScale|fontNormal|hasPopupHint|preserveCase"
- latin:keyOutputText="!text/keylabel_for_popular_domain"
latin:moreKeys="!text/more_keys_for_popular_domain"
latin:backgroundType="functional" />
</merge>
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index f7eec6b43..1b9007da2 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -267,12 +267,6 @@ public class Key implements Comparable<Key> {
R.styleable.Keyboard_Key_visualInsetsLeft, baseWidth, baseWidth, 0));
final int visualInsetsRight = Math.round(keyAttr.getFraction(
R.styleable.Keyboard_Key_visualInsetsRight, baseWidth, baseWidth, 0));
- mIconId = KeySpecParser.getIconId(style.getString(keyAttr,
- R.styleable.Keyboard_Key_keyIcon));
- final int disabledIconId = KeySpecParser.getIconId(style.getString(keyAttr,
- R.styleable.Keyboard_Key_keyIconDisabled));
- final int previewIconId = KeySpecParser.getIconId(style.getString(keyAttr,
- R.styleable.Keyboard_Key_keyIconPreview));
mLabelFlags = style.getFlags(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags)
| row.getDefaultKeyLabelFlags();
@@ -321,8 +315,21 @@ public class Key implements Comparable<Key> {
}
mActionFlags = actionFlags;
- final int code = KeySpecParser.parseCode(style.getString(keyAttr,
+ final String keySpec = style.getString(keyAttr, R.styleable.Keyboard_Key_keyLabel);
+
+ final int iconIdInAttr = KeySpecParser.getIconId(style.getString(keyAttr,
+ R.styleable.Keyboard_Key_keyIcon));
+ mIconId = (iconIdInAttr != ICON_UNDEFINED) ? iconIdInAttr
+ : KeySpecParser.getIconId(keySpec);
+ final int disabledIconId = KeySpecParser.getIconId(style.getString(keyAttr,
+ R.styleable.Keyboard_Key_keyIconDisabled));
+ final int previewIconId = KeySpecParser.getIconId(style.getString(keyAttr,
+ R.styleable.Keyboard_Key_keyIconPreview));
+
+ final int codeInAttr = KeySpecParser.parseCode(style.getString(keyAttr,
R.styleable.Keyboard_Key_code), params.mCodesSet, CODE_UNSPECIFIED);
+ final int code = (codeInAttr != CODE_UNSPECIFIED) ? codeInAttr
+ : KeySpecParser.getCode(keySpec, params.mCodesSet);
if ((mLabelFlags & LABEL_FLAGS_FROM_CUSTOM_ACTION_LABEL) != 0) {
mLabel = params.mId.mCustomActionLabel;
} else if (code >= Character.MIN_SUPPLEMENTARY_CODE_POINT) {
@@ -331,8 +338,8 @@ public class Key implements Comparable<Key> {
// code point nor as a surrogate pair.
mLabel = new StringBuilder().appendCodePoint(code).toString();
} else {
- mLabel = StringUtils.toUpperCaseOfStringForLocale(style.getString(keyAttr,
- R.styleable.Keyboard_Key_keyLabel), needsToUpperCase, locale);
+ mLabel = StringUtils.toUpperCaseOfStringForLocale(
+ KeySpecParser.getLabel(keySpec), needsToUpperCase, locale);
}
if ((mLabelFlags & LABEL_FLAGS_DISABLE_HINT_LABEL) != 0) {
mHintLabel = null;
@@ -340,8 +347,8 @@ public class Key implements Comparable<Key> {
mHintLabel = StringUtils.toUpperCaseOfStringForLocale(style.getString(keyAttr,
R.styleable.Keyboard_Key_keyHintLabel), needsToUpperCase, locale);
}
- String outputText = StringUtils.toUpperCaseOfStringForLocale(style.getString(keyAttr,
- R.styleable.Keyboard_Key_keyOutputText), needsToUpperCase, locale);
+ String outputText = StringUtils.toUpperCaseOfStringForLocale(
+ KeySpecParser.getOutputText(keySpec), needsToUpperCase, locale);
// Choose the first letter of the label as primary code if not specified.
if (code == CODE_UNSPECIFIED && TextUtils.isEmpty(outputText)
&& !TextUtils.isEmpty(mLabel)) {
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java
index f7e43a6c2..a64f23501 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java
@@ -138,7 +138,6 @@ public final class KeyStylesSet {
readString(keyAttr, R.styleable.Keyboard_Key_code);
readString(keyAttr, R.styleable.Keyboard_Key_altCode);
readString(keyAttr, R.styleable.Keyboard_Key_keyLabel);
- readString(keyAttr, R.styleable.Keyboard_Key_keyOutputText);
readString(keyAttr, R.styleable.Keyboard_Key_keyHintLabel);
readStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys);
readStringArray(keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
index b31358f3c..47e9142e2 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
@@ -276,9 +276,9 @@ public class KeyboardBuilder<KP extends KeyboardParams> {
params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0);
params.mIconsSet.loadIcons(keyboardAttr);
- final String language = params.mId.mLocale.getLanguage();
- params.mCodesSet.setLanguage(language);
- params.mTextsSet.setLanguage(language);
+ final Locale locale = params.mId.mLocale;
+ params.mCodesSet.setLocale(locale);
+ params.mTextsSet.setLocale(locale);
final RunInLocale<Void> job = new RunInLocale<Void>() {
@Override
protected Void job(final Resources res) {
@@ -287,9 +287,8 @@ public class KeyboardBuilder<KP extends KeyboardParams> {
}
};
// Null means the current system locale.
- final Locale locale = SubtypeLocaleUtils.isNoLanguage(params.mId.mSubtype)
- ? null : params.mId.mLocale;
- job.runInLocale(mResources, locale);
+ job.runInLocale(mResources,
+ SubtypeLocaleUtils.isNoLanguage(params.mId.mSubtype) ? null : locale);
final int resourceId = keyboardAttr.getResourceId(
R.styleable.Keyboard_touchPositionCorrectionData, 0);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
index aeb4db557..9f873ed9c 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
@@ -18,20 +18,20 @@ package com.android.inputmethod.keyboard.internal;
import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import java.util.HashMap;
+import java.util.Locale;
public final class KeyboardCodesSet {
public static final String PREFIX_CODE = "!code/";
- private static final HashMap<String, int[]> sLanguageToCodesMap = CollectionUtils.newHashMap();
private static final HashMap<String, Integer> sNameToIdMap = CollectionUtils.newHashMap();
private int[] mCodes = DEFAULT;
- public void setLanguage(final String language) {
- final int[] codes = sLanguageToCodesMap.get(language);
- mCodes = (codes != null) ? codes : DEFAULT;
+ public void setLocale(final Locale locale) {
+ mCodes = SubtypeLocaleUtils.isRtlLanguage(locale) ? RTL : DEFAULT;
}
public int getCode(final String name) {
@@ -134,18 +134,6 @@ public final class KeyboardCodesSet {
CODE_LEFT_CURLY_BRACKET,
};
- private static final String LANGUAGE_DEFAULT = "DEFAULT";
- private static final String LANGUAGE_ARABIC = "ar";
- private static final String LANGUAGE_PERSIAN = "fa";
- private static final String LANGUAGE_HEBREW = "iw";
-
- private static final Object[] LANGUAGE_AND_CODES = {
- LANGUAGE_DEFAULT, DEFAULT,
- LANGUAGE_ARABIC, RTL,
- LANGUAGE_PERSIAN, RTL,
- LANGUAGE_HEBREW, RTL,
- };
-
static {
if (DEFAULT.length != RTL.length || DEFAULT.length != ID_TO_NAME.length) {
throw new RuntimeException("Internal inconsistency");
@@ -153,11 +141,5 @@ public final class KeyboardCodesSet {
for (int i = 0; i < ID_TO_NAME.length; i++) {
sNameToIdMap.put(ID_TO_NAME[i], i);
}
-
- for (int i = 0; i < LANGUAGE_AND_CODES.length; i += 2) {
- final String language = (String)LANGUAGE_AND_CODES[i];
- final int[] codes = (int[])LANGUAGE_AND_CODES[i + 1];
- sLanguageToCodesMap.put(language, codes);
- }
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
index f8c098893..4322345cb 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
@@ -25,6 +25,7 @@ import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.utils.CollectionUtils;
import java.util.HashMap;
+import java.util.Locale;
/**
* !!!!! DO NOT EDIT THIS FILE !!!!!
@@ -52,15 +53,17 @@ public final class KeyboardTextsSet {
private static final int MAX_STRING_REFERENCE_INDIRECTION = 10;
// Language to texts map.
- private static final HashMap<String, String[]> sLocaleToTextsMap = CollectionUtils.newHashMap();
+ private static final HashMap<String, String[]> sLanguageToTextsMap =
+ CollectionUtils.newHashMap();
private static final HashMap<String, Integer> sNameToIdsMap = CollectionUtils.newHashMap();
private String[] mTexts;
// Resource name to text map.
private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap();
- public void setLanguage(final String language) {
- mTexts = sLocaleToTextsMap.get(language);
+ public void setLocale(final Locale locale) {
+ final String language = locale.getLanguage();
+ mTexts = sLanguageToTextsMap.get(language);
if (mTexts == null) {
mTexts = LANGUAGE_DEFAULT;
}
@@ -309,23 +312,22 @@ public final class KeyboardTextsSet {
/* 137 */ "label_time_pm",
/* 138 */ "keylabel_for_popular_domain",
/* 139 */ "more_keys_for_popular_domain",
- /* 140 */ "more_keys_for_smiley",
- /* 141 */ "single_laqm_raqm",
- /* 142 */ "single_laqm_raqm_rtl",
- /* 143 */ "single_raqm_laqm",
- /* 144 */ "double_laqm_raqm",
- /* 145 */ "double_laqm_raqm_rtl",
- /* 146 */ "double_raqm_laqm",
- /* 147 */ "single_lqm_rqm",
- /* 148 */ "single_9qm_lqm",
- /* 149 */ "single_9qm_rqm",
- /* 150 */ "double_lqm_rqm",
- /* 151 */ "double_9qm_lqm",
- /* 152 */ "double_9qm_rqm",
- /* 153 */ "more_keys_for_single_quote",
- /* 154 */ "more_keys_for_double_quote",
- /* 155 */ "more_keys_for_tablet_double_quote",
- /* 156 */ "emoji_key_as_more_key",
+ /* 140 */ "single_laqm_raqm",
+ /* 141 */ "single_laqm_raqm_rtl",
+ /* 142 */ "single_raqm_laqm",
+ /* 143 */ "double_laqm_raqm",
+ /* 144 */ "double_laqm_raqm_rtl",
+ /* 145 */ "double_raqm_laqm",
+ /* 146 */ "single_lqm_rqm",
+ /* 147 */ "single_9qm_lqm",
+ /* 148 */ "single_9qm_rqm",
+ /* 149 */ "double_lqm_rqm",
+ /* 150 */ "double_9qm_lqm",
+ /* 151 */ "double_9qm_rqm",
+ /* 152 */ "more_keys_for_single_quote",
+ /* 153 */ "more_keys_for_double_quote",
+ /* 154 */ "more_keys_for_tablet_double_quote",
+ /* 155 */ "emoji_key_as_more_key",
};
private static final String EMPTY = "";
@@ -477,7 +479,6 @@ public final class KeyboardTextsSet {
/* 138 */ ".com",
// popular web domains for the locale - most popular, displayed on the keyboard
/* 139 */ "!hasLabels!,.net,.org,.gov,.edu",
- /* 140 */ "!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
@@ -499,25 +500,25 @@ public final class KeyboardTextsSet {
// 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>.
- /* 141 */ "\u2039,\u203A",
- /* 142 */ "\u2039|\u203A,\u203A|\u2039",
- /* 143 */ "\u203A,\u2039",
- /* 144 */ "\u00AB,\u00BB",
- /* 145 */ "\u00AB|\u00BB,\u00BB|\u00AB",
- /* 146 */ "\u00BB,\u00AB",
+ /* 140 */ "\u2039,\u203A",
+ /* 141 */ "\u2039|\u203A,\u203A|\u2039",
+ /* 142 */ "\u203A,\u2039",
+ /* 143 */ "\u00AB,\u00BB",
+ /* 144 */ "\u00AB|\u00BB,\u00BB|\u00AB",
+ /* 145 */ "\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>.
- /* 147 */ "\u201A,\u2018,\u2019",
- /* 148 */ "\u2019,\u201A,\u2018",
- /* 149 */ "\u2018,\u201A,\u2019",
- /* 150 */ "\u201E,\u201C,\u201D",
- /* 151 */ "\u201D,\u201E,\u201C",
- /* 152 */ "\u201C,\u201E,\u201D",
- /* 153 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
- /* 154 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
- /* 155 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
- /* 156 */ "!icon/emoji_key|!code/key_emoji",
+ /* 146 */ "\u201A,\u2018,\u2019",
+ /* 147 */ "\u2019,\u201A,\u2018",
+ /* 148 */ "\u2018,\u201A,\u2019",
+ /* 149 */ "\u201E,\u201C,\u201D",
+ /* 150 */ "\u201D,\u201E,\u201C",
+ /* 151 */ "\u201C,\u201E,\u201D",
+ /* 152 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
+ /* 153 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
+ /* 154 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
+ /* 155 */ "!icon/emoji_key|!code/key_emoji",
};
/* Language af: Afrikaans */
@@ -3649,7 +3650,7 @@ public final class KeyboardTextsSet {
for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
final String language = (String)LANGUAGES_AND_TEXTS[i];
final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
- sLocaleToTextsMap.put(language, texts);
+ sLanguageToTextsMap.put(language, texts);
}
}
}
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index b20bcd1f9..013f9220a 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -26,12 +26,12 @@ import com.android.inputmethod.latin.makedict.DictionaryHeader;
import com.android.inputmethod.latin.makedict.FormatSpec;
import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions;
import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
+import com.android.inputmethod.latin.makedict.WordProperty;
import com.android.inputmethod.latin.settings.NativeSuggestOptions;
import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.JniUtils;
import com.android.inputmethod.latin.utils.LanguageModelParam;
import com.android.inputmethod.latin.utils.StringUtils;
-import com.android.inputmethod.latin.utils.WordProperty;
import java.io.File;
import java.util.ArrayList;
@@ -217,9 +217,8 @@ public final class BinaryDictionary extends Dictionary {
outAttributeValues.get(i));
attributes.put(attributeKey, attributeValue);
}
- final boolean hasHistoricalInfo =
- attributes.get(DictionaryHeader.HAS_HISTORICAL_INFO_KEY).equals(
- DictionaryHeader.ATTRIBUTE_VALUE_TRUE);
+ final boolean hasHistoricalInfo = DictionaryHeader.ATTRIBUTE_VALUE_TRUE.equals(
+ attributes.get(DictionaryHeader.HAS_HISTORICAL_INFO_KEY));
return new DictionaryHeader(outHeaderSize[0], new DictionaryOptions(attributes),
new FormatSpec.FormatOptions(outFormatVersion[0], hasHistoricalInfo));
}
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java
index e68c6b771..259c1372e 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java
@@ -430,12 +430,19 @@ public class DictionaryFacilitatorForSuggest {
public void getSuggestions(final WordComposer composer,
final String prevWord, final ProximityInfo proximityInfo,
final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
- final int sessionId, final Set<SuggestedWordInfo> suggestionSet) {
+ final int sessionId, final Set<SuggestedWordInfo> suggestionSet,
+ final ArrayList<SuggestedWordInfo> rawSuggestions) {
for (final String key : mDictionaries.keySet()) {
final Dictionary dictionary = mDictionaries.get(key);
if (null == dictionary) continue;
- suggestionSet.addAll(dictionary.getSuggestionsWithSessionId(composer, prevWord,
- proximityInfo, blockOffensiveWords, additionalFeaturesOptions, sessionId));
+ final ArrayList<SuggestedWordInfo> dictionarySuggestions =
+ dictionary.getSuggestionsWithSessionId(composer, prevWord, proximityInfo,
+ blockOffensiveWords, additionalFeaturesOptions, sessionId);
+ if (null == dictionarySuggestions) continue;
+ suggestionSet.addAll(dictionarySuggestions);
+ if (null != rawSuggestions) {
+ rawSuggestions.addAll(dictionarySuggestions);
+ }
}
}
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index 565d6a1f9..c2451ce8d 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -23,13 +23,15 @@ import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.keyboard.ProximityInfo;
import com.android.inputmethod.latin.makedict.DictionaryHeader;
import com.android.inputmethod.latin.makedict.FormatSpec;
+import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
+import com.android.inputmethod.latin.makedict.WordProperty;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.utils.AsyncResultHolder;
import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.utils.CombinedFormatUtils;
import com.android.inputmethod.latin.utils.FileUtils;
import com.android.inputmethod.latin.utils.LanguageModelParam;
import com.android.inputmethod.latin.utils.PrioritizedSerialExecutor;
-import com.android.inputmethod.latin.utils.WordProperty;
import java.io.File;
import java.util.ArrayList;
@@ -750,7 +752,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
// TODO: Implement BinaryDictionary.isInDictionary().
@UsedForTesting
- public boolean isInDictionaryForTests(final String word) {
+ public boolean isInUnderlyingBinaryDictionaryForTests(final String word) {
final AsyncResultHolder<Boolean> holder = new AsyncResultHolder<Boolean>();
getExecutor(mDictName).executePrioritized(new Runnable() {
@Override
@@ -785,7 +787,14 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
getExecutor(mDictName).execute(new Runnable() {
@Override
public void run() {
- Log.d(TAG, "dictionary=" + mDictName);
+ Log.d(TAG, "Dump dictionary: " + mDictName);
+ try {
+ final DictionaryHeader header = mBinaryDictionary.getHeader();
+ Log.d(TAG, CombinedFormatUtils.formatAttributeMap(
+ header.mDictionaryOptions.mAttributes));
+ } catch (final UnsupportedFormatException e) {
+ Log.d(TAG, "Cannot fetch header information.", e);
+ }
int token = 0;
do {
final BinaryDictionary.GetNextWordPropertyResult result =
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index e55c08dae..3b427720a 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -620,6 +620,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
ResearchLogger.getInstance().onDestroy();
}
unregisterReceiver(mDictionaryPackInstallReceiver);
+ unregisterReceiver(mDictionaryDumpBroadcastReceiver);
PersonalizationDictionarySessionRegistrar.close(this);
LatinImeLogger.commit();
LatinImeLogger.onDestroy();
@@ -997,7 +998,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
SuggestedWords.getFromApplicationSpecifiedCompletions(
applicationSpecifiedCompletions);
final SuggestedWords suggestedWords = new SuggestedWords(
- applicationSuggestedWords,
+ applicationSuggestedWords, null /* rawSuggestions */,
false /* typedWordValid */,
false /* willAutoCorrect */,
false /* isPunctuationSuggestions */,
@@ -1417,7 +1418,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
? SuggestedWords.EMPTY : previousSuggestedWords;
final ArrayList<SuggestedWords.SuggestedWordInfo> typedWordAndPreviousSuggestions =
SuggestedWords.getTypedWordAndPreviousSuggestions(typedWord, oldSuggestedWords);
- return new SuggestedWords(typedWordAndPreviousSuggestions,
+ return new SuggestedWords(typedWordAndPreviousSuggestions, null /* rawSuggestions */,
false /* typedWordValid */,
false /* hasAutoCorrectionCandidate */,
false /* isPunctuationSuggestions */,
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 439c8562e..5e74d75b0 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -20,6 +20,7 @@ import android.text.TextUtils;
import com.android.inputmethod.keyboard.ProximityInfo;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.define.ProductionFlag;
import com.android.inputmethod.latin.utils.AutoCorrectionUtils;
import com.android.inputmethod.latin.utils.BoundedTreeSet;
import com.android.inputmethod.latin.utils.CollectionUtils;
@@ -51,7 +52,6 @@ public final class Suggest {
private static final int SUPPRESS_SUGGEST_THRESHOLD = -2000000000;
private static final boolean DBG = LatinImeLogger.sDBG;
-
public final DictionaryFacilitatorForSuggest mDictionaryFacilitator;
private float mAutoCorrectionThreshold;
@@ -124,24 +124,40 @@ public final class Suggest {
} else {
wordComposerForLookup = wordComposer;
}
+ final ArrayList<SuggestedWordInfo> rawSuggestions;
+ if (ProductionFlag.INCLUDE_RAW_SUGGESTIONS) {
+ rawSuggestions = CollectionUtils.newArrayList();
+ } else {
+ rawSuggestions = null;
+ }
mDictionaryFacilitator.getSuggestions(wordComposerForLookup, prevWordForBigram,
proximityInfo, blockOffensiveWords, additionalFeaturesOptions, SESSION_TYPING,
- suggestionsSet);
+ suggestionsSet, rawSuggestions);
+ final String firstSuggestion;
final String whitelistedWord;
if (suggestionsSet.isEmpty()) {
- whitelistedWord = null;
- } else if (SuggestedWordInfo.KIND_WHITELIST != suggestionsSet.first().mKind) {
- whitelistedWord = null;
+ whitelistedWord = firstSuggestion = null;
} else {
- whitelistedWord = suggestionsSet.first().mWord;
+ final SuggestedWordInfo firstSuggestedWordInfo = suggestionsSet.first();
+ firstSuggestion = firstSuggestedWordInfo.mWord;
+ if (SuggestedWordInfo.KIND_WHITELIST != firstSuggestedWordInfo.mKind) {
+ whitelistedWord = null;
+ } else {
+ whitelistedWord = firstSuggestion;
+ }
}
- // The word can be auto-corrected if it has a whitelist entry that is not itself,
- // or if it's a 2+ characters non-word (i.e. it's not in the dictionary).
+ // We allow auto-correction if we have a whitelisted word, or if the word is not a valid
+ // word of more than 1 char, except if the first suggestion is the same as the typed string
+ // because in this case if it's strong enough to auto-correct that will mistakenly designate
+ // the second candidate for auto-correction.
+ // TODO: stop relying on indices to find where is the auto-correction in the suggested
+ // words, and correct this test.
final boolean allowsToBeAutoCorrected = (null != whitelistedWord
&& !whitelistedWord.equals(consideredWord))
|| (consideredWord.length() > 1 && !mDictionaryFacilitator.isValidWord(
- consideredWord, wordComposer.isFirstCharCapitalized()));
+ consideredWord, wordComposer.isFirstCharCapitalized())
+ && !consideredWord.equals(firstSuggestion));
final boolean hasAutoCorrection;
// TODO: using isCorrectionEnabled here is not very good. It's probably useless, because
@@ -205,7 +221,7 @@ public final class Suggest {
suggestionsList = suggestionsContainer;
}
- callback.onGetSuggestedWords(new SuggestedWords(suggestionsList,
+ callback.onGetSuggestedWords(new SuggestedWords(suggestionsList, rawSuggestions,
// TODO: this first argument is lying. If this is a whitelisted word which is an
// actual word, it says typedWordValid = false, which looks wrong. We should either
// rename the attribute or change the value.
@@ -225,8 +241,15 @@ public final class Suggest {
final OnGetSuggestedWordsCallback callback) {
final BoundedTreeSet suggestionsSet = new BoundedTreeSet(sSuggestedWordInfoComparator,
SuggestedWords.MAX_SUGGESTIONS);
+ final ArrayList<SuggestedWordInfo> rawSuggestions;
+ if (ProductionFlag.INCLUDE_RAW_SUGGESTIONS) {
+ rawSuggestions = CollectionUtils.newArrayList();
+ } else {
+ rawSuggestions = null;
+ }
mDictionaryFacilitator.getSuggestions(wordComposer, prevWordForBigram, proximityInfo,
- blockOffensiveWords, additionalFeaturesOptions, sessionId, suggestionsSet);
+ blockOffensiveWords, additionalFeaturesOptions, sessionId, suggestionsSet,
+ rawSuggestions);
for (SuggestedWordInfo wordInfo : suggestionsSet) {
LatinImeLogger.onAddSuggestedWord(wordInfo.mWord, wordInfo.mSourceDict.mDictType);
}
@@ -263,7 +286,7 @@ public final class Suggest {
// In the batch input mode, the most relevant suggested word should act as a "typed word"
// (typedWordValid=true), not as an "auto correct word" (willAutoCorrect=false).
- callback.onGetSuggestedWords(new SuggestedWords(suggestionsContainer,
+ callback.onGetSuggestedWords(new SuggestedWords(suggestionsContainer, rawSuggestions,
true /* typedWordValid */,
false /* willAutoCorrect */,
false /* isPunctuationSuggestions */,
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index dbaf822e4..b2efc4a86 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -37,7 +37,7 @@ public final class SuggestedWords {
private static final ArrayList<SuggestedWordInfo> EMPTY_WORD_INFO_LIST =
CollectionUtils.newArrayList(0);
public static final SuggestedWords EMPTY = new SuggestedWords(
- EMPTY_WORD_INFO_LIST, false, false, false, false, false);
+ EMPTY_WORD_INFO_LIST, null /* rawSuggestions */, false, false, false, false, false);
public final String mTypedWord;
public final boolean mTypedWordValid;
@@ -50,25 +50,29 @@ public final class SuggestedWords {
public final boolean mIsPrediction;
public final int mSequenceNumber; // Sequence number for auto-commit.
private final ArrayList<SuggestedWordInfo> mSuggestedWordInfoList;
+ public final ArrayList<SuggestedWordInfo> mRawSuggestions;
public SuggestedWords(final ArrayList<SuggestedWordInfo> suggestedWordInfoList,
+ final ArrayList<SuggestedWordInfo> rawSuggestions,
final boolean typedWordValid,
final boolean willAutoCorrect,
final boolean isPunctuationSuggestions,
final boolean isObsoleteSuggestions,
final boolean isPrediction) {
- this(suggestedWordInfoList, typedWordValid, willAutoCorrect, isPunctuationSuggestions,
- isObsoleteSuggestions, isPrediction, NOT_A_SEQUENCE_NUMBER);
+ this(suggestedWordInfoList, rawSuggestions, typedWordValid, willAutoCorrect,
+ isPunctuationSuggestions, isObsoleteSuggestions, isPrediction,
+ NOT_A_SEQUENCE_NUMBER);
}
public SuggestedWords(final ArrayList<SuggestedWordInfo> suggestedWordInfoList,
+ final ArrayList<SuggestedWordInfo> rawSuggestions,
final boolean typedWordValid,
final boolean willAutoCorrect,
final boolean isPunctuationSuggestions,
final boolean isObsoleteSuggestions,
final boolean isPrediction,
final int sequenceNumber) {
- this(suggestedWordInfoList,
+ this(suggestedWordInfoList, rawSuggestions,
suggestedWordInfoList.isEmpty() ? null
: suggestedWordInfoList.get(INDEX_OF_TYPED_WORD).mWord,
typedWordValid, willAutoCorrect, isPunctuationSuggestions,
@@ -76,6 +80,7 @@ public final class SuggestedWords {
}
public SuggestedWords(final ArrayList<SuggestedWordInfo> suggestedWordInfoList,
+ final ArrayList<SuggestedWordInfo> rawSuggestions,
final String typedWord,
final boolean typedWordValid,
final boolean willAutoCorrect,
@@ -84,6 +89,7 @@ public final class SuggestedWords {
final boolean isPrediction,
final int sequenceNumber) {
mSuggestedWordInfoList = suggestedWordInfoList;
+ mRawSuggestions = rawSuggestions;
mTypedWordValid = typedWordValid;
mWillAutoCorrect = willAutoCorrect;
mIsPunctuationSuggestions = isPunctuationSuggestions;
@@ -306,9 +312,9 @@ public final class SuggestedWords {
}
// We should never autocorrect, so we say the typed word is valid. Also, in this case,
// no auto-correction should take place hence willAutoCorrect = false.
- return new SuggestedWords(newSuggestions, typedWord, true /* typedWordValid */,
- false /* willAutoCorrect */, mIsPunctuationSuggestions, mIsObsoleteSuggestions,
- mIsPrediction, NOT_A_SEQUENCE_NUMBER);
+ return new SuggestedWords(newSuggestions, null /* rawSuggestions */, typedWord,
+ true /* typedWordValid */, false /* willAutoCorrect */, mIsPunctuationSuggestions,
+ mIsObsoleteSuggestions, mIsPrediction, NOT_A_SEQUENCE_NUMBER);
}
// Creates a new SuggestedWordInfo from the currently suggested words that removes all but the
@@ -326,7 +332,7 @@ public final class SuggestedWords {
info.mSourceDict, SuggestedWordInfo.NOT_AN_INDEX,
SuggestedWordInfo.NOT_A_CONFIDENCE));
}
- return new SuggestedWords(newSuggestions, mTypedWordValid,
+ return new SuggestedWords(newSuggestions, null /* rawSuggestions */, mTypedWordValid,
mWillAutoCorrect, mIsPunctuationSuggestions, mIsObsoleteSuggestions,
mIsPrediction);
}
diff --git a/java/src/com/android/inputmethod/latin/define/ProductionFlag.java b/java/src/com/android/inputmethod/latin/define/ProductionFlag.java
index dc937fb25..e6fa1cdad 100644
--- a/java/src/com/android/inputmethod/latin/define/ProductionFlag.java
+++ b/java/src/com/android/inputmethod/latin/define/ProductionFlag.java
@@ -29,4 +29,7 @@ public final class ProductionFlag {
public static final boolean USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG = false;
public static final boolean IS_HARDWARE_KEYBOARD_SUPPORTED = false;
+
+ // Include all suggestions from all dictionaries in {@link SuggestedWords#mRawSuggestions}.
+ public static final boolean INCLUDE_RAW_SUGGESTIONS = false;
}
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index 3ecf5f0fb..6e9050593 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -1332,7 +1332,8 @@ public final class InputLogic {
} else {
// We found suggestion spans in the word. We'll create the SuggestedWords out of
// them, and make willAutoCorrect false.
- final SuggestedWords suggestedWords = new SuggestedWords(suggestions, typedWord,
+ final SuggestedWords suggestedWords = new SuggestedWords(suggestions,
+ null /* rawSuggestions */, typedWord,
true /* typedWordValid */, false /* willAutoCorrect */,
false /* isPunctuationSuggestions */, false /* isObsoleteSuggestions */,
false /* isPrediction */, SuggestedWords.NOT_A_SEQUENCE_NUMBER);
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
index 369184573..782ada3f4 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
@@ -511,7 +511,7 @@ public final class BinaryDictDecoderUtils {
final WeightedString word = getWordAtPosition(dictDecoder, headerSize,
bigram.mAddress, options);
final int reconstructedFrequency =
- BinaryDictIOUtils.reconstructBigramFrequency(word.mFrequency,
+ BinaryDictIOUtils.reconstructBigramFrequency(word.getProbability(),
bigram.mFrequency);
bigrams.add(new WeightedString(word.mWord, reconstructedFrequency));
}
@@ -606,19 +606,21 @@ public final class BinaryDictDecoderUtils {
FusionDictionary newDict = new FusionDictionary(root, fileHeader.mDictionaryOptions);
if (null != dict) {
- for (final Word w : dict) {
- if (w.mIsBlacklistEntry) {
- newDict.addBlacklistEntry(w.mWord, w.mShortcutTargets, w.mIsNotAWord);
+ for (final WordProperty wordProperty : dict) {
+ if (wordProperty.mIsBlacklistEntry) {
+ newDict.addBlacklistEntry(wordProperty.mWord, wordProperty.mShortcutTargets,
+ wordProperty.mIsNotAWord);
} else {
- newDict.add(w.mWord, w.mFrequency, w.mShortcutTargets, w.mIsNotAWord);
+ newDict.add(wordProperty.mWord, wordProperty.getProbability(),
+ wordProperty.mShortcutTargets, wordProperty.mIsNotAWord);
}
}
- for (final Word w : dict) {
+ for (final WordProperty wordProperty : dict) {
// By construction a binary dictionary may not have bigrams pointing to
// words that are not also registered as unigrams so we don't have to avoid
// them explicitly here.
- for (final WeightedString bigram : w.mBigrams) {
- newDict.setBigram(w.mWord, bigram.mWord, bigram.mFrequency);
+ for (final WeightedString bigram : wordProperty.mBigrams) {
+ newDict.setBigram(wordProperty.mWord, bigram.mWord, bigram.getProbability());
}
}
}
diff --git a/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java b/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
index 5b0e8399a..e9561afd3 100644
--- a/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
+++ b/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
@@ -31,7 +31,7 @@ import java.util.LinkedList;
* A dictionary that can fusion heads and tails of words for more compression.
*/
@UsedForTesting
-public final class FusionDictionary implements Iterable<Word> {
+public final class FusionDictionary implements Iterable<WordProperty> {
private static final boolean DBG = MakedictLog.DBG;
private static int CHARACTER_NOT_FOUND_INDEX = -1;
@@ -67,29 +67,42 @@ public final class FusionDictionary implements Iterable<Word> {
}
/**
- * A string with a frequency.
+ * A string with a probability.
*
* This represents an "attribute", that is either a bigram or a shortcut.
*/
public static final class WeightedString {
public final String mWord;
- public int mFrequency;
- public WeightedString(String word, int frequency) {
+ public ProbabilityInfo mProbabilityInfo;
+
+ public WeightedString(final String word, final int probability) {
+ this(word, new ProbabilityInfo(probability));
+ }
+
+ public WeightedString(final String word, final ProbabilityInfo probabilityInfo) {
mWord = word;
- mFrequency = frequency;
+ mProbabilityInfo = probabilityInfo;
+ }
+
+ public int getProbability() {
+ return mProbabilityInfo.mProbability;
+ }
+
+ public void setProbability(final int probability) {
+ mProbabilityInfo = new ProbabilityInfo(probability);
}
@Override
public int hashCode() {
- return Arrays.hashCode(new Object[] { mWord, mFrequency });
+ return Arrays.hashCode(new Object[] { mWord, mProbabilityInfo});
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof WeightedString)) return false;
- WeightedString w = (WeightedString)o;
- return mWord.equals(w.mWord) && mFrequency == w.mFrequency;
+ final WeightedString w = (WeightedString)o;
+ return mWord.equals(w.mWord) && mProbabilityInfo.equals(w.mProbabilityInfo);
}
}
@@ -200,18 +213,18 @@ public final class FusionDictionary implements Iterable<Word> {
}
/**
- * Adds a word to the bigram list. Updates the frequency if the word already
+ * Adds a word to the bigram list. Updates the probability if the word already
* exists.
*/
- public void addBigram(final String word, final int frequency) {
+ public void addBigram(final String word, final int probability) {
if (mBigrams == null) {
mBigrams = new ArrayList<WeightedString>();
}
WeightedString bigram = getBigram(word);
if (bigram != null) {
- bigram.mFrequency = frequency;
+ bigram.setProbability(probability);
} else {
- bigram = new WeightedString(word, frequency);
+ bigram = new WeightedString(word, probability);
mBigrams.add(bigram);
}
}
@@ -273,8 +286,8 @@ public final class FusionDictionary implements Iterable<Word> {
final WeightedString existingShortcut = getShortcut(shortcut.mWord);
if (existingShortcut == null) {
mShortcutTargets.add(shortcut);
- } else if (existingShortcut.mFrequency < shortcut.mFrequency) {
- existingShortcut.mFrequency = shortcut.mFrequency;
+ } else if (existingShortcut.getProbability() < shortcut.getProbability()) {
+ existingShortcut.setProbability(shortcut.getProbability());
}
}
}
@@ -289,8 +302,8 @@ public final class FusionDictionary implements Iterable<Word> {
final WeightedString existingBigram = getBigram(bigram.mWord);
if (existingBigram == null) {
mBigrams.add(bigram);
- } else if (existingBigram.mFrequency < bigram.mFrequency) {
- existingBigram.mFrequency = bigram.mFrequency;
+ } else if (existingBigram.getProbability() < bigram.getProbability()) {
+ existingBigram.setProbability(bigram.getProbability());
}
}
}
@@ -693,7 +706,7 @@ public final class FusionDictionary implements Iterable<Word> {
*
* This is purely for convenience.
*/
- public static final class DictionaryIterator implements Iterator<Word> {
+ public static final class DictionaryIterator implements Iterator<WordProperty> {
private static final class Position {
public Iterator<PtNode> pos;
public int length;
@@ -723,7 +736,7 @@ public final class FusionDictionary implements Iterable<Word> {
}
@Override
- public Word next() {
+ public WordProperty next() {
Position currentPos = mPositions.getLast();
mCurrentString.setLength(currentPos.length);
@@ -740,7 +753,7 @@ public final class FusionDictionary implements Iterable<Word> {
mPositions.addLast(currentPos);
}
if (currentPtNode.mFrequency >= 0) {
- return new Word(mCurrentString.toString(), currentPtNode.mFrequency,
+ return new WordProperty(mCurrentString.toString(), currentPtNode.mFrequency,
currentPtNode.mShortcutTargets, currentPtNode.mBigrams,
currentPtNode.mIsNotAWord, currentPtNode.mIsBlacklistEntry);
}
@@ -766,7 +779,7 @@ public final class FusionDictionary implements Iterable<Word> {
* and say : for (Word w : x) {}
*/
@Override
- public Iterator<Word> iterator() {
+ public Iterator<WordProperty> iterator() {
return new DictionaryIterator(mRootNodeArray.mData);
}
}
diff --git a/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java b/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java
index c1a43cedf..dafbc04b9 100644
--- a/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java
+++ b/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java
@@ -17,6 +17,9 @@
package com.android.inputmethod.latin.makedict;
import com.android.inputmethod.latin.BinaryDictionary;
+import com.android.inputmethod.latin.utils.CombinedFormatUtils;
+
+import java.util.Arrays;
public final class ProbabilityInfo {
public final int mProbability;
@@ -39,8 +42,33 @@ public final class ProbabilityInfo {
mCount = count;
}
+ public boolean hasHistoricalInfo() {
+ return mTimestamp != BinaryDictionary.NOT_A_VALID_TIMESTAMP;
+ }
+
+ @Override
+ public int hashCode() {
+ if (hasHistoricalInfo()) {
+ return Arrays.hashCode(new Object[] { mProbability, mTimestamp, mLevel, mCount });
+ } else {
+ return Arrays.hashCode(new Object[] { mProbability });
+ }
+ }
+
@Override
public String toString() {
- return mTimestamp + ":" + mLevel + ":" + mCount;
+ return CombinedFormatUtils.formatProbabilityInfo(this);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) return true;
+ if (!(o instanceof ProbabilityInfo)) return false;
+ final ProbabilityInfo p = (ProbabilityInfo)o;
+ if (!hasHistoricalInfo() && !p.hasHistoricalInfo()) {
+ return mProbability == p.mProbability;
+ }
+ return mProbability == p.mProbability && mTimestamp == p.mTimestamp && mLevel == p.mLevel
+ && mCount == p.mCount;
}
} \ No newline at end of file
diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java b/java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java
index a3a6c2c34..3de083ef3 100644
--- a/java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java
+++ b/java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java
@@ -197,7 +197,7 @@ public class Ver2DictEncoder implements DictEncoder {
final WeightedString target = shortcutIterator.next();
final int shortcutFlags = BinaryDictEncoderUtils.makeShortcutFlags(
shortcutIterator.hasNext(),
- target.mFrequency);
+ target.getProbability());
mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, shortcutFlags,
FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE);
final int shortcutShift = CharEncoding.writeString(mBuffer, mPosition, target.mWord);
@@ -231,7 +231,7 @@ public class Ver2DictEncoder implements DictEncoder {
final int offset = addressOfBigram
- (mPosition + FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE);
final int bigramFlags = BinaryDictEncoderUtils.makeBigramFlags(bigramIterator.hasNext(),
- offset, bigram.mFrequency, unigramFrequencyForThisWord, bigram.mWord);
+ offset, bigram.getProbability(), unigramFrequencyForThisWord, bigram.mWord);
mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, bigramFlags,
FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE);
mPosition += BinaryDictEncoderUtils.writeChildrenPosition(mBuffer, mPosition,
diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java b/java/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java
index 4b0efbad0..147844fd8 100644
--- a/java/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java
+++ b/java/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java
@@ -71,27 +71,29 @@ public class Ver4DictEncoder implements DictEncoder {
// Somehow createEmptyDictFile returned true, but the file was not created correctly
throw new IOException("Cannot create dictionary file");
}
- for (final Word word : dict) {
+ for (final WordProperty wordProperty : dict) {
// TODO: switch to addMultipleDictionaryEntries when they support shortcuts
- if (null == word.mShortcutTargets || word.mShortcutTargets.isEmpty()) {
- binaryDict.addUnigramWord(word.mWord, word.mFrequency,
+ if (null == wordProperty.mShortcutTargets || wordProperty.mShortcutTargets.isEmpty()) {
+ binaryDict.addUnigramWord(wordProperty.mWord, wordProperty.getProbability(),
null /* shortcutTarget */, 0 /* shortcutProbability */,
- word.mIsNotAWord, word.mIsBlacklistEntry, 0 /* timestamp */);
+ wordProperty.mIsNotAWord, wordProperty.mIsBlacklistEntry,
+ 0 /* timestamp */);
} else {
- for (final WeightedString shortcutTarget : word.mShortcutTargets) {
- binaryDict.addUnigramWord(word.mWord, word.mFrequency,
- shortcutTarget.mWord, shortcutTarget.mFrequency,
- word.mIsNotAWord, word.mIsBlacklistEntry, 0 /* timestamp */);
+ for (final WeightedString shortcutTarget : wordProperty.mShortcutTargets) {
+ binaryDict.addUnigramWord(wordProperty.mWord, wordProperty.getProbability(),
+ shortcutTarget.mWord, shortcutTarget.getProbability(),
+ wordProperty.mIsNotAWord, wordProperty.mIsBlacklistEntry,
+ 0 /* timestamp */);
}
}
if (binaryDict.needsToRunGC(true /* mindsBlockByGC */)) {
binaryDict.flushWithGC();
}
}
- for (final Word word0 : dict) {
- if (null == word0.mBigrams) continue;
- for (final WeightedString word1 : word0.mBigrams) {
- binaryDict.addBigramWords(word0.mWord, word1.mWord, word1.mFrequency,
+ for (final WordProperty word0Property : dict) {
+ if (null == word0Property.mBigrams) continue;
+ for (final WeightedString word1 : word0Property.mBigrams) {
+ binaryDict.addBigramWords(word0Property.mWord, word1.mWord, word1.getProbability(),
0 /* timestamp */);
if (binaryDict.needsToRunGC(true /* mindsBlockByGC */)) {
binaryDict.flushWithGC();
diff --git a/java/src/com/android/inputmethod/latin/makedict/Word.java b/java/src/com/android/inputmethod/latin/makedict/Word.java
deleted file mode 100644
index 0eabb7bf3..000000000
--- a/java/src/com/android/inputmethod/latin/makedict/Word.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.latin.makedict;
-
-import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-/**
- * Utility class for a word with a frequency.
- *
- * This is chiefly used to iterate a dictionary.
- */
-public final class Word implements Comparable<Word> {
- public final String mWord;
- public final int mFrequency;
- public final ArrayList<WeightedString> mShortcutTargets;
- public final ArrayList<WeightedString> mBigrams;
- public final boolean mIsNotAWord;
- public final boolean mIsBlacklistEntry;
-
- private int mHashCode = 0;
-
- public Word(final String word, final int frequency,
- final ArrayList<WeightedString> shortcutTargets,
- final ArrayList<WeightedString> bigrams,
- final boolean isNotAWord, final boolean isBlacklistEntry) {
- mWord = word;
- mFrequency = frequency;
- mShortcutTargets = shortcutTargets;
- mBigrams = bigrams;
- mIsNotAWord = isNotAWord;
- mIsBlacklistEntry = isBlacklistEntry;
- }
-
- private static int computeHashCode(Word word) {
- return Arrays.hashCode(new Object[] {
- word.mWord,
- word.mFrequency,
- word.mShortcutTargets.hashCode(),
- word.mBigrams.hashCode(),
- word.mIsNotAWord,
- word.mIsBlacklistEntry
- });
- }
-
- /**
- * Three-way comparison.
- *
- * A Word x is greater than a word y if x has a higher frequency. If they have the same
- * frequency, they are sorted in lexicographic order.
- */
- @Override
- public int compareTo(Word w) {
- if (mFrequency < w.mFrequency) return 1;
- if (mFrequency > w.mFrequency) return -1;
- return mWord.compareTo(w.mWord);
- }
-
- /**
- * Equality test.
- *
- * Words are equal if they have the same frequency, the same spellings, and the same
- * attributes.
- */
- @Override
- public boolean equals(Object o) {
- if (o == this) return true;
- if (!(o instanceof Word)) return false;
- Word w = (Word)o;
- return mFrequency == w.mFrequency && mWord.equals(w.mWord)
- && mShortcutTargets.equals(w.mShortcutTargets)
- && mBigrams.equals(w.mBigrams)
- && mIsNotAWord == w.mIsNotAWord
- && mIsBlacklistEntry == w.mIsBlacklistEntry;
- }
-
- @Override
- public int hashCode() {
- if (mHashCode == 0) {
- mHashCode = computeHashCode(this);
- }
- return mHashCode;
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/makedict/WordProperty.java b/java/src/com/android/inputmethod/latin/makedict/WordProperty.java
new file mode 100644
index 000000000..b93a0a525
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/makedict/WordProperty.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.latin.makedict;
+
+import com.android.inputmethod.annotations.UsedForTesting;
+import com.android.inputmethod.latin.BinaryDictionary;
+import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
+import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.utils.CombinedFormatUtils;
+import com.android.inputmethod.latin.utils.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * Utility class for a word with a probability.
+ *
+ * This is chiefly used to iterate a dictionary.
+ */
+public final class WordProperty implements Comparable<WordProperty> {
+ public final String mWord;
+ public final ProbabilityInfo mProbabilityInfo;
+ public final ArrayList<WeightedString> mShortcutTargets;
+ public final ArrayList<WeightedString> mBigrams;
+ public final boolean mIsNotAWord;
+ public final boolean mIsBlacklistEntry;
+ public final boolean mHasShortcuts;
+ public final boolean mHasBigrams;
+
+ private int mHashCode = 0;
+
+ public WordProperty(final String word, final int probability,
+ final ArrayList<WeightedString> shortcutTargets,
+ final ArrayList<WeightedString> bigrams,
+ final boolean isNotAWord, final boolean isBlacklistEntry) {
+ mWord = word;
+ mProbabilityInfo = new ProbabilityInfo(probability);
+ mShortcutTargets = shortcutTargets;
+ mBigrams = bigrams;
+ mIsNotAWord = isNotAWord;
+ mIsBlacklistEntry = isBlacklistEntry;
+ mHasBigrams = bigrams != null && !bigrams.isEmpty();
+ mHasShortcuts = shortcutTargets != null && !shortcutTargets.isEmpty();
+ }
+
+ private static ProbabilityInfo createProbabilityInfoFromArray(final int[] probabilityInfo) {
+ return new ProbabilityInfo(
+ probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_PROBABILITY_INDEX],
+ probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_TIMESTAMP_INDEX],
+ probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_LEVEL_INDEX],
+ probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_COUNT_INDEX]);
+ }
+
+ // Construct word property using information from native code.
+ // This represents invalid word when the probability is BinaryDictionary.NOT_A_PROBABILITY.
+ public WordProperty(final int[] codePoints, final boolean isNotAWord,
+ final boolean isBlacklisted, final boolean hasBigram,
+ final boolean hasShortcuts, final int[] probabilityInfo,
+ final ArrayList<int[]> bigramTargets, final ArrayList<int[]> bigramProbabilityInfo,
+ final ArrayList<int[]> shortcutTargets,
+ final ArrayList<Integer> shortcutProbabilities) {
+ mWord = StringUtils.getStringFromNullTerminatedCodePointArray(codePoints);
+ mProbabilityInfo = createProbabilityInfoFromArray(probabilityInfo);
+ mShortcutTargets = CollectionUtils.newArrayList();
+ mBigrams = CollectionUtils.newArrayList();
+ mIsNotAWord = isNotAWord;
+ mIsBlacklistEntry = isBlacklisted;
+ mHasShortcuts = hasShortcuts;
+ mHasBigrams = hasBigram;
+
+ final int bigramTargetCount = bigramTargets.size();
+ for (int i = 0; i < bigramTargetCount; i++) {
+ final String bigramTargetString =
+ StringUtils.getStringFromNullTerminatedCodePointArray(bigramTargets.get(i));
+ mBigrams.add(new WeightedString(bigramTargetString,
+ createProbabilityInfoFromArray(bigramProbabilityInfo.get(i))));
+ }
+
+ final int shortcutTargetCount = shortcutTargets.size();
+ for (int i = 0; i < shortcutTargetCount; i++) {
+ final String shortcutTargetString =
+ StringUtils.getStringFromNullTerminatedCodePointArray(shortcutTargets.get(i));
+ mShortcutTargets.add(
+ new WeightedString(shortcutTargetString, shortcutProbabilities.get(i)));
+ }
+ }
+
+ public int getProbability() {
+ return mProbabilityInfo.mProbability;
+ }
+
+ private static int computeHashCode(WordProperty word) {
+ return Arrays.hashCode(new Object[] {
+ word.mWord,
+ word.mProbabilityInfo,
+ word.mShortcutTargets.hashCode(),
+ word.mBigrams.hashCode(),
+ word.mIsNotAWord,
+ word.mIsBlacklistEntry
+ });
+ }
+
+ /**
+ * Three-way comparison.
+ *
+ * A Word x is greater than a word y if x has a higher frequency. If they have the same
+ * frequency, they are sorted in lexicographic order.
+ */
+ @Override
+ public int compareTo(final WordProperty w) {
+ if (getProbability() < w.getProbability()) return 1;
+ if (getProbability() > w.getProbability()) return -1;
+ return mWord.compareTo(w.mWord);
+ }
+
+ /**
+ * Equality test.
+ *
+ * Words are equal if they have the same frequency, the same spellings, and the same
+ * attributes.
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) return true;
+ if (!(o instanceof WordProperty)) return false;
+ WordProperty w = (WordProperty)o;
+ return mProbabilityInfo.equals(w.mProbabilityInfo) && mWord.equals(w.mWord)
+ && mShortcutTargets.equals(w.mShortcutTargets) && mBigrams.equals(w.mBigrams)
+ && mIsNotAWord == w.mIsNotAWord && mIsBlacklistEntry == w.mIsBlacklistEntry
+ && mHasBigrams == w.mHasBigrams && mHasShortcuts && w.mHasBigrams;
+ }
+
+ @Override
+ public int hashCode() {
+ if (mHashCode == 0) {
+ mHashCode = computeHashCode(this);
+ }
+ return mHashCode;
+ }
+
+ @UsedForTesting
+ public boolean isValid() {
+ return getProbability() != BinaryDictionary.NOT_A_PROBABILITY;
+ }
+
+ @Override
+ public String toString() {
+ return CombinedFormatUtils.formatWordProperty(this);
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
index 7c9b2a169..652614876 100644
--- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
@@ -39,4 +39,10 @@ public class PersonalizationDictionary extends DecayingExpandableBinaryDictionar
super(context, locale, Dictionary.TYPE_PERSONALIZATION, getDictNameWithLocale(NAME, locale),
dictFile);
}
+
+ @Override
+ public boolean isValidWord(final String word) {
+ // Strings out of this dictionary should not be considered existing words.
+ return false;
+ }
}
diff --git a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
index c23bc9bc0..6778c2334 100644
--- a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
@@ -45,4 +45,10 @@ public class UserHistoryDictionary extends DecayingExpandableBinaryDictionaryBas
public void cancelAddingUserHistory(final String word0, final String word1) {
removeBigramDynamically(word0, word1);
}
+
+ @Override
+ public boolean isValidWord(final String word) {
+ // Strings out of this dictionary should not be considered existing words.
+ return false;
+ }
}
diff --git a/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java b/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java
index 70cb2b285..60ca5baab 100644
--- a/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java
+++ b/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java
@@ -75,7 +75,7 @@ public final class SpacingAndPunctuations {
final ArrayList<SuggestedWordInfo> puncList = CollectionUtils.newArrayList();
if (puncs != null) {
for (final String puncSpec : puncs) {
- // TODO: Stop using KeySpceParser.getLabel().
+ // TODO: Stop using KeySpecParser.getLabel().
// TODO: Punctuation suggestions should honor RTL languages.
puncList.add(new SuggestedWordInfo(KeySpecParser.getLabel(puncSpec),
SuggestedWordInfo.MAX_SCORE, SuggestedWordInfo.KIND_HARDCODED,
@@ -84,7 +84,7 @@ public final class SpacingAndPunctuations {
SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */));
}
}
- return new SuggestedWords(puncList,
+ return new SuggestedWords(puncList, null /* rawSuggestions */,
false /* typedWordValid */,
false /* hasAutoCorrectionCandidate */,
true /* isPunctuationSuggestions */,
diff --git a/java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java b/java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java
new file mode 100644
index 000000000..bb7ae2f9b
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.latin.utils;
+
+import com.android.inputmethod.latin.makedict.DictionaryHeader;
+import com.android.inputmethod.latin.makedict.ProbabilityInfo;
+import com.android.inputmethod.latin.makedict.WordProperty;
+import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
+
+import java.util.HashMap;
+
+public class CombinedFormatUtils {
+ public static final String DICTIONARY_TAG = "dictionary";
+ public static final String BIGRAM_TAG = "bigram";
+ public static final String SHORTCUT_TAG = "shortcut";
+ public static final String PROBABILITY_TAG = "f";
+ public static final String HISTORICAL_INFO_TAG = "historicalInfo";
+ public static final String HISTORICAL_INFO_SEPARATOR = ":";
+ public static final String WORD_TAG = "word";
+ public static final String NOT_A_WORD_TAG = "not_a_word";
+ public static final String BLACKLISTED_TAG = "blacklisted";
+
+ public static String formatAttributeMap(final HashMap<String, String> attributeMap) {
+ final StringBuilder builder = new StringBuilder();
+ builder.append(DICTIONARY_TAG + "=");
+ if (attributeMap.containsKey(DictionaryHeader.DICTIONARY_ID_KEY)) {
+ builder.append(attributeMap.get(DictionaryHeader.DICTIONARY_ID_KEY));
+ }
+ for (final String key : attributeMap.keySet()) {
+ if (key.equals(DictionaryHeader.DICTIONARY_ID_KEY)) {
+ continue;
+ }
+ final String value = attributeMap.get(key);
+ builder.append("," + key + "=" + value);
+ }
+ builder.append("\n");
+ return builder.toString();
+ }
+
+ public static String formatWordProperty(final WordProperty wordProperty) {
+ final StringBuilder builder = new StringBuilder();
+ builder.append(" " + WORD_TAG + "=" + wordProperty.mWord);
+ builder.append(",");
+ builder.append(formatProbabilityInfo(wordProperty.mProbabilityInfo));
+ if (wordProperty.mIsNotAWord) {
+ builder.append("," + NOT_A_WORD_TAG + "=true");
+ }
+ if (wordProperty.mIsBlacklistEntry) {
+ builder.append("," + BLACKLISTED_TAG + "=true");
+ }
+ builder.append("\n");
+ if (wordProperty.mShortcutTargets != null) {
+ for (final WeightedString shortcutTarget : wordProperty.mShortcutTargets) {
+ builder.append(" " + SHORTCUT_TAG + "=" + shortcutTarget.mWord);
+ builder.append(",");
+ builder.append(formatProbabilityInfo(shortcutTarget.mProbabilityInfo));
+ builder.append("\n");
+ }
+ }
+ if (wordProperty.mBigrams != null) {
+ for (final WeightedString bigram : wordProperty.mBigrams) {
+ builder.append(" " + BIGRAM_TAG + "=" + bigram.mWord);
+ builder.append(",");
+ builder.append(formatProbabilityInfo(bigram.mProbabilityInfo));
+ builder.append("\n");
+ }
+ }
+ return builder.toString();
+ }
+
+ public static String formatProbabilityInfo(final ProbabilityInfo probabilityInfo) {
+ final StringBuilder builder = new StringBuilder();
+ builder.append(PROBABILITY_TAG + "=" + probabilityInfo.mProbability);
+ if (probabilityInfo.hasHistoricalInfo()) {
+ builder.append(",");
+ builder.append(HISTORICAL_INFO_TAG + "=");
+ builder.append(probabilityInfo.mTimestamp);
+ builder.append(HISTORICAL_INFO_SEPARATOR);
+ builder.append(probabilityInfo.mLevel);
+ builder.append(HISTORICAL_INFO_SEPARATOR);
+ builder.append(probabilityInfo.mCount);
+ }
+ return builder.toString();
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/utils/WordProperty.java b/java/src/com/android/inputmethod/latin/utils/WordProperty.java
deleted file mode 100644
index da56b213f..000000000
--- a/java/src/com/android/inputmethod/latin/utils/WordProperty.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-
-package com.android.inputmethod.latin.utils;
-
-import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.latin.BinaryDictionary;
-import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
-import com.android.inputmethod.latin.makedict.ProbabilityInfo;
-
-import java.util.ArrayList;
-
-// This has information that belong to a unigram. This class has some detailed attributes such as
-// historical information but they have to be checked only for testing purpose.
-@UsedForTesting
-public class WordProperty {
- public final String mCodePoints;
- public final boolean mIsNotAWord;
- public final boolean mIsBlacklisted;
- public final boolean mHasBigrams;
- public final boolean mHasShortcuts;
- public final ProbabilityInfo mProbabilityInfo;
- public final ArrayList<WeightedString> mBigramTargets = CollectionUtils.newArrayList();
- public final ArrayList<ProbabilityInfo> mBigramProbabilityInfo = CollectionUtils.newArrayList();
- public final ArrayList<WeightedString> mShortcutTargets = CollectionUtils.newArrayList();
-
- private static ProbabilityInfo createProbabilityInfoFromArray(final int[] probabilityInfo) {
- return new ProbabilityInfo(
- probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_PROBABILITY_INDEX],
- probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_TIMESTAMP_INDEX],
- probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_LEVEL_INDEX],
- probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_COUNT_INDEX]);
- }
-
- // This represents invalid word when the probability is BinaryDictionary.NOT_A_PROBABILITY.
- public WordProperty(final int[] codePoints, final boolean isNotAWord,
- final boolean isBlacklisted, final boolean hasBigram,
- final boolean hasShortcuts, final int[] probabilityInfo,
- final ArrayList<int[]> bigramTargets, final ArrayList<int[]> bigramProbabilityInfo,
- final ArrayList<int[]> shortcutTargets,
- final ArrayList<Integer> shortcutProbabilities) {
- mCodePoints = StringUtils.getStringFromNullTerminatedCodePointArray(codePoints);
- mIsNotAWord = isNotAWord;
- mIsBlacklisted = isBlacklisted;
- mHasBigrams = hasBigram;
- mHasShortcuts = hasShortcuts;
- mProbabilityInfo = createProbabilityInfoFromArray(probabilityInfo);
-
- final int bigramTargetCount = bigramTargets.size();
- for (int i = 0; i < bigramTargetCount; i++) {
- final String bigramTargetString =
- StringUtils.getStringFromNullTerminatedCodePointArray(bigramTargets.get(i));
- final ProbabilityInfo bigramProbability =
- createProbabilityInfoFromArray(bigramProbabilityInfo.get(i));
- mBigramTargets.add(
- new WeightedString(bigramTargetString, bigramProbability.mProbability));
- mBigramProbabilityInfo.add(bigramProbability);
- }
-
- final int shortcutTargetCount = shortcutTargets.size();
- for (int i = 0; i < shortcutTargetCount; i++) {
- final String shortcutTargetString =
- StringUtils.getStringFromNullTerminatedCodePointArray(shortcutTargets.get(i));
- mShortcutTargets.add(
- new WeightedString(shortcutTargetString, shortcutProbabilities.get(i)));
- }
- }
-
- @UsedForTesting
- public boolean isValid() {
- return mProbabilityInfo.mProbability != BinaryDictionary.NOT_A_PROBABILITY;
- }
-
- @Override
- public String toString() {
- // TODO: Move this logic to CombinedInputOutput.
- final StringBuffer builder = new StringBuffer();
- builder.append(" word=" + mCodePoints);
- builder.append(",");
- builder.append("f=" + mProbabilityInfo.mProbability);
- if (mIsNotAWord) {
- builder.append(",");
- builder.append("not_a_word=true");
- }
- if (mIsBlacklisted) {
- builder.append(",");
- builder.append("blacklisted=true");
- }
- if (mProbabilityInfo.mTimestamp != BinaryDictionary.NOT_A_VALID_TIMESTAMP) {
- builder.append(",");
- builder.append("historicalInfo=" + mProbabilityInfo);
- }
- builder.append("\n");
- for (int i = 0; i < mBigramTargets.size(); i++) {
- builder.append(" bigram=" + mBigramTargets.get(i).mWord);
- builder.append(",");
- builder.append("f=" + mBigramTargets.get(i).mFrequency);
- if (mBigramProbabilityInfo.get(i).mTimestamp
- != BinaryDictionary.NOT_A_VALID_TIMESTAMP) {
- builder.append(",");
- builder.append("historicalInfo=" + mBigramProbabilityInfo.get(i));
- }
- builder.append("\n");
- }
- for (int i = 0; i < mShortcutTargets.size(); i++) {
- builder.append(" shortcut=" + mShortcutTargets.get(i).mWord);
- builder.append(",");
- builder.append("f=" + mShortcutTargets.get(i).mFrequency);
- builder.append("\n");
- }
- return builder.toString();
- }
-} \ No newline at end of file