diff options
85 files changed, 603 insertions, 393 deletions
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml index 986e29ba9..675eb9807 100644 --- a/java/res/values-af/strings.xml +++ b/java/res/values-af/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Spasiebalk en leestekens korrigeer outomaties woorde wat verkeerd gespel is"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Af"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Matig"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Aggressief"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Baie aggressief"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Stel volgende woord voor"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Gebruik die vorige woord om voorstelle te maak"</string> <string name="gesture_input" msgid="826951152254563827">"Aktiveer gebaar-tik"</string> diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml index 32faf0fc6..49f120c62 100644 --- a/java/res/values-am/strings.xml +++ b/java/res/values-am/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"የቦታ ቁልፍ እና ሥርዓተ ነጥብ በስህተት የተተየቡ ቃላትን በራስሰር ያስተካክላሉ ።"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ውጪ"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"መጠነኛ"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"ኃይለኛ"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"በጣም ቁጡ"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"የቀጣይ ቃል አስተያየቶች"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"አስተያየቶች መስጠት ላይ ቀዳሚውን ቃል ተጠቀም"</string> <string name="gesture_input" msgid="826951152254563827">"በምልክት መተየብ ያንቁ"</string> diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml index 7079a0ae1..f9c92fe53 100644 --- a/java/res/values-ar/strings.xml +++ b/java/res/values-ar/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"تؤدي المسافة والترقيم إلى تصحيح الكلمات المكتوبة بشكل غير صحيح"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"إيقاف"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"معتدل"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"حاد"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"شديد الصرامة"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"اقتراحات الكلمات التالية"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"استخدام الكلمة السابقة في تقديم الاقتراحات"</string> <string name="gesture_input" msgid="826951152254563827">"تمكين الكتابة بالإيماءة"</string> diff --git a/java/res/values-be/strings.xml b/java/res/values-be/strings.xml index 68b0b619e..752c8b4b7 100644 --- a/java/res/values-be/strings.xml +++ b/java/res/values-be/strings.xml @@ -65,8 +65,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Прабелы і пунктуацыйныя знакі дазваляюць аўтаматычна выпраўляць памылкова ўведзеныя словы"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Адключаны"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Сціплы"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Агрэсіўны"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Вельмі агрэсіўны"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Падказкi для наступнага слова"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Выкарыстоўваць папярэдняе слова, каб атрымлiваць падказкi"</string> <string name="gesture_input" msgid="826951152254563827">"Уключыць набор жэстамі"</string> diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml index 3de6b8ef7..7d89d34b9 100644 --- a/java/res/values-bg/strings.xml +++ b/java/res/values-bg/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Клавишът за интервал и пунктуация авт. поправя сгрешени думи"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Изкл."</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умерено"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Агресивно"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Много агресивно"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Предложения за следващата дума"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Използване на предишната дума при даване на предложения"</string> <string name="gesture_input" msgid="826951152254563827">"Активиране на въвеждането чрез жест"</string> diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml index f71838710..66ad4879c 100644 --- a/java/res/values-ca/strings.xml +++ b/java/res/values-ca/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Prémer tecla d\'espai o punt. per corregir errors"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactiva"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderada"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Total"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Molt agressiu"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Suggeriments de paraula següent"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Utilitza la paraula anterior a l\'hora de fer suggeriments"</string> <string name="gesture_input" msgid="826951152254563827">"Activa l\'escriptura gestual"</string> diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 1089f483e..d5fa1e737 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Stisknutím mezerníku a interpunkce se automaticky opravují chybně napsaná slova"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Vypnuto"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mírné"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresivní"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Velmi agresivní"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Návrhy dalšího slova"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Návrhy na základě předchozího slova"</string> <string name="gesture_input" msgid="826951152254563827">"Aktivovat psaní gesty"</string> diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 929802f6a..ec1aacd77 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Mellemrumstast og tegnsætning retter automatisk forkerte ord"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Fra"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderat"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Aggressiv"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Meget aggressiv"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Forslag til næste ord"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Brug det forrige ord til at give forslag"</string> <string name="gesture_input" msgid="826951152254563827">"Aktivér skrivning med berøring"</string> diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index cff23a861..482596e53 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Korrektur fehlerhafter Wörter durch Leertaste und Satzzeichen"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Aus"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mäßig"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Stark"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Sehr stark"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Vorschläge für nächstes Wort"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Vorschläge anhand des vorherigen Wortes machen"</string> <string name="gesture_input" msgid="826951152254563827">"Bewegungseingabe aktivieren"</string> diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index a71a5bef8..41fac63b9 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Τα πλήκτρα διαστήματος και στίξης διορθ. αυτόμ. λάθος λέξεις"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Απενεργοποίηση"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Μέτρια"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Υψηλή"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Πολύ επιθετική"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Προτάσεις επόμενων λέξεων"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Χρήση της προηγούμενης λέξης για τη δημιουργία προτάσεων"</string> <string name="gesture_input" msgid="826951152254563827">"Ενεργ. πληκτρολ. με κινήσεις"</string> diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml index a999a622c..6be790c0a 100644 --- a/java/res/values-en-rGB/strings.xml +++ b/java/res/values-en-rGB/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Correct mistyped words automatically with spacebar and punctuation"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Off"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Modest"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Aggressive"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Very aggressive"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Next word suggestions"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Use the previous word when making suggestions"</string> <string name="gesture_input" msgid="826951152254563827">"Enable gesture typing"</string> diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index cda4e25f1..41dd358c1 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"La barra espaciadora y las teclas de puntuación insertan automáticamente la palabra corregida"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivado"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderado"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Total"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Muy agresivo"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Suger. de próxima palabra"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Usar la palabra anterior para hacer sugerencias"</string> <string name="gesture_input" msgid="826951152254563827">"Activar escritura gestual"</string> diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 297db557f..731a7d29b 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Pulsar la tecla de espacio o punto para corregir errores"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivada"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Parcial"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Total"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Muy agresiva"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Sugerir siguiente palabra"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Usar la palabra anterior para hacer sugerencias"</string> <string name="gesture_input" msgid="826951152254563827">"Habilitar escritura gestual"</string> diff --git a/java/res/values-et/strings.xml b/java/res/values-et/strings.xml index 0874a9302..c07231ce2 100644 --- a/java/res/values-et/strings.xml +++ b/java/res/values-et/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Tühik ja kirjavahemärgid parand. autom. kirjavigadega sõnad"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Väljas"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mõõdukas"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agressiivne"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Väga agressiivne"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Järgmise sõna soovitused"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Soovituste tegemisel eelmise sõna kasutamine"</string> <string name="gesture_input" msgid="826951152254563827">"Luba joonistusega sisestamine"</string> diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml index 501b678e1..811c9b38f 100644 --- a/java/res/values-fa/strings.xml +++ b/java/res/values-fa/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"کلید فاصله و علائم نگارشی به صورت خودکار کلماتی را که غلط تایپ شدهاند تصحیح میکنند"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"خاموش"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"متوسط"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"فعال"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"بسیار پرخاشگرانه"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"پیشنهادات کلمه بعدی"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"استفاده از کلمه قبلی در ایجاد پیشنهادات"</string> <string name="gesture_input" msgid="826951152254563827">"فعال کردن تایپ حرکتی"</string> diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml index 069666285..7406330f7 100644 --- a/java/res/values-fi/strings.xml +++ b/java/res/values-fi/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Välilyönnit ja välimerkit korjaavat väärinkirjoitetut sanat automaattisesti"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Älä käytä"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Osittainen"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Täysi"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Hyvin aggressiivinen"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Seuraavan sanan ehdotukset"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Käytä edellistä sanaa ehdotuksien perusteena"</string> <string name="gesture_input" msgid="826951152254563827">"Ota piirtokirjoitus käyttöön"</string> diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index b5db430ae..846465f5c 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Corriger autom. orthographe (pression sur barre espace/signes ponctuation)"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Désactiver"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Simple"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Proactive"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Très exigeante"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Suggestions pour le mot suivant"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Utiliser le mot précédent pour les suggestions"</string> <string name="gesture_input" msgid="826951152254563827">"Activer la saisie gestuelle"</string> diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml index ca1c838e0..edb0483dd 100644 --- a/java/res/values-hi/strings.xml +++ b/java/res/values-hi/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Spacebar और विराम चिह्न गलत लिखे गए शब्दों को स्वचालित रूप से ठीक करते हैं"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"बंद"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"साधारण"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"तीव्र"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"बहुत तीव्र"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"अगले शब्द के सुझाव"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"सुझाव बनाने में पिछले शब्द का उपयोग करें"</string> <string name="gesture_input" msgid="826951152254563827">"जेस्चर लिखना सक्षम करें"</string> diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml index 8f64ccf3d..e36da751e 100644 --- a/java/res/values-hr/strings.xml +++ b/java/res/values-hr/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Razmak i interpunkcija automatski ispravljaju krive riječi"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Isključeno"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Skromno"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresivno"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Vrlo agresivno"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Prijedlozi za sljedeću riječ"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Koristi se prethodnom riječi u izradi prijedloga"</string> <string name="gesture_input" msgid="826951152254563827">"Omogući pisanje kretnjama"</string> diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml index 6aaf88c68..ee2a9430c 100644 --- a/java/res/values-hu/strings.xml +++ b/java/res/values-hu/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Szóköz és központozás automatikusan javítja az elgépelést"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Ki"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mérsékelt"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresszív"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Nagyon agresszív"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Következő szóra vonatkozó javaslatok"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Az előző szó felhasználása a javaslatoknál"</string> <string name="gesture_input" msgid="826951152254563827">"Kézmozdulatokkal gépelés"</string> diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml index dbac3620b..d480e0379 100644 --- a/java/res/values-in/strings.xml +++ b/java/res/values-in/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Bilah spasi dan tanda baca secara otomatis dikoreksi pada kata yang salah ketik"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Mati"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Sederhana"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresif"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Sangat agresif"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Saran kata berikutnya"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Gunakan kata sebelumnya dalam membuat saran"</string> <string name="gesture_input" msgid="826951152254563827">"Aktifkan pengetikan isyarat"</string> diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index a20acc22f..612febf11 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Barra spaziatrice/punteggiatura correggono parole con errori"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Off"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Media"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Massima"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Massima"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Suggerimenti parola successiva"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Usa la parola precedente per i suggerimenti"</string> <string name="gesture_input" msgid="826951152254563827">"Abilita digitazione a gesti"</string> diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml index 526c43186..d8d41b731 100644 --- a/java/res/values-iw/strings.xml +++ b/java/res/values-iw/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"מקש הרווח ופיסוק מתקנים אוטומטית שגיאות הקלדה"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"כבוי"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"מצומצם"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"מחמיר"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"מחמיר מאוד"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"הצעות למילה הבאה"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"השתמש במילה הקודמת ביצירת הצעות"</string> <string name="gesture_input" msgid="826951152254563827">"אפשר הקלדה ללא הרמת אצבע"</string> diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 5a5ff432a..875d81b03 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"誤入力をスペースまたは句読点キーで修正する"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"OFF"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"中"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"強"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"最も強い"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"次の入力候補"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"前の単語に基づいて入力候補を表示します"</string> <string name="gesture_input" msgid="826951152254563827">"ジェスチャー入力を有効にする"</string> diff --git a/java/res/values-ka/strings.xml b/java/res/values-ka/strings.xml index f83e21dd9..edc5fe072 100644 --- a/java/res/values-ka/strings.xml +++ b/java/res/values-ka/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"შორისი და პუნქტუაცია ავტომატურად ასწორებს არასწორად აკრეფილ სიტყვებს"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"გამორთულია"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"მოკრძალებული"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"აგრესიული"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"ძალიან აგრესიული"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"შემდეგი სიტყვის შეთავაზებები"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"შეთავაზებებისას წინა სიტყვის გამოყენება"</string> <string name="gesture_input" msgid="826951152254563827">"ჟესტებით წერის ჩართვა"</string> diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index b1bfe1139..c21b8142c 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"스페이스바와 문장부호 키를 사용하면 오타가 자동으로 교정됩니다."</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"사용 안함"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"약"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"중"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"강"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"다음 단어 추천"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"추천할 때 이전 단어를 사용"</string> <string name="gesture_input" msgid="826951152254563827">"제스처 타이핑 사용"</string> diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml index 26f1b27ff..2b6221e70 100644 --- a/java/res/values-lt/strings.xml +++ b/java/res/values-lt/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Tarpo kl. ir skyr. ženkl. aut. išt. neteis. įv. žodž."</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Išjungta"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Vidutinis"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Atkaklus"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Labai agresyviai"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Kito žodžio pasiūlymai"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Sudarant pasiūlymus naudoti ankstesnį žodį"</string> <string name="gesture_input" msgid="826951152254563827">"Įgalinti teksto vedimą gestais"</string> diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml index cdf04cca6..43a40f11d 100644 --- a/java/res/values-lv/strings.xml +++ b/java/res/values-lv/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Atstarpes taustiņš un interpunkcija; automātiska kļūdainu vārdu labošana"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Izslēgta"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mērena"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresīva"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Ļoti radikāla"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Nākamā vārda ieteikumi"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Veidojot ieteikumus, izmantot iepriekšējo vārdu."</string> <string name="gesture_input" msgid="826951152254563827">"Iespējot ievadi ar žestiem"</string> diff --git a/java/res/values-mn/strings.xml b/java/res/values-mn/strings.xml index 12a3b47f1..000b52a76 100644 --- a/java/res/values-mn/strings.xml +++ b/java/res/values-mn/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Хоосон зай болон цэг таслал нь буруу бичсэн үгсийг автоматаар залруулна"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Идэвхгүй"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Хүлээцтэй"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Хүчтэй"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Маш хүчтэй"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Дараагийн-үг санал болгох"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Өмнөх үгийг үг санал болгоход ашиглах"</string> <string name="gesture_input" msgid="826951152254563827">"Зангаагаар бичихийг идэвхжүүлэх"</string> diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml index 968243bb3..25292e3a6 100644 --- a/java/res/values-ms/strings.xml +++ b/java/res/values-ms/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Bar ruang dan tanda baca secara automatik membetulkan perkataan yang ditaip salah"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Matikan"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Sederhana"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresif"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Sangat agresif"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Cadangan perkataan seterusnya"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Gunakan perkataan sebelumnya dalam membuat cadangan"</string> <string name="gesture_input" msgid="826951152254563827">"Dayakan taipan gerak isyarat"</string> diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 33da13eaf..1e91cf76a 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Mellomromstast og skilletegn retter automat. feilstavede ord"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Av"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderat"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Omfattende"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Veldig aggressiv"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Forslag til neste ord"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Bruk forrige ord til å lage forslag"</string> <string name="gesture_input" msgid="826951152254563827">"Aktiver ordføring"</string> diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index 5224f813f..137e44521 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Met spatiebalk en interpunctie worden verkeerd gespelde woorden automatisch gecorrigeerd"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Uitgeschakeld"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Normaal"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agressief"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Zeer agressief"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Suggesties voor volgend woord"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Het vorige woord gebruiken bij het doen van suggesties"</string> <string name="gesture_input" msgid="826951152254563827">"Typen via tekenen inschakelen"</string> diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index e128c0e33..a09738b58 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Spacja i znaki przestankowe poprawiają błędnie wpisane słowa"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Wyłącz"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Umiarkowana"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresywna"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Bardzo agresywna"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Podpowiadanie kolejnego słowa"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Pokazuj podpowiedzi na podstawie poprzedniego słowa"</string> <string name="gesture_input" msgid="826951152254563827">"Włącz pisanie gestami"</string> diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index fb06f9291..289ca88b1 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Correcção automática de palavras mal escritas c/ barra de espaços e pontuação"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desligar"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderada"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agressiva"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Muito agressivo"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Sugestões da palavra seguinte"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Utilizar palavra anterior para fazer sugestões"</string> <string name="gesture_input" msgid="826951152254563827">"Ativar escrita por toque"</string> diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 8cbc41e3a..bced80293 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"A barra de espaço e a pontuação corrigem automaticamente palavras com erro de digitação"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desativado"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderado"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agressivo"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Muito agressivo"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Sugestões para a palavra seguinte"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Usar a palavra anterior ao fazer sugestões"</string> <string name="gesture_input" msgid="826951152254563827">"Ativar a escrita com gestos"</string> diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml index 71c9deb0c..8a673682d 100644 --- a/java/res/values-rm/strings.xml +++ b/java/res/values-rm/strings.xml @@ -104,9 +104,9 @@ <skip /> <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> <skip /> - <!-- no translation found for auto_correction_threshold_mode_aggressive (3524029103734923819) --> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> <skip /> - <!-- no translation found for auto_correction_threshold_mode_very_aggressive (3386782235540547678) --> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> <skip /> <!-- no translation found for bigram_prediction (1084449187723948550) --> <skip /> diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml index cbba8a375..c444f4fb7 100644 --- a/java/res/values-ro/strings.xml +++ b/java/res/values-ro/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Corectare automată cuvinte prin bară spaţiu/semne punctuaţie"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Dezactivată"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderată"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresivă"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Foarte exigentă"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Sugestii pentru cuvântul următor"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Utilizează cuvântul anterior pentru sugestii"</string> <string name="gesture_input" msgid="826951152254563827">"Activați tastarea gestuală"</string> diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 13f34ee3e..3991843e5 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Автоматическое исправление опечаток при вводе знака препинания или пробела"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Откл."</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умеренное"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Активное"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Очень активно"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Подсказывать слова"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Предлагать подсказки на основе предыдущего слова"</string> <string name="gesture_input" msgid="826951152254563827">"Включить функцию"</string> diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml index 9d315a8f5..499f19d22 100644 --- a/java/res/values-sk/strings.xml +++ b/java/res/values-sk/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Stlačením medzerníka a interpunkcie sa aut. opravia chybné slová"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Vypnuté"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mierne"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresívne"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Veľmi agresívne"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Návrhy ďalšieho slova"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Návrhy podľa predchádzajúceho slova"</string> <string name="gesture_input" msgid="826951152254563827">"Povoliť písanie gestami"</string> diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml index 760cbde82..2eb31e440 100644 --- a/java/res/values-sl/strings.xml +++ b/java/res/values-sl/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Preslednica in ločila samodejno popravijo napačno vtipkane besede"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Izklopljeno"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Zmerno"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Strogo"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Zelo strogo"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Predlogi za naslednjo besedo"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Pri predlogu upoštevaj prejšnjo besedo"</string> <string name="gesture_input" msgid="826951152254563827">"Omogoči vnos besedila s potezo"</string> diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml index 6bddc5c98..1b9094cda 100644 --- a/java/res/values-sr/strings.xml +++ b/java/res/values-sr/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Размак и интерпункција аутоматски исправљају грешке у куцању"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Искључи"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умерено"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Агресивно"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Веома агресивно"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Предлози за следећу реч"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Користи претходну реч при давању предлога"</string> <string name="gesture_input" msgid="826951152254563827">"Омогући унос покретом"</string> diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index d1567c3ba..d400af7b2 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Blanksteg/skiljetecken rättar felstavning"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Av"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Måttlig"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Aggressiv"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Mycket aggressivt"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Föreslå nästa ord"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Ge förslag utifrån föregående ord"</string> <string name="gesture_input" msgid="826951152254563827">"Aktivera svepskrivning"</string> diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml index 3891cf284..037f138bd 100644 --- a/java/res/values-sw/strings.xml +++ b/java/res/values-sw/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Kiaamba na kiakifishi hurekebisha maneno ambayo yamechapishwa vibaya"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Zima"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Ya wastani"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Ya hima"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Changamfu zaidi"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Mapendekezo ya neno lifuatalo"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Tumia nelo la awali katika kufanya mapendekezo"</string> <string name="gesture_input" msgid="826951152254563827">"Washa kuandika kwa ishara"</string> diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml index 9d407dda7..7723ebccc 100644 --- a/java/res/values-th/strings.xml +++ b/java/res/values-th/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"กดเว้นวรรคและเครื่องหมายจะแก้คำผิดอัตโนมัติ"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ปิด"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"ปานกลาง"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"เข้มงวด"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"เข้มงวดมาก"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"คำแนะนำสำหรับคำถัดไป"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"ใช้คำก่อนหน้าในการสร้างข้อเสนอแนะ"</string> <string name="gesture_input" msgid="826951152254563827">"เปิดการพิมพ์ด้วยท่าทางสัมผัส"</string> diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml index ee5d88657..d2deff1a7 100644 --- a/java/res/values-tl/strings.xml +++ b/java/res/values-tl/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Awto tinatama ng spacebar at bantas ang maling na-type"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Naka-off"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Modest"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresibo"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Napaka-agresibo"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Mga suhestiyon sa susunod na salita"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Gamitin ang nakaraang salita sa paggawa ng mga suhestiyon"</string> <string name="gesture_input" msgid="826951152254563827">"Paganahin ang gesture na pag-type"</string> diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 2e7fa4353..8f91b69ec 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Boşluk tuşu ve noktalama işaretleri yanlış yazılan kelimeleri otomatikman düzeltir"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Kapalı"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Ölçülü"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Agresif"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Çok geniş ölçekte"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Sonraki kelime önerileri"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Önerilerde bulunurken önceki kelimeyi kullan"</string> <string name="gesture_input" msgid="826951152254563827">"Hareketle yazmayı etkinleştir"</string> diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml index fdc7cb922..e167131b7 100644 --- a/java/res/values-uk/strings.xml +++ b/java/res/values-uk/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Пробіл і пунктуація автоматично виправляють слова з помилками"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Вимк."</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Помірне"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Активне"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Дуже активне"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Пропозиції наступного слова"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Використовувати попереднє слово, щоб надавати пропозиції"</string> <string name="gesture_input" msgid="826951152254563827">"Увімкнути ввід жестами"</string> diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml index b489f5770..3c94d003a 100644 --- a/java/res/values-vi/strings.xml +++ b/java/res/values-vi/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Phím cách và dấu câu tự động sửa từ nhập sai"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Tắt"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Đơn giản"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Linh hoạt"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Rất linh hoạt"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Đề xuất từ tiếp theo"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Sử dụng từ trước đó khi đưa ra đề xuất"</string> <string name="gesture_input" msgid="826951152254563827">"Bật 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 1177c01c4..9f05ed8f3 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -26,7 +26,7 @@ <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"拼写检查工具会使用您的联系人列表中的条目"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"按键振动"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"按键音效"</string> - <string name="popup_on_keypress" msgid="123894815723512944">"按键时显示所输字符"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"按键时弹出显示字符"</string> <string name="general_category" msgid="1859088467017573195">"常规"</string> <string name="correction_category" msgid="2236750915056607613">"文本更正"</string> <string name="gesture_typing_category" msgid="497263612130532630">"滑行输入"</string> @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"按空格键和标点可自动更正错别字"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"关闭"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"小改"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"大改"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"改动极大"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"后续字词建议"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"根据上一个字词提供建议"</string> <string name="gesture_input" msgid="826951152254563827">"启用滑行输入"</string> diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 351907aaf..862551e93 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"按空白鍵或標點符號時,自動修正前面的錯字"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"關閉"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"更正範圍小"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"更正範圍大"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"更正範圍極大"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"建議下一個字詞"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"根據前一個字詞提供建議"</string> <string name="gesture_input" msgid="826951152254563827">"啟用手勢輸入"</string> diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml index 9c44c6f1c..f1c7d7311 100644 --- a/java/res/values-zu/strings.xml +++ b/java/res/values-zu/strings.xml @@ -64,8 +64,10 @@ <string name="auto_correction_summary" msgid="5625751551134658006">"Ibha yesikhala nokubhala ngamagama amakhulu kulungisa amaphutha amagama athayiphwe kabi"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Valiwe"</string> <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Thobekile"</string> - <string name="auto_correction_threshold_mode_aggressive" msgid="3524029103734923819">"Bukhali"</string> - <string name="auto_correction_threshold_mode_very_aggressive" msgid="3386782235540547678">"Nobudlova kakhulu"</string> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> <string name="bigram_prediction" msgid="1084449187723948550">"Iziphakamiso zegama elilandelayo"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Sebenzisa igama langaphambilini ekwenzeni iziphakamiso"</string> <string name="gesture_input" msgid="826951152254563827">"Nika amandla okuthayipha ngokuthinta"</string> diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 1eff2f9c3..aae5b0b70 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -388,7 +388,7 @@ Cyrillic, Arabic, Hebrew or other scripts. This keyboard offers no suggestions, be a QWERTY, or AZERTY, or any other disposition that only offers Latin characters, so you wouldn't be able to type, say, Arabic on it. Please translate it in a way that "alphabet" would be understood to mean specifically the Latin alphabet, rather than any other -alphabet. [CHAR LIMIT=25] --> +alphabet. [CHAR LIMIT=29] --> <string name="subtype_no_language">No language (Alphabet)</string> <!-- This string is displayed in the description for a keyboard type. It refers specifically to the Latin alphabet, as opposed to Cyrillic, Arabic, Hebrew or other scripts. diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index 054c503d8..28eb58573 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -196,13 +196,14 @@ public class KeyboardView extends View { @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { - if (mKeyboard != null) { - // The main keyboard expands to the display width. - final int height = mKeyboard.mOccupiedHeight + getPaddingTop() + getPaddingBottom(); - setMeasuredDimension(widthMeasureSpec, height); - } else { + if (mKeyboard == null) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); + return; } + // The main keyboard expands to the entire this {@link KeyboardView}. + final int width = mKeyboard.mOccupiedWidth + getPaddingLeft() + getPaddingRight(); + final int height = mKeyboard.mOccupiedHeight + getPaddingTop() + getPaddingBottom(); + setMeasuredDimension(width, height); } @Override diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index 7a5038843..da8cce1d0 100644 --- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java @@ -974,9 +974,7 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack // {@link KeyboardView#showKeyPreview(PointerTracker)}. final int pointY = key.mY + mKeyPreviewDrawParams.mPreviewVisibleOffset; moreKeysPanel.showMoreKeysPanel(this, this, pointX, pointY, mKeyboardActionListener); - final int translatedX = moreKeysPanel.translateX(CoordinateUtils.x(lastCoords)); - final int translatedY = moreKeysPanel.translateY(CoordinateUtils.y(lastCoords)); - tracker.onShowMoreKeysPanel(translatedX, translatedY, moreKeysPanel); + tracker.onShowMoreKeysPanel(moreKeysPanel); } public boolean isInSlidingKeyInput() { diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java index 94f6a3cf2..f00f5a99e 100644 --- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java @@ -198,12 +198,6 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel final int x = (int)me.getX(index); final int y = (int)me.getY(index); final int pointerId = me.getPointerId(index); - processMotionEvent(action, x, y, pointerId, eventTime); - return true; - } - - public void processMotionEvent(final int action, final int x, final int y, - final int pointerId, final long eventTime) { switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: @@ -217,6 +211,7 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel onMoveEvent(x, y, pointerId, eventTime); break; } + return true; } @Override diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index ab5fee99d..b66ee2a65 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -1282,12 +1282,12 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } } - public void onShowMoreKeysPanel(final int translatedX, final int translatedY, - final MoreKeysPanel panel) { + public void onShowMoreKeysPanel(final MoreKeysPanel panel) { setReleasedKeyGraphics(mCurrentKey); - final long eventTime = SystemClock.uptimeMillis(); + final int translatedX = panel.translateX(mLastX); + final int translatedY = panel.translateY(mLastY); + panel.onDownEvent(translatedX, translatedY, mPointerId, SystemClock.uptimeMillis()); mMoreKeysPanel = panel; - mMoreKeysPanel.onDownEvent(translatedX, translatedY, mPointerId, eventTime); } @Override diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java index fa301b5a6..d0a4afd50 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java @@ -235,7 +235,7 @@ final public class BinaryDictionaryGetter { new BinaryDictInputOutput.ByteBufferWrapper(inStream.getChannel().map( FileChannel.MapMode.READ_ONLY, 0, f.length())); final int magic = buffer.readInt(); - if (magic != FormatSpec.VERSION_2_MAGIC_NUMBER) { + if (magic != FormatSpec.MAGIC_NUMBER) { return false; } final int formatVersion = buffer.readInt(); diff --git a/java/src/com/android/inputmethod/latin/DictionaryWriter.java b/java/src/com/android/inputmethod/latin/DictionaryWriter.java index 8be04c1c0..47151bf61 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryWriter.java +++ b/java/src/com/android/inputmethod/latin/DictionaryWriter.java @@ -37,10 +37,9 @@ import java.util.HashMap; * An in memory dictionary for memorizing entries and writing a binary dictionary. */ public class DictionaryWriter extends AbstractDictionaryWriter { - // TODO: Regenerate version 3 binary dictionary. - private static final int BINARY_DICT_VERSION = 2; + private static final int BINARY_DICT_VERSION = 3; private static final FormatSpec.FormatOptions FORMAT_OPTIONS = - new FormatSpec.FormatOptions(BINARY_DICT_VERSION); + new FormatSpec.FormatOptions(BINARY_DICT_VERSION, true /* supportsDynamicUpdate */); private FusionDictionary mFusionDictionary; diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java index 1b187d85d..e2fa0231d 100644 --- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java +++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java @@ -1210,49 +1210,38 @@ public final class BinaryDictInputOutput { ByteArrayOutputStream headerBuffer = new ByteArrayOutputStream(256); // The magic number in big-endian order. - if (version >= FormatSpec.FIRST_VERSION_WITH_HEADER_SIZE) { - // Magic number for version 2+. - headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_2_MAGIC_NUMBER >> 24))); - headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_2_MAGIC_NUMBER >> 16))); - headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_2_MAGIC_NUMBER >> 8))); - headerBuffer.write((byte) (0xFF & FormatSpec.VERSION_2_MAGIC_NUMBER)); - // Dictionary version. - headerBuffer.write((byte) (0xFF & (version >> 8))); - headerBuffer.write((byte) (0xFF & version)); - } else { - // Magic number for version 1. - headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_1_MAGIC_NUMBER >> 8))); - headerBuffer.write((byte) (0xFF & FormatSpec.VERSION_1_MAGIC_NUMBER)); - // Dictionary version. - headerBuffer.write((byte) (0xFF & version)); - } + // Magic number for all versions. + headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 24))); + headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 16))); + headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 8))); + headerBuffer.write((byte) (0xFF & FormatSpec.MAGIC_NUMBER)); + // Dictionary version. + headerBuffer.write((byte) (0xFF & (version >> 8))); + headerBuffer.write((byte) (0xFF & version)); + // Options flags final int options = makeOptionsValue(dict, formatOptions); headerBuffer.write((byte) (0xFF & (options >> 8))); headerBuffer.write((byte) (0xFF & options)); - if (version >= FormatSpec.FIRST_VERSION_WITH_HEADER_SIZE) { - final int headerSizeOffset = headerBuffer.size(); - // Placeholder to be written later with header size. - for (int i = 0; i < 4; ++i) { - headerBuffer.write(0); - } - // Write out the options. - for (final String key : dict.mOptions.mAttributes.keySet()) { - final String value = dict.mOptions.mAttributes.get(key); - CharEncoding.writeString(headerBuffer, key); - CharEncoding.writeString(headerBuffer, value); - } - final int size = headerBuffer.size(); - final byte[] bytes = headerBuffer.toByteArray(); - // Write out the header size. - bytes[headerSizeOffset] = (byte) (0xFF & (size >> 24)); - bytes[headerSizeOffset + 1] = (byte) (0xFF & (size >> 16)); - bytes[headerSizeOffset + 2] = (byte) (0xFF & (size >> 8)); - bytes[headerSizeOffset + 3] = (byte) (0xFF & (size >> 0)); - destination.write(bytes); - } else { - headerBuffer.writeTo(destination); - } + final int headerSizeOffset = headerBuffer.size(); + // Placeholder to be written later with header size. + for (int i = 0; i < 4; ++i) { + headerBuffer.write(0); + } + // Write out the options. + for (final String key : dict.mOptions.mAttributes.keySet()) { + final String value = dict.mOptions.mAttributes.get(key); + CharEncoding.writeString(headerBuffer, key); + CharEncoding.writeString(headerBuffer, value); + } + final int size = headerBuffer.size(); + final byte[] bytes = headerBuffer.toByteArray(); + // Write out the header size. + bytes[headerSizeOffset] = (byte) (0xFF & (size >> 24)); + bytes[headerSizeOffset + 1] = (byte) (0xFF & (size >> 16)); + bytes[headerSizeOffset + 2] = (byte) (0xFF & (size >> 8)); + bytes[headerSizeOffset + 3] = (byte) (0xFF & (size >> 0)); + destination.write(bytes); headerBuffer.close(); @@ -1658,10 +1647,8 @@ public final class BinaryDictInputOutput { */ private static int getFormatVersion(final FusionDictionaryBufferInterface buffer) throws IOException { - final int magic_v1 = buffer.readUnsignedShort(); - if (FormatSpec.VERSION_1_MAGIC_NUMBER == magic_v1) return buffer.readUnsignedByte(); - final int magic_v2 = (magic_v1 << 16) + buffer.readUnsignedShort(); - if (FormatSpec.VERSION_2_MAGIC_NUMBER == magic_v2) return buffer.readUnsignedShort(); + final int magic = buffer.readInt(); + if (FormatSpec.MAGIC_NUMBER == magic) return buffer.readUnsignedShort(); return FormatSpec.NOT_A_VERSION_NUMBER; } @@ -1695,13 +1682,9 @@ public final class BinaryDictInputOutput { final HashMap<String, String> attributes = new HashMap<String, String>(); final int headerSize; - if (version < FormatSpec.FIRST_VERSION_WITH_HEADER_SIZE) { - headerSize = buffer.position(); - } else { - headerSize = buffer.readInt(); - populateOptions(buffer, headerSize, attributes); - buffer.position(headerSize); - } + headerSize = buffer.readInt(); + populateOptions(buffer, headerSize, attributes); + buffer.position(headerSize); if (headerSize < 0) { throw new UnsupportedFormatException("header size can't be negative."); diff --git a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java index feadcda76..2bb5d8b6e 100644 --- a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java +++ b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java @@ -16,6 +16,7 @@ package com.android.inputmethod.latin.makedict; +import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions; @@ -25,6 +26,40 @@ import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions public final class FormatSpec { /* + * File header layout is as follows: + * + * v | + * e | MAGIC_NUMBER + version of the file format, 2 bytes. + * r | + * sion + * + * o | + * p | not used 4 bits + * t | has bigrams ? 1 bit, 1 = yes, 0 = no : CONTAINS_BIGRAMS_FLAG + * i | FRENCH_LIGATURE_PROCESSING_FLAG + * o | supports dynamic updates ? 1 bit, 1 = yes, 0 = no : SUPPORTS_DYNAMIC_UPDATE + * n | GERMAN_UMLAUT_PROCESSING_FLAG + * f | + * lags + * + * h | + * e | size of the file header, 4bytes + * a | including the size of the magic number, the option flags and the header size + * d | + * ersize + * + * | attributes list + * + * attributes list is: + * <key> = | string of characters at the char format described below, with the terminator used + * | to signal the end of the string. + * <value> = | string of characters at the char format described below, with the terminator used + * | to signal the end of the string. + * if the size of already read < headersize, goto key. + * + */ + + /* * Array of Node(FusionDictionary.Node) layout is as follows: * * g | @@ -150,12 +185,10 @@ public final class FormatSpec { * if (FLAG_ATTRIBUTE_HAS_NEXT goto flags */ - static final int VERSION_1_MAGIC_NUMBER = 0x78B1; - public static final int VERSION_2_MAGIC_NUMBER = 0x9BC13AFE; - static final int MINIMUM_SUPPORTED_VERSION = 1; + public static final int MAGIC_NUMBER = 0x9BC13AFE; + static final int MINIMUM_SUPPORTED_VERSION = 2; static final int MAXIMUM_SUPPORTED_VERSION = 3; static final int NOT_A_VERSION_NUMBER = -1; - static final int FIRST_VERSION_WITH_HEADER_SIZE = 2; static final int FIRST_VERSION_WITH_DYNAMIC_UPDATE = 3; // These options need to be the same numeric values as the one in the native reading code. @@ -236,9 +269,12 @@ public final class FormatSpec { public static final class FormatOptions { public final int mVersion; public final boolean mSupportsDynamicUpdate; + @UsedForTesting public FormatOptions(final int version) { this(version, false); } + + @UsedForTesting public FormatOptions(final int version, final boolean supportsDynamicUpdate) { mVersion = version; if (version < FIRST_VERSION_WITH_DYNAMIC_UPDATE && supportsDynamicUpdate) { diff --git a/java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java b/java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java index 6498bf9c1..bb6ec6b1c 100644 --- a/java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java +++ b/java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java @@ -77,7 +77,7 @@ public abstract class DynamicPredictionDictionaryBase extends ExpandableDictiona CollectionUtils.newArrayList(); // Should always be false except when we use this class for test - @UsedForTesting boolean isTest = false; + @UsedForTesting boolean mIsTest = false; /* package */ DynamicPredictionDictionaryBase(final Context context, final String locale, final SharedPreferences sp, final String dictionaryType) { @@ -298,8 +298,8 @@ public abstract class DynamicPredictionDictionaryBase extends ExpandableDictiona @Override protected Void doInBackground(final Void... v) { - if (mDynamicPredictionDictionary.isTest) { - // If isTest == true, wait until the lock is released. + if (mDynamicPredictionDictionary.mIsTest) { + // If mIsTest == true, wait until the lock is released. mDynamicPredictionDictionary.mBigramListLock.lock(); try { doWriteTaskLocked(); diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java index 497a791d9..a8a14a825 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java +++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java @@ -270,15 +270,10 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick return super.dispatchTouchEvent(me); } - final MoreKeysPanel moreKeysPanel = mMoreSuggestionsView; final int action = me.getAction(); - final long eventTime = me.getEventTime(); final int index = me.getActionIndex(); - final int id = me.getPointerId(index); final int x = (int)me.getX(index); final int y = (int)me.getY(index); - final int translatedX = moreKeysPanel.translateX(x); - final int translatedY = moreKeysPanel.translateY(y); if (mMoreSuggestionsMode == MORE_SUGGESTIONS_CHECKING_MODAL_OR_SLIDING) { if (Math.abs(x - mOriginX) >= mMoreSuggestionsModalTolerance @@ -295,7 +290,8 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick } // MORE_SUGGESTIONS_IN_SLIDING_MODE - mMoreSuggestionsView.processMotionEvent(action, translatedX, translatedY, id, eventTime); + me.setLocation(mMoreSuggestionsView.translateX(x), mMoreSuggestionsView.translateY(y)); + mMoreSuggestionsView.onTouchEvent(me); return true; } diff --git a/native/jni/Android.mk b/native/jni/Android.mk index e14cf5a71..4786ef6c7 100644 --- a/native/jni/Android.mk +++ b/native/jni/Android.mk @@ -71,6 +71,7 @@ LATIN_IME_CORE_SRC_FILES := \ suggest/core/policy/weighting.cpp \ suggest/core/session/dic_traverse_session.cpp \ $(addprefix suggest/policyimpl/dictionary/, \ + dictionary_structure_with_buffer_policy_factory.cpp \ dynamic_patricia_trie_node_reader.cpp \ dynamic_patricia_trie_policy.cpp \ dynamic_patricia_trie_reading_utils.cpp \ diff --git a/native/jni/src/suggest/core/dicnode/dic_node_proximity_filter.h b/native/jni/src/suggest/core/dicnode/dic_node_proximity_filter.h index 1a39f2ef3..c7ab571de 100644 --- a/native/jni/src/suggest/core/dicnode/dic_node_proximity_filter.h +++ b/native/jni/src/suggest/core/dicnode/dic_node_proximity_filter.h @@ -20,11 +20,11 @@ #include "defines.h" #include "suggest/core/layout/proximity_info_state.h" #include "suggest/core/layout/proximity_info_utils.h" -#include "suggest/core/policy/dictionary_structure_policy.h" +#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h" namespace latinime { -class DicNodeProximityFilter : public DictionaryStructurePolicy::NodeFilter { +class DicNodeProximityFilter : public DictionaryStructureWithBufferPolicy::NodeFilter { public: DicNodeProximityFilter(const ProximityInfoState *const pInfoState, const int pointIndex, const bool exactOnly) diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp index 6b4ef2fea..ec70ed30b 100644 --- a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp +++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp @@ -24,7 +24,7 @@ #include "suggest/core/dictionary/binary_dictionary_info.h" #include "suggest/core/dictionary/multi_bigram_map.h" #include "suggest/core/dictionary/probability_utils.h" -#include "suggest/core/policy/dictionary_structure_policy.h" +#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h" #include "utils/char_utils.h" namespace latinime { @@ -83,7 +83,7 @@ namespace latinime { DicNodeUtils::createAndGetPassingChildNode(dicNode, &childrenFilter, childDicNodes); } else { binaryDictionaryInfo->getStructurePolicy()->createAndGetAllChildNodes(dicNode, - binaryDictionaryInfo, &childrenFilter, childDicNodes); + &childrenFilter, childDicNodes); } } diff --git a/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp b/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp index 3751ae500..d78493b45 100644 --- a/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp +++ b/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp @@ -116,9 +116,8 @@ int BigramDictionary::getPredictions(const int *prevWord, const int prevWordLeng while (bigramsIt.hasNext()) { bigramsIt.next(); const int length = mBinaryDictionaryInfo->getStructurePolicy()-> - getCodePointsAndProbabilityAndReturnCodePointCount( - mBinaryDictionaryInfo, bigramsIt.getBigramPos(), MAX_WORD_LENGTH, - bigramBuffer, &unigramProbability); + getCodePointsAndProbabilityAndReturnCodePointCount(bigramsIt.getBigramPos(), + MAX_WORD_LENGTH, bigramBuffer, &unigramProbability); // Due to space constraints, the probability for bigrams is approximate - the lower the // unigram probability, the worse the precision. The theoritical maximum error in // resulting probability is 8 - although in the practice it's never bigger than 3 or 4 @@ -139,10 +138,9 @@ int BigramDictionary::getBigramListPositionForWord(const int *prevWord, const in const bool forceLowerCaseSearch) const { if (0 >= prevWordLength) return NOT_A_DICT_POS; int pos = mBinaryDictionaryInfo->getStructurePolicy()->getTerminalNodePositionOfWord( - mBinaryDictionaryInfo, prevWord, prevWordLength, forceLowerCaseSearch); + prevWord, prevWordLength, forceLowerCaseSearch); if (NOT_A_VALID_WORD_POS == pos) return NOT_A_DICT_POS; - return mBinaryDictionaryInfo->getStructurePolicy()->getBigramsPositionOfNode( - mBinaryDictionaryInfo, pos); + return mBinaryDictionaryInfo->getStructurePolicy()->getBigramsPositionOfNode(pos); } bool BigramDictionary::isValidBigram(const int *word0, int length0, const int *word1, @@ -151,7 +149,7 @@ bool BigramDictionary::isValidBigram(const int *word0, int length0, const int *w // getBigramListPositionForWord returns 0 if this word isn't in the dictionary or has no bigrams if (NOT_A_DICT_POS == pos) return false; int nextWordPos = mBinaryDictionaryInfo->getStructurePolicy()->getTerminalNodePositionOfWord( - mBinaryDictionaryInfo, word1, length1, false /* forceLowerCaseSearch */); + word1, length1, false /* forceLowerCaseSearch */); if (NOT_A_VALID_WORD_POS == nextWordPos) return false; BinaryDictionaryBigramsIterator bigramsIt(mBinaryDictionaryInfo, pos); diff --git a/native/jni/src/suggest/core/dictionary/binary_dictionary_format_utils.cpp b/native/jni/src/suggest/core/dictionary/binary_dictionary_format_utils.cpp index 5d14a0554..0e8d72f2e 100644 --- a/native/jni/src/suggest/core/dictionary/binary_dictionary_format_utils.cpp +++ b/native/jni/src/suggest/core/dictionary/binary_dictionary_format_utils.cpp @@ -61,8 +61,7 @@ const int BinaryDictionaryFormatUtils::HEADER_VERSION_2_MINIMUM_SIZE = 12; if (ByteArrayUtils::readUint16(dict, 4) == 2) { return VERSION_2; } else if (ByteArrayUtils::readUint16(dict, 4) == 3) { - // TODO: Support version 3 dictionary. - return UNKNOWN_VERSION; + return VERSION_3; } else { return UNKNOWN_VERSION; } diff --git a/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h b/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h index cbea18f90..c694c6a3a 100644 --- a/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h +++ b/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h @@ -23,7 +23,7 @@ #include "jni.h" #include "suggest/core/dictionary/binary_dictionary_format_utils.h" #include "suggest/core/dictionary/binary_dictionary_header.h" -#include "suggest/policyimpl/dictionary/dictionary_structure_policy_factory.h" +#include "suggest/policyimpl/dictionary/dictionary_structure_with_buffer_policy_factory.h" #include "utils/log_utils.h" namespace latinime { @@ -37,11 +37,16 @@ class BinaryDictionaryInfo { mDictionaryFormat(BinaryDictionaryFormatUtils::detectFormatVersion( mDictBuf, mDictSize)), mDictionaryHeader(this), mDictRoot(mDictBuf + mDictionaryHeader.getSize()), - mStructurePolicy(DictionaryStructurePolicyFactory::getDictionaryStructurePolicy( - mDictionaryFormat)) { + // TODO: Remove. + mStructurePolicy(DictionaryStructureWithBufferPolicyFactory + ::newDictionaryStructurePolicy(this)) { logDictionaryInfo(env); } + ~BinaryDictionaryInfo() { + delete mStructurePolicy; + } + AK_FORCE_INLINE const uint8_t *getDictBuf() const { return mDictBuf; } @@ -66,6 +71,7 @@ class BinaryDictionaryInfo { return mDictionaryFormat; } + // TODO: Move to DictionaryStructurePolicy. AK_FORCE_INLINE const BinaryDictionaryHeader *getHeader() const { return &mDictionaryHeader; } @@ -76,7 +82,8 @@ class BinaryDictionaryInfo { return mIsUpdatable && isUpdatableDictionaryFormat; } - AK_FORCE_INLINE const DictionaryStructurePolicy *getStructurePolicy() const { + // TODO: remove + AK_FORCE_INLINE const DictionaryStructureWithBufferPolicy *getStructurePolicy() const { return mStructurePolicy; } @@ -89,9 +96,12 @@ class BinaryDictionaryInfo { const int mDictBufOffset; const bool mIsUpdatable; const BinaryDictionaryFormatUtils::FORMAT_VERSION mDictionaryFormat; + // TODO: Move BinaryDictionaryHeader to policyimpl and introduce dedicated API to the + // DictionaryStructurePolicy. const BinaryDictionaryHeader mDictionaryHeader; const uint8_t *const mDictRoot; - const DictionaryStructurePolicy *const mStructurePolicy; + // TODO: remove + const DictionaryStructureWithBufferPolicy *const mStructurePolicy; AK_FORCE_INLINE void logDictionaryInfo(JNIEnv *const env) const { const int BUFFER_SIZE = 16; diff --git a/native/jni/src/suggest/core/dictionary/dictionary.cpp b/native/jni/src/suggest/core/dictionary/dictionary.cpp index 4a9e38fe8..891b80331 100644 --- a/native/jni/src/suggest/core/dictionary/dictionary.cpp +++ b/native/jni/src/suggest/core/dictionary/dictionary.cpp @@ -83,14 +83,14 @@ int Dictionary::getBigrams(const int *word, int length, int *outWords, int *freq } int Dictionary::getProbability(const int *word, int length) const { - const DictionaryStructurePolicy *const structurePolicy = + const DictionaryStructureWithBufferPolicy *const structurePolicy = mBinaryDictionaryInfo.getStructurePolicy(); - int pos = structurePolicy->getTerminalNodePositionOfWord(&mBinaryDictionaryInfo, word, length, + int pos = structurePolicy->getTerminalNodePositionOfWord(word, length, false /* forceLowerCaseSearch */); if (NOT_A_VALID_WORD_POS == pos) { return NOT_A_PROBABILITY; } - return structurePolicy->getUnigramProbability(&mBinaryDictionaryInfo, pos); + return structurePolicy->getUnigramProbability(pos); } bool Dictionary::isValidBigram(const int *word0, int length0, const int *word1, int length1) const { diff --git a/native/jni/src/suggest/core/dictionary/multi_bigram_map.h b/native/jni/src/suggest/core/dictionary/multi_bigram_map.h index d5eafe1bf..085438008 100644 --- a/native/jni/src/suggest/core/dictionary/multi_bigram_map.h +++ b/native/jni/src/suggest/core/dictionary/multi_bigram_map.h @@ -68,7 +68,7 @@ class MultiBigramMap { void init(const BinaryDictionaryInfo *const binaryDictionaryInfo, const int nodePos) { const int bigramsListPos = binaryDictionaryInfo->getStructurePolicy()-> - getBigramsPositionOfNode(binaryDictionaryInfo, nodePos); + getBigramsPositionOfNode(nodePos); BinaryDictionaryBigramsIterator bigramsIt(binaryDictionaryInfo, bigramsListPos); while (bigramsIt.hasNext()) { bigramsIt.next(); @@ -108,7 +108,7 @@ class MultiBigramMap { const BinaryDictionaryInfo *const binaryDictionaryInfo, const int nodePos, const int nextWordPosition, const int unigramProbability) { const int bigramsListPos = binaryDictionaryInfo->getStructurePolicy()-> - getBigramsPositionOfNode(binaryDictionaryInfo, nodePos); + getBigramsPositionOfNode(nodePos); BinaryDictionaryBigramsIterator bigramsIt(binaryDictionaryInfo, bigramsListPos); while (bigramsIt.hasNext()) { bigramsIt.next(); diff --git a/native/jni/src/suggest/core/policy/dictionary_structure_policy.h b/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h index cc14c982c..dce4e741a 100644 --- a/native/jni/src/suggest/core/policy/dictionary_structure_policy.h +++ b/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h @@ -21,7 +21,6 @@ namespace latinime { -class BinaryDictionaryInfo; class DicNode; class DicNodeVector; @@ -29,7 +28,7 @@ class DicNodeVector; * This class abstracts structure of dictionaries. * Implement this policy to support additional dictionaries. */ -class DictionaryStructurePolicy { +class DictionaryStructureWithBufferPolicy { public: // This provides a filtering method for filtering new node. class NodeFilter { @@ -44,36 +43,31 @@ class DictionaryStructurePolicy { DISALLOW_COPY_AND_ASSIGN(NodeFilter); }; + virtual ~DictionaryStructureWithBufferPolicy() {} + virtual int getRootPosition() const = 0; virtual void createAndGetAllChildNodes(const DicNode *const dicNode, - const BinaryDictionaryInfo *const binaryDictionaryInfo, const NodeFilter *const nodeFilter, DicNodeVector *const childDicNodes) const = 0; virtual int getCodePointsAndProbabilityAndReturnCodePointCount( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int nodePos, const int maxCodePointCount, int *const outCodePoints, int *const outUnigramProbability) const = 0; - virtual int getTerminalNodePositionOfWord( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int *const inWord, + virtual int getTerminalNodePositionOfWord(const int *const inWord, const int length, const bool forceLowerCaseSearch) const = 0; - virtual int getUnigramProbability(const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const = 0; + virtual int getUnigramProbability(const int nodePos) const = 0; - virtual int getShortcutPositionOfNode(const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const = 0; + virtual int getShortcutPositionOfNode(const int nodePos) const = 0; - virtual int getBigramsPositionOfNode(const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const = 0; + virtual int getBigramsPositionOfNode(const int nodePos) const = 0; protected: - DictionaryStructurePolicy() {} - virtual ~DictionaryStructurePolicy() {} + DictionaryStructureWithBufferPolicy() {} private: - DISALLOW_COPY_AND_ASSIGN(DictionaryStructurePolicy); + DISALLOW_COPY_AND_ASSIGN(DictionaryStructureWithBufferPolicy); }; } // namespace latinime #endif /* LATINIME_DICTIONARY_STRUCTURE_POLICY_H */ diff --git a/native/jni/src/suggest/core/session/dic_traverse_session.cpp b/native/jni/src/suggest/core/session/dic_traverse_session.cpp index 7651b19a0..11a147bda 100644 --- a/native/jni/src/suggest/core/session/dic_traverse_session.cpp +++ b/native/jni/src/suggest/core/session/dic_traverse_session.cpp @@ -37,12 +37,12 @@ void DicTraverseSession::init(const Dictionary *const dictionary, const int *pre } // TODO: merge following similar calls to getTerminalPosition into one case-insensitive call. mPrevWordPos = binaryDictionaryInfo->getStructurePolicy()->getTerminalNodePositionOfWord( - binaryDictionaryInfo, prevWord, prevWordLength, false /* forceLowerCaseSearch */); + prevWord, prevWordLength, false /* forceLowerCaseSearch */); if (mPrevWordPos == NOT_A_VALID_WORD_POS) { // Check bigrams for lower-cased previous word if original was not found. Useful for // auto-capitalized words like "The [current_word]". mPrevWordPos = binaryDictionaryInfo->getStructurePolicy()->getTerminalNodePositionOfWord( - binaryDictionaryInfo, prevWord, prevWordLength, true /* forceLowerCaseSearch */); + prevWord, prevWordLength, true /* forceLowerCaseSearch */); } } diff --git a/native/jni/src/suggest/core/session/dic_traverse_session.h b/native/jni/src/suggest/core/session/dic_traverse_session.h index de57e041a..5c4cef02d 100644 --- a/native/jni/src/suggest/core/session/dic_traverse_session.h +++ b/native/jni/src/suggest/core/session/dic_traverse_session.h @@ -75,7 +75,7 @@ class DicTraverseSession { const int maxPointerCount); void resetCache(const int nextActiveCacheSize, const int maxWords); - // TODO: Remove + // TODO: Use DictionaryStructurePolicy instead of BinaryDictionaryInfo. const BinaryDictionaryInfo *getBinaryDictionaryInfo() const; //-------------------- diff --git a/native/jni/src/suggest/core/suggest.cpp b/native/jni/src/suggest/core/suggest.cpp index 9376d7b93..f28efd526 100644 --- a/native/jni/src/suggest/core/suggest.cpp +++ b/native/jni/src/suggest/core/suggest.cpp @@ -215,7 +215,7 @@ int Suggest::outputSuggestions(DicTraverseSession *traverseSession, int *frequen traverseSession->getBinaryDictionaryInfo(); const TerminalAttributes terminalAttributes(traverseSession->getBinaryDictionaryInfo(), binaryDictionaryInfo->getStructurePolicy()->getShortcutPositionOfNode( - binaryDictionaryInfo, terminalDicNode->getPos())); + terminalDicNode->getPos())); // Shortcut is not supported for multiple words suggestions. // TODO: Check shortcuts during traversal for multiple words suggestions. const bool sameAsTyped = TRAVERSAL->sameAsTyped(traverseSession, terminalDicNode); diff --git a/native/jni/src/suggest/policyimpl/dictionary/dictionary_structure_policy_factory.h b/native/jni/src/suggest/policyimpl/dictionary/dictionary_structure_policy_factory.h deleted file mode 100644 index c0df89f49..000000000 --- a/native/jni/src/suggest/policyimpl/dictionary/dictionary_structure_policy_factory.h +++ /dev/null @@ -1,48 +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. - */ - -#ifndef LATINIME_DICTIONARY_STRUCTURE_POLICY_FACTORY_H -#define LATINIME_DICTIONARY_STRUCTURE_POLICY_FACTORY_H - -#include "defines.h" -#include "suggest/core/dictionary/binary_dictionary_format_utils.h" -#include "suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.h" -#include "suggest/policyimpl/dictionary/patricia_trie_policy.h" - -namespace latinime { - -class DictionaryStructurePolicy; - -class DictionaryStructurePolicyFactory { - public: - static const DictionaryStructurePolicy *getDictionaryStructurePolicy( - const BinaryDictionaryFormatUtils::FORMAT_VERSION dictionaryFormat) { - switch (dictionaryFormat) { - case BinaryDictionaryFormatUtils::VERSION_2: - return PatriciaTriePolicy::getInstance(); - case BinaryDictionaryFormatUtils::VERSION_3: - return DynamicPatriciaTriePolicy::getInstance(); - default: - ASSERT(false); - return 0; - } - } - - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(DictionaryStructurePolicyFactory); -}; -} // namespace latinime -#endif // LATINIME_DICTIONARY_STRUCTURE_POLICY_FACTORY_H diff --git a/native/jni/src/suggest/policyimpl/dictionary/dictionary_structure_with_buffer_policy_factory.cpp b/native/jni/src/suggest/policyimpl/dictionary/dictionary_structure_with_buffer_policy_factory.cpp new file mode 100644 index 000000000..f2c586245 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/dictionary/dictionary_structure_with_buffer_policy_factory.cpp @@ -0,0 +1,42 @@ +/* + * 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. + */ + +#include "suggest/policyimpl/dictionary/dictionary_structure_with_buffer_policy_factory.h" + +#include "defines.h" +#include "suggest/core/dictionary/binary_dictionary_info.h" +#include "suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.h" +#include "suggest/policyimpl/dictionary/patricia_trie_policy.h" + +namespace latinime { + +/* static */ DictionaryStructureWithBufferPolicy *DictionaryStructureWithBufferPolicyFactory + ::newDictionaryStructurePolicy( + const BinaryDictionaryInfo *const binaryDictionaryInfo) { + switch (binaryDictionaryInfo->getFormat()) { + case BinaryDictionaryFormatUtils::VERSION_2: + return new PatriciaTriePolicy(binaryDictionaryInfo->getDictRoot(), + binaryDictionaryInfo); + case BinaryDictionaryFormatUtils::VERSION_3: + return new DynamicPatriciaTriePolicy(binaryDictionaryInfo->getDictRoot(), + binaryDictionaryInfo); + default: + ASSERT(false); + return 0; + } +} + +} // namespace latinime diff --git a/native/jni/src/suggest/policyimpl/dictionary/dictionary_structure_with_buffer_policy_factory.h b/native/jni/src/suggest/policyimpl/dictionary/dictionary_structure_with_buffer_policy_factory.h new file mode 100644 index 000000000..95f82aabe --- /dev/null +++ b/native/jni/src/suggest/policyimpl/dictionary/dictionary_structure_with_buffer_policy_factory.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +#ifndef LATINIME_DICTIONARY_STRUCTURE_WITH_BUFFER_POLICY_FACTORY_H +#define LATINIME_DICTIONARY_STRUCTURE_WITH_BUFFER_POLICY_FACTORY_H + +#include "defines.h" + +#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h" + +namespace latinime { + +class BinaryDictionaryInfo; + +class DictionaryStructureWithBufferPolicyFactory { + public: + static DictionaryStructureWithBufferPolicy *newDictionaryStructurePolicy( + const BinaryDictionaryInfo *const binaryDictionaryInfo); + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(DictionaryStructureWithBufferPolicyFactory); +}; +} // namespace latinime +#endif // LATINIME_DICTIONARY_STRUCTURE_WITH_BUFFER_POLICY_FACTORY_H diff --git a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp index 20cda91a3..7ac635a00 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp +++ b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp @@ -27,7 +27,9 @@ void DynamicPatriciaTrieNodeReader::fetchNodeInfoFromBufferAndProcessMovedNode(c const uint8_t *const dictRoot = mBinaryDictionaryInfo->getDictRoot(); int pos = nodePos; mFlags = PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictRoot, &pos); - mParentPos = DynamicPatriciaTrieReadingUtils::getParentPosAndAdvancePosition(dictRoot, &pos); + const int parentPos = + DynamicPatriciaTrieReadingUtils::getParentPosAndAdvancePosition(dictRoot, &pos); + mParentPos = (parentPos != 0) ? mNodePos + parentPos : NOT_A_DICT_POS; if (outCodePoints != 0) { mCodePointCount = PatriciaTrieReadingUtils::getCharsAndAdvancePosition( dictRoot, mFlags, maxCodePointCount, outCodePoints, &pos); diff --git a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.h b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.h index b668aab78..71558edaa 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.h +++ b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.h @@ -42,7 +42,7 @@ class DynamicPatriciaTrieNodeReader { // Reads node information from dictionary buffer and updates members with the information. AK_FORCE_INLINE void fetchNodeInfoFromBuffer(const int nodePos) { - fetchNodeInfoFromBufferAndGetNodeCodePoints(mNodePos , 0 /* maxCodePointCount */, + fetchNodeInfoFromBufferAndGetNodeCodePoints(nodePos , 0 /* maxCodePointCount */, 0 /* outCodePoints */); } diff --git a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp index 9a180e6f7..bb49bb15c 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp +++ b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp @@ -26,25 +26,34 @@ namespace latinime { -const DynamicPatriciaTriePolicy DynamicPatriciaTriePolicy::sInstance; +// To avoid infinite loop caused by invalid or malicious forward links. +const int DynamicPatriciaTriePolicy::MAX_CHILD_COUNT_TO_AVOID_INFINITE_LOOP = 100000; void DynamicPatriciaTriePolicy::createAndGetAllChildNodes(const DicNode *const dicNode, - const BinaryDictionaryInfo *const binaryDictionaryInfo, const NodeFilter *const nodeFilter, DicNodeVector *const childDicNodes) const { if (!dicNode->hasChildren()) { return; } - DynamicPatriciaTrieNodeReader nodeReader(binaryDictionaryInfo); + DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo); int mergedNodeCodePoints[MAX_WORD_LENGTH]; int nextPos = dicNode->getChildrenPos(); + int totalChildCount = 0; do { const int childCount = PatriciaTrieReadingUtils::getGroupCountAndAdvancePosition( - binaryDictionaryInfo->getDictRoot(), &nextPos); + mDictRoot, &nextPos); + totalChildCount += childCount; + if (childCount <= 0 || totalChildCount > MAX_CHILD_COUNT_TO_AVOID_INFINITE_LOOP) { + // Invalid dictionary. + AKLOGI("Invalid dictionary. childCount: %d, totalChildCount: %d, MAX: %d", + childCount, totalChildCount, MAX_CHILD_COUNT_TO_AVOID_INFINITE_LOOP); + ASSERT(false); + return; + } for (int i = 0; i < childCount; i++) { nodeReader.fetchNodeInfoFromBufferAndGetNodeCodePoints(nextPos, MAX_WORD_LENGTH, mergedNodeCodePoints); if (!nodeReader.isDeleted() && !nodeFilter->isFilteredOut(mergedNodeCodePoints[0])) { - // Push child note when the node is not deleted and not filtered out. + // Push child node when the node is not deleted and not filtered out. childDicNodes->pushLeavingChild(dicNode, nodeReader.getNodePos(), nodeReader.getChildrenPos(), nodeReader.getProbability(), nodeReader.isTerminal(), nodeReader.hasChildren(), @@ -53,22 +62,24 @@ void DynamicPatriciaTriePolicy::createAndGetAllChildNodes(const DicNode *const d } nextPos = nodeReader.getSiblingNodePos(); } - nextPos = DynamicPatriciaTrieReadingUtils::getForwardLinkPosition( - binaryDictionaryInfo->getDictRoot(), nextPos); - } while(DynamicPatriciaTrieReadingUtils::isValidForwardLinkPosition(nextPos)); + nextPos = DynamicPatriciaTrieReadingUtils::getForwardLinkPosition(mDictRoot, nextPos); + } while (DynamicPatriciaTrieReadingUtils::isValidForwardLinkPosition(nextPos)); } int DynamicPatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int nodePos, const int maxCodePointCount, int *const outCodePoints, int *const outUnigramProbability) const { + if (nodePos == NOT_A_VALID_WORD_POS) { + *outUnigramProbability = NOT_A_PROBABILITY; + return 0; + } // This method traverses parent nodes from the terminal by following parent pointers; thus, // node code points are stored in the buffer in the reverse order. int reverseCodePoints[maxCodePointCount]; int mergedNodeCodePoints[maxCodePointCount]; int codePointCount = 0; - DynamicPatriciaTrieNodeReader nodeReader(binaryDictionaryInfo); + DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo); // First, read terminal node and get its probability. nodeReader.fetchNodeInfoFromBufferAndGetNodeCodePoints(nodePos, maxCodePointCount, mergedNodeCodePoints); @@ -79,7 +90,7 @@ int DynamicPatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCoun reverseCodePoints[codePointCount++] = mergedNodeCodePoints[i]; } // Then, follow parent pos toward the root node. - while (nodeReader.getParentPos() != getRootPosition()) { + while (nodeReader.getParentPos() != NOT_A_DICT_POS) { // codePointCount must be incremented at least once in each iteration to ensure preventing // infinite loop. if (nodeReader.isDeleted() || codePointCount > maxCodePointCount @@ -103,16 +114,87 @@ int DynamicPatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCoun return codePointCount; } -int DynamicPatriciaTriePolicy::getTerminalNodePositionOfWord( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int *const inWord, +int DynamicPatriciaTriePolicy::getTerminalNodePositionOfWord(const int *const inWord, const int length, const bool forceLowerCaseSearch) const { - // TODO: Implement. - return NOT_A_DICT_POS; + int searchCodePoints[length]; + for (int i = 0; i < length; ++i) { + searchCodePoints[i] = forceLowerCaseSearch ? CharUtils::toLowerCase(inWord[i]) : inWord[i]; + } + int mergedNodeCodePoints[MAX_WORD_LENGTH]; + int currentLength = 0; + int pos = getRootPosition(); + DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo); + while (currentLength <= length) { + // When foundMatchedNode becomes true, currentLength is increased at least once. + bool foundMatchedNode = false; + int totalChildCount = 0; + do { + const int childCount = PatriciaTrieReadingUtils::getGroupCountAndAdvancePosition( + mDictRoot, &pos); + totalChildCount += childCount; + if (childCount <= 0 || totalChildCount > MAX_CHILD_COUNT_TO_AVOID_INFINITE_LOOP) { + // Invalid dictionary. + AKLOGI("Invalid dictionary. childCount: %d, totalChildCount: %d, MAX: %d", + childCount, totalChildCount, MAX_CHILD_COUNT_TO_AVOID_INFINITE_LOOP); + ASSERT(false); + return NOT_A_VALID_WORD_POS; + } + for (int i = 0; i < childCount; i++) { + nodeReader.fetchNodeInfoFromBufferAndGetNodeCodePoints(pos, MAX_WORD_LENGTH, + mergedNodeCodePoints); + if (nodeReader.isDeleted() || nodeReader.getCodePointCount() <= 0) { + // Skip deleted or empty node. + pos = nodeReader.getSiblingNodePos(); + continue; + } + bool matched = true; + for (int j = 0; j < nodeReader.getCodePointCount(); ++j) { + if (mergedNodeCodePoints[j] != searchCodePoints[currentLength + j]) { + // Different code point is found. + matched = false; + break; + } + } + if (matched) { + currentLength += nodeReader.getCodePointCount(); + if (length == currentLength) { + // Terminal position is found. + return nodeReader.getNodePos(); + } + if (!nodeReader.hasChildren()) { + return NOT_A_VALID_WORD_POS; + } + foundMatchedNode = true; + // Advance to the children nodes. + pos = nodeReader.getChildrenPos(); + break; + } + // Try next sibling node. + pos = nodeReader.getSiblingNodePos(); + } + if (foundMatchedNode) { + break; + } + // If the matched node is not found in the current node group, try to follow the + // forward link. + pos = DynamicPatriciaTrieReadingUtils::getForwardLinkPosition( + mDictRoot, pos); + } while (DynamicPatriciaTrieReadingUtils::isValidForwardLinkPosition(pos)); + if (!foundMatchedNode) { + // Matched node is not found. + return NOT_A_VALID_WORD_POS; + } + } + // If we already traversed the tree further than the word is long, there means + // there was no match (or we would have found it). + return NOT_A_VALID_WORD_POS; } -int DynamicPatriciaTriePolicy::getUnigramProbability( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int nodePos) const { - DynamicPatriciaTrieNodeReader nodeReader(binaryDictionaryInfo); +int DynamicPatriciaTriePolicy::getUnigramProbability(const int nodePos) const { + if (nodePos == NOT_A_VALID_WORD_POS) { + return NOT_A_PROBABILITY; + } + DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo); nodeReader.fetchNodeInfoFromBuffer(nodePos); if (nodeReader.isDeleted() || nodeReader.isBlacklisted() || nodeReader.isNotAWord()) { return NOT_A_PROBABILITY; @@ -120,10 +202,11 @@ int DynamicPatriciaTriePolicy::getUnigramProbability( return nodeReader.getProbability(); } -int DynamicPatriciaTriePolicy::getShortcutPositionOfNode( - const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const { - DynamicPatriciaTrieNodeReader nodeReader(binaryDictionaryInfo); +int DynamicPatriciaTriePolicy::getShortcutPositionOfNode(const int nodePos) const { + if (nodePos == NOT_A_VALID_WORD_POS) { + return NOT_A_DICT_POS; + } + DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo); nodeReader.fetchNodeInfoFromBuffer(nodePos); if (nodeReader.isDeleted()) { return NOT_A_DICT_POS; @@ -131,10 +214,11 @@ int DynamicPatriciaTriePolicy::getShortcutPositionOfNode( return nodeReader.getShortcutPos(); } -int DynamicPatriciaTriePolicy::getBigramsPositionOfNode( - const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const { - DynamicPatriciaTrieNodeReader nodeReader(binaryDictionaryInfo); +int DynamicPatriciaTriePolicy::getBigramsPositionOfNode(const int nodePos) const { + if (nodePos == NOT_A_VALID_WORD_POS) { + return NOT_A_DICT_POS; + } + DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo); nodeReader.fetchNodeInfoFromBuffer(nodePos); if (nodeReader.isDeleted()) { return NOT_A_DICT_POS; diff --git a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.h index 39dfb86fd..e92672128 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.h +++ b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.h @@ -17,8 +17,10 @@ #ifndef LATINIME_DYNAMIC_PATRICIA_TRIE_POLICY_H #define LATINIME_DYNAMIC_PATRICIA_TRIE_POLICY_H +#include <stdint.h> + #include "defines.h" -#include "suggest/core/policy/dictionary_structure_policy.h" +#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h" namespace latinime { @@ -26,44 +28,41 @@ class BinaryDictionaryInfo; class DicNode; class DicNodeVector; -class DynamicPatriciaTriePolicy : public DictionaryStructurePolicy { +class DynamicPatriciaTriePolicy : public DictionaryStructureWithBufferPolicy { public: - static AK_FORCE_INLINE const DynamicPatriciaTriePolicy *getInstance() { - return &sInstance; - } + DynamicPatriciaTriePolicy(const uint8_t *const dictRoot, + const BinaryDictionaryInfo *const binaryDictionaryInfo) + : mDictRoot(dictRoot), mBinaryDictionaryInfo(binaryDictionaryInfo) {} + + ~DynamicPatriciaTriePolicy() {} AK_FORCE_INLINE int getRootPosition() const { return 0; } void createAndGetAllChildNodes(const DicNode *const dicNode, - const BinaryDictionaryInfo *const binaryDictionaryInfo, const NodeFilter *const nodeFilter, DicNodeVector *const childDicNodes) const; int getCodePointsAndProbabilityAndReturnCodePointCount( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int terminalNodePos, const int maxCodePointCount, int *const outCodePoints, int *const outUnigramProbability) const; - int getTerminalNodePositionOfWord( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int *const inWord, + int getTerminalNodePositionOfWord(const int *const inWord, const int length, const bool forceLowerCaseSearch) const; - int getUnigramProbability(const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const; + int getUnigramProbability(const int nodePos) const; - int getShortcutPositionOfNode(const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const; + int getShortcutPositionOfNode(const int nodePos) const; - int getBigramsPositionOfNode(const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const; + int getBigramsPositionOfNode(const int nodePos) const; private: - DISALLOW_COPY_AND_ASSIGN(DynamicPatriciaTriePolicy); - static const DynamicPatriciaTriePolicy sInstance; + DISALLOW_IMPLICIT_CONSTRUCTORS(DynamicPatriciaTriePolicy); + static const int MAX_CHILD_COUNT_TO_AVOID_INFINITE_LOOP; - DynamicPatriciaTriePolicy() {} - ~DynamicPatriciaTriePolicy() {} + const uint8_t *const mDictRoot; + // TODO: remove + const BinaryDictionaryInfo *const mBinaryDictionaryInfo; }; } // namespace latinime #endif // LATINIME_DYNAMIC_PATRICIA_TRIE_POLICY_H diff --git a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h index f44c2651a..5398d7e37 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h +++ b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h @@ -39,8 +39,7 @@ class DynamicPatriciaTrieReadingUtils { static AK_FORCE_INLINE int getParentPosAndAdvancePosition(const uint8_t *const buffer, int *const pos) { - const int base = *pos; - return base + ByteArrayUtils::readSint24AndAdvancePosition(buffer, pos); + return ByteArrayUtils::readSint24AndAdvancePosition(buffer, pos); } static int readChildrenPositionAndAdvancePosition(const uint8_t *const buffer, diff --git a/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.cpp index 097f7c86a..fd5f6e7dd 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.cpp +++ b/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.cpp @@ -27,48 +27,39 @@ namespace latinime { -const PatriciaTriePolicy PatriciaTriePolicy::sInstance; - void PatriciaTriePolicy::createAndGetAllChildNodes(const DicNode *const dicNode, - const BinaryDictionaryInfo *const binaryDictionaryInfo, const NodeFilter *const nodeFilter, DicNodeVector *const childDicNodes) const { if (!dicNode->hasChildren()) { return; } int nextPos = dicNode->getChildrenPos(); const int childCount = PatriciaTrieReadingUtils::getGroupCountAndAdvancePosition( - binaryDictionaryInfo->getDictRoot(), &nextPos); + mDictRoot, &nextPos); for (int i = 0; i < childCount; i++) { - nextPos = createAndGetLeavingChildNode(dicNode, nextPos, binaryDictionaryInfo, - nodeFilter, childDicNodes); + nextPos = createAndGetLeavingChildNode(dicNode, nextPos, nodeFilter, childDicNodes); } } int PatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int nodePos, const int maxCodePointCount, int *const outCodePoints, int *const outUnigramProbability) const { - return BinaryFormat::getCodePointsAndProbabilityAndReturnCodePointCount( - binaryDictionaryInfo->getDictRoot(), nodePos, + return BinaryFormat::getCodePointsAndProbabilityAndReturnCodePointCount(mDictRoot, nodePos, maxCodePointCount, outCodePoints, outUnigramProbability); } -int PatriciaTriePolicy::getTerminalNodePositionOfWord( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int *const inWord, +int PatriciaTriePolicy::getTerminalNodePositionOfWord(const int *const inWord, const int length, const bool forceLowerCaseSearch) const { - return BinaryFormat::getTerminalPosition(binaryDictionaryInfo->getDictRoot(), inWord, + return BinaryFormat::getTerminalPosition(mDictRoot, inWord, length, forceLowerCaseSearch); } -int PatriciaTriePolicy::getUnigramProbability( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int nodePos) const { +int PatriciaTriePolicy::getUnigramProbability(const int nodePos) const { if (nodePos == NOT_A_VALID_WORD_POS) { return NOT_A_PROBABILITY; } - const uint8_t *const dictRoot = binaryDictionaryInfo->getDictRoot(); int pos = nodePos; const PatriciaTrieReadingUtils::NodeFlags flags = - PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictRoot, &pos); + PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(mDictRoot, &pos); if (!PatriciaTrieReadingUtils::isTerminal(flags)) { return NOT_A_PROBABILITY; } @@ -79,81 +70,74 @@ int PatriciaTriePolicy::getUnigramProbability( // for shortcuts). return NOT_A_PROBABILITY; } - PatriciaTrieReadingUtils::skipCharacters(dictRoot, flags, MAX_WORD_LENGTH, &pos); - return PatriciaTrieReadingUtils::readProbabilityAndAdvancePosition(dictRoot, &pos); + PatriciaTrieReadingUtils::skipCharacters(mDictRoot, flags, MAX_WORD_LENGTH, &pos); + return PatriciaTrieReadingUtils::readProbabilityAndAdvancePosition(mDictRoot, &pos); } -int PatriciaTriePolicy::getShortcutPositionOfNode( - const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const { +int PatriciaTriePolicy::getShortcutPositionOfNode(const int nodePos) const { if (nodePos == NOT_A_VALID_WORD_POS) { return NOT_A_DICT_POS; } - const uint8_t *const dictRoot = binaryDictionaryInfo->getDictRoot(); int pos = nodePos; const PatriciaTrieReadingUtils::NodeFlags flags = - PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictRoot, &pos); + PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(mDictRoot, &pos); if (!PatriciaTrieReadingUtils::hasShortcutTargets(flags)) { return NOT_A_DICT_POS; } - PatriciaTrieReadingUtils::skipCharacters(dictRoot, flags, MAX_WORD_LENGTH, &pos); + PatriciaTrieReadingUtils::skipCharacters(mDictRoot, flags, MAX_WORD_LENGTH, &pos); if (PatriciaTrieReadingUtils::isTerminal(flags)) { - PatriciaTrieReadingUtils::readProbabilityAndAdvancePosition(dictRoot, &pos); + PatriciaTrieReadingUtils::readProbabilityAndAdvancePosition(mDictRoot, &pos); } if (PatriciaTrieReadingUtils::hasChildrenInFlags(flags)) { - PatriciaTrieReadingUtils::readChildrenPositionAndAdvancePosition(dictRoot, flags, &pos); + PatriciaTrieReadingUtils::readChildrenPositionAndAdvancePosition(mDictRoot, flags, &pos); } return pos; } -int PatriciaTriePolicy::getBigramsPositionOfNode( - const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const { +int PatriciaTriePolicy::getBigramsPositionOfNode(const int nodePos) const { if (nodePos == NOT_A_VALID_WORD_POS) { return NOT_A_DICT_POS; } - const uint8_t *const dictRoot = binaryDictionaryInfo->getDictRoot(); int pos = nodePos; const PatriciaTrieReadingUtils::NodeFlags flags = - PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictRoot, &pos); + PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(mDictRoot, &pos); if (!PatriciaTrieReadingUtils::hasBigrams(flags)) { return NOT_A_DICT_POS; } - PatriciaTrieReadingUtils::skipCharacters(dictRoot, flags, MAX_WORD_LENGTH, &pos); + PatriciaTrieReadingUtils::skipCharacters(mDictRoot, flags, MAX_WORD_LENGTH, &pos); if (PatriciaTrieReadingUtils::isTerminal(flags)) { - PatriciaTrieReadingUtils::readProbabilityAndAdvancePosition(dictRoot, &pos); + PatriciaTrieReadingUtils::readProbabilityAndAdvancePosition(mDictRoot, &pos); } if (PatriciaTrieReadingUtils::hasChildrenInFlags(flags)) { - PatriciaTrieReadingUtils::readChildrenPositionAndAdvancePosition(dictRoot, flags, &pos); + PatriciaTrieReadingUtils::readChildrenPositionAndAdvancePosition(mDictRoot, flags, &pos); } if (PatriciaTrieReadingUtils::hasShortcutTargets(flags)) { - BinaryDictionaryTerminalAttributesReadingUtils::skipShortcuts(binaryDictionaryInfo, &pos); + BinaryDictionaryTerminalAttributesReadingUtils::skipShortcuts(mBinaryDictionaryInfo, &pos); } return pos; } int PatriciaTriePolicy::createAndGetLeavingChildNode(const DicNode *const dicNode, - const int nodePos, const BinaryDictionaryInfo *const binaryDictionaryInfo, - const NodeFilter *const childrenFilter, DicNodeVector *childDicNodes) const { - const uint8_t *const dictRoot = binaryDictionaryInfo->getDictRoot(); + const int nodePos, const NodeFilter *const childrenFilter, + DicNodeVector *childDicNodes) const { int pos = nodePos; const PatriciaTrieReadingUtils::NodeFlags flags = - PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictRoot, &pos); + PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(mDictRoot, &pos); int mergedNodeCodePoints[MAX_WORD_LENGTH]; const int mergedNodeCodePointCount = PatriciaTrieReadingUtils::getCharsAndAdvancePosition( - dictRoot, flags, MAX_WORD_LENGTH, mergedNodeCodePoints, &pos); + mDictRoot, flags, MAX_WORD_LENGTH, mergedNodeCodePoints, &pos); const int probability = (PatriciaTrieReadingUtils::isTerminal(flags))? - PatriciaTrieReadingUtils::readProbabilityAndAdvancePosition(dictRoot, &pos) + PatriciaTrieReadingUtils::readProbabilityAndAdvancePosition(mDictRoot, &pos) : NOT_A_PROBABILITY; const int childrenPos = PatriciaTrieReadingUtils::hasChildrenInFlags(flags) ? PatriciaTrieReadingUtils::readChildrenPositionAndAdvancePosition( - dictRoot, flags, &pos) : NOT_A_DICT_POS; + mDictRoot, flags, &pos) : NOT_A_DICT_POS; if (PatriciaTrieReadingUtils::hasShortcutTargets(flags)) { - BinaryDictionaryTerminalAttributesReadingUtils::skipShortcuts(binaryDictionaryInfo, &pos); + BinaryDictionaryTerminalAttributesReadingUtils::skipShortcuts(mBinaryDictionaryInfo, &pos); } if (PatriciaTrieReadingUtils::hasBigrams(flags)) { BinaryDictionaryTerminalAttributesReadingUtils::skipExistingBigrams( - binaryDictionaryInfo, &pos); + mBinaryDictionaryInfo, &pos); } if (!childrenFilter->isFilteredOut(mergedNodeCodePoints[0])) { childDicNodes->pushLeavingChild(dicNode, nodePos, childrenPos, probability, diff --git a/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.h index 71f256eee..e1034127c 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.h +++ b/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.h @@ -17,52 +17,53 @@ #ifndef LATINIME_PATRICIA_TRIE_POLICY_H #define LATINIME_PATRICIA_TRIE_POLICY_H +#include <stdint.h> + #include "defines.h" -#include "suggest/core/policy/dictionary_structure_policy.h" +#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h" namespace latinime { -class PatriciaTriePolicy : public DictionaryStructurePolicy { +class BinaryDictionaryInfo; +class DicNode; +class DicNodeVector; + +class PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy { public: - static AK_FORCE_INLINE const PatriciaTriePolicy *getInstance() { - return &sInstance; - } + PatriciaTriePolicy(const uint8_t *const dictRoot, + const BinaryDictionaryInfo *const binaryDictionaryInfo) + : mDictRoot(dictRoot), mBinaryDictionaryInfo(binaryDictionaryInfo) {} + + ~PatriciaTriePolicy() {} AK_FORCE_INLINE int getRootPosition() const { return 0; } void createAndGetAllChildNodes(const DicNode *const dicNode, - const BinaryDictionaryInfo *const binaryDictionaryInfo, const NodeFilter *const nodeFilter, DicNodeVector *const childDicNodes) const; int getCodePointsAndProbabilityAndReturnCodePointCount( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int terminalNodePos, const int maxCodePointCount, int *const outCodePoints, int *const outUnigramProbability) const; - int getTerminalNodePositionOfWord( - const BinaryDictionaryInfo *const binaryDictionaryInfo, const int *const inWord, + int getTerminalNodePositionOfWord(const int *const inWord, const int length, const bool forceLowerCaseSearch) const; - int getUnigramProbability(const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const; + int getUnigramProbability(const int nodePos) const; - int getShortcutPositionOfNode(const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const; + int getShortcutPositionOfNode(const int nodePos) const; - int getBigramsPositionOfNode(const BinaryDictionaryInfo *const binaryDictionaryInfo, - const int nodePos) const; + int getBigramsPositionOfNode(const int nodePos) const; private: - DISALLOW_COPY_AND_ASSIGN(PatriciaTriePolicy); - static const PatriciaTriePolicy sInstance; + DISALLOW_IMPLICIT_CONSTRUCTORS(PatriciaTriePolicy); - PatriciaTriePolicy() {} - ~PatriciaTriePolicy() {} + const uint8_t *const mDictRoot; + // TODO: remove + const BinaryDictionaryInfo *const mBinaryDictionaryInfo; int createAndGetLeavingChildNode(const DicNode *const dicNode, const int nodePos, - const BinaryDictionaryInfo *const binaryDictionaryInfo, const NodeFilter *const nodeFilter, DicNodeVector *const childDicNodes) const; }; } // namespace latinime diff --git a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java index 8f9ef1ddd..b3e2ee0ff 100644 --- a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java +++ b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java @@ -93,7 +93,7 @@ public class UserHistoryDictionaryTests extends AndroidTestCase { final UserHistoryPredictionDictionary dict = PersonalizationDictionaryHelper.getUserHistoryPredictionDictionary( getContext(), locale, mPrefs); - dict.isTest = true; + dict.mIsTest = true; addToDict(dict, words); |