diff options
Diffstat (limited to 'java')
63 files changed, 1573 insertions, 685 deletions
diff --git a/java/proguard.flags b/java/proguard.flags index 34e23aa9a..752ced3e3 100644 --- a/java/proguard.flags +++ b/java/proguard.flags @@ -41,13 +41,7 @@ } -keep class com.android.inputmethod.latin.ResearchLogger { - void setLogFileManager(...); - void clearAll(); - com.android.inputmethod.latin.ResearchLogger$LogFileManager getLogFileManager(); -} - --keep class com.android.inputmethod.latin.ResearchLogger$LogFileManager { - java.lang.String getContents(); + void flush(); } -keep class com.android.inputmethod.keyboard.KeyboardLayoutSet$Builder { diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml index 7431fced8..809ae2be6 100644 --- a/java/res/values-af/strings.xml +++ b/java/res/values-af/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-sleutelbord (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android-sleutelbordinstellings"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Invoeropsies"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android-speltoetser"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android-speltoetser (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Speltoetser se instellings"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Steminvoer is gedeaktiveer"</string> <string name="configure_input_method" msgid="373356270290742459">"Stel invoermetodes op"</string> <string name="language_selection_title" msgid="1651299598555326750">"Invoertale"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Invoertale"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Raak weer om te stoor"</string> <string name="has_dictionary" msgid="6071847973466625007">"Woordeboek beskikbaar"</string> diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml index d70c05da9..351510935 100644 --- a/java/res/values-am/strings.xml +++ b/java/res/values-am/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"የAndroid ቁልፍ ሰሌዳ (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"የAndroid ቁልፍሰሌዳ ቅንብሮች"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"ግቤት አማራጮች"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android የፊደል ማረሚያ"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android የፊደል ማረሚያ (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"የፊደል አራሚ ቅንብሮች"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"የድምፅ ግቤት ቦዝኗል"</string> <string name="configure_input_method" msgid="373356270290742459">"ግቤት ሜተዶችን አዋቀር"</string> <string name="language_selection_title" msgid="1651299598555326750">"ቋንቋዎች አግቤት"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"ቋንቋዎች አግቤት"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"ለማስቀመጥ እንደገና ንካ"</string> <string name="has_dictionary" msgid="6071847973466625007">"መዝገበ ቃላት አለ"</string> diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml index 5678c40c8..805848178 100644 --- a/java/res/values-ar/strings.xml +++ b/java/res/values-ar/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"لوحة مفاتيح Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"إعدادات لوحة مفاتيح Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"خيارات الإرسال"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"التدقيق الإملائي في Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"التدقيق الإملائي في Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"إعدادات التدقيق الإملائي"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"الإدخال الصوتي مُعطل"</string> <string name="configure_input_method" msgid="373356270290742459">"تهيئة طرق الإدخال"</string> <string name="language_selection_title" msgid="1651299598555326750">"لغات الإدخال"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"لغات الإدخال"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"المس مرة أخرى للحفظ"</string> <string name="has_dictionary" msgid="6071847973466625007">"القاموس متاح"</string> diff --git a/java/res/values-be/strings.xml b/java/res/values-be/strings.xml index 4d14565b9..4d5a60f3e 100644 --- a/java/res/values-be/strings.xml +++ b/java/res/values-be/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Клавіятура Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Налады клавіятуры Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Параметры ўводу"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Iнструмент праверкi правапiсу для Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Iнструмент праверкi правапiсу для Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Налады праверкі арфаграфіі"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Галасавы набор адкл."</string> <string name="configure_input_method" msgid="373356270290742459">"Налада метадаў уводу"</string> <string name="language_selection_title" msgid="1651299598555326750">"Мовы ўводу"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Мовы ўводу"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Дакраніцеся зноў, каб захаваць"</string> <string name="has_dictionary" msgid="6071847973466625007">"Слоўнік даступны"</string> diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml index 106a91806..d364370cd 100644 --- a/java/res/values-bg/strings.xml +++ b/java/res/values-bg/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Клавиатура на Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Настройки на клавиатурата на Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Опции за въвеждане"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Програма за правописна проверка за Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Програма за правописна проверка за Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Настройки за проверка на правописа"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Глас. въвежд. е деакт."</string> <string name="configure_input_method" msgid="373356270290742459">"Конфигуриране на въвеждането"</string> <string name="language_selection_title" msgid="1651299598555326750">"Входни езици"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Езици за въвеждане"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Докоснете отново, за да запазите"</string> <string name="has_dictionary" msgid="6071847973466625007">"Има достъп до речник"</string> diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml index e3adbcff4..f1c19dd57 100644 --- a/java/res/values-ca/strings.xml +++ b/java/res/values-ca/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Teclat d\'Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Configuració del teclat d\'Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opcions d\'entrada"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Corrector ortogràfic d\'Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Corrector ortogràfic d\'Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Configuració de la correcció ortogràfica"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. veu desactiv."</string> <string name="configure_input_method" msgid="373356270290742459">"Configura mètodes d\'entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomes d\'entrada"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Idiomes d\'entrada"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Torna a tocar per desar"</string> <string name="has_dictionary" msgid="6071847973466625007">"Diccionari disponible"</string> diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index b3e2ca788..19d0af1a7 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Klávesnice Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Nastavení klávesnice Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti zadávání textu a dat"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Kontrola pravopisu Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Kontrola pravopisu Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Nastavení kontroly pravopisu"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup vypnut"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurace metod zadávání"</string> <string name="language_selection_title" msgid="1651299598555326750">"Vstupní jazyky"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Vstupní jazyky"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Opětovným dotykem provedete uložení"</string> <string name="has_dictionary" msgid="6071847973466625007">"Slovník k dispozici"</string> diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 50b0b0a9f..99ceca2ee 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-tastatur (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android-tastatur-indstillinger"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Indstillinger for input"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android-stavekontrol"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android-stavekontrol (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Indstillinger for stavekontrol"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Stemmeinput deaktiveret"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurer inputmetoder"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inputsprog"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Inputsprog"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Tryk igen for at gemme"</string> <string name="has_dictionary" msgid="6071847973466625007">"Ordbog er tilgængelig"</string> diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index 216aac5d9..2b4663527 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-Tastatur (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android-Tastatureinstellungen"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Eingabeoptionen"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android-Rechtschreibprüfung"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android-Rechtschreibprüfung (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Einstellungen für Rechtschreibprüfung"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spracheingabe deaktiviert"</string> <string name="configure_input_method" msgid="373356270290742459">"Eingabemethoden konfigurieren"</string> <string name="language_selection_title" msgid="1651299598555326750">"Eingabesprachen"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Eingabesprachen"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Zum Speichern erneut berühren"</string> <string name="has_dictionary" msgid="6071847973466625007">"Wörterbuch verfügbar"</string> diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index 486346a09..0a48afe6f 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Πληκτρολόγιο Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Ρυθμίσεις πληκτρολογίου Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Επιλογές εισόδου"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Ορθογραφικός έλεγχος Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Ορθογραφικός έλεγχος Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Ρυθμίσεις ορθογραφικού ελέγχου"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Απεν. φωνητ. είσοδος"</string> <string name="configure_input_method" msgid="373356270290742459">"Διαμόρφωση μεθόδων εισαγωγής"</string> <string name="language_selection_title" msgid="1651299598555326750">"Γλώσσες εισόδου"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Γλώσσες εισόδου"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Αγγίξτε ξανά για αποθήκευση"</string> <string name="has_dictionary" msgid="6071847973466625007">"Λεξικό διαθέσιμο"</string> diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml index 763910789..4e274dda3 100644 --- a/java/res/values-en-rGB/strings.xml +++ b/java/res/values-en-rGB/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android keyboard (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android keyboard settings"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Input options"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android spell checker"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android spell checker (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Spellchecking settings"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Voice input is disabled"</string> <string name="configure_input_method" msgid="373356270290742459">"Configure input methods"</string> <string name="language_selection_title" msgid="1651299598555326750">"Input languages"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Input languages"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Touch again to save"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dictionary available"</string> diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 34ad0a420..bddea2c6d 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Teclado de Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Configuración de teclado de Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opciones de entrada"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Corrector ortográfico de Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Corrector ortográfico de Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Configuración del corrector ortográfico"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"La entrada por voz está inhabilitada"</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Vuelve a tocar para guardar."</string> <string name="has_dictionary" msgid="6071847973466625007">"Diccionario disponible"</string> diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 3c60aa6e2..7ae7627fe 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Teclado Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Ajustes del teclado de Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opciones entrada texto"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Corrector de Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Corrector de Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Ajustes del corrector ortográfico"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entrada de voz inhabilitada"</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toca otra vez para guardar."</string> <string name="has_dictionary" msgid="6071847973466625007">"Hay un diccionario disponible"</string> diff --git a/java/res/values-et/strings.xml b/java/res/values-et/strings.xml index 4a592c36b..d23846bf9 100644 --- a/java/res/values-et/strings.xml +++ b/java/res/values-et/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-klaviatuur (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Androidi klaviatuuriseaded"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Sisestusvalikud"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Androidi õigekirjakontroll"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Androidi õigekirjakontroll (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Õigekirjakontrolli seaded"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Kõnesisend on keelatud"</string> <string name="configure_input_method" msgid="373356270290742459">"Sisestusmeetodite seadistamine"</string> <string name="language_selection_title" msgid="1651299598555326750">"Sisestuskeeled"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Sisestuskeeled"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Salvestamiseks puudutage uuesti"</string> <string name="has_dictionary" msgid="6071847973466625007">"Sõnastik saadaval"</string> diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml index bc0e85b77..95d6fe6c4 100644 --- a/java/res/values-fa/strings.xml +++ b/java/res/values-fa/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"صفحه کلید (Android (AOSP"</string> <string name="english_ime_settings" msgid="6661589557206947774">"تنظیمات صفحه کلید Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"گزینه های ورودی"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"غلطگیر املای Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"غلطگیر املای Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"تنظیمات غلط گیری املایی"</string> @@ -115,6 +117,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ورودی صدا غیرفعال است"</string> <string name="configure_input_method" msgid="373356270290742459">"پیکربندی روش های ورودی"</string> <string name="language_selection_title" msgid="1651299598555326750">"زبان های ورودی"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"زبانهای ورودی"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"برای ذخیره دوباره لمس کنید"</string> <string name="has_dictionary" msgid="6071847973466625007">"دیکشنری موجود است"</string> diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml index 97002edfe..e25bd82a7 100644 --- a/java/res/values-fi/strings.xml +++ b/java/res/values-fi/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-näppäimistö (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android-näppäimistön asetukset"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Syöttövalinnat"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android-oikoluku"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android-oikoluku (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Oikoluvun asetukset"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Ääniohjaus on pois käytöstä"</string> <string name="configure_input_method" msgid="373356270290742459">"Määritä syöttötavat"</string> <string name="language_selection_title" msgid="1651299598555326750">"Syöttökielet"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Syöttökielet"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Tallenna koskettamalla uudelleen"</string> <string name="has_dictionary" msgid="6071847973466625007">"Sanakirja saatavilla"</string> diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index 285d2226c..b35b5fb8b 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Clavier Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Paramètres du clavier Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Options de saisie"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Correcteur orthographique Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Correcteur orthographique Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Paramètre du correcteur orthographique"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Saisie vocale désactivée"</string> <string name="configure_input_method" msgid="373356270290742459">"Configurer les modes de saisie"</string> <string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Langues de saisie"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Appuyer de nouveau pour enregistrer"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dictionnaire disponible"</string> diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml index 2b1808460..b51eaeef9 100644 --- a/java/res/values-hi/strings.xml +++ b/java/res/values-hi/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android कीबोर्ड (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android कीबोर्ड सेटिंग"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"इनपुट विकल्प"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android वर्तनी परीक्षक"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android वर्तनी परीक्षक (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"वर्तनी जांच सेटिंग"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ध्वनि इनपुट अक्षम है"</string> <string name="configure_input_method" msgid="373356270290742459">"इनपुट पद्धति कॉन्फ़िगर करें"</string> <string name="language_selection_title" msgid="1651299598555326750">"इनपुट भाषा"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"इनपुट भाषाएं"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"सहेजने के लिए पुन: स्पर्श करें"</string> <string name="has_dictionary" msgid="6071847973466625007">"शब्दकोश उपलब्ध है"</string> diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml index a59d4698f..712a24368 100644 --- a/java/res/values-hr/strings.xml +++ b/java/res/values-hr/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android tipkovnica (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Postavke tipkovnice za Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opcije ulaza"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Androidova provjera pravopisa"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Androidova provjera pravopisa (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Postavke provjere pravopisa"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. unos onemog."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfiguriraj načine ulaza"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jezici unosa"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Jezici unosa"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Dodirnite ponovo za spremanje"</string> <string name="has_dictionary" msgid="6071847973466625007">"Rječnik je dostupan"</string> diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml index 0eac1a95b..3e4cc13dd 100644 --- a/java/res/values-hu/strings.xml +++ b/java/res/values-hu/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-billentyűzet (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android billentyűzetbeállítások"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Beviteli beállítások"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Androidos helyesírás-ellenőrző"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Androidos helyesírás-ellenőrző (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Helyesírás-ellenőrzés beállításai"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hangbevivel KI"</string> <string name="configure_input_method" msgid="373356270290742459">"Beviteli módok beállítása"</string> <string name="language_selection_title" msgid="1651299598555326750">"Beviteli nyelvek"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Beviteli nyelvek"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Érintse meg újból a mentéshez"</string> <string name="has_dictionary" msgid="6071847973466625007">"Van elérhető szótár"</string> diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml index e0e92b5bd..072df0501 100644 --- a/java/res/values-in/strings.xml +++ b/java/res/values-in/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Keyboard Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Setelan keyboard Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opsi masukan"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Pemeriksa ejaan Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Pemeriksa ejaan Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Setelan pemeriksaan ejaan"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Masukan suara dinonaktifkan"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurasikan metode masukan"</string> <string name="language_selection_title" msgid="1651299598555326750">"Bahasa masukan"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Bahasa masukan"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Sentuh lagi untuk menyimpan"</string> <string name="has_dictionary" msgid="6071847973466625007">"Kamus yang tersedia"</string> diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 1929035bc..0be9bde5f 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Tastiera Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Impostazioni tastiera Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opzioni inserimento"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Controllo ortografico Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Controllo ortografico Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Impostazioni di controllo ortografico"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Comandi vocali disatt."</string> <string name="configure_input_method" msgid="373356270290742459">"Configura metodi di immissione"</string> <string name="language_selection_title" msgid="1651299598555326750">"Lingue comandi"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Lingue comandi"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Tocca di nuovo per salvare"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dizionario disponibile"</string> diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml index 323cac198..f38201e66 100644 --- a/java/res/values-iw/strings.xml +++ b/java/res/values-iw/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"מקלדת Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"הגדרות מקלדת של Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"אפשרויות קלט"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"בודק האיות של Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"בודק האיות של Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"הגדרות בדיקת איות"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"הקלט הקולי מושבת"</string> <string name="configure_input_method" msgid="373356270290742459">"הגדרת שיטות קלט"</string> <string name="language_selection_title" msgid="1651299598555326750">"שפות קלט"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"שפות קלט"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"גע שוב כדי לשמור"</string> <string name="has_dictionary" msgid="6071847973466625007">"מילון זמין"</string> diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 3a865166f..ecd69b833 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Androidキーボード(AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Androidキーボードの設定"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"入力オプション"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Androidスペルチェッカー"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Androidスペルチェッカー(AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"スペルチェックの設定"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"音声入力は無効です"</string> <string name="configure_input_method" msgid="373356270290742459">"入力方法を設定"</string> <string name="language_selection_title" msgid="1651299598555326750">"入力言語"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"入力言語"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"保存するにはもう一度タップ"</string> <string name="has_dictionary" msgid="6071847973466625007">"辞書を利用できます"</string> diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index 536f06dbd..0c6d3d6c1 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android 키보드(AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android 키보드 설정"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"입력 옵션"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android 맞춤법 검사기"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android 맞춤법 검사기(AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"맞춤법 검사 설정"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"음성 입력이 사용 중지됨"</string> <string name="configure_input_method" msgid="373356270290742459">"입력 방법 설정"</string> <string name="language_selection_title" msgid="1651299598555326750">"입력 언어"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"입력 언어"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"저장하려면 다시 터치"</string> <string name="has_dictionary" msgid="6071847973466625007">"사전 사용 가능"</string> diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml index d8c982d28..90094f910 100644 --- a/java/res/values-lt/strings.xml +++ b/java/res/values-lt/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"„Android“ klaviatūra (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"„Android“ klaviatūros nustatymai"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Įvesties parinktys"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"„Android“ rašybos tikrinimo programa"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"„Android“ rašybos tikrinimo programa (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Rašybos tikrinimo nustatymai"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balso įv. neleidž."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigūruoti įvesties metodus"</string> <string name="language_selection_title" msgid="1651299598555326750">"Įvesties kalbos"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Įvesties kalbos"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Jei norite išsaugoti, palieskite dar kartą"</string> <string name="has_dictionary" msgid="6071847973466625007">"Žodynas galimas"</string> diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml index 93727a8ba..035ba0264 100644 --- a/java/res/values-lv/strings.xml +++ b/java/res/values-lv/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android tastatūra (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android tastatūras iestatījumi"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Ievades opcijas"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android pareizrakstības pārbaudītājs"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android pareizrakstības pārbaudītājs (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Pareizrakstības pārbaudes iestatījumi"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balss iev. atspējota"</string> <string name="configure_input_method" msgid="373356270290742459">"Ievades metožu konfigurēšana"</string> <string name="language_selection_title" msgid="1651299598555326750">"Ievades valodas"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Ievades valodas"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Pieskarieties vēlreiz, lai saglabātu."</string> <string name="has_dictionary" msgid="6071847973466625007">"Ir pieejama vārdnīca."</string> diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml index a07c44f2c..838c51dde 100644 --- a/java/res/values-ms/strings.xml +++ b/java/res/values-ms/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Papan kekunci Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Tetapan papan kekunci Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Pilihan input"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Penyemak ejaan Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Penyemak ejaan Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Tetapan penyemakan ejaan"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Input suara dilmphkn"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurasikan kaedah input"</string> <string name="language_selection_title" msgid="1651299598555326750">"Bahasa input"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Bahasa input"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Sentuh lagi untuk menyimpan"</string> <string name="has_dictionary" msgid="6071847973466625007">"Kamus tersedia"</string> diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 8ed23763a..559f63ca1 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-tastatur (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Innstillinger for skjermtastatur"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Inndataalternativer"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android-stavekontroll"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android-stavekontroll (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Innstillinger for stavekontroll"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Taleinndata er deaktiv."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurer inndatametoder"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inndataspråk"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Inndataspråk"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Trykk på nytt for å lagre"</string> <string name="has_dictionary" msgid="6071847973466625007">"Ordbok tilgjengelig"</string> diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index a7d499bd0..f57225c5d 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-toetsenbord (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Instellingen voor Android-toetsenbord"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Invoeropties"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Spellingcontrole van Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Spellingcontrole van Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Instellingen voor spellingcontrole"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spraakinvoer is uit"</string> <string name="configure_input_method" msgid="373356270290742459">"Invoermethoden configureren"</string> <string name="language_selection_title" msgid="1651299598555326750">"Invoertalen"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Invoertalen"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Raak nogmaals aan om op te slaan"</string> <string name="has_dictionary" msgid="6071847973466625007">"Woordenboek beschikbaar"</string> diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index bf27782b6..36be77bd1 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Klawiatura Androida (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Ustawienia klawiatury Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opcje wprowadzania"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Słownik Androida"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Sprawdzanie pisowni na Androidzie (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Ustawienia sprawdzania pisowni"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Wprowadzanie głosowe jest wyłączone"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfiguruj metody wprowadzania"</string> <string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Języki wprowadzania"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Dotknij ponownie, aby zapisać"</string> <string name="has_dictionary" msgid="6071847973466625007">"Słownik dostępny"</string> diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index ccb042e47..936e8d964 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Teclado Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Definições de teclado do Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opções de introdução"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Verificador ortográfico do Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Verificador ortográfico do Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Definições da verificação ortográfica"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. voz desact."</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de introdução"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Idiomas de introdução"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toque novamente para guardar"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string> diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 7d64759d8..f22d0ff5d 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Teclado Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Configurações de teclado Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opções de entrada"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Corretor ortográfico do Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Corretor ortográfico do Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Configurações de verificação ortográfica"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Texto por voz desat."</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toque novamente para salvar"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string> diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml index 18741f816..c6c936e49 100644 --- a/java/res/values-rm/strings.xml +++ b/java/res/values-rm/strings.xml @@ -26,6 +26,8 @@ <string name="english_ime_settings" msgid="6661589557206947774">"Parameters da la tastatura Android"</string> <!-- no translation found for english_ime_input_options (3909945612939668554) --> <skip /> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <!-- no translation found for spell_checker_service_name (7338064335159755926) --> <skip /> <!-- no translation found for aosp_spell_checker_service_name (6985142605330377819) --> @@ -190,6 +192,18 @@ <!-- no translation found for configure_input_method (373356270290742459) --> <skip /> <string name="language_selection_title" msgid="1651299598555326750">"Linguas da cumonds vocals"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <!-- no translation found for select_language (3693815588777926848) --> <skip /> <!-- no translation found for hint_add_to_dictionary (573678656946085380) --> diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml index bca755d24..ab296d9d3 100644 --- a/java/res/values-ro/strings.xml +++ b/java/res/values-ro/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Tastatură Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Setările tastaturii Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opţiuni de introducere text"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Verificator ortografic Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Verificator ortografic Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Setări de verificare ortografică"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Intr. vocală dezact."</string> <string name="configure_input_method" msgid="373356270290742459">"Configuraţi metodele de intrare"</string> <string name="language_selection_title" msgid="1651299598555326750">"Selectaţi limba"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Limbi de intrare"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Atingeţi din nou pentru a salva"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dicţionar disponibil"</string> diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index a9bd6ace1..f91779727 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Клавиатура Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Клавиатура Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Настройки"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Проверка правописания Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Проверка правописания Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Настройка проверки правописания"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голосовой ввод откл."</string> <string name="configure_input_method" msgid="373356270290742459">"Настройка способов ввода"</string> <string name="language_selection_title" msgid="1651299598555326750">"Языки ввода"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Языки ввода"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Нажмите, чтобы сохранить"</string> <string name="has_dictionary" msgid="6071847973466625007">"Доступен словарь"</string> diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml index 5b4224d8a..9e01d7274 100644 --- a/java/res/values-sk/strings.xml +++ b/java/res/values-sk/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Klávesnica Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Nastavenia klávesnice Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti zadávania textu a údajov"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Kontrola pravopisu Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Kontrola pravopisu Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Nastavenia kontroly pravopisu"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup je zakázaný"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurovať metódy vstupu"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jazyky vstupu"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Jazyky vstupu"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Opätovným dotykom uložíte"</string> <string name="has_dictionary" msgid="6071847973466625007">"K dispozícii je slovník"</string> diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml index ce7dc70bb..8ab2e70c8 100644 --- a/java/res/values-sl/strings.xml +++ b/java/res/values-sl/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Tipkovnica Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Nastavitve tipkovnice Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti vnosa"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Črkovalnik za Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Črkovalnik za Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Nastavitve preverjanja črkovanja"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. vnos je onem."</string> <string name="configure_input_method" msgid="373356270290742459">"Nastavitev načinov vnosa"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jeziki vnosa"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Jeziki vnosa"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Dotaknite se še enkrat, da shranite"</string> <string name="has_dictionary" msgid="6071847973466625007">"Slovar je na voljo"</string> diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml index 6d2899b47..a9f5a7b25 100644 --- a/java/res/values-sr/strings.xml +++ b/java/res/values-sr/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android тастатура (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Подешавања Android тастатуре"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Опције уноса"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android провера правописа"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android провера правописа (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Подешавања провере правописа"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Гласовни унос је онемогућен"</string> <string name="configure_input_method" msgid="373356270290742459">"Конфигурисање метода уноса"</string> <string name="language_selection_title" msgid="1651299598555326750">"Језици за унос"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Језици уноса"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Поново додирните да бисте сачували"</string> <string name="has_dictionary" msgid="6071847973466625007">"Речник је доступан"</string> diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 75e80d42d..822ca7c59 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Androids tangentbord (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Inställningar för Androids tangentbord"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Inmatningsalternativ"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Stavningskontroll i Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Stavningskontroll i Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Inställningar för stavningskontroll"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Röstinmatning inaktiv"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurera inmatningsmetoder"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inmatningsspråk"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Inmatningsspråk"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Spara genom att trycka igen"</string> <string name="has_dictionary" msgid="6071847973466625007">"En ordlista är tillgänglig"</string> diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml index 82c867e3f..b9738f6da 100644 --- a/java/res/values-sw/strings.xml +++ b/java/res/values-sw/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Kicharazio cha Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Mipangilio ya kibodi ya Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Chaguo za uingizaji"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Kikagua tahajia cha Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Kikagua tahajia cha Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Mipangilio ya kukagua sarufi"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Uingizaji sauti umelemazwa"</string> <string name="configure_input_method" msgid="373356270290742459">"Sanidi mbinu za uingizaji"</string> <string name="language_selection_title" msgid="1651299598555326750">"Lugha za uingizaji"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Lugha zinazoruhusiwa"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Gusa tena ili kuhifadhi"</string> <string name="has_dictionary" msgid="6071847973466625007">"Kamusi inapatikana"</string> diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml index da20d6607..7731be146 100644 --- a/java/res/values-th/strings.xml +++ b/java/res/values-th/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android keyboard (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"การตั้งค่าแป้นพิมพ์ Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"ตัวเลือกการป้อนข้อมูล"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"แอนดรอยด์ตรวจสอบการสะกด"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"แอนดรอยด์ตรวจสอบการสะกด (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"การตั้งค่าการตรวจสอบการสะกด"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ปิดใช้งานป้อนข้อมูลด้วยเสียง"</string> <string name="configure_input_method" msgid="373356270290742459">"กำหนดค่าวิธีการป้อนข้อมูล"</string> <string name="language_selection_title" msgid="1651299598555326750">"ภาษาในการป้อนข้อมูล"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"ภาษาสำหรับการป้อนข้อมูล"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"แตะอีกครั้งเพื่อบันทึก"</string> <string name="has_dictionary" msgid="6071847973466625007">"มีพจนานุกรมให้ใช้งาน"</string> diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml index 7d365b2dc..aad8fe670 100644 --- a/java/res/values-tl/strings.xml +++ b/java/res/values-tl/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android keyboard (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Mga setting ng Android keyboard"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Mga pagpipilian sa input"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Pang-check ng pagbabaybay ng Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Pang-check ng pagbabaybay ng Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Mga setting ng pang-check ng pagbabaybay"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hindi pinagana ang voice input"</string> <string name="configure_input_method" msgid="373356270290742459">"I-configure ang mga pamamaraan ng pag-input"</string> <string name="language_selection_title" msgid="1651299598555326750">"Mag-input ng mga wika"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Mga wika ng input"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Pinduting muli upang i-save"</string> <string name="has_dictionary" msgid="6071847973466625007">"Available ang diksyunaryo"</string> diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 39737f55e..fbe1c6fe7 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android klavye (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android klavye ayarları"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Giriş seçenekleri"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android yazım denetleyici"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android yazım denetleyici (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Yazım denetimi ayarları"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Sesle grş devre dışı"</string> <string name="configure_input_method" msgid="373356270290742459">"Giriş yöntemlerini yapılandır"</string> <string name="language_selection_title" msgid="1651299598555326750">"Giriş dilleri"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Giriş dilleri"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Kaydetmek için tekrar dokunun"</string> <string name="has_dictionary" msgid="6071847973466625007">"Sözlük kullanılabilir"</string> diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml index 884491c55..0cfa342b2 100644 --- a/java/res/values-uk/strings.xml +++ b/java/res/values-uk/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Клавіатура Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Налашт-ня клавіат. Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Парам. введення"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Засіб перевірки орфографії Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Засіб перевірки орфографії Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Налаштування перевірки орфографії"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голос. ввід вимкнено"</string> <string name="configure_input_method" msgid="373356270290742459">"Налаштування методів введення"</string> <string name="language_selection_title" msgid="1651299598555326750">"Мови вводу"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Мови введення"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Торкніться знову, щоб зберегти"</string> <string name="has_dictionary" msgid="6071847973466625007">"Словник доступний"</string> diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml index 753af1840..c3e07c3ef 100644 --- a/java/res/values-vi/strings.xml +++ b/java/res/values-vi/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Bàn phím Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Cài đặt bàn phím Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Tùy chọn nhập"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Trình kiểm tra chính tả Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Trình kiểm tra chính tả Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Cài đặt kiểm tra chính tả"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Nhập liệu bằng giọng nói đã bị tắt"</string> <string name="configure_input_method" msgid="373356270290742459">"Định cấu hình phương thức nhập"</string> <string name="language_selection_title" msgid="1651299598555326750">"Ngôn ngữ nhập"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Ngôn ngữ nhập"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Chạm lại để lưu"</string> <string name="has_dictionary" msgid="6071847973466625007">"Có sẵn từ điển"</string> diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index efde54103..54cbf5c05 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android 键盘 (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android 键盘设置"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"输入选项"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android 拼写检查工具"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android 拼写检查工具 (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"拼写检查设置"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"语音输入功能已停用"</string> <string name="configure_input_method" msgid="373356270290742459">"配置输入法"</string> <string name="language_selection_title" msgid="1651299598555326750">"输入语言"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"输入语言"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"再次触摸即可保存"</string> <string name="has_dictionary" msgid="6071847973466625007">"有可用词典"</string> diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 51df022aa..8f80e2778 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android 鍵盤 (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Android 鍵盤設定"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"輸入選項"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Android 拼字檢查"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android 拼字檢查 (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"拼字檢查設定"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"語音輸入已停用"</string> <string name="configure_input_method" msgid="373356270290742459">"設定輸入法"</string> <string name="language_selection_title" msgid="1651299598555326750">"輸入語言"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"輸入語言"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"再次輕觸即可儲存"</string> <string name="has_dictionary" msgid="6071847973466625007">"可使用字典"</string> diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml index d3f80e42a..b5b0dfb45 100644 --- a/java/res/values-zu/strings.xml +++ b/java/res/values-zu/strings.xml @@ -24,6 +24,8 @@ <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Ikhibhodi ye-Android (AOSP)"</string> <string name="english_ime_settings" msgid="6661589557206947774">"Izilungiselelo zekhibhodi ye-Android"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Okukhethwa kukho kokungenayo"</string> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> <string name="spell_checker_service_name" msgid="7338064335159755926">"Isihloli sokupela se-Android"</string> <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Isihloli sokupela se-Android (AOSP)"</string> <string name="android_spell_checker_settings" msgid="5822324635435443689">"Izilungiselelo zokuhlola ukupela"</string> @@ -111,6 +113,18 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Okufakwayo ngezwi kuvinjelwe"</string> <string name="configure_input_method" msgid="373356270290742459">"Misa izindlela zokufakwayo"</string> <string name="language_selection_title" msgid="1651299598555326750">"Izilimi zokufakwayo"</string> + <!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) --> + <skip /> + <!-- no translation found for notify_recorded_timestamp (8036429032449612051) --> + <skip /> + <!-- no translation found for do_not_log_this_session (413762473641146336) --> + <skip /> + <!-- no translation found for notify_session_log_deleting (3299507647764414623) --> + <skip /> + <!-- no translation found for notify_session_log_deleted (8687927130100934686) --> + <skip /> + <!-- no translation found for notify_session_log_not_deleted (2592908998810755970) --> + <skip /> <string name="select_language" msgid="3693815588777926848">"Izilimi zokufakwayo"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Thinta futhi ukuze ulondoloze"</string> <string name="has_dictionary" msgid="6071847973466625007">"Isichazamazwi siyatholakala"</string> diff --git a/java/res/values/config.xml b/java/res/values/config.xml index d5268ea5f..e20061d7d 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -23,7 +23,8 @@ <bool name="config_enable_show_voice_key_option">true</bool> <bool name="config_enable_show_popup_on_keypress_option">true</bool> <bool name="config_enable_next_word_suggestions_option">true</bool> - <bool name="config_enable_usability_study_mode_option">false</bool> + <!-- TODO: Disable the following configuration for production. --> + <bool name="config_enable_usability_study_mode_option">true</bool> <!-- Whether or not Popup on key press is enabled by default --> <bool name="config_default_popup_preview">true</bool> <!-- Default value for next word suggestion: while showing suggestions for a word should we weigh diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index d51d3789a..d663b008d 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -26,6 +26,8 @@ <string name="english_ime_settings">Android keyboard settings</string> <!-- Title for Latin keyboard input options dialog [CHAR LIMIT=25] --> <string name="english_ime_input_options">Input options</string> + <!-- Title for Latin keyboard research log dialog, which contains special commands for users that contribute data for research. [CHAR LIMIT=25] --> + <string name="english_ime_research_log">Research Log Commands</string> <!-- Name of Android spell checker service --> <string name="spell_checker_service_name">Android spell checker</string> @@ -233,6 +235,20 @@ <!-- Title for input language selection screen --> <string name="language_selection_title">Input languages</string> + <!-- Title for dialog option that lets user mark a particular time in the log for later review by experts [CHAR LIMIT=25] --> + <string name="note_timestamp_for_researchlog">Note timestamp in log</string> + <!-- Toast notification message that the time has been marked for later review. [CHAR LIMIT=25] --> + <string name="notify_recorded_timestamp">Recorded timestamp</string> + + <!-- Title for dialog option to let users cancel logging and delete log for this session [CHAR LIMIT=25] --> + <string name="do_not_log_this_session">Do not log this session</string> + <!-- Toast notification that the system is processing the request to delete the log for this session [CHAR LIMIT=25] --> + <string name="notify_session_log_deleting">Deleting session log</string> + <!-- Toast notification that the system has successfully deleted the log for this session [CHAR LIMIT=25] --> + <string name="notify_session_log_deleted">Session log deleted</string> + <!-- Toast notification that the system has failed to delete the log for this session [CHAR LIMIT=25] --> + <string name="notify_session_log_not_deleted">Session log NOT deleted</string> + <!-- Preference for input language selection --> <string name="select_language">Input languages</string> diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml index 622da2120..162119dab 100644 --- a/java/res/xml/key_styles_common.xml +++ b/java/res/xml/key_styles_common.xml @@ -22,23 +22,8 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <!-- Base key style for the key which may have settings or tab key as popup key. --> - <switch> - <case - latin:clobberSettingsKey="true" - > - <key-style - latin:styleName="f1MoreKeysStyle" - latin:backgroundType="functional" /> - </case> - <!-- clobberSettingsKey="false" --> - <default> - <key-style - latin:styleName="f1MoreKeysStyle" - latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/settings_as_more_key" - latin:backgroundType="functional" /> - </default> - </switch> + <include + latin:keyboardLayout="@xml/key_styles_f1" /> <!-- Functional key styles --> <switch> <case diff --git a/java/res/xml/key_styles_f1.xml b/java/res/xml/key_styles_f1.xml new file mode 100644 index 000000000..8dfc3cb84 --- /dev/null +++ b/java/res/xml/key_styles_f1.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2012, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <!-- Base key style for the key which may have settings or tab key as popup key. --> + <!-- Kept as a separate file for cleaner overriding by an overlay. --> + <switch> + <case + latin:clobberSettingsKey="true" + > + <key-style + latin:styleName="f1MoreKeysStyle" + latin:backgroundType="functional" /> + </case> + <!-- clobberSettingsKey="false" --> + <default> + <key-style + latin:styleName="f1MoreKeysStyle" + latin:keyLabelFlags="hasPopupHint" + latin:moreKeys="!text/settings_as_more_key" + latin:backgroundType="functional" /> + </default> + </switch> +</merge> diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java index 21f175d7d..6fc630d05 100644 --- a/java/src/com/android/inputmethod/keyboard/Keyboard.java +++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java @@ -89,7 +89,8 @@ public class Keyboard { private static final int MINIMUM_LETTER_CODE = CODE_TAB; /** Special keys code. Must be negative. - * These should be aligned with values/keycodes.xml + * These should be aligned with KeyboardCodesSet.ID_TO_NAME[], + * KeyboardCodesSet.DEFAULT[] and KeyboardCodesSet.RTL[] */ public static final int CODE_SHIFT = -1; public static final int CODE_SWITCH_ALPHA_SYMBOL = -2; @@ -101,8 +102,9 @@ public class Keyboard { public static final int CODE_ACTION_NEXT = -8; public static final int CODE_ACTION_PREVIOUS = -9; public static final int CODE_LANGUAGE_SWITCH = -10; + public static final int CODE_RESEARCH = -11; // Code value representing the code is not specified. - public static final int CODE_UNSPECIFIED = -11; + public static final int CODE_UNSPECIFIED = -12; public final KeyboardId mId; public final int mThemeId; @@ -422,67 +424,67 @@ public class Keyboard { * This class parses Keyboard XML file and eventually build a Keyboard. * The Keyboard XML file looks like: * <pre> - * >!-- xml/keyboard.xml --< - * >Keyboard keyboard_attributes*< - * >!-- Keyboard Content --< - * >Row row_attributes*< - * >!-- Row Content --< - * >Key key_attributes* /< - * >Spacer horizontalGap="32.0dp" /< - * >include keyboardLayout="@xml/other_keys"< + * <!-- xml/keyboard.xml --> + * <Keyboard keyboard_attributes*> + * <!-- Keyboard Content --> + * <Row row_attributes*> + * <!-- Row Content --> + * <Key key_attributes* /> + * <Spacer horizontalGap="32.0dp" /> + * <include keyboardLayout="@xml/other_keys"> * ... - * >/Row< - * >include keyboardLayout="@xml/other_rows"< + * </Row> + * <include keyboardLayout="@xml/other_rows"> * ... - * >/Keyboard< + * </Keyboard> * </pre> - * The XML file which is included in other file must have >merge< as root element, + * The XML file which is included in other file must have <merge> as root element, * such as: * <pre> - * >!-- xml/other_keys.xml --< - * >merge< - * >Key key_attributes* /< + * <!-- xml/other_keys.xml --> + * <merge> + * <Key key_attributes* /> * ... - * >/merge< + * </merge> * </pre> * and * <pre> - * >!-- xml/other_rows.xml --< - * >merge< - * >Row row_attributes*< - * >Key key_attributes* /< - * >/Row< + * <!-- xml/other_rows.xml --> + * <merge> + * <Row row_attributes*> + * <Key key_attributes* /> + * </Row> * ... - * >/merge< + * </merge> * </pre> * You can also use switch-case-default tags to select Rows and Keys. * <pre> - * >switch< - * >case case_attribute*< - * >!-- Any valid tags at switch position --< - * >/case< + * <switch> + * <case case_attribute*> + * <!-- Any valid tags at switch position --> + * </case> * ... - * >default< - * >!-- Any valid tags at switch position --< - * >/default< - * >/switch< + * <default> + * <!-- Any valid tags at switch position --> + * </default> + * </switch> * </pre> * You can declare Key style and specify styles within Key tags. * <pre> - * >switch< - * >case mode="email"< - * >key-style styleName="f1-key" parentStyle="modifier-key" + * <switch> + * <case mode="email"> + * <key-style styleName="f1-key" parentStyle="modifier-key" * keyLabel=".com" - * /< - * >/case< - * >case mode="url"< - * >key-style styleName="f1-key" parentStyle="modifier-key" + * /> + * </case> + * <case mode="url"> + * <key-style styleName="f1-key" parentStyle="modifier-key" * keyLabel="http://" - * /< - * >/case< - * >/switch< + * /> + * </case> + * </switch> * ... - * >Key keyStyle="shift-key" ... /< + * <Key keyStyle="shift-key" ... /> * </pre> */ diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index babf6ec99..34e428e82 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -242,10 +242,6 @@ public class PointerTracker { + " ignoreModifier=" + ignoreModifierKey + " enabled=" + key.isEnabled()); } - if (ProductionFlag.IS_EXPERIMENTAL) { - ResearchLogger.pointerTracker_callListenerOnPressAndCheckKeyboardLayoutChange(key, - ignoreModifierKey); - } if (ignoreModifierKey) { return false; } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java index 67cb74f4d..f7981a320 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java @@ -52,6 +52,7 @@ public class KeyboardCodesSet { "key_action_next", "key_action_previous", "key_language_switch", + "key_research", "key_unspecified", "key_left_parenthesis", "key_right_parenthesis", @@ -86,6 +87,7 @@ public class KeyboardCodesSet { Keyboard.CODE_ACTION_NEXT, Keyboard.CODE_ACTION_PREVIOUS, Keyboard.CODE_LANGUAGE_SWITCH, + Keyboard.CODE_RESEARCH, Keyboard.CODE_UNSPECIFIED, CODE_LEFT_PARENTHESIS, CODE_RIGHT_PARENTHESIS, @@ -112,6 +114,7 @@ public class KeyboardCodesSet { DEFAULT[11], DEFAULT[12], DEFAULT[13], + DEFAULT[14], CODE_RIGHT_PARENTHESIS, CODE_LEFT_PARENTHESIS, CODE_GREATER_THAN_SIGN, diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java index 43ffb85f7..5aa9a0887 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java @@ -305,9 +305,6 @@ public class KeyboardState { Log.d(TAG, "onPressKey: code=" + Keyboard.printableCode(code) + " single=" + isSinglePointer + " autoCaps=" + autoCaps + " " + this); } - if (ProductionFlag.IS_EXPERIMENTAL) { - ResearchLogger.keyboardState_onPressKey(code, this); - } if (code == Keyboard.CODE_SHIFT) { onPressShift(); } else if (code == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { @@ -341,9 +338,6 @@ public class KeyboardState { Log.d(TAG, "onReleaseKey: code=" + Keyboard.printableCode(code) + " sliding=" + withSliding + " " + this); } - if (ProductionFlag.IS_EXPERIMENTAL) { - ResearchLogger.keyboardState_onReleaseKey(this, code, withSliding); - } if (code == Keyboard.CODE_SHIFT) { onReleaseShift(withSliding); } else if (code == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { @@ -375,9 +369,6 @@ public class KeyboardState { if (DEBUG_EVENT) { Log.d(TAG, "onLongPressTimeout: code=" + Keyboard.printableCode(code) + " " + this); } - if (ProductionFlag.IS_EXPERIMENTAL) { - ResearchLogger.keyboardState_onLongPressTimeout(code, this); - } if (mIsAlphabetMode && code == Keyboard.CODE_SHIFT) { mLongPressShiftLockFired = true; mSwitchActions.hapticAndAudioFeedback(code); @@ -509,9 +500,6 @@ public class KeyboardState { if (DEBUG_EVENT) { Log.d(TAG, "onCancelInput: single=" + isSinglePointer + " " + this); } - if (ProductionFlag.IS_EXPERIMENTAL) { - ResearchLogger.keyboardState_onCancelInput(isSinglePointer, this); - } // Switch back to the previous keyboard mode if the user cancels sliding input. if (isSinglePointer) { if (mSwitchState == SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL) { @@ -543,9 +531,6 @@ public class KeyboardState { + " single=" + isSinglePointer + " autoCaps=" + autoCaps + " " + this); } - if (ProductionFlag.IS_EXPERIMENTAL) { - ResearchLogger.keyboardState_onCodeInput(code, isSinglePointer, autoCaps, this); - } switch (mSwitchState) { case SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL: diff --git a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java index 34308dfb3..10e511eaf 100644 --- a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java @@ -52,6 +52,9 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { /** The number of contacts in the most recent dictionary rebuild. */ static private int sContactCountAtLastRebuild = 0; + /** The locale for this contacts dictionary. Controls name bigram predictions. */ + public final Locale mLocale; + private ContentObserver mObserver; /** @@ -61,6 +64,7 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { public ContactsBinaryDictionary(final Context context, final int dicTypeId, Locale locale) { super(context, getFilenameWithLocale(NAME, locale.toString()), dicTypeId); + mLocale = locale; mUseFirstLastBigrams = useFirstLastBigramsForLocale(locale); registerObserver(context); diff --git a/java/src/com/android/inputmethod/latin/EditingUtils.java b/java/src/com/android/inputmethod/latin/EditingUtils.java index 0f34d50bb..479b3bf5a 100644 --- a/java/src/com/android/inputmethod/latin/EditingUtils.java +++ b/java/src/com/android/inputmethod/latin/EditingUtils.java @@ -55,7 +55,7 @@ public class EditingUtils { */ public static String getWordAtCursor(InputConnection connection, String separators) { // getWordRangeAtCursor returns null if the connection is null - Range r = getWordRangeAtCursor(connection, separators); + Range r = getWordRangeAtCursor(connection, separators, 0); return (r == null) ? null : r.mWord; } @@ -85,7 +85,17 @@ public class EditingUtils { } } - private static Range getWordRangeAtCursor(InputConnection connection, String sep) { + /** + * Returns the text surrounding the cursor. + * + * @param connection the InputConnection to the TextView + * @param sep a string of characters that split words. + * @param additionalPrecedingWordsCount the number of words before the current word that should + * be included in the returned range + * @return a range containing the text surrounding the cursor + */ + public static Range getWordRangeAtCursor(InputConnection connection, String sep, + int additionalPrecedingWordsCount) { if (connection == null || sep == null) { return null; } @@ -95,14 +105,40 @@ public class EditingUtils { return null; } - // Find first word separator before the cursor + // Going backward, alternate skipping non-separators and separators until enough words + // have been read. int start = before.length(); - while (start > 0 && !isWhitespace(before.charAt(start - 1), sep)) start--; + boolean isStoppingAtWhitespace = true; // toggles to indicate what to stop at + while (true) { // see comments below for why this is guaranteed to halt + while (start > 0) { + final int codePoint = Character.codePointBefore(before, start); + if (isStoppingAtWhitespace == isSeparator(codePoint, sep)) { + break; // inner loop + } + --start; + if (Character.isSupplementaryCodePoint(codePoint)) { + --start; + } + } + // isStoppingAtWhitespace is true every other time through the loop, + // so additionalPrecedingWordsCount is guaranteed to become < 0, which + // guarantees outer loop termination + if (isStoppingAtWhitespace && (--additionalPrecedingWordsCount < 0)) { + break; // outer loop + } + isStoppingAtWhitespace = !isStoppingAtWhitespace; + } // Find last word separator after the cursor int end = -1; - while (++end < after.length() && !isWhitespace(after.charAt(end), sep)) { - // Nothing to do here. + while (++end < after.length()) { + final int codePoint = Character.codePointAt(after, end); + if (isSeparator(codePoint, sep)) { + break; + } + if (Character.isSupplementaryCodePoint(codePoint)) { + ++end; + } } int cursor = getCursorPosition(connection); @@ -115,8 +151,8 @@ public class EditingUtils { return null; } - private static boolean isWhitespace(int code, String whitespace) { - return whitespace.contains(String.valueOf((char) code)); + private static boolean isSeparator(int code, String sep) { + return sep.indexOf(code) != -1; } private static final Pattern spaceRegex = Pattern.compile("\\s+"); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index bfdc1e3c5..ae9e197a1 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -111,17 +111,17 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // TODO: migrate this to SettingsValues private int mSuggestionVisibility; - private static final int SUGGESTION_VISIBILILTY_SHOW_VALUE + private static final int SUGGESTION_VISIBILITY_SHOW_VALUE = R.string.prefs_suggestion_visibility_show_value; - private static final int SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE + private static final int SUGGESTION_VISIBILITY_SHOW_ONLY_PORTRAIT_VALUE = R.string.prefs_suggestion_visibility_show_only_portrait_value; - private static final int SUGGESTION_VISIBILILTY_HIDE_VALUE + private static final int SUGGESTION_VISIBILITY_HIDE_VALUE = R.string.prefs_suggestion_visibility_hide_value; private static final int[] SUGGESTION_VISIBILITY_VALUE_ARRAY = new int[] { - SUGGESTION_VISIBILILTY_SHOW_VALUE, - SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE, - SUGGESTION_VISIBILILTY_HIDE_VALUE + SUGGESTION_VISIBILITY_SHOW_VALUE, + SUGGESTION_VISIBILITY_SHOW_ONLY_PORTRAIT_VALUE, + SUGGESTION_VISIBILITY_HIDE_VALUE }; private static final int SPACE_STATE_NONE = 0; @@ -393,7 +393,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mPrefs = prefs; LatinImeLogger.init(this, prefs); if (ProductionFlag.IS_EXPERIMENTAL) { - ResearchLogger.init(this, prefs); + ResearchLogger.getInstance().init(this, prefs); } InputMethodManagerCompatWrapper.init(this); SubtypeSwitcher.init(this); @@ -505,9 +505,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen /** * Resets the contacts dictionary in mSuggest according to the user settings. * - * This method takes an optional contacts dictionary to use. Since the contacts dictionary - * does not depend on the locale, it can be reused across different instances of Suggest. - * The dictionary will also be opened or closed as necessary depending on the settings. + * This method takes an optional contacts dictionary to use when the locale hasn't changed + * since the contacts dictionary can be opened or closed as necessary depending on the settings. * * @param oldContactsDictionary an optional dictionary to use, or null */ @@ -520,21 +519,35 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // so it's safe to call it anyways. if (null != oldContactsDictionary) oldContactsDictionary.close(); dictionaryToUse = null; - } else if (null != oldContactsDictionary) { - // Make sure the old contacts dictionary is opened. If it is already open, this is a - // no-op, so it's safe to call it anyways. - if (USE_BINARY_CONTACTS_DICTIONARY) { - ((ContactsBinaryDictionary)oldContactsDictionary).reopen(this); - } else { - ((ContactsDictionary)oldContactsDictionary).reopen(this); - } - dictionaryToUse = oldContactsDictionary; } else { - if (USE_BINARY_CONTACTS_DICTIONARY) { - dictionaryToUse = new ContactsBinaryDictionary(this, Suggest.DIC_CONTACTS, - mSubtypeSwitcher.getCurrentSubtypeLocale()); + final Locale locale = mSubtypeSwitcher.getCurrentSubtypeLocale(); + if (null != oldContactsDictionary) { + if (USE_BINARY_CONTACTS_DICTIONARY) { + ContactsBinaryDictionary oldContactsBinaryDictionary = + (ContactsBinaryDictionary)oldContactsDictionary; + if (!oldContactsBinaryDictionary.mLocale.equals(locale)) { + // If the locale has changed then recreate the contacts dictionary. This + // allows locale dependent rules for handling bigram name predictions. + oldContactsDictionary.close(); + dictionaryToUse = new ContactsBinaryDictionary( + this, Suggest.DIC_CONTACTS, locale); + } else { + // Make sure the old contacts dictionary is opened. If it is already open, + // this is a no-op, so it's safe to call it anyways. + oldContactsBinaryDictionary.reopen(this); + dictionaryToUse = oldContactsDictionary; + } + } else { + ((ContactsDictionary)oldContactsDictionary).reopen(this); + dictionaryToUse = oldContactsDictionary; + } } else { - dictionaryToUse = new ContactsDictionary(this, Suggest.DIC_CONTACTS); + if (USE_BINARY_CONTACTS_DICTIONARY) { + dictionaryToUse = new ContactsBinaryDictionary(this, Suggest.DIC_CONTACTS, + locale); + } else { + dictionaryToUse = new ContactsDictionary(this, Suggest.DIC_CONTACTS); + } } } @@ -660,6 +673,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen + ((editorInfo.inputType & InputType.TYPE_TEXT_FLAG_CAP_WORDS) != 0)); } if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.getInstance().start(); ResearchLogger.latinIME_onStartInputViewInternal(editorInfo, mPrefs); } if (InputAttributes.inPrivateImeOptions(null, NO_MICROPHONE_COMPAT, editorInfo)) { @@ -739,6 +753,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen @Override public void onWindowHidden() { + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.latinIME_onWindowHidden(mLastSelectionStart, mLastSelectionEnd, + getCurrentInputConnection()); + } super.onWindowHidden(); KeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); if (inputView != null) inputView.closing(); @@ -748,6 +766,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen super.onFinishInput(); LatinImeLogger.commit(); + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.getInstance().stop(); + } KeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); if (inputView != null) inputView.closing(); @@ -768,7 +789,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen int composingSpanStart, int composingSpanEnd) { super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, composingSpanStart, composingSpanEnd); - if (DEBUG) { Log.i(TAG, "onUpdateSelection: oss=" + oldSelStart + ", ose=" + oldSelEnd @@ -780,9 +800,15 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen + ", ce=" + composingSpanEnd); } if (ProductionFlag.IS_EXPERIMENTAL) { + final boolean expectingUpdateSelectionFromLogger = + ResearchLogger.getAndClearLatinIMEExpectingUpdateSelection(); ResearchLogger.latinIME_onUpdateSelection(mLastSelectionStart, mLastSelectionEnd, oldSelStart, oldSelEnd, newSelStart, newSelEnd, composingSpanStart, - composingSpanEnd); + composingSpanEnd, mExpectingUpdateSelection, + expectingUpdateSelectionFromLogger, getCurrentInputConnection()); + if (expectingUpdateSelectionFromLogger) { + return; + } } // TODO: refactor the following code to be less contrived. @@ -1270,9 +1296,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mLastKeyTime = when; if (ProductionFlag.IS_EXPERIMENTAL) { - if (ResearchLogger.sIsLogging) { - ResearchLogger.getInstance().logKeyEvent(primaryCode, x, y); - } + ResearchLogger.latinIME_onCodeInput(primaryCode, x, y); } final KeyboardSwitcher switcher = mKeyboardSwitcher; @@ -1321,6 +1345,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen case Keyboard.CODE_LANGUAGE_SWITCH: handleLanguageSwitchKey(); break; + case Keyboard.CODE_RESEARCH: + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.getInstance().presentResearchDialog(this); + } + break; default: if (primaryCode == Keyboard.CODE_TAB && mInputAttributes.mEditorAction == EditorInfo.IME_ACTION_NEXT) { @@ -1713,8 +1742,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } public boolean isShowingSuggestionsStrip() { - return (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_VALUE) - || (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE + return (mSuggestionVisibility == SUGGESTION_VISIBILITY_SHOW_VALUE) + || (mSuggestionVisibility == SUGGESTION_VISIBILITY_SHOW_ONLY_PORTRAIT_VALUE && mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT); } @@ -2435,10 +2464,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen final AlertDialog.Builder builder = new AlertDialog.Builder(this) .setItems(items, listener) .setTitle(title); - showOptionDialogInternal(builder.create()); + showOptionDialog(builder.create()); } - private void showOptionDialogInternal(AlertDialog dialog) { + /* package */ void showOptionDialog(AlertDialog dialog) { final IBinder windowToken = mKeyboardSwitcher.getKeyboardView().getWindowToken(); if (windowToken == null) return; diff --git a/java/src/com/android/inputmethod/latin/ResearchLogger.java b/java/src/com/android/inputmethod/latin/ResearchLogger.java index 66d6d58b1..bb003f766 100644 --- a/java/src/com/android/inputmethod/latin/ResearchLogger.java +++ b/java/src/com/android/inputmethod/latin/ResearchLogger.java @@ -16,37 +16,44 @@ package com.android.inputmethod.latin; +import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET; + +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; import android.inputmethodservice.InputMethodService; import android.os.Build; import android.os.Handler; import android.os.HandlerThread; import android.os.Process; import android.os.SystemClock; -import android.preference.PreferenceManager; import android.text.TextUtils; +import android.util.JsonWriter; import android.util.Log; import android.view.MotionEvent; import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputConnection; +import android.widget.Toast; import com.android.inputmethod.keyboard.Key; -import com.android.inputmethod.keyboard.KeyDetector; import com.android.inputmethod.keyboard.Keyboard; -import com.android.inputmethod.keyboard.internal.KeyboardState; +import com.android.inputmethod.keyboard.KeyboardId; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.define.ProductionFlag; import java.io.BufferedWriter; import java.io.File; -import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; -import java.io.PrintWriter; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.channels.FileChannel; -import java.nio.charset.Charset; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; import java.util.Map; +import java.util.UUID; /** * Logs the use of the LatinIME keyboard. @@ -58,198 +65,73 @@ import java.util.Map; */ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = ResearchLogger.class.getSimpleName(); - private static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode"; private static final boolean DEBUG = false; + /* package */ static boolean sIsLogging = false; + private static final int OUTPUT_FORMAT_VERSION = 1; + private static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode"; + private static final String FILENAME_PREFIX = "researchLog"; + private static final String FILENAME_SUFFIX = ".txt"; + private static final JsonWriter NULL_JSON_WRITER = new JsonWriter( + new OutputStreamWriter(new NullOutputStream())); + private static final SimpleDateFormat TIMESTAMP_DATEFORMAT = + new SimpleDateFormat("yyyyMMddHHmmss", Locale.US); - private static final ResearchLogger sInstance = new ResearchLogger(new LogFileManager()); - public static boolean sIsLogging = false; - /* package */ final Handler mLoggingHandler; - private InputMethodService mIms; - - /** - * Isolates management of files. This variable should never be null, but can be changed - * to support testing. - */ - /* package */ LogFileManager mLogFileManager; - - /** - * Manages the file(s) that stores the logs. - * - * Handles creation, deletion, and provides Readers, Writers, and InputStreams to access - * the logs. - */ - /* package */ static class LogFileManager { - public static final String RESEARCH_LOG_FILENAME_KEY = "RESEARCH_LOG_FILENAME"; - - private static final String DEFAULT_FILENAME = "researchLog.txt"; - private static final long LOGFILE_PURGE_INTERVAL = 1000 * 60 * 60 * 24; - - protected InputMethodService mIms; - protected File mFile; - protected PrintWriter mPrintWriter; - - /* package */ LogFileManager() { - } + // constants related to specific log points + private static final String WHITESPACE_SEPARATORS = " \t\n\r"; + private static final int MAX_INPUTVIEW_LENGTH_TO_CAPTURE = 8192; // must be >=1 + private static final String PREF_RESEARCH_LOGGER_UUID_STRING = "pref_research_logger_uuid"; - public void init(final InputMethodService ims) { - mIms = ims; - } + private static final ResearchLogger sInstance = new ResearchLogger(); + private HandlerThread mHandlerThread; + /* package */ Handler mLoggingHandler; + // to write to a different filename, e.g., for testing, set mFile before calling start() + private File mFilesDir; + /* package */ File mFile; + private JsonWriter mJsonWriter = NULL_JSON_WRITER; // should never be null - public synchronized void createLogFile() throws IOException { - createLogFile(DEFAULT_FILENAME); - } + private int mLoggingState; + private static final int LOGGING_STATE_OFF = 0; + private static final int LOGGING_STATE_ON = 1; + private static final int LOGGING_STATE_STOPPING = 2; - public synchronized void createLogFile(final SharedPreferences prefs) - throws IOException { - final String filename = - prefs.getString(RESEARCH_LOG_FILENAME_KEY, DEFAULT_FILENAME); - createLogFile(filename); - } + // set when LatinIME should ignore an onUpdateSelection() callback that + // arises from operations in this class + private static boolean sLatinIMEExpectingUpdateSelection = false; - public synchronized void createLogFile(final String filename) - throws IOException { - if (mIms == null) { - final String msg = "InputMethodService is not configured. Logging is off."; - Log.w(TAG, msg); - throw new IOException(msg); - } - final File filesDir = mIms.getFilesDir(); - if (filesDir == null || !filesDir.exists()) { - final String msg = "Storage directory does not exist. Logging is off."; - Log.w(TAG, msg); - throw new IOException(msg); - } - close(); - final File file = new File(filesDir, filename); - mFile = file; - boolean append = true; - if (file.exists() && file.lastModified() + LOGFILE_PURGE_INTERVAL < - System.currentTimeMillis()) { - append = false; - } - mPrintWriter = new PrintWriter(new BufferedWriter(new FileWriter(file, append)), true); - } - - public synchronized boolean append(final String s) { - PrintWriter printWriter = mPrintWriter; - if (printWriter == null || !mFile.exists()) { - if (DEBUG) { - Log.w(TAG, "PrintWriter is null... attempting to create default log file"); - } - try { - createLogFile(); - printWriter = mPrintWriter; - } catch (IOException e) { - Log.w(TAG, "Failed to create log file. Not logging."); - return false; - } - } - printWriter.print(s); - printWriter.flush(); - return !printWriter.checkError(); - } - - public synchronized void reset() { - if (mPrintWriter != null) { - mPrintWriter.close(); - mPrintWriter = null; - if (DEBUG) { - Log.d(TAG, "logfile closed"); - } - } - if (mFile != null) { - mFile.delete(); - if (DEBUG) { - Log.d(TAG, "logfile deleted"); - } - mFile = null; - } - } - - public synchronized void close() { - if (mPrintWriter != null) { - mPrintWriter.close(); - mPrintWriter = null; - mFile = null; - if (DEBUG) { - Log.d(TAG, "logfile closed"); - } - } + private static class NullOutputStream extends OutputStream { + /** {@inheritDoc} */ + @Override + public void write(byte[] buffer, int offset, int count) throws IOException { + // nop } - /* package */ synchronized void flush() { - if (mPrintWriter != null) { - mPrintWriter.flush(); - } + /** {@inheritDoc} */ + @Override + public void write(byte[] buffer) throws IOException { + // nop } - /* package */ synchronized String getContents() { - final File file = mFile; - if (file == null) { - return ""; - } - if (mPrintWriter != null) { - mPrintWriter.flush(); - } - FileInputStream stream = null; - FileChannel fileChannel = null; - String s = ""; - try { - stream = new FileInputStream(file); - fileChannel = stream.getChannel(); - final ByteBuffer byteBuffer = ByteBuffer.allocate((int) file.length()); - fileChannel.read(byteBuffer); - byteBuffer.rewind(); - CharBuffer charBuffer = Charset.defaultCharset().decode(byteBuffer); - s = charBuffer.toString(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if (fileChannel != null) { - fileChannel.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if (stream != null) { - stream.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return s; + @Override + public void write(int oneByte) { } } - private ResearchLogger(final LogFileManager logFileManager) { - final HandlerThread handlerThread = new HandlerThread("ResearchLogger logging task", - Process.THREAD_PRIORITY_BACKGROUND); - handlerThread.start(); - mLoggingHandler = new Handler(handlerThread.getLooper()); - mLogFileManager = logFileManager; + private ResearchLogger() { + mLoggingState = LOGGING_STATE_OFF; } public static ResearchLogger getInstance() { return sInstance; } - public static void init(final InputMethodService ims, final SharedPreferences prefs) { - sInstance.initInternal(ims, prefs); - } - - /* package */ void initInternal(final InputMethodService ims, final SharedPreferences prefs) { - mIms = ims; - final LogFileManager logFileManager = mLogFileManager; - if (logFileManager != null) { - logFileManager.init(ims); - try { - logFileManager.createLogFile(prefs); - } catch (IOException e) { - e.printStackTrace(); + public void init(final InputMethodService ims, final SharedPreferences prefs) { + assert ims != null; + if (ims == null) { + Log.w(TAG, "IMS is null; logging is off"); + } else { + mFilesDir = ims.getFilesDir(); + if (mFilesDir == null || !mFilesDir.exists()) { + Log.w(TAG, "IME storage directory does not exist."); } } if (prefs != null) { @@ -258,173 +140,124 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } } - /** - * Represents a category of logging events that share the same subfield structure. - */ - private static enum LogGroup { - MOTION_EVENT("m"), - KEY("k"), - CORRECTION("c"), - STATE_CHANGE("s"), - UNSTRUCTURED("u"); - - private final String mLogString; - - private LogGroup(final String logString) { - mLogString = logString; - } - } - - public void logMotionEvent(final int action, final long eventTime, final int id, - final int x, final int y, final float size, final float pressure) { - final String eventTag; - switch (action) { - case MotionEvent.ACTION_CANCEL: eventTag = "[Cancel]"; break; - case MotionEvent.ACTION_UP: eventTag = "[Up]"; break; - case MotionEvent.ACTION_DOWN: eventTag = "[Down]"; break; - case MotionEvent.ACTION_POINTER_UP: eventTag = "[PointerUp]"; break; - case MotionEvent.ACTION_POINTER_DOWN: eventTag = "[PointerDown]"; break; - case MotionEvent.ACTION_MOVE: eventTag = "[Move]"; break; - case MotionEvent.ACTION_OUTSIDE: eventTag = "[Outside]"; break; - default: eventTag = "[Action" + action + "]"; break; + public synchronized void start() { + Log.d(TAG, "start called"); + if (!sIsLogging) { + // Log.w(TAG, "not in usability mode; not logging"); + return; } - if (!TextUtils.isEmpty(eventTag)) { - final StringBuilder sb = new StringBuilder(); - sb.append(eventTag); - sb.append('\t'); sb.append(eventTime); - sb.append('\t'); sb.append(id); - sb.append('\t'); sb.append(x); - sb.append('\t'); sb.append(y); - sb.append('\t'); sb.append(size); - sb.append('\t'); sb.append(pressure); - write(LogGroup.MOTION_EVENT, sb.toString()); + if (mFilesDir == null || !mFilesDir.exists()) { + Log.w(TAG, "IME storage directory does not exist. Cannot start logging."); + } else { + if (mHandlerThread == null || !mHandlerThread.isAlive()) { + mHandlerThread = new HandlerThread("ResearchLogger logging task", + Process.THREAD_PRIORITY_BACKGROUND); + mHandlerThread.start(); + mLoggingHandler = null; + mLoggingState = LOGGING_STATE_OFF; + } + if (mLoggingHandler == null) { + mLoggingHandler = new Handler(mHandlerThread.getLooper()); + mLoggingState = LOGGING_STATE_OFF; + } + if (mFile == null) { + final String timestampString = TIMESTAMP_DATEFORMAT.format(new Date()); + mFile = new File(mFilesDir, FILENAME_PREFIX + timestampString + FILENAME_SUFFIX); + } + if (mLoggingState == LOGGING_STATE_OFF) { + try { + mJsonWriter = new JsonWriter(new BufferedWriter(new FileWriter(mFile))); + mJsonWriter.setLenient(true); + mJsonWriter.beginArray(); + mLoggingState = LOGGING_STATE_ON; + } catch (IOException e) { + Log.w(TAG, "cannot start JsonWriter"); + mJsonWriter = NULL_JSON_WRITER; + e.printStackTrace(); + } + } } } - public void logKeyEvent(final int code, final int x, final int y) { - final StringBuilder sb = new StringBuilder(); - sb.append(Keyboard.printableCode(code)); - sb.append('\t'); sb.append(x); - sb.append('\t'); sb.append(y); - write(LogGroup.KEY, sb.toString()); - } - - public void logCorrection(final String subgroup, final String before, final String after, - final int position) { - final StringBuilder sb = new StringBuilder(); - sb.append(subgroup); - sb.append('\t'); sb.append(before); - sb.append('\t'); sb.append(after); - sb.append('\t'); sb.append(position); - write(LogGroup.CORRECTION, sb.toString()); - } - - public void logStateChange(final String subgroup, final String details) { - write(LogGroup.STATE_CHANGE, subgroup + "\t" + details); - } - - public static class UnsLogGroup { - private static final boolean DEFAULT_ENABLED = true; - - private static final boolean KEYBOARDSTATE_ONCANCELINPUT_ENABLED = DEFAULT_ENABLED; - private static final boolean KEYBOARDSTATE_ONCODEINPUT_ENABLED = DEFAULT_ENABLED; - private static final boolean KEYBOARDSTATE_ONLONGPRESSTIMEOUT_ENABLED = DEFAULT_ENABLED; - private static final boolean KEYBOARDSTATE_ONPRESSKEY_ENABLED = DEFAULT_ENABLED; - private static final boolean KEYBOARDSTATE_ONRELEASEKEY_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_COMMITCURRENTAUTOCORRECTION_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_COMMITTEXT_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_DELETESURROUNDINGTEXT_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_DOUBLESPACEAUTOPERIOD_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_ONDISPLAYCOMPLETIONS_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_ONSTARTINPUTVIEWINTERNAL_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_ONUPDATESELECTION_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_PERFORMEDITORACTION_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_PICKAPPLICATIONSPECIFIEDCOMPLETION_ENABLED - = DEFAULT_ENABLED; - private static final boolean LATINIME_PICKPUNCTUATIONSUGGESTION_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_PICKSUGGESTIONMANUALLY_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_REVERTCOMMIT_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_REVERTDOUBLESPACEWHILEINBATCHEDIT_ENABLED - = DEFAULT_ENABLED; - private static final boolean LATINIME_REVERTSWAPPUNCTUATION_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_SENDKEYCODEPOINT_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINIME_SWAPSWAPPERANDSPACEWHILEINBATCHEDIT_ENABLED - = DEFAULT_ENABLED; - private static final boolean LATINIME_SWITCHTOKEYBOARDVIEW_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINKEYBOARDVIEW_ONLONGPRESS_ENABLED = DEFAULT_ENABLED; - private static final boolean LATINKEYBOARDVIEW_ONPROCESSMOTIONEVENT_ENABLED - = DEFAULT_ENABLED; - private static final boolean LATINKEYBOARDVIEW_SETKEYBOARD_ENABLED = DEFAULT_ENABLED; - private static final boolean POINTERTRACKER_CALLLISTENERONCANCELINPUT_ENABLED - = DEFAULT_ENABLED; - private static final boolean POINTERTRACKER_CALLLISTENERONCODEINPUT_ENABLED - = DEFAULT_ENABLED; - private static final boolean - POINTERTRACKER_CALLLISTENERONPRESSANDCHECKKEYBOARDLAYOUTCHANGE_ENABLED - = DEFAULT_ENABLED; - private static final boolean POINTERTRACKER_CALLLISTENERONRELEASE_ENABLED = DEFAULT_ENABLED; - private static final boolean POINTERTRACKER_ONDOWNEVENT_ENABLED = DEFAULT_ENABLED; - private static final boolean POINTERTRACKER_ONMOVEEVENT_ENABLED = DEFAULT_ENABLED; - private static final boolean SUDDENJUMPINGTOUCHEVENTHANDLER_ONTOUCHEVENT_ENABLED - = DEFAULT_ENABLED; - private static final boolean SUGGESTIONSVIEW_SETSUGGESTIONS_ENABLED = DEFAULT_ENABLED; - } - - public static void logUnstructured(String logGroup, final String details) { - // TODO: improve performance by making entire class static and/or implementing natively - getInstance().write(LogGroup.UNSTRUCTURED, logGroup + "\t" + details); - } - - private void write(final LogGroup logGroup, final String log) { - // TODO: rewrite in native for better performance - mLoggingHandler.post(new Runnable() { - @Override - public void run() { - final long currentTime = System.currentTimeMillis(); - final long upTime = SystemClock.uptimeMillis(); - final StringBuilder builder = new StringBuilder(); - builder.append(currentTime); - builder.append('\t'); builder.append(upTime); - builder.append('\t'); builder.append(logGroup.mLogString); - builder.append('\t'); builder.append(log); - builder.append('\n'); - if (DEBUG) { - Log.d(TAG, "Write: " + '[' + logGroup.mLogString + ']' + log); - } - final String s = builder.toString(); - if (mLogFileManager.append(s)) { - // success - } else { - if (DEBUG) { - Log.w(TAG, "Unable to write to log."); - } - // perhaps logfile was deleted. try to recreate and relog. + public synchronized void stop() { + Log.d(TAG, "stop called"); + if (mLoggingHandler != null && mLoggingState == LOGGING_STATE_ON) { + mLoggingState = LOGGING_STATE_STOPPING; + // put this in the Handler queue so pending writes are processed first. + mLoggingHandler.post(new Runnable() { + @Override + public void run() { try { - mLogFileManager.createLogFile(PreferenceManager - .getDefaultSharedPreferences(mIms)); - mLogFileManager.append(s); + Log.d(TAG, "closing jsonwriter"); + mJsonWriter.endArray(); + mJsonWriter.flush(); + mJsonWriter.close(); + } catch (IllegalStateException e1) { + // assume that this is just the json not being terminated properly. + // ignore + e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); + } finally { + mJsonWriter = NULL_JSON_WRITER; + mFile = null; + mLoggingState = LOGGING_STATE_OFF; + if (DEBUG) { + Log.d(TAG, "logfile closed"); + } + Log.d(TAG, "finished stop(), notifying"); + synchronized (ResearchLogger.this) { + ResearchLogger.this.notify(); + } } } + }); + try { + wait(); + } catch (InterruptedException e) { + e.printStackTrace(); } - }); + } } - public void clearAll() { - mLoggingHandler.post(new Runnable() { - @Override - public void run() { + public synchronized boolean abort() { + Log.d(TAG, "abort called"); + boolean isLogFileDeleted = false; + if (mLoggingHandler != null && mLoggingState == LOGGING_STATE_ON) { + mLoggingState = LOGGING_STATE_STOPPING; + try { + Log.d(TAG, "closing jsonwriter"); + mJsonWriter.endArray(); + mJsonWriter.close(); + } catch (IllegalStateException e1) { + // assume that this is just the json not being terminated properly. + // ignore + e1.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + mJsonWriter = NULL_JSON_WRITER; + // delete file + final boolean isDeleted = mFile.delete(); + if (isDeleted) { + isLogFileDeleted = true; + } + mFile = null; + mLoggingState = LOGGING_STATE_OFF; if (DEBUG) { - Log.d(TAG, "Delete log file."); + Log.d(TAG, "logfile closed"); } - mLogFileManager.reset(); } - }); + } + return isLogFileDeleted; } - /* package */ LogFileManager getLogFileManager() { - return mLogFileManager; + /* package */ synchronized void flush() { + try { + mJsonWriter.flush(); + } catch (IOException e) { + e.printStackTrace(); + } } @Override @@ -433,325 +266,584 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang return; } sIsLogging = prefs.getBoolean(PREF_USABILITY_STUDY_MODE, false); - } - - public static void keyboardState_onCancelInput(final boolean isSinglePointer, - final KeyboardState keyboardState) { - if (UnsLogGroup.KEYBOARDSTATE_ONCANCELINPUT_ENABLED) { - final String s = "onCancelInput: single=" + isSinglePointer + " " + keyboardState; - logUnstructured("KeyboardState_onCancelInput", s); + if (sIsLogging == false) { + abort(); } } - public static void keyboardState_onCodeInput( - final int code, final boolean isSinglePointer, final int autoCaps, - final KeyboardState keyboardState) { - if (UnsLogGroup.KEYBOARDSTATE_ONCODEINPUT_ENABLED) { - final String s = "onCodeInput: code=" + Keyboard.printableCode(code) - + " single=" + isSinglePointer - + " autoCaps=" + autoCaps + " " + keyboardState; - logUnstructured("KeyboardState_onCodeInput", s); - } + /* package */ void presentResearchDialog(final LatinIME latinIME) { + final CharSequence title = latinIME.getString(R.string.english_ime_research_log); + final CharSequence[] items = new CharSequence[] { + latinIME.getString(R.string.note_timestamp_for_researchlog), + latinIME.getString(R.string.do_not_log_this_session), + }; + final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface di, int position) { + di.dismiss(); + switch (position) { + case 0: + ResearchLogger.getInstance().userTimestamp(); + Toast.makeText(latinIME, R.string.notify_recorded_timestamp, + Toast.LENGTH_LONG).show(); + break; + case 1: + Toast toast = Toast.makeText(latinIME, + R.string.notify_session_log_deleting, Toast.LENGTH_LONG); + toast.show(); + final ResearchLogger logger = ResearchLogger.getInstance(); + boolean isLogDeleted = logger.abort(); + toast.cancel(); + if (isLogDeleted) { + Toast.makeText(latinIME, R.string.notify_session_log_deleted, + Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(latinIME, + R.string.notify_session_log_not_deleted, Toast.LENGTH_LONG) + .show(); + } + break; + } + } + }; + final AlertDialog.Builder builder = new AlertDialog.Builder(latinIME) + .setItems(items, listener) + .setTitle(title); + latinIME.showOptionDialog(builder.create()); } - public static void keyboardState_onLongPressTimeout(final int code, - final KeyboardState keyboardState) { - if (UnsLogGroup.KEYBOARDSTATE_ONLONGPRESSTIMEOUT_ENABLED) { - final String s = "onLongPressTimeout: code=" + Keyboard.printableCode(code) + " " - + keyboardState; - logUnstructured("KeyboardState_onLongPressTimeout", s); + private static final String CURRENT_TIME_KEY = "_ct"; + private static final String UPTIME_KEY = "_ut"; + private static final String EVENT_TYPE_KEY = "_ty"; + private static final Object[] EVENTKEYS_NULLVALUES = {}; + + /** + * Write a description of the event out to the ResearchLog. + * + * Runs in the background to avoid blocking the UI thread. + * + * @param keys an array containing a descriptive name for the event, followed by the keys + * @param values an array of values, either a String or Number. length should be one + * less than the keys array + */ + private synchronized void writeEvent(final String[] keys, final Object[] values) { + assert values.length + 1 == keys.length; + if (mLoggingState == LOGGING_STATE_ON) { + mLoggingHandler.post(new Runnable() { + @Override + public void run() { + try { + mJsonWriter.beginObject(); + mJsonWriter.name(CURRENT_TIME_KEY).value(System.currentTimeMillis()); + mJsonWriter.name(UPTIME_KEY).value(SystemClock.uptimeMillis()); + mJsonWriter.name(EVENT_TYPE_KEY).value(keys[0]); + final int length = values.length; + for (int i = 0; i < length; i++) { + mJsonWriter.name(keys[i + 1]); + Object value = values[i]; + if (value instanceof String) { + mJsonWriter.value((String) value); + } else if (value instanceof Number) { + mJsonWriter.value((Number) value); + } else if (value instanceof Boolean) { + mJsonWriter.value((Boolean) value); + } else if (value instanceof CompletionInfo[]) { + CompletionInfo[] ci = (CompletionInfo[]) value; + mJsonWriter.beginArray(); + for (int j = 0; j < ci.length; j++) { + mJsonWriter.value(ci[j].toString()); + } + mJsonWriter.endArray(); + } else if (value instanceof SharedPreferences) { + SharedPreferences prefs = (SharedPreferences) value; + mJsonWriter.beginObject(); + for (Map.Entry<String,?> entry : prefs.getAll().entrySet()) { + mJsonWriter.name(entry.getKey()); + final Object innerValue = entry.getValue(); + if (innerValue == null) { + mJsonWriter.nullValue(); + } else if (innerValue instanceof Boolean) { + mJsonWriter.value((Boolean) innerValue); + } else if (innerValue instanceof Number) { + mJsonWriter.value((Number) innerValue); + } else { + mJsonWriter.value(innerValue.toString()); + } + } + mJsonWriter.endObject(); + } else if (value instanceof Key[]) { + Key[] keys = (Key[]) value; + mJsonWriter.beginArray(); + for (Key key : keys) { + mJsonWriter.beginObject(); + mJsonWriter.name("code").value(key.mCode); + mJsonWriter.name("altCode").value(key.mAltCode); + mJsonWriter.name("x").value(key.mX); + mJsonWriter.name("y").value(key.mY); + mJsonWriter.name("w").value(key.mWidth); + mJsonWriter.name("h").value(key.mHeight); + mJsonWriter.endObject(); + } + mJsonWriter.endArray(); + } else if (value instanceof SuggestedWords) { + SuggestedWords words = (SuggestedWords) value; + mJsonWriter.beginObject(); + mJsonWriter.name("typedWordValid").value(words.mTypedWordValid); + mJsonWriter.name("hasAutoCorrectionCandidate") + .value(words.mHasAutoCorrectionCandidate); + mJsonWriter.name("isPunctuationSuggestions") + .value(words.mIsPunctuationSuggestions); + mJsonWriter.name("allowsToBeAutoCorrected") + .value(words.mAllowsToBeAutoCorrected); + mJsonWriter.name("isObsoleteSuggestions") + .value(words.mIsObsoleteSuggestions); + mJsonWriter.name("isPrediction") + .value(words.mIsPrediction); + mJsonWriter.name("words"); + mJsonWriter.beginArray(); + final int size = words.size(); + for (int j = 0; j < size; j++) { + SuggestedWordInfo wordInfo = words.getWordInfo(j); + mJsonWriter.value(wordInfo.toString()); + } + mJsonWriter.endArray(); + mJsonWriter.endObject(); + } else if (value == null) { + mJsonWriter.nullValue(); + } else { + Log.w(TAG, "Unrecognized type to be logged: " + + (value == null ? "<null>" : value.getClass().getName())); + mJsonWriter.nullValue(); + } + } + mJsonWriter.endObject(); + } catch (IOException e) { + e.printStackTrace(); + Log.w(TAG, "Error in JsonWriter; disabling logging"); + try { + mJsonWriter.close(); + } catch (IllegalStateException e1) { + // assume that this is just the json not being terminated properly. + // ignore + } catch (IOException e1) { + e1.printStackTrace(); + } finally { + mJsonWriter = NULL_JSON_WRITER; + } + } + } + }); + } + } + + private static final String[] EVENTKEYS_LATINKEYBOARDVIEW_PROCESSMOTIONEVENT = { + "LatinKeyboardViewProcessMotionEvent", "action", "eventTime", "id", "x", "y", "size", + "pressure" + }; + public static void latinKeyboardView_processMotionEvent(final MotionEvent me, final int action, + final long eventTime, final int index, final int id, final int x, final int y) { + if (me != null) { + final String actionString; + switch (action) { + case MotionEvent.ACTION_CANCEL: actionString = "CANCEL"; break; + case MotionEvent.ACTION_UP: actionString = "UP"; break; + case MotionEvent.ACTION_DOWN: actionString = "DOWN"; break; + case MotionEvent.ACTION_POINTER_UP: actionString = "POINTER_UP"; break; + case MotionEvent.ACTION_POINTER_DOWN: actionString = "POINTER_DOWN"; break; + case MotionEvent.ACTION_MOVE: actionString = "MOVE"; break; + case MotionEvent.ACTION_OUTSIDE: actionString = "OUTSIDE"; break; + default: actionString = "ACTION_" + action; break; + } + final float size = me.getSize(index); + final float pressure = me.getPressure(index); + final Object[] values = { + actionString, eventTime, id, x, y, size, pressure + }; + getInstance().writeEvent(EVENTKEYS_LATINKEYBOARDVIEW_PROCESSMOTIONEVENT, values); } } - public static void keyboardState_onPressKey(final int code, - final KeyboardState keyboardState) { - if (UnsLogGroup.KEYBOARDSTATE_ONPRESSKEY_ENABLED) { - final String s = "onPressKey: code=" + Keyboard.printableCode(code) + " " - + keyboardState; - logUnstructured("KeyboardState_onPressKey", s); - } + private static final String[] EVENTKEYS_LATINIME_ONCODEINPUT = { + "LatinIMEOnCodeInput", "code", "x", "y" + }; + public static void latinIME_onCodeInput(final int code, final int x, final int y) { + final Object[] values = { + Keyboard.printableCode(code), x, y + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_ONCODEINPUT, values); } - public static void keyboardState_onReleaseKey(final KeyboardState keyboardState, final int code, - final boolean withSliding) { - if (UnsLogGroup.KEYBOARDSTATE_ONRELEASEKEY_ENABLED) { - final String s = "onReleaseKey: code=" + Keyboard.printableCode(code) - + " sliding=" + withSliding + " " + keyboardState; - logUnstructured("KeyboardState_onReleaseKey", s); - } + private static final String[] EVENTKEYS_CORRECTION = { + "LogCorrection", "subgroup", "before", "after", "position" + }; + public static void logCorrection(final String subgroup, final String before, final String after, + final int position) { + final Object[] values = { + subgroup, before, after, position + }; + getInstance().writeEvent(EVENTKEYS_CORRECTION, values); } + private static final String[] EVENTKEYS_LATINIME_COMMITCURRENTAUTOCORRECTION = { + "LatinIMECommitCurrentAutoCorrection", "typedWord", "autoCorrection" + }; public static void latinIME_commitCurrentAutoCorrection(final String typedWord, final String autoCorrection) { - if (UnsLogGroup.LATINIME_COMMITCURRENTAUTOCORRECTION_ENABLED) { - if (typedWord.equals(autoCorrection)) { - getInstance().logCorrection("[----]", typedWord, autoCorrection, -1); - } else { - getInstance().logCorrection("[Auto]", typedWord, autoCorrection, -1); - } - } + final Object[] values = { + typedWord, autoCorrection + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_COMMITCURRENTAUTOCORRECTION, values); } + private static final String[] EVENTKEYS_LATINIME_COMMITTEXT = { + "LatinIMECommitText", "typedWord" + }; public static void latinIME_commitText(final CharSequence typedWord) { - if (UnsLogGroup.LATINIME_COMMITTEXT_ENABLED) { - logUnstructured("LatinIME_commitText", typedWord.toString()); - } + final Object[] values = { + typedWord.toString() + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_COMMITTEXT, values); } + private static final String[] EVENTKEYS_LATINIME_DELETESURROUNDINGTEXT = { + "LatinIMEDeleteSurroundingText", "length" + }; public static void latinIME_deleteSurroundingText(final int length) { - if (UnsLogGroup.LATINIME_DELETESURROUNDINGTEXT_ENABLED) { - logUnstructured("LatinIME_deleteSurroundingText", String.valueOf(length)); - } + final Object[] values = { + length + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_DELETESURROUNDINGTEXT, values); } + private static final String[] EVENTKEYS_LATINIME_DOUBLESPACEAUTOPERIOD = { + "LatinIMEDoubleSpaceAutoPeriod" + }; public static void latinIME_doubleSpaceAutoPeriod() { - if (UnsLogGroup.LATINIME_DOUBLESPACEAUTOPERIOD_ENABLED) { - logUnstructured("LatinIME_doubleSpaceAutoPeriod", ""); - } + getInstance().writeEvent(EVENTKEYS_LATINIME_DOUBLESPACEAUTOPERIOD, EVENTKEYS_NULLVALUES); } + private static final String[] EVENTKEYS_LATINIME_ONDISPLAYCOMPLETIONS = { + "LatinIMEOnDisplayCompletions", "applicationSpecifiedCompletions" + }; public static void latinIME_onDisplayCompletions( final CompletionInfo[] applicationSpecifiedCompletions) { - if (UnsLogGroup.LATINIME_ONDISPLAYCOMPLETIONS_ENABLED) { - final StringBuilder builder = new StringBuilder(); - builder.append("Received completions:"); - if (applicationSpecifiedCompletions != null) { - for (int i = 0; i < applicationSpecifiedCompletions.length; i++) { - builder.append(" #"); - builder.append(i); - builder.append(": "); - builder.append(applicationSpecifiedCompletions[i]); - builder.append("\n"); + final Object[] values = { + applicationSpecifiedCompletions + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_ONDISPLAYCOMPLETIONS, values); + } + + /* package */ static boolean getAndClearLatinIMEExpectingUpdateSelection() { + boolean returnValue = sLatinIMEExpectingUpdateSelection; + sLatinIMEExpectingUpdateSelection = false; + return returnValue; + } + + private static final String[] EVENTKEYS_LATINIME_ONWINDOWHIDDEN = { + "LatinIMEOnWindowHidden", "isTextTruncated", "text" + }; + public static void latinIME_onWindowHidden(final int savedSelectionStart, + final int savedSelectionEnd, final InputConnection ic) { + if (ic != null) { + ic.beginBatchEdit(); + ic.performContextMenuAction(android.R.id.selectAll); + CharSequence charSequence = ic.getSelectedText(0); + ic.setSelection(savedSelectionStart, savedSelectionEnd); + ic.endBatchEdit(); + sLatinIMEExpectingUpdateSelection = true; + Object[] values = new Object[2]; + if (TextUtils.isEmpty(charSequence)) { + values[0] = false; + values[1] = ""; + } else { + if (charSequence.length() > MAX_INPUTVIEW_LENGTH_TO_CAPTURE) { + int length = MAX_INPUTVIEW_LENGTH_TO_CAPTURE; + // do not cut in the middle of a supplementary character + final char c = charSequence.charAt(length - 1); + if (Character.isHighSurrogate(c)) { + length--; + } + final CharSequence truncatedCharSequence = charSequence.subSequence(0, length); + values[0] = true; + values[1] = truncatedCharSequence.toString(); + } else { + values[0] = false; + values[1] = charSequence.toString(); } } - logUnstructured("LatinIME_onDisplayCompletions", builder.toString()); + getInstance().writeEvent(EVENTKEYS_LATINIME_ONWINDOWHIDDEN, values); } } + private static final String[] EVENTKEYS_LATINIME_ONSTARTINPUTVIEWINTERNAL = { + "LatinIMEOnStartInputViewInternal", "uuid", "packageName", "inputType", "imeOptions", + "fieldId", "display", "model", "prefs", "outputFormatVersion" + }; public static void latinIME_onStartInputViewInternal(final EditorInfo editorInfo, final SharedPreferences prefs) { - if (UnsLogGroup.LATINIME_ONSTARTINPUTVIEWINTERNAL_ENABLED) { - final StringBuilder builder = new StringBuilder(); - builder.append("onStartInputView: editorInfo:"); - builder.append("\tinputType="); - builder.append(Integer.toHexString(editorInfo.inputType)); - builder.append("\timeOptions="); - builder.append(Integer.toHexString(editorInfo.imeOptions)); - builder.append("\tdisplay="); builder.append(Build.DISPLAY); - builder.append("\tmodel="); builder.append(Build.MODEL); - for (Map.Entry<String,?> entry : prefs.getAll().entrySet()) { - builder.append("\t" + entry.getKey()); - Object value = entry.getValue(); - builder.append("=" + ((value == null) ? "<null>" : value.toString())); - } - logUnstructured("LatinIME_onStartInputViewInternal", builder.toString()); + if (editorInfo != null) { + final Object[] values = { + getUUID(prefs), editorInfo.packageName, Integer.toHexString(editorInfo.inputType), + Integer.toHexString(editorInfo.imeOptions), editorInfo.fieldId, Build.DISPLAY, + Build.MODEL, prefs, OUTPUT_FORMAT_VERSION + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_ONSTARTINPUTVIEWINTERNAL, values); } } - public static void latinIME_onUpdateSelection(final int lastSelectionStart, - final int lastSelectionEnd, final int oldSelStart, final int oldSelEnd, - final int newSelStart, final int newSelEnd, final int composingSpanStart, - final int composingSpanEnd) { - if (UnsLogGroup.LATINIME_ONUPDATESELECTION_ENABLED) { - final String s = "onUpdateSelection: oss=" + oldSelStart - + ", ose=" + oldSelEnd - + ", lss=" + lastSelectionStart - + ", lse=" + lastSelectionEnd - + ", nss=" + newSelStart - + ", nse=" + newSelEnd - + ", cs=" + composingSpanStart - + ", ce=" + composingSpanEnd; - logUnstructured("LatinIME_onUpdateSelection", s); + private static String getUUID(final SharedPreferences prefs) { + String uuidString = prefs.getString(PREF_RESEARCH_LOGGER_UUID_STRING, null); + if (null == uuidString) { + UUID uuid = UUID.randomUUID(); + uuidString = uuid.toString(); + Editor editor = prefs.edit(); + editor.putString(PREF_RESEARCH_LOGGER_UUID_STRING, uuidString); + editor.apply(); } + return uuidString; } + private static final String[] EVENTKEYS_LATINIME_ONUPDATESELECTION = { + "LatinIMEOnUpdateSelection", "lastSelectionStart", "lastSelectionEnd", "oldSelStart", + "oldSelEnd", "newSelStart", "newSelEnd", "composingSpanStart", "composingSpanEnd", + "expectingUpdateSelection", "expectingUpdateSelectionFromLogger", "context" + }; + public static void latinIME_onUpdateSelection(final int lastSelectionStart, + final int lastSelectionEnd, final int oldSelStart, final int oldSelEnd, + final int newSelStart, final int newSelEnd, final int composingSpanStart, + final int composingSpanEnd, final boolean expectingUpdateSelection, + final boolean expectingUpdateSelectionFromLogger, final InputConnection connection) { + final Object[] values = { + lastSelectionStart, lastSelectionEnd, oldSelStart, oldSelEnd, newSelStart, + newSelEnd, composingSpanStart, composingSpanEnd, expectingUpdateSelection, + expectingUpdateSelectionFromLogger, + EditingUtils.getWordRangeAtCursor(connection, WHITESPACE_SEPARATORS, 1).mWord + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_ONUPDATESELECTION, values); + } + + private static final String[] EVENTKEYS_LATINIME_PERFORMEDITORACTION = { + "LatinIMEPerformEditorAction", "imeActionNext" + }; public static void latinIME_performEditorAction(final int imeActionNext) { - if (UnsLogGroup.LATINIME_PERFORMEDITORACTION_ENABLED) { - logUnstructured("LatinIME_performEditorAction", String.valueOf(imeActionNext)); - } + final Object[] values = { + imeActionNext + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_PERFORMEDITORACTION, values); } + private static final String[] EVENTKEYS_LATINIME_PICKAPPLICATIONSPECIFIEDCOMPLETION = { + "LatinIMEPickApplicationSpecifiedCompletion", "index", "text", "x", "y" + }; public static void latinIME_pickApplicationSpecifiedCompletion(final int index, final CharSequence text, int x, int y) { - if (UnsLogGroup.LATINIME_PICKAPPLICATIONSPECIFIEDCOMPLETION_ENABLED) { - final String s = String.valueOf(index) + '\t' + text + '\t' + x + '\t' + y; - logUnstructured("LatinIME_pickApplicationSpecifiedCompletion", s); - } + final Object[] values = { + index, text.toString(), x, y + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_PICKAPPLICATIONSPECIFIEDCOMPLETION, values); } + private static final String[] EVENTKEYS_LATINIME_PICKSUGGESTIONMANUALLY = { + "LatinIMEPickSuggestionManually", "replacedWord", "index", "suggestion", "x", "y" + }; public static void latinIME_pickSuggestionManually(final String replacedWord, final int index, CharSequence suggestion, int x, int y) { - if (UnsLogGroup.LATINIME_PICKSUGGESTIONMANUALLY_ENABLED) { - final String s = String.valueOf(index) + '\t' + suggestion + '\t' + x + '\t' + y; - logUnstructured("LatinIME_pickSuggestionManually", s); - } + final Object[] values = { + replacedWord, index, suggestion.toString(), x, y + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_PICKSUGGESTIONMANUALLY, values); } + private static final String[] EVENTKEYS_LATINIME_PUNCTUATIONSUGGESTION = { + "LatinIMEPunctuationSuggestion", "index", "suggestion", "x", "y" + }; public static void latinIME_punctuationSuggestion(final int index, final CharSequence suggestion, int x, int y) { - if (UnsLogGroup.LATINIME_PICKPUNCTUATIONSUGGESTION_ENABLED) { - final String s = String.valueOf(index) + '\t' + suggestion + '\t' + x + '\t' + y; - logUnstructured("LatinIME_pickPunctuationSuggestion", s); - } + final Object[] values = { + index, suggestion.toString(), x, y + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_PUNCTUATIONSUGGESTION, values); } + private static final String[] EVENTKEYS_LATINIME_REVERTDOUBLESPACEWHILEINBATCHEDIT = { + "LatinIMERevertDoubleSpaceWhileInBatchEdit" + }; public static void latinIME_revertDoubleSpaceWhileInBatchEdit() { - if (UnsLogGroup.LATINIME_REVERTDOUBLESPACEWHILEINBATCHEDIT_ENABLED) { - logUnstructured("LatinIME_revertDoubleSpaceWhileInBatchEdit", ""); - } + getInstance().writeEvent(EVENTKEYS_LATINIME_REVERTDOUBLESPACEWHILEINBATCHEDIT, + EVENTKEYS_NULLVALUES); } + private static final String[] EVENTKEYS_LATINIME_REVERTSWAPPUNCTUATION = { + "LatinIMERevertSwapPunctuation" + }; public static void latinIME_revertSwapPunctuation() { - if (UnsLogGroup.LATINIME_REVERTSWAPPUNCTUATION_ENABLED) { - logUnstructured("LatinIME_revertSwapPunctuation", ""); - } + getInstance().writeEvent(EVENTKEYS_LATINIME_REVERTSWAPPUNCTUATION, EVENTKEYS_NULLVALUES); } + private static final String[] EVENTKEYS_LATINIME_SENDKEYCODEPOINT = { + "LatinIMESendKeyCodePoint", "code" + }; public static void latinIME_sendKeyCodePoint(final int code) { - if (UnsLogGroup.LATINIME_SENDKEYCODEPOINT_ENABLED) { - logUnstructured("LatinIME_sendKeyCodePoint", String.valueOf(code)); - } + final Object[] values = { + code + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_SENDKEYCODEPOINT, values); } + private static final String[] EVENTKEYS_LATINIME_SWAPSWAPPERANDSPACEWHILEINBATCHEDIT = { + "LatinIMESwapSwapperAndSpaceWhileInBatchEdit" + }; public static void latinIME_swapSwapperAndSpaceWhileInBatchEdit() { - if (UnsLogGroup.LATINIME_SWAPSWAPPERANDSPACEWHILEINBATCHEDIT_ENABLED) { - logUnstructured("latinIME_swapSwapperAndSpaceWhileInBatchEdit", ""); - } + getInstance().writeEvent(EVENTKEYS_LATINIME_SWAPSWAPPERANDSPACEWHILEINBATCHEDIT, + EVENTKEYS_NULLVALUES); } + private static final String[] EVENTKEYS_LATINIME_SWITCHTOKEYBOARDVIEW = { + "LatinIMESwitchToKeyboardView" + }; public static void latinIME_switchToKeyboardView() { - if (UnsLogGroup.LATINIME_SWITCHTOKEYBOARDVIEW_ENABLED) { - final String s = "Switch to keyboard view."; - logUnstructured("LatinIME_switchToKeyboardView", s); - } + getInstance().writeEvent(EVENTKEYS_LATINIME_SWITCHTOKEYBOARDVIEW, EVENTKEYS_NULLVALUES); } + private static final String[] EVENTKEYS_LATINKEYBOARDVIEW_ONLONGPRESS = { + "LatinKeyboardViewOnLongPress" + }; public static void latinKeyboardView_onLongPress() { - if (UnsLogGroup.LATINKEYBOARDVIEW_ONLONGPRESS_ENABLED) { - final String s = "long press detected"; - logUnstructured("LatinKeyboardView_onLongPress", s); - } - } - - public static void latinKeyboardView_processMotionEvent(MotionEvent me, int action, - long eventTime, int index, int id, int x, int y) { - if (UnsLogGroup.LATINKEYBOARDVIEW_ONPROCESSMOTIONEVENT_ENABLED) { - final float size = me.getSize(index); - final float pressure = me.getPressure(index); - if (action != MotionEvent.ACTION_MOVE) { - getInstance().logMotionEvent(action, eventTime, id, x, y, size, pressure); - } - } + getInstance().writeEvent(EVENTKEYS_LATINKEYBOARDVIEW_ONLONGPRESS, EVENTKEYS_NULLVALUES); } + private static final String[] EVENTKEYS_LATINKEYBOARDVIEW_SETKEYBOARD = { + "LatinKeyboardViewSetKeyboard", "elementId", "locale", "orientation", "width", + "modeName", "action", "navigateNext", "navigatePrevious", "clobberSettingsKey", + "passwordInput", "shortcutKeyEnabled", "hasShortcutKey", "languageSwitchKeyEnabled", + "isMultiLine", "tw", "th", "keys" + }; public static void latinKeyboardView_setKeyboard(final Keyboard keyboard) { - if (UnsLogGroup.LATINKEYBOARDVIEW_SETKEYBOARD_ENABLED) { - StringBuilder builder = new StringBuilder(); - builder.append("id="); - builder.append(keyboard.mId); - builder.append("\tw="); - builder.append(keyboard.mOccupiedWidth); - builder.append("\th="); - builder.append(keyboard.mOccupiedHeight); - builder.append("\tkeys=["); - boolean first = true; - for (Key key : keyboard.mKeys) { - if (first) { - first = false; - } else { - builder.append(","); - } - builder.append("{code:"); - builder.append(key.mCode); - builder.append(",altCode:"); - builder.append(key.mAltCode); - builder.append(",x:"); - builder.append(key.mX); - builder.append(",y:"); - builder.append(key.mY); - builder.append(",w:"); - builder.append(key.mWidth); - builder.append(",h:"); - builder.append(key.mHeight); - builder.append("}"); - } - builder.append("]"); - logUnstructured("LatinKeyboardView_setKeyboard", builder.toString()); - } - } - + if (keyboard != null) { + final KeyboardId kid = keyboard.mId; + final Object[] values = { + KeyboardId.elementIdToName(kid.mElementId), + kid.mLocale + ":" + kid.mSubtype.getExtraValueOf(KEYBOARD_LAYOUT_SET), + kid.mOrientation, + kid.mWidth, + KeyboardId.modeName(kid.mMode), + kid.imeAction(), + kid.navigateNext(), + kid.navigatePrevious(), + kid.mClobberSettingsKey, + kid.passwordInput(), + kid.mShortcutKeyEnabled, + kid.mHasShortcutKey, + kid.mLanguageSwitchKeyEnabled, + kid.isMultiLine(), + keyboard.mOccupiedWidth, + keyboard.mOccupiedHeight, + keyboard.mKeys + }; + getInstance().writeEvent(EVENTKEYS_LATINKEYBOARDVIEW_SETKEYBOARD, values); + } + } + + private static final String[] EVENTKEYS_LATINIME_REVERTCOMMIT = { + "LatinIMERevertCommit", "originallyTypedWord" + }; public static void latinIME_revertCommit(final String originallyTypedWord) { - if (UnsLogGroup.LATINIME_REVERTCOMMIT_ENABLED) { - logUnstructured("LatinIME_revertCommit", originallyTypedWord); - } + final Object[] values = { + originallyTypedWord + }; + getInstance().writeEvent(EVENTKEYS_LATINIME_REVERTCOMMIT, values); } + private static final String[] EVENTKEYS_POINTERTRACKER_CALLLISTENERONCANCELINPUT = { + "PointerTrackerCallListenerOnCancelInput" + }; public static void pointerTracker_callListenerOnCancelInput() { - final String s = "onCancelInput"; - if (UnsLogGroup.POINTERTRACKER_CALLLISTENERONCANCELINPUT_ENABLED) { - logUnstructured("PointerTracker_callListenerOnCancelInput", s); - } + getInstance().writeEvent(EVENTKEYS_POINTERTRACKER_CALLLISTENERONCANCELINPUT, + EVENTKEYS_NULLVALUES); } + private static final String[] EVENTKEYS_POINTERTRACKER_CALLLISTENERONCODEINPUT = { + "PointerTrackerCallListenerOnCodeInput", "code", "outputText", "x", "y", + "ignoreModifierKey", "altersCode", "isEnabled" + }; public static void pointerTracker_callListenerOnCodeInput(final Key key, final int x, final int y, final boolean ignoreModifierKey, final boolean altersCode, final int code) { - if (UnsLogGroup.POINTERTRACKER_CALLLISTENERONCODEINPUT_ENABLED) { - final String s = "onCodeInput: " + Keyboard.printableCode(code) - + " text=" + key.mOutputText + " x=" + x + " y=" + y - + " ignoreModifier=" + ignoreModifierKey + " altersCode=" + altersCode - + " enabled=" + key.isEnabled(); - logUnstructured("PointerTracker_callListenerOnCodeInput", s); - } - } - - public static void pointerTracker_callListenerOnPressAndCheckKeyboardLayoutChange( - final Key key, final boolean ignoreModifierKey) { - if (UnsLogGroup.POINTERTRACKER_CALLLISTENERONPRESSANDCHECKKEYBOARDLAYOUTCHANGE_ENABLED) { - final String s = "onPress : " + KeyDetector.printableCode(key) - + " ignoreModifier=" + ignoreModifierKey - + " enabled=" + key.isEnabled(); - logUnstructured("PointerTracker_callListenerOnPressAndCheckKeyboardLayoutChange", s); + if (key != null) { + CharSequence outputText = key.mOutputText; + final Object[] values = { + Keyboard.printableCode(code), outputText == null ? "" : outputText.toString(), + x, y, ignoreModifierKey, altersCode, key.isEnabled() + }; + getInstance().writeEvent(EVENTKEYS_POINTERTRACKER_CALLLISTENERONCODEINPUT, values); } } + private static final String[] EVENTKEYS_POINTERTRACKER_CALLLISTENERONRELEASE = { + "PointerTrackerCallListenerOnRelease", "code", "withSliding", "ignoreModifierKey", + "isEnabled" + }; public static void pointerTracker_callListenerOnRelease(final Key key, final int primaryCode, final boolean withSliding, final boolean ignoreModifierKey) { - if (UnsLogGroup.POINTERTRACKER_CALLLISTENERONRELEASE_ENABLED) { - final String s = "onRelease : " + Keyboard.printableCode(primaryCode) - + " sliding=" + withSliding + " ignoreModifier=" + ignoreModifierKey - + " enabled="+ key.isEnabled(); - logUnstructured("PointerTracker_callListenerOnRelease", s); + if (key != null) { + final Object[] values = { + Keyboard.printableCode(primaryCode), withSliding, ignoreModifierKey, + key.isEnabled() + }; + getInstance().writeEvent(EVENTKEYS_POINTERTRACKER_CALLLISTENERONRELEASE, values); } } + private static final String[] EVENTKEYS_POINTERTRACKER_ONDOWNEVENT = { + "PointerTrackerOnDownEvent", "deltaT", "distanceSquared" + }; public static void pointerTracker_onDownEvent(long deltaT, int distanceSquared) { - if (UnsLogGroup.POINTERTRACKER_ONDOWNEVENT_ENABLED) { - final String s = "onDownEvent: ignore potential noise: time=" + deltaT - + " distance=" + distanceSquared; - logUnstructured("PointerTracker_onDownEvent", s); - } + final Object[] values = { + deltaT, distanceSquared + }; + getInstance().writeEvent(EVENTKEYS_POINTERTRACKER_ONDOWNEVENT, values); } + private static final String[] EVENTKEYS_POINTERTRACKER_ONMOVEEVENT = { + "PointerTrackerOnMoveEvent", "x", "y", "lastX", "lastY" + }; public static void pointerTracker_onMoveEvent(final int x, final int y, final int lastX, final int lastY) { - if (UnsLogGroup.POINTERTRACKER_ONMOVEEVENT_ENABLED) { - final String s = String.format("onMoveEvent: sudden move is translated to " - + "up[%d,%d]/down[%d,%d] events", lastX, lastY, x, y); - logUnstructured("PointerTracker_onMoveEvent", s); - } + final Object[] values = { + x, y, lastX, lastY + }; + getInstance().writeEvent(EVENTKEYS_POINTERTRACKER_ONMOVEEVENT, values); } + private static final String[] EVENTKEYS_SUDDENJUMPINGTOUCHEVENTHANDLER_ONTOUCHEVENT = { + "SuddenJumpingTouchEventHandlerOnTouchEvent", "motionEvent" + }; public static void suddenJumpingTouchEventHandler_onTouchEvent(final MotionEvent me) { - if (UnsLogGroup.SUDDENJUMPINGTOUCHEVENTHANDLER_ONTOUCHEVENT_ENABLED) { - final String s = "onTouchEvent: ignore sudden jump " + me; - logUnstructured("SuddenJumpingTouchEventHandler_onTouchEvent", s); + if (me != null) { + final Object[] values = { + me.toString() + }; + getInstance().writeEvent(EVENTKEYS_SUDDENJUMPINGTOUCHEVENTHANDLER_ONTOUCHEVENT, + values); } } - public static void suggestionsView_setSuggestions(final SuggestedWords mSuggestedWords) { - if (UnsLogGroup.SUGGESTIONSVIEW_SETSUGGESTIONS_ENABLED) { - logUnstructured("SuggestionsView_setSuggestions", mSuggestedWords.toString()); + private static final String[] EVENTKEYS_SUGGESTIONSVIEW_SETSUGGESTIONS = { + "SuggestionsViewSetSuggestions", "suggestedWords" + }; + public static void suggestionsView_setSuggestions(final SuggestedWords suggestedWords) { + if (suggestedWords != null) { + final Object[] values = { + suggestedWords + }; + getInstance().writeEvent(EVENTKEYS_SUGGESTIONSVIEW_SETSUGGESTIONS, values); } } -}
\ No newline at end of file + + private static final String[] EVENTKEYS_USER_TIMESTAMP = { + "UserTimestamp" + }; + public void userTimestamp() { + getInstance().writeEvent(EVENTKEYS_USER_TIMESTAMP, EVENTKEYS_NULLVALUES); + } +} diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java index 88efc5a85..d34cad205 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java @@ -501,20 +501,32 @@ public class AndroidSpellCheckerService extends SpellCheckerService } private static class SuggestionsCache { + private static final char CHAR_DELIMITER = '\uFFFC'; private static final int MAX_CACHE_SIZE = 50; - // TODO: support bigram private final LruCache<String, SuggestionsParams> mUnigramSuggestionsInfoCache = new LruCache<String, SuggestionsParams>(MAX_CACHE_SIZE); - public SuggestionsParams getSuggestionsFromCache(String query) { - return mUnigramSuggestionsInfoCache.get(query); + // TODO: Support n-gram input + private static String generateKey(String query, String prevWord) { + if (TextUtils.isEmpty(query) || TextUtils.isEmpty(prevWord)) { + return query; + } + return query + CHAR_DELIMITER + prevWord; + } + + // TODO: Support n-gram input + public SuggestionsParams getSuggestionsFromCache(String query, String prevWord) { + return mUnigramSuggestionsInfoCache.get(generateKey(query, prevWord)); } - public void putSuggestionsToCache(String query, String[] suggestions, int flags) { + // TODO: Support n-gram input + public void putSuggestionsToCache( + String query, String prevWord, String[] suggestions, int flags) { if (suggestions == null || TextUtils.isEmpty(query)) { return; } - mUnigramSuggestionsInfoCache.put(query, new SuggestionsParams(suggestions, flags)); + mUnigramSuggestionsInfoCache.put( + generateKey(query, prevWord), new SuggestionsParams(suggestions, flags)); } } @@ -609,6 +621,7 @@ public class AndroidSpellCheckerService extends SpellCheckerService final ArrayList<Integer> additionalLengths = new ArrayList<Integer>(); final ArrayList<SuggestionsInfo> additionalSuggestionsInfos = new ArrayList<SuggestionsInfo>(); + String currentWord = null; for (int i = 0; i < N; ++i) { final SuggestionsInfo si = ssi.getSuggestionsInfoAt(i); final int flags = si.getSuggestionsAttributes(); @@ -618,6 +631,8 @@ public class AndroidSpellCheckerService extends SpellCheckerService final int offset = ssi.getOffsetAt(i); final int length = ssi.getLengthAt(i); final String subText = typedText.substring(offset, offset + length); + final String prevWord = currentWord; + currentWord = subText; if (!subText.contains(SINGLE_QUOTE)) { continue; } @@ -631,7 +646,8 @@ public class AndroidSpellCheckerService extends SpellCheckerService if (TextUtils.isEmpty(splitText)) { continue; } - if (mSuggestionsCache.getSuggestionsFromCache(splitText) == null) { + if (mSuggestionsCache.getSuggestionsFromCache( + splitText, prevWord) == null) { continue; } final int newLength = splitText.length(); @@ -727,7 +743,7 @@ public class AndroidSpellCheckerService extends SpellCheckerService try { final String inText = textInfo.getText(); final SuggestionsParams cachedSuggestionsParams = - mSuggestionsCache.getSuggestionsFromCache(inText); + mSuggestionsCache.getSuggestionsFromCache(inText, prevWord); if (cachedSuggestionsParams != null) { if (DBG) { Log.d(TAG, "Cache hit: " + inText + ", " + cachedSuggestionsParams.mFlags); @@ -819,7 +835,7 @@ public class AndroidSpellCheckerService extends SpellCheckerService .getValueOf_RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS() : 0); final SuggestionsInfo retval = new SuggestionsInfo(flags, result.mSuggestions); - mSuggestionsCache.putSuggestionsToCache(text, result.mSuggestions, flags); + mSuggestionsCache.putSuggestionsToCache(text, prevWord, result.mSuggestions, flags); return retval; } catch (RuntimeException e) { // Don't kill the keyboard if there is a bug in the spell checker |