diff options
Diffstat (limited to 'java')
123 files changed, 3018 insertions, 1222 deletions
diff --git a/java/proguard.flags b/java/proguard.flags index ca205b927..163352287 100644 --- a/java/proguard.flags +++ b/java/proguard.flags @@ -20,6 +20,10 @@ boolean equalsIgnoreCase(...); } +-keep class com.android.inputmethod.latin.InputPointers { + *; +} + -keep class com.android.inputmethod.latin.spellcheck.SpellCheckerSettingsFragment { *; } @@ -38,6 +42,7 @@ -keep class com.android.inputmethod.latin.ResearchLogger { void flush(); + void publishCurrentLogUnit(...); } -keep class com.android.inputmethod.keyboard.KeyboardLayoutSet$Builder { diff --git a/java/res/values-af/strings-appname.xml b/java/res/values-af/strings-appname.xml new file mode 100644 index 000000000..1adf723d7 --- /dev/null +++ b/java/res/values-af/strings-appname.xml @@ -0,0 +1,28 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for english_ime_name (178705338187710493) --> + <skip /> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android-speltoetser"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android-sleutelbordinstellings"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Speltoets tans instellings"</string> +</resources> diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml index 2a8a2e8f4..fb7cf349f 100644 --- a/java/res/values-af/strings.xml +++ b/java/res/values-af/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android-sleutelbord"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Navorsing-loglĂȘerbevele"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Soek kontakname op"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Speltoetser gebruik inskrywings uit jou kontaklys"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibreer met sleuteldruk"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"let op die tydstempel in die loglĂȘer"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Aangetekende tydstempel"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Moenie hierdie sessie aanteken nie"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Sessie se loglĂȘer uitgevee"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Sessie se loglĂȘer uitgevee"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Sessie se loglĂȘer NIE uitgevee nie"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-am/strings-appname.xml new file mode 100644 index 000000000..fd93114f3 --- /dev/null +++ b/java/res/values-am/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"ášAndroid ááá á°ááł"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android ášáá°á á á«á"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android ášááá á°ááł á
áá„áźáœ"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ášáá°á á á«á á
áá„áźáœ"</string> +</resources> diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml index a6373ccb6..d36b9a68b 100644 --- a/java/res/values-am/strings.xml +++ b/java/res/values-am/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"ášAndroid áááá°ááł"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ášá„áá” ášáááá„ áá”áłáá» á”ááááœ"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ášá„áá
á« á”ááœá á°ááášá”"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"áá°á á á«á ášá„áá
á« ááááá
ášááĄá”á áá ááá"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"á ááááá«ááá á ááá"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ášáááá„ áá”áłáá» áá áá
á°á áá”áłáá»"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ášáá áá
á°á á°áááá§á"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"áá
á ááá áá á„ááłá”áááá á"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"ááá áá ááááŁá á áá"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"áááá ášááááá áłáȘá áááá„"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ášááááá áááá„ áá”áłáá» á áá°ášá áá"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ášááá áá áááá„ áá”áłáá» á°á°ááá"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ášááááá áááá„ áá”áłáá» á áá°á°ášáá"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"ášááááá áłáȘá á°áááá§á"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"á”á
á°á”áŠááááá áłáȘá á áá°áááá á"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"ááááá áááᣠáá
á·á"</string> <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-appname.xml b/java/res/values-ar/strings-appname.xml new file mode 100644 index 000000000..3d81e5d4b --- /dev/null +++ b/java/res/values-ar/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"ÙÙŰŰ© Ù
ÙۧŰȘÙŰ Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"ۧÙŰȘŰŻÙÙÙ Ű§ÙŰ„Ù
ÙŰ§ŰŠÙ ÙÙ Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Ű„ŰčۯۧۯۧŰȘ ÙÙŰŰ© Ù
ÙۧŰȘÙŰ Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Ű„ŰčۯۧۯۧŰȘ ۧÙŰȘŰŻÙÙÙ Ű§ÙŰ„Ù
ÙۧۊÙ"</string> +</resources> diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml index 9e6f1ea51..9490704a6 100644 --- a/java/res/values-ar/strings.xml +++ b/java/res/values-ar/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"ÙÙŰŰ© Ù
ÙۧŰȘÙŰ Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ŰŁÙۧÙ
۱ ۳ۏÙۧŰȘ ۧÙŰšŰŰ«"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ŰšŰŰ« ÙÙ ŰŁŰłÙ
ۧۥ ŰŹÙۧŰȘ ۧÙۧŰȘ۔ۧÙ"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ÙŰłŰȘ۟ۯÙ
ۧÙÙ
ŰŻÙÙ Ű§ÙŰ„Ù
ÙŰ§ŰŠÙ Ű„ŰŻŰźŰ§ÙۧŰȘ Ù
Ù ÙۧۊÙ
Ű© ŰŹÙۧŰȘ ۧÙۧŰȘ۔ۧÙ"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ۧÙŰȘŰČۧŰČ ŰčÙŰŻ ۶ŰșŰ· Ù
ÙŰȘۧŰ"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Ù
ÙۧŰ۞۩ ۷ۧۚŰč ŰČÙ
ÙÙ ÙÙ ŰłŰŹÙ"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ŰȘÙ
ŰȘ۳ۏÙÙ Ű§Ù۷ۧۚŰč ۧÙŰČÙ
ÙÙ"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ŰčŰŻÙ
ŰȘ۳ۏÙÙ ÙŰ°Ù Ű§ÙŰŹÙ۳۩"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"ŰȘÙ
ÙÙÙ ŰȘ۳ۏÙÙ Ű§ÙŰŹÙ۳۩"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"ŰȘ۳ۏÙÙ ŰłŰŹÙ Ű§ÙŰŹÙ۳۩ ۚۧÙÙۧÙ
Ù"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ŰŹŰ§Ű±Ù ŰŰ°Ù ŰłŰŹÙ Ű§ÙŰŹÙ۳۩"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ŰȘÙ
ŰŰ°Ù ŰłŰŹÙ Ű§ÙŰŹÙ۳۩"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ÙÙ
ÙŰȘÙ
ŰŰ°Ù ŰłŰŹÙ Ű§ÙŰŹÙ۳۩"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"ŰȘÙ
ŰȘ۳ۏÙÙ ŰłŰŹÙ Ű§ÙŰŹÙ۳۩"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"ۧÙ۟۷ۣ: ÙÙ
ÙŰȘÙ
ŰȘ۳ۏÙÙ ŰłŰŹÙ Ű§ÙŰŹÙ۳۩"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"ŰȘÙ
ŰȘÙ
ÙÙÙ ŰȘ۳ۏÙÙ Ű§ÙŰŹÙ۳۩"</string> <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-appname.xml b/java/res/values-be/strings-appname.xml new file mode 100644 index 000000000..e0aadfa3c --- /dev/null +++ b/java/res/values-be/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"ĐлаĐČŃŃŃŃŃа Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"IĐœŃŃŃŃĐŒĐ”ĐœŃ ĐżŃаĐČĐ”ŃĐși ĐżŃаĐČапiŃŃ ĐŽĐ»Ń Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ĐĐ°Đ»Đ°ĐŽŃ ĐșлаĐČŃŃŃŃŃŃ Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ĐĐ°Đ»Đ°ĐŽŃ ĐżŃаĐČĐ”ŃĐșŃ Đ°ŃŃагŃаŃŃŃ"</string> +</resources> diff --git a/java/res/values-be/strings.xml b/java/res/values-be/strings.xml index fb371f4c3..0d563f330 100644 --- a/java/res/values-be/strings.xml +++ b/java/res/values-be/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"ĐлаĐČŃŃŃŃŃа Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ĐĐ°ĐŒĐ°ĐœĐŽŃ ĐłiŃŃĐŸŃŃŃ ĐŽĐ°ŃлДЎаĐČĐ°ĐœĐœŃŃ"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ĐšŃĐșаŃŃ ŃĐŒŃĐœŃ ĐșĐ°ĐœŃаĐșŃаŃ"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ĐĐŸĐŽŃĐ»Ń ĐżŃаĐČĐ”ŃĐșŃ ĐżŃаĐČапŃŃŃ ĐČŃĐșаŃŃŃŃĐŸŃĐČаД запŃŃŃ Ńа ŃĐżŃŃŃ ĐșĐ°ĐœŃаĐșŃаŃ"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ĐŃбŃаŃŃŃ ĐżŃŃ ĐœĐ°ŃŃŃĐșŃ ĐșлаĐČŃŃ"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ĐĐ°Đ·ĐœĐ°ŃŃŃŃ ŃĐ°Ń Ń ĐłiŃŃĐŸŃŃi"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ĐапiŃĐ°ĐœŃŃ ĐżĐ°Đ·ĐœĐ°ĐșŃ"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ĐĐ” ŃŃĐłŃŃŃŃаĐČаŃŃ ĐłŃŃŃ ŃĐ”Đ°ĐœŃ"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"ĐŁĐșĐ»ŃŃŃŃŃ ĐłiŃŃĐŸŃŃŃ ŃĐ”Đ°ĐœŃа"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"ĐапiŃ ŃŃŃĐč ĐłiŃŃĐŸŃŃi ŃĐ”Đ°ĐœŃа"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ĐŃĐŽĐ°Đ»Đ”ĐœĐœĐ” ĐłiŃŃĐŸŃŃi ŃĐ”Đ°ĐœŃа"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ĐiŃŃĐŸŃŃŃ ŃĐ”Đ°ĐœŃа ĐČŃĐŽĐ°Đ»Đ”ĐœĐ°"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ĐiŃŃĐŸŃŃŃ ŃĐ”Đ°ĐœŃа ĐĐ ĐČŃĐŽĐ°Đ»Đ”ĐœĐ°"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"ĐiŃŃĐŸŃŃŃ ŃĐ”Đ°ĐœŃа запiŃĐ°ĐœĐ°"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"ĐĐ°ĐŒŃĐ»Đșа: ĐłiŃŃĐŸŃŃŃ ŃĐ”Đ°ĐœŃа ĐРзапiŃĐ°ĐœĐ°"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"ĐŁĐșĐ»ŃŃĐ°ĐœŃ Đ·Đ°ĐżiŃ ŃĐ”Đ°ĐœŃа"</string> <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-appname.xml b/java/res/values-bg/strings-appname.xml new file mode 100644 index 000000000..49e301d32 --- /dev/null +++ b/java/res/values-bg/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"ĐлаĐČОаŃŃŃа ĐœĐ° Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"ĐŃĐŸĐłŃĐ°ĐŒĐ° за ĐżŃаĐČĐŸĐżĐžŃĐœĐ° ĐżŃĐŸĐČĐ”ŃĐșа за Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ĐаŃŃŃĐŸĐčĐșĐž ĐœĐ° ĐșлаĐČОаŃŃŃаŃа ĐœĐ° Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ĐаŃŃŃĐŸĐčĐșĐž за ĐżŃĐŸĐČĐ”ŃĐșа ĐœĐ° ĐżŃаĐČĐŸĐżĐžŃа"</string> +</resources> diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml index 94945c03b..38ebfe84a 100644 --- a/java/res/values-bg/strings.xml +++ b/java/res/values-bg/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"ĐлаĐČОаŃŃŃа ĐœĐ° Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ĐĐŸĐŒĐ°ĐœĐŽĐž за ŃДг. ŃаĐčĐ» за ĐżŃĐŸŃŃĐČĐ°ĐœĐžŃ"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ĐąŃŃŃĐ”ĐœĐ” ĐœĐ° ĐžĐŒĐ”ĐœĐ°"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Đа ĐżŃĐŸĐČĐ”ŃĐșа ĐœĐ° ĐżŃаĐČĐŸĐżĐžŃа ŃĐ” ĐżĐŸĐ»Đ·ĐČĐ°Ń Đ·Đ°ĐżĐžŃĐž ĐŸŃ ŃпОŃŃĐșа Ń ĐșĐŸĐœŃаĐșŃĐž"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Đа ĐČОбŃĐžŃа ĐżŃĐž ĐœĐ°ŃĐžŃĐșĐ°ĐœĐ” ĐœĐ° ĐșлаĐČĐžŃ"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ĐŃбДлŃĐ·ĐČĐ°ĐœĐ” ĐœĐ° ŃаŃа ĐČ ŃДг. ŃаĐčĐ»"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ЧаŃŃŃ Đ” запОŃĐ°Đœ"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ĐДз ŃДгОŃŃŃ. ĐœĐ° ŃĐ”ŃĐžŃŃа"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"РДг. ŃаĐčĐ» ĐœĐ° ŃĐ”ŃĐžŃŃа ŃĐ” ОзŃŃĐžĐČа"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"РДг. ŃаĐčĐ» ĐœĐ° ŃĐ”ŃĐžŃŃа Đ” ОзŃŃĐžŃ"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"РДг. ŃаĐčĐ» ĐœĐ° ŃĐ”ŃĐžŃŃа ĐРРОзŃŃĐžŃ"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-ca/strings-appname.xml new file mode 100644 index 000000000..add5c3f2f --- /dev/null +++ b/java/res/values-ca/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Teclat Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Corrector ortogrĂ fic d\'Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ConfiguraciĂł del teclat d\'Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ConfiguraciĂł de la correcciĂł ortogrĂ fica"</string> +</resources> diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml index b6fb56093..252441062 100644 --- a/java/res/values-ca/strings.xml +++ b/java/res/values-ca/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Teclat Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Recerca d\'ordres de reg."</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Cerca noms de contactes"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"El corrector ortogrĂ fic utilitza entrades de la llista de cont."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibra en prĂ©mer tecles"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Indica m. horĂ ria al reg."</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Marca horĂ ria enregistrada"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"No enregistris la sessiĂł"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Activa el registre de sessiĂł"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Registra tot l\'historial de sessiĂł"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Suprimint registre de ses."</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Registre de ses. suprimit"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Registre de ses. NO sup."</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Historial de sessiĂł registrat"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Error: historial de sessiĂł NO registrat"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Registre de sessiĂł activat"</string> <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-appname.xml b/java/res/values-cs/strings-appname.xml new file mode 100644 index 000000000..0eeac88b4 --- /dev/null +++ b/java/res/values-cs/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"KlĂĄvesnice Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Kontrola pravopisu Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"NastavenĂ klĂĄvesnice Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"NastavenĂ kontroly pravopisu"</string> +</resources> diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 5818d5c6f..4697d43ec 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"KlĂĄvesnice Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"PĆĂkazy vĂœvoj. protokolu"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Vyhledat kontakty"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Kontrola pravopisu pouĆŸĂvĂĄ zĂĄznamy z vaĆĄeho seznamu kontaktĆŻ."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"PĆi stisku klĂĄvesy vibrovat"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"UloĆŸit Äas do protokolu"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ÄasovĂ© razĂtko vloĆŸeno"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Neprotokolovat relaci"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Povolit protokolovĂĄnĂ relace"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Protokolovat celou historii relace"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"MazĂĄnĂ protokolu relace"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Protokol relace smazĂĄn"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Protokol relace nesmazĂĄn"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Historie relace protokolovĂĄna"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Historie relace NENĂ protokolovĂĄna"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"ProtokolovĂĄnĂ relace povoleno"</string> <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-appname.xml b/java/res/values-da/strings-appname.xml new file mode 100644 index 000000000..faef5824b --- /dev/null +++ b/java/res/values-da/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android-tastatur"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android-stavekontrol"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Indstillinger for Android-tastatur"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Indstillinger for stavekontrol"</string> +</resources> diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index dc1df0772..5a128ee58 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android-tastatur"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Forskningslogkommandoer"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"SlĂ„ kontaktnavne op"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Stavekontrollen bruger poster fra listen over kontaktpersoner"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibration ved tastetryk"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"NotĂ©r tidsstempel i log"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Noteret tidsstempel"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"LogfĂžr ikke denne session"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"AktivĂ©r logfĂžring af sessioner"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"LogfĂžr hele sessionshistorikken"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Sletter sessionslogfil"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Sessionslogfil slettet"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Sessionslog IKKE slettet"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Sessionshistorikken er logfĂžrt"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Fejl: Sessionshistorik IKKE logfĂžrt"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"LogfĂžring af sessioner er aktiveret"</string> <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-appname.xml b/java/res/values-de/strings-appname.xml new file mode 100644 index 000000000..fc5fb8902 --- /dev/null +++ b/java/res/values-de/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android-Tastatur"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android-RechtschreibprĂŒfung"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android-Tastatureinstellungen"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Einstellungen fĂŒr RechtschreibprĂŒfung"</string> +</resources> diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index b24952534..9381ecb56 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android-Tastatur"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Forschungsprotokollbefehle"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Kontaktnamen prĂŒfen"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"RechtschreibprĂŒfung verwendet EintrĂ€ge aus Ihrer Kontaktliste."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Bei Tastendruck vibrieren"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Zeitstempel im Protokoll"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Zeitstempel aufgenommen"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Nicht protokollieren"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Sitzungsprotokoll aktivieren"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Gesamten Sitzungsverlauf speichern"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Protokoll wird gelöscht..."</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Protokoll gelöscht"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Protokoll NICHT gelöscht"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Sitzungsverlauf gespeichert"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Sitzungsverlauf NICHT gespeichert"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sitzungsprotokoll aktiviert"</string> <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-appname.xml b/java/res/values-el/strings-appname.xml new file mode 100644 index 000000000..a199655f2 --- /dev/null +++ b/java/res/values-el/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"ΠληÎșÏÏολÏÎłÎčÎż Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"ÎÏΞογÏαÏÎčÎșÏÏ ÎλΔγÏÎżÏ Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ÎĄÏ
ÎžÎŒÎŻÏΔÎčÏ ÏληÎșÏÏολογίοÏ
Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ÎĄÏ
ÎžÎŒÎŻÏΔÎčÏ ÎżÏΞογÏαÏÎčÎșÎżÏ Î”Î»ÎÎłÏÎżÏ
"</string> +</resources> diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index d9e1aa8c4..8125bc4bd 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"ΠληÎșÏÏολÏÎłÎčÎż Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ÎÏΔÏ
Μα ΔΜÏολÏΜ ÎșαÏαγÏαÏÎźÏ"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ÎÎœÎ±Î¶ÎźÏηÏη ÎżÎœÎżÎŒÎŹÏÏΜ ΔÏαÏÏΜ"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Î ÎżÏΞογÏ. ÎλΔγÏÎżÏ ÏÏηÏÎčÎŒÎżÏ. ÎșαÏαÏÏÏÎŻÏΔÎčÏ Î±ÏÏ Ïη λίÏÏα ΔÏαÏÏΜ ÏαÏ"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ÎÏΜηÏη ÎșαÏÎŹ ÏÎż ÏÎŹÏηΌα ÏλΟÎșÏÏÏΜ"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ΧÏÏÎœÎżÏ ÏÏÎż αÏÏΔίο ÎșαÏαγÏ."</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ÎαÏαγΔγÏαΌΌÎÎœÎżÏ ÏÏÏÎœÎżÏ"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ΧÏÏÎŻÏ Î±ÏÏΔίο ÎșαÏαγÏαÏÎźÏ"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"ÎΜΔÏγοÏοίηÏη ÎșαÏαγÏαÏÎźÏ ÏΔÏÎčÏÎŽÎżÏ
"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"ÎαÏαγÏαÏÎź ολÏÎșλ. ÎčÏÏÎżÏÎčÎșÎżÏ ÏΔÏÎčÏÎŽÎżÏ
"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ÎÎčαγÏαÏÎź αÏÏΔίοÏ
ÏÏΜΎΔÏηÏ"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ÎÏÏΔίο ÎșαÏαγÏ. ÎŽÎčαγÏÎŹÏηÎșΔ"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ÎÏÏΔίο ÎșαÏαγÏ. ÎÎÎ ÎŽÎčαγÏ."</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"΀ο ÎčÏÏÎżÏÎčÎșÏ ÏΔÏÎčÏÎŽÎżÏ
ÎșαÏαγÏÎŹÏηÎșΔ"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"ÎŁÏÎŹÎ»ÎŒÎ±: ÎÎ ÎșαÏαγÏαÏÎź ÎčÏÏÎżÏ. ÏΔÏÎčÏÎŽÎżÏ
"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"ÎΜΔÏγοÏοίηÏη ÎșαÏαγÏαÏÎźÏ ÏΔÏÎčÏÎŽÎżÏ
"</string> <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-appname.xml b/java/res/values-en-rGB/strings-appname.xml new file mode 100644 index 000000000..ad9e782b0 --- /dev/null +++ b/java/res/values-en-rGB/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android keyboard"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android spell checker"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android keyboard settings"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Spell checking settings"</string> +</resources> diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml index 7241e5df0..9697cc792 100644 --- a/java/res/values-en-rGB/strings.xml +++ b/java/res/values-en-rGB/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android keyboard"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Research Log Commands"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Look up contact names"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Spell checker uses entries from your contact list"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrate on key-press"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Note timestamp in log"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Recorded timestamp"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Do not log this session"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Enable session logging"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Log whole session history"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Deleting session log"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Session log deleted"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Session log NOT deleted"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Session history logged"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Error: Session history NOT logged"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Session logging enabled"</string> <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-appname.xml b/java/res/values-es-rUS/strings-appname.xml new file mode 100644 index 000000000..5f08afba4 --- /dev/null +++ b/java/res/values-es-rUS/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Teclado de Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Corrector ortogrĂĄfico de Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ConfiguraciĂłn de teclado de Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ConfiguraciĂłn del corrector ortogrĂĄfico"</string> +</resources> diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 01d9912da..00fce612b 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Teclado de Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Comandos registro invest."</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Buscar nombres contactos"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"El corrector ortogrĂĄfico usa entradas de tu lista de contactos."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar teclas"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Marcar tiempo en registro"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Marca tiempo registrada"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"No registrar esta sesiĂłn"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Activar registro de sesiĂłn"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Registrar his. de sesiĂłn completo"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Eliminando registro"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Registro sesiĂłn eliminado"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"NO se eliminĂł el registro"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Se registrĂł el historial de sesiĂłn."</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Error al registrar his. de sesiĂłn"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Se activĂł el historial de sesiĂłn."</string> <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-appname.xml b/java/res/values-es/strings-appname.xml new file mode 100644 index 000000000..cce9a176d --- /dev/null +++ b/java/res/values-es/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Teclado de Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Corrector ortogrĂĄfico de Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Ajustes del teclado de Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Ajustes del corrector ortogrĂĄfico"</string> +</resources> diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index f97d93ddf..7625003c8 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Teclado de Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Comandos registro investigaciĂłn"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Nombres de contactos"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Añadir nombres de tu lista de contactos al corrector"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar tecla"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Anotar marca tiempo en registro"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Marca de tiempo registrada"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"No registrar esta sesiĂłn"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Habilitar registro de sesiĂłn"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Registrar historial de sesiĂłn"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Eliminando registro..."</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Registro eliminado"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Registro no eliminado"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Historial de sesiĂłn registrado"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Error: historial NO registrado"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Registro de sesiĂłn habilitado"</string> <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-appname.xml b/java/res/values-et/strings-appname.xml new file mode 100644 index 000000000..181d597f9 --- /dev/null +++ b/java/res/values-et/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Androidi klaviatuur"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Androidi Ă”igekirjakontroll"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Androidi klaviatuuri seaded"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Ăigekirjakontrolli seaded"</string> +</resources> diff --git a/java/res/values-et/strings.xml b/java/res/values-et/strings.xml index e4f0f2f58..ae98198ce 100644 --- a/java/res/values-et/strings.xml +++ b/java/res/values-et/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Androidi klaviatuur"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Uuringulogi kĂ€sud"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Kontakti nimede kontroll."</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Ăigekirjakontroll kasutab teie kontaktisikute loendi sissekandeid"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibreeri klahvivajutusel"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"MĂ€rgi ajatempel logisse"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Salvestatud ajatemplid"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Ăra logi seda seanssi"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Lubage seansi logimine"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Logige kogu seansi ajalugu"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Seansi logi kustutamine"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Seansi logi kustutatud"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Seansi logi EI kustutatud"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Seansi ajalugu on logitud"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Viga: seansi ajalugu EI OLE logitud"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Seansi logimine on lubatud"</string> <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-appname.xml b/java/res/values-fa/strings-appname.xml new file mode 100644 index 000000000..366d56d92 --- /dev/null +++ b/java/res/values-fa/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Ű”ÙŰÙ Ú©ÙÛŰŻ Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"ŰșÙŰ·âÚŻÛ۱ ۧÙ
ÙŰ§Û Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ŰȘÙŰžÛÙ
ۧŰȘ Ű”ÙŰÙ Ú©ÙÛŰŻ Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ŰȘÙŰžÛÙ
ۧŰȘ ŰșÙŰ·ââ ÚŻÛ۱ ۧÙ
Ùۧ"</string> +</resources> diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml index 1e18a4843..bfdabab04 100644 --- a/java/res/values-fa/strings.xml +++ b/java/res/values-fa/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Ű”ÙŰÙ Ú©ÙÛŰŻ Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Ù۱Ù
ۧÙâÙŰ§Û ÚŻŰČۧ۱ێâÚŻÛŰ±Û ÙŸÚÙÙŰŽ"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ŰŹŰłŰȘŰŹÙÛ ÙۧÙ
Ù
۟ۧ۷ۚÛÙ"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ŰșÙŰ·âÚŻÛ۱ ۧÙ
Ùۧ ۧŰČ Ù۱ÙŰŻÛâÙŰ§Û ÙÛŰłŰȘ Ù
۟ۧ۷ۚÛÙ ŰŽÙ
ۧ ۧ۳ŰȘÙŰ§ŰŻÙ Ù
ÛÚ©ÙŰŻ"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Ù۱ŰČŰŽ ۚۧ Ùێۧ۱ Ú©ÙÛŰŻ"</string> @@ -115,9 +111,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ÛۧۯۯۧێŰȘ Ù
Ù۱ ŰČÙ
Ű§Ù ŰŻŰ± ÚŻŰČۧ۱ێ"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Ù
Ù۱ ŰČÙ
Ű§Ù Ű«ŰšŰȘ ŰŽŰŻÙ"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ۧŰČ Ű§ÛÙ ŰŹÙŰłÙ ÚŻŰČۧ۱ێâÚŻÛŰ±Û ÙŰŽÙŰŻ"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ۯ۱ ŰŰ§Ù ŰŰ°Ù ÚŻŰČۧ۱ێ ŰŹÙŰłÙ"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ÚŻŰČۧ۱ێ ŰŹÙŰłÙ ŰŰ°Ù ŰŽŰŻ"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ÚŻŰČۧ۱ێ ŰŹÙŰłÙ ŰŰ°Ù ÙŰŽŰŻ"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-fi/strings-appname.xml new file mode 100644 index 000000000..b2e23d552 --- /dev/null +++ b/java/res/values-fi/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android-nĂ€ppĂ€imistö"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android-oikoluku"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android-nĂ€ppĂ€imistön asetukset"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Oikolukuasetukset"</string> +</resources> diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml index 3ca48be5d..b19b0624e 100644 --- a/java/res/values-fi/strings.xml +++ b/java/res/values-fi/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android-nĂ€ppĂ€imistö"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Tutkimuslokin komennot"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Hae kontaktien nimiĂ€"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Oikeinkirjoituksen tarkistus kĂ€yttÀÀ kontaktiluettelosi tietoja."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"KĂ€ytĂ€ vĂ€rinÀÀ nĂ€ppĂ€imiĂ€ painettaessa"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Merkitse aikaleima lokiin"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Merkitty aikaleima"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ĂlĂ€ tallenna tĂ€tĂ€ kĂ€yttök."</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Ota kĂ€yttökertaloki kĂ€yttöön"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Kirjaa koko kĂ€yttökerran historia"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Poistetaan lokia"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"KĂ€yttökertaloki poistettu"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Lokia EI poistettu"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"KĂ€yttökerran historia kirjattu"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Virhe: kĂ€yttök. historiaa EI kirj."</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"KĂ€yttökertaloki kĂ€ytössĂ€"</string> <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-appname.xml b/java/res/values-fr/strings-appname.xml new file mode 100644 index 000000000..8e2a6e088 --- /dev/null +++ b/java/res/values-fr/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Clavier Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Correcteur orthographique Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ParamĂštres du clavier Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ParamĂštres du correcteur orthographique"</string> +</resources> diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index e457480c1..99c6e0337 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Clavier Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Commandes journaux rech."</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Rechercher noms contacts"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Correcteur orthographique utilise entrĂ©es de liste de contacts."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer Ă chaque touche"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Noter heure dans journal"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Heure enregistrĂ©e."</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Ne pas enregistrer session"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Activer l\'enregistrement de session"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Enregistrer historique de la session"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Suppr. journal sessionâŠ"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Journal session supprimĂ©."</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Journal session PAS suppr."</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Historique de la session enregistrĂ©."</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Historique session NON enregistrĂ©."</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Enregistrement de session activĂ©."</string> <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-appname.xml b/java/res/values-hi/strings-appname.xml new file mode 100644 index 000000000..02283af9a --- /dev/null +++ b/java/res/values-hi/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android à€à„à€Źà„à€°à„à€Ą"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android à€”à€°à„à€€à€šà„ à€Șà€°à„à€à„à€·à€"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android à€à„à€Źà„à€°à„à€Ą à€žà„à€à€żà€à€"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"à€”à€°à„à€€à€šà„ à€à€Ÿà€à€ à€žà„à€à€żà€à€"</string> +</resources> diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml index 9dfcf614e..81fb684bf 100644 --- a/java/res/values-hi/strings.xml +++ b/java/res/values-hi/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android à€à„à€Źà„à€°à„à€Ą"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"à€Čà„à€ à€à€Šà„à€¶à„à€ à€à€Ÿ à€¶à„à€§ à€à€°à„à€"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"à€žà€à€Șà€°à„à€ à€šà€Ÿà€źà„à€ à€à„ à€à„à€à„à€"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"à€”à€°à„à€€à€šà„ à€Șà€°à„à€à„à€·à€ à€à€Șà€à„ à€žà€à€Șà€°à„à€ à€žà„à€à„ à€à„ à€Șà„à€°à€”à€żà€·à„à€à€żà€Żà„à€ à€à€Ÿ à€à€Șà€Żà„à€ à€à€°à€€à€Ÿ à€čà„"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"à€à„à€à€à„ à€Šà€Źà€Ÿà€šà„ à€Șà€° à€à€à€Șà€š à€à€°à€€à€Ÿ à€čà„"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"à€Čà„à€ à€źà„à€ à€à€Ÿà€à€źà€žà„âà€à„à€źà„âà€Ș à€šà„à€ à€à€°à„à€"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"à€°à€żà€à„à€°à„à€Ą à€à€żà€Żà€Ÿ à€à€Żà€Ÿ à€à€Ÿà€à€źà€žà„à€à„à€źà„à€Ș"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"à€à€ž à€žà€€à„à€° à€à„ à€Čà„à€ à€š à€à€°à„à€"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"à€žà€€à„à€° à€Čà„à€ à€čà€à€Ÿà€Żà€Ÿ à€à€Ÿ à€°à€čà€Ÿ à€čà„"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"à€žà€€à„à€° à€Čà„à€ à€čà€à€Ÿà€Żà€Ÿ à€à€Żà€Ÿ"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"à€žà€€à„à€° à€Čà„à€ à€čà€à€Ÿà€Żà€Ÿ à€šà€čà„à€ à€à€Żà€Ÿ"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-hr/strings-appname.xml new file mode 100644 index 000000000..69fa2e9a1 --- /dev/null +++ b/java/res/values-hr/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Androidova tipkovnica"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Androidova provjera pravopisa"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Postavke Androidove tipkovnice"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Postavke provjere pravopisa"</string> +</resources> diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml index c8649e951..5a1eefc5e 100644 --- a/java/res/values-hr/strings.xml +++ b/java/res/values-hr/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android tipkovnica"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"IstraĆŸivanje naredbi dnevnika"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"PotraĆŸite imena kontakata"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Provjera pravopisa upotrebljava unose iz vaĆĄeg popisa kontakata"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibracija pri pritisku na tipku"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ZabiljeĆŸi razdoblje u dnevniku"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ZabiljeĆŸeno razdoblje"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Ne biljeĆŸi ovu sesiju"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"OmoguÄi biljeĆŸenje sesije"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"BiljeĆŸi cijelu povijest sesije"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Brisanje dnevnika sesije"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Izbrisan dnevnik sesije"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Dnevnik sesije NIJE izbrisan"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Povijest sesije zabiljeĆŸena je"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Pogr.: pov. sesije NIJE zabiljeĆŸena"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"OmoguÄeno je biljeĆŸenje sesije"</string> <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-appname.xml b/java/res/values-hu/strings-appname.xml new file mode 100644 index 000000000..ad511cfbc --- /dev/null +++ b/java/res/values-hu/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android-billentyƱzet"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Androidos helyesĂrĂĄs-ellenĆrzĆ"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android-billentyƱzet beĂĄllĂtĂĄsai"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"A helyesĂrĂĄs-ellenĆrzĂ©s beĂĄllĂtĂĄsai"</string> +</resources> diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml index d2a38cb24..a0110e49a 100644 --- a/java/res/values-hu/strings.xml +++ b/java/res/values-hu/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android-billentyƱzet"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"NaplĂłzĂĄsi parancsok"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"NĂ©vjegyek keresĂ©se"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"A helyesĂrĂĄs-ellenĆrzĆ hasznĂĄlja a nĂ©vjegyek bejegyzĂ©seit"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"RezgĂ©s billentyƱ megnyomĂĄsa esetĂ©n"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"IdĆbĂ©lyegzĆ naplĂłzĂĄskor"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"RögzĂtett idĆbĂ©lyegzĆk"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Ne naplĂłzza"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"NaplĂł törlĂ©se folyamatban"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"NaplĂł törölve"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"NaplĂł NINCS törölve"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-in/strings-appname.xml new file mode 100644 index 000000000..283d69247 --- /dev/null +++ b/java/res/values-in/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Keyboard Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Pemeriksa ejaan Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Setelan keyboard Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Setelan pemeriksa ejaan"</string> +</resources> diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml index 2d10e6274..b02656c6e 100644 --- a/java/res/values-in/strings.xml +++ b/java/res/values-in/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Keyboard Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Riset Perintah Log"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Cari nama kontak"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Pemeriksa ejaan menggunakan entri dari daftar kontak Anda"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar jika tombol ditekan"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Catat cap waktu di log"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Cap waktu yang direkam"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Jangan simpan log sesi ini"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Aktifkan log sesi"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Rekam log seluruh riwayat sesi"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Menghapus log sesi"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Log sesi dihapus"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Log sesi BELUM dihapus"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Log riwayat sesi direkam"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Ksalahn: Log rwyat sesi TAK direkam"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Perekaman log sesi diaktifkan"</string> <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-appname.xml b/java/res/values-it/strings-appname.xml new file mode 100644 index 000000000..b84896b9d --- /dev/null +++ b/java/res/values-it/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Tastiera Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Controllo ortografico Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Impostazioni tastiera Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Impostazioni di controllo ortografico"</string> +</resources> diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index c3a2b5135..b23c516e9 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Tastiera Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Ricerca comandi di log"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Cerca in nomi contatti"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"La funzione di controllo ortografico usa voci dell\'elenco contatti"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrazione tasti"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Indicazione temporale log"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Indicazione temporale registrata"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Non registrare la sessione"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Attiva registrazione sessioni"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Registra intera cronologia sessione"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Eliminazione log sessione"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Log di sessione eliminato"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Log sessione non eliminato"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Cronologia sessione registrata"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Errore: cron. sessione NON registr."</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Registrazione sessioni attivata"</string> <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-appname.xml b/java/res/values-iw/strings-appname.xml new file mode 100644 index 000000000..f3f4b674c --- /dev/null +++ b/java/res/values-iw/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"ŚŚ§ŚŚŚȘ Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"ŚŚŚŚ§ ŚŚŚŚŚȘ Ś©Ś Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ŚŚŚŚšŚŚȘ ŚŚ§ŚŚŚȘ Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ŚŚŚŚšŚŚȘ ŚŚŚŚ§ŚȘ ŚŚŚŚȘ"</string> +</resources> diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml index 3859993f9..29bd615b4 100644 --- a/java/res/values-iw/strings.xml +++ b/java/res/values-iw/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"ŚŚ§ŚŚŚȘ Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Ś€Ś§ŚŚŚŚȘ ŚŚŚŚ ŚŚŚ§Śš"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ŚŚ€Ś© Ś©ŚŚŚȘ Ś©Ś ŚŚ Ś©Ś Ś§Ś©Śš"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ŚŚŚŚ§ ŚŚŚŚŚȘ ŚŚ©ŚȘŚŚ© ŚŚąŚšŚŚŚ ŚŚšŚ©ŚŚŚȘ ŚŚ Ś©Ś ŚŚ§Ś©Śš Ś©ŚŚ"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ŚšŚŚ ŚŚŚŚŚŠŚ ŚąŚ ŚŚ§Ś©ŚŚ"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ŚŠŚŚŚ ŚŚŚȘŚŚȘ ŚŚŚ ŚŚŚŚŚ"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ŚŚŚȘŚŚȘ ŚŚŚ ŚŚȘŚŚąŚŚȘ"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ŚŚ ŚȘŚšŚ©ŚŚ ŚŚ€ŚąŚŚ ŚŚ ŚŚŚŚŚ"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"ŚŚ€ŚąŚ ŚšŚŚ©ŚŚ ŚŚ€ŚąŚŚ"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"ŚšŚ©ŚŚ ŚŚȘ ŚŚ ŚŚŚĄŚŚŚšŚŚŚȘ ŚŚŚ€ŚąŚŚ"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ŚŚŚŚ§ ŚŚŚŚ ŚŚ€ŚąŚŚ"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ŚŚŚŚ ŚŚ€ŚąŚŚ Ś ŚŚŚ§"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ŚŚŚŚ ŚŚ€ŚąŚŚ ŚŚ Ś ŚŚŚ§"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"ŚŚŚĄŚŚŚšŚŚŚȘ ŚŚ€ŚąŚŚ Ś ŚšŚ©ŚŚ"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Ś©ŚŚŚŚ: ŚŚŚĄŚŚŚšŚŚŚȘ ŚŚŚ€ŚąŚŚ ŚŚ Ś ŚšŚ©ŚŚ"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"ŚšŚŚ©ŚŚ ŚŚ€ŚąŚŚ ŚŚŚ€ŚąŚ"</string> <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-appname.xml b/java/res/values-ja/strings-appname.xml new file mode 100644 index 000000000..16c1c05c6 --- /dev/null +++ b/java/res/values-ja/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"AndroidăăŒăăŒă"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Androidăčăă«ăă§ăă«ăŒ"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"AndroidăăŒăăŒăăźèšćź"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ăčăă«ăă§ăăŻăźèšćź"</string> +</resources> diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index f9349f540..ca13bb9ce 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"AndroidăăŒăăŒă"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ăă°ăłăăłăăźæ€çŽą"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"éŁç”Ąć
ćăźæ€çŽą"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ăčăă«ăă§ăă«ăŒă§ăŻéŁç”Ąć
ăȘăčăăźăšăłăăȘăäœżçšăăŸă"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ăăŒæäœăă€ă"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ăżă€ă ăčăżăłăăèšéČ"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ăżă€ă ăčăżăłăèšéČæžăż"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ă»ăă·ă§ăłăèšéČăăȘă"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ă»ăă·ă§ăłăă°ćé€äž"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ă»ăă·ă§ăłăă°ć逿žăż"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ă»ăă·ă§ăłăă°æȘćé€"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-ko/strings-appname.xml new file mode 100644 index 000000000..3d7db6136 --- /dev/null +++ b/java/res/values-ko/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android í€ëłŽë"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android ë§ì¶€ëČ êČìŹêž°"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android í€ëłŽë ì€ì "</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ë§ì¶€ëČ êČìŹ ì€ì "</string> +</resources> diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index cd8cb6b51..3126b2e66 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android í€ëłŽë"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ëĄê·ž ëȘ
ë č íì"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ì°ëœìČ ìŽëŠ ìĄ°í"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ë§ì¶€ëČ êČìŹêž°ê° ìŁŒìëĄì íëȘ©ì ìŹì©í©ëë€."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"í€ë„Œ ë넌 ë ì§ë ë°ì"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ëĄê·žì íìì€íŹí넌 êž°ëĄ"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"íìì€íŹí넌 êž°ëĄíš"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ìŽ ìžì
ì ëĄê·žíì§ ë§ìžì."</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ìžì
ëĄê·ž ìì "</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ìžì
ëĄê·žê° ìì ëš"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ìžì
ëĄê·žê° ìì ëì§ ìì"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-lt/strings-appname.xml new file mode 100644 index 000000000..668d27531 --- /dev/null +++ b/java/res/values-lt/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"âAndroidâ klaviatĆ«ra"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"âAndroidâ raĆĄybos tikrinimo programa"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"âAndroidâ klaviatĆ«ros nustatymai"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"RaĆĄybos tikrinimo nustatymai"</string> +</resources> diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml index 2f6abc856..7d7b54c8f 100644 --- a/java/res/values-lt/strings.xml +++ b/java/res/values-lt/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"âAndroidâ klaviatĆ«ra"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"TyrinÄti ĆŸurnalo komandas"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"KontaktĆł vardĆł paieĆĄka"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"RaĆĄybos tikrinimo progr. naudoja ÄŻraĆĄus, esanÄius kontaktĆł sÄ
raĆĄe"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibruoti, kai paspaudĆŸiami klaviĆĄai"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"PaĆŸym. laiko ĆŸymÄ ĆŸurnale"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ÄźraĆĄyta laiko ĆŸymÄ"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"NeÄŻraĆĄyti ĆĄios sesijos"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Äźgalinti sesijos ÄŻraĆĄymÄ
ÄŻ ĆŸurnalÄ
"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"ÄźraĆĄyti sesijos istorijÄ
ÄŻ ĆŸurnalÄ
"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"IĆĄtrinam. sesijos ĆŸurnal."</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Sesijos ĆŸurnalas iĆĄtrint."</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Sesij. ĆŸurnal. NEIĆ TRINT."</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Sesijos istorija ÄŻraĆĄyta ÄŻ ĆŸurnalÄ
"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Klaida: sesijos istorija NEÄźRAĆ YTA"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sesijos ÄŻraĆĄymas ĆŸurnale ÄŻgalintas"</string> <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-appname.xml b/java/res/values-lv/strings-appname.xml new file mode 100644 index 000000000..e5657a237 --- /dev/null +++ b/java/res/values-lv/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android tastatĆ«ra"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android pareizrakstÄ«bas pÄrbaudÄ«tÄjs"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android tastatĆ«ras iestatÄ«jumi"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"PareizrakstÄ«bas pÄrbaudes iestatÄ«jumi"</string> +</resources> diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml index 66dd1473e..e5e61e39c 100644 --- a/java/res/values-lv/strings.xml +++ b/java/res/values-lv/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android tastatĆ«ra"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"IzpÄtes ĆŸurnÄla komandas"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"MeklÄt kontaktp. vÄrdus"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Pareizrakst. pÄrbaudÄ«tÄjs lieto ierakstus no kontaktp. saraksta."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"VibrÄt, nospieĆŸot taustiĆu"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"AtzÄ«mÄt laiksp. ĆŸurnÄlÄ"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Laikspied. ir reÄŁistrÄts."</string> <string name="do_not_log_this_session" msgid="413762473641146336">"NereÄŁistrÄt ĆĄo sesiju"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Sesijas reÄŁistrÄĆĄanas iespÄjoĆĄana"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Visas sesijas vÄstures reÄŁistrÄĆĄana"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Not. sesijas ĆŸurn. dzÄĆĄ."</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Sesijas ĆŸurnÄls ir dzÄsts"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Sesijas ĆŸurn. NAV dzÄsts"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Sesijas vÄsture ir reÄŁistrÄta."</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"KÄŒĆ«da: sesijas vÄsture NAV reÄŁistr."</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sesijas reÄŁistrÄĆĄana ir iespÄjota."</string> <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-appname.xml b/java/res/values-ms/strings-appname.xml new file mode 100644 index 000000000..6273c6595 --- /dev/null +++ b/java/res/values-ms/strings-appname.xml @@ -0,0 +1,28 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for english_ime_name (178705338187710493) --> + <skip /> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Penyemak ejaan Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Tetapan papan kekunci Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Tetapan penyemakan ejaan"</string> +</resources> diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml index 53c902039..cdd23a8de 100644 --- a/java/res/values-ms/strings.xml +++ b/java/res/values-ms/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Papan kekunci Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Arahan Log Penyelidikan"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Cari nama kenalan"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Penyemak ejaan menggunakan entri dari senarai kenalan anda"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar pada tekanan kekunci"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Tanda cap waktu dalam log"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Cap waktu direkodkan"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Jangan log sesi ini"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Memadam log sesi"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Log sesi dipadam"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Log sesi TIDAK dipadam"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-nb/strings-appname.xml new file mode 100644 index 000000000..56c1c3c71 --- /dev/null +++ b/java/res/values-nb/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android-tastatur"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android-stavekontroll"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Innstillinger for Android-tastatur"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Innstillinger for stavekontroll"</string> +</resources> diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index bdde36ae8..5f7519a8d 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Skjermtastatur"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Kommandoer for undersĂžkelseslogging"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"SlĂ„ opp kontaktnavn"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Stavekontrollen bruker oppfĂžringer fra kontaktlisten din"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer ved tastetrykk"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"NotĂ©r tidsstempel i logg"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Registrerte tidsstempel"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Ikke loggfĂžr denne Ăžkten"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Aktiver lagring av Ăžkter"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Lagre hele Ăžktloggen"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Sletter Ăžktloggen"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Ăktloggen ble slettet"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Ăktloggen ble IKKE slettet"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Ăktloggen er lagret"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Feil: Ăktloggen er IKKE lagret"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Ăktlagring er aktivert"</string> <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-appname.xml b/java/res/values-nl/strings-appname.xml new file mode 100644 index 000000000..ee288efbb --- /dev/null +++ b/java/res/values-nl/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android-toetsenbord"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Spellingcontrole van Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Instellingen voor Android-toetsenbord"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Instellingen voor spellingcontrole"</string> +</resources> diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index 9624e176e..19c9eda1c 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android-toetsenbord"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Opdrachten in onderzoekslogbestand"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Contactnamen opzoeken"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"De spellingcontrole gebruikt items uit uw contactenlijst"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Trillen bij toetsaanslag"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Tijdstempel opnemen in logbestand"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Opgenomen tijdstempel"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Sessie niet registreren"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Sessieregistratie inschakelen"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Hele sessiegeschiedenis registreren"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Sessielogbestand verwijderen"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Sessielogbestand verwijderd"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Sessielogbestand NIET verwijderd"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Sessiegeschiedenis geregistreerd"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Fout: sessiegesch. NIET geregistr."</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sessieregistratie ingeschakeld"</string> <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 c8a72b77a..6ffe8dce3 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Klawiatura Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Polecenia dziennika badaĆ"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Przeszukaj kontakty"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Sprawdzanie pisowni bierze pod uwagÄ wpisy z listy kontaktĂłw."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Wibracja przy naciĆniÄciu"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Znacznik czasu uwagi w dzienniku"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Zapisano znacznik czasu"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Nie rejestruj tej sesji"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Usuwanie dziennika sesji"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"UsuniÄto dziennik sesji"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Dziennik sesji NIEUSUNIÄTY"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-pt-rPT/strings-appname.xml new file mode 100644 index 000000000..1b88acb69 --- /dev/null +++ b/java/res/values-pt-rPT/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Teclado do Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Verificador ortogrĂĄfico do Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"DefiniçÔes de teclado do Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"DefiniçÔes da verificação ortogrĂĄfica"</string> +</resources> diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index cef2ce75b..f16070bb4 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Teclado do Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Comandos de Reg. Invest."</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Procurar nomes de contac."</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"O corretor ortogrĂĄfico utiliza entradas da sua lista de contactos"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao primir as teclas"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Anotar car. data no reg."</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Carimbo de data gravado"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"NĂŁo registar esta sessĂŁo"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Ativar registos de sessĂŁo"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Registar hist. de sessĂ”es completo"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"A eliminar reg. da sessĂŁo"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Reg. de sessĂŁo eliminado"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Reg. de sessĂŁo NĂO elim."</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"HistĂłrico de sessĂ”es registado"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Erro: hist. de sessĂ”es NĂO regist."</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Registo de sessĂ”es ativado"</string> <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-appname.xml b/java/res/values-pt/strings-appname.xml new file mode 100644 index 000000000..3987a6dea --- /dev/null +++ b/java/res/values-pt/strings-appname.xml @@ -0,0 +1,28 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for english_ime_name (178705338187710493) --> + <skip /> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Corretor ortogrĂĄfico do Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ConfiguraçÔes de teclado do Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ConfiguraçÔes de verificação ortogrĂĄfica"</string> +</resources> diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index d092879cf..93666ac3b 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Teclado Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Pesq. comandos de reg."</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Buscar nomes de contatos"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"O corretor ortogrĂĄfico usa entradas de sua lista de contatos"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao tocar a tecla"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Indicar data/hora no reg."</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Data/hora registrada"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"NĂŁo registrar esta sessĂŁo"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Excluindo reg. de sessĂŁo"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Registro excluĂdo"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Registro NĂO excluĂdo"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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 b39691ceb..670ce57f1 100644 --- a/java/res/values-rm/strings.xml +++ b/java/res/values-rm/strings.xml @@ -20,20 +20,14 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Tastatura Android"</string> <!-- no translation found for aosp_android_keyboard_ime_name (7877134937939182296) --> <skip /> - <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) --> <skip /> - <!-- no translation found for android_spell_checker_settings (5822324635435443689) --> - <skip /> <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> <skip /> <!-- no translation found for use_contacts_for_spellchecking_option_summary (8754413382543307713) --> @@ -190,12 +184,22 @@ <skip /> <!-- no translation found for do_not_log_this_session (413762473641146336) --> <skip /> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <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 notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-ro/strings-appname.xml new file mode 100644 index 000000000..dfa642204 --- /dev/null +++ b/java/res/values-ro/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"TastaturÄ Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Verificator ortografic Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"SetÄrile tastaturii Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"SetÄrile de verificare ortograficÄ"</string> +</resources> diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml index 08275665c..620a5c4a0 100644 --- a/java/res/values-ro/strings.xml +++ b/java/res/values-ro/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"TastaturÄ Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Comenzi jurnal cercetare"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Verificare nume Ăźn agendÄ"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Verificatorul ortografic utilizeazÄ intrÄri din lista de contacte"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrare la apÄsarea tastei"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Ănreg. marc. temp. jurnal"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Marcaj temporal Ăźnregis."</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Nu ĂźnregistraĆŁi sesiunea"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Se Èterge jurnal sesiune"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Jurnal de sesiune Èters"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Jurnal sesiune neĆters"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-ru/strings-appname.xml new file mode 100644 index 000000000..5db1d0bc9 --- /dev/null +++ b/java/res/values-ru/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"ĐлаĐČОаŃŃŃа Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"ĐŃĐŸĐČĐ”ŃĐșа ĐżŃаĐČĐŸĐżĐžŃĐ°ĐœĐžŃ Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ĐаŃŃŃĐŸĐčĐșĐž ĐșлаĐČОаŃŃŃŃ Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ĐаŃŃŃĐŸĐčĐșĐž ĐżŃĐŸĐČĐ”ŃĐșĐž ĐżŃаĐČĐŸĐżĐžŃĐ°ĐœĐžŃ"</string> +</resources> diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 77ffe7b55..c50d1dee1 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"ĐлаĐČОаŃŃŃа Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ĐŃĐ” ĐșĐŸĐŒĐ°ĐœĐŽŃ"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ĐĐŸĐžŃĐș ĐșĐŸĐœŃаĐșŃĐŸĐČ"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ĐбŃаŃаŃŃŃŃ Đș ŃпОŃĐșŃ ĐșĐŸĐœŃаĐșŃĐŸĐČ ĐżŃĐž ĐżŃĐŸĐČĐ”ŃĐșĐ” ĐżŃаĐČĐŸĐżĐžŃĐ°ĐœĐžŃ"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ĐОбŃĐŸĐŸŃĐșлОĐș ĐșлаĐČĐžŃ"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ĐаĐșлаЎĐșа ĐČ Đ¶ŃŃĐœĐ°Đ»Đ”"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ĐаĐșлаЎĐșа ŃĐŸŃ
ŃĐ°ĐœĐ”ĐœĐ°"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ĐĐ” ŃĐŸŃ
ŃĐ°ĐœŃŃŃ ŃŃĐŸŃ ŃĐ”Đ°ĐœŃ"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ĐŁĐŽĐ°Đ»Đ”ĐœĐžĐ”âŠ"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ĐапОŃŃ ŃĐ”Đ°ĐœŃа ŃĐŽĐ°Đ»Đ”ĐœĐ°"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ĐапОŃŃ ŃĐ”Đ°ĐœŃа ĐĐ ŃĐŽĐ°Đ»Đ”ĐœĐ°"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-sk/strings-appname.xml new file mode 100644 index 000000000..5b5590000 --- /dev/null +++ b/java/res/values-sk/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"KlĂĄvesnica Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Kontrola pravopisu Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Nastavenia klĂĄvesnice Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Nastavenia kontroly pravopisu"</string> +</resources> diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml index 2b31bd858..d89d1d3b6 100644 --- a/java/res/values-sk/strings.xml +++ b/java/res/values-sk/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"KlĂĄvesnica Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"PrĂkazy dennĂka vĂœskumu"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"VyhÄŸadaĆ„ kontakty"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Kontrola pravopisu pouĆŸĂva zĂĄznamy z vĂĄĆĄho zoznamu kontaktov"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Pri stlaÄenĂ klĂĄvesu vibrovaĆ„"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ÄasovĂĄ peÄiatka dennĂka"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ÄasovĂĄ peÄiatka zaznamenanĂĄ"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Neukl. relĂĄciu do dennĂka"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"OdstraĆ. dennĂka relĂĄcie"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"DennĂk relĂĄcie odstrĂĄnenĂœ"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"DennĂk relĂĄcie NIE JE odstr."</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-sl/strings-appname.xml new file mode 100644 index 000000000..fd303d8dd --- /dev/null +++ b/java/res/values-sl/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Tipkovnica Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Ärkovalnik za Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Nastavitve tipkovnice Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Nastavitve preverjanja Ärkovanja"</string> +</resources> diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml index 05e20b04c..ad3e7395f 100644 --- a/java/res/values-sl/strings.xml +++ b/java/res/values-sl/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Tipkovnica Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Ukazi za dnevnik raziskav"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Iskanje imen stikov"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Ärkovalnik uporablja vnose s seznama stikov"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibriranje ob pritisku tipke"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"V dnev. zabeleĆŸi Äas. ĆŸig"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Äasovni ĆŸig zabeleĆŸen"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Brez dnevnika za to sejo"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"OmogoÄi zapisovanje seje v dnevnik"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"ZapiĆĄi celotno zgodovino seje v dnevnik"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Brisanje seje dnevnika"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Dnevnik seje izbrisan"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Dnevnik seje NI izbrisan"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Zgodovina seje zapisana v dnevnik"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Napaka: zgodovina seje NI zapisana v dnevnik"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Zapisovanje seje v dnevnik omogoÄeno"</string> <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-appname.xml b/java/res/values-sr/strings-appname.xml new file mode 100644 index 000000000..449fe551a --- /dev/null +++ b/java/res/values-sr/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android ŃаŃŃаŃŃŃа"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android ĐżŃĐŸĐČĐ”Ńа ĐżŃаĐČĐŸĐżĐžŃа"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ĐĐŸĐŽĐ”ŃаĐČаŃа Android ŃаŃŃаŃŃŃĐ”"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ĐĐŸĐŽĐ”ŃаĐČаŃа ĐżŃĐŸĐČĐ”ŃĐ” ĐżŃаĐČĐŸĐżĐžŃа"</string> +</resources> diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml index 43fe7003d..d1c440d07 100644 --- a/java/res/values-sr/strings.xml +++ b/java/res/values-sr/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android ŃаŃŃаŃŃŃа"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ĐĐŸĐŒĐ°ĐœĐŽĐ” Đ”ĐČĐžĐŽĐ”ĐœŃĐžŃĐ” ĐžŃŃŃажОĐČаŃа"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ĐĐŸŃŃажО ĐžĐŒĐ”ĐœĐ° ĐșĐŸĐœŃаĐșаŃа"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ĐĐŸĐœŃŃĐŸĐ»ĐŸŃ ĐżŃаĐČĐŸĐżĐžŃа ĐșĐŸŃĐžŃŃĐž ŃĐœĐŸŃĐ” Ńа лОŃŃĐ” ĐșĐŸĐœŃаĐșаŃа"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ĐОбŃĐžŃĐ°Ń ĐœĐ° ĐżŃĐžŃĐžŃаĐș ŃаŃŃĐ”Ńа"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ĐаĐČДЎО ĐČŃĐ”ĐŒĐ”ĐœŃĐșŃ ĐŸĐ·ĐœĐ°ĐșŃ Ń Đ”ĐČĐžĐŽĐ”ĐœŃĐžŃĐž"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ĐĄĐœĐžĐŒŃĐ”ĐœĐ° ĐČŃĐ”ĐŒĐ”ĐœŃĐșа ĐŸĐ·ĐœĐ°Đșа"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ĐĐ” Đ”ĐČĐžĐŽĐ”ĐœŃĐžŃĐ°Ń ĐŸĐČŃ ŃĐ”ŃĐžŃŃ"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"ĐĐŒĐŸĐłŃŃĐž Đ”ĐČĐžĐŽĐ”ĐœŃĐžŃаŃĐ” ŃĐ”ŃĐžŃа"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"ĐĐČĐžĐŽĐ”ĐœŃĐžŃĐ°Ń ŃĐ”Đ»Ń ĐžŃŃĐŸŃĐžŃŃ ŃĐ”ŃĐžŃа"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ĐŃĐžŃаŃĐ” Đ”ĐČĐžĐŽĐ”ĐœŃĐžŃĐ” ŃĐ”ŃĐžŃĐ”"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ĐĐČĐžĐŽĐ”ĐœŃĐžŃа ŃĐ”ŃĐžŃĐ” ŃĐ” ĐŸĐ±ŃĐžŃĐ°ĐœĐ°"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ĐĐČĐžĐŽĐ”ĐœŃĐžŃа ŃĐ”ŃĐžŃĐ” ĐĐĐРОзбŃĐžŃĐ°ĐœĐ°"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"ĐŃŃĐŸŃĐžŃа ŃĐ”ŃĐžŃа ŃĐ” Đ”ĐČĐžĐŽĐ”ĐœŃĐžŃĐ°ĐœĐ°"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"ĐŃĐ”ŃĐșа: ĐŃŃĐŸŃĐžŃа ŃĐ”ŃĐžŃа ĐĐĐĐ Đ”ĐČĐžĐŽĐ”ĐœŃĐžŃĐ°ĐœĐ°"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"ĐĐČĐžĐŽĐ”ĐœŃĐžŃаŃĐ” ŃĐ”ŃĐžŃа ŃĐ” ĐŸĐŒĐŸĐłŃŃĐ”ĐœĐŸ"</string> <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-appname.xml b/java/res/values-sv/strings-appname.xml new file mode 100644 index 000000000..9b4a7dbd1 --- /dev/null +++ b/java/res/values-sv/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Androids tangentbord"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Stavningskontroll i Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"InstĂ€llningar för Androids tangentbord"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"InstĂ€llningar för stavningskontroll"</string> +</resources> diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index f24446976..0da487723 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Androids tangentbord"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Loggkommandon"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Sök namn pĂ„ kontakter"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"I stavningskontrollen anvĂ€nds poster frĂ„n kontaktlistan"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrera vid tangenttryck"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Markera tidpunkt i loggen"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Tidpunkten har sparats"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Logga inte detta besök"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Aktivera sessionsloggning"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Logga hela sessionshistoriken"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Besöksloggen tas bort"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Besöksloggen togs bort"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Besöksloggen togs EJ bort"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Sessionshistoriken har loggats"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Fel: historiken har INTE loggats"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sessionsloggning Ă€r aktiverat"</string> <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-appname.xml b/java/res/values-sw/strings-appname.xml new file mode 100644 index 000000000..51de0a6b8 --- /dev/null +++ b/java/res/values-sw/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Kibodi ya Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Kikagua tahajia cha Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Mipangilio ya kibodi ya Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Mipangilio ya kukagua tahajia"</string> +</resources> diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml index 9cec8679d..545c41157 100644 --- a/java/res/values-sw/strings.xml +++ b/java/res/values-sw/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Kibodi ya Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Amri za Kumbukumbu za Utafiti"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Angalia majina ya wasiliani"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Kikagua tahajia hutumia ingizo kutoka kwa orodha yako ya anwani"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Tetema unabofya kitufe"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Dokeza mhuri wa muda kwenye kumbukumbu"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Mhuri wa muda uliorekodiwa"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Usihifadhi kumbukumbu za kipindi hiki"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Wezesha kuingia kwenye kipindi"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Ingia kwenye historia ya kipindi kizima"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Inafuta kumbukumbu za kipindi"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Kumbukumbu za kipindi zimefutwa"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Kumbukumbu za kipindi HAZIJAFUTWA"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Historia ya kipindi imeingia"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Hitilafu: Historia ya kipindi HAIJAINGIA"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Kuingia kwa kipindi kumewezeshwa"</string> <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-appname.xml b/java/res/values-th/strings-appname.xml new file mode 100644 index 000000000..87205d0eb --- /dev/null +++ b/java/res/values-th/strings-appname.xml @@ -0,0 +1,30 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"àčàžàčàžàžàžŽàžĄàžàčàčàžàžàžàžŁàžàžąàžàč"</string> + <!-- no translation found for spell_checker_service_name (6268342166872202903) --> + <skip /> + <!-- no translation found for english_ime_settings (7470027018752707691) --> + <skip /> + <!-- no translation found for android_spell_checker_settings (8397842018475560441) --> + <skip /> +</resources> diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml index 174ee4507..c47fc0597 100644 --- a/java/res/values-th/strings.xml +++ b/java/res/values-th/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"àčàžàčàžàžàžŽàžĄàžàč Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"àžàžłàžȘàž±àčàžàžàž±àžàžàž¶àžàžàžČàžŁàž§àžŽàžàž±àžą"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"àžàčàžàž«àžČàžŁàžČàžąàžàž·àčàžàžàžŽàžàžàčàž"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"àčàžàžŁàž·àčàžàžàžĄàž·àžàžàžŁàž§àžàžàžČàžŁàžȘàž°àžàžàčàžàčàžŁàžČàžąàžàžČàžŁàžàžČàžàžŁàžČàžąàžàž·àčàžàžàžŽàžàžàčàžàžàžàžàžàžžàž"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"àžȘàž±àčàžàčàžĄàž·àčàžàžàžàžàžžàčàžĄ"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"àžàžàčàž§àž„àžČàžàž±àžàžàž¶àžàčàž§àčàčàžàžàž±àžàžàž¶àž"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"àžàž±àžàžàž¶àžàčàž§àž„àžČàžàž±àžàžàž¶àžàčàž„àčàž§"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"àžàžąàčàžČàžàž±àžàžàž¶àžàčàžàžȘàžàž±àžàžàž”àč"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"àžàžłàž„àž±àžàž„àžàžàž±àžàžàž¶àžàčàžàžȘàžàž±àž"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"àž„àžàžàž±àžàžàž¶àžàčàžàžȘàžàž±àžàčàž„àčàž§"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"àžàž±àžàžàž¶àžàčàžàžȘàžàž±àžàčàžĄàčàžàžčàžàž„àž"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-tl/strings-appname.xml new file mode 100644 index 000000000..fd2b3f55b --- /dev/null +++ b/java/res/values-tl/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Keyboard ng Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Spell checker ng Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Mga setting ng keyboard ng Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Mga setting ng pag-spell check"</string> +</resources> diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml index 25801ca7d..766972f46 100644 --- a/java/res/values-tl/strings.xml +++ b/java/res/values-tl/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android keyboard"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Cmmnd sa Log ng Pnnliksik"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Maghanap pangalan contact"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Gumagamit pang-check pagbabaybay entry sa iyong listahan contact"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Mag-vibrate sa keypress"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Tandaan timestamp sa log"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Na-record na timestamp"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Huwag i-log ang session"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Tinatanggl log ng session"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Tinanggal log ng session"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"HND ntnggl log ng session"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-tr/strings-appname.xml new file mode 100644 index 000000000..f5e36d2e8 --- /dev/null +++ b/java/res/values-tr/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android klavyesi"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android yazım denetleyici"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android klavye ayarları"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Yazım denetimi ayarları"</string> +</resources> diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 190736e82..0f5857ab3 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android klavyesi"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"AraĆtırma GĂŒnlĂŒÄĂŒ Komutları"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"KiĆi adlarını denetle"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Yazım denetleyici, kiĆi listenizdeki giriĆleri kullanır"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"TuĆa basıldıÄında titret"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"GĂŒnlĂŒÄe zaman damgası koy"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Zaman damgası kaydedildi"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Bu oturumu gĂŒnlĂŒÄe kaydetme"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Oturum gĂŒnlĂŒÄĂŒ siliniyor"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Oturum gĂŒnlĂŒÄĂŒ silindi"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Oturum gĂŒnlĂŒÄĂŒ SİLİNMEDİ"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-uk/strings-appname.xml new file mode 100644 index 000000000..fdbb89fd9 --- /dev/null +++ b/java/res/values-uk/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"ĐлаĐČŃаŃŃŃа Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"ĐаŃŃб пДŃĐ”ĐČŃŃĐșĐž ĐŸŃŃĐŸĐłŃаŃŃŃ Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"ĐалаŃŃŃĐČĐ°ĐœĐœŃ ĐșлаĐČŃаŃŃŃĐž Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"ĐалаŃŃŃĐČĐ°ĐœĐœŃ ĐżĐ”ŃĐ”ĐČŃŃĐșĐž ĐŸŃŃĐŸĐłŃаŃŃŃ"</string> +</resources> diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml index 04a8a638e..d2f9091f6 100644 --- a/java/res/values-uk/strings.xml +++ b/java/res/values-uk/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"ĐлаĐČŃаŃŃŃа Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ĐĐŸĐŒĐ°ĐœĐŽĐž жŃŃĐœĐ°Đ»Ń ĐŽĐŸŃĐ»ŃЎж."</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ĐšŃĐșаŃĐž ŃĐŒĐ”ĐœĐ° ĐșĐŸĐœŃаĐșŃŃĐČ"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ĐŃĐŸĐłŃĐ°ĐŒĐ° пДŃĐ”ĐČŃŃĐșĐž ĐżŃаĐČĐŸĐżĐžŃŃ ĐČĐžĐșĐŸŃĐžŃŃ. запОŃĐž Đ·Ń ŃпОŃĐșŃ ĐșĐŸĐœŃаĐșŃŃĐČ"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ĐŃбŃ. ĐżŃĐž ĐœĐ°ŃĐžŃĐșĐ°ĐœĐœŃ ĐșлаĐČŃŃ"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ĐŃŃĐșа ŃаŃŃ ĐČ Đ¶ŃŃĐœĐ°Đ»Ń"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ĐапОŃĐ°ĐœĐ° ĐŒŃŃĐșа ŃаŃŃ"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"ĐĐ” ŃĐ”ŃŃŃŃŃĐČаŃĐž ŃŃ ŃĐ”ŃŃŃ"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"ĐŁĐČŃĐŒĐșĐœŃŃĐž Đ·Đ°ĐżĐžŃ Đ¶ŃŃĐœĐ°Đ»Ń ŃĐ”Đ°ĐœŃŃ"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"ĐапОŃŃĐČаŃĐž ŃŃŃĐŸŃŃŃ ĐČŃŃĐŸĐłĐŸ ŃĐ”Đ°ĐœŃŃ"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"ĐĐžĐŽĐ°Đ»Đ”ĐœĐœŃ Đ¶ŃŃĐœĐ°Đ»Ń ŃĐ”ŃŃŃ"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ĐŃŃĐœĐ°Đ» ŃĐ”ŃŃŃ ĐČĐžĐŽĐ°Đ»Đ”ĐœĐŸ"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ĐŃŃĐœĐ°Đ» ŃĐ”ŃŃŃ ĐĐ ĐČĐžĐŽĐ°Đ»Đ”ĐœĐŸ"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"ĐŃŃĐŸŃŃŃ ŃĐ”Đ°ĐœŃŃ Đ·Đ°ĐżĐžŃĐ°ĐœĐŸ"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"ĐĐŸĐŒĐžĐ»Đșа. ĐŃŃĐŸŃŃŃ ŃĐ”Đ°ĐœŃŃ ĐРзапОŃĐ°ĐœĐŸ"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"ĐĐ°ĐżĐžŃ Đ¶ŃŃĐœĐ°Đ»Ń ŃĐ”Đ°ĐœŃŃ ĐČĐČŃĐŒĐșĐœĐ”ĐœĐŸ"</string> <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-appname.xml b/java/res/values-vi/strings-appname.xml new file mode 100644 index 000000000..6e32d0370 --- /dev/null +++ b/java/res/values-vi/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"BĂ n phĂm Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"TrĂŹnh kiá»m tra chĂnh táșŁ Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"CĂ i Äáș·t bĂ n phĂm Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"CĂ i Äáș·t kiá»m tra chĂnh táșŁ"</string> +</resources> diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml index c9dc0e644..789d4da48 100644 --- a/java/res/values-vi/strings.xml +++ b/java/res/values-vi/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"BĂ n phĂm Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Lá»nh ghi nháșt kĂœ cho nghiĂȘn cứu"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Tra cứu tĂȘn liĂȘn há»"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"TrĂŹnh kiá»m tra chĂnh táșŁ sá» dỄng cĂĄc mỄc nháșp từ danh sĂĄch liĂȘn há» cá»§a báșĄn"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Rung khi nháș„n phĂm"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Dáș„u thá»i gian ghi chĂș trong nháșt kĂœ"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Dáș„u thá»i gian ÄĂŁ ghi"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"KhĂŽng ghi nháșt kĂœ phiĂȘn nĂ y"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Äang xĂła nháșt kĂœ phiĂȘn"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ÄĂŁ xĂła nháșt kĂœ phiĂȘn"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Nháșt kĂœ phiĂȘn KHĂNG bá» xĂła"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-zh-rCN/strings-appname.xml new file mode 100644 index 000000000..2c1064ad6 --- /dev/null +++ b/java/res/values-zh-rCN/strings-appname.xml @@ -0,0 +1,28 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for english_ime_name (178705338187710493) --> + <skip /> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android æŒćæŁæ„ć·„ć
·"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android éźçèźŸçœź"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"æŒćæŁæ„èźŸçœź"</string> +</resources> diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 9f5e4633d..ef1c8102e 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android éźç"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ç ç©¶èź°ćœćœä»€"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"æ„æŸèçł»äșșć§ć"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"æŒćæŁæ„ć·„ć
·äŒäœżçšæšçèçł»äșșćèĄšäžçæĄçź"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"æéźæŻćš"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"æ èź°èź°ćœäžçæ¶éŽ"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ć·Čæ èź°æ¶éŽ"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"äžèź°ćœæŹæŹĄäŒèŻ"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"æŁćšć é€äŒèŻèź°ćœ"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"äŒèŻèź°ćœć·Čć é€"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"æȘèœć é€äŒèŻèź°ćœ"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-zh-rTW/strings-appname.xml new file mode 100644 index 000000000..8cc663826 --- /dev/null +++ b/java/res/values-zh-rTW/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Android é”ç€"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Android æŒćæȘąæ„"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Android é”ç€èšćź"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"æŒćæȘąæ„èšćź"</string> +</resources> diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 0cc8a9d82..20c40eb93 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Android é”ç€"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"ç ç©¶çŽéæä»€"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"æ„è©ąèŻç”Ąäșșć§ć"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"æŒćæȘąæ„çšćŒäœżçšæšçèŻç”Ąäșșæž
ćźé
çź"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"æé”æéć"</string> @@ -111,9 +107,19 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"ćšçŽéäžć èš»æéæłèš"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"ć·Čèšéæéæłèš"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"äžèŠèšééćć·„äœéæź”"</string> + <!-- no translation found for enable_session_logging (4202559020594036225) --> + <skip /> + <!-- no translation found for log_whole_session_history (7087712461632081351) --> + <skip /> <string name="notify_session_log_deleting" msgid="3299507647764414623">"æŁćšćȘé€ć·„äœéæź”çŽé"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"ć·ČćȘé€ć·„äœéæź”çŽé"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"ăæȘăćȘé€ć·„äœéæź”çŽé"</string> + <!-- no translation found for notify_session_history_logged (7723983399468056391) --> + <skip /> + <!-- no translation found for notify_session_history_not_logged (6597910011368015361) --> + <skip /> + <!-- no translation found for notify_session_logging_enabled (8549561596936177661) --> + <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-appname.xml b/java/res/values-zu/strings-appname.xml new file mode 100644 index 000000000..a0fb51716 --- /dev/null +++ b/java/res/values-zu/strings-appname.xml @@ -0,0 +1,27 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="178705338187710493">"Ikhibhodi ye-Android"</string> + <string name="spell_checker_service_name" msgid="6268342166872202903">"Isihloli sokupela se-Android"</string> + <string name="english_ime_settings" msgid="7470027018752707691">"Izilungiselelo zekhibhodi ye-Android"</string> + <string name="android_spell_checker_settings" msgid="8397842018475560441">"Izilungiselelo zokuhlola ukupela"</string> +</resources> diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml index 35cb99cf8..da222092e 100644 --- a/java/res/values-zu/strings.xml +++ b/java/res/values-zu/strings.xml @@ -20,14 +20,10 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="7252517407088836577">"Ikhibhodi ye-Android"</string> <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> <string name="english_ime_research_log" msgid="8492602295696577851">"Imiyalo yefayela lokungena lokucwaninga"</string> - <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> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Bheka amagama woxhumana nabo"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Isihloli sokupela sisebenzisa okungenayo kusuka kuhlu lalabo oxhumana nabo"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Dlidlizelisa ngokucindezela inkinobho"</string> @@ -111,9 +107,14 @@ <string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Qaphela isitembu sesikhathi efayeleni lokungena"</string> <string name="notify_recorded_timestamp" msgid="8036429032449612051">"Isitembu sesikhathi esirekhodiwe"</string> <string name="do_not_log_this_session" msgid="413762473641146336">"Ungenzi ifayela lokungena lalesi sikhathi"</string> + <string name="enable_session_logging" msgid="4202559020594036225">"Nika amandla ukungena ngemvume kwesikhathi"</string> + <string name="log_whole_session_history" msgid="7087712461632081351">"Umlando wesikhathi sonke sefayela lokungena"</string> <string name="notify_session_log_deleting" msgid="3299507647764414623">"Isusa ifayela lokungena lesikhathi"</string> <string name="notify_session_log_deleted" msgid="8687927130100934686">"Ifayela lokungena lesikhathi lisusiwe"</string> <string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Ifayela lokungena lesikhathi alisusiwe"</string> + <string name="notify_session_history_logged" msgid="7723983399468056391">"Umlando wesikhathi ukhiyiwe"</string> + <string name="notify_session_history_not_logged" msgid="6597910011368015361">"Iphutha: Umlando wesikhathi awukhiyiwe"</string> + <string name="notify_session_logging_enabled" msgid="8549561596936177661">"Ukungena kwesikhathi kunikwe amandla"</string> <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/strings-appname.xml b/java/res/values/strings-appname.xml new file mode 100644 index 000000000..19aaa2513 --- /dev/null +++ b/java/res/values/strings-appname.xml @@ -0,0 +1,33 @@ +<?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. +*/ +--> + +<resources> + <!-- Title for Latin Keyboard --> + <string name="english_ime_name">Android keyboard</string> + + <!-- Name of Android spell checker service --> + <string name="spell_checker_service_name">Android spell checker</string> + + <!-- Title for Latin keyboard settings activity / dialog --> + <string name="english_ime_settings">Android keyboard settings</string> + + <!-- Title for the spell checking service settings screen --> + <string name="android_spell_checker_settings">Spell checking settings</string> +</resources> diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 6c66a4844..7272cfe97 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -18,25 +18,16 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Title for Latin keyboard --> - <string name="english_ime_name">Android keyboard</string> <!-- Application name for opensource Android keyboard. AOSP(Android Open Source Project) should not be translated. --> <string name="aosp_android_keyboard_ime_name">Android keyboard (AOSP)</string> - <!-- Title for Latin keyboard settings activity / dialog --> - <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=33] --> <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> <!-- Name of Android spell checker service. AOSP(Android Open Source Project) should not be translated. --> <string name="aosp_spell_checker_service_name">Android spell checker (AOSP)</string> - <!-- Title for the spell checking service settings screen --> - <string name="android_spell_checker_settings">Spell checking settings</string> - <!-- Title for the spell checker option to turn on/off contact names lookup [CHAR LIMIT=25] --> <string name="use_contacts_for_spellchecking_option_title">Look up contact names</string> @@ -233,12 +224,22 @@ <!-- Title for dialog option to let users cancel logging and delete log for this session [CHAR LIMIT=35] --> <string name="do_not_log_this_session">Do not log this session</string> + <!-- Title for dialog option to let users reenable logging [CHAR LIMIT=35] --> + <string name="enable_session_logging">Enable session logging</string> + <!-- Title for dialog option to let users log all events in this session [CHAR LIMIT=35] --> + <string name="log_whole_session_history">Log whole session history</string> <!-- Toast notification that the system is processing the request to delete the log for this session [CHAR LIMIT=35] --> <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=35] --> <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=35] --> <string name="notify_session_log_not_deleted">Session log NOT deleted</string> + <!-- Toast notification that the system has recorded the whole session history [CHAR LIMIT=35] --> + <string name="notify_session_history_logged">Session history logged</string> + <!-- Toast notification that the system has failed to record the whole session history [CHAR LIMIT=35] --> + <string name="notify_session_history_not_logged">Error: Session history NOT logged</string> + <!-- Toast notification that the system is enabling logging [CHAR LIMIT=35] --> + <string name="notify_session_logging_enabled">Session logging enabled</string> <!-- Preference for input language selection --> <string name="select_language">Input languages</string> diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index 32ef408b4..1ae0020a4 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -610,6 +610,15 @@ public class PointerTracker { onUpEventInternal(); onDownEventInternal(x, y, eventTime); } else { + // HACK: If there are currently multiple touches, register the key even if + // the finger slides off the key. This defends against noise from some + // touch panels when there are close multiple touches. + // Caveat: When in chording input mode with a modifier key, we don't use + // this hack. + if (me != null && me.getPointerCount() > 1 + && !sPointerTrackerQueue.hasModifierKeyOlderThan(this)) { + onUpEventInternal(); + } mKeyAlreadyProcessed = true; setReleasedKeyGraphics(oldKey); } diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java index 5db65c660..d3bb85d4b 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java +++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java @@ -28,6 +28,7 @@ public class PointerTrackerQueue { private static final String TAG = PointerTrackerQueue.class.getSimpleName(); private static final boolean DEBUG = false; + // TODO: Use ring buffer instead of {@link LinkedList}. private final LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>(); public synchronized void add(PointerTracker tracker) { @@ -81,6 +82,20 @@ public class PointerTrackerQueue { } } + public synchronized boolean hasModifierKeyOlderThan(PointerTracker tracker) { + final Iterator<PointerTracker> it = mQueue.iterator(); + while (it.hasNext()) { + final PointerTracker t = it.next(); + if (t == tracker) { + break; + } + if (t.isModifier()) { + return true; + } + } + return false; + } + public synchronized boolean isAnyInSlidingKeyInput() { for (final PointerTracker tracker : mQueue) { if (tracker.isInSlidingKeyInput()) { diff --git a/java/src/com/android/inputmethod/latin/AutoCorrection.java b/java/src/com/android/inputmethod/latin/AutoCorrection.java index c78974dac..a66337404 100644 --- a/java/src/com/android/inputmethod/latin/AutoCorrection.java +++ b/java/src/com/android/inputmethod/latin/AutoCorrection.java @@ -92,7 +92,8 @@ public class AutoCorrection { public static boolean suggestionExceedsAutoCorrectionThreshold(SuggestedWordInfo suggestion, CharSequence consideredWord, float autoCorrectionThreshold) { if (null != suggestion) { - //final int autoCorrectionSuggestionScore = sortedScores[0]; + // Shortlist a whitelisted word + if (suggestion.mKind == SuggestedWordInfo.KIND_WHITELIST) return true; final int autoCorrectionSuggestionScore = suggestion.mScore; // TODO: when the normalized score of the first suggestion is nearly equals to // the normalized score of the second suggestion, behave less aggressive. diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index ae415d0ab..534cffb2d 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -45,17 +45,17 @@ public class BinaryDictionary extends Dictionary { public static final int MAX_SPACES = 16; private static final String TAG = "BinaryDictionary"; - private static final int MAX_BIGRAMS = 60; + private static final int MAX_PREDICTIONS = 60; + private static final int MAX_RESULTS = Math.max(MAX_PREDICTIONS, MAX_WORDS); private static final int TYPED_LETTER_MULTIPLIER = 2; private long mNativeDict; private final int[] mInputCodes = new int[MAX_WORD_LENGTH]; - private final char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS]; - private final char[] mOutputChars_bigrams = new char[MAX_WORD_LENGTH * MAX_BIGRAMS]; + private final char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_RESULTS]; private final int[] mSpaceIndices = new int[MAX_SPACES]; - private final int[] mScores = new int[MAX_WORDS]; - private final int[] mBigramScores = new int[MAX_BIGRAMS]; + private final int[] mOutputScores = new int[MAX_RESULTS]; + private final int[] mOutputTypes = new int[MAX_RESULTS]; private final boolean mUseFullEditDistance; @@ -83,7 +83,8 @@ public class BinaryDictionary extends Dictionary { } private native long openNative(String sourceDir, long dictOffset, long dictSize, - int typedLetterMultiplier, int fullWordMultiplier, int maxWordLength, int maxWords); + int typedLetterMultiplier, int fullWordMultiplier, int maxWordLength, int maxWords, + int maxPredictions); private native void closeNative(long dict); private native int getFrequencyNative(long dict, int[] word, int wordLength); private native boolean isValidBigramNative(long dict, int[] word1, int[] word2); @@ -91,78 +92,59 @@ public class BinaryDictionary extends Dictionary { int[] yCoordinates, int[] times, int[] pointerIds, int[] inputCodes, int codesSize, int commitPoint, boolean isGesture, int[] prevWordCodePointArray, boolean useFullEditDistance, char[] outputChars, - int[] scores, int[] outputIndices); - private native int getBigramsNative(long dict, int[] prevWord, int prevWordLength, - int[] inputCodes, int inputCodesLength, char[] outputChars, int[] scores, - int maxWordLength, int maxBigrams); + int[] outputScores, int[] outputIndices, int[] outputTypes); private static native float calcNormalizedScoreNative( char[] before, int beforeLength, char[] after, int afterLength, int score); private static native int editDistanceNative( char[] before, int beforeLength, char[] after, int afterLength); private final void loadDictionary(String path, long startOffset, long length) { - mNativeDict = openNative(path, startOffset, length, - TYPED_LETTER_MULTIPLIER, FULL_WORD_SCORE_MULTIPLIER, MAX_WORD_LENGTH, MAX_WORDS); + mNativeDict = openNative(path, startOffset, length, TYPED_LETTER_MULTIPLIER, + FULL_WORD_SCORE_MULTIPLIER, MAX_WORD_LENGTH, MAX_WORDS, MAX_PREDICTIONS); } @Override - public ArrayList<SuggestedWordInfo> getBigrams(final WordComposer codes, - final CharSequence previousWord) { - if (mNativeDict == 0) return null; - - int[] codePoints = StringUtils.toCodePointArray(previousWord.toString()); - Arrays.fill(mOutputChars_bigrams, (char) 0); - Arrays.fill(mBigramScores, 0); - - int codesSize = codes.size(); - Arrays.fill(mInputCodes, -1); - if (codesSize > 0) { - mInputCodes[0] = codes.getCodeAt(0); - } - - int count = getBigramsNative(mNativeDict, codePoints, codePoints.length, mInputCodes, - codesSize, mOutputChars_bigrams, mBigramScores, MAX_WORD_LENGTH, MAX_BIGRAMS); - if (count > MAX_BIGRAMS) { - count = MAX_BIGRAMS; - } - - final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<SuggestedWordInfo>(); - for (int j = 0; j < count; ++j) { - if (codesSize > 0 && mBigramScores[j] < 1) break; - final int start = j * MAX_WORD_LENGTH; - int len = 0; - while (len < MAX_WORD_LENGTH && mOutputChars_bigrams[start + len] != 0) { - ++len; - } - if (len > 0) { - suggestions.add(new SuggestedWordInfo( - new String(mOutputChars_bigrams, start, len), - mBigramScores[j], SuggestedWordInfo.KIND_CORRECTION, mDictType)); + public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, + final CharSequence prevWord, final ProximityInfo proximityInfo) { + if (!isValidDictionary()) return null; + Arrays.fill(mInputCodes, WordComposer.NOT_A_CODE); + Arrays.fill(mOutputChars, (char) 0); + Arrays.fill(mOutputScores, 0); + // TODO: toLowerCase in the native code + final int[] prevWordCodePointArray = (null == prevWord) + ? null : StringUtils.toCodePointArray(prevWord.toString()); + final int composerSize = composer.size(); + + final boolean isGesture = composer.isBatchMode(); + if (composerSize <= 1 || !isGesture) { + if (composerSize > MAX_WORD_LENGTH - 1) return null; + for (int i = 0; i < composerSize; i++) { + mInputCodes[i] = composer.getCodeAt(i); } } - return suggestions; - } - // proximityInfo and/or prevWordForBigrams may not be null. - @Override - public ArrayList<SuggestedWordInfo> getWords(final WordComposer codes, - final CharSequence prevWordForBigrams, final ProximityInfo proximityInfo) { - final int count = getSuggestions(codes, prevWordForBigrams, proximityInfo, mOutputChars, - mScores, mSpaceIndices); + final InputPointers ips = composer.getInputPointers(); + final int codesSize = isGesture ? ips.getPointerSize() : composerSize; + // proximityInfo and/or prevWordForBigrams may not be null. + final int tmpCount = getSuggestionsNative(mNativeDict, + proximityInfo.getNativeProximityInfo(), ips.getXCoordinates(), + ips.getYCoordinates(), ips.getTimes(), ips.getPointerIds(), + mInputCodes, codesSize, 0 /* commitPoint */, isGesture, prevWordCodePointArray, + mUseFullEditDistance, mOutputChars, mOutputScores, mSpaceIndices, mOutputTypes); + final int count = Math.min(tmpCount, MAX_PREDICTIONS); final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<SuggestedWordInfo>(); for (int j = 0; j < count; ++j) { - if (mScores[j] < 1) break; + if (composerSize > 0 && mOutputScores[j] < 1) break; final int start = j * MAX_WORD_LENGTH; int len = 0; - while (len < MAX_WORD_LENGTH && mOutputChars[start + len] != 0) { + while (len < MAX_WORD_LENGTH && mOutputChars[start + len] != 0) { ++len; } if (len > 0) { - // TODO: actually get the kind from native code suggestions.add(new SuggestedWordInfo( new String(mOutputChars, start, len), - mScores[j], SuggestedWordInfo.KIND_CORRECTION, mDictType)); + mOutputScores[j], SuggestedWordInfo.KIND_CORRECTION, mDictType)); } } return suggestions; @@ -172,41 +154,6 @@ public class BinaryDictionary extends Dictionary { return mNativeDict != 0; } - // proximityInfo may not be null. - /* package for test */ int getSuggestions(final WordComposer codes, - final CharSequence prevWordForBigrams, final ProximityInfo proximityInfo, - char[] outputChars, int[] scores, int[] spaceIndices) { - if (!isValidDictionary()) return -1; - - final int codesSize = codes.size(); - // Won't deal with really long words. - if (codesSize > MAX_WORD_LENGTH - 1) return -1; - - Arrays.fill(mInputCodes, WordComposer.NOT_A_CODE); - for (int i = 0; i < codesSize; i++) { - mInputCodes[i] = codes.getCodeAt(i); - } - Arrays.fill(outputChars, (char) 0); - Arrays.fill(scores, 0); - - // TODO: toLowerCase in the native code - final int[] prevWordCodePointArray = (null == prevWordForBigrams) - ? null : StringUtils.toCodePointArray(prevWordForBigrams.toString()); - - int[] emptyArray = new int[codesSize]; - Arrays.fill(emptyArray, 0); - - //final int commitPoint = codes.getCommitPoint(); - //codes.clearCommitPoint(); - - final InputPointers ips = codes.getInputPointers(); - - return getSuggestionsNative(mNativeDict, proximityInfo.getNativeProximityInfo(), - ips.getXCoordinates(), ips.getYCoordinates(), ips.getTimes(), ips.getPointerIds(), - mInputCodes, codesSize, 0 /* unused */, false, prevWordCodePointArray, - mUseFullEditDistance, outputChars, scores, spaceIndices); - } - public static float calcNormalizedScore(String before, String after, int score) { return calcNormalizedScoreNative(before.toCharArray(), before.length(), after.toCharArray(), after.length(), score); diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java index 37eced5d6..236c198ad 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java @@ -149,7 +149,8 @@ public class BinaryDictionaryFileDumper { final int MODE_MAX = NONE; final Uri.Builder wordListUriBuilder = getProviderUriBuilder(id); - final String outputFileName = BinaryDictionaryGetter.getCacheFileName(id, locale, context); + final String finalFileName = BinaryDictionaryGetter.getCacheFileName(id, locale, context); + final String tempFileName = finalFileName + ".tmp"; for (int mode = MODE_MIN; mode <= MODE_MAX; ++mode) { InputStream originalSourceStream = null; @@ -165,7 +166,10 @@ public class BinaryDictionaryFileDumper { if (null == afd) return null; originalSourceStream = afd.createInputStream(); // Open output. - outputFile = new File(outputFileName); + outputFile = new File(tempFileName); + // Just to be sure, delete the file. This may fail silently, and return false: this + // is the right thing to do, as we just want to continue anyway. + outputFile.delete(); outputStream = new FileOutputStream(outputFile); // Get the appropriate decryption method for this try switch (mode) { @@ -194,14 +198,20 @@ public class BinaryDictionaryFileDumper { break; } checkMagicAndCopyFileTo(new BufferedInputStream(inputStream), outputStream); + outputStream.flush(); + outputStream.close(); + final File finalFile = new File(finalFileName); + if (!outputFile.renameTo(finalFile)) { + throw new IOException("Can't move the file to its final name"); + } wordListUriBuilder.appendQueryParameter(QUERY_PARAMETER_DELETE_RESULT, QUERY_PARAMETER_SUCCESS); if (0 >= resolver.delete(wordListUriBuilder.build(), null, null)) { Log.e(TAG, "Could not have the dictionary pack delete a word list"); } - BinaryDictionaryGetter.removeFilesWithIdExcept(context, id, outputFile); + BinaryDictionaryGetter.removeFilesWithIdExcept(context, id, finalFile); // Success! Close files (through the finally{} clause) and return. - return AssetFileAddress.makeFromFileName(outputFileName); + return AssetFileAddress.makeFromFileName(finalFileName); } catch (Exception e) { if (DEBUG) { Log.i(TAG, "Can't open word list in mode " + mode + " : " + e); diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java index 0835450c1..fd40aa6da 100644 --- a/java/src/com/android/inputmethod/latin/Dictionary.java +++ b/java/src/com/android/inputmethod/latin/Dictionary.java @@ -16,6 +16,8 @@ package com.android.inputmethod.latin; +import android.text.TextUtils; + import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; @@ -50,24 +52,17 @@ public abstract class Dictionary { } /** - * Searches for words in the dictionary that match the characters in the composer. Matched - * words are returned as an ArrayList. + * Searches for suggestions for a given context. For the moment the context is only the + * previous word. * @param composer the key sequence to match with coordinate info, as a WordComposer - * @param prevWordForBigrams the previous word, or null if none + * @param prevWord the previous word, or null if none * @param proximityInfo the object for key proximity. May be ignored by some implementations. - * @return the list of suggestions - */ - abstract public ArrayList<SuggestedWordInfo> getWords(final WordComposer composer, - final CharSequence prevWordForBigrams, final ProximityInfo proximityInfo); - - /** - * Searches for pairs in the bigram dictionary that matches the previous word. - * @param composer the key sequence to match - * @param previousWord the word before - * @return the list of suggestions + * @return the list of suggestions (possibly null if none) */ - public abstract ArrayList<SuggestedWordInfo> getBigrams(final WordComposer composer, - final CharSequence previousWord); + // TODO: pass more context than just the previous word, to enable better suggestions (n-gram + // and more) + abstract public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, + final CharSequence prevWord, final ProximityInfo proximityInfo); /** * Checks if the given word occurs in the dictionary diff --git a/java/src/com/android/inputmethod/latin/DictionaryCollection.java b/java/src/com/android/inputmethod/latin/DictionaryCollection.java index dcc53c59f..88ac07d7a 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryCollection.java +++ b/java/src/com/android/inputmethod/latin/DictionaryCollection.java @@ -55,38 +55,19 @@ public class DictionaryCollection extends Dictionary { } @Override - public ArrayList<SuggestedWordInfo> getWords(final WordComposer composer, - final CharSequence prevWordForBigrams, final ProximityInfo proximityInfo) { + public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, + final CharSequence prevWord, final ProximityInfo proximityInfo) { final CopyOnWriteArrayList<Dictionary> dictionaries = mDictionaries; if (dictionaries.isEmpty()) return null; // To avoid creating unnecessary objects, we get the list out of the first // dictionary and add the rest to it if not null, hence the get(0) - ArrayList<SuggestedWordInfo> suggestions = dictionaries.get(0).getWords(composer, - prevWordForBigrams, proximityInfo); + ArrayList<SuggestedWordInfo> suggestions = dictionaries.get(0).getSuggestions(composer, + prevWord, proximityInfo); if (null == suggestions) suggestions = new ArrayList<SuggestedWordInfo>(); final int length = dictionaries.size(); for (int i = 0; i < length; ++ i) { - final ArrayList<SuggestedWordInfo> sugg = dictionaries.get(i).getWords(composer, - prevWordForBigrams, proximityInfo); - if (null != sugg) suggestions.addAll(sugg); - } - return suggestions; - } - - @Override - public ArrayList<SuggestedWordInfo> getBigrams(final WordComposer composer, - final CharSequence previousWord) { - final CopyOnWriteArrayList<Dictionary> dictionaries = mDictionaries; - if (dictionaries.isEmpty()) return null; - // To avoid creating unnecessary objects, we get the list out of the first - // dictionary and add the rest to it if not null, hence the get(0) - ArrayList<SuggestedWordInfo> suggestions = dictionaries.get(0).getBigrams(composer, - previousWord); - if (null == suggestions) suggestions = new ArrayList<SuggestedWordInfo>(); - final int length = dictionaries.size(); - for (int i = 0; i < length; ++ i) { - final ArrayList<SuggestedWordInfo> sugg = - dictionaries.get(i).getBigrams(composer, previousWord); + final ArrayList<SuggestedWordInfo> sugg = dictionaries.get(i).getSuggestions(composer, + prevWord, proximityInfo); if (null != sugg) suggestions.addAll(sugg); } return suggestions; diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java index 1cda9f257..016530abb 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java @@ -192,41 +192,13 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { } @Override - public ArrayList<SuggestedWordInfo> getWords(final WordComposer codes, - final CharSequence prevWordForBigrams, final ProximityInfo proximityInfo) { + public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, + final CharSequence prevWord, final ProximityInfo proximityInfo) { asyncReloadDictionaryIfRequired(); - return getWordsInner(codes, prevWordForBigrams, proximityInfo); - } - - protected final ArrayList<SuggestedWordInfo> getWordsInner(final WordComposer codes, - final CharSequence prevWordForBigrams, final ProximityInfo proximityInfo) { - // Ensure that there are no concurrent calls to getWords. If there are, do nothing and - // return. - if (mLocalDictionaryController.tryLock()) { - try { - if (mBinaryDictionary != null) { - return mBinaryDictionary.getWords(codes, prevWordForBigrams, proximityInfo); - } - } finally { - mLocalDictionaryController.unlock(); - } - } - return null; - } - - @Override - public ArrayList<SuggestedWordInfo> getBigrams(final WordComposer codes, - final CharSequence previousWord) { - asyncReloadDictionaryIfRequired(); - return getBigramsInner(codes, previousWord); - } - - protected ArrayList<SuggestedWordInfo> getBigramsInner(final WordComposer codes, - final CharSequence previousWord) { if (mLocalDictionaryController.tryLock()) { try { if (mBinaryDictionary != null) { - return mBinaryDictionary.getBigrams(codes, previousWord); + return mBinaryDictionary.getSuggestions(composer, prevWord, proximityInfo); } } finally { mLocalDictionaryController.unlock(); diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java index 76213c0da..5d7995dc2 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java @@ -17,6 +17,7 @@ package com.android.inputmethod.latin; import android.content.Context; +import android.text.TextUtils; import com.android.inputmethod.keyboard.KeyDetector; import com.android.inputmethod.keyboard.Keyboard; @@ -247,23 +248,36 @@ public class ExpandableDictionary extends Dictionary { } @Override - public ArrayList<SuggestedWordInfo> getWords(final WordComposer codes, - final CharSequence prevWordForBigrams, final ProximityInfo proximityInfo) { + public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, + final CharSequence prevWord, final ProximityInfo proximityInfo) { + if (reloadDictionaryIfRequired()) return null; + if (composer.size() <= 1) { + if (composer.size() >= BinaryDictionary.MAX_WORD_LENGTH) { + return null; + } + final ArrayList<SuggestedWordInfo> suggestions = + getWordsInner(composer, prevWord, proximityInfo); + return suggestions; + } else { + if (TextUtils.isEmpty(prevWord)) return null; + final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<SuggestedWordInfo>(); + runBigramReverseLookUp(prevWord, suggestions); + return suggestions; + } + } + + // This reloads the dictionary if required, and returns whether it's currently updating its + // contents or not. + // @VisibleForTesting + boolean reloadDictionaryIfRequired() { synchronized (mUpdatingLock) { // If we need to update, start off a background task if (mRequiresReload) startDictionaryLoadingTaskLocked(); - // Currently updating contacts, don't return any results. - if (mUpdatingDictionary) return null; - } - if (codes.size() >= BinaryDictionary.MAX_WORD_LENGTH) { - return null; + return mUpdatingDictionary; } - final ArrayList<SuggestedWordInfo> suggestions = - getWordsInner(codes, prevWordForBigrams, proximityInfo); - return suggestions; } - protected final ArrayList<SuggestedWordInfo> getWordsInner(final WordComposer codes, + protected ArrayList<SuggestedWordInfo> getWordsInner(final WordComposer codes, final CharSequence prevWordForBigrams, final ProximityInfo proximityInfo) { final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<SuggestedWordInfo>(); mInputLength = codes.size(); @@ -589,16 +603,6 @@ public class ExpandableDictionary extends Dictionary { return searchWord(childNode.mChildren, word, depth + 1, childNode); } - // @VisibleForTesting - boolean reloadDictionaryIfRequired() { - synchronized (mUpdatingLock) { - // If we need to update, start off a background task - if (mRequiresReload) startDictionaryLoadingTaskLocked(); - // Currently updating contacts, don't return any results. - return mUpdatingDictionary; - } - } - private void runBigramReverseLookUp(final CharSequence previousWord, final ArrayList<SuggestedWordInfo> suggestions) { // Search for the lowercase version of the word only, because that's where bigrams @@ -610,17 +614,6 @@ public class ExpandableDictionary extends Dictionary { } } - @Override - public ArrayList<SuggestedWordInfo> getBigrams(final WordComposer codes, - final CharSequence previousWord) { - if (!reloadDictionaryIfRequired()) { - final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<SuggestedWordInfo>(); - runBigramReverseLookUp(previousWord, suggestions); - return suggestions; - } - return null; - } - /** * Used for testing purposes and in the spell checker * This function will wait for loading from database to be done diff --git a/java/src/com/android/inputmethod/latin/InputPointers.java b/java/src/com/android/inputmethod/latin/InputPointers.java index 9d77d4e96..5ad53480f 100644 --- a/java/src/com/android/inputmethod/latin/InputPointers.java +++ b/java/src/com/android/inputmethod/latin/InputPointers.java @@ -18,7 +18,7 @@ package com.android.inputmethod.latin; import java.util.Arrays; -// TODO: Add unit test +// TODO: This class is not thread-safe. public class InputPointers { private final ScalableIntArray mXCoordinates = new ScalableIntArray(); private final ScalableIntArray mYCoordinates = new ScalableIntArray(); @@ -55,21 +55,15 @@ public class InputPointers { /** * Append the pointers in the specified {@link InputPointers} to the end of this. - * @param src the source {@link InputPointers} to append the pointers. + * @param src the source {@link InputPointers} to read the data from. * @param startPos the starting index of the pointers in {@code src}. * @param length the number of pointers to be appended. */ public void append(InputPointers src, int startPos, int length) { - final int currentLength = getPointerSize(); - final int newLength = currentLength + length; - mXCoordinates.ensureCapacity(newLength); - mYCoordinates.ensureCapacity(newLength); - mPointerIds.ensureCapacity(newLength); - mTimes.ensureCapacity(newLength); - System.arraycopy(src.getXCoordinates(), startPos, getXCoordinates(), currentLength, length); - System.arraycopy(src.getYCoordinates(), startPos, getYCoordinates(), currentLength, length); - System.arraycopy(src.getPointerIds(), startPos, getPointerIds(), currentLength, length); - System.arraycopy(src.getTimes(), startPos, getTimes(), currentLength, length); + mXCoordinates.append(src.mXCoordinates, startPos, length); + mYCoordinates.append(src.mYCoordinates, startPos, length); + mPointerIds.append(src.mPointerIds, startPos, length); + mTimes.append(src.mTimes, startPos, length); } public void reset() { @@ -118,24 +112,23 @@ public class InputPointers { } public void add(int val) { - ensureCapacity(mLength); + final int nextLength = mLength + 1; + ensureCapacity(nextLength); mArray[mLength] = val; - ++mLength; + mLength = nextLength; } - public void ensureCapacity(int minimumCapacity) { + private void ensureCapacity(int minimumCapacity) { if (mArray.length < minimumCapacity) { final int nextCapacity = mArray.length * 2; - grow(minimumCapacity > nextCapacity ? minimumCapacity : nextCapacity); + // The following is the same as newLength = Math.max(minimumCapacity, nextCapacity); + final int newLength = minimumCapacity > nextCapacity + ? minimumCapacity + : nextCapacity; + mArray = Arrays.copyOf(mArray, newLength); } } - private void grow(int newCapacity) { - final int[] newArray = new int[newCapacity]; - System.arraycopy(mArray, 0, newArray, 0, mLength); - mArray = newArray; - } - public int getLength() { return mLength; } @@ -149,14 +142,23 @@ public class InputPointers { return mArray; } - public void copy(ScalableIntArray ip) { - mArray = Arrays.copyOf(ip.mArray, ip.mArray.length); + public void set(ScalableIntArray ip) { + mArray = ip.mArray; mLength = ip.mLength; } - public void set(ScalableIntArray ip) { - mArray = ip.mArray; + public void copy(ScalableIntArray ip) { + ensureCapacity(ip.mLength); + System.arraycopy(ip.mArray, 0, mArray, 0, ip.mLength); mLength = ip.mLength; } + + public void append(ScalableIntArray src, int startPos, int length) { + final int currentLength = mLength; + final int newLength = currentLength + length; + ensureCapacity(newLength); + System.arraycopy(src.mArray, startPos, mArray, currentLength, length); + mLength = newLength; + } } } diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 4be2a1799..f27d32150 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -353,7 +353,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mPrefs = prefs; LatinImeLogger.init(this, prefs); if (ProductionFlag.IS_EXPERIMENTAL) { - ResearchLogger.getInstance().init(this, prefs); + ResearchLogger.getInstance().init(this, prefs, mKeyboardSwitcher); } InputMethodManagerCompatWrapper.init(this); SubtypeSwitcher.init(this); @@ -689,6 +689,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen if (TRACE) Debug.startMethodTracing("/data/trace/latinime"); } + // Callback for the TargetApplicationGetter @Override public void onTargetApplicationKnown(final ApplicationInfo info) { mTargetApplicationInfo = info; @@ -997,7 +998,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mLastComposedWord = LastComposedWord.NOT_A_COMPOSED_WORD; } - public void commitTyped(final int separatorCode) { + private void commitTyped(final int separatorCode) { if (!mWordComposer.isComposingWord()) return; final CharSequence typedWord = mWordComposer.getTypedWord(); if (typedWord.length() > 0) { @@ -1013,6 +1014,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen updateSuggestionsOrPredictions(); } + // Called from the KeyboardSwitcher which needs to know auto caps state to display + // the right layout. public int getCurrentAutoCapsState() { if (!mCurrentSettings.mAutoCap) return Constants.TextUtils.CAP_MODE_OFF; @@ -1088,6 +1091,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen || codePoint == Keyboard.CODE_CLOSING_ANGLE_BRACKET; } + // Callback for the SuggestionsView, to call when the "add to dictionary" hint is pressed. @Override public boolean addWordToUserDictionary(String word) { mUserDictionary.addWordToUserDictionary(word, 128); @@ -1285,6 +1289,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mConnection.endBatchEdit(); } + // Called from PointerTracker through the KeyboardActionListener interface @Override public void onTextInput(CharSequence text) { mConnection.beginBatchEdit(); @@ -1348,6 +1353,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } } + // Called from PointerTracker through the KeyboardActionListener interface @Override public void onCancelInput() { // User released a finger outside any key @@ -1505,7 +1511,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // it entirely and resume suggestions on the previous word, we'd like to still // have touch coordinates for it. resetComposingState(false /* alsoResetLastComposedWord */); - clearSuggestions(); } if (isComposingWord) { final int keyX, keyY; @@ -1621,12 +1626,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen inputView.closing(); } - public boolean isShowingPunctuationList() { + // TODO: make this private + // Outside LatinIME, only used by the test suite. + /* package for tests */ boolean isShowingPunctuationList() { if (mSuggestionsView == null) return false; return mCurrentSettings.mSuggestPuncList == mSuggestionsView.getSuggestions(); } - public boolean isSuggestionsStripVisible() { + private boolean isSuggestionsStripVisible() { if (mSuggestionsView == null) return false; if (mSuggestionsView.isShowingAddToDictionaryHint()) @@ -1638,7 +1645,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen return mCurrentSettings.isSuggestionsRequested(mDisplayOrientation); } - public void clearSuggestions() { + private void clearSuggestions() { setSuggestions(SuggestedWords.EMPTY, false); setAutoCorrectionIndicator(false); } @@ -1661,7 +1668,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } } - public void updateSuggestionsOrPredictions() { + // TODO: rename this method to updateSuggestionStrip or simply updateSuggestions + private void updateSuggestionsOrPredictions() { mHandler.cancelUpdateSuggestionStrip(); // Check if we have a suggestion engine attached. @@ -1675,42 +1683,36 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } final String typedWord = mWordComposer.getTypedWord(); - final SuggestedWords suggestions; if (!mWordComposer.isComposingWord() && !mCurrentSettings.mBigramPredictionEnabled) { setPunctuationSuggestions(); return; } - if (!mWordComposer.isComposingWord()) { - suggestions = updateBigramPredictions(); - } else { - suggestions = updateSuggestions(typedWord); - } - - if (null != suggestions && suggestions.size() > 0) { - showSuggestions(suggestions, typedWord); - } else { - clearSuggestions(); - } - } - - private SuggestedWords updateSuggestions(final CharSequence typedWord) { - // TODO: May need a better way of retrieving previous word + // Get the word on which we should search the bigrams. If we are composing a word, it's + // whatever is *before* the half-committed word in the buffer, hence 2; if we aren't, we + // should just skip whitespace if any, so 1. + // TODO: this is slow (2-way IPC) - we should probably cache this instead. final CharSequence prevWord = - mConnection.getNthPreviousWord(mCurrentSettings.mWordSeparators, 2); - // getSuggestedWords handles gracefully a null value of prevWord - final SuggestedWords suggestedWords = mSuggest.getSuggestedWords(mWordComposer, + mConnection.getNthPreviousWord(mCurrentSettings.mWordSeparators, + mWordComposer.isComposingWord() ? 2 : 1); + SuggestedWords suggestedWords = mSuggest.getSuggestedWords(mWordComposer, prevWord, mKeyboardSwitcher.getKeyboard().getProximityInfo(), - // !mWordComposer.isComposingWord() is known to be false - mCurrentSettings.mCorrectionEnabled, !mWordComposer.isComposingWord()); - - // Basically, we update the suggestion strip only when suggestion count > 1. However, - // there is an exception: We update the suggestion strip whenever typed word's length - // is 1 or typed word is found in dictionary, regardless of suggestion count. Actually, - // in most cases, suggestion count is 1 when typed word's length is 1, but we do always - // need to clear the previous state when the user starts typing a word (i.e. typed word's - // length == 1). - if (suggestedWords.size() > 1 || typedWord.length() == 1 + mCurrentSettings.mCorrectionEnabled); + suggestedWords = maybeRetrieveOlderSuggestions(typedWord, suggestedWords); + + showSuggestions(suggestedWords, typedWord); + } + + private SuggestedWords maybeRetrieveOlderSuggestions(final CharSequence typedWord, + final SuggestedWords suggestedWords) { + // TODO: consolidate this into getSuggestedWords + // We update the suggestion strip only when we have some suggestions to show, i.e. when + // the suggestion count is > 1; else, we leave the old suggestions, with the typed word + // replaced with the new one. However, when the word is a dictionary word, or when the + // length of the typed word is 1 or 0 (after a deletion typically), we do want to remove the + // old suggestions. Also, if we are showing the "add to dictionary" hint, we need to + // revert to suggestions - although it is unclear how we can come here if it's displayed. + if (suggestedWords.size() > 1 || typedWord.length() <= 1 || !suggestedWords.mTypedWordValid || mSuggestionsView.isShowingAddToDictionaryHint()) { return suggestedWords; @@ -1733,7 +1735,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private void showSuggestions(final SuggestedWords suggestedWords, final CharSequence typedWord) { - // This method is only ever called by updateSuggestions or updateBigramPredictions. + if (null == suggestedWords || suggestedWords.size() <= 0) { + clearSuggestions(); + return; + } final CharSequence autoCorrection; if (suggestedWords.size() > 0) { if (suggestedWords.mWillAutoCorrect) { @@ -1781,6 +1786,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } } + // Called from SuggestionsView through the SuggestionsView.Listener interface @Override public void pickSuggestionManually(final int index, final CharSequence suggestion, final int x, final int y) { @@ -1891,16 +1897,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen separatorCode, prevWord); } - private SuggestedWords updateBigramPredictions() { - final CharSequence prevWord = - mConnection.getNthPreviousWord(mCurrentSettings.mWordSeparators, 1); - return mSuggest.getSuggestedWords(mWordComposer, - prevWord, mKeyboardSwitcher.getKeyboard().getProximityInfo(), - // !mWordComposer.isComposingWord() is known to be true - mCurrentSettings.mCorrectionEnabled, !mWordComposer.isComposingWord()); - } - - public void setPunctuationSuggestions() { + private void setPunctuationSuggestions() { if (mCurrentSettings.mBigramPredictionEnabled) { clearSuggestions(); } else { @@ -2008,16 +2005,13 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mHandler.postUpdateSuggestionStrip(); } + // Used by the RingCharBuffer public boolean isWordSeparator(int code) { return mCurrentSettings.isWordSeparator(code); } - public boolean preferCapitalization() { - return mWordComposer.isFirstCharCapitalized(); - } - // Notify that language or mode have been changed and toggleLanguage will update KeyboardID - // according to new language or mode. + // according to new language or mode. Called from SubtypeSwitcher. public void onRefreshKeyboard() { // When the device locale is changed in SetupWizard etc., this method may get called via // onConfigurationChanged before SoftInputWindow is shown. @@ -2034,16 +2028,20 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } // TODO: Remove this method from {@link LatinIME} and move {@link FeedbackManager} to - // {@link KeyboardSwitcher}. + // {@link KeyboardSwitcher}. Called from KeyboardSwitcher public void hapticAndAudioFeedback(final int primaryCode) { mFeedbackManager.hapticAndAudioFeedback(primaryCode, mKeyboardSwitcher.getKeyboardView()); } + // Callback called by PointerTracker through the KeyboardActionListener. This is called when a + // key is depressed; release matching call is onReleaseKey below. @Override public void onPressKey(int primaryCode) { mKeyboardSwitcher.onPressKey(primaryCode); } + // Callback by PointerTracker through the KeyboardActionListener. This is called when a key + // is released; press matching call is onPressKey above. @Override public void onReleaseKey(int primaryCode, boolean withSliding) { mKeyboardSwitcher.onReleaseKey(primaryCode, withSliding); @@ -2088,6 +2086,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen launchSettingsClass(SettingsActivity.class); } + // Called from debug code only public void launchDebugSettings() { launchSettingsClass(DebugSettingsActivity.class); } diff --git a/java/src/com/android/inputmethod/latin/ResearchLog.java b/java/src/com/android/inputmethod/latin/ResearchLog.java new file mode 100644 index 000000000..1de5cb36a --- /dev/null +++ b/java/src/com/android/inputmethod/latin/ResearchLog.java @@ -0,0 +1,360 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import android.content.SharedPreferences; +import android.os.SystemClock; +import android.util.JsonWriter; +import android.util.Log; +import android.view.inputmethod.CompletionInfo; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.latin.ResearchLogger.LogUnit; +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.FileWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +/** + * Logs the use of the LatinIME keyboard. + * + * This class logs operations on the IME keyboard, including what the user has typed. + * Data is stored locally in a file in app-specific storage. + * + * This functionality is off by default. See {@link ProductionFlag#IS_EXPERIMENTAL}. + */ +public class ResearchLog { + private static final String TAG = ResearchLog.class.getSimpleName(); + private static final JsonWriter NULL_JSON_WRITER = new JsonWriter( + new OutputStreamWriter(new NullOutputStream())); + + final ScheduledExecutorService mExecutor; + /* package */ final File mFile; + private JsonWriter mJsonWriter = NULL_JSON_WRITER; // should never be null + + private int mLoggingState; + private static final int LOGGING_STATE_UNSTARTED = 0; + private static final int LOGGING_STATE_RUNNING = 1; + private static final int LOGGING_STATE_STOPPING = 2; + private static final int LOGGING_STATE_STOPPED = 3; + private static final long FLUSH_DELAY_IN_MS = 1000 * 5; + + private static class NullOutputStream extends OutputStream { + /** {@inheritDoc} */ + @Override + public void write(byte[] buffer, int offset, int count) { + // nop + } + + /** {@inheritDoc} */ + @Override + public void write(byte[] buffer) { + // nop + } + + @Override + public void write(int oneByte) { + } + } + + public ResearchLog(File outputFile) { + mExecutor = Executors.newSingleThreadScheduledExecutor(); + if (outputFile == null) { + throw new IllegalArgumentException(); + } + mFile = outputFile; + mLoggingState = LOGGING_STATE_UNSTARTED; + } + + public synchronized void start() throws IOException { + switch (mLoggingState) { + case LOGGING_STATE_UNSTARTED: + mJsonWriter = new JsonWriter(new BufferedWriter(new FileWriter(mFile))); + mJsonWriter.setLenient(true); + mJsonWriter.beginArray(); + mLoggingState = LOGGING_STATE_RUNNING; + break; + case LOGGING_STATE_RUNNING: + case LOGGING_STATE_STOPPING: + case LOGGING_STATE_STOPPED: + break; + } + } + + public synchronized void stop() { + switch (mLoggingState) { + case LOGGING_STATE_UNSTARTED: + mLoggingState = LOGGING_STATE_STOPPED; + break; + case LOGGING_STATE_RUNNING: + mExecutor.submit(new Callable<Object>() { + @Override + public Object call() throws Exception { + try { + mJsonWriter.endArray(); + mJsonWriter.flush(); + mJsonWriter.close(); + } finally { + // the contentprovider only exports data if the writable + // bit is cleared. + boolean success = mFile.setWritable(false, false); + mLoggingState = LOGGING_STATE_STOPPED; + } + return null; + } + }); + mExecutor.shutdown(); + mLoggingState = LOGGING_STATE_STOPPING; + break; + case LOGGING_STATE_STOPPING: + case LOGGING_STATE_STOPPED: + } + } + + public boolean isAlive() { + switch (mLoggingState) { + case LOGGING_STATE_UNSTARTED: + case LOGGING_STATE_RUNNING: + return true; + } + return false; + } + + public void waitUntilStopped(int timeoutInMs) throws InterruptedException { + mExecutor.awaitTermination(timeoutInMs, TimeUnit.MILLISECONDS); + } + + private boolean isAbortSuccessful; + public boolean isAbortSuccessful() { + return isAbortSuccessful; + } + + public synchronized void abort() { + switch (mLoggingState) { + case LOGGING_STATE_UNSTARTED: + mLoggingState = LOGGING_STATE_STOPPED; + isAbortSuccessful = true; + break; + case LOGGING_STATE_RUNNING: + mExecutor.submit(new Callable<Object>() { + @Override + public Object call() throws Exception { + try { + mJsonWriter.endArray(); + mJsonWriter.close(); + } finally { + isAbortSuccessful = mFile.delete(); + } + return null; + } + }); + mExecutor.shutdown(); + mLoggingState = LOGGING_STATE_STOPPING; + break; + case LOGGING_STATE_STOPPING: + case LOGGING_STATE_STOPPED: + } + } + + /* package */ synchronized void flush() { + switch (mLoggingState) { + case LOGGING_STATE_UNSTARTED: + break; + case LOGGING_STATE_RUNNING: + removeAnyScheduledFlush(); + mExecutor.submit(mFlushCallable); + break; + case LOGGING_STATE_STOPPING: + case LOGGING_STATE_STOPPED: + } + } + + private Callable<Object> mFlushCallable = new Callable<Object>() { + @Override + public Object call() throws Exception { + mJsonWriter.flush(); + return null; + } + }; + + private ScheduledFuture<Object> mFlushFuture; + + private void removeAnyScheduledFlush() { + if (mFlushFuture != null) { + mFlushFuture.cancel(false); + mFlushFuture = null; + } + } + + private void scheduleFlush() { + removeAnyScheduledFlush(); + mFlushFuture = mExecutor.schedule(mFlushCallable, FLUSH_DELAY_IN_MS, TimeUnit.MILLISECONDS); + } + + public synchronized void publishPublicEvents(final LogUnit logUnit) { + switch (mLoggingState) { + case LOGGING_STATE_UNSTARTED: + break; + case LOGGING_STATE_RUNNING: + mExecutor.submit(new Callable<Object>() { + @Override + public Object call() throws Exception { + logUnit.publishPublicEventsTo(ResearchLog.this); + scheduleFlush(); + return null; + } + }); + break; + case LOGGING_STATE_STOPPING: + case LOGGING_STATE_STOPPED: + } + } + + public synchronized void publishAllEvents(final LogUnit logUnit) { + switch (mLoggingState) { + case LOGGING_STATE_UNSTARTED: + break; + case LOGGING_STATE_RUNNING: + mExecutor.submit(new Callable<Object>() { + @Override + public Object call() throws Exception { + logUnit.publishAllEventsTo(ResearchLog.this); + scheduleFlush(); + return null; + } + }); + break; + case LOGGING_STATE_STOPPING: + case LOGGING_STATE_STOPPED: + } + } + + private static final String CURRENT_TIME_KEY = "_ct"; + private static final String UPTIME_KEY = "_ut"; + private static final String EVENT_TYPE_KEY = "_ty"; + void outputEvent(final String[] keys, final Object[] values) { + // not thread safe. + 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[] keyboardKeys = (Key[]) value; + mJsonWriter.beginArray(); + for (Key keyboardKey : keyboardKeys) { + mJsonWriter.beginObject(); + mJsonWriter.name("code").value(keyboardKey.mCode); + mJsonWriter.name("altCode").value(keyboardKey.mAltCode); + mJsonWriter.name("x").value(keyboardKey.mX); + mJsonWriter.name("y").value(keyboardKey.mY); + mJsonWriter.name("w").value(keyboardKey.mWidth); + mJsonWriter.name("h").value(keyboardKey.mHeight); + mJsonWriter.endObject(); + } + mJsonWriter.endArray(); + } else if (value instanceof SuggestedWords) { + SuggestedWords words = (SuggestedWords) value; + mJsonWriter.beginObject(); + mJsonWriter.name("typedWordValid").value(words.mTypedWordValid); + mJsonWriter.name("willAutoCorrect") + .value(words.mWillAutoCorrect); + mJsonWriter.name("isPunctuationSuggestions") + .value(words.mIsPunctuationSuggestions); + 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; + } + } + } +} diff --git a/java/src/com/android/inputmethod/latin/ResearchLogger.java b/java/src/com/android/inputmethod/latin/ResearchLogger.java index 2de0194fd..9055d5d32 100644 --- a/java/src/com/android/inputmethod/latin/ResearchLogger.java +++ b/java/src/com/android/inputmethod/latin/ResearchLogger.java @@ -24,12 +24,7 @@ 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.text.TextUtils; -import android.util.JsonWriter; import android.util.Log; import android.view.MotionEvent; import android.view.inputmethod.CompletionInfo; @@ -40,22 +35,17 @@ import android.widget.Toast; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.keyboard.KeyboardId; +import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.latin.RichInputConnection.Range; -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.FileWriter; import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.UUID; /** @@ -68,36 +58,35 @@ import java.util.UUID; */ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = ResearchLogger.class.getSimpleName(); - private static final boolean DEBUG = false; private static final boolean OUTPUT_ENTIRE_BUFFER = false; // true may disclose private info /* 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); + new SimpleDateFormat("yyyyMMddHHmmssS", Locale.US); // 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"; + private static final int ABORT_TIMEOUT_IN_MS = 10 * 1000; 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 - - 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; + /* package */ File mFilesDir; + /* package */ String mUUIDString; + /* package */ ResearchLog mMainResearchLog; + // The mIntentionalResearchLog records all events for the session, private or not (excepting + // passwords). It is written to permanent storage only if the user explicitly commands + // the system to do so. + /* package */ ResearchLog mIntentionalResearchLog; + // LogUnits are queued here and released only when the user requests the intentional log. + private final List<LogUnit> mIntentionalResearchLogQueue = new ArrayList<LogUnit>(); + private boolean mIsPasswordView = false; + private boolean mIsLoggingSuspended = false; // digits entered by the user are replaced with this codepoint. /* package for test */ static final int DIGIT_REPLACEMENT_CODEPOINT = @@ -111,34 +100,17 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang // used to check whether words are not unique private Suggest mSuggest; private Dictionary mDictionary; - - private static class NullOutputStream extends OutputStream { - /** {@inheritDoc} */ - @Override - public void write(byte[] buffer, int offset, int count) { - // nop - } - - /** {@inheritDoc} */ - @Override - public void write(byte[] buffer) { - // nop - } - - @Override - public void write(int oneByte) { - } - } + private KeyboardSwitcher mKeyboardSwitcher; private ResearchLogger() { - mLoggingState = LOGGING_STATE_OFF; } public static ResearchLogger getInstance() { return sInstance; } - public void init(final InputMethodService ims, final SharedPreferences prefs) { + public void init(final InputMethodService ims, final SharedPreferences prefs, + KeyboardSwitcher keyboardSwitcher) { assert ims != null; if (ims == null) { Log.w(TAG, "IMS is null; logging is off"); @@ -149,129 +121,100 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } } if (prefs != null) { + mUUIDString = getUUID(prefs); sIsLogging = prefs.getBoolean(PREF_USABILITY_STUDY_MODE, false); prefs.registerOnSharedPreferenceChangeListener(this); } + mKeyboardSwitcher = keyboardSwitcher; + } + + private File createLogFile(File filesDir) { + final StringBuilder sb = new StringBuilder(); + sb.append(FILENAME_PREFIX).append('-'); + sb.append(mUUIDString).append('-'); + sb.append(TIMESTAMP_DATEFORMAT.format(new Date())); + sb.append(FILENAME_SUFFIX); + return new File(filesDir, sb.toString()); } - public synchronized void start() { - Log.d(TAG, "start called"); + public void start() { if (!sIsLogging) { // Log.w(TAG, "not in usability mode; not logging"); return; } 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(); - } + return; + } + if (mMainResearchLog == null || !mMainResearchLog.isAlive()) { + mMainResearchLog = new ResearchLog(createLogFile(mFilesDir)); + } + try { + mMainResearchLog.start(); + if (mIntentionalResearchLog == null || !mIntentionalResearchLog.isAlive()) { + mIntentionalResearchLog = new ResearchLog(createLogFile(mFilesDir)); } + mIntentionalResearchLog.start(); + } catch (IOException e) { + Log.w(TAG, "Could not start ResearchLogger."); } } - public synchronized void stop() { - Log.d(TAG, "stop called"); - if (mLoggingHandler != null && mLoggingState == LOGGING_STATE_ON) { - mLoggingState = LOGGING_STATE_STOPPING; - flushEventQueue(true); - // put this in the Handler queue so pending writes are processed first. - mLoggingHandler.post(new Runnable() { - @Override - public void run() { - try { - 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(); - } - } - } - }); + public void stop() { + if (mMainResearchLog != null) { + mMainResearchLog.stop(); + } + } + + public boolean abort() { + mIsLoggingSuspended = true; + requestIndicatorRedraw(); + boolean didAbortMainLog = false; + if (mMainResearchLog != null) { + mMainResearchLog.abort(); try { - wait(); + mMainResearchLog.waitUntilStopped(ABORT_TIMEOUT_IN_MS); } catch (InterruptedException e) { - e.printStackTrace(); + // interrupted early. carry on. + } + if (mMainResearchLog.isAbortSuccessful()) { + didAbortMainLog = true; } } - } - - public synchronized boolean abort() { - Log.d(TAG, "abort called"); - boolean isLogFileDeleted = false; - if (mLoggingHandler != null && mLoggingState == LOGGING_STATE_ON) { - mLoggingState = LOGGING_STATE_STOPPING; + boolean didAbortIntentionalLog = false; + if (mIntentionalResearchLog != null) { + mIntentionalResearchLog.abort(); 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, "logfile closed"); - } + mIntentionalResearchLog.waitUntilStopped(ABORT_TIMEOUT_IN_MS); + } catch (InterruptedException e) { + // interrupted early. carry on. + } + if (mIntentionalResearchLog.isAbortSuccessful()) { + didAbortIntentionalLog = true; } } - return isLogFileDeleted; + return didAbortMainLog && didAbortIntentionalLog; } - /* package */ synchronized void flush() { + /* package */ void flush() { + if (mMainResearchLog != null) { + mMainResearchLog.flush(); + } + } + + private void logWholeSessionHistory() throws IOException { try { - mJsonWriter.flush(); - } catch (IOException e) { - e.printStackTrace(); + LogUnit headerLogUnit = new LogUnit(); + headerLogUnit.addLogAtom(EVENTKEYS_INTENTIONAL_LOG, EVENTKEYS_NULLVALUES, false); + mIntentionalResearchLog.publishAllEvents(headerLogUnit); + for (LogUnit logUnit : mIntentionalResearchLogQueue) { + mIntentionalResearchLog.publishAllEvents(logUnit); + } + mIntentionalResearchLog.stop(); + mIntentionalResearchLog = new ResearchLog(createLogFile(mFilesDir)); + mIntentionalResearchLog.start(); + } finally { + mIntentionalResearchLogQueue.clear(); } } @@ -290,7 +233,9 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang 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), + mIsLoggingSuspended ? latinIME.getString(R.string.enable_session_logging) : + latinIME.getString(R.string.do_not_log_this_session), + latinIME.getString(R.string.log_whole_session_history), }; final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { @Override @@ -298,28 +243,46 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang di.dismiss(); switch (position) { case 0: - ResearchLogger.getInstance().userTimestamp(); + 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(); + if (mIsLoggingSuspended) { + mIsLoggingSuspended = false; + requestIndicatorRedraw(); + Toast toast = Toast.makeText(latinIME, + R.string.notify_session_logging_enabled, Toast.LENGTH_LONG); } else { - Toast.makeText(latinIME, - R.string.notify_session_log_not_deleted, Toast.LENGTH_LONG) - .show(); + Toast toast = Toast.makeText(latinIME, + R.string.notify_session_log_deleting, Toast.LENGTH_LONG); + toast.show(); + boolean isLogDeleted = 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; + case 2: + try { + logWholeSessionHistory(); + Toast.makeText(latinIME, R.string.notify_session_history_logged, + Toast.LENGTH_LONG).show(); + } catch (IOException e) { + Toast.makeText(latinIME, R.string.notify_session_history_not_logged, + Toast.LENGTH_LONG).show(); + e.printStackTrace(); } break; } } + }; final AlertDialog.Builder builder = new AlertDialog.Builder(latinIME) .setItems(items, listener) @@ -336,7 +299,14 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } private boolean isAllowedToLog() { - return mLoggingState == LOGGING_STATE_ON && !mIsPasswordView; + return !mIsPasswordView && !mIsLoggingSuspended; + } + + public void requestIndicatorRedraw() { + // invalidate any existing graphics + if (mKeyboardSwitcher != null) { + mKeyboardSwitcher.getKeyboardView().invalidateAllKeys(); + } } private static final String CURRENT_TIME_KEY = "_ct"; @@ -360,7 +330,9 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang private synchronized void enqueuePotentiallyPrivateEvent(final String[] keys, final Object[] values) { assert values.length + 1 == keys.length; - mCurrentLogUnit.addLogAtom(keys, values, true); + if (isAllowedToLog()) { + mCurrentLogUnit.addLogAtom(keys, values, true); + } } /** @@ -377,7 +349,9 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang */ private synchronized void enqueueEvent(final String[] keys, final Object[] values) { assert values.length + 1 == keys.length; - mCurrentLogUnit.addLogAtom(keys, values, false); + if (isAllowedToLog()) { + mCurrentLogUnit.addLogAtom(keys, values, false); + } } // Used to track how often words are logged. Too-frequent logging can leak @@ -453,131 +427,33 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } private void onWordComplete(String word) { - final boolean isPrivacyThreat = isPrivacyThreat(word); - flushEventQueue(isPrivacyThreat); - if (isPrivacyThreat) { + if (isPrivacyThreat(word)) { + publishLogUnit(mCurrentLogUnit, true); mLoggingFrequencyState.onWordNotLogged(); } else { + publishLogUnit(mCurrentLogUnit, false); mLoggingFrequencyState.onWordLogged(); } + mCurrentLogUnit = new LogUnit(); } - /** - * Write out enqueued LogEvents to the log, possibly dropping privacy sensitive events. - */ - /* package for test */ synchronized void flushEventQueue( - boolean removePotentiallyPrivateEvents) { - if (isAllowedToLog()) { - mCurrentLogUnit.setRemovePotentiallyPrivateEvents(removePotentiallyPrivateEvents); - mLoggingHandler.post(mCurrentLogUnit); + private void publishLogUnit(LogUnit logUnit, boolean isPrivacySensitive) { + if (isPrivacySensitive) { + mMainResearchLog.publishPublicEvents(logUnit); + } else { + mMainResearchLog.publishAllEvents(logUnit); } - mCurrentLogUnit = new LogUnit(); + mIntentionalResearchLogQueue.add(logUnit); } - private synchronized void outputEvent(final String[] keys, final Object[] values) { - 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[] keyboardKeys = (Key[]) value; - mJsonWriter.beginArray(); - for (Key keyboardKey : keyboardKeys) { - mJsonWriter.beginObject(); - mJsonWriter.name("code").value(keyboardKey.mCode); - mJsonWriter.name("altCode").value(keyboardKey.mAltCode); - mJsonWriter.name("x").value(keyboardKey.mX); - mJsonWriter.name("y").value(keyboardKey.mY); - mJsonWriter.name("w").value(keyboardKey.mWidth); - mJsonWriter.name("h").value(keyboardKey.mHeight); - mJsonWriter.endObject(); - } - mJsonWriter.endArray(); - } else if (value instanceof SuggestedWords) { - SuggestedWords words = (SuggestedWords) value; - mJsonWriter.beginObject(); - mJsonWriter.name("typedWordValid").value(words.mTypedWordValid); - mJsonWriter.name("willAutoCorrect").value(words.mWillAutoCorrect); - mJsonWriter.name("isPunctuationSuggestions") - .value(words.mIsPunctuationSuggestions); - 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; - } - } + /* package */ void publishCurrentLogUnit(ResearchLog researchLog, boolean isPrivacySensitive) { + publishLogUnit(mCurrentLogUnit, isPrivacySensitive); } - private static class LogUnit implements Runnable { + static class LogUnit { private final List<String[]> mKeysList = new ArrayList<String[]>(); private final List<Object[]> mValuesList = new ArrayList<Object[]>(); private final List<Boolean> mIsPotentiallyPrivate = new ArrayList<Boolean>(); - private boolean mRemovePotentiallyPrivateEvents = true; private void addLogAtom(final String[] keys, final Object[] values, final Boolean isPotentiallyPrivate) { @@ -586,20 +462,19 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang mIsPotentiallyPrivate.add(isPotentiallyPrivate); } - void setRemovePotentiallyPrivateEvents(boolean removePotentiallyPrivateEvents) { - mRemovePotentiallyPrivateEvents = removePotentiallyPrivateEvents; + public void publishPublicEventsTo(ResearchLog researchLog) { + final int size = mKeysList.size(); + for (int i = 0; i < size; i++) { + if (!mIsPotentiallyPrivate.get(i)) { + researchLog.outputEvent(mKeysList.get(i), mValuesList.get(i)); + } + } } - @Override - public void run() { - final int numAtoms = mKeysList.size(); - for (int atomIndex = 0; atomIndex < numAtoms; atomIndex++) { - if (mRemovePotentiallyPrivateEvents && mIsPotentiallyPrivate.get(atomIndex)) { - continue; - } - final String[] keys = mKeysList.get(atomIndex); - final Object[] values = mValuesList.get(atomIndex); - ResearchLogger.getInstance().outputEvent(keys, values); + public void publishAllEventsTo(ResearchLog researchLog) { + final int size = mKeysList.size(); + for (int i = 0; i < size; i++) { + researchLog.outputEvent(mKeysList.get(i), mValuesList.get(i)); } } } @@ -642,6 +517,9 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang return WORD_REPLACEMENT_STRING; } + private static final String[] EVENTKEYS_INTENTIONAL_LOG = { + "IntentionalLog" + }; private static final String[] EVENTKEYS_LATINKEYBOARDVIEW_PROCESSMOTIONEVENT = { "LatinKeyboardViewProcessMotionEvent", "action", "eventTime", "id", "x", "y", "size", "pressure" @@ -792,7 +670,9 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } final ResearchLogger researchLogger = getInstance(); researchLogger.enqueueEvent(EVENTKEYS_LATINIME_ONWINDOWHIDDEN, values); - researchLogger.flushEventQueue(true); // Play it safe. Remove privacy-sensitive events. + // Play it safe. Remove privacy-sensitive events. + researchLogger.publishLogUnit(researchLogger.mCurrentLogUnit, true); + researchLogger.mCurrentLogUnit = new LogUnit(); } } @@ -804,7 +684,8 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang final SharedPreferences prefs) { if (editorInfo != null) { final Object[] values = { - getUUID(prefs), editorInfo.packageName, Integer.toHexString(editorInfo.inputType), + getInstance().mUUIDString, editorInfo.packageName, + Integer.toHexString(editorInfo.inputType), Integer.toHexString(editorInfo.imeOptions), editorInfo.fieldId, Build.DISPLAY, Build.MODEL, prefs, OUTPUT_FORMAT_VERSION }; diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index f810eccf4..31566bf13 100644 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -153,17 +153,22 @@ public class Suggest { mAutoCorrectionThreshold = threshold; } - // TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder public SuggestedWords getSuggestedWords( final WordComposer wordComposer, CharSequence prevWordForBigram, - final ProximityInfo proximityInfo, final boolean isCorrectionEnabled, - // TODO: remove isPrediction parameter. It effectively means the same thing - // as wordComposer.size() <= 1 - final boolean isPrediction) { + final ProximityInfo proximityInfo, final boolean isCorrectionEnabled) { LatinImeLogger.onStartSuggestion(prevWordForBigram); - final boolean isFirstCharCapitalized = - !isPrediction && wordComposer.isFirstCharCapitalized(); - final boolean isAllUpperCase = !isPrediction && wordComposer.isAllUpperCase(); + if (wordComposer.isBatchMode()) { + return getSuggestedWordsForBatchInput(wordComposer, prevWordForBigram, proximityInfo); + } else { + return getSuggestedWordsForTypingInput(wordComposer, prevWordForBigram, proximityInfo, + isCorrectionEnabled); + } + } + + // Retrieves suggestions for the typing input. + private SuggestedWords getSuggestedWordsForTypingInput( + final WordComposer wordComposer, CharSequence prevWordForBigram, + final ProximityInfo proximityInfo, final boolean isCorrectionEnabled) { final int trailingSingleQuotesCount = wordComposer.trailingSingleQuotesCount(); final BoundedTreeSet suggestionsSet = new BoundedTreeSet(sSuggestedWordInfoComparator, MAX_SUGGESTIONS); @@ -174,34 +179,20 @@ public class Suggest { : typedWord; LatinImeLogger.onAddSuggestedWord(typedWord, Dictionary.TYPE_USER_TYPED); - if (wordComposer.size() <= 1 && isCorrectionEnabled) { - // At first character typed, search only the bigrams - if (!TextUtils.isEmpty(prevWordForBigram)) { - for (final String key : mDictionaries.keySet()) { - final Dictionary dictionary = mDictionaries.get(key); - suggestionsSet.addAll(dictionary.getBigrams(wordComposer, prevWordForBigram)); - } - } - } else if (wordComposer.size() > 1) { - final WordComposer wordComposerForLookup; - if (trailingSingleQuotesCount > 0) { - wordComposerForLookup = new WordComposer(wordComposer); - for (int i = trailingSingleQuotesCount - 1; i >= 0; --i) { - wordComposerForLookup.deleteLast(); - } - } else { - wordComposerForLookup = wordComposer; - } - // At second character typed, search the unigrams (scores being affected by bigrams) - for (final String key : mDictionaries.keySet()) { - // Skip UserUnigramDictionary and WhitelistDictionary to lookup - if (key.equals(Dictionary.TYPE_USER_HISTORY) - || key.equals(Dictionary.TYPE_WHITELIST)) - continue; - final Dictionary dictionary = mDictionaries.get(key); - suggestionsSet.addAll(dictionary.getWords( - wordComposerForLookup, prevWordForBigram, proximityInfo)); + final WordComposer wordComposerForLookup; + if (trailingSingleQuotesCount > 0) { + wordComposerForLookup = new WordComposer(wordComposer); + for (int i = trailingSingleQuotesCount - 1; i >= 0; --i) { + wordComposerForLookup.deleteLast(); } + } else { + wordComposerForLookup = wordComposer; + } + + for (final String key : mDictionaries.keySet()) { + final Dictionary dictionary = mDictionaries.get(key); + suggestionsSet.addAll(dictionary.getSuggestions( + wordComposerForLookup, prevWordForBigram, proximityInfo)); } // TODO: Change this scheme - a boolean is not enough. A whitelisted word may be "valid" @@ -214,10 +205,23 @@ public class Suggest { final CharSequence whitelistedWord = mWhiteListDictionary.getWhitelistedWord(consideredWord); + if (whitelistedWord != null) { + // MAX_SCORE ensures this will be considered strong enough to be auto-corrected + suggestionsSet.add(new SuggestedWordInfo(whitelistedWord, + SuggestedWordInfo.MAX_SCORE, SuggestedWordInfo.KIND_WHITELIST, + Dictionary.TYPE_WHITELIST)); + } final boolean hasAutoCorrection; - if (!isCorrectionEnabled || !allowsToBeAutoCorrected || wordComposer.isMostlyCaps() - || wordComposer.isResumed() || !hasMainDictionary()) { + // TODO: using isCorrectionEnabled here is not very good. It's probably useless, because + // any attempt to do auto-correction is already shielded with a test for this flag; at the + // same time, it feels wrong that the SuggestedWord object includes information about + // the current settings. It may also be useful to know, when the setting is off, whether + // the word *would* have been auto-corrected. + if (!isCorrectionEnabled || !allowsToBeAutoCorrected || !wordComposer.isComposingWord() + || suggestionsSet.isEmpty() + || wordComposer.isMostlyCaps() || wordComposer.isResumed() + || !hasMainDictionary()) { // If we don't have a main dictionary, we never want to auto-correct. The reason for // this is, the user may have a contact whose name happens to match a valid word in // their language, and it will unexpectedly auto-correct. For example, if the user @@ -225,26 +229,16 @@ public class Suggest { // would always auto-correct to "Will" which is unwanted. Hence, no main dict => no // auto-correct. hasAutoCorrection = false; - } else if (null != whitelistedWord) { - hasAutoCorrection = true; - } else if (suggestionsSet.isEmpty()) { - hasAutoCorrection = false; - } else if (AutoCorrection.suggestionExceedsAutoCorrectionThreshold(suggestionsSet.first(), - consideredWord, mAutoCorrectionThreshold)) { - hasAutoCorrection = true; } else { - hasAutoCorrection = false; - } - - if (whitelistedWord != null) { - suggestionsSet.add(new SuggestedWordInfo(whitelistedWord, - SuggestedWordInfo.MAX_SCORE, SuggestedWordInfo.KIND_WHITELIST, - Dictionary.TYPE_WHITELIST)); + hasAutoCorrection = AutoCorrection.suggestionExceedsAutoCorrectionThreshold( + suggestionsSet.first(), consideredWord, mAutoCorrectionThreshold); } final ArrayList<SuggestedWordInfo> suggestionsContainer = new ArrayList<SuggestedWordInfo>(suggestionsSet); final int suggestionsCount = suggestionsContainer.size(); + final boolean isFirstCharCapitalized = wordComposer.isFirstCharCapitalized(); + final boolean isAllUpperCase = wordComposer.isAllUpperCase(); if (isFirstCharCapitalized || isAllUpperCase || 0 != trailingSingleQuotesCount) { for (int i = 0; i < suggestionsCount; ++i) { final SuggestedWordInfo wordInfo = suggestionsContainer.get(i); @@ -278,11 +272,42 @@ public class Suggest { // TODO: this first argument is lying. If this is a whitelisted word which is an // actual word, it says typedWordValid = false, which looks wrong. We should either // rename the attribute or change the value. - !isPrediction && !allowsToBeAutoCorrected /* typedWordValid */, - !isPrediction && hasAutoCorrection, /* willAutoCorrect */ + !allowsToBeAutoCorrected /* typedWordValid */, + hasAutoCorrection, /* willAutoCorrect */ + false /* isPunctuationSuggestions */, + false /* isObsoleteSuggestions */, + !wordComposer.isComposingWord() /* isPrediction */); + } + + // Retrieves suggestions for the batch input. + private SuggestedWords getSuggestedWordsForBatchInput( + final WordComposer wordComposer, CharSequence prevWordForBigram, + final ProximityInfo proximityInfo) { + final BoundedTreeSet suggestionsSet = new BoundedTreeSet(sSuggestedWordInfoComparator, + MAX_SUGGESTIONS); + + // At second character typed, search the unigrams (scores being affected by bigrams) + for (final String key : mDictionaries.keySet()) { + // Skip UserUnigramDictionary and WhitelistDictionary to lookup + if (key.equals(Dictionary.TYPE_USER_HISTORY) + || key.equals(Dictionary.TYPE_WHITELIST)) { + continue; + } + final Dictionary dictionary = mDictionaries.get(key); + suggestionsSet.addAll(dictionary.getSuggestions( + wordComposer, prevWordForBigram, proximityInfo)); + } + + final ArrayList<SuggestedWordInfo> suggestionsContainer = + new ArrayList<SuggestedWordInfo>(suggestionsSet); + + SuggestedWordInfo.removeDups(suggestionsContainer); + return new SuggestedWords(suggestionsContainer, + true /* typedWordValid */, + true /* willAutoCorrect */, false /* isPunctuationSuggestions */, false /* isObsoleteSuggestions */, - isPrediction); + false /* isPrediction */); } private static ArrayList<SuggestedWordInfo> getSuggestionsInfoListWithDebugInfo( diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java index f079c2112..88fc006df 100644 --- a/java/src/com/android/inputmethod/latin/SuggestedWords.java +++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java @@ -125,6 +125,7 @@ public class SuggestedWords { public static final int KIND_HARDCODED = 5; // Hardcoded suggestion, e.g. punctuation public static final int KIND_APP_DEFINED = 6; // Suggested by the application public static final int KIND_SHORTCUT = 7; // A shortcut + public static final int KIND_PREDICTION = 8; // A prediction (== a suggestion with no input) public final String mWord; public final int mScore; public final int mKind; // one of the KIND_* constants above diff --git a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/SynchronouslyLoadedContactsBinaryDictionary.java index 9b20bd690..bdd988df2 100644 --- a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedContactsBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/SynchronouslyLoadedContactsBinaryDictionary.java @@ -32,10 +32,10 @@ public class SynchronouslyLoadedContactsBinaryDictionary extends ContactsBinaryD } @Override - public synchronized ArrayList<SuggestedWordInfo> getWords(final WordComposer codes, + public synchronized ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer codes, final CharSequence prevWordForBigrams, final ProximityInfo proximityInfo) { syncReloadDictionaryIfRequired(); - return getWordsInner(codes, prevWordForBigrams, proximityInfo); + return super.getSuggestions(codes, prevWordForBigrams, proximityInfo); } @Override diff --git a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java b/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java index 5b2a6edec..b8cfddd4e 100644 --- a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java @@ -35,10 +35,10 @@ public class SynchronouslyLoadedUserBinaryDictionary extends UserBinaryDictionar } @Override - public synchronized ArrayList<SuggestedWordInfo> getWords(final WordComposer codes, + public synchronized ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer codes, final CharSequence prevWordForBigrams, final ProximityInfo proximityInfo) { syncReloadDictionaryIfRequired(); - return getWordsInner(codes, prevWordForBigrams, proximityInfo); + return super.getSuggestions(codes, prevWordForBigrams, proximityInfo); } @Override diff --git a/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java index 73fa83f9a..3bb670c9a 100644 --- a/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java +++ b/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java @@ -27,9 +27,12 @@ import android.os.AsyncTask; import android.provider.BaseColumns; import android.util.Log; +import com.android.inputmethod.keyboard.ProximityInfo; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.UserHistoryForgettingCurveUtils.ForgettingCurveParams; import java.lang.ref.SoftReference; +import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantLock; @@ -157,6 +160,14 @@ public class UserHistoryDictionary extends ExpandableDictionary { // super.close(); } + @Override + protected ArrayList<SuggestedWordInfo> getWordsInner(final WordComposer composer, + final CharSequence prevWord, final ProximityInfo proximityInfo) { + // Inhibit suggestions (not predictions) for user history for now. Removing this method + // is enough to use it through the standard ExpandableDictionary way. + return null; + } + /** * Return whether the passed charsequence is in the dictionary. */ diff --git a/java/src/com/android/inputmethod/latin/WhitelistDictionary.java b/java/src/com/android/inputmethod/latin/WhitelistDictionary.java index 3af22140e..14476dcf0 100644 --- a/java/src/com/android/inputmethod/latin/WhitelistDictionary.java +++ b/java/src/com/android/inputmethod/latin/WhitelistDictionary.java @@ -22,8 +22,11 @@ import android.text.TextUtils; import android.util.Log; import android.util.Pair; +import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.LocaleUtils.RunInLocale; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import java.util.ArrayList; import java.util.HashMap; import java.util.Locale; @@ -88,6 +91,13 @@ public class WhitelistDictionary extends ExpandableDictionary { return null; } + @Override + public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, + final CharSequence prevWord, final ProximityInfo proximityInfo) { + // Whitelist does not supply any suggestions or predictions. + return null; + } + // See LatinIME#updateSuggestions. This breaks in the (queer) case that the whitelist // lists that word a should autocorrect to word b, and word c would autocorrect to // an upper-cased version of a. In this case, the way this return value is used would diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index bfa41c784..25e29008e 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -37,6 +37,7 @@ public class WordComposer { private final StringBuilder mTypedWord; private CharSequence mAutoCorrection; private boolean mIsResumed; + private boolean mIsBatchMode; // Cache these values for performance private int mCapsCount; @@ -55,6 +56,7 @@ public class WordComposer { mAutoCorrection = null; mTrailingSingleQuotesCount = 0; mIsResumed = false; + mIsBatchMode = false; refreshSize(); } @@ -67,6 +69,7 @@ public class WordComposer { mAutoCapitalized = source.mAutoCapitalized; mTrailingSingleQuotesCount = source.mTrailingSingleQuotesCount; mIsResumed = source.mIsResumed; + mIsBatchMode = source.mIsBatchMode; refreshSize(); } @@ -80,6 +83,7 @@ public class WordComposer { mIsFirstCharCapitalized = false; mTrailingSingleQuotesCount = 0; mIsResumed = false; + mIsBatchMode = false; refreshSize(); } @@ -140,6 +144,12 @@ public class WordComposer { mAutoCorrection = null; } + // TODO: We may want to have appendBatchInputPointers() as well. + public void setBatchInputPointers(InputPointers batchPointers) { + mInputPointers.copy(batchPointers); + mIsBatchMode = true; + } + /** * Internal method to retrieve reasonable proximity info for a character. */ @@ -295,7 +305,11 @@ public class WordComposer { && type != LastComposedWord.COMMIT_TYPE_MANUAL_PICK) { lastComposedWord.deactivate(); } + mCapsCount = 0; + mIsBatchMode = false; mTypedWord.setLength(0); + mTrailingSingleQuotesCount = 0; + mIsFirstCharCapitalized = false; refreshSize(); mAutoCorrection = null; mIsResumed = false; @@ -311,4 +325,8 @@ public class WordComposer { mAutoCorrection = null; // This will be filled by the next call to updateSuggestion. mIsResumed = true; } + + public boolean isBatchMode() { + return mIsBatchMode; + } } diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java index 5332c066a..3bdfe1f27 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java @@ -20,14 +20,9 @@ import android.content.Intent; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.service.textservice.SpellCheckerService; -import android.text.TextUtils; import android.util.Log; -import android.util.LruCache; -import android.view.textservice.SentenceSuggestionsInfo; import android.view.textservice.SuggestionsInfo; -import android.view.textservice.TextInfo; -import com.android.inputmethod.compat.SuggestionsInfoCompatUtils; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.BinaryDictionary; import com.android.inputmethod.latin.ContactsBinaryDictionary; @@ -37,12 +32,10 @@ import com.android.inputmethod.latin.DictionaryFactory; import com.android.inputmethod.latin.LocaleUtils; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.StringUtils; -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.SynchronouslyLoadedContactsBinaryDictionary; import com.android.inputmethod.latin.SynchronouslyLoadedUserBinaryDictionary; import com.android.inputmethod.latin.UserBinaryDictionary; import com.android.inputmethod.latin.WhitelistDictionary; -import com.android.inputmethod.latin.WordComposer; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -65,9 +58,9 @@ public class AndroidSpellCheckerService extends SpellCheckerService public static final String PREF_USE_CONTACTS_KEY = "pref_spellcheck_use_contacts"; - private static final int CAPITALIZE_NONE = 0; // No caps, or mixed case - private static final int CAPITALIZE_FIRST = 1; // First only - private static final int CAPITALIZE_ALL = 2; // All caps + public static final int CAPITALIZE_NONE = 0; // No caps, or mixed case + public static final int CAPITALIZE_FIRST = 1; // First only + public static final int CAPITALIZE_ALL = 2; // All caps private final static String[] EMPTY_STRING_ARRAY = new String[0]; private Map<String, DictionaryPool> mDictionaryPools = @@ -91,8 +84,8 @@ public class AndroidSpellCheckerService extends SpellCheckerService public static final int SCRIPT_LATIN = 0; public static final int SCRIPT_CYRILLIC = 1; - private static final String SINGLE_QUOTE = "\u0027"; - private static final String APOSTROPHE = "\u2019"; + public static final String SINGLE_QUOTE = "\u0027"; + public static final String APOSTROPHE = "\u2019"; private static final TreeMap<String, Integer> mLanguageToScript; static { // List of the supported languages and their associated script. We won't check @@ -129,7 +122,7 @@ public class AndroidSpellCheckerService extends SpellCheckerService onSharedPreferenceChanged(prefs, PREF_USE_CONTACTS_KEY); } - private static int getScriptFromLocale(final Locale locale) { + public static int getScriptFromLocale(final Locale locale) { final Integer script = mLanguageToScript.get(locale.getLanguage()); if (null == script) { throw new RuntimeException("We have been called with an unsupported language: \"" @@ -191,20 +184,27 @@ public class AndroidSpellCheckerService extends SpellCheckerService @Override public Session createSession() { - return new AndroidSpellCheckerSession(this); + // Should not refer to AndroidSpellCheckerSession directly considering + // that AndroidSpellCheckerSession may be overlaid. + return AndroidSpellCheckerSessionFactory.newInstance(this); } - private static SuggestionsInfo getNotInDictEmptySuggestions() { + public static SuggestionsInfo getNotInDictEmptySuggestions() { return new SuggestionsInfo(0, EMPTY_STRING_ARRAY); } - private static SuggestionsInfo getInDictEmptySuggestions() { + public static SuggestionsInfo getInDictEmptySuggestions() { return new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY, EMPTY_STRING_ARRAY); } + public SuggestionsGatherer newSuggestionsGatherer(final String text, int maxLength) { + return new SuggestionsGatherer( + text, mSuggestionThreshold, mRecommendedThreshold, maxLength); + } + // TODO: remove this class and replace it by storage local to the session. - private static class SuggestionsGatherer { + public static class SuggestionsGatherer { public static class Result { public final String[] mSuggestions; public final boolean mHasRecommendedSuggestions; @@ -396,7 +396,7 @@ public class AndroidSpellCheckerService extends SpellCheckerService }.start(); } - private DictionaryPool getDictionaryPool(final String locale) { + public DictionaryPool getDictionaryPool(final String locale) { DictionaryPool pool = mDictionaryPools.get(locale); if (null == pool) { final Locale localeObject = LocaleUtils.constructLocaleFromString(locale); @@ -447,7 +447,7 @@ public class AndroidSpellCheckerService extends SpellCheckerService } // This method assumes the text is not empty or null. - private static int getCapitalizationType(String text) { + public static int getCapitalizationType(String text) { // If the first char is not uppercase, then the word is either all lower case, // and in either case we return CAPITALIZE_NONE. if (!Character.isUpperCase(text.codePointAt(0))) return CAPITALIZE_NONE; @@ -464,379 +464,4 @@ public class AndroidSpellCheckerService extends SpellCheckerService if (1 == capsCount) return CAPITALIZE_FIRST; return (len == capsCount ? CAPITALIZE_ALL : CAPITALIZE_NONE); } - - private static class AndroidSpellCheckerSession extends Session { - // Immutable, but need the locale which is not available in the constructor yet - private DictionaryPool mDictionaryPool; - // Likewise - private Locale mLocale; - // Cache this for performance - private int mScript; // One of SCRIPT_LATIN or SCRIPT_CYRILLIC for now. - - private final AndroidSpellCheckerService mService; - - private final SuggestionsCache mSuggestionsCache = new SuggestionsCache(); - - private static class SuggestionsParams { - public final String[] mSuggestions; - public final int mFlags; - public SuggestionsParams(String[] suggestions, int flags) { - mSuggestions = suggestions; - mFlags = flags; - } - } - - private static class SuggestionsCache { - private static final char CHAR_DELIMITER = '\uFFFC'; - private static final int MAX_CACHE_SIZE = 50; - private final LruCache<String, SuggestionsParams> mUnigramSuggestionsInfoCache = - new LruCache<String, SuggestionsParams>(MAX_CACHE_SIZE); - - // 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)); - } - - // 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( - generateKey(query, prevWord), new SuggestionsParams(suggestions, flags)); - } - } - - AndroidSpellCheckerSession(final AndroidSpellCheckerService service) { - mService = service; - } - - @Override - public void onCreate() { - final String localeString = getLocale(); - mDictionaryPool = mService.getDictionaryPool(localeString); - mLocale = LocaleUtils.constructLocaleFromString(localeString); - mScript = getScriptFromLocale(mLocale); - } - - /* - * Returns whether the code point is a letter that makes sense for the specified - * locale for this spell checker. - * The dictionaries supported by Latin IME are described in res/xml/spellchecker.xml - * and is limited to EFIGS languages and Russian. - * Hence at the moment this explicitly tests for Cyrillic characters or Latin characters - * as appropriate, and explicitly excludes CJK, Arabic and Hebrew characters. - */ - private static boolean isLetterCheckableByLanguage(final int codePoint, - final int script) { - switch (script) { - case SCRIPT_LATIN: - // Our supported latin script dictionaries (EFIGS) at the moment only include - // characters in the C0, C1, Latin Extended A and B, IPA extensions unicode - // blocks. As it happens, those are back-to-back in the code range 0x40 to 0x2AF, - // so the below is a very efficient way to test for it. As for the 0-0x3F, it's - // excluded from isLetter anyway. - return codePoint <= 0x2AF && Character.isLetter(codePoint); - case SCRIPT_CYRILLIC: - // All Cyrillic characters are in the 400~52F block. There are some in the upper - // Unicode range, but they are archaic characters that are not used in modern - // russian and are not used by our dictionary. - return codePoint >= 0x400 && codePoint <= 0x52F && Character.isLetter(codePoint); - default: - // Should never come here - throw new RuntimeException("Impossible value of script: " + script); - } - } - - /** - * Finds out whether a particular string should be filtered out of spell checking. - * - * This will loosely match URLs, numbers, symbols. To avoid always underlining words that - * we know we will never recognize, this accepts a script identifier that should be one - * of the SCRIPT_* constants defined above, to rule out quickly characters from very - * different languages. - * - * @param text the string to evaluate. - * @param script the identifier for the script this spell checker recognizes - * @return true if we should filter this text out, false otherwise - */ - private static boolean shouldFilterOut(final String text, final int script) { - if (TextUtils.isEmpty(text) || text.length() <= 1) return true; - - // TODO: check if an equivalent processing can't be done more quickly with a - // compiled regexp. - // Filter by first letter - final int firstCodePoint = text.codePointAt(0); - // Filter out words that don't start with a letter or an apostrophe - if (!isLetterCheckableByLanguage(firstCodePoint, script) - && '\'' != firstCodePoint) return true; - - // Filter contents - final int length = text.length(); - int letterCount = 0; - for (int i = 0; i < length; i = text.offsetByCodePoints(i, 1)) { - final int codePoint = text.codePointAt(i); - // Any word containing a '@' is probably an e-mail address - // Any word containing a '/' is probably either an ad-hoc combination of two - // words or a URI - in either case we don't want to spell check that - if ('@' == codePoint || '/' == codePoint) return true; - if (isLetterCheckableByLanguage(codePoint, script)) ++letterCount; - } - // Guestimate heuristic: perform spell checking if at least 3/4 of the characters - // in this word are letters - return (letterCount * 4 < length * 3); - } - - private SentenceSuggestionsInfo fixWronglyInvalidatedWordWithSingleQuote( - TextInfo ti, SentenceSuggestionsInfo ssi) { - final String typedText = ti.getText(); - if (!typedText.contains(SINGLE_QUOTE)) { - return null; - } - final int N = ssi.getSuggestionsCount(); - final ArrayList<Integer> additionalOffsets = new ArrayList<Integer>(); - 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(); - if ((flags & SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY) == 0) { - continue; - } - 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; - } - final String[] splitTexts = subText.split(SINGLE_QUOTE, -1); - if (splitTexts == null || splitTexts.length <= 1) { - continue; - } - final int splitNum = splitTexts.length; - for (int j = 0; j < splitNum; ++j) { - final String splitText = splitTexts[j]; - if (TextUtils.isEmpty(splitText)) { - continue; - } - if (mSuggestionsCache.getSuggestionsFromCache( - splitText, prevWord) == null) { - continue; - } - final int newLength = splitText.length(); - // Neither RESULT_ATTR_IN_THE_DICTIONARY nor RESULT_ATTR_LOOKS_LIKE_TYPO - final int newFlags = 0; - final SuggestionsInfo newSi = new SuggestionsInfo(newFlags, EMPTY_STRING_ARRAY); - newSi.setCookieAndSequence(si.getCookie(), si.getSequence()); - if (DBG) { - Log.d(TAG, "Override and remove old span over: " - + splitText + ", " + offset + "," + newLength); - } - additionalOffsets.add(offset); - additionalLengths.add(newLength); - additionalSuggestionsInfos.add(newSi); - } - } - final int additionalSize = additionalOffsets.size(); - if (additionalSize <= 0) { - return null; - } - final int suggestionsSize = N + additionalSize; - final int[] newOffsets = new int[suggestionsSize]; - final int[] newLengths = new int[suggestionsSize]; - final SuggestionsInfo[] newSuggestionsInfos = new SuggestionsInfo[suggestionsSize]; - int i; - for (i = 0; i < N; ++i) { - newOffsets[i] = ssi.getOffsetAt(i); - newLengths[i] = ssi.getLengthAt(i); - newSuggestionsInfos[i] = ssi.getSuggestionsInfoAt(i); - } - for (; i < suggestionsSize; ++i) { - newOffsets[i] = additionalOffsets.get(i - N); - newLengths[i] = additionalLengths.get(i - N); - newSuggestionsInfos[i] = additionalSuggestionsInfos.get(i - N); - } - return new SentenceSuggestionsInfo(newSuggestionsInfos, newOffsets, newLengths); - } - - @Override - public SentenceSuggestionsInfo[] onGetSentenceSuggestionsMultiple( - TextInfo[] textInfos, int suggestionsLimit) { - final SentenceSuggestionsInfo[] retval = super.onGetSentenceSuggestionsMultiple( - textInfos, suggestionsLimit); - if (retval == null || retval.length != textInfos.length) { - return retval; - } - for (int i = 0; i < retval.length; ++i) { - final SentenceSuggestionsInfo tempSsi = - fixWronglyInvalidatedWordWithSingleQuote(textInfos[i], retval[i]); - if (tempSsi != null) { - retval[i] = tempSsi; - } - } - return retval; - } - - @Override - public SuggestionsInfo[] onGetSuggestionsMultiple(TextInfo[] textInfos, - int suggestionsLimit, boolean sequentialWords) { - final int length = textInfos.length; - final SuggestionsInfo[] retval = new SuggestionsInfo[length]; - for (int i = 0; i < length; ++i) { - final String prevWord; - if (sequentialWords && i > 0) { - final String prevWordCandidate = textInfos[i - 1].getText(); - // Note that an empty string would be used to indicate the initial word - // in the future. - prevWord = TextUtils.isEmpty(prevWordCandidate) ? null : prevWordCandidate; - } else { - prevWord = null; - } - retval[i] = onGetSuggestions(textInfos[i], prevWord, suggestionsLimit); - retval[i].setCookieAndSequence( - textInfos[i].getCookie(), textInfos[i].getSequence()); - } - return retval; - } - - // Note : this must be reentrant - /** - * Gets a list of suggestions for a specific string. This returns a list of possible - * corrections for the text passed as an argument. It may split or group words, and - * even perform grammatical analysis. - */ - @Override - public SuggestionsInfo onGetSuggestions(final TextInfo textInfo, - final int suggestionsLimit) { - return onGetSuggestions(textInfo, null, suggestionsLimit); - } - - private SuggestionsInfo onGetSuggestions( - final TextInfo textInfo, final String prevWord, final int suggestionsLimit) { - try { - final String inText = textInfo.getText(); - final SuggestionsParams cachedSuggestionsParams = - mSuggestionsCache.getSuggestionsFromCache(inText, prevWord); - if (cachedSuggestionsParams != null) { - if (DBG) { - Log.d(TAG, "Cache hit: " + inText + ", " + cachedSuggestionsParams.mFlags); - } - return new SuggestionsInfo( - cachedSuggestionsParams.mFlags, cachedSuggestionsParams.mSuggestions); - } - - if (shouldFilterOut(inText, mScript)) { - DictAndProximity dictInfo = null; - try { - dictInfo = mDictionaryPool.takeOrGetNull(); - if (null == dictInfo) return getNotInDictEmptySuggestions(); - return dictInfo.mDictionary.isValidWord(inText) ? - getInDictEmptySuggestions() : getNotInDictEmptySuggestions(); - } finally { - if (null != dictInfo) { - if (!mDictionaryPool.offer(dictInfo)) { - Log.e(TAG, "Can't re-insert a dictionary into its pool"); - } - } - } - } - final String text = inText.replaceAll(APOSTROPHE, SINGLE_QUOTE); - - // TODO: Don't gather suggestions if the limit is <= 0 unless necessary - final SuggestionsGatherer suggestionsGatherer = new SuggestionsGatherer(text, - mService.mSuggestionThreshold, mService.mRecommendedThreshold, - suggestionsLimit); - final WordComposer composer = new WordComposer(); - final int length = text.length(); - for (int i = 0; i < length; i = text.offsetByCodePoints(i, 1)) { - final int codePoint = text.codePointAt(i); - // The getXYForCodePointAndScript method returns (Y << 16) + X - final int xy = SpellCheckerProximityInfo.getXYForCodePointAndScript( - codePoint, mScript); - if (SpellCheckerProximityInfo.NOT_A_COORDINATE_PAIR == xy) { - composer.add(codePoint, WordComposer.NOT_A_COORDINATE, - WordComposer.NOT_A_COORDINATE); - } else { - composer.add(codePoint, xy & 0xFFFF, xy >> 16); - } - } - - final int capitalizeType = getCapitalizationType(text); - boolean isInDict = true; - DictAndProximity dictInfo = null; - try { - dictInfo = mDictionaryPool.takeOrGetNull(); - if (null == dictInfo) return getNotInDictEmptySuggestions(); - final ArrayList<SuggestedWordInfo> suggestions = dictInfo.mDictionary.getWords( - composer, prevWord, dictInfo.mProximityInfo); - for (final SuggestedWordInfo suggestion : suggestions) { - final String suggestionStr = suggestion.mWord.toString(); - suggestionsGatherer.addWord(suggestionStr.toCharArray(), null, 0, - suggestionStr.length(), suggestion.mScore); - } - isInDict = dictInfo.mDictionary.isValidWord(text); - if (!isInDict && CAPITALIZE_NONE != capitalizeType) { - // We want to test the word again if it's all caps or first caps only. - // If it's fully down, we already tested it, if it's mixed case, we don't - // want to test a lowercase version of it. - isInDict = dictInfo.mDictionary.isValidWord(text.toLowerCase(mLocale)); - } - } finally { - if (null != dictInfo) { - if (!mDictionaryPool.offer(dictInfo)) { - Log.e(TAG, "Can't re-insert a dictionary into its pool"); - } - } - } - - final SuggestionsGatherer.Result result = suggestionsGatherer.getResults( - capitalizeType, mLocale); - - if (DBG) { - Log.i(TAG, "Spell checking results for " + text + " with suggestion limit " - + suggestionsLimit); - Log.i(TAG, "IsInDict = " + isInDict); - Log.i(TAG, "LooksLikeTypo = " + (!isInDict)); - Log.i(TAG, "HasRecommendedSuggestions = " + result.mHasRecommendedSuggestions); - if (null != result.mSuggestions) { - for (String suggestion : result.mSuggestions) { - Log.i(TAG, suggestion); - } - } - } - - final int flags = - (isInDict ? SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY - : SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO) - | (result.mHasRecommendedSuggestions - ? SuggestionsInfoCompatUtils - .getValueOf_RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS() - : 0); - final SuggestionsInfo retval = new SuggestionsInfo(flags, result.mSuggestions); - 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 - if (DBG) { - throw e; - } else { - Log.e(TAG, "Exception while spellcheking: " + e); - return getNotInDictEmptySuggestions(); - } - } - } - } } diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java new file mode 100644 index 000000000..501a0e221 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin.spellcheck; + +import android.text.TextUtils; +import android.util.Log; +import android.view.textservice.SentenceSuggestionsInfo; +import android.view.textservice.SuggestionsInfo; +import android.view.textservice.TextInfo; + +import java.util.ArrayList; + +public class AndroidSpellCheckerSession extends AndroidWordLevelSpellCheckerSession { + private static final String TAG = AndroidSpellCheckerSession.class.getSimpleName(); + private static final boolean DBG = false; + private final static String[] EMPTY_STRING_ARRAY = new String[0]; + + public AndroidSpellCheckerSession(AndroidSpellCheckerService service) { + super(service); + } + + private SentenceSuggestionsInfo fixWronglyInvalidatedWordWithSingleQuote(TextInfo ti, + SentenceSuggestionsInfo ssi) { + final String typedText = ti.getText(); + if (!typedText.contains(AndroidSpellCheckerService.SINGLE_QUOTE)) { + return null; + } + final int N = ssi.getSuggestionsCount(); + final ArrayList<Integer> additionalOffsets = new ArrayList<Integer>(); + 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(); + if ((flags & SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY) == 0) { + continue; + } + 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(AndroidSpellCheckerService.SINGLE_QUOTE)) { + continue; + } + final String[] splitTexts = + subText.split(AndroidSpellCheckerService.SINGLE_QUOTE, -1); + if (splitTexts == null || splitTexts.length <= 1) { + continue; + } + final int splitNum = splitTexts.length; + for (int j = 0; j < splitNum; ++j) { + final String splitText = splitTexts[j]; + if (TextUtils.isEmpty(splitText)) { + continue; + } + if (mSuggestionsCache.getSuggestionsFromCache(splitText, prevWord) == null) { + continue; + } + final int newLength = splitText.length(); + // Neither RESULT_ATTR_IN_THE_DICTIONARY nor RESULT_ATTR_LOOKS_LIKE_TYPO + final int newFlags = 0; + final SuggestionsInfo newSi = + new SuggestionsInfo(newFlags, EMPTY_STRING_ARRAY); + newSi.setCookieAndSequence(si.getCookie(), si.getSequence()); + if (DBG) { + Log.d(TAG, "Override and remove old span over: " + splitText + ", " + + offset + "," + newLength); + } + additionalOffsets.add(offset); + additionalLengths.add(newLength); + additionalSuggestionsInfos.add(newSi); + } + } + final int additionalSize = additionalOffsets.size(); + if (additionalSize <= 0) { + return null; + } + final int suggestionsSize = N + additionalSize; + final int[] newOffsets = new int[suggestionsSize]; + final int[] newLengths = new int[suggestionsSize]; + final SuggestionsInfo[] newSuggestionsInfos = new SuggestionsInfo[suggestionsSize]; + int i; + for (i = 0; i < N; ++i) { + newOffsets[i] = ssi.getOffsetAt(i); + newLengths[i] = ssi.getLengthAt(i); + newSuggestionsInfos[i] = ssi.getSuggestionsInfoAt(i); + } + for (; i < suggestionsSize; ++i) { + newOffsets[i] = additionalOffsets.get(i - N); + newLengths[i] = additionalLengths.get(i - N); + newSuggestionsInfos[i] = additionalSuggestionsInfos.get(i - N); + } + return new SentenceSuggestionsInfo(newSuggestionsInfos, newOffsets, newLengths); + } + + @Override + public SentenceSuggestionsInfo[] onGetSentenceSuggestionsMultiple(TextInfo[] textInfos, + int suggestionsLimit) { + final SentenceSuggestionsInfo[] retval = + super.onGetSentenceSuggestionsMultiple(textInfos, suggestionsLimit); + if (retval == null || retval.length != textInfos.length) { + return retval; + } + for (int i = 0; i < retval.length; ++i) { + final SentenceSuggestionsInfo tempSsi = + fixWronglyInvalidatedWordWithSingleQuote(textInfos[i], retval[i]); + if (tempSsi != null) { + retval[i] = tempSsi; + } + } + return retval; + } + + @Override + public SuggestionsInfo[] onGetSuggestionsMultiple(TextInfo[] textInfos, + int suggestionsLimit, boolean sequentialWords) { + final int length = textInfos.length; + final SuggestionsInfo[] retval = new SuggestionsInfo[length]; + for (int i = 0; i < length; ++i) { + final String prevWord; + if (sequentialWords && i > 0) { + final String prevWordCandidate = textInfos[i - 1].getText(); + // Note that an empty string would be used to indicate the initial word + // in the future. + prevWord = TextUtils.isEmpty(prevWordCandidate) ? null : prevWordCandidate; + } else { + prevWord = null; + } + retval[i] = onGetSuggestions(textInfos[i], prevWord, suggestionsLimit); + retval[i].setCookieAndSequence(textInfos[i].getCookie(), + textInfos[i].getSequence()); + } + return retval; + } +} diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSessionFactory.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSessionFactory.java new file mode 100644 index 000000000..8eb1eb68e --- /dev/null +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSessionFactory.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin.spellcheck; + +import android.service.textservice.SpellCheckerService.Session; + +public abstract class AndroidSpellCheckerSessionFactory { + public static Session newInstance(AndroidSpellCheckerService service) { + return new AndroidSpellCheckerSession(service); + } +} diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java new file mode 100644 index 000000000..0171dc06d --- /dev/null +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java @@ -0,0 +1,302 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin.spellcheck; + +import android.service.textservice.SpellCheckerService.Session; +import android.text.TextUtils; +import android.util.Log; +import android.util.LruCache; +import android.view.textservice.SuggestionsInfo; +import android.view.textservice.TextInfo; + +import com.android.inputmethod.compat.SuggestionsInfoCompatUtils; +import com.android.inputmethod.latin.LocaleUtils; +import com.android.inputmethod.latin.WordComposer; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import com.android.inputmethod.latin.spellcheck.AndroidSpellCheckerService.SuggestionsGatherer; + +import java.util.ArrayList; +import java.util.Locale; + +public abstract class AndroidWordLevelSpellCheckerSession extends Session { + private static final String TAG = AndroidWordLevelSpellCheckerSession.class.getSimpleName(); + private static final boolean DBG = false; + + // Immutable, but need the locale which is not available in the constructor yet + private DictionaryPool mDictionaryPool; + // Likewise + private Locale mLocale; + // Cache this for performance + private int mScript; // One of SCRIPT_LATIN or SCRIPT_CYRILLIC for now. + private final AndroidSpellCheckerService mService; + protected final SuggestionsCache mSuggestionsCache = new SuggestionsCache(); + + private static class SuggestionsParams { + public final String[] mSuggestions; + public final int mFlags; + public SuggestionsParams(String[] suggestions, int flags) { + mSuggestions = suggestions; + mFlags = flags; + } + } + + protected static class SuggestionsCache { + private static final char CHAR_DELIMITER = '\uFFFC'; + private static final int MAX_CACHE_SIZE = 50; + private final LruCache<String, SuggestionsParams> mUnigramSuggestionsInfoCache = + new LruCache<String, SuggestionsParams>(MAX_CACHE_SIZE); + + // 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)); + } + + // 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( + generateKey(query, prevWord), new SuggestionsParams(suggestions, flags)); + } + } + + AndroidWordLevelSpellCheckerSession(final AndroidSpellCheckerService service) { + mService = service; + } + + @Override + public void onCreate() { + final String localeString = getLocale(); + mDictionaryPool = mService.getDictionaryPool(localeString); + mLocale = LocaleUtils.constructLocaleFromString(localeString); + mScript = AndroidSpellCheckerService.getScriptFromLocale(mLocale); + } + + /* + * Returns whether the code point is a letter that makes sense for the specified + * locale for this spell checker. + * The dictionaries supported by Latin IME are described in res/xml/spellchecker.xml + * and is limited to EFIGS languages and Russian. + * Hence at the moment this explicitly tests for Cyrillic characters or Latin characters + * as appropriate, and explicitly excludes CJK, Arabic and Hebrew characters. + */ + private static boolean isLetterCheckableByLanguage(final int codePoint, + final int script) { + switch (script) { + case AndroidSpellCheckerService.SCRIPT_LATIN: + // Our supported latin script dictionaries (EFIGS) at the moment only include + // characters in the C0, C1, Latin Extended A and B, IPA extensions unicode + // blocks. As it happens, those are back-to-back in the code range 0x40 to 0x2AF, + // so the below is a very efficient way to test for it. As for the 0-0x3F, it's + // excluded from isLetter anyway. + return codePoint <= 0x2AF && Character.isLetter(codePoint); + case AndroidSpellCheckerService.SCRIPT_CYRILLIC: + // All Cyrillic characters are in the 400~52F block. There are some in the upper + // Unicode range, but they are archaic characters that are not used in modern + // russian and are not used by our dictionary. + return codePoint >= 0x400 && codePoint <= 0x52F && Character.isLetter(codePoint); + default: + // Should never come here + throw new RuntimeException("Impossible value of script: " + script); + } + } + + /** + * Finds out whether a particular string should be filtered out of spell checking. + * + * This will loosely match URLs, numbers, symbols. To avoid always underlining words that + * we know we will never recognize, this accepts a script identifier that should be one + * of the SCRIPT_* constants defined above, to rule out quickly characters from very + * different languages. + * + * @param text the string to evaluate. + * @param script the identifier for the script this spell checker recognizes + * @return true if we should filter this text out, false otherwise + */ + private static boolean shouldFilterOut(final String text, final int script) { + if (TextUtils.isEmpty(text) || text.length() <= 1) return true; + + // TODO: check if an equivalent processing can't be done more quickly with a + // compiled regexp. + // Filter by first letter + final int firstCodePoint = text.codePointAt(0); + // Filter out words that don't start with a letter or an apostrophe + if (!isLetterCheckableByLanguage(firstCodePoint, script) + && '\'' != firstCodePoint) return true; + + // Filter contents + final int length = text.length(); + int letterCount = 0; + for (int i = 0; i < length; i = text.offsetByCodePoints(i, 1)) { + final int codePoint = text.codePointAt(i); + // Any word containing a '@' is probably an e-mail address + // Any word containing a '/' is probably either an ad-hoc combination of two + // words or a URI - in either case we don't want to spell check that + if ('@' == codePoint || '/' == codePoint) return true; + if (isLetterCheckableByLanguage(codePoint, script)) ++letterCount; + } + // Guestimate heuristic: perform spell checking if at least 3/4 of the characters + // in this word are letters + return (letterCount * 4 < length * 3); + } + + // Note : this must be reentrant + /** + * Gets a list of suggestions for a specific string. This returns a list of possible + * corrections for the text passed as an argument. It may split or group words, and + * even perform grammatical analysis. + */ + @Override + public SuggestionsInfo onGetSuggestions(final TextInfo textInfo, + final int suggestionsLimit) { + return onGetSuggestions(textInfo, null, suggestionsLimit); + } + + protected SuggestionsInfo onGetSuggestions( + final TextInfo textInfo, final String prevWord, final int suggestionsLimit) { + try { + final String inText = textInfo.getText(); + final SuggestionsParams cachedSuggestionsParams = + mSuggestionsCache.getSuggestionsFromCache(inText, prevWord); + if (cachedSuggestionsParams != null) { + if (DBG) { + Log.d(TAG, "Cache hit: " + inText + ", " + cachedSuggestionsParams.mFlags); + } + return new SuggestionsInfo( + cachedSuggestionsParams.mFlags, cachedSuggestionsParams.mSuggestions); + } + + if (shouldFilterOut(inText, mScript)) { + DictAndProximity dictInfo = null; + try { + dictInfo = mDictionaryPool.takeOrGetNull(); + if (null == dictInfo) { + return AndroidSpellCheckerService.getNotInDictEmptySuggestions(); + } + return dictInfo.mDictionary.isValidWord(inText) + ? AndroidSpellCheckerService.getInDictEmptySuggestions() + : AndroidSpellCheckerService.getNotInDictEmptySuggestions(); + } finally { + if (null != dictInfo) { + if (!mDictionaryPool.offer(dictInfo)) { + Log.e(TAG, "Can't re-insert a dictionary into its pool"); + } + } + } + } + final String text = inText.replaceAll( + AndroidSpellCheckerService.APOSTROPHE, AndroidSpellCheckerService.SINGLE_QUOTE); + + // TODO: Don't gather suggestions if the limit is <= 0 unless necessary + //final SuggestionsGatherer suggestionsGatherer = new SuggestionsGatherer(text, + //mService.mSuggestionThreshold, mService.mRecommendedThreshold, + //suggestionsLimit); + final SuggestionsGatherer suggestionsGatherer = mService.newSuggestionsGatherer( + text, suggestionsLimit); + final WordComposer composer = new WordComposer(); + final int length = text.length(); + for (int i = 0; i < length; i = text.offsetByCodePoints(i, 1)) { + final int codePoint = text.codePointAt(i); + // The getXYForCodePointAndScript method returns (Y << 16) + X + final int xy = SpellCheckerProximityInfo.getXYForCodePointAndScript( + codePoint, mScript); + if (SpellCheckerProximityInfo.NOT_A_COORDINATE_PAIR == xy) { + composer.add(codePoint, WordComposer.NOT_A_COORDINATE, + WordComposer.NOT_A_COORDINATE); + } else { + composer.add(codePoint, xy & 0xFFFF, xy >> 16); + } + } + + final int capitalizeType = AndroidSpellCheckerService.getCapitalizationType(text); + boolean isInDict = true; + DictAndProximity dictInfo = null; + try { + dictInfo = mDictionaryPool.takeOrGetNull(); + if (null == dictInfo) { + return AndroidSpellCheckerService.getNotInDictEmptySuggestions(); + } + final ArrayList<SuggestedWordInfo> suggestions = + dictInfo.mDictionary.getSuggestions(composer, prevWord, + dictInfo.mProximityInfo); + for (final SuggestedWordInfo suggestion : suggestions) { + final String suggestionStr = suggestion.mWord.toString(); + suggestionsGatherer.addWord(suggestionStr.toCharArray(), null, 0, + suggestionStr.length(), suggestion.mScore); + } + isInDict = dictInfo.mDictionary.isValidWord(text); + if (!isInDict && AndroidSpellCheckerService.CAPITALIZE_NONE != capitalizeType) { + // We want to test the word again if it's all caps or first caps only. + // If it's fully down, we already tested it, if it's mixed case, we don't + // want to test a lowercase version of it. + isInDict = dictInfo.mDictionary.isValidWord(text.toLowerCase(mLocale)); + } + } finally { + if (null != dictInfo) { + if (!mDictionaryPool.offer(dictInfo)) { + Log.e(TAG, "Can't re-insert a dictionary into its pool"); + } + } + } + + final SuggestionsGatherer.Result result = suggestionsGatherer.getResults( + capitalizeType, mLocale); + + if (DBG) { + Log.i(TAG, "Spell checking results for " + text + " with suggestion limit " + + suggestionsLimit); + Log.i(TAG, "IsInDict = " + isInDict); + Log.i(TAG, "LooksLikeTypo = " + (!isInDict)); + Log.i(TAG, "HasRecommendedSuggestions = " + result.mHasRecommendedSuggestions); + if (null != result.mSuggestions) { + for (String suggestion : result.mSuggestions) { + Log.i(TAG, suggestion); + } + } + } + + final int flags = + (isInDict ? SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY + : SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO) + | (result.mHasRecommendedSuggestions + ? SuggestionsInfoCompatUtils + .getValueOf_RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS() + : 0); + final SuggestionsInfo retval = new SuggestionsInfo(flags, result.mSuggestions); + 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 + if (DBG) { + throw e; + } else { + Log.e(TAG, "Exception while spellcheking: " + e); + return AndroidSpellCheckerService.getNotInDictEmptySuggestions(); + } + } + } +} |