aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/proguard.flags5
-rw-r--r--java/res/values-af/strings-appname.xml28
-rw-r--r--java/res/values-af/strings.xml14
-rw-r--r--java/res/values-am/strings-appname.xml27
-rw-r--r--java/res/values-am/strings.xml9
-rw-r--r--java/res/values-ar/strings-appname.xml27
-rw-r--r--java/res/values-ar/strings.xml9
-rw-r--r--java/res/values-be/strings-appname.xml27
-rw-r--r--java/res/values-be/strings.xml9
-rw-r--r--java/res/values-bg/strings-appname.xml27
-rw-r--r--java/res/values-bg/strings.xml14
-rw-r--r--java/res/values-ca/strings-appname.xml27
-rw-r--r--java/res/values-ca/strings.xml9
-rw-r--r--java/res/values-cs/strings-appname.xml27
-rw-r--r--java/res/values-cs/strings.xml9
-rw-r--r--java/res/values-da/strings-appname.xml27
-rw-r--r--java/res/values-da/strings.xml9
-rw-r--r--java/res/values-de/strings-appname.xml27
-rw-r--r--java/res/values-de/strings.xml9
-rw-r--r--java/res/values-el/strings-appname.xml27
-rw-r--r--java/res/values-el/strings.xml9
-rw-r--r--java/res/values-en-rGB/strings-appname.xml27
-rw-r--r--java/res/values-en-rGB/strings.xml9
-rw-r--r--java/res/values-es-rUS/strings-appname.xml27
-rw-r--r--java/res/values-es-rUS/strings.xml9
-rw-r--r--java/res/values-es/strings-appname.xml27
-rw-r--r--java/res/values-es/strings.xml9
-rw-r--r--java/res/values-et/strings-appname.xml27
-rw-r--r--java/res/values-et/strings.xml9
-rw-r--r--java/res/values-fa/strings-appname.xml27
-rw-r--r--java/res/values-fa/strings.xml14
-rw-r--r--java/res/values-fi/strings-appname.xml27
-rw-r--r--java/res/values-fi/strings.xml9
-rw-r--r--java/res/values-fr/strings-appname.xml27
-rw-r--r--java/res/values-fr/strings.xml9
-rw-r--r--java/res/values-hi/strings-appname.xml27
-rw-r--r--java/res/values-hi/strings.xml14
-rw-r--r--java/res/values-hr/strings-appname.xml27
-rw-r--r--java/res/values-hr/strings.xml9
-rw-r--r--java/res/values-hu/strings-appname.xml27
-rw-r--r--java/res/values-hu/strings.xml14
-rw-r--r--java/res/values-in/strings-appname.xml27
-rw-r--r--java/res/values-in/strings.xml9
-rw-r--r--java/res/values-it/strings-appname.xml27
-rw-r--r--java/res/values-it/strings.xml9
-rw-r--r--java/res/values-iw/strings-appname.xml27
-rw-r--r--java/res/values-iw/strings.xml9
-rw-r--r--java/res/values-ja/strings-appname.xml27
-rw-r--r--java/res/values-ja/strings.xml14
-rw-r--r--java/res/values-ko/strings-appname.xml27
-rw-r--r--java/res/values-ko/strings.xml14
-rw-r--r--java/res/values-lt/strings-appname.xml27
-rw-r--r--java/res/values-lt/strings.xml9
-rw-r--r--java/res/values-lv/strings-appname.xml27
-rw-r--r--java/res/values-lv/strings.xml9
-rw-r--r--java/res/values-ms/strings-appname.xml28
-rw-r--r--java/res/values-ms/strings.xml14
-rw-r--r--java/res/values-nb/strings-appname.xml27
-rw-r--r--java/res/values-nb/strings.xml9
-rw-r--r--java/res/values-nl/strings-appname.xml27
-rw-r--r--java/res/values-nl/strings.xml9
-rw-r--r--java/res/values-pl/strings.xml14
-rw-r--r--java/res/values-pt-rPT/strings-appname.xml27
-rw-r--r--java/res/values-pt-rPT/strings.xml9
-rw-r--r--java/res/values-pt/strings-appname.xml28
-rw-r--r--java/res/values-pt/strings.xml14
-rw-r--r--java/res/values-rm/strings.xml16
-rw-r--r--java/res/values-ro/strings-appname.xml27
-rw-r--r--java/res/values-ro/strings.xml14
-rw-r--r--java/res/values-ru/strings-appname.xml27
-rw-r--r--java/res/values-ru/strings.xml14
-rw-r--r--java/res/values-sk/strings-appname.xml27
-rw-r--r--java/res/values-sk/strings.xml14
-rw-r--r--java/res/values-sl/strings-appname.xml27
-rw-r--r--java/res/values-sl/strings.xml9
-rw-r--r--java/res/values-sr/strings-appname.xml27
-rw-r--r--java/res/values-sr/strings.xml9
-rw-r--r--java/res/values-sv/strings-appname.xml27
-rw-r--r--java/res/values-sv/strings.xml9
-rw-r--r--java/res/values-sw/strings-appname.xml27
-rw-r--r--java/res/values-sw/strings.xml9
-rw-r--r--java/res/values-th/strings-appname.xml30
-rw-r--r--java/res/values-th/strings.xml14
-rw-r--r--java/res/values-tl/strings-appname.xml27
-rw-r--r--java/res/values-tl/strings.xml14
-rw-r--r--java/res/values-tr/strings-appname.xml27
-rw-r--r--java/res/values-tr/strings.xml14
-rw-r--r--java/res/values-uk/strings-appname.xml27
-rw-r--r--java/res/values-uk/strings.xml9
-rw-r--r--java/res/values-vi/strings-appname.xml27
-rw-r--r--java/res/values-vi/strings.xml14
-rw-r--r--java/res/values-zh-rCN/strings-appname.xml28
-rw-r--r--java/res/values-zh-rCN/strings.xml14
-rw-r--r--java/res/values-zh-rTW/strings-appname.xml27
-rw-r--r--java/res/values-zh-rTW/strings.xml14
-rw-r--r--java/res/values-zu/strings-appname.xml27
-rw-r--r--java/res/values-zu/strings.xml9
-rw-r--r--java/res/values/strings-appname.xml33
-rw-r--r--java/res/values/strings.xml19
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java9
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java15
-rw-r--r--java/src/com/android/inputmethod/latin/AutoCorrection.java3
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java129
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java18
-rw-r--r--java/src/com/android/inputmethod/latin/Dictionary.java25
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryCollection.java31
-rw-r--r--java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java34
-rw-r--r--java/src/com/android/inputmethod/latin/ExpandableDictionary.java57
-rw-r--r--java/src/com/android/inputmethod/latin/InputPointers.java54
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java105
-rw-r--r--java/src/com/android/inputmethod/latin/ResearchLog.java360
-rw-r--r--java/src/com/android/inputmethod/latin/ResearchLogger.java451
-rw-r--r--java/src/com/android/inputmethod/latin/Suggest.java133
-rw-r--r--java/src/com/android/inputmethod/latin/SuggestedWords.java1
-rw-r--r--java/src/com/android/inputmethod/latin/SynchronouslyLoadedContactsBinaryDictionary.java4
-rw-r--r--java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java4
-rw-r--r--java/src/com/android/inputmethod/latin/UserHistoryDictionary.java11
-rw-r--r--java/src/com/android/inputmethod/latin/WhitelistDictionary.java10
-rw-r--r--java/src/com/android/inputmethod/latin/WordComposer.java18
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java413
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java152
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSessionFactory.java25
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java302
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();
+ }
+ }
+ }
+}