aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/AndroidManifest.xml8
-rw-r--r--java/proguard.flags4
-rw-r--r--java/res/drawable-hdpi/keyboard_background_holo.9.pngbin255 -> 232 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.pngbin167 -> 160 bytes
-rw-r--r--java/res/drawable-hdpi/more_suggestions_hint.pngbin0 -> 249 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_123_mic.pngbin2576 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_delete_rtl.pngbin2208 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_label_mic.pngbin0 -> 905 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_123_mic.pngbin2510 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_123_mic_holo.pngbin1513 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_delete_rtl.pngbin4611 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_delete_rtl_holo.pngbin1111 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_space.pngbin3908 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_label_mic.pngbin0 -> 1417 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_label_mic_holo.pngbin0 -> 905 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_tab_holo.pngbin873 -> 795 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_background_holo.9.pngbin211 -> 203 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.pngbin159 -> 151 bytes
-rw-r--r--java/res/drawable-mdpi/more_suggestions_hint.pngbin0 -> 226 bytes
-rw-r--r--java/res/drawable-mdpi/sym_bkeyboard_123_mic.pngbin1520 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/sym_bkeyboard_delete_rtl.pngbin718 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/sym_bkeyboard_label_mic.pngbin0 -> 539 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_123_mic.pngbin1540 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_123_mic_holo.pngbin1011 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_delete_rtl.pngbin3470 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_delete_rtl_holo.pngbin812 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_feedback_space.pngbin3222 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_label_mic.pngbin0 -> 542 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_label_mic_holo.pngbin0 -> 658 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_tab_holo.pngbin642 -> 589 bytes
-rw-r--r--java/res/drawable-sw600dp-hdpi/sym_keyboard_delete_rtl_holo.pngbin1111 -> 0 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_rtl_holo.pngbin812 -> 0 bytes
-rw-r--r--java/res/drawable-sw600dp-xhdpi/sym_keyboard_delete_rtl_holo.pngbin1485 -> 0 bytes
-rw-r--r--java/res/drawable-xhdpi/keyboard_background_holo.9.pngbin297 -> 272 bytes
-rw-r--r--java/res/drawable-xhdpi/keyboard_suggest_strip_holo.9.pngbin180 -> 168 bytes
-rw-r--r--java/res/drawable-xhdpi/more_suggestions_hint.pngbin0 -> 322 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_bkeyboard_123_mic.pngbin3765 -> 0 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_bkeyboard_delete_rtl.pngbin2656 -> 0 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_bkeyboard_label_mic.pngbin0 -> 2112 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_keyboard_123_mic.pngbin3682 -> 0 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_keyboard_123_mic_holo.pngbin2127 -> 0 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_keyboard_delete_rtl.pngbin5522 -> 0 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_keyboard_delete_rtl_holo.pngbin1485 -> 0 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_keyboard_feedback_space.pngbin4446 -> 0 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_keyboard_label_mic.pngbin0 -> 2086 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_keyboard_label_mic_holo.pngbin0 -> 1222 bytes
-rw-r--r--java/res/drawable-xhdpi/sym_keyboard_tab_holo.pngbin1186 -> 1048 bytes
-rw-r--r--java/res/layout/candidates_strip.xml25
-rw-r--r--java/res/values-af/strings.xml72
-rw-r--r--java/res/values-am/strings.xml72
-rw-r--r--java/res/values-ar/donottranslate-altchars.xml15
-rw-r--r--java/res/values-ar/strings.xml61
-rw-r--r--java/res/values-bg/strings.xml59
-rw-r--r--java/res/values-ca/strings.xml59
-rw-r--r--java/res/values-cs/strings.xml59
-rw-r--r--java/res/values-da/strings.xml59
-rw-r--r--java/res/values-de/strings.xml59
-rw-r--r--java/res/values-el/strings.xml59
-rw-r--r--java/res/values-en-rGB/strings.xml56
-rw-r--r--java/res/values-es-rUS/strings.xml59
-rw-r--r--java/res/values-es/donottranslate-altchars.xml1
-rw-r--r--java/res/values-es/strings.xml58
-rw-r--r--java/res/values-fa/strings.xml59
-rw-r--r--java/res/values-fi/strings.xml59
-rw-r--r--java/res/values-fr/donottranslate.xml2
-rw-r--r--java/res/values-fr/strings.xml59
-rw-r--r--java/res/values-hr/strings.xml59
-rw-r--r--java/res/values-hu/strings.xml56
-rw-r--r--java/res/values-in/strings.xml59
-rw-r--r--java/res/values-it/donottranslate.xml2
-rw-r--r--java/res/values-it/strings.xml55
-rw-r--r--java/res/values-iw/strings.xml61
-rw-r--r--java/res/values-ja/strings.xml59
-rw-r--r--java/res/values-ko/strings.xml59
-rw-r--r--java/res/values-lt/strings.xml59
-rw-r--r--java/res/values-lv/strings.xml56
-rw-r--r--java/res/values-ms/strings.xml196
-rw-r--r--java/res/values-nb/strings.xml59
-rw-r--r--java/res/values-nl/strings.xml59
-rw-r--r--java/res/values-pl/strings.xml59
-rw-r--r--java/res/values-pt-rPT/strings.xml59
-rw-r--r--java/res/values-pt/strings.xml59
-rw-r--r--java/res/values-rm/strings.xml100
-rw-r--r--java/res/values-ro/strings.xml59
-rw-r--r--java/res/values-ru/strings.xml59
-rw-r--r--java/res/values-sk/strings.xml59
-rw-r--r--java/res/values-sl/strings.xml59
-rw-r--r--java/res/values-sr/strings.xml59
-rw-r--r--java/res/values-sv/strings.xml59
-rw-r--r--java/res/values-sw/strings.xml72
-rw-r--r--java/res/values-sw600dp-land/dimens.xml1
-rw-r--r--java/res/values-sw600dp/config.xml3
-rw-r--r--java/res/values-sw768dp-land/dimens.xml1
-rw-r--r--java/res/values-sw768dp/config.xml3
-rw-r--r--java/res/values-th/strings.xml59
-rw-r--r--java/res/values-tl/strings.xml59
-rw-r--r--java/res/values-tr/strings.xml59
-rw-r--r--java/res/values-uk/strings.xml56
-rw-r--r--java/res/values-vi/strings.xml59
-rw-r--r--java/res/values-zh-rCN/strings.xml59
-rw-r--r--java/res/values-zh-rTW/strings.xml59
-rw-r--r--java/res/values-zu/strings.xml90
-rw-r--r--java/res/values/attrs.xml62
-rw-r--r--java/res/values/config.xml7
-rw-r--r--java/res/values/dimens.xml3
-rw-r--r--java/res/values/donottranslate-altchars.xml14
-rw-r--r--java/res/values/donottranslate.xml40
-rw-r--r--java/res/values/keyboard-icons-black.xml7
-rw-r--r--java/res/values/keyboard-icons-ics.xml7
-rw-r--r--java/res/values/keyboard-icons-white.xml7
-rw-r--r--java/res/values/keycodes.xml2
-rw-r--r--java/res/values/strings.xml119
-rw-r--r--java/res/values/styles.xml4
-rw-r--r--java/res/xml-ar/kbd_qwerty.xml1
-rw-r--r--java/res/xml-ar/kbd_symbols.xml27
-rw-r--r--java/res/xml-ar/kbd_symbols_shift.xml27
-rw-r--r--java/res/xml-iw/kbd_qwerty.xml1
-rw-r--r--java/res/xml-iw/kbd_symbols.xml27
-rw-r--r--java/res/xml-iw/kbd_symbols_shift.xml27
-rw-r--r--java/res/xml-sw600dp/kbd_key_styles.xml51
-rw-r--r--java/res/xml-sw600dp/kbd_number.xml61
-rw-r--r--java/res/xml-sw600dp/kbd_phone.xml29
-rw-r--r--java/res/xml-sw600dp/kbd_phone_shift.xml (renamed from java/res/xml-sw600dp/kbd_phone_symbols.xml)29
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_f2.xml20
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_row1.xml7
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_row2.xml6
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_row3.xml3
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_row4.xml4
-rw-r--r--java/res/xml-sw600dp/kbd_row3_smiley.xml12
-rw-r--r--java/res/xml-sw600dp/kbd_rows_arabic.xml21
-rw-r--r--java/res/xml-sw600dp/kbd_rows_azerty.xml16
-rw-r--r--java/res/xml-sw600dp/kbd_rows_hebrew.xml19
-rw-r--r--java/res/xml-sw600dp/kbd_rows_qwertz.xml10
-rw-r--r--java/res/xml-sw600dp/kbd_rows_russian.xml13
-rw-r--r--java/res/xml-sw600dp/kbd_rows_scandinavian.xml16
-rw-r--r--java/res/xml-sw600dp/kbd_rows_serbian.xml16
-rw-r--r--java/res/xml-sw600dp/kbd_rows_spanish.xml6
-rw-r--r--java/res/xml-sw600dp/kbd_rows_symbols.xml (renamed from java/res/xml-sw600dp/kbd_symbols.xml)31
-rw-r--r--java/res/xml-sw600dp/kbd_rows_symbols_shift.xml (renamed from java/res/xml-sw600dp/kbd_symbols_shift.xml)20
-rw-r--r--java/res/xml-sw768dp/kbd_key_styles.xml43
-rw-r--r--java/res/xml-sw768dp/kbd_number.xml75
-rw-r--r--java/res/xml-sw768dp/kbd_phone.xml39
-rw-r--r--java/res/xml-sw768dp/kbd_phone_shift.xml (renamed from java/res/xml-sw768dp/kbd_phone_symbols.xml)39
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty_row1.xml7
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty_row2.xml6
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty_row3.xml6
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty_row4.xml3
-rw-r--r--java/res/xml-sw768dp/kbd_rows_arabic.xml12
-rw-r--r--java/res/xml-sw768dp/kbd_rows_azerty.xml21
-rw-r--r--java/res/xml-sw768dp/kbd_rows_hebrew.xml12
-rw-r--r--java/res/xml-sw768dp/kbd_rows_qwertz.xml12
-rw-r--r--java/res/xml-sw768dp/kbd_rows_russian.xml19
-rw-r--r--java/res/xml-sw768dp/kbd_rows_scandinavian.xml18
-rw-r--r--java/res/xml-sw768dp/kbd_rows_serbian.xml19
-rw-r--r--java/res/xml-sw768dp/kbd_rows_spanish.xml6
-rw-r--r--java/res/xml-sw768dp/kbd_rows_symbols.xml (renamed from java/res/xml-sw768dp/kbd_symbols.xml)40
-rw-r--r--java/res/xml-sw768dp/kbd_rows_symbols_shift.xml (renamed from java/res/xml-sw768dp/kbd_symbols_shift.xml)32
-rw-r--r--java/res/xml/kbd_key_styles.xml119
-rw-r--r--java/res/xml/kbd_number.xml55
-rw-r--r--java/res/xml/kbd_numkey_styles.xml7
-rw-r--r--java/res/xml/kbd_phone.xml32
-rw-r--r--java/res/xml/kbd_phone_shift.xml (renamed from java/res/xml/kbd_phone_symbols.xml)32
-rw-r--r--java/res/xml/kbd_qwerty_f1.xml84
-rw-r--r--java/res/xml/kbd_qwerty_row1.xml7
-rw-r--r--java/res/xml/kbd_qwerty_row2.xml6
-rw-r--r--java/res/xml/kbd_qwerty_row3.xml6
-rw-r--r--java/res/xml/kbd_qwerty_row4.xml45
-rw-r--r--java/res/xml/kbd_rows_arabic.xml20
-rw-r--r--java/res/xml/kbd_rows_azerty.xml19
-rw-r--r--java/res/xml/kbd_rows_hebrew.xml19
-rw-r--r--java/res/xml/kbd_rows_qwertz.xml13
-rw-r--r--java/res/xml/kbd_rows_russian.xml19
-rw-r--r--java/res/xml/kbd_rows_scandinavian.xml13
-rw-r--r--java/res/xml/kbd_rows_serbian.xml19
-rw-r--r--java/res/xml/kbd_rows_spanish.xml6
-rw-r--r--java/res/xml/kbd_rows_symbols.xml130
-rw-r--r--java/res/xml/kbd_rows_symbols_shift.xml125
-rw-r--r--java/res/xml/kbd_settings_or_tab.xml45
-rw-r--r--java/res/xml/kbd_symbols.xml127
-rw-r--r--java/res/xml/kbd_symbols_f1.xml31
-rw-r--r--java/res/xml/kbd_symbols_row4.xml49
-rw-r--r--java/res/xml/kbd_symbols_shift.xml121
-rw-r--r--java/res/xml/kbd_symbols_shift_row4.xml43
-rw-r--r--java/res/xml/method.xml169
-rw-r--r--java/res/xml/prefs.xml16
-rw-r--r--java/res/xml/prefs_for_debug.xml7
-rw-r--r--java/res/xml/spellchecker.xml33
-rw-r--r--java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java5
-rw-r--r--java/src/com/android/inputmethod/accessibility/AccessibleInputMethodServiceProxy.java4
-rw-r--r--java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java15
-rw-r--r--java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java2
-rw-r--r--java/src/com/android/inputmethod/compat/AccessibilityEventCompatUtils.java17
-rw-r--r--java/src/com/android/inputmethod/compat/AccessibilityManagerCompatWrapper.java14
-rw-r--r--java/src/com/android/inputmethod/compat/InputMethodInfoCompatWrapper.java18
-rw-r--r--java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java130
-rw-r--r--java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java30
-rw-r--r--java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java32
-rw-r--r--java/src/com/android/inputmethod/compat/VibratorCompatWrapper.java2
-rw-r--r--java/src/com/android/inputmethod/deprecated/VoiceProxy.java190
-rw-r--r--java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java4
-rw-r--r--java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java3
-rw-r--r--java/src/com/android/inputmethod/keyboard/Key.java216
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyDetector.java6
-rw-r--r--java/src/com/android/inputmethod/keyboard/Keyboard.java326
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java6
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardId.java62
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java456
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardView.java205
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboard.java175
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java43
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java83
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboard.java24
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java2
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java163
-rw-r--r--java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java28
-rw-r--r--java/src/com/android/inputmethod/keyboard/PopupPanel.java2
-rw-r--r--java/src/com/android/inputmethod/keyboard/ProximityInfo.java15
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java10
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java (renamed from java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java)278
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java61
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java95
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java120
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java9
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java52
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/Row.java42
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/SlidingLocaleDrawable.java158
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java15
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java162
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java50
-rw-r--r--java/src/com/android/inputmethod/latin/CandidateView.java740
-rw-r--r--java/src/com/android/inputmethod/latin/ContactsDictionary.java16
-rw-r--r--java/src/com/android/inputmethod/latin/DebugSettings.java8
-rw-r--r--java/src/com/android/inputmethod/latin/Dictionary.java18
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryCollection.java18
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryFactory.java48
-rw-r--r--java/src/com/android/inputmethod/latin/EditingUtils.java10
-rw-r--r--java/src/com/android/inputmethod/latin/ExpandableDictionary.java4
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java446
-rw-r--r--java/src/com/android/inputmethod/latin/PrivateBinaryDictionaryGetter.java29
-rw-r--r--java/src/com/android/inputmethod/latin/Settings.java133
-rw-r--r--java/src/com/android/inputmethod/latin/SubtypeSwitcher.java151
-rw-r--r--java/src/com/android/inputmethod/latin/Suggest.java76
-rw-r--r--java/src/com/android/inputmethod/latin/SuggestedWords.java19
-rw-r--r--java/src/com/android/inputmethod/latin/UserDictionary.java29
-rw-r--r--java/src/com/android/inputmethod/latin/Utils.java60
-rw-r--r--java/src/com/android/inputmethod/latin/WhitelistDictionary.java5
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java167
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/SpellChecker.java115
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerProximityInfo.java94
249 files changed, 4610 insertions, 6518 deletions
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml
index cb0a9a2e1..d680f1894 100644
--- a/java/AndroidManifest.xml
+++ b/java/AndroidManifest.xml
@@ -21,6 +21,14 @@
<meta-data android:name="android.view.im" android:resource="@xml/method" />
</service>
+ <service android:name=".spellcheck.AndroidSpellCheckerService"
+ android:label="@string/spell_checker_service_name"
+ android:permission="android.permission.BIND_TEXT_SERVICE">
+ <intent-filter>
+ <action android:name="android.service.textservice.SpellCheckerService" />
+ </intent-filter>
+ <meta-data android:name="android.view.textservice.scs" android:resource="@xml/spellchecker" />
+ </service>
<activity android:name="Settings" android:label="@string/english_ime_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
diff --git a/java/proguard.flags b/java/proguard.flags
index 7ce6f41b5..395950033 100644
--- a/java/proguard.flags
+++ b/java/proguard.flags
@@ -30,3 +30,7 @@
-keep class com.android.inputmethod.latin.SettingsActivity {
*;
}
+
+-keep class com.android.inputmethod.keyboard.internal.MiniKeyboardBuilder$MiniKeyboardParams {
+ <init>(...);
+}
diff --git a/java/res/drawable-hdpi/keyboard_background_holo.9.png b/java/res/drawable-hdpi/keyboard_background_holo.9.png
index 39746ffd2..714db4305 100644
--- a/java/res/drawable-hdpi/keyboard_background_holo.9.png
+++ b/java/res/drawable-hdpi/keyboard_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.png
index 85b6360c5..e173beb73 100644
--- a/java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.png
+++ b/java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/more_suggestions_hint.png b/java/res/drawable-hdpi/more_suggestions_hint.png
new file mode 100644
index 000000000..4515f4434
--- /dev/null
+++ b/java/res/drawable-hdpi/more_suggestions_hint.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png b/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png
deleted file mode 100644
index 3e4eff698..000000000
--- a/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_delete_rtl.png b/java/res/drawable-hdpi/sym_bkeyboard_delete_rtl.png
deleted file mode 100644
index 102eac781..000000000
--- a/java/res/drawable-hdpi/sym_bkeyboard_delete_rtl.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_label_mic.png b/java/res/drawable-hdpi/sym_bkeyboard_label_mic.png
new file mode 100644
index 000000000..25702cf73
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_bkeyboard_label_mic.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_123_mic.png b/java/res/drawable-hdpi/sym_keyboard_123_mic.png
deleted file mode 100644
index 6f0aec24c..000000000
--- a/java/res/drawable-hdpi/sym_keyboard_123_mic.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_123_mic_holo.png b/java/res/drawable-hdpi/sym_keyboard_123_mic_holo.png
deleted file mode 100644
index ed66f7520..000000000
--- a/java/res/drawable-hdpi/sym_keyboard_123_mic_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_delete_rtl.png b/java/res/drawable-hdpi/sym_keyboard_delete_rtl.png
deleted file mode 100644
index a508452bd..000000000
--- a/java/res/drawable-hdpi/sym_keyboard_delete_rtl.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_delete_rtl_holo.png b/java/res/drawable-hdpi/sym_keyboard_delete_rtl_holo.png
deleted file mode 100644
index a77e4a00e..000000000
--- a/java/res/drawable-hdpi/sym_keyboard_delete_rtl_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_space.png b/java/res/drawable-hdpi/sym_keyboard_feedback_space.png
deleted file mode 100644
index 67311fc8f..000000000
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_space.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_label_mic.png b/java/res/drawable-hdpi/sym_keyboard_label_mic.png
new file mode 100644
index 000000000..4e0a8ed8e
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_label_mic.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_label_mic_holo.png b/java/res/drawable-hdpi/sym_keyboard_label_mic_holo.png
new file mode 100644
index 000000000..22802433e
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_label_mic_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_tab_holo.png b/java/res/drawable-hdpi/sym_keyboard_tab_holo.png
index 721574366..59ad53457 100644
--- a/java/res/drawable-hdpi/sym_keyboard_tab_holo.png
+++ b/java/res/drawable-hdpi/sym_keyboard_tab_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_background_holo.9.png b/java/res/drawable-mdpi/keyboard_background_holo.9.png
index f1d55c6dd..2776621b1 100644
--- a/java/res/drawable-mdpi/keyboard_background_holo.9.png
+++ b/java/res/drawable-mdpi/keyboard_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png
index e488323c9..b1c18b412 100644
--- a/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png
+++ b/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/more_suggestions_hint.png b/java/res/drawable-mdpi/more_suggestions_hint.png
new file mode 100644
index 000000000..6168de353
--- /dev/null
+++ b/java/res/drawable-mdpi/more_suggestions_hint.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_bkeyboard_123_mic.png b/java/res/drawable-mdpi/sym_bkeyboard_123_mic.png
deleted file mode 100644
index 0749b5fc6..000000000
--- a/java/res/drawable-mdpi/sym_bkeyboard_123_mic.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_bkeyboard_delete_rtl.png b/java/res/drawable-mdpi/sym_bkeyboard_delete_rtl.png
deleted file mode 100644
index 32253ea9b..000000000
--- a/java/res/drawable-mdpi/sym_bkeyboard_delete_rtl.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_bkeyboard_label_mic.png b/java/res/drawable-mdpi/sym_bkeyboard_label_mic.png
new file mode 100644
index 000000000..7f0b1355f
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_bkeyboard_label_mic.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_123_mic.png b/java/res/drawable-mdpi/sym_keyboard_123_mic.png
deleted file mode 100644
index 35afe0821..000000000
--- a/java/res/drawable-mdpi/sym_keyboard_123_mic.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_123_mic_holo.png b/java/res/drawable-mdpi/sym_keyboard_123_mic_holo.png
deleted file mode 100644
index 4814e5141..000000000
--- a/java/res/drawable-mdpi/sym_keyboard_123_mic_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_delete_rtl.png b/java/res/drawable-mdpi/sym_keyboard_delete_rtl.png
deleted file mode 100644
index d436c23a9..000000000
--- a/java/res/drawable-mdpi/sym_keyboard_delete_rtl.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_delete_rtl_holo.png b/java/res/drawable-mdpi/sym_keyboard_delete_rtl_holo.png
deleted file mode 100644
index 2e75d8536..000000000
--- a/java/res/drawable-mdpi/sym_keyboard_delete_rtl_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_feedback_space.png b/java/res/drawable-mdpi/sym_keyboard_feedback_space.png
deleted file mode 100644
index 36eb60c13..000000000
--- a/java/res/drawable-mdpi/sym_keyboard_feedback_space.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_label_mic.png b/java/res/drawable-mdpi/sym_keyboard_label_mic.png
new file mode 100644
index 000000000..a354d5321
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_label_mic.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_label_mic_holo.png b/java/res/drawable-mdpi/sym_keyboard_label_mic_holo.png
new file mode 100644
index 000000000..d51adbe2f
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_label_mic_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_tab_holo.png b/java/res/drawable-mdpi/sym_keyboard_tab_holo.png
index e42432125..d5edd32d7 100644
--- a/java/res/drawable-mdpi/sym_keyboard_tab_holo.png
+++ b/java/res/drawable-mdpi/sym_keyboard_tab_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/sym_keyboard_delete_rtl_holo.png b/java/res/drawable-sw600dp-hdpi/sym_keyboard_delete_rtl_holo.png
deleted file mode 100644
index 5c19f3258..000000000
--- a/java/res/drawable-sw600dp-hdpi/sym_keyboard_delete_rtl_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_rtl_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_rtl_holo.png
deleted file mode 100644
index 994854106..000000000
--- a/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_rtl_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/sym_keyboard_delete_rtl_holo.png b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_delete_rtl_holo.png
deleted file mode 100644
index f3310a1cd..000000000
--- a/java/res/drawable-sw600dp-xhdpi/sym_keyboard_delete_rtl_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_background_holo.9.png
index 58d15142b..a0aa4ba22 100644
--- a/java/res/drawable-xhdpi/keyboard_background_holo.9.png
+++ b/java/res/drawable-xhdpi/keyboard_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-xhdpi/keyboard_suggest_strip_holo.9.png
index b40f76662..4c27072e9 100644
--- a/java/res/drawable-xhdpi/keyboard_suggest_strip_holo.9.png
+++ b/java/res/drawable-xhdpi/keyboard_suggest_strip_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/more_suggestions_hint.png b/java/res/drawable-xhdpi/more_suggestions_hint.png
new file mode 100644
index 000000000..f577a3617
--- /dev/null
+++ b/java/res/drawable-xhdpi/more_suggestions_hint.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_123_mic.png b/java/res/drawable-xhdpi/sym_bkeyboard_123_mic.png
deleted file mode 100644
index 0aefaa1c3..000000000
--- a/java/res/drawable-xhdpi/sym_bkeyboard_123_mic.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_delete_rtl.png b/java/res/drawable-xhdpi/sym_bkeyboard_delete_rtl.png
deleted file mode 100644
index 23aee2b3b..000000000
--- a/java/res/drawable-xhdpi/sym_bkeyboard_delete_rtl.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_label_mic.png b/java/res/drawable-xhdpi/sym_bkeyboard_label_mic.png
new file mode 100644
index 000000000..9bd1d65b4
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_bkeyboard_label_mic.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_123_mic.png b/java/res/drawable-xhdpi/sym_keyboard_123_mic.png
deleted file mode 100644
index bcb097967..000000000
--- a/java/res/drawable-xhdpi/sym_keyboard_123_mic.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_123_mic_holo.png b/java/res/drawable-xhdpi/sym_keyboard_123_mic_holo.png
deleted file mode 100644
index 0c7505874..000000000
--- a/java/res/drawable-xhdpi/sym_keyboard_123_mic_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_delete_rtl.png b/java/res/drawable-xhdpi/sym_keyboard_delete_rtl.png
deleted file mode 100644
index 3f9d3dd65..000000000
--- a/java/res/drawable-xhdpi/sym_keyboard_delete_rtl.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_delete_rtl_holo.png b/java/res/drawable-xhdpi/sym_keyboard_delete_rtl_holo.png
deleted file mode 100644
index 1f4890c89..000000000
--- a/java/res/drawable-xhdpi/sym_keyboard_delete_rtl_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_space.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_space.png
deleted file mode 100644
index cee10568d..000000000
--- a/java/res/drawable-xhdpi/sym_keyboard_feedback_space.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_label_mic.png b/java/res/drawable-xhdpi/sym_keyboard_label_mic.png
new file mode 100644
index 000000000..49810a02f
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_label_mic.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_label_mic_holo.png b/java/res/drawable-xhdpi/sym_keyboard_label_mic_holo.png
new file mode 100644
index 000000000..a7d3eaa0a
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_label_mic_holo.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_tab_holo.png b/java/res/drawable-xhdpi/sym_keyboard_tab_holo.png
index 166643418..c32f8bbfc 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_tab_holo.png
+++ b/java/res/drawable-xhdpi/sym_keyboard_tab_holo.png
Binary files differ
diff --git a/java/res/layout/candidates_strip.xml b/java/res/layout/candidates_strip.xml
index 269bc1bc3..bcc1322b6 100644
--- a/java/res/layout/candidates_strip.xml
+++ b/java/res/layout/candidates_strip.xml
@@ -29,31 +29,6 @@
android:layout_width="0dp"
android:layout_height="match_parent" />
<LinearLayout
- android:id="@+id/candidates_pane_control"
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- >
- <TextView
- android:id="@+id/expand_candidates_pane"
- android:text="@string/label_expand_candidates_pane"
- android:gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:minWidth="28dp"
- android:textSize="@dimen/candidate_text_size"
- android:visibility="visible" />
- <TextView
- android:id="@+id/close_candidates_pane"
- android:text="@string/label_close_candidates_pane"
- android:gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:minWidth="28dp"
- android:textSize="@dimen/candidate_text_size"
- android:visibility="gone" />
- </LinearLayout>
- <LinearLayout
android:id="@+id/touch_to_save"
android:orientation="horizontal"
android:layout_width="match_parent"
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 3a9567ffd..cbe64062f 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android-sleutelbord"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Android-sleutelbordinstellings"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Invoeropsies"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibreer met sleuteldruk"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Klank met sleuteldruk"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Opspring by druk van sleutel"</string>
@@ -51,20 +53,13 @@
<string name="auto_cap" msgid="1719746674854628252">"Outohoofletters"</string>
<!-- no translation found for configure_dictionaries_title (3758288002414557345) -->
<skip />
- <string name="quick_fixes" msgid="5353213327680897927">"Vinnige oplossings"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Korrigeer algemene tikfoute"</string>
<!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
<skip />
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Wys voorgestelde woorde terwyl jy tik"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Wys altyd"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Wys in portretmodus"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Versteek altyd"</string>
- <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
- <skip />
<string name="prefs_settings_key" msgid="4623341240804046498">"Wys instellingsleutel"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Outomaties"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Wys altyd"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Versteek altyd"</string>
<string name="auto_correction" msgid="4979925752001319458">"Outokorrigering"</string>
<!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Korrigeer outomaties die vorige woord"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Af"</string>
@@ -84,6 +79,10 @@
<string name="label_done_key" msgid="2441578748772529288">"Klaar"</string>
<string name="label_send_key" msgid="2815056534433717444">"Stuur"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
+ <skip />
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Meer"</string>
<string name="label_pause_key" msgid="181098308428035340">"Laat wag"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Wag"</string>
@@ -187,6 +186,8 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofoon op simbolesleutelbord"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Steminvoer is gedeaktiveer"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Kies invoermetode"</string>
+ <!-- no translation found for configure_input_method (373356270290742459) -->
+ <skip />
<string name="language_selection_title" msgid="1651299598555326750">"Invoertale"</string>
<!-- no translation found for select_language (2573265881207142437) -->
<skip />
@@ -197,62 +198,11 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Raak om woorde reg te maak"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Raak ingevoerde woorde om hulle te korrigeer, net wanneer voorstelle sigbaar is"</string>
<!-- outdated translation 437433231038683666 --> <string name="keyboard_layout" msgid="8451164783510487501">"Sleutelbordtema"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tsjeggiese sleutelbord"</string>
- <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) -->
- <skip />
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Deense sleutelbord"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Duitse sleutelbord"</string>
- <!-- no translation found for subtype_mode_de_qwerty_keyboard (54890770769303956) -->
- <skip />
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelse (VK) sleutelbord"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelse (VS) sleutelbord"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spaanse sleutelbord"</string>
- <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) -->
- <skip />
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franse sleutelbord"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franse (Kanada) sleutelbord"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franse (Switserland) sleutelbord"</string>
- <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) -->
- <skip />
- <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) -->
- <skip />
- <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) -->
- <skip />
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiaanse sleutelbord"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Noorweegse sleutelbord"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlandse sleutelbord"</string>
- <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
- <skip />
- <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
- <skip />
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russiese sleutelbord"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serwiese sleutelbord"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Sweedse sleutelbord"</string>
- <!-- no translation found for subtype_mode_tr_keyboard (3155981874829226370) -->
- <skip />
- <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
- <skip />
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tsjeggiese stem"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Duitse stem"</string>
- <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
- <skip />
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spaanse stem"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Franse stem"</string>
- <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
- <skip />
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japannese stem"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreaanse stem"</string>
- <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
- <skip />
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Poolse stem"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugese stem"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russiese stem"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkse stem"</string>
- <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <!-- no translation found for subtype_de_qwerty (3358900499589259491) -->
<skip />
- <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <!-- no translation found for subtype_en_GB (88170601942311355) -->
<skip />
- <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <!-- no translation found for subtype_en_US (6160452336634534239) -->
<skip />
<!-- outdated translation 6937813623647419810 --> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Bruikbaarheidsmodus"</string>
</resources>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
index 307fdc9de..4d8ace549 100644
--- a/java/res/values-am/strings.xml
+++ b/java/res/values-am/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"የAndroid ቁልፍሰሌዳ"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"የAndroid ቁልፍሰሌዳ ቅንብሮች"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"ግቤት አማራጮች"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"በቁልፍመጫንጊዜ አንዝር"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"በቁልፍ መጫን ላይ የሚወጣ ድምፅ"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"ቁልፍ ጫን ላይ ብቅ ባይ"</string>
@@ -51,20 +53,13 @@
<string name="auto_cap" msgid="1719746674854628252">"ራስ-ሰር አቢይ ማድረግ"</string>
<!-- no translation found for configure_dictionaries_title (3758288002414557345) -->
<skip />
- <string name="quick_fixes" msgid="5353213327680897927">"ፈጣንጥገና"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">" የተለመዱ የትየባ ስህተቶችንያስተካክላል"</string>
<!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
<skip />
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"እየተየብክ ተመራጭ ቃላትን አሳይ"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"ሁልጊዜ አሳይ"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"በቁመት ሁነታ አሳይ"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ሁልጊዜ ደብቅ"</string>
- <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
- <skip />
<string name="prefs_settings_key" msgid="4623341240804046498">"የቅንብሮች ቁልፍ አሳይ"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"ራስ ሰር"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"ሁልጊዜ አሳይ"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"ሁልጊዜ ደብቅ"</string>
<string name="auto_correction" msgid="4979925752001319458">"በራስ ማስተካከል"</string>
<!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"የቀደመውን ቃል በራስሰር አስተካክል"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ውጪ"</string>
@@ -84,6 +79,10 @@
<string name="label_done_key" msgid="2441578748772529288">"ተከናውኗል"</string>
<string name="label_send_key" msgid="2815056534433717444">" ይላኩ"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
+ <skip />
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"ተጨማሪ"</string>
<string name="label_pause_key" msgid="181098308428035340">"ላፍታ አቁም"</string>
<string name="label_wait_key" msgid="6402152600878093134">"ቆይ"</string>
@@ -187,6 +186,8 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"የድምፅ ማጉያ ምልክትበቁልፍ ሰሌዳላይ"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"የድምፅ ግቤት ቦዝኗል"</string>
<string name="selectInputMethod" msgid="315076553378705821">"የግቤት ሜተድ ምረጥ"</string>
+ <!-- no translation found for configure_input_method (373356270290742459) -->
+ <skip />
<string name="language_selection_title" msgid="1651299598555326750">"ቋንቋዎች አግቤት"</string>
<!-- no translation found for select_language (2573265881207142437) -->
<skip />
@@ -197,62 +198,11 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"ቃላትን ለማስተካከል ንካ"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"የገቡ ቃላትን ለማስተካከል ንካ፣ አማራጮች ሲታዩብቻ"</string>
<!-- outdated translation 437433231038683666 --> <string name="keyboard_layout" msgid="8451164783510487501">"የቁልፍ ሰሌዳ ገጽታ"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"የቼክ ቁልፍሰሌዳ"</string>
- <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) -->
- <skip />
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"የዳኒሽኛ ቁልፍሰሌዳ"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"የጀርመንኛ ቁልፍሰሌዳ"</string>
- <!-- no translation found for subtype_mode_de_qwerty_keyboard (54890770769303956) -->
- <skip />
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"የእንግሊዘኛ(ዩኬ) ቁልፍሰሌዳ"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"የእንግሊዘኛ(ዩኤስ) ቁልፍሰሌዳ"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"የስፖኒሽኛቁልፍ ሰሌዳ"</string>
- <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) -->
- <skip />
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"የፈረንሳይኛ ቁልፍሰሌዳ"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"የፈረንሳይኛ(ካናዳ) ቁልፍሰሌዳ"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"የፈረንሳይኛ(ስዊዘርላንድ) ቁልፍሰሌዳ"</string>
- <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) -->
- <skip />
- <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) -->
- <skip />
- <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) -->
- <skip />
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"የጣሊያንኛ ቁልፍ ሰሌዳ"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"የኖርዌጂኛ ቁልፍሰሌዳ"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"የደች ቁልፍሰሌዳ"</string>
- <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
- <skip />
- <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
- <skip />
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"የራሽኛቁልፍ ሰሌዳ"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"የሩሲኪኛቁልፍ ሰሌዳ"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"የሲውድናዊ ቁልፍሰሌዳ"</string>
- <!-- no translation found for subtype_mode_tr_keyboard (3155981874829226370) -->
- <skip />
- <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
- <skip />
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"የቼክ ድምፅ"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"የጀርመናዊ ድምፅ"</string>
- <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
- <skip />
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"የስፔናዊ ድምፅ"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"የፈረንሳዊ ድምፅ"</string>
- <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
- <skip />
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"የጃፓናዊ ድምፅ"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"የኮሪያዊ ድምፅ"</string>
- <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
- <skip />
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"የፖሊሽኛ ድምፅ"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"የፖርቹጊኛ ድምፅ"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"የራሽኛድምፅ"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"የቱርካዊ ድምፅ"</string>
- <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <!-- no translation found for subtype_de_qwerty (3358900499589259491) -->
<skip />
- <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <!-- no translation found for subtype_en_GB (88170601942311355) -->
<skip />
- <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <!-- no translation found for subtype_en_US (6160452336634534239) -->
<skip />
<!-- outdated translation 6937813623647419810 --> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"የተገልጋይነት ጥናት ሁነታ"</string>
</resources>
diff --git a/java/res/values-ar/donottranslate-altchars.xml b/java/res/values-ar/donottranslate-altchars.xml
index b4c103dcf..0e4f265e7 100644
--- a/java/res/values-ar/donottranslate-altchars.xml
+++ b/java/res/values-ar/donottranslate-altchars.xml
@@ -31,9 +31,7 @@
\u064b: ARABIC FATHATAN
\u064d: ARABIC KASRATAN -->
<string name="alternates_for_punctuation">"\u060c,\u061b,\u061f,!,:,-,/,\',\",\u0651,\u0652,\u064c,\u0640,\u064f,\u064e,\u0650,\u064b,\u064d"</string>
- <string name="alternates_for_web_tab_punctuation">".,\u060c,\u061b,\u061f,!,:,-,/,\',\",\u0651,\u0652,\u064c,\u0640,\u064f,\u064e,\u0650,\u064b,\u064d"</string>
<integer name="popup_keyboard_column_for_punctuation">9</integer>
- <integer name="popup_keyboard_column_for_web_punctuation">10</integer>
<string name="keyhintlabel_for_punctuation">\u064b</string>
<string name="keylabel_for_symbols_1">"١"</string>
<string name="keylabel_for_symbols_2">"٢"</string>
@@ -55,12 +53,21 @@
<string name="alternates_for_symbols_8">8</string>
<string name="alternates_for_symbols_9">9</string>
<string name="alternates_for_symbols_0">0,ⁿ,∅</string>
- <string name="keylabel_for_symbols_comma">\u060c</string>
+ <string name="keylabel_for_comma">\u060c</string>
+ <string name="keylabel_for_f1">\u060c</string>
<string name="keylabel_for_symbols_question">\u061f</string>
<string name="keylabel_for_symbols_semicolon">\u061b</string>
- <string name="alternates_for_symbols_comma">,</string>
+ <!-- \u066a: ARABIC PERCENT SIGN -->
+ <string name="keylabel_for_symbols_percent">\u066a</string>
+ <string name="alternates_for_comma">,</string>
+ <string name="alternates_for_f1">,</string>
+ <!-- @icon/3 is iconSettingsKey -->
+ <string name="alternates_for_f1_settings">\\,,\@icon/3|\@integer/key_settings</string>
+ <!-- @icon/7 is iconTabKey -->
+ <string name="alternates_for_f1_navigate">\\,,\@icon/7|\@integer/key_tab</string>
<string name="alternates_for_symbols_question">\?,¿</string>
<string name="alternates_for_symbols_semicolon">;</string>
+ <string name="alternates_for_symbols_percent">%,‰</string>
<string name="keylabel_for_apostrophe">"،"</string>
<string name="keylabel_for_dash">"."</string>
<string name="keyhintlabel_for_apostrophe">"؟"</string>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index f99654317..433081306 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"لوحة مفاتيح Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"إعدادات لوحة مفاتيح Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"خيارات الإرسال"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"اهتزاز عند الضغط على مفتاح"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"صوت عند الضغط على مفتاح"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"انبثاق عند الضغط على المفاتيح"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"استخدام الأسماء من جهات الاتصال للاقتراحات والتصحيحات"</string>
<string name="auto_cap" msgid="1719746674854628252">"استخدام الأحرف الكبيرة تلقائيًا"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"تهيئة القواميس"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"إصلاحات سريعة"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"تصحيح الأخطاء المكتوبة الشائعة"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"عرض اقتراحات التصحيح"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"عرض الكلمات المقترحة أثناء الكتابة"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"عرض دومًا"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"عرض في وضع رأسي"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"إخفاء دومًا"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"استخدام مفتاح المسافة لتبديل اللغة"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"عرض مفتاح الإعدادات"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"تلقائي"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"إظهار بشكل دائم"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"إخفاء دومًا"</string>
<string name="auto_correction" msgid="4979925752001319458">"التصحيح التلقائي"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"تؤدي المسافة والترقيم إلى تصحيح الكلمات المكتوبة بشكل غير صحيح"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"إيقاف"</string>
@@ -66,7 +62,10 @@
<string name="label_next_key" msgid="362972844525672568">"التالي"</string>
<string name="label_done_key" msgid="2441578748772529288">"تم"</string>
<string name="label_send_key" msgid="2815056534433717444">"إرسال"</string>
- <string name="label_to_alpha_key" msgid="4793983863798817523">"أ ب ج د"</string>
+ <string name="label_to_alpha_key" msgid="4793983863798817523">"أ ب ج"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"المزيد"</string>
<string name="label_pause_key" msgid="181098308428035340">"توقف مؤقت"</string>
<string name="label_wait_key" msgid="6402152600878093134">"انتظار"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"ميكروفون على لوحة مفاتيح الرموز"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"الإدخال الصوتي مُعطل"</string>
<string name="selectInputMethod" msgid="315076553378705821">"تحديد طريقة الإرسال"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"تهيئة طرق الإدخال"</string>
<string name="language_selection_title" msgid="1651299598555326750">"لغات الإدخال"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"تحديد لغات الإدخال"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← المس مرة أخرى للحفظ"</string>
<string name="has_dictionary" msgid="6071847973466625007">"القاموس متاح"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"تمكين ملاحظات المستخدم"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"المس لتصحيح الكلمات"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"المس الكلمات التي تم إدخالها لتصحيحها، وذلك فقط عندما تكون الاقتراحات مرئية."</string>
<string name="keyboard_layout" msgid="8451164783510487501">"مظهر لوحة المفاتيح"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"لوحة مفاتيح تشيكية"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"لوحة المفاتيح العربية"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"لوحة مفاتيح دانماركية"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"لوحة مفاتيح ألمانية"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"لوحة مفاتيح QWERTY ألمانية"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"لوحة مفاتيح إنجليزية (بريطانيا)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"لوحة مفاتيح إنجليزية (الولايات المتحدة)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"لوحة مفاتيح إسبانية"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"لوحة المفاتيح الفنلندية"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"لوحة مفاتيح فرنسية"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"لوحة مفاتيح فرنسية (كندا)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"لوحة مفاتيح فرنسية (سويسرا)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"لوحة المفاتيح الكرواتية"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"لوحة المفاتيح المجرية"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"لوحة المفاتيح العبرية"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"لوحة مفاتيح إيطالية"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"لوحة مفاتيح نرويجية"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"لوحة مفاتيح بولندية"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"لوحة المفاتيح البولندية"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"لوحة المفاتيح البرتغالية"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"لوحة مفاتيح روسية"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"لوحة مفاتيح صربية"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"لوحة مفاتيح سويدية"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"لوحة المفاتيح التركية"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"صوت أفريقاني"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"صوت تشيكي"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"صوت ألماني"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"صوت إنجليزي"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"صوت إسباني"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"صوت فرنسي"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"صوت إيطالي"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"صوت ياباني"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"صوت كوري"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"صوت هولندي"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"صوت بولندي"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"صوت برتغالي"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"صوت روسي"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"صوت تركي"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"صوت صيني، يوي"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"صوت صيني، الماندارين"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"صوت زولوي"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"الألمانية (QWERTY)"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"الإنجليزية (المملكة المتحدة)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"الإنجليزية (الولايات المتحدة)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"وضع دراسة سهولة الاستخدام"</string>
</resources>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index e925563cb..cc958af77 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Клавиатура на Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Настройки на клавиатурата на Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Опции за въвеждане"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Да вибрира при натискане на клавиш"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натискане на клавиш"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Изскачащ прозорец при натискане на клавиш"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Използване на имена от „Контакти“ за предложения и поправки"</string>
<string name="auto_cap" msgid="1719746674854628252">"Автоматично поставяне на главни букви"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Конфигуриране на речници"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Бързи корекции"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Коригира най-честите грешки при въвеждане"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Показване на предложения за поправка"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Показване на предложения, докато пишете"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Винаги да се показва"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показване с вертикална ориентация"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Винаги да се скрива"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Смяна на езика с клавиша за интервал"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Показване на клавиша за настройки"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Автоматично"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Да се показва винаги"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Да се скрива винаги"</string>
<string name="auto_correction" msgid="4979925752001319458">"Автоко"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Клавишът за интервал и пунктуация авт. поправя сгрешени думи"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Изкл."</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
<string name="label_send_key" msgid="2815056534433717444">"Изпращане"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Още"</string>
<string name="label_pause_key" msgid="181098308428035340">"Пауза"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Чака"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Микр. на клав. на симв."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Глас. въвежд. е деакт."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Избор на метод на въвеждане"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Конфигуриране на въвеждането"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Входни езици"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Избор на езици за въвеждане"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Докоснете отново, за да запазите"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Има достъп до речник"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Активиране на отзивите от потребителите"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Докоснете, за да поправите думите"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Докоснете въведените думи, за да ги поправите – само когато предложенията са видими"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Тема на клавиатурата"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"чешка клавиатура"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"клавиатура на арабски"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"датска клавиатура"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"немска клавиатура"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Немска клавиатура „QWERTY“"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"английска (Великобрит.) клавиатура"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"английска (САЩ) клавиатура"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"испанска клавиатура"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Финландска клавиатура"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"френска клавиатура"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"френска (Канада) клавиатура"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"френска (Швейцария) клавиатура"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Хърватска клавиатура"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Унгарска клавиатура"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"клавиатура на иврит"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"италианска клавиатура"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"норвежка клавиатура"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"нидерландска клавиатура"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Полска клавиатура"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Португалска клавиатура"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"руска клавиатура"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"сръбска клавиатура"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"шведска клавиатура"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Турска клавиатура"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"африкаанс, гласово"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"чешки, гласово"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"немски, гласово"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"английски, гласово"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"испански, гласово"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"френски, гласово"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"италиански, гласово"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"японски, гласово"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"корейски, гласово"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"нидерландски, гласово"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"полски, гласово"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"португалски, гласово"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"руски, гласово"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"турски, гласово"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"китайски, кантонски, гласово"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"китайски, мандарин, гласово"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"зулуски, гласово"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Немска „QWERTY“"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"английски (Великобритания)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"английски (САЩ)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Режим за изучаване на използваемостта"</string>
</resources>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index c038f1971..2c9fbfbb6 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Teclat Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Configuració del teclat d\'Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Opcions d\'entrada"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibra en prémer tecles"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"So en prémer una tecla"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Finestra emergent en prémer un botó"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilitza els noms de Contactes per a suggeriments i correccions"</string>
<string name="auto_cap" msgid="1719746674854628252">"Majúscules automàtiques"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Configura diccionaris"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Correccions ràpides"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Corregeix els errors d\'ortografia habituals"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostra els suggeriments de correcció"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostra paraules suggerides mentre s\'escriu"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostra sempre"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostra en mode vertical"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Amaga sempre"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Canvi d\'idioma amb la barra espaiadora"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostra la tecla de configuració"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automàtic"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostra sempre"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Amaga sempre"</string>
<string name="auto_correction" msgid="4979925752001319458">"Correcció automàtica"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Barra espaiadora i punt. correg. autom. paraules mal escrites"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactiva"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Fet"</string>
<string name="label_send_key" msgid="2815056534433717444">"Envia"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Més"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro en tecl. símb."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. veu desactiv."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Selecciona el mètode d\'entrada"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Configuració de mètodes d\'entrada"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomes d\'entrada"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Selecciona l\'idioma d\'entrada"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Torna a tocar per desar"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Diccionari disponible"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Activa els comentaris de l\'usuari"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Toca per corregir paraules"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca les paraules introduïdes per corregir-les, només quan els suggeriments siguin visibles"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema del teclat"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclat txec"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Teclat àrab"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclat danès"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclat alemany"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Teclat alemany QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclat anglès (Regne Unit)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclat anglès (Estats Units)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclat espanyol"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Teclat finès"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclat francès"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclat francès (Canadà)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclat francès (Suïssa)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Teclat croat"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Teclat hongarès"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Teclat hebreu"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclat italià"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclat noruec"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclat holandès"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclat polonès"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclat portuguès"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclat rus"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclat serbi"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclat suec"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Teclat turc"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Veu en afrikaans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Veu txeca"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Veu alemanya"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Veu anglesa"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Veu espanyola"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Veu francesa"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Veu italiana"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Veu japonesa"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Veu coreana"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Veu holandesa"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Veu polonesa"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Veu portuguesa"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Veu russa"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Veu turca"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Veu xinesa (Yue)"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Veu xinesa (mandarí)"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Veu en zulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"QWERTY alemany"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Anglès (Regne Unit)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Anglès (EUA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Mode d\'estudi d\'usabilitat"</string>
</resources>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index 5807773e3..38417a0d5 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Klávesnice Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Nastavení klávesnice Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti zadávání textu a dat"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Při stisku klávesy vibrovat"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk při stisku klávesy"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Zobrazit znaky při stisku klávesy"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Použít jména ze seznamu kontaktů k návrhům a opravám"</string>
<string name="auto_cap" msgid="1719746674854628252">"Velká písmena automaticky"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfigurovat slovníky"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Rychlé opravy"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Opravuje nejčastější chyby při psaní"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobrazit návrhy oprav"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Zobrazovat navržená slova během psaní"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vždy zobrazovat"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Zobrazit v režimu na výšku"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vždy skrývat"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Přepínání jazyků mezerníkem"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Zobrazit klávesu Nastavení"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automaticky"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vždy zobrazovat"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vždy skrývat"</string>
<string name="auto_correction" msgid="4979925752001319458">"Automatické opravy"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Stisknutím mezerníku a interpunkce se automaticky opravují chybně napsaná slova"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Vypnuto"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string>
<string name="label_send_key" msgid="2815056534433717444">"Odeslat"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Další"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Čekat"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr. na kláv. se symb."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup vypnut"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Výběr metody zadávání dat"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Nakonfigurovat metody vstupu"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Vstupní jazyky"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Výběr jazyků vstupu"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Dalším dotykem slovo uložíte"</string>
<string name="has_dictionary" msgid="6071847973466625007">"K dispozici je slovník"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktivovat zasílání statistik užívání a zpráv o selhání"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotykem aktivovat opravy"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Klepnutím na zadaná slova tato slova opravíte, musí však být viditelné návrhy."</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Motiv klávesnice"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Klávesnice – čeština"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Klávesnice – arabština"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Klávesnice – dánština"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Klávesnice – němčina"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Německá klávesnice QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Klávesnice – angličtina (VB)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Klávesnice – angličtina (USA)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Klávesnice – španělština"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finská klávesnice"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Klávesnice – francouzština"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Klávesnice – francouzština (Kanada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Klávesnice – francouzština (Švýc.)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Chorvatská klávesnice"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Maďarská klávesnice"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Klávesnice – hebrejština"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Klávesnice – italština"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Klávesnice – norština"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Klávesnice – holandština"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polská klávesnice"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalská klávesnice"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Klávesnice – ruština"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Klávesnice – srbština"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Klávesnice – švédština"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Turecká klávesnice"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voice – afrikánština"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voice – čeština"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voice – němčina"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voice – angličtina"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voice – španělština"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voice – francouzština"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Hlasový vstup – italština"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voice – japonština"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voice – korejština"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Hlasový vstup – holandština"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voice – polština"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voice – portugalština"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voice – ruština"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voice – turečtina"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voice – čínština, kantonština"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voice – čínština, mandarínština"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voice – zulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"němčina (QWERTY)"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"angličtina (VB)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"angličtina (USA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Režim studie použitelnosti"</string>
</resources>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index c0dc9b7a8..97dc8a0ad 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android-tastatur"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Indstillinger for Android-tastatur"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Indstillinger for input"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibration ved tastetryk"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Lyd ved tastetryk"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup ved tastetryk"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Brug navne fra Kontaktpersoner til forslag og rettelser"</string>
<string name="auto_cap" msgid="1719746674854628252">"Skriv aut. med stort"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfigurer ordbøger"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Hurtige løsninger"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Retter almindelige stavefejl"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Vis rettelsesforslag"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vis ordforslag under indtastning"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vis altid"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Vis i portrættilstand"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Skjul altid"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Brug mellemrumst. som sprogskifter"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Vis indstillingsnøgle"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisk"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vis altid"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Skjul altid"</string>
<string name="auto_correction" msgid="4979925752001319458">"Automatisk retning"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Mellemrumstast og tegnsætning retter automatisk forkerte ord"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Fra"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Udfør"</string>
<string name="label_send_key" msgid="2815056534433717444">"Send"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Mere"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Vent"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. på symboltastatur"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Stemmeinput deaktiveret"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Vælg inputmetode"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Konfigurer inputmetoder"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Inputsprog"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Vælg inputsprog"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Tryk igen for at gemme"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Ordbog er tilgængelig"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brugerfeedback"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryk for at rette ord"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tryk på de indtastede ord for at rette dem. Kun når der er synlige forslag."</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tastaturtema"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tjekkisk tastatur"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabisk tastatur"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dansk tastatur"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tysk tastatur"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Tysk QWERTY-tastatur"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelsk tastatur (Storbritannien)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelsk tastatur (USA)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spansk tastatur"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finsk tastatur"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransk tastatur"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransk tastatur (Canada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransk tastatur (Schweiz)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Kroatisk tastatur"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Ungarsk tastatur"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebraisk tastatur"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiensk tastatur"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norsk tastatur"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Hollandsk tastatur"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polsk tastatur"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugisisk tastatur"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisk tastatur"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbisk tastatur"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svensk tastatur"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Tyrkisk tastatur"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans stemme"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tjekkisk stemme"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Tysk stemme"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Engelsk stemme"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spansk stemme"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransk stemme"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italiensk stemme"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japansk stemme"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreansk stemme"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Hollandsk stemme"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polsk stemme"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugisisk stemme"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russisk stemme"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Tyrkisk stemme"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Kinesisk, Yue stemme"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Kinesisk, mandarin stemme"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu stemme"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Tysk QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Engelsk (Storbritannien)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Engelsk (USA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Tilstand for brugsstudie"</string>
</resources>
diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml
index 10761328c..fdce3bb01 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android-Tastatur"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Android-Tastatureinstellungen"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Eingabeoptionen"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrieren b. Tastendruck"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Ton bei Tastendruck"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pop-up bei Tastendruck"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Namen aus \"Kontakte\" als Vorschläge und Korrekturmöglichkeiten anzeigen"</string>
<string name="auto_cap" msgid="1719746674854628252">"Autom. Groß-/Kleinschr."</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Wörterbücher konfigurieren"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Quick Fixes"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Korrigiert gängige Tippfehler"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Änderungsvorschläge anzeigen"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vorgeschlagene Wörter während des Tippens anzeigen"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Immer anzeigen"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Im Hochformat anzeigen"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Immer ausblenden"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Sprache mit Leertaste ändern"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Einstellungstaste anz."</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisch"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Immer anzeigen"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Immer ausblenden"</string>
<string name="auto_correction" msgid="4979925752001319458">"Autokorrektur"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Korrektur fehlerhafter Wörter durch Leertaste und Satzzeichen"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Aus"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Fertig"</string>
<string name="label_send_key" msgid="2815056534433717444">"Senden"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Mehr"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Warten"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikro auf Symboltastatur"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spracheingabe deaktiviert"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Eingabemethode auswählen"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Eingabemethoden konfigurieren"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Eingabesprachen"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Eingabesprachen auswählen"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Zum Speichern erneut berühren"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Wörterbuch verfügbar"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Nutzer-Feedback aktivieren"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Wortkorrektur"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tippen Sie zum Korrigieren auf eingegebene Wörter (nur, wenn Vorschläge angezeigt werden)."</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tastaturdesign"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tschechische Tastatur"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabische Tastatur"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dänische Tastatur"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Deutsche Tastatur"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Deutsche QWERTZ-Tastaturbelegung"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Englische Tastatur (GB)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Englische Tastatur (USA)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanische Tastatur"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finnische Tastatur"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Französische Tastatur"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Französische Tastatur (Kanada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Französische Tastatur (Schweiz)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Kroatische Tastatur"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Ungarische Tastatur"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebräische Tastatur"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italienische Tastatur"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegische Tastatur"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Niederländische Tastatur"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polnische Tastatur"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugiesische Tastatur"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russische Tastatur"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbische Tastatur"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Schwedische Tastatur"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Türkische Tastatur"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Stimme in Afrikaans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tschechische Sprache"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Deutsche Sprache"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Englische Stimme"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanische Sprache"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Französische Sprache"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italienisch"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanische Sprache"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreanische Sprache"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Niederländisch"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polnische Sprache"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugiesische Sprache"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russische Sprache"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Türkische Sprache"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinesische Stimme (Yue)"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinesische Stimme (Mandarin)"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Stimme in isiZulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Deutsche QWERTZ-Tastaturbelegung"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Englisch (GB)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Englisch (USA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modus der Studie zur Benutzerfreundlichkeit"</string>
</resources>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index 544a834cd..2629c2418 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Πληκτρολόγιο Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Ρυθμίσεις πληκτρολογίου Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Επιλογές εισόδου"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Δόνηση κατά το πάτημα πλήκτρων"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Ήχος κατά το πάτημα πλήκτρων"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Εμφάνιση με το πάτημα πλήκτρου"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Χρησιμοποιήστε ονόματα από τις Επαφές για προτάσεις και διορθ."</string>
<string name="auto_cap" msgid="1719746674854628252">"Αυτόματη χρήση κεφαλαίων"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Διαμόρφωση λεξικών"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Γρήγορες διορθώσεις"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Διορθώνει συνηθισμένα λάθη πληκτρολόγησης"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Εμφάνιση προτάσεων διόρθωσης"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Να εμφανίζεται πάντα"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Εμφάνιση σε λειτουργία κατακόρυφης προβολής"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Πάντα απόκρυψη"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Χρησιμοποιήστε τη δυνατότητα εναλλαγής γλώσσας του πλήκτρου διαστήματος"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Εμφάνιση πλήκτρου ρυθμίσεων"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Αυτόματο"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Να εμφανίζεται πάντα"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Πάντα απόκρυψη"</string>
<string name="auto_correction" msgid="4979925752001319458">"Αυτόματη διόρθωση"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Τα πλήκτρα διαστήματος και στίξης διορθ. αυτόμ. λάθος λέξεις"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Απενεργοποίηση"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Τέλος"</string>
<string name="label_send_key" msgid="2815056534433717444">"Αποστολή"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ΑΒΓ"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">";123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Περισσότερα"</string>
<string name="label_pause_key" msgid="181098308428035340">"Παύση"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Αναμ."</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Μικ. στο πληκ. συμβ."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Απεν. φωνητ. είσοδος"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Επιλογή μεθόδου εισόδου"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Διαμόρφωση μεθόδων εισαγωγής"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Γλώσσες εισόδου"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Επιλογή γλωσσών εισαγωγής"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Αγγίξτε ξανά για αποθήκευση"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Λεξικό διαθέσιμο"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Ενεργοποίηση σχολίων χρηστών"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Αγγίξτε για διόρθωση λέξεων"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Αγγίξτε τις λέξες για να τις διορθώσετε, μόνο όταν οι προτάσεις είναι ορατές"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Θέμα πληκτρολογίου"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Τσεχικό πληκτρολόγιο"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Πληκτρολόγιο με αραβική γραφή"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Δανικό πληκτρολόγιο"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Γερμανικό πληκτρολόγιο"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Γερμανικό πληκτρολόγιο QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Αγγλικό (ΗΒ) πληκτρολόγιο"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Αγγλικό (ΗΠΑ) πληκτρολόγιο"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ισπανικό πληκτρολόγιο"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Πληκτρ. με φινλανδικούς χαρακτήρες"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Γαλλικό πληκτρολόγιο"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Γαλλικό (Καναδάς) πληκτρολόγιο"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Γαλλικό (Ελβετία) πληκτρολόγιο"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Πληκτρολ. με κροατικούς χαρακτήρες"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Πληκτρολ. με ουγγρικούς χαρακτήρες"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Πληκτρολόγιο με εβραϊκή γραφή"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Ιταλικό πληκτρολόγιο"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Νορβηγικό πληκτρολόγιο"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Ολλανδικό πληκτρολόγιο"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Πληκτρολόγιο με πολωνικούς χαρακτήρες"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Πορτογαλικό πληκτρολόγιο"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ρωσικό πληκτρολόγιο"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Σερβικό πληκτρολόγιο"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Σουηδικό πληκτρολόγιο"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Πληκτρολόγιο με τουρκικούς χαρακτήρες"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Αφρικάανς"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Τσεχικά"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Γερμανικά"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Αγγλικά"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Ισπανικά"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Γαλλικά"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Φωνητικές εντολές στα Ιταλικά"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Ιαπωνικά"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Κορεατικά"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Φωνητικές εντολές στα Ολλανδικά"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Πολωνικά"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Πορτογαλικά"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Ρωσικά"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Τουρκικά"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Κινεζικά, Γιούε"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Κινεζικά, Μανδαρινικά"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Ζουλού"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Γερμανικά QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Αγγλικά (ΗΒ)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Αγγλικά (ΗΠΑ)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Λειτουργία μελέτης χρηστικότητας"</string>
</resources>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index bb3588ba7..7a0449c27 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android keyboard"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Android keyboard settings"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Input options"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrate on key-press"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Sound on key-press"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pop-up on key press"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Use names from Contacts for suggestions and corrections"</string>
<string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Configure dictionaries"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Quick fixes"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrects commonly typed mistakes"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Show correction suggestions"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Display suggested words while typing"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Always show"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Show on portrait mode"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Always hide"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Use the spacebar language switcher"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Show settings key"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatic"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Always show"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Always hide"</string>
<string name="auto_correction" msgid="4979925752001319458">"Auto-correction"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Spacebar and punctuation correct mistyped words automatically"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Off"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Done"</string>
<string name="label_send_key" msgid="2815056534433717444">"Send"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"More"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Wait"</string>
@@ -134,6 +133,7 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic on symbols keyboard"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Voice input is disabled"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Select input method"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Configure input methods"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Input languages"</string>
<string name="select_language" msgid="2573265881207142437">"Select input languages"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Touch again to save"</string>
@@ -143,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Touch to correct words"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Touch words entered to correct them, only when suggestions are visible"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Keyboard theme"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Czech Keyboard"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabic Keyboard"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danish Keyboard"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"German Keyboard"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"German QWERTY Keyboard"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"English (UK) Keyboard"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"English (US) Keyboard"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish Keyboard"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finnish Keyboard"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French Keyboard"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"French (Canada) Keyboard"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"French (Switzerland) Keyboard"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Croatian Keyboard"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Hungarian Keyboard"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebrew Keyboard"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italian Keyboard"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegian Keyboard"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Dutch Keyboard"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polish keyboard"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portuguese Keyboard"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russian Keyboard"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbian Keyboard"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Swedish Keyboard"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Turkish keyboard"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans Voice"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Czech Voice"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"German Voice"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"English Voice"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanish Voice"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"French Voice"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italian Voice"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanese Voice"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korean Voice"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Dutch Voice"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polish Voice"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portuguese Voice"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russian Voice"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkish Voice"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinese, Yue Voice"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinese, Mandarin Voice"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu Voice"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"German QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"English (UK)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"English (US)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Usability study mode"</string>
</resources>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index f5311b8f4..4eacee950 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Teclado de Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Configuración de teclado de Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Opciones de entrada"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar teclas"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Sonar al pulsar las teclas"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Aviso emergente al pulsar tecla"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Usar nombres de los contactos para sugerencias y correcciones"</string>
<string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Configurar diccionarios"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Arreglos rápidos"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige errores de escritura comunes"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugerencias de correcciones"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostrar palabras sugeridas al escribir"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar siempre"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar en modo retrato"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar siempre"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Usa select. de id. de barra espac."</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de configuración"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automático"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar siempre"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ocultar siempre"</string>
<string name="auto_correction" msgid="4979925752001319458">"Corrección automática"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"La barra espaciadora y puntuación insertan automáticamente las palabras corregidas"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivado"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Hecho"</string>
<string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Más"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micrófono en el teclado de símbolos"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"La entrada por voz está inhabilitada"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Seleccionar método de entrada"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Seleccionar idiomas de entrada"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Tocar de nuevo para guardar"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Diccionario disponible"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Habilitar los comentarios del usuario"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corregir palabras"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca las palabras ingresadas que desees corregir solo cuando las sugerencias estén visibles."</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema del teclado"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado en checo"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Teclado árabe"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado en danés"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado en alemán"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Teclado QWERTY alemán"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado en inglés (Reino Unido)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado en inglés (EE.UU.)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado en español"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Teclado finlandés"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado en francés"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado en francés (Canadá)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado en francés (Suiza)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Teclado croata"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Teclado húngaro"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Teclado hebreo"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado en italiano"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado en noruego"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado en holandés"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado polaco"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado en portugués"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado en ruso"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado en serbio"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado en sueco"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Teclado turco"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz en Afrikaans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz en checo"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz en alemán"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz en inglés"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz en español"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz en francés"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz en japonés"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz en coreano"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz en polaco"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz en portugués"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz en ruso"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz en turco"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz en Yue, chino"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz en mandarín, chino"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz en isiZulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"QWERTY alemán"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Inglés (Reino Unido)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Inglés (EE.UU.)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modo de estudio de usabilidad"</string>
</resources>
diff --git a/java/res/values-es/donottranslate-altchars.xml b/java/res/values-es/donottranslate-altchars.xml
index 16111ec42..e1f849f62 100644
--- a/java/res/values-es/donottranslate-altchars.xml
+++ b/java/res/values-es/donottranslate-altchars.xml
@@ -26,5 +26,4 @@
<string name="alternates_for_n">ñ,ń</string>
<string name="alternates_for_c">ç,ć,č</string>
<string name="alternates_for_punctuation">"\\,,\?,!,¿,¡,:,-,\',\",),(,/,;,+,&amp;,\@"</string>
- <string name="alternates_for_web_tab_punctuation">".,\\,,\?,!,¿,¡,:,-,\',\",),(,/,;,+,&amp;,\@"</string>
</resources>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index 2298e5599..aae38ca8d 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Teclado de Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Ajustes del teclado de Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Opciones introducción texto"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar tecla"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Sonido al pulsar tecla"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup al pulsar tecla"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizar nombres de contactos para sugerencias y correcciones"</string>
<string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Configurar diccionarios"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Correcciones rápidas"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige los errores tipográficos que se cometen con más frecuencia."</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugerencias de correcciones"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Muestra las palabras sugeridas mientras se escribe."</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar siempre"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar en modo vertical"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar siempre"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Utilizar espacio para cambiar idioma"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de ajustes"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automáticamente"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar siempre"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ocultar siempre"</string>
<string name="auto_correction" msgid="4979925752001319458">"Autocorrección"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Espacio y punt para corregir errores"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivada"</string>
@@ -64,9 +60,12 @@
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
<string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
<string name="label_next_key" msgid="362972844525672568">"Sig."</string>
- <string name="label_done_key" msgid="2441578748772529288">"Listo"</string>
+ <string name="label_done_key" msgid="2441578748772529288">"Ok"</string>
<string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Más"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
@@ -134,6 +133,7 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro en teclado de símbolos"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entrada de voz inhabilitada"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Seleccionar método de introducción de texto"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de introducción"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas"</string>
<string name="select_language" msgid="2573265881207142437">"Seleccionar idiomas de entrada"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Volver a tocar para guardar"</string>
@@ -143,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corregir palabras"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca las palabras introducidas para corregirlas, solo cuando las sugerencias sean visibles."</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema de teclado"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado checo"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Teclado árabe"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado danés"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado alemán"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Teclado QWERTY alemán"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado inglés (Reino Unido)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado de inglés (EE.UU.)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado español"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Teclado finlandés"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado francés"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado francés (Canadá)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado francés (Suiza)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Teclado croata"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Teclado húngaro"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Teclado hebreo"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado italiano"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado noruego"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado holandés"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado polaco"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado portugués"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado ruso"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado serbio"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado sueco"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Teclado turco"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz afrikáans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Google Voice en checo"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Google Voice en alemán"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz inglesa"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Google Voice en español"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Google Voice en francés"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Google Voice en japonés"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Google Voice en coreano"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Google Voice en polaco"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Google Voice en portugués"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Google Voice en ruso"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Google Voice en turco"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz china (cantonés)"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz china (mandarín)"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz zulú"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"QWERTY alemán"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"inglés (Reino Unido)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"inglés (EE.UU.)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modo de estudio de usabilidad"</string>
</resources>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index 3dccfb420..bacc180a1 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"صفحه کلید Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"تنظیمات صفحه کلید Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"گزینه های ورودی"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"لرزش با فشار کلید"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"صدا با فشار کلید"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"بازشو با فشار کلید"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"برای پیشنهاد و تصحیح از نام مخاطبین استفاده شود"</string>
<string name="auto_cap" msgid="1719746674854628252">"نوشتن با حروف بزرگ خودکار"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"پیکربندی لغت نامه ها"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"راه حل های سریع"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"تصحیح خطاهای تایپی رایج"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"نمایش پیشنهادات تصحیح"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"نمایش واژه های پیشنهادی در حین تایپ"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"همیشه نمایش داده شود"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"نمایش در حالت عمودی"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"همیشه پنهان شود"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"از ویژگی تعویض زبان کلید فاصله استفاده شود"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"نمایش کلید تنظیمات"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"خودکار"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"همیشه نمایش"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"همیشه پنهان"</string>
<string name="auto_correction" msgid="4979925752001319458">"تصحیح خودکار"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"کلید فاصله و علائم نگارشی به صورت خودکار کلماتی را که غلط تایپ شده اند تصحیح می کنند"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"خاموش"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"انجام شد"</string>
<string name="label_send_key" msgid="2815056534433717444">"ارسال"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"بیشتر"</string>
<string name="label_pause_key" msgid="181098308428035340">"توقف موقت"</string>
<string name="label_wait_key" msgid="6402152600878093134">"منتظر بمانید"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"میکروفن در صفحه کلید نمادها"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"ورودی صدا غیرفعال است"</string>
<string name="selectInputMethod" msgid="315076553378705821">"انتخاب روش ورودی"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"پیکربندی روش های ورودی"</string>
<string name="language_selection_title" msgid="1651299598555326750">"زبان های ورودی"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"انتخاب زبان های ورودی"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← جهت ذخیره دوباره لمس کنید"</string>
<string name="has_dictionary" msgid="6071847973466625007">"دیکشنری موجود است"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"فعال کردن بازخورد کاربر"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"برای تصحیح کلمات لمس کنید"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"فقط هنگامی که پیشنهادات قابل مشاهده هستند، برای تصحیح کلمات وارد شده آنها را لمس کنید"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"طرح زمینه صفحه کلید"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"صفحه کلید چک"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"صفحه کلید عربی"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"صفحه کلید دانمارکی"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"صفحه کلید آلمانی"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"صفحه کلید QWERTY آلمانی"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"صفحه کلید انگلیسی (بریتانیایی)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"صفحه کلید انگلیسی (آمریکایی)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"صفحه کلید اسپانیایی"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"صفحه کلید فنلاندی"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"صفحه کلید فرانسوی"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"صفحه کلید فرانسوی (کانادایی)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"صفحه کلید فرانسوی (سوئیس)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"صفحه کلید کرواتی"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"صفحه کلید مجارستانی"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"صفحه کلید عبری"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"صفحه کلید ایتالیایی"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"صفحه کلید نروژی"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"صفحه کلید هلندی"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"صفحه کلید لهستانی"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"صفحه کلید پرتغالی"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"صفحه کلید روسی"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"صفحه کلید صربی"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"صفحه کلید سوئدی"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"صفحه کلید ترکی"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"صدای آفریکانس"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"صدای چک"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"صدای آلمانی"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"صدای انگلیسی"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"صدای اسپانیایی"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"صدای فرانسوی"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"صدای ایتالیایی"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"صدای ژاپنی"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"صدای کره ای"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"صدای هلندی"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"صدای لهستانی"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"صدای پرتغالی"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"صدای روسی"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"صدای ترکی"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"صدای چینی، یوئه"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"صدای چینی، ماندارین"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"صدای ایزی زولو"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"آلمانی QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"انگیسی (انگلستان)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"انگیسی (US)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"حالت بررسی قابلیت استفاده"</string>
</resources>
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
index bd9fc1cde..1b45be745 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android-näppäimistö"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Android-näppäimistön asetukset"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Syöttövalinnat"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Käytä värinää näppäimiä painettaessa"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Toista ääni näppäimiä painettaessa"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Ponnahdusikkuna painalluksella"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Käytä yhteystietojen nimiä ehdotuksissa ja korjauksissa"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automaattiset isot kirjaimet"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Määritä sanakirjat"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Pikakorjaukset"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Korjaa yleiset kirjoitusvirheet"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Näytä korjausehdotukset"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Näytä sanaehdotukset kirjoitettaessa"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Näytä aina"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Näytä pystysuunnassa"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Piilota aina"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Vaihda kieli välil."</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Näytä asetukset-näppäin"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automaattinen"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Näytä aina"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Piilota aina"</string>
<string name="auto_correction" msgid="4979925752001319458">"Autom. korjaus"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Välilyönnit ja välimerkit korjaavat väärinkirjoitetut sanat automaattisesti"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Älä käytä"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Valmis"</string>
<string name="label_send_key" msgid="2815056534433717444">"Lähetä"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Lisää"</string>
<string name="label_pause_key" msgid="181098308428035340">"Tauko"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Odota"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr. symbolinäppäim."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Ääniohjaus on pois käytöstä"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Valitse syöttötapa"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Määritä syöttötavat"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Syöttökielet"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Valitse syöttökielet"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Tallenna koskettamalla uudelleen"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Sanakirja saatavilla"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Ota käyttäjäpalaute käyttöön"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Korjaa sanoja koskettamalla"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Korjaa annetut sanat napauttamalla. (Vain, kun ehdotuksia on näkyvillä.)"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Näppäimistöteema"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Näppäimistö: tšekki"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabiankielinen näppäimistö"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Näppäimistö: tanska"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Näppäimistö: saksa"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Saksalainen QWERTY-näppäimistö"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Näppäimistö: englanti (UK)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Näppäimistö: englanti (US)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Näppäimistö: espanja"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Näppäimistö: suomi"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Näppäimistö: ranska"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Näppäimistö: ranska (Kanada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Näppäimistö: ranska (Sveitsi)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Näppäimistö: kroatia"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Näppäimistö: unkari"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hepreankielinen näppäimistö"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Näppäimistö: italia"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Näppäimistö: norja"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Näppäimistö: hollanti"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Näppäimistö: puola"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Näppäimistö: portugali"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Näppäimistö: venäjä"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Näppäimistö: serbia"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Näppäimistö: ruotsi"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Näppäimistö: turkki"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Ääni: afrikaans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Ääni: tšekki"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Ääni: saksa"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Ääni: englanti"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Ääni: espanja"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Ääni: ranska"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"italia (ääni)"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Ääni: japani"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Ääni: korea"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"hollanti (ääni)"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Ääni: puola"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Ääni: portugali"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Ääni: venäjä"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Ääni: turkki"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Ääni: kiina, yue"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Ääni: mandariinikiina"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Ääni: isiZulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"saksa, QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"englanti (UK)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"englanti (USA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Käytettävyystutkimustila"</string>
</resources>
diff --git a/java/res/values-fr/donottranslate.xml b/java/res/values-fr/donottranslate.xml
index 09c37e31a..695750f32 100644
--- a/java/res/values-fr/donottranslate.xml
+++ b/java/res/values-fr/donottranslate.xml
@@ -25,5 +25,5 @@
<!-- Symbols that should promote magic spaces into real space -->
<string name="magic_space_promoting_symbols">;:!?([*&amp;@{&lt;&gt;+=|</string>
<!-- Symbols that do NOT separate words -->
- <string name="non_word_separator_symbols">\u0027</string>
+ <string name="symbols_excluded_from_word_separators">\u0027</string>
</resources>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index f54b27f69..e658da024 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Clavier Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Paramètres du clavier Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Options de saisie"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer à chaque touche"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Son à chaque touche"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Agrandir les caractères"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utiliser des noms de contacts pour les suggestions et corrections"</string>
<string name="auto_cap" msgid="1719746674854628252">"Majuscules auto"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Configurer les dictionnaires"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Corrections rapides"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige les fautes de frappe courantes"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Afficher les suggestions de correction"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Afficher les suggestions de terme lors de la saisie"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Toujours afficher"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Afficher en mode Portrait"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Toujours masquer"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Barre d\'espace pour changer langue"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Afficher touche param."</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatique"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Toujours afficher"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Toujours masquer"</string>
<string name="auto_correction" msgid="4979925752001319458">"Correction auto."</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Corriger autom. orthographe (pression sur barre espace/signes ponctuation)"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Désactiver"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"OK"</string>
<string name="label_send_key" msgid="2815056534433717444">"Envoyer"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Plus"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Attente"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro sur clavier symboles"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Saisie vocale désactivée"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Sélectionner un mode de saisie."</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Configurer les modes de saisie"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Sélectionner les langues de saisie"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Appuyer de nouveau pour enregistrer"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Dictionnaire disponible"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Autoriser les commentaires des utilisateurs"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Appuyer pour corriger"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Appuyer sur les mots saisis pour les corriger, uniquement lorsque des suggestions sont visibles"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Thème du clavier"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Clavier tchèque"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Clavier arabe"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Clavier danois"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Clavier allemand"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Clavier QWERTY allemand"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Clavier anglais (Royaume-Uni)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Clavier anglais (États-Unis)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Clavier espagnol"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Clavier finnois"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Clavier français"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Clavier français (Canada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Clavier français (Suisse)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Clavier croate"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Clavier hongrois"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Clavier hébreu"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Clavier italien"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Clavier norvégien"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Clavier néerlandais"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Clavier polonais"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Clavier portugais"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Clavier russe"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Clavier serbe"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Clavier suédois"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Clavier turc"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voix parlant afrikaans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voix tchèque"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voix allemande"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voix parlant anglais"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voix espagnole"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voix française"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voix parlant italien"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voix japonaise"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voix coréenne"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voix parlant néerlandais"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voix polonaise"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voix portugaise"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voix russe"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voix turque"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voix parlant chinois (cantonais)"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voix parlant chinois (mandarin)"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voix parlant zoulou"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Clavier QWERTY allemand"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Anglais (Royaume-Uni)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Anglais (États-Unis)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Mode d\'étude de l\'utilisabilité"</string>
</resources>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index d22432a97..55d4b145c 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android tipkovnica"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Postavke tipkovnice za Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Opcije ulaza"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibracija pri pritisku na tipku"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk pri pritisku tipke"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Povećanja na pritisak tipke"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Upotreba imena iz Kontakata za prijedloge i ispravke"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automatsko pisanje velikih slova"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfiguracija rječnika"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Brzi popravci"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Ispravlja uobičajene pogreške u pisanju"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokaži prijedloge ispravka"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Prikazivanje predloženih riječi prilikom upisivanja"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Uvijek prikaži"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Prikaži u portretnom načinu"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Uvijek sakrij"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Upotrijebite razmaknicu za prebacivanje jezika"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Prikaži tipku postavki"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatski"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Uvijek prikaži"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Uvijek sakrij"</string>
<string name="auto_correction" msgid="4979925752001319458">"Samoispravak"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Razm. i intrp. aut. ispr. kr. rči."</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Isključeno"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Gotovo"</string>
<string name="label_send_key" msgid="2815056534433717444">"Pošalji"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Više"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Pričekaj"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. na tipk. simb."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. unos onemog."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Odabir ulazne metode"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Konfiguriraj načine ulaza"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Jezici unosa"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Odaberite jezike unosa"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Dodirnite opet za spremanje"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Rječnik je dostupan"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Omogući korisničke povratne informacije"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dodirnite za ispravak riječi"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dodirnite unesene riječi da biste ih ispravili samo kada su prijedlozi vidljivi"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema tipkovnice"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Češka tipkovnica"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arapska tipkovnica"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danska tipkovnica"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Njemačka tipkovnica"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Njemačka QWERTY tipkovnica"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engleska (UK) tipkovnica"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engleska (SAD) tipkovnica"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španjolska tipkovnica"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finska tipkovnica"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francuska tipkovnica"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Francuska (Kanada) tipkovnica"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francuska (Švicarska) tipkovnica"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Hrvatska tipkovnica"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Mađarska tipkovnica"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebrejska tipkovnica"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Talijanska tipkovnica"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveška tipkovnica"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nizozemska tipkovnica"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poljska tipkovnica"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalska tipkovnica"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ruska tipkovnica"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Srpska tipkovnica"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švedska tipkovnica"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Turska tipkovnica"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"afrikaans glasovno"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Češki glasovni"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Njemački glasovni"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"engleski glasovno"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Španjolski glas"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Francuski glas"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Talijanski glas"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanski glas"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korejski glas"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Nizozemski glas"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Poljski glas"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugalski glas"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Ruski glas"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turski glas"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"kineski, Yue glasovno"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"kineski, mandarinski glasovno"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu glasovno"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"njemački QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"engleski (Velika Britanija)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"engleski (SAD)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Način studije upotrebljivosti"</string>
</resources>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index 7411923dd..d682b82ec 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android-billentyűzet"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Android billentyűzetbeállítások"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Beviteli beállítások"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Rezgés billentyű megnyomása esetén"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Hangjelzés billentyű megnyomása esetén"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Legyen nagyobb billentyű lenyomásakor"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"A névjegyek használata a javaslatokhoz és javításokhoz"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automatikusan nagy kezdőbetű"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Szótárak konfigurálása"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Gyorsjavítások"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Kijavítja a gyakori gépelési hibákat"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Javítási ajánlások megjelenítése"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"A javasolt szavak megjelenítése gépelés közben"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mindig látszik"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Megjelenítés álló tájolásban"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Mindig rejtve"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Nyelvváltó: szóköz"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Beállítások billentyű megjelenítése"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatikus"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mindig látszik"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Mindig rejtve"</string>
<string name="auto_correction" msgid="4979925752001319458">"Automatikus javítás"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Szóköz és központozás automatikusan javítja az elgépelést"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Ki"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Kész"</string>
<string name="label_send_key" msgid="2815056534433717444">"Küldés"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Egyebek"</string>
<string name="label_pause_key" msgid="181098308428035340">"Szün."</string>
<string name="label_wait_key" msgid="6402152600878093134">"Vár"</string>
@@ -134,6 +133,7 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr. a szimbólumoknál"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hangbevivel KI"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Beviteli mód kiválasztása"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Beviteli módok beállítása"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Beviteli nyelvek"</string>
<string name="select_language" msgid="2573265881207142437">"Válassza ki a beviteli nyelveket"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Érintse meg újra a mentéshez"</string>
@@ -143,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Javítás a szavak megérintésével"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"A beírt szavakat csak akkor javíthatja ki megérintve, ha látszanak javaslatok"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Billentyűzettéma"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Cseh billentyűzet"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arab billentyűzet"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dán billentyűzet"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Német billentyűzet"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Német QWERTY billentyűzet"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angol (UK) billentyűzet"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angol (US) billentyűzet"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanyol billentyűzet"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finn billentyűzet"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francia billentyűzet"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Francia (kanadai) billentyűzet"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francia (svájci) billentyűzet"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Horvát billentyűzet"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Magyar billentyűzet"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Héber billentyűzet"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Olasz billentyűzet"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvég billentyűzet"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holland billentyűzet"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Lengyel billentyűzet"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugál billentyűzet"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Orosz billentyűzet"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Szerb billentyűzet"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svéd billentyűzet"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Török billentyűzet"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans hang"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Cseh hang"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Német hang"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Angol hang"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanyol hang"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Francia hang"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Olasz hang"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japán hang"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreai hang"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Holland hang"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Lengyel hang"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugál hang"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Orosz hang"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Török hang"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Kínai (jüe) hang"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Kínai (mandarin) hang"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu hang"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Német QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"angol (brit)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"angol (amerikai)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Használhatósági teszt"</string>
</resources>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 6cdf8578a..d8bb604d4 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Keyboard Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Setelan keyboard Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Opsi masukan"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar jika tombol ditekan"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Berbunyi jika tombol ditekan"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Muncul saat tombol ditekan"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Menggunakan nama dari Kenalan untuk saran dan koreksi"</string>
<string name="auto_cap" msgid="1719746674854628252">"Kapitalisasi otomatis"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfigurasikan kamus"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Perbaikan cepat"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Memperbaiki kesalahan ketik umum"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Tampilkan saran koreksi"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Tampilkan kata yang disarankan ketika mengetik"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Selalu tampilkan"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Tampilkan pada mode potret"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Selalu sembunyikan"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Gunakan pengalih bahasa bilah spasi"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Lihat tombol setelan"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Otomatis"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Selalu tampilkan"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Selalu sembunyikan"</string>
<string name="auto_correction" msgid="4979925752001319458">"Koreksi otomatis"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Bilah spasi dan tanda baca secara otomatis dikoreksi pada kata yang salah ketik"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Mati"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Selesai"</string>
<string name="label_send_key" msgid="2815056534433717444">"Kirimkan"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Lainnya"</string>
<string name="label_pause_key" msgid="181098308428035340">"Jeda"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Tunggu"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik pada keyboard simbol"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Masukan suara dinonaktifkan"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Pilih metode masukan"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Konfigurasi metode masukan"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Bahasa masukan"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Pilih bahasa masukan"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Sentuh sekali lagi untuk menyimpan"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Kamus yang tersedia"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktifkan umpan balik pengguna"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Sentuh untuk memperbaiki kata"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Sentuh kata yang dimasukkan untuk memperbaikinya, hanya saat saran dapat dilihat"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema keyboard"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Keyboard Cheska"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Papan Tombol Arab"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Keyboard Denmark"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Keyboard Jerman"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Keyboard QWERTY Jerman"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Keyboard Inggris (Britania Raya)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Keyboard Inggris (AS)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Keyboard Spanyol"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Keyboard Suomi"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Keyboard Prancis"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Keyboard Prancis (Kanada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Keyboard Prancis (Swiss)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Keyboard Kroat"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Keyboard Magyar"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Papan tombol Ibrani"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Keyboard Italia"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Keyboard Norwegia"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Keyboard Belanda"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Keyboard bahasa Polski"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Keyboard Portugis"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Keyboard Rusia"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Keyboard Serbia"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Keyboard Swedia"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Keyboard Bahasa Turki"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Suara Bahasa Afrika"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Suara Bahasa Cheska"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Suara Bahasa Jerman"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Suara Bahasa Inggris"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Suara Bahasa Spanyol"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Suara Bahasa Prancis"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Suara Bahasa Italia"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Suara Bahasa Jepang"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Suara Bahasa Korea"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Suara Bahasa Belanda"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Suara Bahasa Polandia"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Suara Bahasa Portugis"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Suara Bahasa Rusia"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Suara Bahasa Turki"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Suara Bahasa China, Yue"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Suara Bahasa China, Mandarin"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Suara Zulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"QWERTY Jerman"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Inggris (UK)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Inggris (AS)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modus studi daya guna"</string>
</resources>
diff --git a/java/res/values-it/donottranslate.xml b/java/res/values-it/donottranslate.xml
index adb2a9a9d..58e94361b 100644
--- a/java/res/values-it/donottranslate.xml
+++ b/java/res/values-it/donottranslate.xml
@@ -19,5 +19,5 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Symbols that do NOT separate words -->
- <string name="non_word_separator_symbols"></string>
+ <string name="symbols_excluded_from_word_separators"></string>
</resources>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index 360b92f38..d122f5087 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -23,6 +23,7 @@
<string name="english_ime_name" msgid="7252517407088836577">"Tastiera Android"</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="spell_checker_service_name" msgid="2003013122022285508">"Correzione Android"</string>
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrazione tasti"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Suono tasti"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup sui tasti"</string>
@@ -39,18 +40,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizza nomi di Contatti per suggerimenti e correzioni"</string>
<string name="auto_cap" msgid="1719746674854628252">"Maiuscole automatiche"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Configura dizionari"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Correzioni veloci"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Corregge gli errori di digitazione più comuni"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostra suggerimenti correzioni"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Visualizza le parole suggerite durante la digitazione"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostra sempre"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostra in modalità verticale"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Nascondi sempre"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Selettore lingua da barra spaziatrice"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostra tasto impostaz."</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatico"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostra sempre"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Nascondi sempre"</string>
<string name="auto_correction" msgid="4979925752001319458">"Correzione automatica"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Barra spaziatrice/punteggiatura correggono parole con errori"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Off"</string>
@@ -67,6 +62,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Fine"</string>
<string name="label_send_key" msgid="2815056534433717444">"Invia"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Altro"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Attesa"</string>
@@ -134,6 +132,7 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic su tastiera simboli"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Comandi vocali disatt."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Seleziona metodo di inserimento"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Configura metodi di immissione"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Lingue comandi"</string>
<string name="select_language" msgid="2573265881207142437">"Seleziona lingue di immissione"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Tocca di nuovo per salvare"</string>
@@ -143,46 +142,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocca per correggere"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tocca le parole inserite per correggerle, solo quando sono visibili i suggerimenti"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema della tastiera"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tastiera ceca"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Tastiera araba"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Tastiera danese"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tastiera tedesca"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Tastiera QWERTY tedesca"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastiera inglese (Regno Unito)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tastiera inglese (Stati Uniti)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Tastiera spagnola"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Tastiera finlandese"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastiera francese"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tastiera francese (Canada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tastiera francese (Svizzera)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Tastiera croata"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Tastiera ungherese"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Tastiera ebraica"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Tastiera italiana"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Tastiera norvegese"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Tastiera olandese"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Tastiera polacca"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Tastiera portoghese"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Tastiera russa"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Tastiera serba"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Tastiera svedese"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Tastiera turca"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voce afrikaans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voce ceca"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voce tedesca"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voce inglese"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voce spagnola"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voce francese"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voce italiana"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voce giapponese"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voce coreana"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voce olandese"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voce polacca"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voce portoghese"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voce russa"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voce turca"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voce cinese Yue"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voce cinese mandarino"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voce isiZulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"QWERTY tedesca"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Inglese (UK)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Inglese (USA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modalità Studio sull\'usabilità"</string>
</resources>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 93da0281d..b49091335 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"מקלדת Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"הגדרות מקלדת של Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"אפשרויות קלט"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"רטט עם לחיצה על מקשים"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"צלילים עם לחיצה על מקשים"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"חלון קופץ עם לחיצה על מקשים"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"השתמש בשמות מאנשי קשר עבור הצעות ותיקונים"</string>
<string name="auto_cap" msgid="1719746674854628252">"הפיכה אוטומטית של אותיות לרישיות"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"הגדרת מילונים"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"תיקונים מהירים"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"מתקן שגיאות הקלדה נפוצות"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"הצג הצעות לתיקונים"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"הצג הצעות למילים בעת הקלדה"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"הצג תמיד"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"הצג בפריסה לאורך"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"הסתר תמיד"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"השתמש במחליף השפה שבמקש הרווח"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"הצג מקש הגדרות"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"אוטומטי"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"הצג תמיד"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"הסתר תמיד"</string>
<string name="auto_correction" msgid="4979925752001319458">"תיקון אוטומטי"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"מקש הרווח ופיסוק מתקנים אוטומטית שגיאות הקלדה"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"כבוי"</string>
@@ -66,7 +62,10 @@
<string name="label_next_key" msgid="362972844525672568">"הבא"</string>
<string name="label_done_key" msgid="2441578748772529288">"בוצע"</string>
<string name="label_send_key" msgid="2815056534433717444">"שלח"</string>
- <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_alpha_key" msgid="4793983863798817523">"אבג"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"עוד"</string>
<string name="label_pause_key" msgid="181098308428035340">"השהה"</string>
<string name="label_wait_key" msgid="6402152600878093134">"המתן"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"מיקרופון במקלדת הסמלים"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"הקלט הקולי מושבת"</string>
<string name="selectInputMethod" msgid="315076553378705821">"בחר שיטת קלט"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"הגדרת שיטות קלט"</string>
<string name="language_selection_title" msgid="1651299598555326750">"שפות קלט"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"בחר שפות קלט"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← גע שוב כדי לשמור"</string>
<string name="has_dictionary" msgid="6071847973466625007">"מילון זמין"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"הפוך משוב ממשתמשים לפעיל"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"גע כדי לתקן מילים"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"גע במילים שהוזנו כדי לתקן אותן, רק כאשר הצעות מוצגות"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"עיצוב מקלדת"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"מקלדת צ\'כית"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"מקלדת בשפה הערבית"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"מקלדת דנית"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"מקלדת גרמנית "</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"מקלדת QWERTY גרמנית"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"מקלדת אנגלית (בריטניה)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"מקלדת אנגלית (ארה\"ב)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"מקלדת ספרדית"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"מקלדת פינית"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"מקלדת צרפתית"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"מקלדת צרפתית (קנדה)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"מקלדת צרפתית (שוויץ)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"מקלדת קרואטית"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"מקלדת הונגרית"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"מקלדת בשפה העברית"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"מקלדת איטלקית"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"מקלדת נורווגית"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"מקלדת הולנדית"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"מקלדת פולנית"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"מקלדת פורטוגזית"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"מקלדת רוסית"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"מקלדת סרבית"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"מקלדת שוודית"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"מקלדת טורקית"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Google Voice באפריקאנס"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Google Voice צ\'כי"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Google Voice גרמני"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Google Voice באנגלית"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Google Voice ספרדי"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Google Voice צרפתי"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"קול באיטלקית"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Google Voice יפני"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Google Voice קוריאני"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"קול בהולנדית"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Google Voice פולני"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Google Voice פורטוגזי"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Google Voice רוסי"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Google Voice תורכי"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Google Voice בסינית, יו"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Google Voice בסינית, מנדרינית"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Google Voice באיסיזולו"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"מקלדת QWERTY גרמנית"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"אנגלית (בריטניה)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"אנגלית (ארה\"ב)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"מצב מחקר שימושיות"</string>
</resources>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index 3f819cee2..8ac407a06 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Androidキーボード"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Androidキーボードの設定"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"入力オプション"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"キー操作バイブ"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"キー操作音"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"キー押下時ポップアップ"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"連絡先の名前を使用して候補表示や自動修正を行います"</string>
<string name="auto_cap" msgid="1719746674854628252">"自動大文字変換"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"辞書を設定"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"クイックフィックス"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"よくある誤字・脱字を修正します"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"修正候補を表示する"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"入力中に入力候補を表示する"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"常に表示"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"縦向きで表示"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"常に非表示"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"スペースバーで切替"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"設定キーを表示"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"自動"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"常に表示"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"常に非表示"</string>
<string name="auto_correction" msgid="4979925752001319458">"自動修正"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"誤入力をスペースまたは句読点キーで修正する"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"OFF"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"完了"</string>
<string name="label_send_key" msgid="2815056534433717444">"送信"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Shift"</string>
<string name="label_pause_key" msgid="181098308428035340">"停止"</string>
<string name="label_wait_key" msgid="6402152600878093134">"待機"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"記号キーボードのマイク"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"音声入力は無効です"</string>
<string name="selectInputMethod" msgid="315076553378705821">"入力方法の選択"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"入力方法の設定"</string>
<string name="language_selection_title" msgid="1651299598555326750">"入力言語"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"入力言語の選択"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"←保存するにはもう一度タップ"</string>
<string name="has_dictionary" msgid="6071847973466625007">"辞書を利用できます"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"ユーザーフィードバックを有効にする"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"タップして語句を修正"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"候補が表示されているときのみ、入力した語句をタップして修正する"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"キーボードのテーマ"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"チェコ語のキーボード"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"アラビア語のキーボード"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"デンマーク語のキーボード"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"ドイツ語のキーボード"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"ドイツ語QWERTYキーボード"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英語(英国)のキーボード"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英語(米国)のキーボード"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"スペイン語のキーボード"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"フィンランド語キーボード"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"フランス語のキーボード"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"フランス語(カナダ)のキーボード"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"フランス語(スイス)のキーボード"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"クロアチア語キーボード"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"ハンガリー語キーボード"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"ヘブライ語のキーボード"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"イタリア語のキーボード"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"ノルウェー語のキーボード"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"オランダ語のキーボード"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"ポーランド語のキーボード"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"ポルトガル語のキーボード"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"ロシア語のキーボード"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"セルビア語のキーボード"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"スウェーデン語のキーボード"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"トルコ語のキーボード"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"アフリカーンス語の音声"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"チェコ語の音声"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"ドイツ語の音声"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"英語の音声"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"スペイン語の音声"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"フランス語の音声"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"イタリア語の音声"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日本語の音声"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韓国語の音声"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"オランダ語の音声"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"ポーランド語の音声"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"ポルトガル語の音声"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"ロシア語の音声"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"トルコ語の音声"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"中国語(広東語)の音声"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"中国語(標準語)の音声"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"ズールー語の音声"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"ドイツ語QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"英語(英国)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"英語(米国)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"使いやすさの研究モード"</string>
</resources>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index e9c2e4cf2..c9000d18a 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android 키보드"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Android 키보드 설정"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"입력 옵션"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"키를 누를 때 진동 발생"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"키를 누를 때 소리 발생"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"키를 누를 때 팝업"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"추천 및 수정에 주소록의 이름 사용"</string>
<string name="auto_cap" msgid="1719746674854628252">"자동 대문자화"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"사전 설정"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"빠른 수정"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"자주 발생하는 오타를 수정합니다."</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"수정 제안 표시"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"글자를 입력하는 동안 추천 단어 표시"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"항상 표시"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"세로 모드로 표시"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"항상 숨기기"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"스페이스 바 언어 교환기 사용"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"설정 키 표시"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"자동"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"항상 표시"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"항상 숨기기"</string>
<string name="auto_correction" msgid="4979925752001319458">"자동 수정"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"스페이스바와 문장부호 키를 사용하면 오타가 자동으로 교정됩니다."</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"사용 안함"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"완료"</string>
<string name="label_send_key" msgid="2815056534433717444">"전송"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"더보기"</string>
<string name="label_pause_key" msgid="181098308428035340">"일시 중지"</string>
<string name="label_wait_key" msgid="6402152600878093134">"대기"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"기호 키보드의 마이크"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"음성 입력이 사용 중지됨"</string>
<string name="selectInputMethod" msgid="315076553378705821">"입력 방법 선택"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"입력 방법 설정"</string>
<string name="language_selection_title" msgid="1651299598555326750">"입력 언어"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"입력 언어 선택"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← 저장하려면 다시 터치하세요."</string>
<string name="has_dictionary" msgid="6071847973466625007">"사전 사용 가능"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"사용자 의견 사용"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"터치하여 단어 수정"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"입력한 단어를 터치하여 수정(추천 단어가 표시되는 경우에만)"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"키보드 테마"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"체코어 키보드"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"아랍어 키보드"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"덴마크어 키보드"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"독일어 키보드"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"독일어 QWERTY 키보드"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"영어(영국) 키보드"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"영어(미국) 키보드"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"스페인어 키보드"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"핀란드어 키보드"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"프랑스어 키보드"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"프랑스어(캐나다) 키보드"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"프랑스어(스위스) 키보드"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"크로아티아어 키보드"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"헝가리어 키보드"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"히브리어 키보드"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"이탈리아어 키보드"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"노르웨이어 키보드"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"네덜란드어 키보드"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"폴란드어 키보드"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"포르투갈어 키보드"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"러시아어 키보드"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"세르비아어 키보드"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"스웨덴어 키보드"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"터키어 키보드"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"아프리칸스어 음성"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"체코어 음성"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"독일어 음성"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"영어 음성"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"스페인어 음성"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"프랑스어 음성"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"이탈리아어 음성"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"일본어 키보드"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"한국어 음성"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"네덜란드어 음성"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"폴란드어 음성"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"포르투갈어 음성"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"러시아어 음성"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"터키어 음성"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"중국어, 광둥어 음성"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"중국어, 북경어 음성"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"줄루어 음성"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"독일어 QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"영어(영국)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"영어(미국)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"가용성 연구 모드"</string>
</resources>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index 191b0185f..4113ef32c 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"„Android“ klaviatūra"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"„Android“ klaviatūros nustatymai"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Įvesties parinktys"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibruoti, kai paspaudžiami klavišai"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Klavišo paspaudimo garsas"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Iššoka paspaudus klavišą"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Siūlant ir taisant naudoti vardus iš „Kontaktų“"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automatinis didžiųjų raidžių rašymas"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfigūruoti žodynus"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Greiti pataisymai"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Taiso dažnai padarytas rašybos klaidas"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Rodyti taisymo pasiūlymus"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Įvedant tekstą pateikti siūlomų žodžių"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Visada rodyti"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Rodyti stačiuoju režimu"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Visada slėpti"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Naud. tarpo kl. k. jung."</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Rodyti nustatymų raktą"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatinis"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Visada rodyti"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Visada slėpti"</string>
<string name="auto_correction" msgid="4979925752001319458">"Automatinis taisymas"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Tarpo kl. ir skyr. ženkl. aut. išt. neteis. įv. žodž."</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Išjungta"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Atlikta"</string>
<string name="label_send_key" msgid="2815056534433717444">"Siųsti"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Daugiau"</string>
<string name="label_pause_key" msgid="181098308428035340">"Prist."</string>
<string name="label_wait_key" msgid="6402152600878093134">"Lauk."</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrof. simb. klav."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balso įv. neleidž."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Pasirinkti įvesties metodą"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Konfigūruoti įvesties metodus"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Įvesties kalbos"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Pasirinkite įvesties kalbas"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Kad išsaugotumėte, dar kartą palieskite"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Žodynas galimas"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Įgalinti naudotojų atsiliepimus"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Jei norite ištais. žodž., paliesk."</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Jei norite ištaisyti įvestus žodžius, palieskite juos tik tada, kai matomi pasiūlymai"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Klaviatūros tema"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Čekiška klaviatūra"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabiška klaviatūra"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Daniška klaviatūra"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Vokiška klaviatūra"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Vokiška QWERTY klaviatūra"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angliška (JK) klaviatūra"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angliška (JAV) klaviatūra"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ispaniška klaviatūra"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Suomiška klaviatūra"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Prancūziška klaviatūra"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Prancūziška (Kanada) klaviatūra"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Prancūziška (Šveicarija) klaviatūra"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Kroatiška klaviatūra"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Vengriška klaviatūra"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebrajiška klaviatūra"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Itališka klaviatūra"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvegiška klaviatūra"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Olandiška klaviatūra"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Lenkiška klaviatūra"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugališka klaviatūra"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Rusiška klaviatūra"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbiška klaviatūra"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švediška klaviatūra"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Turkiška klaviatūra"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"„Voice“ afrikanų k."</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"„Voice“ čekų k."</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"„Voice“ vokiečių k."</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"„Voice“ anglų k."</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"„Voice“ ispanų k."</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"„Voice“ prancūzų k."</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"„Voice“ italų k."</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"„Voice“ japonų k."</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"„Voice“ korėjiečių k."</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"„Voice“ olandų k."</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"„Voice“ lenkų k."</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"„Voice“ portugalų k."</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"„Voice“ rusų k."</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"„Voice“ turkų k."</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"„Voice“ kinų (dziue) k."</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"„Voice“ kinų (mandarinų) k."</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"„Voice“ zulų k."</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"QWERTY klaviatūra vokiečių k."</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Anglų k. (JK)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Anglų k. (JAV)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Tinkamumo tyrimo režimas"</string>
</resources>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
index 8a77d0035..e5da1dc4e 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android tastatūra"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Android tastatūras iestatījumi"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Ievades opcijas"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrēt, nospiežot taustiņu"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Skaņa, nospiežot taustiņu"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Nospiežot taustiņu, parādīt uznirstošo izvēlni"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Izmantot kontaktpersonu vārdus kā ieteikumus un labojumus"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automātiska lielo burtu lietošana"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfigurēt vārdnīcas"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Ātrie labojumi"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Nodrošina izplatītu drukas kļūdu labošanu."</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Rādīt labojumu ieteikumus"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Ievades laikā attēlot ieteiktos vārdus"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vienmēr rādīt"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Rādīt portreta režīmā"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vienmēr slēpt"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Izmantot valodu pārslēgšanai atstarpēšanas taustiņu"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Rādīt iestatījumu taustiņu"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automātiski"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vienmēr rādīt"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vienmēr slēpt"</string>
<string name="auto_correction" msgid="4979925752001319458">"Automāt. korekcija"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Atstarpes taustiņš un interpunkcija; automātiska kļūdainu vārdu labošana"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Izslēgta"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Gatavs"</string>
<string name="label_send_key" msgid="2815056534433717444">"Sūtīt"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Vairāk"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pauze"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Gaidīt"</string>
@@ -134,6 +133,7 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr.uz simb.tastat."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balss iev. atspējota"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Atlasīt ievades metodi"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Ievades metožu konfigurēšana"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Ievades valodas"</string>
<string name="select_language" msgid="2573265881207142437">"Atlasīt ievades valodas"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Pieskarieties vēlreiz, lai saglabātu"</string>
@@ -143,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Pieskarties, lai izlabotu vārdus"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pieskarties ievadītajiem vārdiem, lai tos labotu (tikai tad, ja tiek rādīti ieteikumi)."</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tastatūras motīvs"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Čehu tastatūra"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arābu tastatūra"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dāņu tastatūra"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Vācu tastatūra"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Vācu QWERTY tastatūra"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angļu (Lielbritānija) tastatūra"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angļu (ASV) tastatūra"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spāņu tastatūra"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Somu valodas tastatūra"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franču tastatūra"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franču (Kanāda) tastatūra"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franču (Šveices) tastatūra"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Horvātu valodas tastatūra"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Ungāru valodas tastatūra"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Ebreju tastatūra"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Itāļu tastatūra"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvēģu tastatūra"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holandiešu tastatūra"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poļu valodas tastatūra"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugāļu valodas tastatūra"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Krievu tastatūra"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbu tastatūra"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Zviedru tastatūra"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Turku valodas tastatūra"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Balss afrikandu valodā"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voice čehu valodā"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voice vācu valodā"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Balss angļu valodā"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voice spāņu valodā"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voice franču valodā"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Itāļu balss"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voice japāņu valodā"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voice korejiešu valodā"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Holandiešu balss"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voice poļu valodā"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voice portugāļu valodā"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voice krievu valodā"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voice turku valodā"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Balss ķīniešu val. (Kantonas dial.)"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Balss ķīniešu v. (mandarīnu dial.)"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Balss zulu valodā"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Vācu valodas QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Angļu valoda (Lielbritānija)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Angļu valoda (ASV)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Lietojamības izpētes režīms"</string>
</resources>
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
index a0f0c2027..63fd65596 100644
--- a/java/res/values-ms/strings.xml
+++ b/java/res/values-ms/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Papan kekunci Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Tetapan papan kekunci Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Pilihan input"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar pada tekanan kekunci"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Bunyi pada tekanan kekunci"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pop timbul pada tekanan kunci"</string>
@@ -30,34 +32,21 @@
<string name="correction_category" msgid="2236750915056607613">"Pembetulan teks"</string>
<string name="ngram_category" msgid="5337109164339320257">"Cadangan berdasarkan perkataan sebelumnya"</string>
<string name="misc_category" msgid="6894192814868233453">"Pilihan lain"</string>
- <!-- no translation found for advanced_settings (362895144495591463) -->
- <skip />
- <!-- no translation found for advanced_settings_summary (5193513161106637254) -->
- <skip />
- <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) -->
- <skip />
- <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) -->
- <skip />
- <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) -->
- <skip />
- <!-- no translation found for use_contacts_dict (4435317977804180815) -->
- <skip />
- <!-- no translation found for use_contacts_dict_summary (6599983334507879959) -->
- <skip />
+ <string name="advanced_settings" msgid="362895144495591463">"Tetapan terperinci"</string>
+ <string name="advanced_settings_summary" msgid="5193513161106637254">"Pilihan untuk pengguna pakar"</string>
+ <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Pop tmbl knci ketpkn lengah"</string>
+ <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Tiada lengah"</string>
+ <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Lalai"</string>
+ <string name="use_contacts_dict" msgid="4435317977804180815">"Cadangkan nama Kenalan"</string>
+ <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Menggunakan nama daripada Kenalan untuk cadangan dan pembetulan"</string>
<string name="auto_cap" msgid="1719746674854628252">"Huruf besar auto"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfigurasikan kamus"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Pembaikan pantas"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Membetulkan kesalahan menaip yang biasa"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Tunjukkan cadangan pembetulan"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Paparkan cadangan perkataan semasa menaip"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Sentiasa tunjukkan"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Tunjukkan pada mod potret"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Sentiasa sembunyikan"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Bar ruang tukar bhs"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Tunjukkan kekunci tetapan"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatik"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Sentiasa tunjukkan"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Sentiasa sembunyikan"</string>
<string name="auto_correction" msgid="4979925752001319458">"Auto Pembetulan"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Bar ruang dan tanda baca secara automatik membetulkan perkataan yang ditaip salah"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Matikan"</string>
@@ -74,81 +63,49 @@
<string name="label_done_key" msgid="2441578748772529288">"Selesai"</string>
<string name="label_send_key" msgid="2815056534433717444">"Hantar"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
+ <skip />
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Lagi"</string>
<string name="label_pause_key" msgid="181098308428035340">"Jeda"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Tnggu"</string>
- <!-- no translation found for spoken_current_text_is (2485723011272583845) -->
- <skip />
- <!-- no translation found for spoken_no_text_entered (7479685225597344496) -->
- <skip />
- <!-- no translation found for spoken_description_unknown (3197434010402179157) -->
- <skip />
- <!-- no translation found for spoken_description_shift (244197883292549308) -->
- <skip />
- <!-- no translation found for spoken_description_shift_shifted (954941524766465022) -->
- <skip />
- <!-- no translation found for spoken_description_caps_lock (5660626444912131764) -->
- <skip />
- <!-- no translation found for spoken_description_delete (8740376944276199801) -->
- <skip />
- <!-- no translation found for spoken_description_to_symbol (5486340107500448969) -->
- <skip />
- <!-- no translation found for spoken_description_to_alpha (23129338819771807) -->
- <skip />
- <!-- no translation found for spoken_description_to_numeric (591752092685161732) -->
- <skip />
- <!-- no translation found for spoken_description_settings (4627462689603838099) -->
- <skip />
- <!-- no translation found for spoken_description_tab (2667716002663482248) -->
- <skip />
- <!-- no translation found for spoken_description_space (2582521050049860859) -->
- <skip />
- <!-- no translation found for spoken_description_mic (615536748882611950) -->
- <skip />
- <!-- no translation found for spoken_description_smiley (2256309826200113918) -->
- <skip />
- <!-- no translation found for spoken_description_return (8178083177238315647) -->
- <skip />
- <!-- no translation found for spoken_description_comma (4970844442999724586) -->
- <skip />
- <!-- no translation found for spoken_description_period (5286614628077903945) -->
- <skip />
- <!-- no translation found for spoken_description_left_parenthesis (8524822120595052415) -->
- <skip />
- <!-- no translation found for spoken_description_right_parenthesis (1085757995851933164) -->
- <skip />
- <!-- no translation found for spoken_description_colon (4312420908484277077) -->
- <skip />
- <!-- no translation found for spoken_description_semicolon (37737920987155179) -->
- <skip />
- <!-- no translation found for spoken_description_exclamation_mark (2625684427460737157) -->
- <skip />
- <!-- no translation found for spoken_description_question_mark (7074097784255379666) -->
- <skip />
- <!-- no translation found for spoken_description_double_quote (5485320575389905967) -->
- <skip />
- <!-- no translation found for spoken_description_single_quote (4451320362665463938) -->
- <skip />
- <!-- no translation found for spoken_description_dot (40711082435231673) -->
- <skip />
- <!-- no translation found for spoken_description_square_root (190595160284757811) -->
- <skip />
- <!-- no translation found for spoken_description_pi (4554418247799952239) -->
- <skip />
- <!-- no translation found for spoken_description_delta (3607948313655721579) -->
- <skip />
- <!-- no translation found for spoken_description_trademark (475877774077871369) -->
- <skip />
- <!-- no translation found for spoken_description_care_of (7492800237237796530) -->
- <skip />
- <!-- no translation found for spoken_description_star (1009742725387231977) -->
- <skip />
- <!-- no translation found for spoken_description_pound (5530577649206922631) -->
- <skip />
- <!-- no translation found for spoken_description_ellipsis (1687670869947652062) -->
- <skip />
- <!-- no translation found for spoken_description_low_double_quote (3551394572784840975) -->
- <skip />
+ <string name="spoken_current_text_is" msgid="2485723011272583845">"Teks semasa adalah %s"</string>
+ <string name="spoken_no_text_entered" msgid="7479685225597344496">"Tiada teks dimasukkan"</string>
+ <string name="spoken_description_unknown" msgid="3197434010402179157">"Kod kunci %d"</string>
+ <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string>
+ <string name="spoken_description_shift_shifted" msgid="954941524766465022">"Shift didayakan"</string>
+ <string name="spoken_description_caps_lock" msgid="5660626444912131764">"Kunci huruf besar didayakan"</string>
+ <string name="spoken_description_delete" msgid="8740376944276199801">"Padam"</string>
+ <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simbol"</string>
+ <string name="spoken_description_to_alpha" msgid="23129338819771807">"Huruf"</string>
+ <string name="spoken_description_to_numeric" msgid="591752092685161732">"Nombor"</string>
+ <string name="spoken_description_settings" msgid="4627462689603838099">"Tetapan"</string>
+ <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string>
+ <string name="spoken_description_space" msgid="2582521050049860859">"Space"</string>
+ <string name="spoken_description_mic" msgid="615536748882611950">"Input suara"</string>
+ <string name="spoken_description_smiley" msgid="2256309826200113918">"Muka senyum"</string>
+ <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string>
+ <string name="spoken_description_comma" msgid="4970844442999724586">"Koma"</string>
+ <string name="spoken_description_period" msgid="5286614628077903945">"Tempoh"</string>
+ <string name="spoken_description_left_parenthesis" msgid="8524822120595052415">"Tanda kurung kiri"</string>
+ <string name="spoken_description_right_parenthesis" msgid="1085757995851933164">"Tanda kurung kanan"</string>
+ <string name="spoken_description_colon" msgid="4312420908484277077">"Titik bertindih"</string>
+ <string name="spoken_description_semicolon" msgid="37737920987155179">"Koma bertitik"</string>
+ <string name="spoken_description_exclamation_mark" msgid="2625684427460737157">"Tanda seru"</string>
+ <string name="spoken_description_question_mark" msgid="7074097784255379666">"Tanda soal"</string>
+ <string name="spoken_description_double_quote" msgid="5485320575389905967">"Tanda petikan berganda"</string>
+ <string name="spoken_description_single_quote" msgid="4451320362665463938">"Tanda petikan tunggal"</string>
+ <string name="spoken_description_dot" msgid="40711082435231673">"Titik"</string>
+ <string name="spoken_description_square_root" msgid="190595160284757811">"Punca kuasa dua"</string>
+ <string name="spoken_description_pi" msgid="4554418247799952239">"Pi"</string>
+ <string name="spoken_description_delta" msgid="3607948313655721579">"Delta"</string>
+ <string name="spoken_description_trademark" msgid="475877774077871369">"Tanda dagangan"</string>
+ <string name="spoken_description_care_of" msgid="7492800237237796530">"Dengan alamat"</string>
+ <string name="spoken_description_star" msgid="1009742725387231977">"Bintang"</string>
+ <string name="spoken_description_pound" msgid="5530577649206922631">"Paun"</string>
+ <string name="spoken_description_ellipsis" msgid="1687670869947652062">"Elipsis"</string>
+ <string name="spoken_description_low_double_quote" msgid="3551394572784840975">"Tanda petikan berganda rendah"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Input suara"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Input suara tidak disokong untuk bahasa anda pada masa ini tetapi ia berfungsi dalam bahasa Inggeris."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Input suara menggunakan pengecaman pertuturan Google. "<a href="http://m.google.com/privacy">"Dasar Privasi Mudah Alih"</a>" digunakan."</string>
@@ -177,9 +134,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. pd kekunci smbl"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Input suara dilmphkn"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Pilih kaedah input"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Konfigurasikan kaedah masukan"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Bahasa input"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Pilih bahasa input"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Sentuh sekali lagi untuk menyimpan"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Kamus tersedia"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Dayakan maklum balas pengguna"</string>
@@ -187,53 +144,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Sentuh untuk membetulkan perkataan"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Sentuh perkataan yang dimasukkan untuk membetulkannya, hanya apabila cadangan boleh dilihat"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema papan kekunci"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Papan kekunci Czech"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Papan kekunci bahasa Arab"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Papan kekunci Denmark"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Papan kekunci Jerman"</string>
- <!-- no translation found for subtype_mode_de_qwerty_keyboard (54890770769303956) -->
- <skip />
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Papan kekunci Inggeris (UK)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Papan kekunci Inggeris (AS)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Papan kekunci Sepanyol"</string>
- <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) -->
- <skip />
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Papan kekunci Perancis"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Papan kekunci Perancis (Kanada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Ppan kekunci Perancis (Switzerland)"</string>
- <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) -->
- <skip />
- <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) -->
- <skip />
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Papan kekunci bahasa Ibrani"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Papan kekunci Itali"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Papan kekunci Norway"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Papan kekunci Belanda"</string>
- <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
- <skip />
- <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
- <skip />
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Papan kekunci Rusia"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Papan kekunci Serbia"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Papan kekunci Sweden"</string>
- <!-- no translation found for subtype_mode_tr_keyboard (3155981874829226370) -->
- <skip />
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Suara Bahasa Afrikaans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Suara Orang Czech"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Suara Orang Jerman"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Suara Bahasa Inggeris"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Suara Orang Sepanyol"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Suara Orang Perancis"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Suara Bahasa Itali"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Suara Orang Jepun"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Suara Orang Korea"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Suara Bahasa Belanda"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Suara Orang Poland"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Suara Orang Portugis"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Suara Orang Rusia"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Suara Orang Turki"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Cina, Suara Bahasa Yue"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Cina, Suara Bahasa Mandarin"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Suara bahasa isiZulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"QWERTY Bahasa Jerman"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Bahasa Inggeris (UK)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Bahasa Inggeris (AS)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Mod kajian kebolehgunaan"</string>
</resources>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index 468950738..e86582289 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Skjermtastatur"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Innstillinger for skjermtastatur"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Inndataalternativer"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer ved tastetrykk"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Lyd ved tastetrykk"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Hurtigvindu ved tastetrykk"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Bruk navn fra Kontakter til forslag og korrigeringer"</string>
<string name="auto_cap" msgid="1719746674854628252">"Stor forbokstav"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfigurer ordbøker"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Autokorrektur"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Retter vanlige stavefeil"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Vis rettingsforslag"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vis ordforslag under skriving"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vis alltid"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Vis i stående modus"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Skjul alltid"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Skift språk med mellomromstasten"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Vis innstillingsnøkkel"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisk"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vis alltid"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Skjul alltid"</string>
<string name="auto_correction" msgid="4979925752001319458">"Automatisk retting"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Mellomromstast og skilletegn retter automat. feilstavede ord"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Av"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Utfør"</string>
<string name="label_send_key" msgid="2815056534433717444">"Send"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Mer"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Vent"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofon på talltastatur"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Taleinndata er deaktiv."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Velg inndatametode"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Konfigurer inndatametoder"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Inndataspråk"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Velg inndataspråk"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"Trykk på nytt for å lagre"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Ordbok tilgjengelig"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brukertilbakemelding"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Trykk for å endre ord"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Når forslag er synlige, kan du trykke på ord du har skrevet inn, for å endre dem"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tastaturtema"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tsjekkisk tastatur"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabisk tastatur"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dansk tastatur"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tysk tastatur"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Tysk QWERTY-tastatur"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelsk tastatur (Storbritannia)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelsk tastatur (USA)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spansk tastatur"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finsk tastatur"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransk tastatur"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransk tastatur (Canada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransk tastatur (Sveits)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Kroatisk tastatur"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Ungarsk tastatur"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebraisk tastatur"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiensk tastatur"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norsk tastatur"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlandsk tastatur"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polsk tastatur"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugisisk tastatur"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisk tastatur"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbisk tastatur"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svensk tastatur"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Tyrkisk tastatur"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans tale"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tsjekkisk tale"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Tysk tale"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Engelsk tale"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spansk tale"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransk tale"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italiensk stemme"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japansk tale"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreansk tale"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Nederlandsk stemme"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polsk tale"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugisisk tale"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russisk tale"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Tyrkisk tale"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Kinesisk (yue) tale"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Kinesisk (mandarin) tale"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu tale"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Tysk QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Engelsk (Storbritannia)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Engelsk (USA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Nyttighetsmodus"</string>
</resources>
diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
index 8dac48c5e..ebb1c062e 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android-toetsenbord"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Instellingen voor Android-toetsenbord"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Invoeropties"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Trillen bij toetsaanslag"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Geluid bij toetsaanslag"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pop-up bij toetsaanslag"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Namen uit Contacten gebruiken voor suggesties en correcties"</string>
<string name="auto_cap" msgid="1719746674854628252">"Auto-hoofdlettergebruik"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Woordenboeken configureren"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Snelle oplossingen"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Hiermee worden veelvoorkomende typefouten gecorrigeerd"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Correctievoorstellen weergeven"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Voorgestelde woorden weergeven tijdens typen"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Altijd weergeven"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Weergeven in staande modus"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Altijd verbergen"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Taal schakelen via spatiebalk"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Instellingscode weergeven"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisch"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Altijd weergeven"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Altijd verbergen"</string>
<string name="auto_correction" msgid="4979925752001319458">"Autocorrectie"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Met spatiebalk en interpunctie worden verkeerd gespelde woorden automatisch gecorrigeerd"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Uitgeschakeld"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Gereed"</string>
<string name="label_send_key" msgid="2815056534433717444">"Verzenden"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Meer"</string>
<string name="label_pause_key" msgid="181098308428035340">"Onderbr."</string>
<string name="label_wait_key" msgid="6402152600878093134">"Wacht"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic op symb.toetsb."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spraakinvoer is uit"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Invoermethode selecteren"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Invoermethoden configureren"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Invoertalen"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Invoertalen selecteren"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Raak nogmaals aan om op te slaan"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Woordenboek beschikbaar"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Gebruikersfeedback inschakelen."</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Raak aan om woorden te corrigeren"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Ingevoerde woorden aanraken om ze te verbeteren, alleen mogelijk wanneer suggesties zichtbaar zijn"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Toetsenbordthema"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tsjechisch toetsenbord"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabisch toetsenbord"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Deens toetsenbord"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Duits toetsenbord"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Duits QWERTY-toetsenbord"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engels toetsenbord (VK)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engels toetsenbord (VS)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spaans toetsenbord"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Fins toetsenbord"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Frans toetsenbord"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Frans toetsenbord (Canada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Frans toetsenbord (Zwitserland)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Kroatisch toetsenbord"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Hongaars toetsenbord"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebreeuws toetsenbord"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiaans toetsenbord"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Noors toetsenbord"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlands toetsenbord"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Pools toetsenbord"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugees toetsenbord"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisch toetsenbord"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Servisch toetsenbord"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Zweeds toetsenbord"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Turks toetsenbord"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaanse stem"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tsjechische stem"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Duitse stem"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Engelse stem"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spaanse stem"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Franse stem"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italiaanse stem"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanse stem"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreaanse stem"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Nederlandse stem"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Poolse stem"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugese stem"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russische stem"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkse stem"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinese stem (Yue)"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinese stem (Mandarijn)"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu stem"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Duits QWERTY-toetsenbord"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Engels (Verenigd Koninkrijk)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Engels (Verenigde Staten)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modus voor gebruiksvriendelijkheidsonderzoek"</string>
</resources>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index 3ff6bfcec..1cf14166f 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Klawiatura Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Ustawienia klawiatury Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Opcje wprowadzania"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Wibracja przy naciśnięciu"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Dźwięk przy naciśnięciu"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Powiększ po naciśnięciu"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"W propozycjach i poprawkach użyj nazwisk z kontaktów"</string>
<string name="auto_cap" msgid="1719746674854628252">"Wstawiaj wielkie litery"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfiguruj słowniki"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Szybkie poprawki"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Poprawia częste błędy wpisywania"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokazuj propozycje poprawek"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Wyświetl proponowane słowa podczas wpisywania"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Zawsze pokazuj"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Pokaż w trybie pionowym"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Zawsze ukrywaj"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Spacja przełącza język"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Pokaż klawisz ustawień"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatycznie"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Zawsze pokazuj"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Zawsze ukrywaj"</string>
<string name="auto_correction" msgid="4979925752001319458">"Autokorekta"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Spacja i znaki przestankowe poprawiają błędnie wpisane słowa"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Wyłącz"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"OK"</string>
<string name="label_send_key" msgid="2815056534433717444">"Wyślij"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Więcej"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Czekaj"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofon na klawiaturze z symbolami"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Wprowadzanie głosowe jest wyłączone"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Wybierz sposób wprowadzania tekstu"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Konfigurowanie metod wprowadzania"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Wybierz języki wprowadzania"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Dotknij ponownie, aby zapisać"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Słownik dostępny"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Włącz przesyłanie opinii użytkownika"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Popraw dotknięte słowo"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotykaj wprowadzonych słów, aby je poprawiać tylko wówczas, gdy widoczne są sugestie."</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Motyw klawiatury"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Klawiatura czeska"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Klawiatura arabska"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Klawiatura duńska"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Klawiatura niemiecka"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Niemiecka klawiatura QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Klawiatura angielska (UK)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Klawiatura angielska (USA)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Klawiatura hiszpańska"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Klawiatura fińska"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Klawiatura francuska"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Klawiatura francuska (Kanada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Klawiatura francuska (Szwajcaria)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Klawiatura chorwacka"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Klawiatura węgierska"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Klawiatura hebrajska"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Klawiatura włoska"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Klawiatura norweska"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Klawiatura holenderska"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Klawiatura polska"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Klawiatura portugalska"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Klawiatura rosyjska"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Klawiatura serbska"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Klawiatura szwedzka"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Klawiatura turecka"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Mowa afrikaans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Mowa czeska"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Mowa niemiecka"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Mowa angielska"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Mowa hiszpańska"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Mowa francuska"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Mowa włoska"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Mowa japońska"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Mowa koreańska"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Mowa holenderska"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Mowa polska"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Mowa portugalska"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Mowa rosyjska"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Mowa turecka"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Mowa chińska (kantoński)"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Mowa chińska (mandaryński)"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Mowa isiZulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Niemiecka QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Angielska (Wielka Brytania)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Angielska (USA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Tryb badania przydatności"</string>
</resources>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 3add66c4c..22c99f22b 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Teclado do Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Definições de teclado do Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Opções de introdução"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao primir as teclas"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Som ao premir as teclas"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Mostrar popup ao premir tecla"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizar nomes dos Contactos para sugestões e correções"</string>
<string name="auto_cap" msgid="1719746674854628252">"Letras maiúsculas automáticas"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Configurar dicionários"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Correcções rápidas"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige os erros de escrita comuns"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugestões de correcção"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Apresentar sugestões de palavras ao escrever"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar no modo de retrato"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar sempre"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Utilizar barra esp. alt. idioma"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla das definições"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automático"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar sempre"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ocultar sempre"</string>
<string name="auto_correction" msgid="4979925752001319458">"Auto correcção"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Correcção automática de palavras mal escritas c/ barra de espaços e pontuação"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desligar"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Feito"</string>
<string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Mais"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Esp."</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic. tecl. símbolos"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. voz desact."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Seleccionar método de entrada"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de introdução"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Selecionar idiomas de entrada"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Toque novamente para guardar"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Activar comentários do utilizador"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corrigir palavras"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tocar nas palavras introduzidas para as corrigir, apenas quando as sugestões estiverem visíveis"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema do teclado"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado checo"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Teclado árabe"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado dinamarquês"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado alemão"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Teclado QWERTY Alemão"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado inglês (Reino Unido)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado inglês (EUA)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado espanhol"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Teclado finlandês"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado francês"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado francês (Canadá)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado francês (Suíça)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Teclado croata"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Teclado húngaro"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Teclado hebraico"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado italiano"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado norueguês"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado holandês"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado Polaco"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado Português"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado russo"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado sérvio"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado sueco"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Teclado Turco"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz em africânder"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz checa"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz alemã"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz em inglês"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz espanhola"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz francesa"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz japonesa"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz coreana"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz polaca"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz portuguesa"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz russa"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz turca"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz em yue, chinês"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz em mandarim, chinês"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz em isiZulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"QWERTY Alemão"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Inglês (RU)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Inglês (EUA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modo de estudo da capacidade de utilização"</string>
</resources>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index 38373e323..167ae0e0c 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Teclado Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Configurações de teclado Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Opções de entrada"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao tocar a tecla"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Som ao tocar a tecla"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Exibir pop-up ao digitar"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Usar nomes dos Contatos para sugestões e correções"</string>
<string name="auto_cap" msgid="1719746674854628252">"Capitaliz. automática"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Configurar dicionários"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Reparos rápidos"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige erros comuns de digitação"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Exibir sugestões de correção"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Exibir sugestões de palavras durante a digitação"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar em modo retrato"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Sempre ocultar"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Alt. idiomas c/ a barra"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de config."</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automático"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar sempre"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Sempre ocultar"</string>
<string name="auto_correction" msgid="4979925752001319458">"Autocorreção"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"A barra de espaço e a pontuação corrigem automaticamente palavras com erro de digitação"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desativado"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Feito"</string>
<string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Mais"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Esp."</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic. no teclado"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Texto por voz desat."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Selecionar método de entrada"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Selecionar idiomas de entrada"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Toque novamente para salvar"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Ativar comentário do usuário"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corrigir"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toque nas palavras digitadas para corrigi-las apenas quando as sugestões estiverem visíveis"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema do teclado"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado em tcheco"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Teclado árabe"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado para dinamarquês"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado para alemão"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Teclado alemão QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado para inglês (Reino Unido)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado para inglês (EUA)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado para espanhol"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Teclado finlandês"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado para francês"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado para francês (Canadá)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado para francês (Suíça)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Teclado croata"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Teclado húngaro"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Teclado hebraico"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado para italiano"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado para norueguês"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado para holandês"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado polonês"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado em português"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado para russo"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado para sérvio"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado para sueco"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Teclado turco"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz em africâner"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz em tcheco"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz em alemão"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz em inglês"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz em espanhol"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz em francês"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz em japonês"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz em coreano"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz em polonês"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz em português"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz em russo"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz em turco"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz em chinês, cantonês"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz em chinês, mandarim"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz em zulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Alemão QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Inglês (Reino Unido)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Inglês (EUA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modo de estudo de utilização"</string>
</resources>
diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml
index d6d38ad5d..359dc7a12 100644
--- a/java/res/values-rm/strings.xml
+++ b/java/res/values-rm/strings.xml
@@ -24,6 +24,8 @@
<string name="english_ime_settings" msgid="6661589557206947774">"Parameters da la tastatura Android"</string>
<!-- no translation found for english_ime_input_options (3909945612939668554) -->
<skip />
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar cun smatgar in buttun"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Tun cun smatgar in buttun"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pop-up cun smatgar ina tasta"</string>
@@ -52,8 +54,6 @@
<string name="auto_cap" msgid="1719746674854628252">"Maiusclas automaticas"</string>
<!-- no translation found for configure_dictionaries_title (3758288002414557345) -->
<skip />
- <string name="quick_fixes" msgid="5353213327680897927">"Correcturas sveltas"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Curregia sbagls da tippar currents"</string>
<!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
<skip />
<!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) -->
@@ -64,16 +64,8 @@
<skip />
<!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) -->
<skip />
- <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
- <skip />
<!-- no translation found for prefs_settings_key (4623341240804046498) -->
<skip />
- <!-- no translation found for settings_key_mode_auto_name (2993460277873684680) -->
- <skip />
- <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
- <skip />
- <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
- <skip />
<!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Propostas da pleds"</string>
<!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Curreger automaticamain il pled precedent"</string>
<!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) -->
@@ -97,6 +89,10 @@
<string name="label_send_key" msgid="2815056534433717444">"Trametter"</string>
<!-- no translation found for label_to_alpha_key (4793983863798817523) -->
<skip />
+ <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
+ <skip />
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<!-- no translation found for label_more_key (3760239494604948502) -->
<skip />
<!-- no translation found for label_pause_key (181098308428035340) -->
@@ -210,6 +206,8 @@
<skip />
<!-- no translation found for selectInputMethod (315076553378705821) -->
<skip />
+ <!-- no translation found for configure_input_method (373356270290742459) -->
+ <skip />
<string name="language_selection_title" msgid="1651299598555326750">"Linguas da cumonds vocals"</string>
<!-- no translation found for select_language (2573265881207142437) -->
<skip />
@@ -222,87 +220,11 @@
<!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
<skip />
<!-- outdated translation 437433231038683666 --> <string name="keyboard_layout" msgid="8451164783510487501">"Design da la tastatura"</string>
- <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) -->
- <skip />
- <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) -->
- <skip />
- <!-- no translation found for subtype_mode_da_keyboard (1243570804427922104) -->
- <skip />
- <!-- no translation found for subtype_mode_de_keyboard (1990979135959462145) -->
- <skip />
- <!-- no translation found for subtype_mode_de_qwerty_keyboard (54890770769303956) -->
- <skip />
- <!-- no translation found for subtype_mode_en_GB_keyboard (7945856548410373708) -->
- <skip />
- <!-- no translation found for subtype_mode_en_US_keyboard (3708655163769735410) -->
- <skip />
- <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
- <skip />
- <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) -->
- <skip />
- <!-- no translation found for subtype_mode_fr_keyboard (8016515336759761014) -->
- <skip />
- <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) -->
- <skip />
- <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) -->
- <skip />
- <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) -->
- <skip />
- <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) -->
- <skip />
- <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) -->
- <skip />
- <!-- no translation found for subtype_mode_it_keyboard (4934199655425394484) -->
- <skip />
- <!-- no translation found for subtype_mode_nb_keyboard (1175783216100212360) -->
- <skip />
- <!-- no translation found for subtype_mode_nl_keyboard (5090278083256037936) -->
- <skip />
- <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
- <skip />
- <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
- <skip />
- <!-- no translation found for subtype_mode_ru_keyboard (1383995915064277943) -->
- <skip />
- <!-- no translation found for subtype_mode_sr_keyboard (5019440799612208168) -->
- <skip />
- <!-- no translation found for subtype_mode_sv_keyboard (4933838139861753401) -->
- <skip />
- <!-- no translation found for subtype_mode_tr_keyboard (3155981874829226370) -->
- <skip />
- <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
- <skip />
- <!-- no translation found for subtype_mode_cs_voice (1136386688120958641) -->
- <skip />
- <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
- <skip />
- <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
- <skip />
- <!-- no translation found for subtype_mode_es_voice (1323473601346507487) -->
- <skip />
- <!-- no translation found for subtype_mode_fr_voice (4675914209337824269) -->
- <skip />
- <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
- <skip />
- <!-- no translation found for subtype_mode_ja_voice (6604859132669646367) -->
- <skip />
- <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
- <skip />
- <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
- <skip />
- <!-- no translation found for subtype_mode_pl_voice (2076196021014840487) -->
- <skip />
- <!-- no translation found for subtype_mode_pt_voice (8036522712795994397) -->
- <skip />
- <!-- no translation found for subtype_mode_ru_voice (8034596947963787529) -->
- <skip />
- <!-- no translation found for subtype_mode_tr_voice (3402067436761140005) -->
- <skip />
- <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <!-- no translation found for subtype_de_qwerty (3358900499589259491) -->
<skip />
- <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <!-- no translation found for subtype_en_GB (88170601942311355) -->
<skip />
- <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <!-- no translation found for subtype_en_US (6160452336634534239) -->
<skip />
<!-- no translation found for prefs_usability_study_mode (1261130555134595254) -->
<skip />
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index e9cbd50ec..c317cfd1d 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Tastatură Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Setările tastaturii Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Opţiuni de introducere text"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrare la apăsarea tastei"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Sunet la apăsarea tastei"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Fereastră pop-up la apăsarea tastei"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizaţi numele din Agendă pentru sugestii şi corecţii"</string>
<string name="auto_cap" msgid="1719746674854628252">"Auto-capitalizare"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Configuraţi dicţionare"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Remedieri rapide"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Corectează greşelile introduse frecvent"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Afişaţi sugestii de corectare"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Afişaţi sugestii de cuvinte în timpul introducerii textului"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Afişaţi întotdeauna"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Afişaţi în modul Portret"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ascundeţi întotdeauna"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Spacebar – selector limbă"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Afişaţi tasta setări"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automat"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Afişaţi întotdeauna"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ascundeţi întotdeauna"</string>
<string name="auto_correction" msgid="4979925752001319458">"Autocorecţie"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Corectare automată cuvinte prin bară spaţiu/semne punctuaţie"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Dezactivată"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Terminat"</string>
<string name="label_send_key" msgid="2815056534433717444">"Trimiteţi"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Mai multe"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pauză"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Aşt."</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micr. pe tast. simb."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Intr. vocală dezact."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Selectaţi metoda de introducere a textului"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Configuraţi metodele de intrare"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Selectaţi limba"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Selectaţi limbile de intrare"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Atingeţi din nou pentru a salva"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Dicţionar disponibil"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Activaţi feedback de la utilizatori"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Atingeţi pentru a corecta cuvintele"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Atingeţi cuvintele introduse pentru a le corecta, numai când pot fi văzute sugestii"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Temă pentru tastatură"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tastatură cehă"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Tastatură arabă"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Tastatură daneză"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tastatură germană"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Tastatură germană QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastatură engleză (Marea Britanie)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tastatură engleză (S.U.A.)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Tastatură spaniolă"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Tastatură finlandeză"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastatură franceză"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tastatură franceză (Canada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tastatură franceză (Elveţia)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Tastatură croată"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Tastatură maghiară"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Tastatură ebraică"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Tastatură italiană"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Tastatură norvegiană"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Tastatură olandeză"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Tastatură poloneză"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Tastatură portugheză"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Tastatură rusă"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Tastatură sârbă"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Tastatură suedeză"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Tastatură turcă"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voce afrikaans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voce cehă"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voce germană"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voce engleză"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voce spaniolă"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voce franceză"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voce italiană"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voce japoneză"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voce coreeană"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voce olandeză"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voce poloneză"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voce portugheză"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voce rusă"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voce turcă"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voce chineză, yue"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voce chineză, mandarină"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voce isiZulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Tastatură germană QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Engleză (Marea Britanie)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Engleză (S.U.A.)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modul Studiu privind utilizarea"</string>
</resources>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index eac2026c4..68d1ee28e 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Клавиатура Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Настройки клавиатуры Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Параметры ввода"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Виброотклик клавиш"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Звук клавиш"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Увеличение нажатых"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Подсказки и исправления на основе имен из контактов"</string>
<string name="auto_cap" msgid="1719746674854628252">"Заглавные автоматически"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Настроить словари"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Быстрое исправление"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Исправлять распространенные опечатки"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Показать варианты исправлений"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Предлагать варианты слов во время ввода"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Всегда показывать"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показать вертикально"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Всегда скрывать"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Пробел меняет язык"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Кнопка настроек"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Автоматически"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Всегда показывать"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Всегда скрывать"</string>
<string name="auto_correction" msgid="4979925752001319458">"Автоисправление"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Автоматическое исправление опечаток при вводе знака препинания или пробела"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Откл."</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
<string name="label_send_key" msgid="2815056534433717444">"Отправить"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Ещё"</string>
<string name="label_pause_key" msgid="181098308428035340">"Приостановить"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Подождите"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Значок на клавиатуре символов"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голосовой ввод откл."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Выбрать способ ввода"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Настройка раскладки клавиатуры"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Языки ввода"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Выберите языки ввода"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Нажмите еще раз, чтобы сохранить"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Доступен словарь"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Включить отправку сведений"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Исправление нажатием"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Нажмите на слово, чтобы исправить его (при наличии подсказок)"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Тема клавиатуры"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Клавиатура: чешская"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Арабская клавиатура"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Клавиатура: датская"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Клавиатура: немецкая"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Немецкая раскладка QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Клавиатура: английская (Великобритания)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Клавиатура: английская (США)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Клавиатура: испанская"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Финская раскладка"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Клавиатура: французская"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Клавиатура: французская"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Клавиатура: французская (Швейцария)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Хорватская раскладка"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Венгерская раскладка"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Клавиатура на иврите"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Клавиатура: итальянская"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Клавиатура: норвежская"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Клавиатура: голландская"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Польская клавиатура"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Португальская раскладка"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Клавиатура: русская"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Клавиатура: сербская"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Голос: шведский"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Турецкая раскладка"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Голосовой ввод на африкаанс"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Голос: чешский"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Голос: немецкий"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Голосовой ввод на английском"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Голос: испанский"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Голос: французский"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Голосовой ввод на итальянском"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Голос: японский"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Голос: корейский"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Голосовой ввод на голландском"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Голос: польский"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Голос: португальский"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Голос: русский"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Голос: турецкий"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Голосовой ввод на китайском (диалект юэ)"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Голосовой ввод на китайском (мандаринский диалект)"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Голосовой ввод на зулу"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Немецкая клавиатура QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"английский (Великобритания)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"английский (США)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Режим проверки удобства использования"</string>
</resources>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index 8cdc737eb..a8c57008f 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Klávesnica Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Nastavenia klávesnice Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti zadávania textu a údajov"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Pri stlačení klávesu vibrovať"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk pri stlačení klávesu"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Zobraziť znaky pri stlačení klávesu"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Používať mená z Kontaktov na návrhy a opravy"</string>
<string name="auto_cap" msgid="1719746674854628252">"Veľké písmená automaticky"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfigurovať slovníky"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Rýchle opravy"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Opravuje najčastejšie chyby pri písaní"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobraziť návrhy opráv"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Zobrazovať navrhované slová počas písania"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vždy zobrazovať"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Zobraziť v režime na výšku"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vždy skrývať"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Použite medzerník na prepínanie medzi jazykmi"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Zobraziť kláves Nastavenia"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automaticky"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vždy zobrazovať"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vždy skrývať"</string>
<string name="auto_correction" msgid="4979925752001319458">"Automatické opravy"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Stlačením medzerníka a interpunkcie sa aut. opravia chybné slová"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Vypnuté"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string>
<string name="label_send_key" msgid="2815056534433717444">"Odoslať"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Viac"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pozastaviť"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Čakajte"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofón na klávesnici so symbolmi"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup je zakázaný"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Výber metódy vstupu"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Konfigurovať metódy vstupu"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Jazyky vstupu"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Vybrať jazyky vstupu"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Ďalším dotykom slovo uložíte"</string>
<string name="has_dictionary" msgid="6071847973466625007">"K dispozícii je slovník"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Povoliť spätnú väzbu od používateľov"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotykom opravíte slová"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotykom zadaných slov tieto slová opravíte, musia však byť viditeľné návrhy"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Motív klávesnice"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"klávesnica – čeština"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"klávesnica – arabčina"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"klávesnica – dánčina"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"klávesnica – nemčina"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Nemecká klávesnica QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"klávesnica – angličtina (br.)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"klávesnica – angličtina (am.)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"klávesnica – španielčina"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Fínska klávesnica"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"klávesnica – francúzština"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"klávesnica – francúzština (Kanada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"klávesnica – francúzština (Švajč.)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Chorvátska klávesnica"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Maďarská klávesnica"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"klávesnica – hebrejčina"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"klávesnica – taliančina"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"klávesnica – nórčina"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"klávesnica – holandčina"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poľská klávesnica"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalská klávesnica"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"klávesnica – ruština"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"hlas – srbčina"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"klávesnica – švédčina"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"turecká klávesnica"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Hlas – afrikánčina"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"hlas – čeština"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"hlas – nemčina"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Hlas – angličtina"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"hlas – španielčina"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"hlas – francúzština"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"hlas – taliančina"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"hlas – japončina"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"hlas – kórejčina"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"hlas – holandčina"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"hlas – poľština"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"hlas – portugalčina"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"hlas – ruština"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"hlas – turečtina"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Hlas – čínština, kantónčina"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Hlas – čínština, mandarínska"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Hlas – Zulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Nemecká klávesnica QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Anglická klávesnica (UK)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Anglická klávesnica (US)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Režim štúdie použiteľnosti"</string>
</resources>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
index a599ab58b..19bf04c8a 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Tipkovnica Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Nastavitve tipkovnice Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti vnosa"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibriranje ob pritisku tipke"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Zvok ob pritisku tipke"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pojavno okno ob pritisku tipke"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Uporaba imen iz stikov za predloge in popravke"</string>
<string name="auto_cap" msgid="1719746674854628252">"Samodejne velike začetnice"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfiguracija slovarjev"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Hitri popravki"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Popravi pogoste tipkarske napake"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokaži predloge popravkov"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Pokaži predlagane besede med tipkanjem"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vedno pokaži"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Pokaži v pokončnem načinu"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vedno skrij"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Preklopite med jeziki s preslednico"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Pokaži tipko za nastavitve"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Samodejno"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vedno pokaži"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vedno skrij"</string>
<string name="auto_correction" msgid="4979925752001319458">"Samodejni popravek"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Preslednica in ločila samodejno popravijo napačno vtipkane besede"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Izklopljeno"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Dokončano"</string>
<string name="label_send_key" msgid="2815056534433717444">"Pošlji"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Več"</string>
<string name="label_pause_key" msgid="181098308428035340">"Premor"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Čakaj"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. na tipk. s sim."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. vnos je onem."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Izberite način vnosa"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Nastavitev načinov vnosa"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Jeziki vnosa"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Izberite jezike vnosa"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Še enkrat se dotaknite, da shranite"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Slovar je na voljo"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Omogoči povratne informacije uporabnikov"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotaknite se besed in jih popravite"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotaknite se vnesenih besed in jih popravite, samo ko so predlogi vidni"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema tipkovnice"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Češka tipkovnica"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabska tipkovnica"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danska tipkovnica"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Nemška tipkovnica"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Nemška tipkovnica QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tipkovnica za britansko angleščino"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tipkovnica za ameriško angleščino"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španska tipkovnica"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finska tipkovnica"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francoska tipkovnica"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tipkovnica za kanadsko francoščino"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tipkovnica za švicarsko francoščino"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Hrvaška tipkovnica"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Madžarska tipkovnica"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebrejska tipkovnica"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italijanska tipkovnica"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveška tipkovnica"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nizozemska tipkovnica"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poljska tipkovnica"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalska tipkovnica"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ruska tipkovnica"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Srbska tipkovnica"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švedska tipkovnica"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Turška tipkovnica"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Govor v afrikanščini"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Govor v češčini"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Govor v nemščini"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Govor v angleščini"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Govor v španščini"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Govor v francoščini"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Govor v italijanščini"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Govor v japonščini"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Govor v korejščini"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Govor v nizozemščini"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Govor v poljščini"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Govor v portugalščini"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Govor v ruščini"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Govor v turščini"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Govor v kitajščini, jue"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Govor v kitajščini, mandarinščini"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Govor v zulujščini"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Nemška QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"angl. (bri.)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"angl. (ZDA)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Način za preučevanje uporabnosti"</string>
</resources>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index bfbcd1a4b..46daea90e 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android тастатура"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Подешавања Android тастатуре"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Опције уноса"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Вибрирај на притисак тастера"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Звук на притисак тастера"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Искачући прозор приликом притиска тастера"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Користи имена из Контаката за предлоге и исправке"</string>
<string name="auto_cap" msgid="1719746674854628252">"Аутоматски унос великих слова"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Конфигуриши речнике"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Брзе исправке"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Исправља честе грешке у куцању"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Прикажи предлоге за исправку"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Приказивање предложених речи током уноса текста"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Увек прикажи"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Прикажи у усправном режиму"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Увек сакриј"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Користи размак за избор језика"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Прикажи тастер за подешавања"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Аутоматски"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Увек прикажи"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Увек сакриј"</string>
<string name="auto_correction" msgid="4979925752001319458">"Аутоматско исправљање"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Размак и интерпункција аутоматски исправљају грешке у куцању"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Искључи"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
<string name="label_send_key" msgid="2815056534433717444">"Пошаљи"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Још"</string>
<string name="label_pause_key" msgid="181098308428035340">"Паузирај"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Сачекајте"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Микрофон на тастатури са симболима"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Гласовни унос је онемогућен"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Изаберите метод уноса"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Конфигурисање метода уноса"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Језици за унос"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Изабери језике за унос"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Поново додирните да бисте сачували"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Речник је доступан"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Омогући повратну информацију корисника"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Додирните да бисте исправили речи"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Додирните унете речи да бисте их исправили само када су предлози видљиви"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Тема тастатуре"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Језик тастатуре: чешки"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Језик тастатуре: арапски"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Језик тастатуре: дански"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Језик тастатуре: немачки"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"QWERTY тастатура за немачки"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Језик тастатуре: енглески (УК)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Језик тастатуре: енглески (САД)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Језик тастатуре: шпански"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Језик тастатуре: фински"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Језик тастатуре: француски"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Језик тастатуре: француски (Канада)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Језик тастатуре: француски (Швајц.)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Језик тастатуре: хрватски"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Језик тастатуре: мађарски"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Језик тастатуре: хебрејски"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Језик тастатуре: италијански"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Језик тастатуре: норвешки"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Језик тастатуре: холандски"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Језик тастатуре: пољски"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Језик тастатуре: португалски"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Језик тастатуре: руски"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Језик тастатуре: српски"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Језик тастатуре: шведски"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Језик тастатуре: турски"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Глас на африкансу"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Глас на чешком"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Глас на немачком"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Глас на енглеском"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Глас на шпанском"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Глас на француском"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Глас на италијанском"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Глас на јапанском"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Глас на корејском"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Глас на холандском"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Глас на пољском"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Глас на португалском"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Глас на руском"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Глас на турском"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Глас на јуе кинеском"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Глас на мандаринском кинеском"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Глас на језику исизулу"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"QWERTY тастатура за немачки"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"енглески (УК)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"енглески (САД)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Режим за студију могућности коришћења"</string>
</resources>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index 7387cfa3d..2c8bc7318 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Androids tangentbord"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Inställningar för Androids tangentbord"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Inmatningsalternativ"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrera vid tangenttryck"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Knappljud"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup vid knapptryck"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Använd namn från Kontakter för förslag och korrigeringar"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automatiska versaler"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Konfigurera ordböcker"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Snabba lösningar"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Åtgärdar automatiskt vanliga misstag"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Visa rättningsförslag"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Visar ordförslag när du skriver"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Visa alltid"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Visa stående"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Dölj alltid"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Byt språk m. mellanslag"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Visa inställningsknapp"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatiskt"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Visa alltid"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Dölj alltid"</string>
<string name="auto_correction" msgid="4979925752001319458">"Autokorrigering"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Blanksteg/skiljetecken rättar felstavning"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Av"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Färdig"</string>
<string name="label_send_key" msgid="2815056534433717444">"Skicka"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Mer"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Vänta"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mick bland symboler"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Röstinmatning inaktiv"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Välj inmatningsmetod"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Konfigurera inmatningsmetoder"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Inmatningsspråk"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Välj inmatningsspråk"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Tryck igen för att spara"</string>
<string name="has_dictionary" msgid="6071847973466625007">"En ordlista är tillgänglig"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktivera synpunkter från användare"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryck om du vill korrigera ord"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tryck på skrivna ord om du vill korrigera dem, endast när förslag visas"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tangentbordstema"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tjeckiskt tangentbord"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabiskt tangentbord"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danskt tangentbord"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tyskt tangentbord"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Tyskt QWERTY-tangentbord"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelskt tangentbord (Storbrit.)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelskt tangentbord (USA)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanskt tangentbord"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finskt tangentbord"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franskt tangentbord"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franskt tangentbord (Kanada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franskt tangentbord (Schweiz)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Kroatiskt tangentbord"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Ungerskt tangentbord"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebreiskt tangentbord"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italienskt tangentbord"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norskt tangentbord"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holländskt tangentbord"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polskt tangentbord"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugisiskt tangentbord"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ryskt tangentbord"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbiskt tangentbord"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svenskt tangentbord"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Turkiskt tangentbord"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Röst, afrikaans"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Röst på tjeckiska"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Röst på tyska"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Röst, engelska"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Röst på spanska"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Röst på franska"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Röst på italienska"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Röst på japanska"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Röst på koreanska"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Röst på holländska"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Röst på polska"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Röst på portugisiska"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Röst på ryska"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Röst på turkiska"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Röst, kinesiska, yue"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Röst, kinesiska, mandarin"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Röst, isiZulusk"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Tyskt QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Engelskt (brittiskt)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Engelskt (amerikanskt)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Läge för studie av användbarhet"</string>
</resources>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
index e9f077b9a..a916535b0 100644
--- a/java/res/values-sw/strings.xml
+++ b/java/res/values-sw/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Kibodi ya Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Mipangilio ya kibodi ya Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Chaguo za uingizaji"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Tetema unabofya kitufe"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Toa sauti unapobofya kitufe"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Ibuka kitufe kinapobonyezwa"</string>
@@ -51,20 +53,13 @@
<string name="auto_cap" msgid="1719746674854628252">"Uwekaji wa herufi kubwa kiotomatiki"</string>
<!-- no translation found for configure_dictionaries_title (3758288002414557345) -->
<skip />
- <string name="quick_fixes" msgid="5353213327680897927">"Utatuzi wa haraka"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Husahihisha makosa ya kawaida yaliyoandikwa"</string>
<!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
<skip />
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Onyesha maneno yaliyopendekezwa wakati unachapa"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Onyesha kila wakati"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Onyesha kwenye hali wima"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ficha kila wakati"</string>
- <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
- <skip />
<string name="prefs_settings_key" msgid="4623341240804046498">"Onyesha kitufe cha mipangilio"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Kiotomatiki"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Onyesha kila wakati"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">" Ficha kila mara"</string>
<string name="auto_correction" msgid="4979925752001319458">"Usahihishaji Kioto"</string>
<!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Sahihisha neno lililotangulia kiotomatiki"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Zima"</string>
@@ -84,6 +79,10 @@
<string name="label_done_key" msgid="2441578748772529288">"Kwisha"</string>
<string name="label_send_key" msgid="2815056534433717444">"Tuma"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
+ <skip />
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Zaidi"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pumzisha"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Subiri"</string>
@@ -187,6 +186,8 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Maikrofoni kwenye kibodi ya ishara"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Uingizaji sauti umelemazwa"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Chagua mtindo wa uingizaji"</string>
+ <!-- no translation found for configure_input_method (373356270290742459) -->
+ <skip />
<string name="language_selection_title" msgid="1651299598555326750">"Lugha za uingizaji"</string>
<!-- no translation found for select_language (2573265881207142437) -->
<skip />
@@ -197,62 +198,11 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Gusa ili kurekebisha maneno"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Gusa maneno yaliyoingizwa ili kuyasahihisha, wakati mapendekezo yanaonekana tu"</string>
<!-- outdated translation 437433231038683666 --> <string name="keyboard_layout" msgid="8451164783510487501">"Maandhari ya Kibodi"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Kibodi ya Kicheki"</string>
- <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) -->
- <skip />
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Kibodi ya Kidenmaki"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Kibodi ya Kijerumani"</string>
- <!-- no translation found for subtype_mode_de_qwerty_keyboard (54890770769303956) -->
- <skip />
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Kibodi ya Kiingereza (Uingereza)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Kibodi ya Kiingereza (Marekani)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Kibodi ya Kihispania"</string>
- <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) -->
- <skip />
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Kibodi ya Kifaransa"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Kibodi ya Kifaransa (Kanada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Kibodi ya Kifaransa (Uswizi)"</string>
- <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) -->
- <skip />
- <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) -->
- <skip />
- <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) -->
- <skip />
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Kibodi ya Kiitaliano"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Kibodi ya Kinorwe"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Kibodi ya Kiholanzi"</string>
- <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
- <skip />
- <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
- <skip />
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Kibodi ya Kirusi"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Kibodi ya Kiserbia"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Kibodi ya Kiswidi"</string>
- <!-- no translation found for subtype_mode_tr_keyboard (3155981874829226370) -->
- <skip />
- <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
- <skip />
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Sauti ya Kicheki"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Sauti ya Kijerumani"</string>
- <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
- <skip />
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Sauti ya Kihispania"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Sauti ya Kifaransa"</string>
- <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
- <skip />
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Sauti ya Kijapani"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Sauti ya Kikorea"</string>
- <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
- <skip />
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Sauti ya Kipolandi"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Sauti ya Kireno"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Sauti ya Kirusi"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Sauti ya Kituruki"</string>
- <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <!-- no translation found for subtype_de_qwerty (3358900499589259491) -->
<skip />
- <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <!-- no translation found for subtype_en_GB (88170601942311355) -->
<skip />
- <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <!-- no translation found for subtype_en_US (6160452336634534239) -->
<skip />
<!-- outdated translation 6937813623647419810 --> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Hali ya Uchunguzi wa Utumizi"</string>
</resources>
diff --git a/java/res/values-sw600dp-land/dimens.xml b/java/res/values-sw600dp-land/dimens.xml
index 5d4967ffe..c75fcc0d1 100644
--- a/java/res/values-sw600dp-land/dimens.xml
+++ b/java/res/values-sw600dp-land/dimens.xml
@@ -51,5 +51,4 @@
<fraction name="key_uppercase_letter_ratio">29%</fraction>
<dimen name="candidate_strip_padding">40.0mm</dimen>
- <integer name="candidate_count_in_strip">5</integer>
</resources>
diff --git a/java/res/values-sw600dp/config.xml b/java/res/values-sw600dp/config.xml
index 260f360c3..ade376a33 100644
--- a/java/res/values-sw600dp/config.xml
+++ b/java/res/values-sw600dp/config.xml
@@ -20,10 +20,10 @@
<resources>
<bool name="config_enable_show_settings_key_option">true</bool>
+ <bool name="config_default_show_settings_key">true</bool>
<bool name="config_enable_show_voice_key_option">false</bool>
<bool name="config_enable_show_popup_on_keypress_option">false</bool>
<bool name="config_enable_show_recorrection_option">false</bool>
- <bool name="config_enable_quick_fixes_option">false</bool>
<bool name="config_enable_bigram_suggestions_option">false</bool>
<bool name="config_sliding_key_input_enabled">false</bool>
<bool name="config_digit_popup_characters_enabled">false</bool>
@@ -31,7 +31,6 @@
<bool name="config_default_popup_preview">false</bool>
<bool name="config_default_sound_enabled">true</bool>
<bool name="config_auto_correction_spacebar_led_enabled">false</bool>
- <bool name="config_use_spacebar_language_switcher">false</bool>
<!-- Showing mini keyboard, just above the touched point if true, aligned to the key if false -->
<bool name="config_show_mini_keyboard_at_touched_point">true</bool>
<!-- The language is never displayed if == 0, always displayed if < 0 -->
diff --git a/java/res/values-sw768dp-land/dimens.xml b/java/res/values-sw768dp-land/dimens.xml
index 18837fecc..0cfdffddd 100644
--- a/java/res/values-sw768dp-land/dimens.xml
+++ b/java/res/values-sw768dp-land/dimens.xml
@@ -59,5 +59,4 @@
<dimen name="key_preview_offset_ics">0.05in</dimen>
<dimen name="candidate_strip_padding">40.0mm</dimen>
- <integer name="candidate_count_in_strip">5</integer>
</resources>
diff --git a/java/res/values-sw768dp/config.xml b/java/res/values-sw768dp/config.xml
index 82605686a..091d62e59 100644
--- a/java/res/values-sw768dp/config.xml
+++ b/java/res/values-sw768dp/config.xml
@@ -20,10 +20,10 @@
<resources>
<bool name="config_enable_show_settings_key_option">false</bool>
+ <bool name="config_default_show_settings_key">true</bool>
<bool name="config_enable_show_voice_key_option">false</bool>
<bool name="config_enable_show_popup_on_keypress_option">false</bool>
<bool name="config_enable_show_recorrection_option">false</bool>
- <bool name="config_enable_quick_fixes_option">false</bool>
<bool name="config_enable_bigram_suggestions_option">false</bool>
<bool name="config_sliding_key_input_enabled">false</bool>
<bool name="config_digit_popup_characters_enabled">false</bool>
@@ -31,7 +31,6 @@
<bool name="config_default_popup_preview">false</bool>
<bool name="config_default_sound_enabled">true</bool>
<bool name="config_auto_correction_spacebar_led_enabled">false</bool>
- <bool name="config_use_spacebar_language_switcher">false</bool>
<!-- Showing mini keyboard, just above the touched point if true, aligned to the key if false -->
<bool name="config_show_mini_keyboard_at_touched_point">true</bool>
<integer name="config_delay_update_suggestions">180</integer>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index 75befea47..780ff024a 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"แป้นพิมพ์ Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"การตั้งค่าแป้นพิมพ์ Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"ตัวเลือกการป้อนข้อมูล"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"สั่นเมื่อกดปุ่ม"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"ส่งเสียงเมื่อกดปุ่ม"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"ป๊อปอัปเมื่อกดแป้น"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"ใช้ชื่อจากรายชื่อติดต่อสำหรับคำแนะนำและการแก้ไข"</string>
<string name="auto_cap" msgid="1719746674854628252">"ปรับเป็นตัวพิมพ์ใหญ่อัตโนมัติ"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"กำหนดค่าพจนานุกรม"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"แก้ไขด่วน"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"แก้ไขข้อผิดพลาดในการพิมพ์ที่พบบ่อย"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"แสดงคำแนะนำการแก้ไข"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"แสดงคำที่แนะนำขณะพิมพ์"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"แสดงทุกครั้ง"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"แสดงในโหมดแนวตั้ง"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ซ่อนทุกครั้ง"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"ใช้แป้น Spacebar เพื่อสลับภาษา"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"แสดงแป้นการตั้งค่า"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"อัตโนมัติ"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"แสดงตลอดเวลา"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"ซ่อนตลอดเวลา"</string>
<string name="auto_correction" msgid="4979925752001319458">"การแก้ไขอัตโนมัติ"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"กดเว้นวรรคและเครื่องหมายจะแก้คำผิดอัตโนมัติ"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ปิด"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"เสร็จสิ้น"</string>
<string name="label_send_key" msgid="2815056534433717444">"ส่ง"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"เพิ่มเติม"</string>
<string name="label_pause_key" msgid="181098308428035340">"หยุดชั่วคราว"</string>
<string name="label_wait_key" msgid="6402152600878093134">"รอ"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"ไมค์บนแป้นพิมพ์สัญลักษณ์"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"ปิดใช้งานป้อนข้อมูลด้วยเสียง"</string>
<string name="selectInputMethod" msgid="315076553378705821">"เลือกวิธีการป้อนข้อมูล"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"กำหนดค่าวิธีการป้อนข้อมูล"</string>
<string name="language_selection_title" msgid="1651299598555326750">"ภาษาในการป้อนข้อมูล"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"เลือกภาษาสำหรับการป้อนข้อมูล"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← แตะอีกครั้งเพื่อบันทึก"</string>
<string name="has_dictionary" msgid="6071847973466625007">"มีพจนานุกรมให้ใช้งาน"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"เปิดใช้งานการแสดงความคิดเห็นจากผู้ใช้"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"แตะเพื่อแก้ไขคำ"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"แตะคำที่ป้อนไว้เพื่อแก้ไข เฉพาะเมื่อเห็นข้อเสนอแนะเท่านั้น"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"ชุดรูปแบบแป้นพิมพ์"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"แป้นพิมพ์ภาษาเช็ก"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"แป้นพิมพ์ภาษาอาหรับ"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"แป้นพิมพ์ภาษาเดนมาร์ก"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"แป้นพิมพ์ภาษาเยอรมัน"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"แป้นพิมพ์ภาษาเยอรมันแบบ QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"แป้นพิมพ์ภาษาอังกฤษ (สหราชอาณาจักร)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"แป้นพิมพ์ภาษาอังกฤษ (สหรัฐอเมริกา)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"แปันพิมพ์ภาษาสเปน"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"แป้นพิมพ์ภาษาฟินแลนด์"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"แป้นพิมพ์ภาษาฝรั่งเศส"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"แป้นพิมพ์ภาษาฝรั่งเศส (แคนาดา)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"แป้นพิมพ์ภาษาฝรั่งเศส (สวิตเซอร์แลนด์)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"แป้นพิมพ์ภาษาโครเอเชีย"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"แป้นพิมพ์ภาษาฮังกาเรียน"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"แป้นพิมพ์ภาษาฮิบรู"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"แป้นพิมพ์ภาษาอิตาลี"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"แป้นพิมพ์ภาษานอร์เวย์"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"แป้นพิมพ์ภาษาดัตช์"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"แป้นพิมพ์ภาษาโปแลนด์"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"แป้นพิมพ์ภาษาโปรตุเกส"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"แป้นพิมพ์ภาษารัสเซีย"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"แป้นพิมพ์ภาษาเซอร์เบีย"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"แป้นพิมพ์ภาษาสวีเดน"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"แป้นพิมพ์ภาษาตุรกี"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"เสียงภาษาแอฟริกัน"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"เสียงภาษาเช็ก"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"เสียงภาษาเยอรมัน"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"เสียงภาษาอังกฤษ"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"เสียงภาษาสเปน"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"เสียงภาษาฝรั่งเศส"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"เสียงภาษาอิตาลี"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"เสียงภาษาญี่ปุ่น"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"เสียงภาษาเกาหลี"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"เสียงภาษาดัตช์"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"เสียงภาษาโปแลนด์"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"เสียงภาษาโปรตุเกส"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"เสียงภาษารัสเซีย"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"เสียงภาษาตุรกี"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"เสียงภาษาจีนกวางตุ้ง"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"เสียงภาษาจีนกลาง"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"เสียงภาษาซูลู"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"QWERTY ภาษาเยอรมัน"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"อังกฤษ (สหราชอาณาจักร)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"อังกฤษ (สหรัฐอเมริกา)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"โหมดศึกษาประโยชน์ในการใช้งาน"</string>
</resources>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index d8652ea8e..b0806bed3 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android keyboard"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Mga setting ng Android keyboard"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Mga pagpipilian sa input"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Mag-vibrate sa keypress"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Tunog sa keypress"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup sa keypress"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Gamitin pangalan mula Mga Contact sa mga mungkahi\'t pagwawasto"</string>
<string name="auto_cap" msgid="1719746674854628252">"Auto-capitalization"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"I-configure ang mga diksyunaryo"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Mga mabilisang pagsasaayos"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Itinatama ang mga karaniwang na-type na mali"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Magpakita ng mga suhestiyon ng pagwawasto"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Ipakita ang mga iminumungkahing salita habang nagta-type"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Palaging ipakita"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Ipakita sa portrait mode"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Palaging itago"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Gamitin ang panglipat ng wika sa spacebar"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Ipakita ang key ng mga setting"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Awtomatiko"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Palaging ipakita"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Palaging itago"</string>
<string name="auto_correction" msgid="4979925752001319458">"Awtomatikong pagwasto"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Awto tinatama ng spacebar at bantas ang maling na-type"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Naka-off"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Tapos na"</string>
<string name="label_send_key" msgid="2815056534433717444">"Ipadala"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Higit pa"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Intay"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic sa keyboard ng mga simbolo"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hindi pinagana ang voice input"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Pumili ng paraan ng pag-input"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"I-configure ang mga pamamaraan ng pag-input"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Mag-input ng mga wika"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Pumili ng mga wika ng input"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Pinduting muli upang i-save"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Available ang diksyunaryo"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Paganahin ang feedback ng user"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Pindutin upang itama ang mga salita"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pindutin ang mga inilagay na salita upang iwasto ang mga ito, kapag nakikita lang ang mga suhestiyon"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Tema ng keyboard"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Czech na Keyboard"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabic na Keyboard"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danish na Keyboard"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"German na Keyboard"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"German na QWERTY Keyboard"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Ingles (UK) na Keyboard"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Ingles (US) na Keyboard"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish na Keyboard"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finnish na Keyboard"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French na Keyboard"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"French (Canada) na Keyboard"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"French (Switzerland) na Keyboard"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Croatian na Keyboard"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Hungarian na Keyboard"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebrew na Keyboard"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italian na Keyboard"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegian na Keyboard"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Dutch na Keyboard"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polish na Keyboard"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portuguese na Keyboard"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russian na Keyboard"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbian na Keyboard"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Swedish na Keyboard"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Turkish na Keyboard"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans na Boses"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Czech na Boses"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"German na Boses"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Ingles na Boses"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanish na Boses"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"French na Boses"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italian na Boses"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanese na Boses"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korean na Boses"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Dutch na Boses"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polish na Boses"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portuguese na Boses"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russian na Boses"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkish na Boses"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinese, Yue na Boses"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinese, Mandarin na Boses"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu na Boses"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"German QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Ingles (UK)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Ingles (US)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Study mode ng pagiging kapaki-pakinabang"</string>
</resources>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index 00dcaac12..103f01618 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android klavyesi"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Android klavye ayarları"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Giriş seçenekleri"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Tuşa basıldığında titret"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Tuşa basıldığında ses çıkar"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Tuşa basıldığında pop-up aç"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Öneri ve düzeltmeler için Kişiler\'deki adları kullan"</string>
<string name="auto_cap" msgid="1719746674854628252">"Otomatik olarak büyük harf yap"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Sözlükleri yapılandır"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Hızlı onarımlar"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Yaygın olarak yapılan yazım hatalarını düzeltir"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Düzeltme önerilerini göster"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Yazarken, önerilen kelimeleri görüntüle"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Her zaman göster"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Dikey modda göster"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Her zaman gizle"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Dil geçişi &gt; boşluk çubuğuyla"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Ayarları göster tuşu"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Otomatik"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Her zaman göster"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Her zaman gizle"</string>
<string name="auto_correction" msgid="4979925752001319458">"Otomatik düzeltme"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Boşluk çbğ ve nokt işr yanlış yazılan kelimeleri oto düzeltir"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Kapalı"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Bitti"</string>
<string name="label_send_key" msgid="2815056534433717444">"Gönder"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Diğer"</string>
<string name="label_pause_key" msgid="181098308428035340">"Durkl"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Bekle"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Simge klavysnd mikrf"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Sesle grş devre dışı"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Giriş yöntemini seç"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Giriş yöntemlerini yapılandır"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Giriş dilleri"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Giriş dillerini seçin"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Kaydetmek için tekrar dokunun"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Sözlük kullanılabilir"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Kullanıcı geri bildirimini etkinleştir"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Kelimeleri düzeltmek için dokunun"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Yalnızca öneriler görünür olduğunda, düzeltmek için girilen kelimelere dokunun"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Klavye teması"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Çekçe Klavye"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arapça Klavye"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danca Klavye"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Almanca Klavye"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Almanca QWERTY Klavye"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"İngilizce (İngiltere) Klavye"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"İngilizce (ABD) Klavye"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"İspanyolca Klavye"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Fince klavye"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransızca Klavye"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransızca (Kanada) Klavye"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransızca (İsviçre) Klavye"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Hırvatça Klavye"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Macarca Klavye"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"İbranice Klavye"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"İtalyanca Klavye"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveççe Klavye"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Felemenkçe Klavye"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Lehçe Klavye"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portekizce Klavye"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Rusça Klavye"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Sırpça Klavye"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"İsveççe Klavye"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Türkçe Klavye"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikanca Ses"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Çekçe Ses"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Almanca Ses"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"İngilizce Ses"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"İspanyolca Ses"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransızca Ses"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"İtalyanca Ses"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japonca Ses"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korece Ses"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Felemenkçe Ses"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Lehçe Ses"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portekizce Ses"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Rusça Ses"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Türkçe Ses"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Çince, Yue Ses"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Çince, Mandarin Ses"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Zuluca Ses"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Almanca QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"İngilizce (İngiltere)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"İngilizce (ABD)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Kullanılabilirlik çalışması modu"</string>
</resources>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 9ba53ca48..cca56b842 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Клавіатура Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Налашт-ня клавіат. Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Парам. введення"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Вібр при натиску клав."</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натиску клав."</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Сплив. при нат.клав."</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Використ. імена зі списку контактів для пропозицій і виправлень"</string>
<string name="auto_cap" msgid="1719746674854628252">"Авто викор. вел. літер"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Налаштувати словники"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Шв. виправлення"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Виправляє поширені помилки"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Показувати пропозиції виправлень"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Відображати пропоновані слова під час вводу"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Завжди показувати"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показувати в книжковому режимі"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Завжди ховати"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Використ. зміну мови пробілом"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Показ. клав. налашт."</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Автоматично"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Завжди показ."</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Завжди ховати"</string>
<string name="auto_correction" msgid="4979925752001319458">"Автомат. виправлення"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Пробіл і пунктуація автоматично виправляють слова з помилками"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Вимк."</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
<string name="label_send_key" msgid="2815056534433717444">"Надісл."</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"Алфавіт"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Більше"</string>
<string name="label_pause_key" msgid="181098308428035340">"Пауза"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Чек."</string>
@@ -134,6 +133,7 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Miкр. на симв. клавіат."</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голос. ввід вимкнено"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Вибрати метод введення"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Налаштувати методи введення"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Мови вводу"</string>
<string name="select_language" msgid="2573265881207142437">"Вибрати мову введення"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Торкн. ще, щоб збер."</string>
@@ -143,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Торкн., щоб виправ. слова"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Торкніться введених слів, щоб виправити їх, лише коли ввімкнено пропозиції"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Тема клавіатури"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Чеська розкладка"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Розкладка для арабської мови"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Данська розкладка"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Німецька розкладка"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Німецька клавіатура QWERTY"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Англ. розкладка (Великобританія)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Англійська розкладка (США)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Іспанська розкладка"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Фінська розкладка"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Французька розкладка"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Французька розкладка (Канада)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Французька розкладка (Швейцарія)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Хорватська розкладка"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Угорська розкладка"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Розкладка для івриту"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Італійська розкладка"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Норвезька розкладка"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Голланд. розклад."</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Польська розкладка"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Португальська розкладка"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Російська розкладка"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Сербська розкладка"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Шведська розкладка"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Турецька розкладка"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voice мовою африкаанс"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Голос чеською"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Голос німецькою"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voice англійською мовою"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Голос іспанською"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Голос французькою"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voice італійською мовою"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Голос японською"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Голос корейською"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voice голландською мовою"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Голос польською"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Голос португальською"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Голос російською"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Голос турецькою"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voice китайською, юеською мовою"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voice китайською, мандарин. мовою"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voice мовою ісізулу"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Німецька клавіатура QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Англійська (Великобританія)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Англійська (США)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Режим вивчення зручності у використанні"</string>
</resources>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index d35bdb297..e7c684d2d 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Bàn phím Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Cài đặt bàn phím Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Tùy chọn nhập"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Rung khi nhấn phím"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Âm thanh khi nhấn phím"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Cửa sổ bật lên khi nhấn phím"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Sử dụng tên từ Danh bạ cho các đề xuất và chỉnh sửa"</string>
<string name="auto_cap" msgid="1719746674854628252">"Tự động viết hoa"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"Cấu hình từ điển"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"Sửa nhanh"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Sửa lỗi nhập thông thường"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"Hiển thị gợi ý sửa"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Hiển thị từ được đề xuất khi nhập"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Luôn hiển thị"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Hiển thị trên chế độ khổ đứng"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Luôn ẩn"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Sử dụng trình chuyển đổi ngôn ngữ thanh cách"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Hiển thị phím cài đặt"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Tự động"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Luôn hiển thị"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Luôn ẩn"</string>
<string name="auto_correction" msgid="4979925752001319458">"Tự động sửa"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Phím cách và dấu câu tự động sửa từ nhập sai"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Tắt"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"Xong"</string>
<string name="label_send_key" msgid="2815056534433717444">"Gửi"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Khác"</string>
<string name="label_pause_key" msgid="181098308428035340">"Tạm dừng"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Đợi"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micrô trên bàn phím biểu tượng"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Nhập liệu bằng giọng nói đã bị vô hiệu hóa"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Chọn phương thức nhập"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"Định cấu hình phương thức nhập"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Ngôn ngữ nhập"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"Chọn ngôn ngữ nhập"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Chạm lại để lưu"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Có sẵn từ điển"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Bật phản hồi của người dùng"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Chạm để sửa từ"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Chạm các từ đã nhập để sửa, chỉ khi các đề xuất hiển thị"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"Chủ đề bàn phím"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Bàn phím tiếng Séc"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Bàn phím tiếng Ả Rập"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Bàn phím tiếng Đan Mạch"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Bàn phím tiếng Đức"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"Bàn phím QWERTY Tiếng Đức"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Bàn phím tiếng Anh (Anh)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Bàn phím tiếng Anh (Mỹ)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Bàn phím tiếng Tây Ban Nha"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Bàn phím tiếng Phần Lan"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Bàn phím tiếng Pháp"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Bàn phím tiếng Pháp (Canada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Bàn phím tiếng Pháp (Thụy Sĩ)"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Bàn phím tiếng Croatia"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Bàn phím tiếng Hungari"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Bàn phím tiếng Do Thái"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Bàn phím tiếng Ý"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Bàn phím tiếng Na Uy"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Bàn phím tiếng Hà Lan"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Bàn phím tiếng Ba Lan"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Bàn phím tiếng Bồ Đào Nha"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Bàn phím tiếng Nga"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Bàn phím tiếng Serbia"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Bàn phím tiếng Thụy Điển"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"Bàn phím tiếng Thổ Nhĩ Kỳ"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Giọng tiếng Hà Lan ở Nam Phi"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Giọng nói tiếng Séc"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Giọng nói tiếng Đức"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Giọng tiếng Anh"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Giọng nói tiếng Tây Ban Nha"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Giọng nói tiếng Pháp"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Giọng nói tiếng Ý"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Giọng nói tiếng Nhật"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Giọng nói tiếng Hàn"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Giọng nói tiếng Hà Lan"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Giọng nói tiếng Ba Lan"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Giọng nói tiếng Bồ Đào Nha"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Giọng nói tiếng Nga"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Giọng nói tiếng Thổ Nhĩ Kỳ"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Giọng tiếng Trung, Yue"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Giọng tiếng Trung, tiếng Quan thoại"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Giọng isiZulu"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"Bàn phím QWERTY tiếng Đức"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"Tiếng Anh (Anh)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"Tiếng Anh (Mỹ)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Chế độ nghiên cứu tính khả dụng"</string>
</resources>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index 750e29c26..189c17420 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android 键盘"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Android 键盘设置"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"输入选项"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"按键时振动"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"按键时播放音效"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"按键时显示弹出窗口"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"使用联系人中的姓名提供建议和更正"</string>
<string name="auto_cap" msgid="1719746674854628252">"自动大写"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"配置字典"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"快速纠正"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"纠正常见的输入错误"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"显示更正建议"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"键入时显示建议的字词"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"始终显示"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"以纵向模式显示"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"始终隐藏"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"使用空格键切换语言"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"显示设置键"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"自动"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"始终显示"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"始终隐藏"</string>
<string name="auto_correction" msgid="4979925752001319458">"自动更正"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"空格键或标点自动更正拼写错误的字词"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"关闭"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"完成"</string>
<string name="label_send_key" msgid="2815056534433717444">"发送"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"更多"</string>
<string name="label_pause_key" msgid="181098308428035340">"暂停"</string>
<string name="label_wait_key" msgid="6402152600878093134">"等待"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"符号键盘上的麦克风"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"语音输入功能已停用"</string>
<string name="selectInputMethod" msgid="315076553378705821">"选择输入法"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"配置输入法"</string>
<string name="language_selection_title" msgid="1651299598555326750">"输入语言"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"选择输入语言"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← 再次触摸即可保存"</string>
<string name="has_dictionary" msgid="6071847973466625007">"提供字典"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"启用用户反馈"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"触摸以更正字词"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"仅在系统显示建议后,才触摸输入的字词进行更正"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"键盘主题"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"捷克语键盘"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"阿拉伯语键盘"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"丹麦语键盘"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"德语键盘"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"德语 QWERTY 键盘"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英语(英国)键盘"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英语(美国)键盘"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"西班牙语键盘"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"芬兰语键盘"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"法语键盘"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"法语(加拿大)键盘"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"法语(瑞士)键盘"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"克罗地亚语键盘"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"匈牙利语键盘"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"希伯来语键盘"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"意大利语键盘"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"挪威语键盘"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"荷兰语键盘"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"波兰语键盘"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"葡萄牙语键盘"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"俄语键盘"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"塞尔维亚语键盘"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"瑞典语键盘"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"土耳其语键盘"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"南非荷兰语语音"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"捷克语语音"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"德语语音"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"英语语音"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"西班牙语语音"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"法语语音"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"意大利语语音"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日语语音"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韩语语音"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"荷兰语语音"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"波兰语语音"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"葡萄牙语语音"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"俄语语音"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"土耳其语语音"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"中文,粤语语音"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"中文,普通话语音"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"祖鲁语语音"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"德语 QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"英语(英式)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"英语(美式)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"可用性研究模式"</string>
</resources>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index 6dca7ed8f..aa65cdd82 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Android 鍵盤"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Android 鍵盤設定"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"輸入選項"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"按鍵時震動"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"按鍵時播放音效"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"按鍵時顯示彈出式視窗"</string>
@@ -39,18 +41,12 @@
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"使用「聯絡人」的名稱提供建議與修正"</string>
<string name="auto_cap" msgid="1719746674854628252">"自動大寫"</string>
<string name="configure_dictionaries_title" msgid="3758288002414557345">"設定字典"</string>
- <string name="quick_fixes" msgid="5353213327680897927">"快速修正"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"修正一般打字錯誤"</string>
<string name="prefs_show_suggestions" msgid="8026799663445531637">"顯示修正建議"</string>
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"輸入時顯示建議字詞"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"一律顯示"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"以垂直模式顯示"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"永遠隱藏"</string>
- <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"使用空白鍵切換語言"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"顯示設定金鑰"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"自動"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"一律顯示"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"永遠隱藏"</string>
<string name="auto_correction" msgid="4979925752001319458">"自動修正"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"自動插入空白鍵和標點符號鍵盤,以修正拼字錯誤"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"關閉"</string>
@@ -67,6 +63,9 @@
<string name="label_done_key" msgid="2441578748772529288">"完成"</string>
<string name="label_send_key" msgid="2815056534433717444">"傳送"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"更多"</string>
<string name="label_pause_key" msgid="181098308428035340">"暫停"</string>
<string name="label_wait_key" msgid="6402152600878093134">"等候"</string>
@@ -134,9 +133,9 @@
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"符號鍵盤上的麥克風"</string>
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"語音輸入已停用"</string>
<string name="selectInputMethod" msgid="315076553378705821">"選取輸入法"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"設定輸入法"</string>
<string name="language_selection_title" msgid="1651299598555326750">"輸入語言"</string>
- <!-- no translation found for select_language (2573265881207142437) -->
- <skip />
+ <string name="select_language" msgid="2573265881207142437">"選取輸入語言"</string>
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← 再次輕觸即可儲存"</string>
<string name="has_dictionary" msgid="6071847973466625007">"可使用字典"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"啟用使用者意見回饋"</string>
@@ -144,46 +143,8 @@
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"輕觸此處可修正字詞"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"輕觸輸入的字詞即可加以修正 (出現建議時才適用)"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"鍵盤主題"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"捷克文鍵盤"</string>
- <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"阿拉伯文鍵盤"</string>
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"丹麥文鍵盤"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"德文鍵盤"</string>
- <string name="subtype_mode_de_qwerty_keyboard" msgid="54890770769303956">"德文 QWERTY 鍵盤"</string>
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英文 (英國) 鍵盤"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英文 (美國) 鍵盤"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"西班牙文鍵盤"</string>
- <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"芬蘭文鍵盤"</string>
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"法文鍵盤"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"法文 (加拿大) 鍵盤"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"法文 (瑞士) 鍵盤"</string>
- <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"克羅埃西亞文鍵盤"</string>
- <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"匈牙利文鍵盤"</string>
- <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"希伯來文鍵盤"</string>
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"義大利文鍵盤"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"挪威文鍵盤"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"荷蘭文鍵盤"</string>
- <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"波蘭文鍵盤"</string>
- <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"葡萄牙文鍵盤"</string>
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"俄文鍵盤"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"塞爾維亞文鍵盤"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"瑞典文語音"</string>
- <string name="subtype_mode_tr_keyboard" msgid="3155981874829226370">"土耳其文鍵盤"</string>
- <string name="subtype_mode_af_voice" msgid="7542487489657902699">"南非荷蘭文語音"</string>
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"捷克文語音"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"德文語音"</string>
- <string name="subtype_mode_en_voice" msgid="6643420989651848728">"英文語音"</string>
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"西班牙文語音"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"法文語音"</string>
- <string name="subtype_mode_it_voice" msgid="5077373057157441323">"義大利文語音"</string>
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日文語音"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韓文語音"</string>
- <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"荷蘭文語音"</string>
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"波蘭文語音"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"葡萄牙文語音"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"俄文語音"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"土耳其文語音"</string>
- <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"中文 (粵語) 語音"</string>
- <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"中文 (華語) 語音"</string>
- <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"祖魯文語音"</string>
+ <string name="subtype_de_qwerty" msgid="3358900499589259491">"德文 QWERTY"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"英文 (英式)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"英文 (美式)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"使用性研究模式"</string>
</resources>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index 76f87b0eb..4929c12ec 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -23,6 +23,8 @@
<string name="english_ime_name" msgid="7252517407088836577">"Ikhibhodi ye-Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Izilungiselelo zekhibhodi ye-Android"</string>
<string name="english_ime_input_options" msgid="3909945612939668554">"Okukhethwa kukho kokungenayo"</string>
+ <!-- no translation found for spell_checker_service_name (2003013122022285508) -->
+ <skip />
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Dlidlizelisa ngokucindezela inkinobho"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Umsindo wokucindezela ukhiye"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Ugaxekile ngokucindezela ukhiye"</string>
@@ -51,20 +53,13 @@
<string name="auto_cap" msgid="1719746674854628252">"Ukwenza ofeleba okuzenzakalelayo"</string>
<!-- no translation found for configure_dictionaries_title (3758288002414557345) -->
<skip />
- <string name="quick_fixes" msgid="5353213327680897927">"Ukulungisa okusheshayo"</string>
- <string name="quick_fixes_summary" msgid="3405028402510332373">"Ilungisa amaphutha athayiphwa ngokuvamile"</string>
<!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
<skip />
<string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Bonisa amagama aphakamisiwe ngenkathi uthayipha"</string>
<string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Bonisa njalo"</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Bonisa kwimodi emile"</string>
<string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Fihla njalo"</string>
- <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
- <skip />
<string name="prefs_settings_key" msgid="4623341240804046498">"Bonisa ukhiye wezilungiselelo"</string>
- <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Okuzenzakalelayo"</string>
- <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Bonisa njalo"</string>
- <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Fihla njalo"</string>
<string name="auto_correction" msgid="4979925752001319458">"Ukulungisa okuzenzakalelayo"</string>
<!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Ngokuzenzakalelayo ilungisa igama elandulele"</string>
<string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Valiwe"</string>
@@ -84,6 +79,10 @@
<string name="label_done_key" msgid="2441578748772529288">"Kwenziwe"</string>
<string name="label_send_key" msgid="2815056534433717444">"Thumela"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <!-- no translation found for label_to_symbol_key (8516904117128967293) -->
+ <skip />
+ <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) -->
+ <skip />
<string name="label_more_key" msgid="3760239494604948502">"Okungaphezulu"</string>
<string name="label_pause_key" msgid="181098308428035340">"Misa okwesikhashana"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Linda"</string>
@@ -159,11 +158,11 @@
<skip />
<!-- no translation found for spoken_description_low_double_quote (3551394572784840975) -->
<skip />
- <string name="voice_warning_title" msgid="4419354150908395008">"Okungenayo kwezwi"</string>
- <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Okungenayo kwezwi akusekelwa kolimi lwakho, kodwa kuyasebenza Ngesingisi."</string>
- <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Okufakwayo kwezwi kusebenzisa ukuqaphela izwi le-Google. "<a href="http://m.google.com/privacy">"Inqubomgomo Yobumfihlo Yefoni"</a>" iyasebenza."</string>
- <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ukuvala okufakwayo kwezwi, iya kuzilungiselelo zendlela yokufakwayo"</string>
- <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ukusebenzisa okufakwayo kwezwi, cindezela inkinobho yemakrofoni."</string>
+ <string name="voice_warning_title" msgid="4419354150908395008">"Okufakwa ngezwi"</string>
+ <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Okufakwa ngezwi akusekelwa olimini lwakho, kodwa kuyasebenza nge-English."</string>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Okufakwayo ngezwi kusebenzisa ukufanisa izwi kwe-Google. "<a href="http://m.google.com/privacy">"Inqubomgomo Yobumfihlo Yefoni"</a>" iyasebenza."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ukuvala okufakwayo ngezwi, iya kuzilungiselelo zendlela yokufakwayo"</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ukusebenzisa okufakwayo ngezwi, cindezela inkinobho yemakrofoni."</string>
<string name="voice_listening" msgid="467518160751321844">"Khuluma manje"</string>
<string name="voice_working" msgid="6666937792815731889">"Kuyasebenza"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -179,80 +178,31 @@
<string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Isixwayiso: "</b>"Esikhathini esilandelayo, zama ukukhuluma izimpimiselo ezinjengo \"isikhathi, \"ikhefu\" noma \"uphawu lombuzo\"."</string>
<string name="cancel" msgid="6830980399865683324">"Khansela"</string>
<string name="ok" msgid="7898366843681727667">"KULUNGILE"</string>
- <string name="voice_input" msgid="2466640768843347841">"Okungenayo kwezwi"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Okufakwa ngezwi"</string>
<string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Kwikhibhodi eyisisekelo"</string>
<string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Ikhibhodi yezimpawu"</string>
<string name="voice_input_modes_off" msgid="3745699748218082014">"VALIWE"</string>
<string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"I-mic kwikhibhodi eyisisekelo"</string>
<string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Ikhibhodi yezimpawu ze-mic"</string>
- <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Okufakwayo kwezwi kuvimbelwe"</string>
- <string name="selectInputMethod" msgid="315076553378705821">"Khetha indlela yokungenayo"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Okufakwayo ngezwi kuvinjelwe"</string>
+ <string name="selectInputMethod" msgid="315076553378705821">"Khetha indlela yokufaka"</string>
+ <!-- no translation found for configure_input_method (373356270290742459) -->
+ <skip />
<string name="language_selection_title" msgid="1651299598555326750">"Izilimi zokufakwayo"</string>
<!-- no translation found for select_language (2573265881207142437) -->
<skip />
<string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Thinta futhi ukulondoloza"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Isichazamazwi siyatholakala"</string>
<string name="prefs_enable_log" msgid="6620424505072963557">"Vumela impendulo yomsebenzisi"</string>
- <string name="prefs_description_log" msgid="5827825607258246003">"Siza ukuthuthukisa umhleli wendlela yokungenayo ngokuthumela izibalo zokubala nokuphahlaza imibiko e-Google."</string>
+ <string name="prefs_description_log" msgid="5827825607258246003">"Siza ukuthuthukisa lo mhleli wendlela yokufakwa ngokusithumela ngokuzenzakalela izibalo zokusetshenziswa nokukhubeka ku-Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Thinta ukulungisa amagama"</string>
<string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Thinta amagama afakiwe ukuwalungisa, kuphela lapho okusikiselwayo kubonakala"</string>
<!-- outdated translation 437433231038683666 --> <string name="keyboard_layout" msgid="8451164783510487501">"Indikimba Yekhibhodi"</string>
- <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Ikhibhodi yesi-Czech"</string>
- <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) -->
- <skip />
- <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Ikhibhodi yesi-Danish"</string>
- <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Ikhobhodi yei-German"</string>
- <!-- no translation found for subtype_mode_de_qwerty_keyboard (54890770769303956) -->
- <skip />
- <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Ikhibhodi ye-English (UK)"</string>
- <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Ikhobhodi ye-English (US)"</string>
- <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ikhobhodi yesi-Spanish"</string>
- <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) -->
- <skip />
- <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Ikhibhodi yesi-French"</string>
- <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Ikhobhodi yesi-French (i-Canada)"</string>
- <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Ikhibhodi yesi-French (i-Switzerland"</string>
- <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) -->
- <skip />
- <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) -->
- <skip />
- <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) -->
- <skip />
- <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Ikhibhodi yesi-Italian"</string>
- <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Ikhibhodi yesi-Norwegian"</string>
- <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Ikhibhodi yesi-Dutch"</string>
- <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
- <skip />
- <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
- <skip />
- <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ikhobhodi yesi-Russian"</string>
- <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Ikhibhodi yesi-Serbian"</string>
- <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Ikhobhodi yesi-Swedish"</string>
- <!-- no translation found for subtype_mode_tr_keyboard (3155981874829226370) -->
- <skip />
- <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
- <skip />
- <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Izwi le-Czech"</string>
- <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Izwi lesi-German"</string>
- <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
- <skip />
- <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Izwi lesi-Spanish"</string>
- <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Izwi lesi-French"</string>
- <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
- <skip />
- <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Izwi lesi-Japanese"</string>
- <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Izwi lesi-Korean"</string>
- <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
- <skip />
- <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Izwi lesi-Polish"</string>
- <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Izwi lesi-Portuguese"</string>
- <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Izwi lesi-Russian"</string>
- <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Izwi lesi-Turkish"</string>
- <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <!-- no translation found for subtype_de_qwerty (3358900499589259491) -->
<skip />
- <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <!-- no translation found for subtype_en_GB (88170601942311355) -->
<skip />
- <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <!-- no translation found for subtype_en_US (6160452336634534239) -->
<skip />
<!-- outdated translation 6937813623647419810 --> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Imodi Yesitadi Yokusebenziseka"</string>
</resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index fa5c08ba7..172ca2f25 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -78,8 +78,6 @@
<attr name="keyPreviewLeftBackground" format="reference" />
<!-- The background for the right edge key press feedback. -->
<attr name="keyPreviewRightBackground" format="reference" />
- <!-- The background for spacebar press feedback. -->
- <attr name="keyPreviewSpacebarBackground" format="reference" />
<!-- The text color for key press feedback. -->
<attr name="keyPreviewTextColor" format="color" />
<!-- Vertical offset of the key press feedback from the key. -->
@@ -118,6 +116,7 @@
<attr name="colorAutoCorrect" format="color" />
<attr name="colorSuggested" format="color" />
<attr name="candidateCountInStrip" format="integer" />
+ <attr name="centerCandidatePercentile" format="integer" />
</declare-styleable>
<declare-styleable name="Keyboard">
@@ -152,20 +151,19 @@
<attr name="popupKeyboardTemplate" format="reference" />
<!-- Locale of the keyboard layout -->
<attr name="keyboardLocale" format="string" />
+ <!-- True if the keyboard is Right-To-Left -->
+ <attr name="isRtlKeyboard" format="boolean" />
<!-- Icon set for key top and key preview. -->
<attr name="iconShiftKey" format="reference" />
- <attr name="iconToSymbolKey" format="reference" />
- <attr name="iconToSymbolKeyWithShortcut" format="reference" />
<attr name="iconDeleteKey" format="reference" />
- <attr name="iconDeleteRtlKey" format="reference" />
<attr name="iconSettingsKey" format="reference" />
- <attr name="iconShortcutKey" format="reference" />
<attr name="iconSpaceKey" format="reference" />
<attr name="iconReturnKey" format="reference" />
<attr name="iconSearchKey" format="reference" />
<attr name="iconTabKey" format="reference" />
+ <attr name="iconShortcutKey" format="reference" />
+ <attr name="iconShortcutForLabel" format="reference" />
<attr name="iconShiftedShiftKey" format="reference" />
- <attr name="iconPreviewSpaceKey" format="reference" />
<attr name="iconPreviewTabKey" format="reference" />
<attr name="iconPreviewSettingsKey" format="reference" />
<attr name="iconPreviewShortcutKey" format="reference" />
@@ -178,13 +176,6 @@
<attr name="popupCharacters" format="string" />
<!-- Maximum column of popup keyboard -->
<attr name="maxPopupKeyboardColumn" format="integer" />
- <!-- Key edge flags. -->
- <attr name="keyEdgeFlags" format="integer">
- <!-- Key is anchored to the left of the keyboard. -->
- <flag name="left" value="1" />
- <!-- Key is anchored to the right of the keyboard. -->
- <flag name="right" value="2" />
- </attr>
<!-- Whether this is a functional key which has different key top than normal key. -->
<attr name="isFunctional" format="boolean" />
<!-- Whether this is a toggle key. -->
@@ -211,34 +202,33 @@
<flag name="hasPopupHint" value="0x200" />
<flag name="hasUppercaseLetter" value="0x400" />
<flag name="hasHintLabel" value="0x800" />
+ <flag name="withIconLeft" value="0x1000" />
+ <flag name="withIconRight" value="0x2000" />
</attr>
<!-- The icon to display on the key instead of the label. -->
<attr name="keyIcon" format="enum">
<!-- This should be aligned with KeyboardIcons.ICON_* -->
<enum name="iconShiftKey" value="1" />
- <enum name="iconToSymbolKey" value="2" />
- <enum name="iconToSymbolKeyWithShortcut" value="3" />
- <enum name="iconDeleteKey" value="4" />
- <enum name="iconDeleteRtlKey" value="5" />
- <enum name="iconSettingsKey" value="6" />
- <enum name="iconShortcutKey" value="7" />
- <enum name="iconSpaceKey" value="8" />
- <enum name="iconReturnKey" value="9" />
- <enum name="iconSearchKey" value="10" />
- <enum name="iconTabKey" value="11" />
+ <enum name="iconDeleteKey" value="2" />
+ <enum name="iconSettingsKey" value="3" />
+ <enum name="iconSpaceKey" value="4" />
+ <enum name="iconReturnKey" value="5" />
+ <enum name="iconSearchKey" value="6" />
+ <enum name="iconTabKey" value="7" />
+ <enum name="iconShortcutKey" value="8" />
+ <enum name="iconShortcutForLabel" value="9" />
</attr>
<!-- Shift key icon for shifted state -->
<attr name="keyIconShifted" format="enum">
<!-- This should be aligned with KeyboardIcons.ICON_SHIFTED_* -->
- <enum name="iconShiftedShiftKey" value="12" />
+ <enum name="iconShiftedShiftKey" value="10" />
</attr>
<!-- The icon to show in the popup preview. -->
<attr name="keyIconPreview" format="enum">
<!-- This should be aligned with KeyboardIcons.ICON_PREVIEW_* -->
- <enum name="iconPreviewSpaceKey" value="13" />
- <enum name="iconPreviewTabKey" value="14" />
- <enum name="iconPreviewSettingsKey" value="15" />
- <enum name="iconPreviewShortcutKey" value="16" />
+ <enum name="iconPreviewTabKey" value="11" />
+ <enum name="iconPreviewSettingsKey" value="12" />
+ <enum name="iconPreviewShortcutKey" value="13" />
</attr>
<!-- The key style to specify a set of key attributes defined by <key_style/> -->
<attr name="keyStyle" format="string" />
@@ -252,16 +242,6 @@
<attr name="keyXPos" format="dimension|fraction" />
</declare-styleable>
- <declare-styleable name="Keyboard_Row">
- <!-- Row edge flags. -->
- <attr name="rowEdgeFlags" format="integer">
- <!-- Row is anchored to the top of the keyboard. -->
- <flag name="top" value="4" />
- <!-- Row is anchored to the bottom of the keyboard. -->
- <flag name="bottom" value="8" />
- </attr>
- </declare-styleable>
-
<declare-styleable name="Keyboard_Include">
<attr name="keyboardLayout" format="reference" />
</declare-styleable>
@@ -287,8 +267,8 @@
<enum name="shortcutImeOrSettings" value="3" />
</attr>
<attr name="clobberSettingsKey" format="boolean" />
- <attr name="voiceKeyEnabled" format="boolean" />
- <attr name="hasVoiceKey" format="boolean" />
+ <attr name="shortcutKeyEnabled" format="boolean" />
+ <attr name="hasShortcutKey" format="boolean" />
<attr name="imeAction" format="enum">
<!-- This should be aligned with EditorInfo.IME_ACTION_* -->
<enum name="actionUnspecified" value="0" />
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index bc64eb2e6..731f63f34 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -20,18 +20,16 @@
<resources>
<bool name="config_enable_show_settings_key_option">true</bool>
+ <bool name="config_default_show_settings_key">false</bool>
<bool name="config_enable_show_voice_key_option">true</bool>
<bool name="config_enable_show_popup_on_keypress_option">true</bool>
<bool name="config_enable_show_recorrection_option">true</bool>
- <bool name="config_enable_quick_fixes_option">true</bool>
<bool name="config_enable_bigram_suggestions_option">true</bool>
<bool name="config_enable_usability_study_mode_option">false</bool>
<bool name="config_sliding_key_input_enabled">true</bool>
<bool name="config_digit_popup_characters_enabled">true</bool>
<!-- Whether or not Popup on key press is enabled by default -->
<bool name="config_default_popup_preview">true</bool>
- <!-- Default values for whether quick fixes and bigram suggestions are activated -->
- <bool name="config_default_quick_fixes">true</bool>
<!-- Default value for bigram suggestion: while showing candidates for a word should we weigh
in the previous word? -->
<bool name="config_default_bigram_suggestions">true</bool>
@@ -41,7 +39,6 @@
<bool name="config_default_recorrection_enabled">true</bool>
<bool name="config_default_sound_enabled">false</bool>
<bool name="config_auto_correction_spacebar_led_enabled">true</bool>
- <bool name="config_use_spacebar_language_switcher">true</bool>
<!-- Showing mini keyboard, just above the touched point if true, aligned to the key if false -->
<bool name="config_show_mini_keyboard_at_touched_point">false</bool>
<!-- The language is never displayed if == 0, always displayed if < 0 -->
@@ -63,7 +60,7 @@
<!-- Long pressing shift will invoke caps-lock if > 0, never invoke caps-lock if == 0 -->
<integer name="config_long_press_shift_key_timeout">1200</integer>
<!-- Long pressing space will invoke IME switcher if > 0, never invoke IME switcher if == 0 -->
- <integer name="config_long_press_space_key_timeout">1200</integer>
+ <integer name="config_long_press_space_key_timeout">@integer/config_long_press_key_timeout</integer>
<integer name="config_touch_noise_threshold_millis">40</integer>
<integer name="config_double_spaces_turn_into_period_timeout">1100</integer>
<dimen name="config_touch_noise_threshold_distance">2.0mm</dimen>
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index ff0458cfe..2c4b35ef8 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -57,7 +57,7 @@
<dimen name="mini_keyboard_vertical_correction">-0.330in</dimen>
<!-- We use "inch", not "dip" because this value tries dealing with physical distance related
to user's finger. -->
- <dimen name="keyboard_vertical_correction">-0.05in</dimen>
+ <dimen name="keyboard_vertical_correction">0.0in</dimen>
<fraction name="key_letter_ratio">55%</fraction>
<fraction name="key_large_letter_ratio">65%</fraction>
@@ -86,6 +86,7 @@
<dimen name="candidate_padding">6dip</dimen>
<dimen name="candidate_text_size">18dip</dimen>
<integer name="candidate_count_in_strip">3</integer>
+ <integer name="center_candidate_percentile">36</integer>
<!-- If the screen height in landscape is larger than the below value, then the keyboard
will not go into extract (fullscreen) mode. -->
diff --git a/java/res/values/donottranslate-altchars.xml b/java/res/values/donottranslate-altchars.xml
index 9d06d06f7..fbde4b9ba 100644
--- a/java/res/values/donottranslate-altchars.xml
+++ b/java/res/values/donottranslate-altchars.xml
@@ -50,9 +50,7 @@
<string name="alternates_for_currency_general">¢,$,€,£,¥,₱</string>
<string name="alternates_for_smiley">":-)|:-) ,:-(|:-( ,;-)|;-) ,:-P|:-P ,=-O|=-O ,:-*|:-* ,:O|:O ,B-)|B-) ,:-$|:-$ ,:-!|:-! ,:-[|:-[ ,O:-)|O:-) ,:-\\\\\\\\|:-\\\\\\\\ ,:\'(|:\'( ,:-D|:-D "</string>
<string name="alternates_for_punctuation">"\\,,\?,!,:,-,\',\",(,),/,;,+,&amp;,\@"</string>
- <string name="alternates_for_web_tab_punctuation">".,\\,,\?,!,:,-,\',\",(,),/,;,+,&amp;,\@"</string>
<integer name="popup_keyboard_column_for_punctuation">7</integer>
- <integer name="popup_keyboard_column_for_web_punctuation">8</integer>
<string name="keyhintlabel_for_punctuation"></string>
<string name="keylabel_for_popular_domain">".com"</string>
<!-- popular web domains for the locale - most popular, displayed on the keyboard -->
@@ -77,12 +75,20 @@
<string name="alternates_for_symbols_8"></string>
<string name="alternates_for_symbols_9"></string>
<string name="alternates_for_symbols_0">ⁿ,∅</string>
- <string name="keylabel_for_symbols_comma">,</string>
+ <string name="keylabel_for_comma">,</string>
+ <string name="keylabel_for_f1">,</string>
<string name="keylabel_for_symbols_question">\?</string>
<string name="keylabel_for_symbols_semicolon">;</string>
- <string name="alternates_for_symbols_comma"></string>
+ <string name="keylabel_for_symbols_percent">%</string>
+ <string name="alternates_for_comma"></string>
+ <string name="alternates_for_f1"></string>
+ <!-- @icon/3 is iconSettingsKey -->
+ <string name="alternates_for_f1_settings">\@icon/3|\@integer/key_settings</string>
+ <!-- @icon/7 is iconTabKey -->
+ <string name="alternates_for_f1_navigate">\@icon/7|\@integer/key_tab</string>
<string name="alternates_for_symbols_question">¿</string>
<string name="alternates_for_symbols_semicolon"></string>
+ <string name="alternates_for_symbols_percent">‰</string>
<string name="keylabel_for_apostrophe">\'</string>
<string name="keylabel_for_dash">-</string>
<string name="keyhintlabel_for_apostrophe">\"</string>
diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index f88d2df1c..fb28766e7 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -19,7 +19,7 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Symbols that are suggested between words -->
- <string name="suggested_punctuations">!?,\u0022\u0027:();-/@_</string>
+ <string name="suggested_punctuations">!?,\u0022:;()\u0027-/@_</string>
<!-- Symbols that should be swapped with a magic space -->
<string name="magic_space_swapping_symbols">.,;:!?)]}\u0022</string>
<!-- Symbols that should strip a magic space -->
@@ -27,21 +27,22 @@
<!-- Symbols that should convert magic spaces into real space -->
<string name="magic_space_promoting_symbols">([*&amp;@{&lt;&gt;+=|</string>
<!-- Symbols that do NOT separate words -->
- <string name="non_word_separator_symbols">\u0027-</string>
+ <string name="symbols_excluded_from_word_separators">\u0027-</string>
<!-- Word separator list is the union of all symbols except those that are not separators:
magic_space_swapping_symbols | magic_space_stripping_symbols |
- magic_space_neutral_symbols \ non_word_separator_symbols -->
+ magic_space_neutral_symbols \ symbols_excluded_from_word_separators -->
+
+ <!-- Label for "switch to more symbol" modifier key. Must be short to fit on key! -->
+ <string name="label_to_more_symbol_key">= \\ &lt;</string>
+ <!-- Label for "switch to more symbol" modifier key on tablets. Must be short to fit on key! -->
+ <string name="label_to_more_symbol_for_tablet_key">\\ ^ [ {</string>
- <!-- Label for ALT modifier key. Must be short to fit on key! -->
- <string name="label_alt_key">ALT</string>
<!-- Label for "Tab" key. Must be short to fit on key! -->
<string name="label_tab_key">Tab</string>
- <!-- Label for "switch to symbols" key. Must be short to fit on key! -->
- <string name="label_to_symbol_key">\?123</string>
<!-- Label for "switch to phone numeric" key. Must be short to fit on key! -->
<string name="label_to_phone_numeric_key">123</string>
<!-- Label for "switch to phone symbols" key. Must be short to fit on key! -->
- <string name="label_to_phone_symbols_key">\uff0a\uff03\uff08</string>
+ <string name="label_to_phone_symbols_key">\uff0a\uff03</string>
<!-- Character for candidate divider (BOX DRAWINGS LIGHT VERTICAL) -->
<string name="label_candidate_divider">\u2502</string>
@@ -50,26 +51,6 @@
<!-- Character for close candidates pane (BLACK UP-POINTING TRIANGLE) -->
<string name="label_close_candidates_pane">\u25b2</string>
- <!-- Option values to show/hide the settings key in onscreen keyboard -->
- <!-- Automatically decide to show or hide the settings key -->
- <string name="settings_key_mode_auto">0</string>
- <!-- Always show the settings key -->
- <string name="settings_key_mode_always_show">1</string>
- <!-- Always hide the settings key -->
- <string name="settings_key_mode_always_hide">2</string>
- <!-- Array of the settings key mode values -->
- <string-array name="settings_key_modes_values">
- <item>@string/settings_key_mode_auto</item>
- <item>@string/settings_key_mode_always_show</item>
- <item>@string/settings_key_mode_always_hide</item>
- </string-array>
- <!-- Array of the settings key modes -->
- <string-array name="settings_key_modes">
- <item>@string/settings_key_mode_auto_name</item>
- <item>@string/settings_key_mode_always_show_name</item>
- <item>@string/settings_key_mode_always_hide_name</item>
- </string-array>
-
<!-- Always show the suggestion strip -->
<string name="prefs_suggestion_visibility_show_value">0</string>
<!-- Show the suggestion strip only on portrait mode -->
@@ -169,4 +150,7 @@
<item>English (UK)</item>
<item>Deutsch (QWERTY)</item>
</string-array>
+
+ <!-- Generic subtype label -->
+ <string name="subtype_generic">%s</string>
</resources>
diff --git a/java/res/values/keyboard-icons-black.xml b/java/res/values/keyboard-icons-black.xml
index 313bf02e1..23d163c69 100644
--- a/java/res/values/keyboard-icons-black.xml
+++ b/java/res/values/keyboard-icons-black.xml
@@ -22,18 +22,15 @@
sym_bkeyboard_voice_off
-->
<item name="iconShiftKey">@drawable/sym_bkeyboard_shift</item>
- <item name="iconToSymbolKeyWithShortcut">@drawable/sym_bkeyboard_123_mic</item>
<item name="iconDeleteKey">@drawable/sym_bkeyboard_delete</item>
- <!-- TODO: update this icon drawable -->
- <item name="iconDeleteRtlKey">@drawable/sym_bkeyboard_delete_rtl</item>
<item name="iconSettingsKey">@drawable/sym_bkeyboard_settings</item>
- <item name="iconShortcutKey">@drawable/sym_bkeyboard_mic</item>
<item name="iconSpaceKey">@drawable/sym_bkeyboard_space</item>
<item name="iconReturnKey">@drawable/sym_bkeyboard_return</item>
<item name="iconSearchKey">@drawable/sym_bkeyboard_search</item>
<item name="iconTabKey">@drawable/sym_bkeyboard_tab</item>
+ <item name="iconShortcutKey">@drawable/sym_bkeyboard_mic</item>
+ <item name="iconShortcutForLabel">@drawable/sym_bkeyboard_label_mic</item>
<item name="iconShiftedShiftKey">@drawable/sym_bkeyboard_shift_locked</item>
- <item name="iconPreviewSpaceKey">@drawable/sym_keyboard_feedback_space</item>
<item name="iconPreviewTabKey">@drawable/sym_keyboard_feedback_tab</item>
<item name="iconPreviewSettingsKey">@drawable/sym_keyboard_feedback_settings</item>
<item name="iconPreviewShortcutKey">@drawable/sym_keyboard_feedback_mic</item>
diff --git a/java/res/values/keyboard-icons-ics.xml b/java/res/values/keyboard-icons-ics.xml
index a2bfd7a2f..f619691a9 100644
--- a/java/res/values/keyboard-icons-ics.xml
+++ b/java/res/values/keyboard-icons-ics.xml
@@ -21,18 +21,15 @@
sym_keyboard_123_mic_holo
-->
<item name="iconShiftKey">@drawable/sym_keyboard_shift_holo</item>
- <item name="iconToSymbolKeyWithShortcut">@drawable/sym_keyboard_123_mic_holo</item>
<item name="iconDeleteKey">@drawable/sym_keyboard_delete_holo</item>
- <!-- TODO: update this icon drawable -->
- <item name="iconDeleteRtlKey">@drawable/sym_keyboard_delete_rtl_holo</item>
<item name="iconSettingsKey">@drawable/sym_keyboard_settings_holo</item>
- <item name="iconShortcutKey">@drawable/sym_keyboard_voice_holo</item>
<item name="iconSpaceKey">@drawable/sym_keyboard_space_holo</item>
<item name="iconReturnKey">@drawable/sym_keyboard_return_holo</item>
<item name="iconSearchKey">@drawable/sym_keyboard_search</item>
<item name="iconTabKey">@drawable/sym_keyboard_tab_holo</item>
+ <item name="iconShortcutKey">@drawable/sym_keyboard_voice_holo</item>
+ <item name="iconShortcutForLabel">@drawable/sym_keyboard_label_mic_holo</item>
<item name="iconShiftedShiftKey">@drawable/sym_keyboard_shift_locked_holo</item>
- <item name="iconPreviewSpaceKey">@drawable/transparent</item>
<item name="iconPreviewTabKey">@drawable/sym_keyboard_feedback_tab</item>
<item name="iconPreviewSettingsKey">@drawable/sym_keyboard_settings_holo</item>
<item name="iconPreviewShortcutKey">@drawable/sym_keyboard_feedback_mic</item>
diff --git a/java/res/values/keyboard-icons-white.xml b/java/res/values/keyboard-icons-white.xml
index b6fa89026..a1765a44d 100644
--- a/java/res/values/keyboard-icons-white.xml
+++ b/java/res/values/keyboard-icons-white.xml
@@ -18,18 +18,15 @@
<style name="KeyboardIcons">
<!-- Keyboard icons -->
<item name="iconShiftKey">@drawable/sym_keyboard_shift</item>
- <item name="iconToSymbolKeyWithShortcut">@drawable/sym_keyboard_123_mic</item>
<item name="iconDeleteKey">@drawable/sym_keyboard_delete</item>
- <!-- TODO: update this icon drawable -->
- <item name="iconDeleteRtlKey">@drawable/sym_keyboard_delete_rtl</item>
<item name="iconSettingsKey">@drawable/sym_keyboard_settings</item>
- <item name="iconShortcutKey">@drawable/sym_keyboard_mic</item>
<item name="iconSpaceKey">@drawable/sym_keyboard_space</item>
<item name="iconReturnKey">@drawable/sym_keyboard_return</item>
<item name="iconSearchKey">@drawable/sym_keyboard_search</item>
<item name="iconTabKey">@drawable/sym_keyboard_tab</item>
+ <item name="iconShortcutKey">@drawable/sym_keyboard_mic</item>
+ <item name="iconShortcutForLabel">@drawable/sym_keyboard_label_mic</item>
<item name="iconShiftedShiftKey">@drawable/sym_keyboard_shift_locked</item>
- <item name="iconPreviewSpaceKey">@drawable/sym_keyboard_feedback_space</item>
<item name="iconPreviewTabKey">@drawable/sym_keyboard_feedback_tab</item>
<item name="iconPreviewSettingsKey">@drawable/sym_keyboard_feedback_settings</item>
<item name="iconPreviewShortcutKey">@drawable/sym_keyboard_feedback_mic</item>
diff --git a/java/res/values/keycodes.xml b/java/res/values/keycodes.xml
index ee345291a..59cc07531 100644
--- a/java/res/values/keycodes.xml
+++ b/java/res/values/keycodes.xml
@@ -27,5 +27,5 @@
<integer name="key_switch_alpha_symbol">-2</integer>
<integer name="key_delete">-5</integer>
<integer name="key_settings">-6</integer>
- <integer name="key_shortcut">-8</integer>
+ <integer name="key_shortcut">-7</integer>
</resources>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 739f72f36..ed69fc9f0 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -25,6 +25,9 @@
<!-- Title for Latin keyboard input options dialog [CHAR LIMIT=25] -->
<string name="english_ime_input_options">Input options</string>
+ <!-- Title for Latin Keyboard spell checker service -->
+ <string name="spell_checker_service_name">Android correction</string>
+
<!-- Option to provide vibrate/haptic feedback on keypress -->
<string name="vibrate_on_keypress">Vibrate on keypress</string>
@@ -69,11 +72,6 @@
<!-- Option to configure dictionaries -->
<string name="configure_dictionaries_title">Configure dictionaries</string>
- <!-- Option to enable quick fixes -->
- <string name="quick_fixes">Quick fixes</string>
- <!-- Description for quick fixes -->
- <string name="quick_fixes_summary">Corrects commonly typed mistakes</string>
-
<!-- Option to enable showing suggestions -->
<string name="prefs_show_suggestions">Show correction suggestions</string>
<!-- Description for show suggestions -->
@@ -81,17 +79,9 @@
<string name="prefs_suggestion_visibility_show_name">Always show</string>
<string name="prefs_suggestion_visibility_show_only_portrait_name">Show on portrait mode</string>
<string name="prefs_suggestion_visibility_hide_name">Always hide</string>
- <!-- Option to enable spacebar language switcher [CHAR LIMIT=20]-->
- <string name="prefs_use_spacebar_language_switch">Use the spacebar language switcher</string>
<!-- Option to show/hide the settings key -->
<string name="prefs_settings_key">Show settings key</string>
- <!-- Option to automatically decide to show/hide the settings key -->
- <string name="settings_key_mode_auto_name">Automatic</string>
- <!-- Option to always show the settings key -->
- <string name="settings_key_mode_always_show_name">Always show</string>
- <!-- Option to always hide the settings key -->
- <string name="settings_key_mode_always_hide_name">Always hide</string>
<!-- Option to decide the auto correction threshold score -->
<!-- Option to enable auto correction [CHAR LIMIT=20]-->
@@ -119,17 +109,22 @@
<!-- Indicates that a word has been added to the dictionary -->
<string name="added_word"><xliff:g id="word">%s</xliff:g> : Saved</string>
- <!-- Label for soft enter key when it performs GO action. Must be short to fit on key! -->
+ <!-- Label for soft enter key when it performs GO action. Must be short to fit on key! [CHAR LIMIT=5] -->
<string name="label_go_key">Go</string>
- <!-- Label for soft enter key when it performs NEXT action. Must be short to fit on key! -->
+ <!-- Label for soft enter key when it performs NEXT action. Must be short to fit on key! [CHAR LIMIT=5] -->
<string name="label_next_key">Next</string>
- <!-- Label for soft enter key when it performs DONE action. Must be short to fit on key! -->
+ <!-- Label for soft enter key when it performs DONE action. Must be short to fit on key! [CHAR LIMIT=5] -->
<string name="label_done_key">Done</string>
- <!-- Label for soft enter key when it performs SEND action. Must be short to fit on key! -->
+ <!-- Label for soft enter key when it performs SEND action. Must be short to fit on key! [CHAR LIMIT=5] -->
<string name="label_send_key">Send</string>
- <!-- Label for "switch to alphabetic" key. Must be short to fit on key! -->
+ <!-- Label for "switch to alphabetic" key. Must be short to fit on key! [CHAR LIMIT=3] -->
<string name="label_to_alpha_key">ABC</string>
- <!-- Label for Shift modifier key of symbol keyboard. Must be short to fit on key! -->
+ <!-- Label for "switch to symbols" key. Must be short to fit on key! [CHAR LIMIT=4] -->
+ <string name="label_to_symbol_key">\?123</string>
+ <!-- Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+ part because it'll be appended by the code. Must be short to fit on key! [CHAR LIMIT=3] -->
+ <string name="label_to_symbol_with_microphone_key">123</string>
+ <!-- Label for Shift modifier key of symbol keyboard. Must be short to fit on key! [CHAR LIMIT=5] -->
<string name="label_more_key">More</string>
<!-- Label for "Pause" key of phone number keyboard. Must be short to fit on key! [CHAR LIMIT=5] -->
<string name="label_pause_key">Pause</string>
@@ -301,6 +296,9 @@
<!-- Title of the dialog for selecting input methods. [CHAR LIMIT=20] -->
<string name="selectInputMethod">Select input method</string>
+ <!-- Title for configuring input method settings [CHAR LIMIT=35] -->
+ <string name="configure_input_method">Configure input methods</string>
+
<!-- Title for input language selection screen -->
<string name="language_selection_title">Input languages</string>
@@ -325,89 +323,12 @@
<!-- Title of the item to change the keyboard theme [CHAR LIMIT=20]-->
<string name="keyboard_layout">Keyboard theme</string>
- <!-- Description for Czech keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_cs_keyboard">Czech Keyboard</string>
- <!-- Description for Arabic keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_ar_keyboard">Arabic Keyboard</string>
- <!-- Description for Danish keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_da_keyboard">Danish Keyboard</string>
- <!-- Description for German keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_de_keyboard">German Keyboard</string>
<!-- Description for German QWERTY keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_de_qwerty_keyboard">German QWERTY Keyboard</string>
+ <string name="subtype_de_qwerty">German QWERTY</string>
<!-- Description for English (United Kingdom) keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_en_GB_keyboard">English (UK) Keyboard</string>
+ <string name="subtype_en_GB">English (UK)</string>
<!-- Description for English (United States) keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_en_US_keyboard">English (US) Keyboard</string>
- <!-- Description for Spanish keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_es_keyboard">Spanish Keyboard</string>
- <!-- Description for Finnish keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_fi_keyboard">Finnish Keyboard</string>
- <!-- Description for French keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_fr_keyboard">French Keyboard</string>
- <!-- Description for French (Canada) keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_fr_CA_keyboard">French (Canada) Keyboard</string>
- <!-- Description for French (Switzerland) keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_fr_CH_keyboard">French (Switzerland) Keyboard</string>
- <!-- Description for Croatian keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_hr_keyboard">Croatian Keyboard</string>
- <!-- Description for Hungarian keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_hu_keyboard">Hungarian Keyboard</string>
- <!-- Description for Hebrew keyboard subtype [CHAR LIMIT=35] -->
- <!-- Java uses the deprecated "iw" code instead of the standard "he" code -->
- <string name="subtype_mode_iw_keyboard">Hebrew Keyboard</string>
- <!-- Description for Italian keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_it_keyboard">Italian Keyboard</string>
- <!-- Description for Norwegian keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_nb_keyboard">Norwegian Keyboard</string>
- <!-- Description for Dutch keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_nl_keyboard">Dutch Keyboard</string>
- <!-- Description for Polish keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_pl_keyboard">Polish Keyboard</string>
- <!-- Description for Portuguese keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_pt_keyboard">Portuguese Keyboard</string>
- <!-- Description for Russian keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_ru_keyboard">Russian Keyboard</string>
- <!-- Description for Serbian keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_sr_keyboard">Serbian Keyboard</string>
- <!-- Description for Swedish keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_sv_keyboard">Swedish Keyboard</string>
- <!-- Description for Turkish keyboard subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_tr_keyboard">Turkish Keyboard</string>
- <!-- Description for Afrikaans voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_af_voice">Afrikaans Voice</string>
- <!-- Description for Czech voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_cs_voice">Czech Voice</string>
- <!-- Description for German voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_de_voice">German Voice</string>
- <!-- Description for English voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_en_voice">English Voice</string>
- <!-- Description for Spanish voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_es_voice">Spanish Voice</string>
- <!-- Description for French voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_fr_voice">French Voice</string>
- <!-- Description for Italian voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_it_voice">Italian Voice</string>
- <!-- Description for Japanese voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_ja_voice">Japanese Voice</string>
- <!-- Description for Korean voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_ko_voice">Korean Voice</string>
- <!-- Description for Dutch voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_nl_voice">Dutch Voice</string>
- <!-- Description for Polish voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_pl_voice">Polish Voice</string>
- <!-- Description for Portuguese voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_pt_voice">Portuguese Voice</string>
- <!-- Description for Russian voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_ru_voice">Russian Voice</string>
- <!-- Description for Turkish voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_tr_voice">Turkish Voice</string>
- <!-- Description for Chinese, Yue voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_yue_voice">Chinese, Yue Voice</string>
- <!-- Description for Chinese, Mandarin voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_zh_voice">Chinese, Mandarin Voice</string>
- <!-- Description for isiZulu voice input subtype [CHAR LIMIT=35] -->
- <string name="subtype_mode_zu_voice">isiZulu Voice</string>
+ <string name="subtype_en_US">English (US)</string>
<!-- Title of an option for usability study mode -->
<string name="prefs_usability_study_mode">Usability study mode</string>
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index 8ed334376..1ebd2cee1 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -56,7 +56,6 @@
<item name="keyPreviewBackground">@drawable/keyboard_key_feedback</item>
<item name="keyPreviewLeftBackground">@null</item>
<item name="keyPreviewRightBackground">@null</item>
- <item name="keyPreviewSpacebarBackground">@drawable/keyboard_key_feedback</item>
<item name="keyPreviewTextColor">#FFFFFFFF</item>
<item name="keyPreviewOffset">@dimen/key_preview_offset</item>
<item name="keyPreviewHeight">@dimen/key_preview_height</item>
@@ -91,6 +90,7 @@
<item name="colorAutoCorrect">#FFFCAE00</item>
<item name="colorSuggested">#FFFCAE00</item>
<item name="candidateCountInStrip">@integer/candidate_count_in_strip</item>
+ <item name="centerCandidatePercentile">@integer/center_candidate_percentile</item>
</style>
<!-- Theme "Basic high contrast" -->
<style name="KeyboardView.HighContrast" parent="KeyboardView">
@@ -163,7 +163,6 @@
<item name="keyPreviewBackground">@drawable/keyboard_key_feedback_ics</item>
<item name="keyPreviewLeftBackground">@drawable/keyboard_key_feedback_left_ics</item>
<item name="keyPreviewRightBackground">@drawable/keyboard_key_feedback_right_ics</item>
- <item name="keyPreviewSpacebarBackground">@drawable/transparent</item>
<item name="keyPreviewTextColor">#FFFFFFFF</item>
<item name="keyPreviewHeight">@dimen/key_preview_height_ics</item>
<item name="keyPreviewOffset">@dimen/key_preview_offset_ics</item>
@@ -194,6 +193,7 @@
<item name="colorAutoCorrect">#FF3DC8FF</item>
<item name="colorSuggested">#FFFFFFFF</item>
<item name="candidateCountInStrip">@integer/candidate_count_in_strip</item>
+ <item name="centerCandidatePercentile">@integer/center_candidate_percentile</item>
</style>
<style name="PopupMiniKeyboardAnimation">
<item name="android:windowEnterAnimation">@anim/mini_keyboard_fadein</item>
diff --git a/java/res/xml-ar/kbd_qwerty.xml b/java/res/xml-ar/kbd_qwerty.xml
index 57a6d2caf..b26a938cc 100644
--- a/java/res/xml-ar/kbd_qwerty.xml
+++ b/java/res/xml-ar/kbd_qwerty.xml
@@ -21,6 +21,7 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardLocale="ar"
+ latin:isRtlKeyboard="true"
>
<include
latin:keyboardLayout="@xml/kbd_rows_arabic" />
diff --git a/java/res/xml-ar/kbd_symbols.xml b/java/res/xml-ar/kbd_symbols.xml
new file mode 100644
index 000000000..9e5c255d0
--- /dev/null
+++ b/java/res/xml-ar/kbd_symbols.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:isRtlKeyboard="true"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_rows_symbols" />
+</Keyboard>
diff --git a/java/res/xml-ar/kbd_symbols_shift.xml b/java/res/xml-ar/kbd_symbols_shift.xml
new file mode 100644
index 000000000..934e6f849
--- /dev/null
+++ b/java/res/xml-ar/kbd_symbols_shift.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:isRtlKeyboard="true"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_rows_symbols_shift" />
+</Keyboard>
diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml
index dc2c5d35a..54cd4b5e9 100644
--- a/java/res/xml-iw/kbd_qwerty.xml
+++ b/java/res/xml-iw/kbd_qwerty.xml
@@ -21,6 +21,7 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardLocale="iw"
+ latin:isRtlKeyboard="true"
>
<include
latin:keyboardLayout="@xml/kbd_rows_hebrew" />
diff --git a/java/res/xml-iw/kbd_symbols.xml b/java/res/xml-iw/kbd_symbols.xml
new file mode 100644
index 000000000..9e5c255d0
--- /dev/null
+++ b/java/res/xml-iw/kbd_symbols.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:isRtlKeyboard="true"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_rows_symbols" />
+</Keyboard>
diff --git a/java/res/xml-iw/kbd_symbols_shift.xml b/java/res/xml-iw/kbd_symbols_shift.xml
new file mode 100644
index 000000000..934e6f849
--- /dev/null
+++ b/java/res/xml-iw/kbd_symbols_shift.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:isRtlKeyboard="true"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_rows_symbols_shift" />
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml
index 388e293e6..05b683707 100644
--- a/java/res/xml-sw600dp/kbd_key_styles.xml
+++ b/java/res/xml-sw600dp/kbd_key_styles.xml
@@ -31,14 +31,14 @@
latin:clobberSettingsKey="true"
>
<key-style
- latin:styleName="settingsPopupStyle"
+ latin:styleName="f2PopupStyle"
latin:parentStyle="functionalKeyStyle" />
</case>
<default>
<key-style
- latin:styleName="settingsPopupStyle"
+ latin:styleName="f2PopupStyle"
latin:keyLabelOption="hasPopupHint"
- latin:popupCharacters="\@icon/6|\@integer/key_settings"
+ latin:popupCharacters="\@icon/3|\@integer/key_settings"
latin:parentStyle="functionalKeyStyle" />
</default>
</switch>
@@ -50,24 +50,12 @@
latin:keyIconShifted="iconShiftedShiftKey"
latin:parentStyle="functionalKeyStyle"
latin:isSticky="true" />
- <switch>
- <case latin:languageCode="ar|iw">
- <key-style
- latin:styleName="deleteKeyStyle"
- latin:code="@integer/key_delete"
- latin:keyIcon="iconDeleteRtlKey"
- latin:parentStyle="functionalKeyStyle"
- latin:isRepeatable="true" />
- </case>
- <default>
- <key-style
- latin:styleName="deleteKeyStyle"
- latin:code="@integer/key_delete"
- latin:keyIcon="iconDeleteKey"
- latin:parentStyle="functionalKeyStyle"
- latin:isRepeatable="true" />
- </default>
- </switch>
+ <key-style
+ latin:styleName="deleteKeyStyle"
+ latin:code="@integer/key_delete"
+ latin:keyIcon="iconDeleteKey"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isRepeatable="true" />
<key-style
latin:styleName="returnKeyStyle"
latin:code="@integer/key_return"
@@ -75,12 +63,10 @@
latin:parentStyle="functionalKeyStyle" />
<key-style
latin:styleName="spaceKeyStyle"
- latin:code="@integer/key_space"
- latin:keyIconPreview="iconPreviewSpaceKey" />
+ latin:code="@integer/key_space" />
<key-style
latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
- latin:code="@integer/key_space"
- latin:keyIconPreview="iconPreviewSpaceKey" />
+ latin:code="@integer/key_space" />
<key-style
latin:styleName="smileyKeyStyle"
latin:keyLabel=":-)"
@@ -93,7 +79,7 @@
latin:code="@integer/key_shortcut"
latin:keyIcon="iconShortcutKey"
latin:keyIconPreview="iconPreviewShortcutKey"
- latin:parentStyle="settingsPopupStyle" />
+ latin:parentStyle="f2PopupStyle" />
<key-style
latin:styleName="settingsKeyStyle"
latin:code="@integer/key_settings"
@@ -119,12 +105,17 @@
latin:keyLabelOption="fontNormal"
latin:parentStyle="functionalKeyStyle" />
<key-style
- latin:styleName="moreKeyStyle"
+ latin:styleName="toMoreSymbolKeyStyle"
latin:code="@integer/key_shift"
- latin:keyLabel="@string/label_more_key"
+ latin:keyLabel="@string/label_to_more_symbol_for_tablet_key"
latin:keyLabelOption="fontNormal"
- latin:parentStyle="functionalKeyStyle"
- latin:isSticky="true" />
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="backFromMoreSymbolKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:keyLabelOption="fontNormal"
+ latin:parentStyle="functionalKeyStyle" />
<key-style
latin:styleName="comKeyStyle"
latin:keyLabel="@string/keylabel_for_popular_domain"
diff --git a/java/res/xml-sw600dp/kbd_number.xml b/java/res/xml-sw600dp/kbd_number.xml
index b3a1010d7..46114dedf 100644
--- a/java/res/xml-sw600dp/kbd_number.xml
+++ b/java/res/xml-sw600dp/kbd_number.xml
@@ -30,11 +30,12 @@
<case
latin:passwordInput="true"
>
- <!-- This row is intentionally not marked as a top row -->
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="24.875%p" />
<Key
- latin:keyStyle="num1KeyStyle"
- latin:keyXPos="24.875%p" />
+ latin:keyStyle="num1KeyStyle" />
<Key
latin:keyStyle="num2KeyStyle" />
<Key
@@ -42,13 +43,14 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-11.00%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="24.875%p" />
<Key
- latin:keyStyle="num4KeyStyle"
- latin:keyXPos="24.875%p" />
+ latin:keyStyle="num4KeyStyle" />
<Key
latin:keyStyle="num5KeyStyle" />
<Key
@@ -56,24 +58,26 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-11.00%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="24.875%p" />
<Key
- latin:keyStyle="num7KeyStyle"
- latin:keyXPos="24.875%p" />
+ latin:keyStyle="num7KeyStyle" />
<Key
latin:keyStyle="num8KeyStyle" />
<Key
latin:keyStyle="num9KeyStyle" />
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row>
<Key
latin:keyStyle="tabKeyStyle"
- latin:keyWidth="11.00%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.00%p" />
<Spacer
latin:keyXPos="24.875%p" />
<Key
@@ -87,12 +91,13 @@
</case>
<!-- latin:passwordInput="false" -->
<default>
- <!-- This row is intentionally not marked as a top row -->
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="11.00%p" />
<Key
latin:keyLabel="-"
latin:keyStyle="numKeyStyle"
- latin:keyXPos="11.00%p"
latin:keyWidth="9.25%p" />
<Key
latin:keyLabel="+"
@@ -115,13 +120,14 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-11.00%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="11.00%p" />
<Key
latin:keyStyle="numStarKeyStyle"
- latin:keyXPos="11.00%p"
latin:keyWidth="9.25%p" />
<Key
latin:keyLabel="/"
@@ -144,17 +150,15 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-11.00%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row>
- <!-- There is an empty area below the "More" key and left of the "(" key. To
- ignore the touch event on the area, "(" is intentionally not marked as a left
- edge key. -->
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="11.00%p" />
<Key
latin:keyLabel="("
latin:keyStyle="numKeyStyle"
- latin:keyXPos="11.00%p"
latin:keyWidth="9.25%p" />
<Key
latin:keyLabel=")"
@@ -174,13 +178,14 @@
<Key
latin:keyLabel="9"
latin:keyStyle="numKeyStyle" />
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row>
<Key
latin:keyStyle="tabKeyStyle"
- latin:keyWidth="11.00%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.00%p" />
<Key
latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
latin:keyWidth="27.75%p" />
diff --git a/java/res/xml-sw600dp/kbd_phone.xml b/java/res/xml-sw600dp/kbd_phone.xml
index dd53a206a..0331389c1 100644
--- a/java/res/xml-sw600dp/kbd_phone.xml
+++ b/java/res/xml-sw600dp/kbd_phone.xml
@@ -26,12 +26,13 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<include
latin:keyboardLayout="@xml/kbd_numkey_styles" />
- <!-- This row is intentionally not marked as a top row -->
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="15.625%p" />
<Key
latin:keyLabel="-"
latin:keyStyle="numKeyStyle"
- latin:keyXPos="15.625%p"
latin:keyWidth="9.25%p" />
<Key
latin:keyLabel="+"
@@ -47,14 +48,15 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-11.00%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="15.625%p" />
<Key
latin:keyLabel=","
latin:keyStyle="numKeyStyle"
- latin:keyXPos="15.625%p"
latin:keyWidth="9.25%p" />
<Key
latin:keyLabel="."
@@ -70,16 +72,12 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-11.00%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row>
<Key
- latin:keyStyle="moreKeyStyle"
- latin:keyWidth="11.0%p"
- latin:keyEdgeFlags="left" />
- <!-- There is an empty area below the "More" key and left of the "(" key. To ignore
- the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+ latin:keyStyle="toMoreSymbolKeyStyle"
+ latin:keyWidth="11.0%p" />
<Key
latin:keyLabel="("
latin:keyStyle="numKeyStyle"
@@ -96,13 +94,14 @@
latin:keyStyle="num8KeyStyle" />
<Key
latin:keyStyle="num9KeyStyle" />
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row>
<Key
latin:keyStyle="tabKeyStyle"
- latin:keyWidth="11.00%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.00%p" />
<Key
latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
latin:keyXPos="15.625%p"
diff --git a/java/res/xml-sw600dp/kbd_phone_symbols.xml b/java/res/xml-sw600dp/kbd_phone_shift.xml
index d083ecb60..2b6936dce 100644
--- a/java/res/xml-sw600dp/kbd_phone_symbols.xml
+++ b/java/res/xml-sw600dp/kbd_phone_shift.xml
@@ -26,12 +26,13 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<include
latin:keyboardLayout="@xml/kbd_numkey_styles" />
- <!-- This row is intentionally not marked as a top row -->
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="11.00%p" />
<Key
latin:keyLabel="-"
latin:keyStyle="numKeyStyle"
- latin:keyXPos="11.00%p"
latin:keyWidth="9.25%p" />
<Key
latin:keyLabel="+"
@@ -51,14 +52,15 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-11.00%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="11.00%p" />
<Key
latin:keyLabel=","
latin:keyStyle="numKeyStyle"
- latin:keyXPos="11.00%p"
latin:keyWidth="9.25%p" />
<Key
latin:keyLabel="."
@@ -78,16 +80,12 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-11.00%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row>
<Key
- latin:keyStyle="moreKeyStyle"
- latin:keyWidth="11.00%p"
- latin:keyEdgeFlags="left" />
- <!-- There is an empty area below the "More" key and left of the "(" key. To ignore
- the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+ latin:keyStyle="backFromMoreSymbolKeyStyle"
+ latin:keyWidth="11.00%p" />
<Key
latin:keyLabel="("
latin:keyStyle="numKeyStyle"
@@ -107,13 +105,14 @@
latin:keyStyle="num8KeyStyle" />
<Key
latin:keyStyle="num9KeyStyle" />
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row>
<Key
latin:keyStyle="tabKeyStyle"
- latin:keyWidth="11.00%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.00%p" />
<Key
latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
latin:keyWidth="27.75%p" />
diff --git a/java/res/xml-sw600dp/kbd_qwerty_f2.xml b/java/res/xml-sw600dp/kbd_qwerty_f2.xml
index 7638ee4b4..b25afc12f 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_f2.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_f2.xml
@@ -27,22 +27,20 @@
>
<Key
latin:keyStyle="settingsKeyStyle"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</case>
<case
latin:f2KeyMode="shortcutIme"
>
<switch>
<case
- latin:voiceKeyEnabled="true"
+ latin:shortcutKeyEnabled="true"
>
<Key
latin:keyStyle="shortcutKeyStyle"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</case>
- <!-- voiceKeyEnabled="false" -->
+ <!-- shortcutKeyEnabled="false" -->
<default>
<Spacer />
</default>
@@ -53,19 +51,17 @@
>
<switch>
<case
- latin:voiceKeyEnabled="true"
+ latin:shortcutKeyEnabled="true"
>
<Key
latin:keyStyle="shortcutKeyStyle"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</case>
- <!-- voiceKeyEnabled="false" -->
+ <!-- shortcutKeyEnabled="false" -->
<default>
<Key
latin:keyStyle="settingsKeyStyle"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</default>
</switch>
</case>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row1.xml b/java/res/xml-sw600dp/kbd_qwerty_row1.xml
index b781d681e..c7dfcc83d 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_row1.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row1.xml
@@ -23,12 +23,10 @@
>
<Row
latin:keyWidth="9.0%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="q"
- latin:popupCharacters="@string/alternates_for_q"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_q" />
<Key
latin:keyLabel="w"
latin:popupCharacters="@string/alternates_for_w" />
@@ -59,7 +57,6 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-10.0%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
</merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row2.xml b/java/res/xml-sw600dp/kbd_qwerty_row2.xml
index 05b005af1..78004fe4f 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_row2.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row2.xml
@@ -27,8 +27,7 @@
<Key
latin:keyLabel="a"
latin:popupCharacters="@string/alternates_for_a"
- latin:keyXPos="4.5%p"
- latin:keyEdgeFlags="left" />
+ latin:keyXPos="4.5%p" />
<Key
latin:keyLabel="s"
latin:popupCharacters="@string/alternates_for_s" />
@@ -53,7 +52,6 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-14.6%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
</merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row3.xml b/java/res/xml-sw600dp/kbd_qwerty_row3.xml
index b4eed8a7c..456f3c8ca 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_row3.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row3.xml
@@ -26,8 +26,7 @@
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="10.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="10.0%p" />
<Key
latin:keyLabel="z"
latin:popupCharacters="@string/alternates_for_z" />
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row4.xml b/java/res/xml-sw600dp/kbd_qwerty_row4.xml
index 5cd47d913..f22b69f73 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_row4.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row4.xml
@@ -21,15 +21,13 @@
<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
- <!-- This row is intentionally not marked as a bottom row -->
<Row
latin:keyWidth="8.9%p"
>
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="13.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="13.0%p" />
<Key
latin:keyStyle="tabKeyStyle" />
<switch>
diff --git a/java/res/xml-sw600dp/kbd_row3_smiley.xml b/java/res/xml-sw600dp/kbd_row3_smiley.xml
index 5e9584f2d..0ae3ae474 100644
--- a/java/res/xml-sw600dp/kbd_row3_smiley.xml
+++ b/java/res/xml-sw600dp/kbd_row3_smiley.xml
@@ -28,8 +28,7 @@
<Key
latin:keyLabel="\@"
latin:keyXPos="-8.9%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</case>
<case
latin:mode="url"
@@ -40,8 +39,7 @@
latin:keyHintLabel="_"
latin:popupCharacters="_"
latin:keyXPos="-8.9%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</case>
<case
latin:imeAction="actionSearch"
@@ -52,15 +50,13 @@
latin:keyHintLabel="+"
latin:popupCharacters="+"
latin:keyXPos="-8.9%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</case>
<default>
<Key
latin:keyStyle="smileyKeyStyle"
latin:keyXPos="-8.9%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</default>
</switch>
</merge>
diff --git a/java/res/xml-sw600dp/kbd_rows_arabic.xml b/java/res/xml-sw600dp/kbd_rows_arabic.xml
index 4c1909438..4c20f51ca 100644
--- a/java/res/xml-sw600dp/kbd_rows_arabic.xml
+++ b/java/res/xml-sw600dp/kbd_rows_arabic.xml
@@ -27,8 +27,7 @@
latin:keyWidth="8.0%p"
>
<Key
- latin:keyLabel="ض"
- latin:keyEdgeFlags="left" />
+ latin:keyLabel="ض" />
<Key
latin:keyLabel="ص" />
<Key
@@ -57,8 +56,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-10.0%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.0%p"
@@ -105,8 +103,7 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-14.6%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.0%p"
@@ -117,8 +114,7 @@
latin:mode="email"
>
<Key
- latin:keyLabel="\@"
- latin:keyEdgeFlags="left" />
+ latin:keyLabel="\@" />
</case>
<case
latin:mode="url"
@@ -127,8 +123,7 @@
latin:keyLabel="-"
latin:keyLabelOption="hasUppercaseLetter"
latin:keyHintLabel="_"
- latin:popupCharacters="_"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="_" />
</case>
<case
latin:imeAction="actionSearch"
@@ -137,13 +132,11 @@
latin:keyLabel=":"
latin:keyLabelOption="hasUppercaseLetter"
latin:keyHintLabel="+"
- latin:popupCharacters="+"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="+" />
</case>
<default>
<Key
- latin:keyStyle="smileyKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="smileyKeyStyle" />
</default>
</switch>
<Key
diff --git a/java/res/xml-sw600dp/kbd_rows_azerty.xml b/java/res/xml-sw600dp/kbd_rows_azerty.xml
index 698ef2240..406b4e670 100644
--- a/java/res/xml-sw600dp/kbd_rows_azerty.xml
+++ b/java/res/xml-sw600dp/kbd_rows_azerty.xml
@@ -25,12 +25,10 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="8.5%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="a"
- latin:popupCharacters="@string/alternates_for_a"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_a" />
<Key
latin:keyLabel="z"
latin:popupCharacters="@string/alternates_for_z" />
@@ -61,8 +59,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-10.0%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.5%p"
@@ -70,8 +67,7 @@
<Key
latin:keyLabel="q"
latin:popupCharacters="@string/alternates_for_q"
- latin:keyXPos="5.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyXPos="5.0%p" />
<Key
latin:keyLabel="s"
latin:popupCharacters="@string/alternates_for_s" />
@@ -98,16 +94,14 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-14.6%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.5%p"
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="10.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="10.0%p" />
<Key
latin:keyLabel="w"
latin:popupCharacters="@string/alternates_for_w" />
diff --git a/java/res/xml-sw600dp/kbd_rows_hebrew.xml b/java/res/xml-sw600dp/kbd_rows_hebrew.xml
index 87409159e..fc2247cb0 100644
--- a/java/res/xml-sw600dp/kbd_rows_hebrew.xml
+++ b/java/res/xml-sw600dp/kbd_rows_hebrew.xml
@@ -25,7 +25,6 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="9.0%p"
- latin:rowEdgeFlags="top"
>
<include
latin:keyboardLayout="@xml/kbd_row4_apostrophe_dash" />
@@ -48,8 +47,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-12.000%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="9.0%p"
@@ -89,8 +87,7 @@
>
<Key
latin:keyLabel="\@"
- latin:keyWidth="10.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="10.0%p" />
</case>
<case
latin:mode="url"
@@ -100,8 +97,7 @@
latin:keyLabelOption="hasUppercaseLetter"
latin:keyHintLabel="_"
latin:popupCharacters="_"
- latin:keyWidth="10.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="10.0%p" />
</case>
<case
latin:imeAction="actionSearch"
@@ -111,14 +107,12 @@
latin:keyLabelOption="hasUppercaseLetter"
latin:keyHintLabel="+"
latin:popupCharacters="+"
- latin:keyWidth="10.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="10.0%p" />
</case>
<default>
<Key
latin:keyStyle="smileyKeyStyle"
- latin:keyWidth="10.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="10.0%p" />
</default>
</switch>
<Key
@@ -146,8 +140,7 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-10.400%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw600dp/kbd_rows_qwertz.xml b/java/res/xml-sw600dp/kbd_rows_qwertz.xml
index 7ec895e0a..3d177e72d 100644
--- a/java/res/xml-sw600dp/kbd_rows_qwertz.xml
+++ b/java/res/xml-sw600dp/kbd_rows_qwertz.xml
@@ -25,12 +25,10 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="9.0%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="q"
- latin:popupCharacters="@string/alternates_for_q"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_q" />
<Key
latin:keyLabel="w"
latin:popupCharacters="@string/alternates_for_w" />
@@ -61,8 +59,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-10.0%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row2" />
@@ -71,8 +68,7 @@
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="10.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="10.0%p" />
<Key
latin:keyLabel="y"
latin:popupCharacters="@string/alternates_for_y" />
diff --git a/java/res/xml-sw600dp/kbd_rows_russian.xml b/java/res/xml-sw600dp/kbd_rows_russian.xml
index 445298982..7588f6ccb 100644
--- a/java/res/xml-sw600dp/kbd_rows_russian.xml
+++ b/java/res/xml-sw600dp/kbd_rows_russian.xml
@@ -25,11 +25,9 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="7.60%p"
- latin:rowEdgeFlags="top"
>
<Key
- latin:keyLabel="й"
- latin:keyEdgeFlags="left" />
+ latin:keyLabel="й" />
<Key
latin:keyLabel="ц" />
<Key
@@ -56,8 +54,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-10.0%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.60%p"
@@ -88,15 +85,13 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-14.6%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.60%p"
>
<Key
- latin:keyStyle="shiftKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="shiftKeyStyle" />
<Key
latin:keyLabel="я" />
<Key
diff --git a/java/res/xml-sw600dp/kbd_rows_scandinavian.xml b/java/res/xml-sw600dp/kbd_rows_scandinavian.xml
index 5ac2b3600..505913726 100644
--- a/java/res/xml-sw600dp/kbd_rows_scandinavian.xml
+++ b/java/res/xml-sw600dp/kbd_rows_scandinavian.xml
@@ -25,12 +25,10 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="7.9%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="q"
- latin:popupCharacters="@string/alternates_for_q"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_q" />
<Key
latin:keyLabel="w"
latin:popupCharacters="@string/alternates_for_w" />
@@ -63,8 +61,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-10.0%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.9%p"
@@ -72,8 +69,7 @@
<Key
latin:keyLabel="a"
latin:keyXPos="3.5%p"
- latin:popupCharacters="@string/alternates_for_a"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_a" />
<Key
latin:keyLabel="s"
latin:popupCharacters="@string/alternates_for_s" />
@@ -104,16 +100,14 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-14.6%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.9%p"
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="10.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="10.0%p" />
<Spacer
latin:keyWidth="4.35%p" />
<Key
diff --git a/java/res/xml-sw600dp/kbd_rows_serbian.xml b/java/res/xml-sw600dp/kbd_rows_serbian.xml
index 5d39fd4f1..db7560cdc 100644
--- a/java/res/xml-sw600dp/kbd_rows_serbian.xml
+++ b/java/res/xml-sw600dp/kbd_rows_serbian.xml
@@ -25,12 +25,10 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="8.0%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="љ"
- latin:keyXPos="2.15%p"
- latin:keyEdgeFlags="left" />
+ latin:keyXPos="2.15%p" />
<Key
latin:keyLabel="њ" />
<Key
@@ -54,15 +52,13 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-10.0%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.9%p"
>
<Key
- latin:keyLabel="а"
- latin:keyEdgeFlags="left" />
+ latin:keyLabel="а" />
<Key
latin:keyLabel="с" />
<Key
@@ -86,16 +82,14 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-14.6%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.5%p"
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="8.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="8.0%p" />
<Key
latin:keyLabel="ѕ" />
<Key
diff --git a/java/res/xml-sw600dp/kbd_rows_spanish.xml b/java/res/xml-sw600dp/kbd_rows_spanish.xml
index 7ef44bb53..49243eb5c 100644
--- a/java/res/xml-sw600dp/kbd_rows_spanish.xml
+++ b/java/res/xml-sw600dp/kbd_rows_spanish.xml
@@ -31,8 +31,7 @@
<Key
latin:keyLabel="a"
latin:popupCharacters="@string/alternates_for_a"
- latin:keyXPos="5.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyXPos="5.0%p" />
<Key
latin:keyLabel="s"
latin:popupCharacters="@string/alternates_for_s" />
@@ -59,8 +58,7 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-14.6%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row3" />
diff --git a/java/res/xml-sw600dp/kbd_symbols.xml b/java/res/xml-sw600dp/kbd_rows_symbols.xml
index dea08ddff..4f6a9bc31 100644
--- a/java/res/xml-sw600dp/kbd_symbols.xml
+++ b/java/res/xml-sw600dp/kbd_rows_symbols.xml
@@ -18,21 +18,19 @@
*/
-->
-<Keyboard
+<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
<include
latin:keyboardLayout="@xml/kbd_key_styles" />
<include
latin:keyboardLayout="@xml/kbd_currency_key_styles" />
- <!-- This row is intentionally not marked as a top row -->
<Row
latin:keyWidth="9.0%p"
>
<Key
latin:keyLabel="@string/keylabel_for_symbols_1"
- latin:popupCharacters="@string/alternates_for_symbols_1"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_symbols_1" />
<Key
latin:keyLabel="@string/keylabel_for_symbols_2"
latin:popupCharacters="@string/alternates_for_symbols_2" />
@@ -63,8 +61,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-10.0%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="9.0%p"
@@ -75,8 +72,8 @@
<Key
latin:keyStyle="currencyKeyStyle" />
<Key
- latin:keyLabel="%"
- latin:popupCharacters="‰" />
+ latin:keyLabel="@string/keylabel_for_symbols_percent"
+ latin:popupCharacters="@string/alternates_for_symbols_percent" />
<Key
latin:keyLabel="&amp;" />
<Key
@@ -97,16 +94,14 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-14.6%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.9%p"
>
<Key
- latin:keyStyle="moreKeyStyle"
- latin:keyWidth="10.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="toMoreSymbolKeyStyle"
+ latin:keyWidth="10.0%p" />
<Key
latin:keyLabel="&lt;"
latin:popupCharacters="≤,«,‹" />
@@ -133,8 +128,8 @@
latin:keyLabel="@string/keylabel_for_symbols_semicolon"
latin:popupCharacters="@string/alternates_for_symbols_semicolon" />
<Key
- latin:keyLabel="@string/keylabel_for_symbols_comma"
- latin:popupCharacters="@string/alternates_for_symbols_comma" />
+ latin:keyLabel="@string/keylabel_for_comma"
+ latin:popupCharacters="@string/alternates_for_comma" />
<Key
latin:keyLabel="." />
<Key
@@ -147,15 +142,13 @@
latin:keyLabel="/"
latin:keyWidth="fillRight" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row
latin:keyWidth="8.9%p"
>
<Key
latin:keyStyle="toAlphaKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="13.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="13.0%p" />
<Key
latin:keyStyle="tabKeyStyle" />
<Key
@@ -177,4 +170,4 @@
<include
latin:keyboardLayout="@xml/kbd_qwerty_f2" />
</Row>
-</Keyboard>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_symbols_shift.xml b/java/res/xml-sw600dp/kbd_rows_symbols_shift.xml
index b25292f27..1dca8c47e 100644
--- a/java/res/xml-sw600dp/kbd_symbols_shift.xml
+++ b/java/res/xml-sw600dp/kbd_rows_symbols_shift.xml
@@ -18,12 +18,11 @@
*/
-->
-<Keyboard
+<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
<include
latin:keyboardLayout="@xml/kbd_key_styles" />
- <!-- This row is intentionally not marked as a top row -->
<Row
latin:keyWidth="9.0%p"
>
@@ -60,8 +59,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-10.0%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="9.0%p"
@@ -97,16 +95,14 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-14.6%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.9%p"
>
<Key
- latin:keyStyle="moreKeyStyle"
- latin:keyWidth="10.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="backFromMoreSymbolKeyStyle"
+ latin:keyWidth="10.0%p" />
<Key
latin:keyLabel="\\" />
<Key
@@ -132,15 +128,13 @@
latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¿" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row
latin:keyWidth="8.9%p"
>
<Key
latin:keyStyle="toAlphaKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="13.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="13.0%p" />
<Key
latin:keyStyle="tabKeyStyle" />
<Key
@@ -153,4 +147,4 @@
<include
latin:keyboardLayout="@xml/kbd_qwerty_f2" />
</Row>
-</Keyboard>
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_key_styles.xml b/java/res/xml-sw768dp/kbd_key_styles.xml
index ab8784a05..1711c423f 100644
--- a/java/res/xml-sw768dp/kbd_key_styles.xml
+++ b/java/res/xml-sw768dp/kbd_key_styles.xml
@@ -32,24 +32,12 @@
latin:keyIconShifted="iconShiftedShiftKey"
latin:parentStyle="functionalKeyStyle"
latin:isSticky="true" />
- <switch>
- <case latin:languageCode="ar|iw">
- <key-style
- latin:styleName="deleteKeyStyle"
- latin:code="@integer/key_delete"
- latin:keyIcon="iconDeleteRtlKey"
- latin:parentStyle="functionalKeyStyle"
- latin:isRepeatable="true" />
- </case>
- <default>
- <key-style
- latin:styleName="deleteKeyStyle"
- latin:code="@integer/key_delete"
- latin:keyIcon="iconDeleteKey"
- latin:parentStyle="functionalKeyStyle"
- latin:isRepeatable="true" />
- </default>
- </switch>
+ <key-style
+ latin:styleName="deleteKeyStyle"
+ latin:code="@integer/key_delete"
+ latin:keyIcon="iconDeleteKey"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isRepeatable="true" />
<key-style
latin:styleName="returnKeyStyle"
latin:code="@integer/key_return"
@@ -57,12 +45,10 @@
latin:parentStyle="functionalKeyStyle" />
<key-style
latin:styleName="spaceKeyStyle"
- latin:code="@integer/key_space"
- latin:keyIconPreview="iconPreviewSpaceKey" />
+ latin:code="@integer/key_space" />
<key-style
latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
- latin:code="@integer/key_space"
- latin:keyIconPreview="iconPreviewSpaceKey" />
+ latin:code="@integer/key_space" />
<key-style
latin:styleName="smileyKeyStyle"
latin:keyLabel=":-)"
@@ -101,12 +87,17 @@
latin:keyLabelOption="fontNormal"
latin:parentStyle="functionalKeyStyle" />
<key-style
- latin:styleName="moreKeyStyle"
+ latin:styleName="toMoreSymbolKeyStyle"
latin:code="@integer/key_shift"
- latin:keyLabel="@string/label_more_key"
+ latin:keyLabel="@string/label_to_more_symbol_for_tablet_key"
latin:keyLabelOption="fontNormal"
- latin:parentStyle="functionalKeyStyle"
- latin:isSticky="true" />
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="backFromMoreSymbolKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:keyLabelOption="fontNormal"
+ latin:parentStyle="functionalKeyStyle" />
<key-style
latin:styleName="comKeyStyle"
latin:keyLabel="@string/keylabel_for_popular_domain"
diff --git a/java/res/xml-sw768dp/kbd_number.xml b/java/res/xml-sw768dp/kbd_number.xml
index a3bed2f3a..369e91a77 100644
--- a/java/res/xml-sw768dp/kbd_number.xml
+++ b/java/res/xml-sw768dp/kbd_number.xml
@@ -30,13 +30,11 @@
<case
latin:passwordInput="true"
>
- <!-- This row is intentionally not marked as a top row -->
<Row>
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.172%p" />
<Key
latin:keyStyle="num1KeyStyle"
latin:keyXPos="32.076%p" />
@@ -47,13 +45,14 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-11.172%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="32.076%p" />
<Key
- latin:keyStyle="num4KeyStyle"
- latin:keyXPos="32.076%p" />
+ latin:keyStyle="num4KeyStyle" />
<Key
latin:keyStyle="num5KeyStyle" />
<Key
@@ -61,41 +60,39 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-11.172%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="32.076%p" />
<Key
- latin:keyStyle="num7KeyStyle"
- latin:keyXPos="32.076%p" />
+ latin:keyStyle="num7KeyStyle" />
<Key
latin:keyStyle="num8KeyStyle" />
<Key
latin:keyStyle="num9KeyStyle" />
- <!-- There is an empty area below the "Enter" key and right of the "9" key. To
- ignore the touch event on the area, "9" is intentionally not marked as a right
- edge key. -->
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row>
<Spacer
latin:keyXPos="32.076%p" />
<Key
latin:keyStyle="num0KeyStyle" />
- <!-- There is an empty area below the "Enter" key and right of the "#" key. To
- ignore the touch event on the area, "#" is intentionally not marked as a right
- edge key. -->
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
</Row>
</case>
<!-- latin:passwordInput="false" -->
<default>
- <!-- This row is intentionally not marked as a top row -->
<Row>
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.172%p" />
<Key
latin:keyLabel="-"
latin:keyStyle="numKeyStyle"
@@ -122,13 +119,14 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-11.172%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="13.829%p" />
<Key
latin:keyStyle="numStarKeyStyle"
- latin:keyXPos="13.829%p"
latin:keyWidth="8.047%p" />
<Key
latin:keyLabel="/"
@@ -151,17 +149,15 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-11.172%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
- <!-- There is an empty area below the "More" key and left of the "(" key. To
- ignore the touch event on the area, "(" is intentionally not marked as a left
- edge key. -->
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="13.829%p" />
<Key
latin:keyLabel="("
latin:keyStyle="numKeyStyle"
- latin:keyXPos="13.829%p"
latin:keyWidth="8.047%p" />
<Key
latin:keyLabel=")"
@@ -181,11 +177,10 @@
<Key
latin:keyLabel="9"
latin:keyStyle="numKeyStyle" />
- <!-- There is an empty area below the "Enter" key and right of the "9" key. To
- ignore the touch event on the area, "9" is intentionally not marked as a right
- edge key. -->
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row>
<switch>
<case latin:hasSettingsKey="true">
@@ -193,6 +188,11 @@
latin:keyStyle="settingsKeyStyle"
latin:keyWidth="8.047%p" />
</case>
+ <default>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="8.047%p" />
+ </default>
</switch>
<Key
latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
@@ -209,13 +209,18 @@
latin:keyStyle="numKeyStyle" />
<switch>
<case
- latin:voiceKeyEnabled="true"
+ latin:shortcutKeyEnabled="true"
>
<Key
latin:keyStyle="shortcutKeyStyle"
latin:keyXPos="-8.047%p"
latin:keyWidth="fillRight" />
</case>
+ <default>
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
+ </default>
</switch>
</Row>
</default>
diff --git a/java/res/xml-sw768dp/kbd_phone.xml b/java/res/xml-sw768dp/kbd_phone.xml
index 0935992fd..e55b1841a 100644
--- a/java/res/xml-sw768dp/kbd_phone.xml
+++ b/java/res/xml-sw768dp/kbd_phone.xml
@@ -26,13 +26,11 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<include
latin:keyboardLayout="@xml/kbd_numkey_styles" />
- <!-- This row is intentionally not marked as a top row -->
<Row>
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.172%p" />
<Key
latin:keyLabel="-"
latin:keyStyle="numKeyStyle"
@@ -52,14 +50,12 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-11.172%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
<Key
- latin:keyStyle="moreKeyStyle"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="toMoreSymbolKeyStyle"
+ latin:keyWidth="11.172%p" />
<Key
latin:keyLabel=","
latin:keyStyle="numKeyStyle"
@@ -79,16 +75,15 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-11.172%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
- <!-- There is an empty area below the "More" key and left of the "(" key. To ignore
- the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="20.400%p" />
<Key
latin:keyLabel="("
latin:keyStyle="numKeyStyle"
- latin:keyXPos="20.400%p"
latin:keyWidth="8.047%p" />
<Key
latin:keyLabel=")"
@@ -101,10 +96,10 @@
latin:keyStyle="num8KeyStyle" />
<Key
latin:keyStyle="num9KeyStyle" />
- <!-- There is an empty area below the "Enter" key and right of the "9" key. To ignore
- the touch event on the area, "9" is intentionally not marked as a right edge key. -->
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row>
<switch>
<case latin:hasSettingsKey="true">
@@ -112,6 +107,11 @@
latin:keyStyle="settingsKeyStyle"
latin:keyWidth="8.047%p" />
</case>
+ <default>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="8.047%p" />
+ </default>
</switch>
<Key
latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
@@ -127,13 +127,18 @@
latin:keyStyle="numKeyStyle" />
<switch>
<case
- latin:voiceKeyEnabled="true"
+ latin:shortcutKeyEnabled="true"
>
<Key
latin:keyStyle="shortcutKeyStyle"
latin:keyXPos="-8.047%p"
latin:keyWidth="fillRight" />
</case>
+ <default>
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
+ </default>
</switch>
</Row>
</Keyboard>
diff --git a/java/res/xml-sw768dp/kbd_phone_symbols.xml b/java/res/xml-sw768dp/kbd_phone_shift.xml
index 6ee57d6a5..646f0b867 100644
--- a/java/res/xml-sw768dp/kbd_phone_symbols.xml
+++ b/java/res/xml-sw768dp/kbd_phone_shift.xml
@@ -26,13 +26,11 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<include
latin:keyboardLayout="@xml/kbd_numkey_styles" />
- <!-- This row is intentionally not marked as a top row -->
<Row>
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.172%p" />
<Key
latin:keyLabel="-"
latin:keyStyle="numKeyStyle"
@@ -56,14 +54,12 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-11.172%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
<Key
- latin:keyStyle="moreKeyStyle"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="backFromMoreSymbolKeyStyle"
+ latin:keyWidth="11.172%p" />
<Key
latin:keyLabel=","
latin:keyStyle="numKeyStyle"
@@ -87,16 +83,15 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-11.172%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
- <!-- There is an empty area below the "More" key and left of the "(" key. To ignore
- the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="13.829%p" />
<Key
latin:keyLabel="("
latin:keyStyle="numKeyStyle"
- latin:keyXPos="13.829%p"
latin:keyWidth="8.047%p" />
<Key
latin:keyLabel=")"
@@ -113,10 +108,10 @@
latin:keyStyle="num8KeyStyle" />
<Key
latin:keyStyle="num9KeyStyle" />
- <!-- There is an empty area below the "Enter" key and right of the "9" key. To ignore
- the touch event on the area, "9" is intentionally not marked as a right edge key. -->
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row>
<switch>
<case latin:hasSettingsKey="true">
@@ -124,6 +119,11 @@
latin:keyStyle="settingsKeyStyle"
latin:keyWidth="8.047%p" />
</case>
+ <default>
+ <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+ <Spacer
+ latin:keyWidth="8.047%p" />
+ </default>
</switch>
<Key
latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
@@ -139,13 +139,18 @@
latin:keyStyle="numKeyStyle" />
<switch>
<case
- latin:voiceKeyEnabled="true"
+ latin:shortcutKeyEnabled="true"
>
<Key
latin:keyStyle="shortcutKeyStyle"
latin:keyXPos="-8.047%p"
latin:keyWidth="fillRight" />
</case>
+ <default>
+ <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
+ <Spacer
+ latin:keyWidth="0%p" />
+ </default>
</switch>
</Row>
</Keyboard>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row1.xml b/java/res/xml-sw768dp/kbd_qwerty_row1.xml
index 3727cf34e..0fdb463f1 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_row1.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row1.xml
@@ -21,15 +21,13 @@
<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
- <!-- This row is intentionally not marked as a top row -->
<Row
latin:keyWidth="8.282%p"
>
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="7.969%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="7.969%p" />
<Key
latin:keyLabel="q"
latin:popupCharacters="@string/alternates_for_q" />
@@ -63,7 +61,6 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-9.219%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth"/>
</Row>
</merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row2.xml b/java/res/xml-sw768dp/kbd_qwerty_row2.xml
index 45af120e2..7f7dd57f0 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_row2.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row2.xml
@@ -27,8 +27,7 @@
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.172%p"/>
<Key
latin:keyLabel="a"
latin:popupCharacters="@string/alternates_for_a" />
@@ -56,7 +55,6 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-15.704%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
</merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row3.xml b/java/res/xml-sw768dp/kbd_qwerty_row3.xml
index 9041a7764..677235f63 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_row3.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row3.xml
@@ -26,8 +26,7 @@
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="13.829%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="13.829%p"/>
<Key
latin:keyLabel="z"
latin:popupCharacters="@string/alternates_for_z" />
@@ -51,7 +50,6 @@
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyXPos="-13.750%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
</merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row4.xml b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
index 48201c9ec..1ff9d81f1 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_row4.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
@@ -21,7 +21,6 @@
<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
- <!-- This row is intentionally not marked as a bottom row -->
<Row
latin:keyWidth="8.047%p"
>
@@ -102,7 +101,7 @@
</switch>
<switch>
<case
- latin:voiceKeyEnabled="true"
+ latin:shortcutKeyEnabled="true"
>
<Key
latin:keyStyle="shortcutKeyStyle"
diff --git a/java/res/xml-sw768dp/kbd_rows_arabic.xml b/java/res/xml-sw768dp/kbd_rows_arabic.xml
index f3283ae94..2f10d54e8 100644
--- a/java/res/xml-sw768dp/kbd_rows_arabic.xml
+++ b/java/res/xml-sw768dp/kbd_rows_arabic.xml
@@ -29,8 +29,7 @@
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="7.500%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="7.500%p" />
<Key
latin:keyLabel="ض" />
<Key
@@ -61,8 +60,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-11.500%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.375%p"
@@ -70,8 +68,7 @@
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="9.375%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="9.375%p" />
<Key
latin:keyLabel="ش" />
<Key
@@ -113,8 +110,7 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-9.375%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.375%p"
diff --git a/java/res/xml-sw768dp/kbd_rows_azerty.xml b/java/res/xml-sw768dp/kbd_rows_azerty.xml
index 373bda9ce..7aec0d15d 100644
--- a/java/res/xml-sw768dp/kbd_rows_azerty.xml
+++ b/java/res/xml-sw768dp/kbd_rows_azerty.xml
@@ -29,8 +29,7 @@
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="7.969%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="7.969%p" />
<Key
latin:keyLabel="a"
latin:popupCharacters="@string/alternates_for_a" />
@@ -64,8 +63,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-9.219%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.125%p"
@@ -73,8 +71,7 @@
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="10.167%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="10.167%p" />
<Key
latin:keyLabel="q"
latin:popupCharacters="@string/alternates_for_q" />
@@ -100,21 +97,18 @@
latin:keyLabel="l"
latin:popupCharacters="@string/alternates_for_l" />
<Key
- latin:keyLabel="m"
- latin:keyEdgeFlags="right" />
+ latin:keyLabel="m" />
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-15.704%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.047%p"
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="13.829%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="13.829%p" />
<Key
latin:keyLabel="w"
latin:popupCharacters="@string/alternates_for_w" />
@@ -161,8 +155,7 @@
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyXPos="-13.750%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw768dp/kbd_rows_hebrew.xml b/java/res/xml-sw768dp/kbd_rows_hebrew.xml
index 0ef68b648..bacc6a13b 100644
--- a/java/res/xml-sw768dp/kbd_rows_hebrew.xml
+++ b/java/res/xml-sw768dp/kbd_rows_hebrew.xml
@@ -29,8 +29,7 @@
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="7.969%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="7.969%p" />
<include
latin:keyboardLayout="@xml/kbd_row4_apostrophe_dash" />
<Key
@@ -52,8 +51,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-12.000%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.125%p"
@@ -61,8 +59,7 @@
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.172%p" />
<Key
latin:keyLabel="ש" />
<Key
@@ -116,8 +113,7 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-10.400%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw768dp/kbd_rows_qwertz.xml b/java/res/xml-sw768dp/kbd_rows_qwertz.xml
index 6567c3166..5556d1f3d 100644
--- a/java/res/xml-sw768dp/kbd_rows_qwertz.xml
+++ b/java/res/xml-sw768dp/kbd_rows_qwertz.xml
@@ -29,8 +29,7 @@
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="7.969%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="7.969%p" />
<Key
latin:keyLabel="q"
latin:popupCharacters="@string/alternates_for_q" />
@@ -64,8 +63,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-9.219%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row2" />
@@ -74,8 +72,7 @@
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="13.829%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="13.829%p" />
<Key
latin:keyLabel="y"
latin:popupCharacters="@string/alternates_for_y" />
@@ -119,8 +116,7 @@
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyXPos="-13.750%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw768dp/kbd_rows_russian.xml b/java/res/xml-sw768dp/kbd_rows_russian.xml
index 35b2c8a1a..82ceaeadc 100644
--- a/java/res/xml-sw768dp/kbd_rows_russian.xml
+++ b/java/res/xml-sw768dp/kbd_rows_russian.xml
@@ -23,14 +23,12 @@
>
<include
latin:keyboardLayout="@xml/kbd_key_styles" />
- <!-- This row is intentionally not marked as a top row -->
<Row
latin:keyWidth="7.125%p"
>
<Key
latin:keyStyle="tabKeyStyle"
- latin:keyLabelOption="alignLeft"
- latin:keyEdgeFlags="left" />
+ latin:keyLabelOption="alignLeft" />
<Key
latin:keyLabel="й" />
<Key
@@ -58,8 +56,7 @@
latin:keyLabel="ъ" />
<Key
latin:keyStyle="deleteKeyStyle"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.125%p"
@@ -67,8 +64,7 @@
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="9.375%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="9.375%p" />
<Key
latin:keyLabel="ф" />
<Key
@@ -94,16 +90,14 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-9.375%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.125%p"
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="12.750%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="12.750%p" />
<Key
latin:keyLabel="я" />
<Key
@@ -126,8 +120,7 @@
latin:keyboardLayout="@xml/kbd_row3_comma_period" />
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw768dp/kbd_rows_scandinavian.xml b/java/res/xml-sw768dp/kbd_rows_scandinavian.xml
index c20dceea8..743c6bd26 100644
--- a/java/res/xml-sw768dp/kbd_rows_scandinavian.xml
+++ b/java/res/xml-sw768dp/kbd_rows_scandinavian.xml
@@ -29,8 +29,7 @@
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="7.500%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="7.500%p" />
<Key
latin:keyLabel="q"
latin:popupCharacters="@string/alternates_for_q" />
@@ -66,8 +65,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-11.500%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.375%p"
@@ -75,8 +73,7 @@
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="9.375%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="9.375%p" />
<Key
latin:keyLabel="a"
latin:popupCharacters="@string/alternates_for_a" />
@@ -110,16 +107,14 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-9.375%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.375%p"
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="12.750%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="12.750%p" />
<Key
latin:keyLabel="z"
latin:popupCharacters="@string/alternates_for_z" />
@@ -143,8 +138,7 @@
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyXPos="-12.750%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw768dp/kbd_rows_serbian.xml b/java/res/xml-sw768dp/kbd_rows_serbian.xml
index f1576de45..c07176ef6 100644
--- a/java/res/xml-sw768dp/kbd_rows_serbian.xml
+++ b/java/res/xml-sw768dp/kbd_rows_serbian.xml
@@ -23,14 +23,12 @@
>
<include
latin:keyboardLayout="@xml/kbd_key_styles" />
- <!-- This row is intentionally not marked as a top row -->
<Row
latin:keyWidth="7.125%p"
>
<Key
latin:keyStyle="tabKeyStyle"
- latin:keyLabelOption="alignLeft"
- latin:keyEdgeFlags="left" />
+ latin:keyLabelOption="alignLeft" />
<Key
latin:keyLabel="љ" />
<Key
@@ -57,8 +55,7 @@
latin:keyLabel="ђ" />
<Key
latin:keyLabel="ж"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right"/>
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="7.250%p"
@@ -66,8 +63,7 @@
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.172%p" />
<Key
latin:keyLabel="а" />
<Key
@@ -93,16 +89,14 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-9.219%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="7.250%p"
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="13.829%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="13.829%p" />
<Key
latin:keyLabel="ѕ" />
<Key
@@ -122,8 +116,7 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-13.750%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw768dp/kbd_rows_spanish.xml b/java/res/xml-sw768dp/kbd_rows_spanish.xml
index 300592e6a..510cafbfd 100644
--- a/java/res/xml-sw768dp/kbd_rows_spanish.xml
+++ b/java/res/xml-sw768dp/kbd_rows_spanish.xml
@@ -31,8 +31,7 @@
<Key
latin:keyStyle="toSymbolKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="10.167%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="10.167%p" />
<Key
latin:keyLabel="a"
latin:popupCharacters="@string/alternates_for_a" />
@@ -62,8 +61,7 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-15.704%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row3" />
diff --git a/java/res/xml-sw768dp/kbd_symbols.xml b/java/res/xml-sw768dp/kbd_rows_symbols.xml
index eb77d4d5b..66b9789ac 100644
--- a/java/res/xml-sw768dp/kbd_symbols.xml
+++ b/java/res/xml-sw768dp/kbd_rows_symbols.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2010, The Android Open Source Project
+** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -18,22 +18,20 @@
*/
-->
-<Keyboard
+<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
<include
latin:keyboardLayout="@xml/kbd_key_styles" />
<include
latin:keyboardLayout="@xml/kbd_currency_key_styles" />
- <!-- This row is intentionally not marked as a top row -->
<Row
latin:keyWidth="8.282%p"
>
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="7.969%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="7.969%p" />
<Key
latin:keyLabel="@string/keylabel_for_symbols_1"
latin:popupCharacters="@string/alternates_for_symbols_1" />
@@ -67,8 +65,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-9.219%p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="8.125%p"
@@ -76,15 +73,14 @@
<Key
latin:keyStyle="toAlphaKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.172%p" />
<Key
latin:keyLabel="#" />
<Key
latin:keyStyle="currencyKeyStyle" />
<Key
- latin:keyLabel="%"
- latin:popupCharacters="‰" />
+ latin:keyLabel="@string/keylabel_for_symbols_percent"
+ latin:popupCharacters="@string/alternates_for_symbols_percent" />
<Key
latin:keyLabel="&amp;" />
<Key
@@ -105,16 +101,14 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-15.704%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.047%p"
>
<Key
- latin:keyStyle="moreKeyStyle"
- latin:keyWidth="13.829%p"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="toMoreSymbolKeyStyle"
+ latin:keyWidth="13.829%p" />
<Key
latin:keyLabel="&lt;"
latin:popupCharacters="≤,«,‹" />
@@ -141,8 +135,8 @@
latin:keyLabel="@string/keylabel_for_symbols_semicolon"
latin:popupCharacters="@string/alternates_for_symbols_semicolon" />
<Key
- latin:keyLabel="@string/keylabel_for_symbols_comma"
- latin:popupCharacters="@string/alternates_for_symbols_comma" />
+ latin:keyLabel="@string/keylabel_for_comma"
+ latin:popupCharacters="@string/alternates_for_comma" />
<Key
latin:keyLabel="." />
<Key
@@ -152,12 +146,10 @@
latin:keyLabel="@string/keylabel_for_symbols_question"
latin:popupCharacters="@string/alternates_for_symbols_question" />
<Key
- latin:keyStyle="moreKeyStyle"
+ latin:keyStyle="toMoreSymbolKeyStyle"
latin:keyXPos="-13.750%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row
latin:keyWidth="8.047%p"
>
@@ -188,7 +180,7 @@
latin:keyLabel="_" />
<switch>
<case
- latin:voiceKeyEnabled="true"
+ latin:shortcutKeyEnabled="true"
>
<Key
latin:keyStyle="shortcutKeyStyle"
@@ -197,4 +189,4 @@
</case>
</switch>
</Row>
-</Keyboard>
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_symbols_shift.xml b/java/res/xml-sw768dp/kbd_rows_symbols_shift.xml
index b36814104..1f43a0f91 100644
--- a/java/res/xml-sw768dp/kbd_symbols_shift.xml
+++ b/java/res/xml-sw768dp/kbd_rows_symbols_shift.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2010, The Android Open Source Project
+** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -18,20 +18,18 @@
*/
-->
-<Keyboard
+<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
<include
latin:keyboardLayout="@xml/kbd_key_styles" />
- <!-- This row is intentionally not marked as a top row -->
<Row
latin:keyWidth="8.282%p"
>
<Key
latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="7.969%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="7.969%p" />
<Key
latin:keyLabel="~" />
<Key
@@ -65,8 +63,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-9.219%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.125%p"
@@ -74,8 +71,7 @@
<Key
latin:keyStyle="toAlphaKeyStyle"
latin:keyLabelOption="alignLeft"
- latin:keyWidth="11.172%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.172%p" />
<Key
latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="£" />
@@ -106,16 +102,14 @@
<Key
latin:keyStyle="returnKeyStyle"
latin:keyXPos="-15.704%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
<Row
latin:keyWidth="8.047%p"
>
<Key
- latin:keyStyle="moreKeyStyle"
- latin:keyWidth="13.829%p"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="backFromMoreSymbolKeyStyle"
+ latin:keyWidth="13.829%p" />
<Key
latin:keyLabel="\\" />
<Key
@@ -141,12 +135,10 @@
latin:keyStyle="nonPasswordSymbolKeyStyle"
latin:keyLabel="¿" />
<Key
- latin:keyStyle="moreKeyStyle"
+ latin:keyStyle="backFromMoreSymbolKeyStyle"
latin:keyXPos="-13.750%p"
- latin:keyWidth="fillBoth"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillBoth" />
</Row>
- <!-- This row is intentionally not marked as a bottom row -->
<Row
latin:keyWidth="8.047%p"
>
@@ -163,7 +155,7 @@
latin:keyWidth="37.500%p" />
<switch>
<case
- latin:voiceKeyEnabled="true"
+ latin:shortcutKeyEnabled="true"
>
<Key
latin:keyStyle="shortcutKeyStyle"
@@ -172,4 +164,4 @@
</case>
</switch>
</Row>
-</Keyboard>
+</merge>
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
index 9791001da..5612251a5 100644
--- a/java/res/xml/kbd_key_styles.xml
+++ b/java/res/xml/kbd_key_styles.xml
@@ -25,29 +25,43 @@
<key-style
latin:styleName="functionalKeyStyle"
latin:isFunctional="true" />
- <!-- Base key style for the key which may have settings key as popup key -->
+ <!-- Base key style for the key which may have settings or tab key as popup key. -->
<switch>
<case
latin:clobberSettingsKey="true"
>
<key-style
- latin:styleName="settingsPopupStyle"
+ latin:styleName="f1PopupStyle"
+ latin:keyLabelOption="hasPopupHint"
+ latin:popupCharacters="@string/alternates_for_f1"
latin:parentStyle="functionalKeyStyle" />
</case>
+ <!-- clobberSettingsKey="false -->
<case
- latin:clobberSettingsKey="false"
- latin:hasSettingsKey="true"
+ latin:hasSettingsKey="false"
>
<key-style
- latin:styleName="settingsPopupStyle"
+ latin:styleName="f1PopupStyle"
+ latin:keyLabelOption="hasPopupHint"
+ latin:popupCharacters="@string/alternates_for_f1_settings"
latin:parentStyle="functionalKeyStyle" />
</case>
- <!-- clobberSettingsKey="false" and hasSettingsKey="false" -->
+ <!-- clobberSettingsKey="false" hasSettingsKey="true" -->
+ <case
+ latin:navigateAction="true"
+ >
+ <key-style
+ latin:styleName="f1PopupStyle"
+ latin:keyLabelOption="hasPopupHint"
+ latin:popupCharacters="@string/alternates_for_f1_navigate"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <!-- clobberSettingsKey="false" and hasSettingsKey="true" navigateAction="false" -->
<default>
<key-style
- latin:styleName="settingsPopupStyle"
+ latin:styleName="f1PopupStyle"
latin:keyLabelOption="hasPopupHint"
- latin:popupCharacters="\@icon/6|\@integer/key_settings"
+ latin:popupCharacters="@string/alternates_for_f1"
latin:parentStyle="functionalKeyStyle" />
</default>
</switch>
@@ -59,28 +73,27 @@
latin:keyIconShifted="iconShiftedShiftKey"
latin:parentStyle="functionalKeyStyle"
latin:isSticky="true" />
+ <key-style
+ latin:styleName="deleteKeyStyle"
+ latin:code="@integer/key_delete"
+ latin:keyIcon="iconDeleteKey"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isRepeatable="true" />
+ <!-- Return key style -->
<switch>
<case
- latin:languageCode="ar|iw"
+ latin:mode="im"
>
+ <!-- Smiley key. -->
<key-style
- latin:styleName="deleteKeyStyle"
- latin:code="@integer/key_delete"
- latin:keyIcon="iconDeleteRtlKey"
- latin:parentStyle="functionalKeyStyle"
- latin:isRepeatable="true" />
+ latin:styleName="returnKeyStyle"
+ latin:keyLabel=":-)"
+ latin:keyOutputText=":-) "
+ latin:keyLabelOption="hasPopupHint"
+ latin:popupCharacters="@string/alternates_for_smiley"
+ latin:maxPopupKeyboardColumn="5"
+ latin:parentStyle="functionalKeyStyle" />
</case>
- <default>
- <key-style
- latin:styleName="deleteKeyStyle"
- latin:code="@integer/key_delete"
- latin:keyIcon="iconDeleteKey"
- latin:parentStyle="functionalKeyStyle"
- latin:isRepeatable="true" />
- </default>
- </switch>
- <!-- Return key style -->
- <switch>
<case
latin:imeAction="actionGo"
>
@@ -137,22 +150,13 @@
<key-style
latin:styleName="spaceKeyStyle"
latin:code="@integer/key_space"
- latin:keyIconPreview="iconPreviewSpaceKey"
- latin:parentStyle="functionalKeyStyle" />
- <key-style
- latin:styleName="smileyKeyStyle"
- latin:keyLabel=":-)"
- latin:keyOutputText=":-) "
- latin:keyLabelOption="hasPopupHint"
- latin:popupCharacters="@string/alternates_for_smiley"
- latin:maxPopupKeyboardColumn="5"
latin:parentStyle="functionalKeyStyle" />
<key-style
latin:styleName="shortcutKeyStyle"
latin:code="@integer/key_shortcut"
latin:keyIcon="iconShortcutKey"
latin:keyIconPreview="iconPreviewShortcutKey"
- latin:parentStyle="settingsPopupStyle" />
+ latin:parentStyle="f1PopupStyle" />
<key-style
latin:styleName="settingsKeyStyle"
latin:code="@integer/key_settings"
@@ -173,16 +177,19 @@
latin:keyIcon="iconTabKey"
latin:keyIconPreview="iconPreviewTabKey" />
<switch>
- <!-- When this qwerty keyboard has no voice key but voice key is enabled, then symbol
- keyboard will have mic key. That means we should use "?123mic" key here. -->
+ <!-- When this qwerty keyboard has no shortcut keys but shortcut key is enabled, then symbol
+ keyboard will have a shortcut key. That means we should use
+ iconToSymbolKeyWithShortcutKey here. -->
<case
- latin:voiceKeyEnabled="true"
- latin:hasVoiceKey="false"
+ latin:shortcutKeyEnabled="true"
+ latin:hasShortcutKey="false"
>
<key-style
latin:styleName="toSymbolKeyStyle"
latin:code="@integer/key_switch_alpha_symbol"
- latin:keyIcon="iconToSymbolKeyWithShortcut"
+ latin:keyIcon="iconShortcutForLabel"
+ latin:keyLabel="@string/label_to_symbol_with_microphone_key"
+ latin:keyLabelOption="withIconRight"
latin:parentStyle="functionalKeyStyle" />
</case>
<default>
@@ -199,11 +206,15 @@
latin:keyLabel="@string/label_to_alpha_key"
latin:parentStyle="functionalKeyStyle" />
<key-style
- latin:styleName="altKeyStyle"
+ latin:styleName="toMoreSymbolKeyStyle"
latin:code="@integer/key_shift"
- latin:keyLabel="@string/label_alt_key"
- latin:parentStyle="functionalKeyStyle"
- latin:isSticky="true" />
+ latin:keyLabel="@string/label_to_more_symbol_key"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="backFromMoreSymbolKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:parentStyle="functionalKeyStyle" />
<switch>
<case
latin:passwordInput="true"
@@ -228,29 +239,11 @@
</default>
</switch>
<key-style
- latin:styleName="basePunctuationKeyStyle"
+ latin:styleName="punctuationKeyStyle"
latin:keyLabel="."
latin:keyHintLabel="@string/keyhintlabel_for_punctuation"
latin:keyLabelOption="hasPopupHint"
latin:popupCharacters="@string/alternates_for_punctuation"
latin:maxPopupKeyboardColumn="@integer/popup_keyboard_column_for_punctuation"
latin:parentStyle="functionalKeyStyle" />
- <switch>
- <case
- latin:navigateAction="true"
- >
- <key-style
- latin:styleName="punctuationKeyStyle"
- latin:keyHintLabel="@string/keyhintlabel_for_punctuation"
- latin:keyLabelOption="hasPopupHint"
- latin:popupCharacters="@string/alternates_for_web_tab_punctuation"
- latin:maxPopupKeyboardColumn="@integer/popup_keyboard_column_for_web_punctuation"
- latin:parentStyle="tabKeyStyle" />
- </case>
- <default>
- <key-style
- latin:styleName="punctuationKeyStyle"
- latin:parentStyle="basePunctuationKeyStyle" />
- </default>
- </switch>
</merge>
diff --git a/java/res/xml/kbd_number.xml b/java/res/xml/kbd_number.xml
index 4d7b6d9a9..aabf0eb7a 100644
--- a/java/res/xml/kbd_number.xml
+++ b/java/res/xml/kbd_number.xml
@@ -30,12 +30,9 @@
<case
latin:passwordInput="true"
>
- <Row
- latin:rowEdgeFlags="top"
- >
+ <Row>
<Key
- latin:keyStyle="num1KeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="num1KeyStyle" />
<Key
latin:keyStyle="num2KeyStyle" />
<Key
@@ -43,8 +40,7 @@
</Row>
<Row>
<Key
- latin:keyStyle="num4KeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="num4KeyStyle" />
<Key
latin:keyStyle="num5KeyStyle" />
<Key
@@ -52,39 +48,31 @@
</Row>
<Row>
<Key
- latin:keyStyle="num7KeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="num7KeyStyle" />
<Key
latin:keyStyle="num8KeyStyle" />
<Key
latin:keyStyle="num9KeyStyle" />
<Key
latin:keyStyle="deleteKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
- <Row
- latin:rowEdgeFlags="bottom"
- >
+ <Row>
<Spacer />
<Key
latin:keyStyle="num0KeyStyle" />
<Spacer />
<Key
latin:keyStyle="returnKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
</case>
<!-- latin:passwordInput="false" -->
<default>
- <Row
- latin:rowEdgeFlags="top"
- >
+ <Row>
<Key
latin:keyLabel="1"
- latin:keyStyle="numKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="numKeyStyle" />
<Key
latin:keyLabel="2"
latin:keyStyle="numKeyStyle" />
@@ -94,14 +82,12 @@
<Key
latin:keyLabel="-"
latin:keyStyle="numFunctionalKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
<Key
latin:keyLabel="4"
- latin:keyStyle="numKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="numKeyStyle" />
<Key
latin:keyLabel="5"
latin:keyStyle="numKeyStyle" />
@@ -111,14 +97,12 @@
<Key
latin:keyLabel=","
latin:keyStyle="numFunctionalKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
<Key
latin:keyLabel="7"
- latin:keyStyle="numKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="numKeyStyle" />
<Key
latin:keyLabel="8"
latin:keyStyle="numKeyStyle"/>
@@ -127,15 +111,11 @@
latin:keyStyle="numKeyStyle" />
<Key
latin:keyStyle="deleteKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
- <Row
- latin:rowEdgeFlags="bottom"
- >
+ <Row>
<Key
- latin:keyStyle="numSpaceKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="numSpaceKeyStyle" />
<Key
latin:keyLabel="0"
latin:keyStyle="numKeyStyle" />
@@ -144,8 +124,7 @@
latin:keyStyle="numKeyStyle" />
<Key
latin:keyStyle="returnKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
</default>
</switch>
diff --git a/java/res/xml/kbd_numkey_styles.xml b/java/res/xml/kbd_numkey_styles.xml
index 657bfbcbf..c6ba23d39 100644
--- a/java/res/xml/kbd_numkey_styles.xml
+++ b/java/res/xml/kbd_numkey_styles.xml
@@ -91,17 +91,16 @@
latin:parentStyle="numKeyStyle" />
<key-style
latin:styleName="numSwitchToAltKeyStyle"
- latin:code="@integer/key_switch_alpha_symbol"
+ latin:code="@integer/key_shift"
latin:keyLabel="@string/label_to_phone_symbols_key"
latin:parentStyle="numModeKeyStyle" />
<key-style
latin:styleName="numSwitchToNumericKeyStyle"
- latin:code="@integer/key_switch_alpha_symbol"
+ latin:code="@integer/key_shift"
latin:keyLabel="@string/label_to_phone_numeric_key"
latin:parentStyle="numModeKeyStyle" />
<key-style
latin:styleName="numSpaceKeyStyle"
latin:code="@integer/key_space"
- latin:keyIcon="iconSpaceKey"
- latin:keyIconPreview="iconPreviewSpaceKey" />
+ latin:keyIcon="iconSpaceKey" />
</merge>
diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml
index c6508fb03..4588ab2c9 100644
--- a/java/res/xml/kbd_phone.xml
+++ b/java/res/xml/kbd_phone.xml
@@ -26,12 +26,9 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<include
latin:keyboardLayout="@xml/kbd_numkey_styles" />
- <Row
- latin:rowEdgeFlags="top"
- >
+ <Row>
<Key
- latin:keyStyle="num1KeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="num1KeyStyle" />
<Key
latin:keyStyle="num2KeyStyle" />
<Key
@@ -39,13 +36,11 @@
<Key
latin:keyLabel="-"
latin:keyStyle="numFunctionalKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
<Key
- latin:keyStyle="num4KeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="num4KeyStyle" />
<Key
latin:keyStyle="num5KeyStyle" />
<Key
@@ -53,35 +48,28 @@
<Key
latin:keyLabel="."
latin:keyStyle="numFunctionalKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
<Key
- latin:keyStyle="num7KeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="num7KeyStyle" />
<Key
latin:keyStyle="num8KeyStyle" />
<Key
latin:keyStyle="num9KeyStyle" />
<Key
latin:keyStyle="deleteKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
- <Row
- latin:rowEdgeFlags="bottom"
- >
+ <Row>
<Key
- latin:keyStyle="numSwitchToAltKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="numSwitchToAltKeyStyle" />
<Key
latin:keyStyle="num0KeyStyle" />
<Key
latin:keyStyle="numSpaceKeyStyle" />
<Key
latin:keyStyle="returnKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
</Keyboard>
diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_shift.xml
index 5d9912229..89a9bd058 100644
--- a/java/res/xml/kbd_phone_symbols.xml
+++ b/java/res/xml/kbd_phone_shift.xml
@@ -26,13 +26,10 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<include
latin:keyboardLayout="@xml/kbd_numkey_styles" />
- <Row
- latin:rowEdgeFlags="top"
- >
+ <Row>
<Key
latin:keyLabel="("
- latin:keyStyle="numKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="numKeyStyle" />
<Key
latin:keyLabel="/"
latin:keyStyle="numKeyStyle" />
@@ -42,13 +39,11 @@
<Key
latin:keyLabel="-"
latin:keyStyle="numFunctionalKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
<Key
- latin:keyLabel="N"
- latin:keyEdgeFlags="left" />
+ latin:keyLabel="N" />
<!-- Pause is a comma. Check PhoneNumberUtils.java to see if this
has changed. -->
<Key
@@ -61,13 +56,11 @@
<Key
latin:keyLabel="."
latin:keyStyle="numFunctionalKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row>
<Key
- latin:keyStyle="numStarKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="numStarKeyStyle" />
<!-- Wait is a semicolon. -->
<Key
latin:code="59"
@@ -78,15 +71,11 @@
latin:keyStyle="numKeyStyle" />
<Key
latin:keyStyle="deleteKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
- <Row
- latin:rowEdgeFlags="bottom"
- >
+ <Row>
<Key
- latin:keyStyle="numSwitchToNumericKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="numSwitchToNumericKeyStyle" />
<Key
latin:keyLabel="+"
latin:keyStyle="numKeyStyle" />
@@ -94,7 +83,6 @@
latin:keyStyle="numSpaceKeyStyle" />
<Key
latin:keyStyle="returnKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
</Keyboard>
diff --git a/java/res/xml/kbd_qwerty_f1.xml b/java/res/xml/kbd_qwerty_f1.xml
index 1546f49c9..83b6ecc8d 100644
--- a/java/res/xml/kbd_qwerty_f1.xml
+++ b/java/res/xml/kbd_qwerty_f1.xml
@@ -23,7 +23,8 @@
>
<switch>
<case
- latin:hasSettingsKey="true"
+ latin:hasSettingsKey="false"
+ latin:navigateAction="false"
>
<switch>
<case
@@ -31,46 +32,30 @@
>
<Key
latin:keyLabel="/"
- latin:keyWidth="9.2%p"
- latin:keyStyle="settingsPopupStyle" />
+ latin:keyStyle="f1PopupStyle" />
</case>
<case
latin:mode="email"
>
<Key
latin:keyLabel="\@"
- latin:keyWidth="9.2%p"
- latin:keyStyle="settingsPopupStyle" />
+ latin:keyStyle="f1PopupStyle" />
+ </case>
+ <case
+ latin:hasShortcutKey="true"
+ >
+ <Key
+ latin:keyStyle="shortcutKeyStyle" />
</case>
+ <!-- latin:hasShortcutKey="false" -->
<default>
- <switch>
- <case
- latin:hasVoiceKey="true"
- >
- <Key
- latin:keyStyle="shortcutKeyStyle"
- latin:keyWidth="9.2%p" />
- </case>
- <!-- latin:hasVoiceKey="false" -->
- <case
- latin:navigateAction="true"
- >
- <Key
- latin:keyLabel="."
- latin:keyWidth="9.2%p"
- latin:keyStyle="settingsPopupStyle" />
- </case>
- <default>
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_comma"
- latin:keyWidth="9.2%p"
- latin:keyStyle="settingsPopupStyle" />
- </default>
- </switch>
+ <Key
+ latin:keyLabel="@string/keylabel_for_comma"
+ latin:keyStyle="f1PopupStyle" />
</default>
</switch>
</case>
- <!-- hasSettingsKey="false" -->
+ <!-- hasSettingsKey="true" or navigateAction="true" -->
<default>
<switch>
<case
@@ -78,37 +63,30 @@
>
<Key
latin:keyLabel="/"
- latin:keyStyle="settingsPopupStyle" />
+ latin:keyWidth="9.2%p"
+ latin:keyStyle="f1PopupStyle" />
</case>
<case
latin:mode="email"
>
<Key
latin:keyLabel="\@"
- latin:keyStyle="settingsPopupStyle" />
+ latin:keyWidth="9.2%p"
+ latin:keyStyle="f1PopupStyle" />
</case>
+ <case
+ latin:hasShortcutKey="true"
+ >
+ <Key
+ latin:keyStyle="shortcutKeyStyle"
+ latin:keyWidth="9.2%p" />
+ </case>
+ <!-- hasShortcutKey="false" -->
<default>
- <switch>
- <case
- latin:hasVoiceKey="true"
- >
- <Key
- latin:keyStyle="shortcutKeyStyle" />
- </case>
- <!-- latin:hasVoiceKey="false" -->
- <case
- latin:navigateAction="true"
- >
- <Key
- latin:keyLabel="."
- latin:keyStyle="settingsPopupStyle" />
- </case>
- <default>
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_comma"
- latin:keyStyle="settingsPopupStyle" />
- </default>
- </switch>
+ <Key
+ latin:keyLabel="@string/keylabel_for_comma"
+ latin:keyWidth="9.2%p"
+ latin:keyStyle="f1PopupStyle" />
</default>
</switch>
</default>
diff --git a/java/res/xml/kbd_qwerty_row1.xml b/java/res/xml/kbd_qwerty_row1.xml
index cfd2efd2a..daa138255 100644
--- a/java/res/xml/kbd_qwerty_row1.xml
+++ b/java/res/xml/kbd_qwerty_row1.xml
@@ -23,13 +23,11 @@
>
<Row
latin:keyWidth="10%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="q"
latin:keyHintLabel="1"
- latin:popupCharacters="@string/alternates_for_q"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_q" />
<Key
latin:keyLabel="w"
latin:keyHintLabel="2"
@@ -66,7 +64,6 @@
latin:keyLabel="p"
latin:keyHintLabel="0"
latin:popupCharacters="@string/alternates_for_p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
</merge>
diff --git a/java/res/xml/kbd_qwerty_row2.xml b/java/res/xml/kbd_qwerty_row2.xml
index 57bbad75a..6e4872e08 100644
--- a/java/res/xml/kbd_qwerty_row2.xml
+++ b/java/res/xml/kbd_qwerty_row2.xml
@@ -27,8 +27,7 @@
<Key
latin:keyLabel="a"
latin:popupCharacters="@string/alternates_for_a"
- latin:keyXPos="5%p"
- latin:keyEdgeFlags="left" />
+ latin:keyXPos="5%p" />
<Key
latin:keyLabel="s"
latin:popupCharacters="@string/alternates_for_s" />
@@ -49,8 +48,7 @@
latin:popupCharacters="@string/alternates_for_k" />
<Key
latin:keyLabel="l"
- latin:popupCharacters="@string/alternates_for_l"
- latin:keyEdgeFlags="right" />
+ latin:popupCharacters="@string/alternates_for_l" />
<!-- Here is 5%p space -->
</Row>
</merge>
diff --git a/java/res/xml/kbd_qwerty_row3.xml b/java/res/xml/kbd_qwerty_row3.xml
index 98f0404c0..6a2035543 100644
--- a/java/res/xml/kbd_qwerty_row3.xml
+++ b/java/res/xml/kbd_qwerty_row3.xml
@@ -27,8 +27,7 @@
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyWidth="15%p"
- latin:visualInsetsRight="1%p"
- latin:keyEdgeFlags="left" />
+ latin:visualInsetsRight="1%p" />
<Key
latin:keyLabel="z"
latin:popupCharacters="@string/alternates_for_z" />
@@ -50,7 +49,6 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyWidth="fillBoth"
- latin:visualInsetsLeft="1%p"
- latin:keyEdgeFlags="right" />
+ latin:visualInsetsLeft="1%p" />
</Row>
</merge>
diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml
index 298f0f61e..eb1e9b8b3 100644
--- a/java/res/xml/kbd_qwerty_row4.xml
+++ b/java/res/xml/kbd_qwerty_row4.xml
@@ -23,57 +23,44 @@
>
<Row
latin:keyWidth="10%p"
- latin:rowEdgeFlags="bottom"
>
<switch>
<case
- latin:hasSettingsKey="true"
+ latin:hasSettingsKey="false"
+ latin:navigateAction="false"
>
<Key
latin:keyStyle="toSymbolKeyStyle"
- latin:keyWidth="13.75%p"
- latin:keyEdgeFlags="left" />
- <Key
- latin:keyStyle="settingsKeyStyle"
- latin:keyWidth="9.2%p" />
+ latin:keyWidth="15%p" />
<include
latin:keyboardLayout="@xml/kbd_qwerty_f1" />
<Key
latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="35.83%p" />
+ latin:keyWidth="50%p" />
<Key
- latin:keyStyle="punctuationKeyStyle"
- latin:keyWidth="9.2%p" />
+ latin:keyStyle="punctuationKeyStyle" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="fillRight" />
</case>
- <!-- latin:hasSettingsKey="false" -->
+ <!-- hasSettingsKey="true" or navigateAction="true" -->
<default>
<Key
latin:keyStyle="toSymbolKeyStyle"
- latin:keyWidth="15%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="13.75%p" />
+ <include
+ latin:keyboardLayout="@xml/kbd_settings_or_tab" />
<include
latin:keyboardLayout="@xml/kbd_qwerty_f1" />
<Key
latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="50%p" />
- <Key
- latin:keyStyle="punctuationKeyStyle" />
- </default>
- </switch>
- <switch>
- <case
- latin:mode="im"
- >
+ latin:keyWidth="35.83%p" />
<Key
- latin:keyStyle="smileyKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
- </case>
- <default>
+ latin:keyStyle="punctuationKeyStyle"
+ latin:keyWidth="9.2%p" />
<Key
latin:keyStyle="returnKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</default>
</switch>
</Row>
diff --git a/java/res/xml/kbd_rows_arabic.xml b/java/res/xml/kbd_rows_arabic.xml
index 07e62741d..daa2a65ed 100644
--- a/java/res/xml/kbd_rows_arabic.xml
+++ b/java/res/xml/kbd_rows_arabic.xml
@@ -29,8 +29,7 @@
<Key
latin:keyLabel="ض"
latin:keyHintLabel="1"
- latin:popupCharacters="1,١"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="1,١" />
<Key
latin:keyLabel="ص"
latin:keyHintLabel="2"
@@ -43,7 +42,7 @@
<Key
latin:keyLabel="ف"
latin:keyHintLabel="4"
- latin:popupCharacters="\u06a4,4,٤" />
+ latin:popupCharacters="4,٤,\u06a4" />
<Key
latin:keyLabel="غ"
latin:keyHintLabel="5"
@@ -71,15 +70,13 @@
latin:keyLabel="ج"
latin:keyHintLabel="0"
latin:popupCharacters="0,٠,\u0686"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="10%p"
>
<Key
- latin:keyLabel="ش"
- latin:keyEdgeFlags="left" />
+ latin:keyLabel="ش" />
<Key
latin:keyLabel="س" />
<!-- \u0626: ARABIC LETTER YEH WITH HAMZA ABOVE
@@ -119,16 +116,14 @@
<Key
latin:keyLabel="ك"
latin:popupCharacters="گ"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="10%p"
>
<Key
latin:keyLabel="ظ"
- latin:keyXPos="5.0%p"
- latin:keyEdgeFlags="left" />
+ latin:keyXPos="5.0%p" />
<Key
latin:keyLabel="ط" />
<Key
@@ -148,8 +143,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyWidth="fillRight"
- latin:visualInsetsLeft="1%p"
- latin:keyEdgeFlags="right" />
+ latin:visualInsetsLeft="1%p" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml/kbd_rows_azerty.xml b/java/res/xml/kbd_rows_azerty.xml
index 96efb6646..dbf25eb95 100644
--- a/java/res/xml/kbd_rows_azerty.xml
+++ b/java/res/xml/kbd_rows_azerty.xml
@@ -25,13 +25,11 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="10%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="a"
latin:keyHintLabel="1"
- latin:popupCharacters="@string/alternates_for_a"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_a" />
<Key
latin:keyLabel="z"
latin:keyHintLabel="2"
@@ -68,16 +66,14 @@
latin:keyLabel="p"
latin:keyHintLabel="0"
latin:popupCharacters="@string/alternates_for_p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="10%p"
>
<Key
latin:keyLabel="q"
- latin:popupCharacters="@string/alternates_for_q"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_q" />
<Key
latin:keyLabel="s"
latin:popupCharacters="@string/alternates_for_s" />
@@ -101,8 +97,7 @@
latin:popupCharacters="@string/alternates_for_l" />
<Key
latin:keyLabel="m"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="10%p"
@@ -110,8 +105,7 @@
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyWidth="15%p"
- latin:visualInsetsRight="1%p"
- latin:keyEdgeFlags="left" />
+ latin:visualInsetsRight="1%p" />
<Key
latin:keyLabel="w"
latin:popupCharacters="@string/alternates_for_w" />
@@ -135,8 +129,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyWidth="fillRight"
- latin:visualInsetsLeft="1%p"
- latin:keyEdgeFlags="right" />
+ latin:visualInsetsLeft="1%p" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml/kbd_rows_hebrew.xml b/java/res/xml/kbd_rows_hebrew.xml
index af3488515..1ec076860 100644
--- a/java/res/xml/kbd_rows_hebrew.xml
+++ b/java/res/xml/kbd_rows_hebrew.xml
@@ -25,12 +25,10 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="10%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="ק"
- latin:keyXPos="5%p"
- latin:keyEdgeFlags="left" />
+ latin:keyXPos="5%p" />
<Key
latin:keyLabel="ר" />
<Key
@@ -48,15 +46,13 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyWidth="fillRight"
- latin:visualInsetsLeft="1%p"
- latin:keyEdgeFlags="right" />
+ latin:visualInsetsLeft="1%p" />
</Row>
<Row
latin:keyWidth="10%p"
>
<Key
- latin:keyLabel="ש"
- latin:keyEdgeFlags="left" />
+ latin:keyLabel="ש" />
<Key
latin:keyLabel="ד" />
<Key
@@ -78,8 +74,7 @@
latin:keyLabel="ך" />
<Key
latin:keyLabel="ף"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="10%p"
@@ -87,8 +82,7 @@
<Key
latin:keyLabel="ז"
latin:popupCharacters="ז׳"
- latin:keyXPos="5%p"
- latin:keyEdgeFlags="left" />
+ latin:keyXPos="5%p" />
<Key
latin:keyLabel="ס" />
<Key
@@ -107,8 +101,7 @@
latin:popupCharacters="ת׳" />
<Key
latin:keyLabel="ץ"
- latin:popupCharacters="ץ׳"
- latin:keyEdgeFlags="right" />
+ latin:popupCharacters="ץ׳" />
<!-- Here is 5%p space -->
</Row>
<include
diff --git a/java/res/xml/kbd_rows_qwertz.xml b/java/res/xml/kbd_rows_qwertz.xml
index 347ef60ad..f94892125 100644
--- a/java/res/xml/kbd_rows_qwertz.xml
+++ b/java/res/xml/kbd_rows_qwertz.xml
@@ -25,13 +25,11 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="10%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="q"
latin:keyHintLabel="1"
- latin:popupCharacters="@string/alternates_for_q"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_q" />
<Key
latin:keyLabel="w"
latin:keyHintLabel="2"
@@ -68,8 +66,7 @@
latin:keyLabel="p"
latin:keyHintLabel="0"
latin:popupCharacters="@string/alternates_for_p"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row2" />
@@ -79,8 +76,7 @@
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyWidth="15%p"
- latin:visualInsetsRight="1%p"
- latin:keyEdgeFlags="left" />
+ latin:visualInsetsRight="1%p" />
<Key
latin:keyLabel="y"
latin:popupCharacters="@string/alternates_for_y" />
@@ -102,8 +98,7 @@
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyWidth="fillRight"
- latin:visualInsetsLeft="1%p"
- latin:keyEdgeFlags="right" />
+ latin:visualInsetsLeft="1%p" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml/kbd_rows_russian.xml b/java/res/xml/kbd_rows_russian.xml
index 2c10c3141..216d74946 100644
--- a/java/res/xml/kbd_rows_russian.xml
+++ b/java/res/xml/kbd_rows_russian.xml
@@ -25,14 +25,12 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="9.091%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="й"
latin:keyHintLabel="1"
latin:popupCharacters="1"
- latin:keyWidth="8.75%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="8.75%p" />
<Key
latin:keyLabel="ц"
latin:keyHintLabel="2"
@@ -71,16 +69,14 @@
latin:popupCharacters="0" />
<Key
latin:keyLabel="х"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="9.091%p"
>
<Key
latin:keyLabel="ф"
- latin:keyWidth="8.75%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="8.75%p" />
<Key
latin:keyLabel="ы" />
<Key
@@ -101,16 +97,14 @@
latin:keyLabel="ж" />
<Key
latin:keyLabel="э"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="8.5%p"
>
<Key
latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="11.75%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="11.75%p" />
<Key
latin:keyLabel="я" />
<Key
@@ -132,8 +126,7 @@
latin:keyLabel="ю" />
<Key
latin:keyStyle="deleteKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml/kbd_rows_scandinavian.xml b/java/res/xml/kbd_rows_scandinavian.xml
index 3f2560128..7e8902e0b 100644
--- a/java/res/xml/kbd_rows_scandinavian.xml
+++ b/java/res/xml/kbd_rows_scandinavian.xml
@@ -25,14 +25,12 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="9.09%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="q"
latin:keyHintLabel="1"
latin:popupCharacters="@string/alternates_for_q"
- latin:keyWidth="8.75%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="8.75%p" />
<Key
latin:keyLabel="w"
latin:keyHintLabel="2"
@@ -71,8 +69,7 @@
latin:popupCharacters="@string/alternates_for_p" />
<Key
latin:keyLabel="å"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="9.09%p"
@@ -80,8 +77,7 @@
<Key
latin:keyLabel="a"
latin:popupCharacters="@string/alternates_for_a"
- latin:keyWidth="8.75%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="8.75%p" />
<Key
latin:keyLabel="s"
latin:popupCharacters="@string/alternates_for_s" />
@@ -109,8 +105,7 @@
<Key
latin:keyLabel="@string/keylabel_for_scandinavia_row2_11"
latin:popupCharacters="@string/alternates_for_scandinavia_row2_11"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row3" />
diff --git a/java/res/xml/kbd_rows_serbian.xml b/java/res/xml/kbd_rows_serbian.xml
index 2bed276d3..73c807f95 100644
--- a/java/res/xml/kbd_rows_serbian.xml
+++ b/java/res/xml/kbd_rows_serbian.xml
@@ -25,13 +25,11 @@
latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
latin:keyWidth="9.09%p"
- latin:rowEdgeFlags="top"
>
<Key
latin:keyLabel="љ"
latin:keyHintLabel="1"
- latin:popupCharacters="1"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="1" />
<Key
latin:keyLabel="њ"
latin:keyHintLabel="2"
@@ -70,15 +68,13 @@
latin:popupCharacters="0" />
<Key
latin:keyLabel="ш"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="9.09%p"
>
<Key
- latin:keyLabel="а"
- latin:keyEdgeFlags="left" />
+ latin:keyLabel="а" />
<Key
latin:keyLabel="с" />
<Key
@@ -99,15 +95,13 @@
latin:keyLabel="ч" />
<Key
latin:keyLabel="ћ"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<Row
latin:keyWidth="8.90%p"
>
<Key
- latin:keyStyle="shiftKeyStyle"
- latin:keyEdgeFlags="left" />
+ latin:keyStyle="shiftKeyStyle" />
<Key
latin:keyLabel="ѕ" />
<Key
@@ -128,8 +122,7 @@
latin:keyLabel="ж" />
<Key
latin:keyStyle="deleteKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml/kbd_rows_spanish.xml b/java/res/xml/kbd_rows_spanish.xml
index c5ead10da..6d007187f 100644
--- a/java/res/xml/kbd_rows_spanish.xml
+++ b/java/res/xml/kbd_rows_spanish.xml
@@ -30,8 +30,7 @@
>
<Key
latin:keyLabel="a"
- latin:popupCharacters="@string/alternates_for_a"
- latin:keyEdgeFlags="left" />
+ latin:popupCharacters="@string/alternates_for_a" />
<Key
latin:keyLabel="s"
latin:popupCharacters="@string/alternates_for_s" />
@@ -54,8 +53,7 @@
latin:keyLabel="l"
latin:popupCharacters="@string/alternates_for_l" />
<Key
- latin:keyLabel="ñ"
- latin:keyEdgeFlags="right" />
+ latin:keyLabel="ñ" />
</Row>
<include
latin:keyboardLayout="@xml/kbd_qwerty_row3" />
diff --git a/java/res/xml/kbd_rows_symbols.xml b/java/res/xml/kbd_rows_symbols.xml
new file mode 100644
index 000000000..75e21a002
--- /dev/null
+++ b/java/res/xml/kbd_rows_symbols.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_currency_key_styles" />
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_1"
+ latin:popupCharacters="@string/alternates_for_symbols_1" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_2"
+ latin:popupCharacters="@string/alternates_for_symbols_2" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_3"
+ latin:popupCharacters="@string/alternates_for_symbols_3" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_4"
+ latin:popupCharacters="@string/alternates_for_symbols_4" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_5"
+ latin:popupCharacters="@string/alternates_for_symbols_5" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_6"
+ latin:popupCharacters="@string/alternates_for_symbols_6" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_7"
+ latin:popupCharacters="@string/alternates_for_symbols_7" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_8"
+ latin:popupCharacters="@string/alternates_for_symbols_8" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_9"
+ latin:popupCharacters="@string/alternates_for_symbols_9" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_0"
+ latin:popupCharacters="@string/alternates_for_symbols_0"
+ latin:keyWidth="fillRight" />
+ </Row>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyLabel="\@" />
+ <Key
+ latin:keyLabel="\#" />
+ <Key
+ latin:keyStyle="currencyKeyStyle" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_percent"
+ latin:popupCharacters="@string/alternates_for_symbols_percent" />
+ <Key
+ latin:keyLabel="&amp;" />
+ <Key
+ latin:keyLabel="*"
+ latin:popupCharacters="†,‡,★" />
+ <Key
+ latin:keyLabel="-"
+ latin:popupCharacters="_,–,—" />
+ <Key
+ latin:keyLabel="+"
+ latin:popupCharacters="±" />
+ <Key
+ latin:keyLabel="("
+ latin:popupCharacters="[,{,&lt;" />
+ <Key
+ latin:keyLabel=")"
+ latin:popupCharacters="],},&gt;"
+ latin:keyWidth="fillRight" />
+ </Row>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="toMoreSymbolKeyStyle"
+ latin:keyWidth="15%p"
+ latin:visualInsetsRight="1%p" />
+ <Key
+ latin:keyLabel="!"
+ latin:popupCharacters="¡" />
+ <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
+ <!-- latin:popupCharacters="“,”,„,‟,«,»" -->
+ <Key
+ latin:keyLabel="&quot;"
+ latin:popupCharacters="“,”,«,»"
+ latin:maxPopupKeyboardColumn="6" />
+ <Key
+ latin:keyLabel="\'"
+ latin:popupCharacters="‘,’,‚,‛" />
+ <Key
+ latin:keyLabel=":" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_semicolon"
+ latin:popupCharacters="@string/alternates_for_symbols_semicolon" />
+ <Key
+ latin:keyLabel="/" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_symbols_question"
+ latin:popupCharacters="@string/alternates_for_symbols_question" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="fillRight"
+ latin:visualInsetsLeft="1%p" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_symbols_row4" />
+</merge>
diff --git a/java/res/xml/kbd_rows_symbols_shift.xml b/java/res/xml/kbd_rows_symbols_shift.xml
new file mode 100644
index 000000000..d52341512
--- /dev/null
+++ b/java/res/xml/kbd_rows_symbols_shift.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyLabel="~" />
+ <Key
+ latin:keyLabel="`" />
+ <Key
+ latin:keyLabel="|" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="•"
+ latin:popupCharacters="♪,♥,♠,♦,♣" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="√" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="π"
+ latin:popupCharacters="Π" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="÷" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="×" />
+ <Key
+ latin:keyLabel="{" />
+ <Key
+ latin:keyLabel="}"
+ latin:keyWidth="fillRight" />
+ </Row>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="nonSpecialBackgroundTabKeyStyle" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="£" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¢" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="€" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="°"
+ latin:popupCharacters="′,″" />
+ <Key
+ latin:keyLabel="^"
+ latin:popupCharacters="↑,↓,←,→" />
+ <Key
+ latin:keyLabel="_" />
+ <Key
+ latin:keyLabel="="
+ latin:popupCharacters="≠,≈,∞" />
+ <Key
+ latin:keyLabel="[" />
+ <Key
+ latin:keyLabel="]"
+ latin:keyWidth="fillRight" />
+ </Row>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="backFromMoreSymbolKeyStyle"
+ latin:keyWidth="15%p"
+ latin:visualInsetsRight="1%p" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="™" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="®" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="©" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¶"
+ latin:popupCharacters="§" />
+ <Key
+ latin:keyLabel="\\" />
+ <Key
+ latin:keyLabel="&lt;"
+ latin:popupCharacters="≤,«,‹" />
+ <Key
+ latin:keyLabel="&gt;"
+ latin:popupCharacters="≥,»,›" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="fillRight"
+ latin:visualInsetsLeft="1%p" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_symbols_shift_row4" />
+</merge>
diff --git a/java/res/xml/kbd_settings_or_tab.xml b/java/res/xml/kbd_settings_or_tab.xml
new file mode 100644
index 000000000..4a8bcc7a6
--- /dev/null
+++ b/java/res/xml/kbd_settings_or_tab.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <switch>
+ <case
+ latin:hasSettingsKey="true"
+ >
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="9.2%p" />
+ </case>
+ <!-- hasSettingsKey="false" -->
+ <case
+ latin:navigateAction="true"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyWidth="9.2%p" />
+ </case>
+ <!-- hasSettingsKey="false" and navigateAction="false" -->
+ <default>
+ <!-- No key. -->
+ </default>
+ </switch>
+</merge>
diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml
index 8f682d932..737f684a7 100644
--- a/java/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -1,133 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-/*
+/*
**
** Copyright 2008, 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
+** 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
+** 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
+** 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.
*/
-->
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
- latin:keyWidth="10%p"
>
<include
- latin:keyboardLayout="@xml/kbd_key_styles" />
- <include
- latin:keyboardLayout="@xml/kbd_currency_key_styles" />
- <Row
- latin:rowEdgeFlags="top"
- >
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_1"
- latin:popupCharacters="@string/alternates_for_symbols_1"
- latin:keyEdgeFlags="left" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_2"
- latin:popupCharacters="@string/alternates_for_symbols_2" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_3"
- latin:popupCharacters="@string/alternates_for_symbols_3" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_4"
- latin:popupCharacters="@string/alternates_for_symbols_4" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_5"
- latin:popupCharacters="@string/alternates_for_symbols_5" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_6"
- latin:popupCharacters="@string/alternates_for_symbols_6" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_7"
- latin:popupCharacters="@string/alternates_for_symbols_7" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_8"
- latin:popupCharacters="@string/alternates_for_symbols_8" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_9"
- latin:popupCharacters="@string/alternates_for_symbols_9" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_0"
- latin:popupCharacters="@string/alternates_for_symbols_0"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- latin:keyLabel="\@"
- latin:keyEdgeFlags="left" />
- <Key
- latin:keyLabel="\#" />
- <Key
- latin:keyStyle="currencyKeyStyle" />
- <Key
- latin:keyLabel="%"
- latin:popupCharacters="‰" />
- <Key
- latin:keyLabel="&amp;" />
- <Key
- latin:keyLabel="*"
- latin:popupCharacters="†,‡,★" />
- <Key
- latin:keyLabel="-"
- latin:popupCharacters="_,–,—" />
- <Key
- latin:keyLabel="+"
- latin:popupCharacters="±" />
- <Key
- latin:keyLabel="("
- latin:popupCharacters="[,{,&lt;" />
- <Key
- latin:keyLabel=")"
- latin:popupCharacters="],},&gt;"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- latin:keyStyle="altKeyStyle"
- latin:keyWidth="15%p"
- latin:visualInsetsRight="1%p"
- latin:keyEdgeFlags="left" />
- <Key
- latin:keyLabel="!"
- latin:popupCharacters="¡" />
- <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
- <!-- latin:popupCharacters="“,”,„,‟,«,»" -->
- <Key
- latin:keyLabel="&quot;"
- latin:popupCharacters="“,”,«,»"
- latin:maxPopupKeyboardColumn="6" />
- <Key
- latin:keyLabel="\'"
- latin:popupCharacters="‘,’,‚,‛" />
- <Key
- latin:keyLabel=":" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_semicolon"
- latin:popupCharacters="@string/alternates_for_symbols_semicolon" />
- <Key
- latin:keyLabel="/" />
- <Key
- latin:keyLabel="@string/keylabel_for_symbols_question"
- latin:popupCharacters="@string/alternates_for_symbols_question" />
- <Key
- latin:keyStyle="deleteKeyStyle"
- latin:keyWidth="fillRight"
- latin:visualInsetsLeft="1%p"
- latin:keyEdgeFlags="right" />
- </Row>
- <include
- latin:keyboardLayout="@xml/kbd_symbols_row4" />
+ latin:keyboardLayout="@xml/kbd_rows_symbols" />
</Keyboard>
diff --git a/java/res/xml/kbd_symbols_f1.xml b/java/res/xml/kbd_symbols_f1.xml
index 3c7346c54..0dd3d9109 100644
--- a/java/res/xml/kbd_symbols_f1.xml
+++ b/java/res/xml/kbd_symbols_f1.xml
@@ -23,41 +23,40 @@
>
<switch>
<case
- latin:hasSettingsKey="true"
+ latin:hasSettingsKey="false"
+ latin:navigateAction="false"
>
<switch>
<case
- latin:hasVoiceKey="true"
+ latin:hasShortcutKey="true"
>
<Key
- latin:keyStyle="shortcutKeyStyle"
- latin:keyWidth="9.2%p" />
+ latin:keyStyle="shortcutKeyStyle" />
</case>
- <!-- latin:hasVoiceKey="false" -->
+ <!-- latin:hasShortcutKey="false" -->
<default>
<Key
- latin:keyLabel="@string/keylabel_for_symbols_comma"
- latin:popupCharacters="@string/alternates_for_symbols_comma"
- latin:keyWidth="9.2%p"
- latin:keyStyle="settingsPopupStyle" />
+ latin:keyLabel="@string/keylabel_for_f1"
+ latin:keyStyle="f1PopupStyle" />
</default>
</switch>
</case>
- <!-- hasSettingsKey="false" -->
+ <!-- hasSettingsKey="true" or navigateAction="true" -->
<default>
<switch>
<case
- latin:hasVoiceKey="true"
+ latin:hasShortcutKey="true"
>
<Key
- latin:keyStyle="shortcutKeyStyle" />
+ latin:keyStyle="shortcutKeyStyle"
+ latin:keyWidth="9.2%p" />
</case>
- <!-- latin:hasVoiceKey="false" -->
+ <!-- latin:hasShortcutKey="false" -->
<default>
<Key
- latin:keyLabel="@string/keylabel_for_symbols_comma"
- latin:popupCharacters="@string/alternates_for_symbols_comma"
- latin:keyStyle="settingsPopupStyle" />
+ latin:keyLabel="@string/keylabel_for_f1"
+ latin:keyWidth="9.2%p"
+ latin:keyStyle="f1PopupStyle" />
</default>
</switch>
</default>
diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml
index 24313acb5..864cf2b8e 100644
--- a/java/res/xml/kbd_symbols_row4.xml
+++ b/java/res/xml/kbd_symbols_row4.xml
@@ -23,57 +23,44 @@
>
<Row
latin:keyWidth="10%p"
- latin:rowEdgeFlags="bottom"
>
<switch>
<case
- latin:hasSettingsKey="true"
+ latin:hasSettingsKey="false"
+ latin:navigateAction="false"
>
<Key
latin:keyStyle="toAlphaKeyStyle"
- latin:keyWidth="13.75%p"
- latin:keyEdgeFlags="left" />
- <Key
- latin:keyStyle="settingsKeyStyle"
- latin:keyWidth="9.2%p" />
+ latin:keyWidth="15%p" />
<include
- latin:keyboardLayout="@xml/kbd_qwerty_f1" />
+ latin:keyboardLayout="@xml/kbd_symbols_f1" />
<Key
latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="35.83%p" />
+ latin:keyWidth="50%p" />
<Key
- latin:keyStyle="basePunctuationKeyStyle"
- latin:keyWidth="9.2%p" />
+ latin:keyStyle="punctuationKeyStyle" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="fillRight" />
</case>
- <!-- latin:hasSettingsKey="false" -->
+ <!-- hasSettingsKey="true" or navigateAction="true" -->
<default>
<Key
latin:keyStyle="toAlphaKeyStyle"
- latin:keyWidth="15%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="13.75%p" />
<include
- latin:keyboardLayout="@xml/kbd_symbols_f1" />
+ latin:keyboardLayout="@xml/kbd_settings_or_tab" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f1" />
<Key
latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="50%p" />
- <Key
- latin:keyStyle="basePunctuationKeyStyle" />
- </default>
- </switch>
- <switch>
- <case
- latin:mode="im"
- >
+ latin:keyWidth="35.83%p" />
<Key
- latin:keyStyle="smileyKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
- </case>
- <default>
+ latin:keyStyle="punctuationKeyStyle"
+ latin:keyWidth="9.2%p" />
<Key
latin:keyStyle="returnKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</default>
</switch>
</Row>
diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml
index f22d45aff..9c163d694 100644
--- a/java/res/xml/kbd_symbols_shift.xml
+++ b/java/res/xml/kbd_symbols_shift.xml
@@ -1,127 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-/*
+/*
**
** Copyright 2008, 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
+** 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
+** 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
+** 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.
*/
-->
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
- latin:keyWidth="10%p"
>
<include
- latin:keyboardLayout="@xml/kbd_key_styles" />
- <Row
- latin:rowEdgeFlags="top"
- >
- <Key
- latin:keyLabel="~"
- latin:keyEdgeFlags="left" />
- <Key
- latin:keyLabel="`" />
- <Key
- latin:keyLabel="|" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="•"
- latin:popupCharacters="♪,♥,♠,♦,♣" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="√" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="π"
- latin:popupCharacters="Π" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="÷" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="×" />
- <Key
- latin:keyLabel="{" />
- <Key
- latin:keyLabel="}"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- latin:keyStyle="nonSpecialBackgroundTabKeyStyle"
- latin:keyEdgeFlags="left" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="£" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="¢" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="€" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="°"
- latin:popupCharacters="′,″" />
- <Key
- latin:keyLabel="^"
- latin:popupCharacters="↑,↓,←,→" />
- <Key
- latin:keyLabel="_" />
- <Key
- latin:keyLabel="="
- latin:popupCharacters="≠,≈,∞" />
- <Key
- latin:keyLabel="[" />
- <Key
- latin:keyLabel="]"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- latin:keyStyle="shiftKeyStyle"
- latin:keyWidth="15%p"
- latin:visualInsetsRight="1%p"
- latin:keyEdgeFlags="left" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="™" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="®" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="©" />
- <Key
- latin:keyStyle="nonPasswordSymbolKeyStyle"
- latin:keyLabel="¶"
- latin:popupCharacters="§" />
- <Key
- latin:keyLabel="\\" />
- <Key
- latin:keyLabel="&lt;"
- latin:popupCharacters="≤,«,‹" />
- <Key
- latin:keyLabel="&gt;"
- latin:popupCharacters="≥,»,›" />
- <Key
- latin:keyStyle="deleteKeyStyle"
- latin:keyWidth="fillRight"
- latin:visualInsetsLeft="1%p"
- latin:keyEdgeFlags="right" />
- </Row>
- <include latin:keyboardLayout="@xml/kbd_symbols_shift_row4" />
+ latin:keyboardLayout="@xml/kbd_rows_symbols_shift" />
</Keyboard>
diff --git a/java/res/xml/kbd_symbols_shift_row4.xml b/java/res/xml/kbd_symbols_shift_row4.xml
index 90a96e4bc..9cb453fbc 100644
--- a/java/res/xml/kbd_symbols_shift_row4.xml
+++ b/java/res/xml/kbd_symbols_shift_row4.xml
@@ -23,64 +23,51 @@
>
<Row
latin:keyWidth="10%p"
- latin:rowEdgeFlags="bottom"
>
<switch>
<case
- latin:hasSettingsKey="true"
+ latin:hasSettingsKey="false"
+ latin:navigateAction="false"
>
<Key
latin:keyStyle="toAlphaKeyStyle"
- latin:keyWidth="13.75%p"
- latin:keyEdgeFlags="left" />
- <Key
- latin:keyStyle="settingsKeyStyle"
- latin:keyWidth="9.2%p" />
+ latin:keyWidth="15%p" />
<Key
latin:keyLabel="„"
latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛"
- latin:keyWidth="9.2%p"
latin:keyStyle="nonPasswordFunctionalKeyStyle" />
<Key
latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="35.83%p" />
+ latin:keyWidth="50%p" />
<Key
latin:keyLabel="…"
- latin:keyWidth="9.2%p"
latin:keyStyle="nonPasswordFunctionalKeyStyle" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="fillRight" />
</case>
- <!-- latin:hasSettingsKey="false" -->
+ <!-- hasSettingsKey="true" or navigateAction="true" -->
<default>
<Key
latin:keyStyle="toAlphaKeyStyle"
- latin:keyWidth="15%p"
- latin:keyEdgeFlags="left" />
+ latin:keyWidth="13.75%p" />
+ <include
+ latin:keyboardLayout="@xml/kbd_settings_or_tab" />
<Key
latin:keyLabel="„"
latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛"
+ latin:keyWidth="9.2%p"
latin:keyStyle="nonPasswordFunctionalKeyStyle" />
<Key
latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="50%p" />
+ latin:keyWidth="35.83%p" />
<Key
latin:keyLabel="…"
+ latin:keyWidth="9.2%p"
latin:keyStyle="nonPasswordFunctionalKeyStyle" />
- </default>
- </switch>
- <switch>
- <case
- latin:mode="im"
- >
- <Key
- latin:keyStyle="smileyKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
- </case>
- <default>
<Key
latin:keyStyle="returnKeyStyle"
- latin:keyWidth="fillRight"
- latin:keyEdgeFlags="right" />
+ latin:keyWidth="fillRight" />
</default>
</switch>
</Row>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index 7aaf57b47..fbbc7fbce 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -3,16 +3,16 @@
/**
* Copyright (c) 2008, 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
+ * 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
+ * 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
+ * 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.
*/
-->
@@ -24,237 +24,132 @@
<!-- Voice: af, cs, da, de, en, es, fr, it, ja, ko, nl, pl, pt, ru, tr, yue, zh, zu -->
<!-- TODO: use <lang>_keyboard icon instead of a common keyboard icon. -->
<!-- TODO: use <lang>_mic icon instead of a common mic icon. -->
-<!-- TODO: remove all comment outed voice subtypes -->
<!-- If IME doesn't have an applicable subtype, the first subtype will be used as a default
subtype.-->
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.android.inputmethod.latin.Settings"
android:isDefault="@bool/im_is_default">
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_en_US_keyboard"
+ android:label="@string/subtype_en_US"
android:imeSubtypeLocale="en_US"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="TrySuppressingImeSwitcher"
/>
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_en_voice" -->
-<!-- android:imeSubtypeLocale="en" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_en_GB_keyboard"
+ android:label="@string/subtype_en_GB"
android:imeSubtypeLocale="en_GB"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="TrySuppressingImeSwitcher"
/>
- <!-- The file for Arabic layout is an alpha version. It needs to be run through UX. -->
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_ar_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="ar"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_cs_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="cs"
android:imeSubtypeMode="keyboard"
/>
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_cs_voice" -->
-<!-- android:imeSubtypeLocale="cs" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_da_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="da"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_de_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="de"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_de_qwerty_keyboard"
+ android:label="@string/subtype_de_qwerty"
android:imeSubtypeLocale="de_ZZ"
android:imeSubtypeMode="keyboard"
/>
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_de_voice" -->
-<!-- android:imeSubtypeLocale="de" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_es_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="es"
android:imeSubtypeMode="keyboard"
/>
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_es_voice" -->
-<!-- android:imeSubtypeLocale="es" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_fi_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="fi"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_fr_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="fr"
android:imeSubtypeMode="keyboard"
/>
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_fr_voice" -->
-<!-- android:imeSubtypeLocale="fr" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_fr_CA_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="fr_CA"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_fr_CH_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="fr_CH"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_hr_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="hr"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_hu_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="hu"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_it_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="it"
android:imeSubtypeMode="keyboard"
/>
<!-- Java uses the deprecated "iw" code instead of the standard "he" code for Hebrew. -->
- <!-- The file for Hebrew layout is an alpha version. It needs to be run through UX. -->
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_iw_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="iw"
android:imeSubtypeMode="keyboard"
/>
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_it_voice" -->
-<!-- android:imeSubtypeLocale="it" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_nb_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="nb"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_nl_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="nl"
android:imeSubtypeMode="keyboard"
/>
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_nl_voice" -->
-<!-- android:imeSubtypeLocale="nl" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_pl_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="pl"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_pt_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="pt"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_ru_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="ru"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_sr_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="sr"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_sv_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="sv"
android:imeSubtypeMode="keyboard"
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
- android:label="@string/subtype_mode_tr_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="tr"
android:imeSubtypeMode="keyboard"
/>
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_af_voice" -->
-<!-- android:imeSubtypeLocale="af" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_ja_voice" -->
-<!-- android:imeSubtypeLocale="ja" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_ko_voice" -->
-<!-- android:imeSubtypeLocale="ko" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_pl_voice" -->
-<!-- android:imeSubtypeLocale="pl" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_pt_voice" -->
-<!-- android:imeSubtypeLocale="pt" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_ru_voice" -->
-<!-- android:imeSubtypeLocale="ru" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_tr_voice" -->
-<!-- android:imeSubtypeLocale="tr" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_yue_voice" -->
-<!-- android:imeSubtypeLocale="yue" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_zh_voice" -->
-<!-- android:imeSubtypeLocale="zh" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
-<!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
-<!-- android:label="@string/subtype_mode_zu_voice" -->
-<!-- android:imeSubtypeLocale="zu" -->
-<!-- android:imeSubtypeMode="voice" -->
-<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" -->
-<!-- /> -->
</input-method>
diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml
index 0bf117b30..552e3cf4f 100644
--- a/java/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -49,13 +49,11 @@
android:summary="@string/prefs_enable_recorrection_summary"
android:persistent="true"
android:defaultValue="@bool/config_default_recorrection_enabled" />
- <ListPreference
- android:key="settings_key"
+ <CheckBoxPreference
+ android:key="show_settings_key"
android:title="@string/prefs_settings_key"
android:persistent="true"
- android:entryValues="@array/settings_key_modes_values"
- android:entries="@array/settings_key_modes"
- android:defaultValue="@string/settings_key_mode_auto" />
+ android:defaultValue="false" />
<ListPreference
android:key="voice_mode"
android:title="@string/voice_input"
@@ -73,14 +71,8 @@
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.google.android.inputmethod.latin.dictionarypack"
- android:targetClass="com.google.android.inputmethod.latin.dictionarypack.DictionarySettings" />
+ android:targetClass="com.google.android.inputmethod.latin.dictionarypack.DictionarySettingsActivity" />
</PreferenceScreen>
- <CheckBoxPreference
- android:key="quick_fixes"
- android:title="@string/quick_fixes"
- android:summary="@string/quick_fixes_summary"
- android:persistent="true"
- android:defaultValue="true" />
<ListPreference
android:key="auto_correction_threshold"
android:title="@string/auto_correction"
diff --git a/java/res/xml/prefs_for_debug.xml b/java/res/xml/prefs_for_debug.xml
index 477461df4..2dad17148 100644
--- a/java/res/xml/prefs_for_debug.xml
+++ b/java/res/xml/prefs_for_debug.xml
@@ -36,13 +36,6 @@
/>
<CheckBoxPreference
- android:key="use_spacebar_language_switch"
- android:title="@string/prefs_use_spacebar_language_switch"
- android:persistent="true"
- android:defaultValue="false"
- />
-
- <CheckBoxPreference
android:key="debug_mode"
android:title="@string/prefs_debug_mode"
android:persistent="true"
diff --git a/java/res/xml/spellchecker.xml b/java/res/xml/spellchecker.xml
new file mode 100644
index 000000000..ce09264ce
--- /dev/null
+++ b/java/res/xml/spellchecker.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2011, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<!-- The attributes in this XML file provide the configuration information -->
+<!-- for the spell checker -->
+
+<spell-checker xmlns:android="http://schemas.android.com/apk/res/android"
+ android:label="@string/spell_checker_service_name">
+ <subtype
+ android:label="@string/subtype_en_US"
+ android:subtypeLocale="en_US"
+ />
+ <subtype
+ android:label="@string/subtype_en_GB"
+ android:subtypeLocale="en_GB"
+ />
+</spell-checker>
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
index ae614b7e0..7e71b5f36 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
@@ -16,7 +16,6 @@
package com.android.inputmethod.accessibility;
-import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.Context;
import android.content.SharedPreferences;
import android.inputmethodservice.InputMethodService;
@@ -82,10 +81,8 @@ public class AccessibilityUtils {
*/
public boolean isTouchExplorationEnabled() {
return ENABLE_ACCESSIBILITY
- && AccessibilityEventCompatUtils.supportsTouchExploration()
&& mAccessibilityManager.isEnabled()
- && !mCompatManager.getEnabledAccessibilityServiceList(
- AccessibilityServiceInfo.FEEDBACK_SPOKEN).isEmpty();
+ && mCompatManager.isTouchExplorationEnabled();
}
/**
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleInputMethodServiceProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleInputMethodServiceProxy.java
index 89adc15f2..4ab9cb898 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibleInputMethodServiceProxy.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibleInputMethodServiceProxy.java
@@ -47,6 +47,8 @@ public class AccessibleInputMethodServiceProxy implements AccessibleKeyboardActi
*/
private static final long VIBRATE_KEY_CLICK = 50;
+ private static final float FX_VOLUME = -1.0f;
+
private InputMethodService mInputMethod;
private Vibrator mVibrator;
private AudioManager mAudioManager;
@@ -143,7 +145,7 @@ public class AccessibleInputMethodServiceProxy implements AccessibleKeyboardActi
*/
private void sendDownUpKeyEvents(int keyCode) {
mVibrator.vibrate(VIBRATE_KEY_CLICK);
- mAudioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
+ mAudioManager.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD, FX_VOLUME);
mInputMethod.sendDownUpKeyEvents(keyCode);
}
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
index 8ca834148..ae9809e56 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
@@ -105,28 +105,19 @@ public class AccessibleKeyboardViewProxy {
}
/**
- * Receives hover events when accessibility is turned on in API > 11. In
- * earlier API levels, events are manually routed from onTouchEvent.
+ * Receives hover events when accessibility is turned on in SDK versions ICS
+ * and higher.
*
* @param event The hover event.
* @return {@code true} if the event is handled
*/
- public boolean onHoverEvent(MotionEvent event, PointerTracker tracker) {
+ public boolean dispatchHoverEvent(MotionEvent event, PointerTracker tracker) {
if (mGestureDetector.onHoverEvent(event, this, tracker))
return true;
return onHoverEventInternal(event, tracker);
}
- public boolean dispatchTouchEvent(MotionEvent event) {
- // Since touch exploration translates hover double-tap to a regular
- // single-tap, we're going to drop non-touch exploration events.
- if (!AccessibilityUtils.getInstance().isTouchExplorationEvent(event))
- return true;
-
- return false;
- }
-
/**
* Handles touch exploration events when Accessibility is turned on.
*
diff --git a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
index d196c8955..ec4287dda 100644
--- a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
+++ b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
@@ -164,7 +164,7 @@ public class KeyCodeDescriptionMapper {
return context.getString(R.string.spoken_description_to_symbol);
} else if (id.isSymbolsKeyboard()) {
return context.getString(R.string.spoken_description_to_alpha);
- } else if (id.isPhoneSymbolsKeyboard()) {
+ } else if (id.isPhoneShiftKeyboard()) {
return context.getString(R.string.spoken_description_to_numeric);
} else if (id.isPhoneKeyboard()) {
return context.getString(R.string.spoken_description_to_symbol);
diff --git a/java/src/com/android/inputmethod/compat/AccessibilityEventCompatUtils.java b/java/src/com/android/inputmethod/compat/AccessibilityEventCompatUtils.java
index 50057727a..2fa9d87d8 100644
--- a/java/src/com/android/inputmethod/compat/AccessibilityEventCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/AccessibilityEventCompatUtils.java
@@ -16,24 +16,7 @@
package com.android.inputmethod.compat;
-import android.view.accessibility.AccessibilityEvent;
-
-import java.lang.reflect.Field;
-
public class AccessibilityEventCompatUtils {
public static final int TYPE_VIEW_HOVER_ENTER = 0x80;
public static final int TYPE_VIEW_HOVER_EXIT = 0x100;
-
- private static final Field FIELD_TYPE_VIEW_HOVER_ENTER = CompatUtils.getField(
- AccessibilityEvent.class, "TYPE_VIEW_HOVER_ENTER");
- private static final Field FIELD_TYPE_VIEW_HOVER_EXIT = CompatUtils.getField(
- AccessibilityEvent.class, "TYPE_VIEW_HOVER_EXIT");
- private static final Integer OBJ_TYPE_VIEW_HOVER_ENTER = (Integer) CompatUtils
- .getFieldValue(null, null, FIELD_TYPE_VIEW_HOVER_ENTER);
- private static final Integer OBJ_TYPE_VIEW_HOVER_EXIT = (Integer) CompatUtils
- .getFieldValue(null, null, FIELD_TYPE_VIEW_HOVER_EXIT);
-
- public static boolean supportsTouchExploration() {
- return OBJ_TYPE_VIEW_HOVER_ENTER != null && OBJ_TYPE_VIEW_HOVER_EXIT != null;
- }
}
diff --git a/java/src/com/android/inputmethod/compat/AccessibilityManagerCompatWrapper.java b/java/src/com/android/inputmethod/compat/AccessibilityManagerCompatWrapper.java
index 4db1c7a24..a30af0faf 100644
--- a/java/src/com/android/inputmethod/compat/AccessibilityManagerCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/AccessibilityManagerCompatWrapper.java
@@ -16,16 +16,13 @@
package com.android.inputmethod.compat;
-import android.accessibilityservice.AccessibilityServiceInfo;
import android.view.accessibility.AccessibilityManager;
import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.List;
public class AccessibilityManagerCompatWrapper {
- private static final Method METHOD_getEnabledAccessibilityServiceList = CompatUtils.getMethod(
- AccessibilityManager.class, "getEnabledAccessibilityServiceList", int.class);
+ private static final Method METHOD_isTouchExplorationEnabled = CompatUtils.getMethod(
+ AccessibilityManager.class, "isTouchExplorationEnabled");
private final AccessibilityManager mManager;
@@ -33,10 +30,7 @@ public class AccessibilityManagerCompatWrapper {
mManager = manager;
}
- @SuppressWarnings("unchecked")
- public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int feedbackType) {
- return (List<AccessibilityServiceInfo>) CompatUtils.invoke(mManager,
- Collections.<AccessibilityServiceInfo>emptyList(),
- METHOD_getEnabledAccessibilityServiceList, feedbackType);
+ public boolean isTouchExplorationEnabled() {
+ return (Boolean) CompatUtils.invoke(mManager, false, METHOD_isTouchExplorationEnabled);
}
}
diff --git a/java/src/com/android/inputmethod/compat/InputMethodInfoCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodInfoCompatWrapper.java
index 8e22bbc79..831559809 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodInfoCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodInfoCompatWrapper.java
@@ -16,6 +16,7 @@
package com.android.inputmethod.compat;
+import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.view.inputmethod.InputMethodInfo;
@@ -56,4 +57,21 @@ public class InputMethodInfoCompatWrapper {
return new InputMethodSubtypeCompatWrapper(CompatUtils.invoke(mImi, null,
METHOD_getSubtypeAt, index));
}
+
+ public CharSequence loadLabel(PackageManager pm) {
+ return mImi.loadLabel(pm);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof InputMethodInfoCompatWrapper) {
+ return mImi.equals(((InputMethodInfoCompatWrapper)o).mImi);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return mImi.hashCode();
+ }
}
diff --git a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
index 1cc13f249..51dc4cd37 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
@@ -16,21 +16,28 @@
package com.android.inputmethod.compat;
-import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
-import com.android.inputmethod.latin.LatinIME;
-import com.android.inputmethod.latin.SubtypeSwitcher;
-import com.android.inputmethod.latin.Utils;
-
+import android.app.AlertDialog;
import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
+import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+import com.android.inputmethod.latin.Utils;
+
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@@ -72,27 +79,27 @@ public class InputMethodManagerCompatWrapper {
private static final String VOICE_MODE = "voice";
private static final String KEYBOARD_MODE = "keyboard";
+ private InputMethodServiceCompatWrapper mService;
private InputMethodManager mImm;
+ private PackageManager mPackageManager;
+ private ApplicationInfo mApplicationInfo;
private LanguageSwitcherProxy mLanguageSwitcherProxy;
private String mLatinImePackageName;
- private InputMethodManagerCompatWrapper() {
- }
-
- public static InputMethodManagerCompatWrapper getInstance(Context context) {
- if (sInstance.mImm == null) {
- sInstance.init(context);
- }
+ public static InputMethodManagerCompatWrapper getInstance() {
+ if (sInstance.mImm == null)
+ Log.w(TAG, "getInstance() is called before initialization");
return sInstance;
}
- private synchronized void init(Context context) {
- mImm = (InputMethodManager) context.getSystemService(
+ public static void init(InputMethodServiceCompatWrapper service) {
+ sInstance.mService = service;
+ sInstance.mImm = (InputMethodManager) service.getSystemService(
Context.INPUT_METHOD_SERVICE);
- if (context instanceof LatinIME) {
- mLatinImePackageName = context.getPackageName();
- }
- mLanguageSwitcherProxy = LanguageSwitcherProxy.getInstance();
+ sInstance.mLatinImePackageName = service.getPackageName();
+ sInstance.mPackageManager = service.getPackageManager();
+ sInstance.mApplicationInfo = service.getApplicationInfo();
+ sInstance.mLanguageSwitcherProxy = LanguageSwitcherProxy.getInstance();
}
public InputMethodSubtypeCompatWrapper getCurrentInputMethodSubtype() {
@@ -196,11 +203,15 @@ public class InputMethodManagerCompatWrapper {
return shortcutMap;
}
+ // We don't call this method when we switch between subtypes within this IME.
public void setInputMethodAndSubtype(
IBinder token, String id, InputMethodSubtypeCompatWrapper subtype) {
+ // TODO: Support subtype change on non-subtype-supported platform.
if (subtype != null && subtype.hasOriginalObject()) {
CompatUtils.invoke(mImm, null, METHOD_setInputMethodAndSubtype,
token, id, subtype.getOriginalObject());
+ } else {
+ mImm.setInputMethod(token, id);
}
}
@@ -222,6 +233,87 @@ public class InputMethodManagerCompatWrapper {
public void showInputMethodPicker() {
if (mImm == null) return;
- mImm.showInputMethodPicker();
+ if (SUBTYPE_SUPPORTED) {
+ mImm.showInputMethodPicker();
+ return;
+ }
+
+ // The code below are based on {@link InputMethodManager#showInputMethodMenuInternal}.
+
+ final InputMethodInfoCompatWrapper myImi = Utils.getInputMethodInfo(
+ this, mLatinImePackageName);
+ final List<InputMethodSubtypeCompatWrapper> myImsList = getEnabledInputMethodSubtypeList(
+ myImi, true);
+ final InputMethodSubtypeCompatWrapper currentIms = getCurrentInputMethodSubtype();
+ final List<InputMethodInfoCompatWrapper> imiList = getEnabledInputMethodList();
+ imiList.remove(myImi);
+ Collections.sort(imiList, new Comparator<InputMethodInfoCompatWrapper>() {
+ @Override
+ public int compare(InputMethodInfoCompatWrapper imi1,
+ InputMethodInfoCompatWrapper imi2) {
+ final CharSequence imiId1 = imi1.loadLabel(mPackageManager) + "/" + imi1.getId();
+ final CharSequence imiId2 = imi2.loadLabel(mPackageManager) + "/" + imi2.getId();
+ return imiId1.toString().compareTo(imiId2.toString());
+ }
+ });
+
+ final int myImsCount = myImsList.size();
+ final int imiCount = imiList.size();
+ final CharSequence[] items = new CharSequence[myImsCount + imiCount];
+
+ int checkedItem = 0;
+ int index = 0;
+ final CharSequence myImiLabel = myImi.loadLabel(mPackageManager);
+ for (int i = 0; i < myImsCount; i++) {
+ InputMethodSubtypeCompatWrapper ims = myImsList.get(i);
+ if (currentIms.equals(ims))
+ checkedItem = index;
+ final CharSequence title = TextUtils.concat(
+ ims.getDisplayName(mService, mLatinImePackageName, mApplicationInfo),
+ " (" + myImiLabel, ")");
+ items[index] = title;
+ index++;
+ }
+
+ for (int i = 0; i < imiCount; i++) {
+ final InputMethodInfoCompatWrapper imi = imiList.get(i);
+ final CharSequence title = imi.loadLabel(mPackageManager);
+ items[index] = title;
+ index++;
+ }
+
+ final OnClickListener buttonListener = new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface di, int whichButton) {
+ final Intent intent = new Intent("android.settings.INPUT_METHOD_SETTINGS");
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mService.startActivity(intent);
+ }
+ };
+ final InputMethodServiceCompatWrapper service = mService;
+ final IBinder token = service.getWindow().getWindow().getAttributes().token;
+ final OnClickListener selectionListener = new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface di, int which) {
+ di.dismiss();
+ if (which < myImsCount) {
+ final int imsIndex = which;
+ final InputMethodSubtypeCompatWrapper ims = myImsList.get(imsIndex);
+ service.notifyOnCurrentInputMethodSubtypeChanged(ims);
+ } else {
+ final int imiIndex = which - myImsCount;
+ final InputMethodInfoCompatWrapper imi = imiList.get(imiIndex);
+ setInputMethodAndSubtype(token, imi.getId(), null);
+ }
+ }
+ };
+
+ final AlertDialog.Builder builder = new AlertDialog.Builder(mService)
+ .setTitle(mService.getString(R.string.selectInputMethod))
+ .setNeutralButton(R.string.configure_input_method, buttonListener)
+ .setSingleChoiceItems(items, checkedItem, selectionListener);
+ mService.showOptionDialogInternal(builder.create());
}
}
diff --git a/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java
index 7d8c745c3..7aab66d05 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java
@@ -16,10 +16,15 @@
package com.android.inputmethod.compat;
+import android.app.AlertDialog;
import android.inputmethodservice.InputMethodService;
+import android.os.IBinder;
+import android.view.Window;
+import android.view.WindowManager;
import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.latin.SubtypeSwitcher;
public class InputMethodServiceCompatWrapper extends InputMethodService {
@@ -32,10 +37,33 @@ public class InputMethodServiceCompatWrapper extends InputMethodService {
private InputMethodManagerCompatWrapper mImm;
+ // For compatibility of {@link InputMethodManager#showInputMethodPicker}.
+ // TODO: Move this variable back to LatinIME when this compatibility wrapper is removed.
+ protected AlertDialog mOptionsDialog;
+
+ public void showOptionDialogInternal(AlertDialog dialog) {
+ final IBinder windowToken = KeyboardSwitcher.getInstance().getKeyboardView()
+ .getWindowToken();
+ if (windowToken == null) return;
+
+ dialog.setCancelable(true);
+ dialog.setCanceledOnTouchOutside(true);
+
+ final Window window = dialog.getWindow();
+ final WindowManager.LayoutParams lp = window.getAttributes();
+ lp.token = windowToken;
+ lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
+ window.setAttributes(lp);
+ window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+
+ mOptionsDialog = dialog;
+ dialog.show();
+ }
+
@Override
public void onCreate() {
super.onCreate();
- mImm = InputMethodManagerCompatWrapper.getInstance(this);
+ mImm = InputMethodManagerCompatWrapper.getInstance();
}
// When the API level is 10 or previous, notifyOnCurrentInputMethodSubtypeChanged should
diff --git a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
index 667d86c42..b6b86a4a0 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
@@ -16,13 +16,16 @@
package com.android.inputmethod.compat;
-import com.android.inputmethod.latin.LatinImeLogger;
-
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.text.TextUtils;
import android.util.Log;
+import com.android.inputmethod.latin.LatinImeLogger;
+
import java.lang.reflect.Method;
import java.util.Arrays;
+import java.util.Locale;
// TODO: Override this class with the concrete implementation if we need to take care of the
// performance.
@@ -50,6 +53,9 @@ public final class InputMethodSubtypeCompatWrapper extends AbstractCompatWrapper
CompatUtils.getMethod(CLASS_InputMethodSubtype, "getExtraValueOf", String.class);
private static final Method METHOD_isAuxiliary =
CompatUtils.getMethod(CLASS_InputMethodSubtype, "isAuxiliary");
+ private static final Method METHOD_getDisplayName =
+ CompatUtils.getMethod(CLASS_InputMethodSubtype, "getDisplayName", Context.class,
+ String.class, ApplicationInfo.class);
private final int mDummyNameResId;
private final int mDummyIconResId;
@@ -122,6 +128,28 @@ public final class InputMethodSubtypeCompatWrapper extends AbstractCompatWrapper
return (Boolean)CompatUtils.invoke(mObj, false, METHOD_isAuxiliary);
}
+ public CharSequence getDisplayName(Context context, String packageName,
+ ApplicationInfo appInfo) {
+ if (mObj != null) {
+ return (CharSequence)CompatUtils.invoke(
+ mObj, "", METHOD_getDisplayName, context, packageName, appInfo);
+ }
+
+ // The code below are based on {@link InputMethodSubtype#getDisplayName}.
+
+ final Locale locale = new Locale(getLocale());
+ final String localeStr = locale.getDisplayName();
+ if (getNameResId() == 0) {
+ return localeStr;
+ }
+ final CharSequence subtypeName = context.getText(getNameResId());
+ if (!TextUtils.isEmpty(localeStr)) {
+ return String.format(subtypeName.toString(), localeStr);
+ } else {
+ return localeStr;
+ }
+ }
+
public boolean isDummy() {
return !hasOriginalObject();
}
diff --git a/java/src/com/android/inputmethod/compat/VibratorCompatWrapper.java b/java/src/com/android/inputmethod/compat/VibratorCompatWrapper.java
index 8e2a2e0b8..a6304d877 100644
--- a/java/src/com/android/inputmethod/compat/VibratorCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/VibratorCompatWrapper.java
@@ -23,7 +23,7 @@ import java.lang.reflect.Method;
public class VibratorCompatWrapper {
private static final Method METHOD_hasVibrator = CompatUtils.getMethod(Vibrator.class,
- "hasVibrator", int.class);
+ "hasVibrator");
private static final VibratorCompatWrapper sInstance = new VibratorCompatWrapper();
private Vibrator mVibrator;
diff --git a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java
index 85993ea4d..9397483ce 100644
--- a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java
+++ b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java
@@ -17,11 +17,11 @@
package com.android.inputmethod.deprecated;
import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
+import com.android.inputmethod.compat.InputMethodServiceCompatWrapper;
import com.android.inputmethod.deprecated.voice.FieldContext;
import com.android.inputmethod.deprecated.voice.Hints;
import com.android.inputmethod.deprecated.voice.SettingsUtil;
import com.android.inputmethod.deprecated.voice.VoiceInput;
-import com.android.inputmethod.deprecated.voice.VoiceInputLogger;
import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.latin.EditingUtils;
import com.android.inputmethod.latin.LatinIME;
@@ -71,7 +71,8 @@ import java.util.Map;
public class VoiceProxy implements VoiceInput.UiListener {
private static final VoiceProxy sInstance = new VoiceProxy();
- public static final boolean VOICE_INSTALLED = true;
+ public static final boolean VOICE_INSTALLED =
+ !InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED;
private static final boolean ENABLE_VOICE_BUTTON = true;
private static final String PREF_VOICE_MODE = "voice_mode";
// Whether or not the user has used voice input before (and thus, whether to show the
@@ -125,24 +126,23 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
private void initInternal(LatinIME service, SharedPreferences prefs, UIHandler h) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
mService = service;
mHandler = h;
mMinimumVoiceRecognitionViewHeightPixel = Utils.dipToPixel(
Utils.getDipScale(service), RECOGNITIONVIEW_MINIMUM_HEIGHT_DIP);
- mImm = InputMethodManagerCompatWrapper.getInstance(service);
+ mImm = InputMethodManagerCompatWrapper.getInstance();
mSubtypeSwitcher = SubtypeSwitcher.getInstance();
- if (VOICE_INSTALLED) {
- mVoiceInput = new VoiceInput(service, this);
- mHints = new Hints(service, prefs, new Hints.Display() {
- @Override
- public void showHint(int viewResource) {
- View view = LayoutInflater.from(mService).inflate(viewResource, null);
-// mService.setCandidatesView(view);
-// mService.setCandidatesViewShown(true);
- mIsShowingHint = true;
- }
- });
- }
+ mVoiceInput = new VoiceInput(service, this);
+ mHints = new Hints(service, prefs, new Hints.Display() {
+ @Override
+ public void showHint(int viewResource) {
+ View view = LayoutInflater.from(mService).inflate(viewResource, null);
+ mIsShowingHint = true;
+ }
+ });
}
private VoiceProxy() {
@@ -158,7 +158,10 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void flushVoiceInputLogs(boolean configurationChanged) {
- if (VOICE_INSTALLED && !configurationChanged) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
+ if (!configurationChanged) {
if (mAfterVoiceInput) {
mVoiceInput.flushAllTextModificationCounters();
mVoiceInput.logInputEnded();
@@ -170,6 +173,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
public void flushAndLogAllTextModificationCounters(int index, CharSequence suggestion,
String wordSeparators) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (mAfterVoiceInput && mShowingVoiceSuggestions) {
mVoiceInput.flushAllTextModificationCounters();
// send this intent AFTER logging any prior aggregated edits.
@@ -298,6 +304,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void showPunctuationHintIfNecessary() {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
InputConnection ic = mService.getCurrentInputConnection();
if (!mImmediatelyAfterVoiceInput && mAfterVoiceInput && ic != null) {
if (mHints.showPunctuationHintIfNecessary(ic)) {
@@ -308,6 +317,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void hideVoiceWindow(boolean configurationChanging) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (!configurationChanging) {
if (mAfterVoiceInput)
mVoiceInput.logInputEnded();
@@ -324,6 +336,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void setCursorAndSelection(int newSelEnd, int newSelStart) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (mAfterVoiceInput) {
mVoiceInput.setCursorPos(newSelEnd);
mVoiceInput.setSelectionSpan(newSelEnd - newSelStart);
@@ -382,7 +397,10 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public boolean logAndRevertVoiceInput() {
- if (VOICE_INSTALLED && mVoiceInputHighlighted) {
+ if (!VOICE_INSTALLED) {
+ return false;
+ }
+ if (mVoiceInputHighlighted) {
mVoiceInput.incrementTextModificationDeleteCount(
mVoiceResults.candidates.get(0).toString().length());
revertVoiceInput();
@@ -393,6 +411,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void rememberReplacedWord(CharSequence suggestion,String wordSeparators) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (mShowingVoiceSuggestions) {
// Retain the replaced word in the alternatives array.
String wordToBeReplaced = EditingUtils.getWordAtCursor(
@@ -419,6 +440,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
* @return true if an alternative was found, false otherwise.
*/
public boolean applyVoiceAlternatives(EditingUtils.SelectedWord touching) {
+ if (!VOICE_INSTALLED) {
+ return false;
+ }
// Search for result in spoken word alternatives
String selectedWord = touching.mWord.toString().trim();
if (!mWordToSuggestions.containsKey(selectedWord)) {
@@ -448,6 +472,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void handleBackspace() {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (mAfterVoiceInput) {
// Don't log delete if the user is pressing delete at
// the beginning of the text box (hence not deleting anything)
@@ -462,6 +489,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void handleCharacter() {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
commitVoiceInput();
if (mAfterVoiceInput) {
// Assume input length is 1. This assumption fails for smiley face insertions.
@@ -470,6 +500,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void handleSeparator() {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
commitVoiceInput();
if (mAfterVoiceInput){
// Assume input length is 1. This assumption fails for smiley face insertions.
@@ -478,13 +511,19 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void handleClose() {
- if (VOICE_INSTALLED & mRecognizing) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
+ if (mRecognizing) {
mVoiceInput.cancel();
}
}
public void handleVoiceResults(boolean capitalizeFirstWord) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
mAfterVoiceInput = true;
mImmediatelyAfterVoiceInput = true;
@@ -523,6 +562,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void switchToRecognitionStatusView(final Configuration configuration) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -567,6 +609,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
private void switchToLastInputMethod() {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
final IBinder token = mService.getWindow().getWindow().getAttributes().token;
new AsyncTask<Void, Void, Boolean>() {
@Override
@@ -632,14 +677,15 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void startListening(final boolean swipe, IBinder token) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
// TODO: remove swipe which is no longer used.
- if (VOICE_INSTALLED) {
- if (needsToShowWarningDialog()) {
- // Calls reallyStartListening if user clicks OK, does nothing if user clicks Cancel.
- showVoiceWarningDialog(swipe, token);
- } else {
- reallyStartListening(swipe);
- }
+ if (needsToShowWarningDialog()) {
+ // Calls reallyStartListening if user clicks OK, does nothing if user clicks Cancel.
+ showVoiceWarningDialog(swipe, token);
+ } else {
+ reallyStartListening(swipe);
}
}
@@ -659,7 +705,14 @@ public class VoiceProxy implements VoiceInput.UiListener {
&& SpeechRecognizer.isRecognitionAvailable(mService);
}
+ public static boolean isRecognitionAvailable(Context context) {
+ return SpeechRecognizer.isRecognitionAvailable(context);
+ }
+
public void loadSettings(EditorInfo attribute, SharedPreferences sp) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false);
mHasUsedVoiceInputUnsupportedLocale =
sp.getBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, false);
@@ -667,22 +720,26 @@ public class VoiceProxy implements VoiceInput.UiListener {
mLocaleSupportedForVoiceInput = SubtypeSwitcher.getInstance().isVoiceSupported(
SubtypeSwitcher.getInstance().getInputLocaleStr());
- if (VOICE_INSTALLED) {
- final String voiceMode = sp.getString(PREF_VOICE_MODE,
- mService.getString(R.string.voice_mode_main));
- mVoiceButtonEnabled = !voiceMode.equals(mService.getString(R.string.voice_mode_off))
- && shouldShowVoiceButton(makeFieldContext(), attribute);
- mVoiceButtonOnPrimary = voiceMode.equals(mService.getString(R.string.voice_mode_main));
- }
+ final String voiceMode = sp.getString(PREF_VOICE_MODE,
+ mService.getString(R.string.voice_mode_main));
+ mVoiceButtonEnabled = !voiceMode.equals(mService.getString(R.string.voice_mode_off))
+ && shouldShowVoiceButton(makeFieldContext(), attribute);
+ mVoiceButtonOnPrimary = voiceMode.equals(mService.getString(R.string.voice_mode_main));
}
public void destroy() {
- if (VOICE_INSTALLED && mVoiceInput != null) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
+ if (mVoiceInput != null) {
mVoiceInput.destroy();
}
}
public void onStartInputView(IBinder keyboardViewToken) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
// If keyboardViewToken is null, keyboardView is not attached but voiceView is attached.
IBinder windowToken = keyboardViewToken != null ? keyboardViewToken
: mVoiceInput.getView().getWindowToken();
@@ -699,12 +756,18 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void onAttachedToWindow() {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
// After onAttachedToWindow, we can show the voice warning dialog. See startListening()
// above.
VoiceInputWrapper.getInstance().setVoiceInput(mVoiceInput, mSubtypeSwitcher);
}
public void onConfigurationChanged(Configuration configuration) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (mRecognizing) {
switchToRecognitionStatusView(configuration);
}
@@ -712,6 +775,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
@Override
public void onCancelVoice() {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (mRecognizing) {
if (mSubtypeSwitcher.isVoiceMode()) {
// If voice mode is being canceled within LatinIME (i.e. time-out or user
@@ -733,6 +799,9 @@ public class VoiceProxy implements VoiceInput.UiListener {
@Override
public void onVoiceResults(List<String> candidates,
Map<String, List<CharSequence>> alternatives) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (!mRecognizing) {
return;
}
@@ -748,59 +817,22 @@ public class VoiceProxy implements VoiceInput.UiListener {
switcher.getEnabledLanguages());
}
- private class VoiceResults {
+ // TODO: make this private (proguard issue)
+ public static class VoiceResults {
List<String> candidates;
Map<String, List<CharSequence>> alternatives;
}
- public static class VoiceLoggerWrapper {
- private static final VoiceLoggerWrapper sLoggerWrapperInstance = new VoiceLoggerWrapper();
- private VoiceInputLogger mLogger;
-
- public static VoiceLoggerWrapper getInstance(Context context) {
- if (sLoggerWrapperInstance.mLogger == null) {
- // Not thread safe, but it's ok.
- sLoggerWrapperInstance.mLogger = VoiceInputLogger.getLogger(context);
- }
- return sLoggerWrapperInstance;
- }
-
- // private for the singleton
- private VoiceLoggerWrapper() {
- }
-
- public void settingsWarningDialogCancel() {
- mLogger.settingsWarningDialogCancel();
- }
-
- public void settingsWarningDialogOk() {
- mLogger.settingsWarningDialogOk();
- }
-
- public void settingsWarningDialogShown() {
- mLogger.settingsWarningDialogShown();
- }
-
- public void settingsWarningDialogDismissed() {
- mLogger.settingsWarningDialogDismissed();
- }
-
- public void voiceInputSettingEnabled(boolean enabled) {
- if (enabled) {
- mLogger.voiceInputSettingEnabled();
- } else {
- mLogger.voiceInputSettingDisabled();
- }
- }
- }
-
public static class VoiceInputWrapper {
private static final VoiceInputWrapper sInputWrapperInstance = new VoiceInputWrapper();
private VoiceInput mVoiceInput;
public static VoiceInputWrapper getInstance() {
return sInputWrapperInstance;
}
- public void setVoiceInput(VoiceInput voiceInput, SubtypeSwitcher switcher) {
+ private void setVoiceInput(VoiceInput voiceInput, SubtypeSwitcher switcher) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (mVoiceInput == null && voiceInput != null) {
mVoiceInput = voiceInput;
}
@@ -811,10 +843,16 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
public void cancel() {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (mVoiceInput != null) mVoiceInput.cancel();
}
public void reset() {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
if (mVoiceInput != null) mVoiceInput.reset();
}
}
diff --git a/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java b/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java
index cf6cd0f5e..e75559e62 100644
--- a/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java
+++ b/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java
@@ -16,7 +16,7 @@
package com.android.inputmethod.deprecated.languageswitcher;
-import com.android.inputmethod.keyboard.internal.KeyboardParser;
+import com.android.inputmethod.keyboard.internal.KeyboardBuilder;
import com.android.inputmethod.latin.DictionaryFactory;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.Settings;
@@ -162,7 +162,7 @@ public class InputLanguageSelection extends PreferenceActivity {
try {
final String localeStr = locale.toString();
- final String[] layoutCountryCodes = KeyboardParser.parseKeyboardLocale(
+ final String[] layoutCountryCodes = KeyboardBuilder.parseKeyboardLocale(
this, R.xml.kbd_qwerty).split(",", -1);
if (!TextUtils.isEmpty(localeStr) && layoutCountryCodes.length > 0) {
for (String s : layoutCountryCodes) {
diff --git a/java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java b/java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java
index 5e6c87044..f33a46277 100644
--- a/java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java
+++ b/java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java
@@ -57,6 +57,7 @@ public class RecorrectionSuggestionEntries {
private static SuggestedWords.Builder getTypedSuggestions(
Suggest suggest, KeyboardSwitcher keyboardSwitcher, WordComposer word) {
- return suggest.getSuggestedWordBuilder(keyboardSwitcher.getKeyboardView(), word, null);
+ return suggest.getSuggestedWordBuilder(keyboardSwitcher.getKeyboardView(), word, null,
+ keyboardSwitcher.getLatinKeyboard().getProximityInfo());
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 45bf68cdf..397b7b16b 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -27,13 +27,15 @@ import android.util.Xml;
import com.android.inputmethod.keyboard.internal.KeyStyles;
import com.android.inputmethod.keyboard.internal.KeyStyles.KeyStyle;
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
-import com.android.inputmethod.keyboard.internal.KeyboardParser;
-import com.android.inputmethod.keyboard.internal.KeyboardParser.ParseException;
+import com.android.inputmethod.keyboard.internal.KeyboardParams;
+import com.android.inputmethod.keyboard.internal.KeyboardBuilder;
+import com.android.inputmethod.keyboard.internal.KeyboardBuilder.ParseException;
import com.android.inputmethod.keyboard.internal.PopupCharactersParser;
import com.android.inputmethod.keyboard.internal.Row;
import com.android.inputmethod.latin.R;
-import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
/**
* Class for describing the position and characteristics of a single key in the keyboard.
@@ -49,10 +51,10 @@ public class Key {
/** Hint label to display on the key in conjunction with the label */
public final CharSequence mHintLabel;
/** Option of the label */
- public final int mLabelOption;
- public static final int LABEL_OPTION_ALIGN_LEFT = 0x01;
- public static final int LABEL_OPTION_ALIGN_RIGHT = 0x02;
- public static final int LABEL_OPTION_ALIGN_LEFT_OF_CENTER = 0x08;
+ private final int mLabelOption;
+ private static final int LABEL_OPTION_ALIGN_LEFT = 0x01;
+ private static final int LABEL_OPTION_ALIGN_RIGHT = 0x02;
+ private static final int LABEL_OPTION_ALIGN_LEFT_OF_CENTER = 0x08;
private static final int LABEL_OPTION_LARGE_LETTER = 0x10;
private static final int LABEL_OPTION_FONT_NORMAL = 0x20;
private static final int LABEL_OPTION_FONT_MONO_SPACE = 0x40;
@@ -61,6 +63,8 @@ public class Key {
private static final int LABEL_OPTION_HAS_POPUP_HINT = 0x200;
private static final int LABEL_OPTION_HAS_UPPERCASE_LETTER = 0x400;
private static final int LABEL_OPTION_HAS_HINT_LABEL = 0x800;
+ private static final int LABEL_OPTION_WITH_ICON_LEFT = 0x1000;
+ private static final int LABEL_OPTION_WITH_ICON_RIGHT = 0x2000;
/** Icon to display instead of a label. Icon takes precedence over a label */
private Drawable mIcon;
@@ -72,7 +76,9 @@ public class Key {
/** Height of the key, not including the gap */
public final int mHeight;
/** The horizontal gap around this key */
- public final int mGap;
+ public final int mHorizontalGap;
+ /** The vertical gap below this key */
+ public final int mVerticalGap;
/** The visual insets */
public final int mVisualInsetsLeft;
public final int mVisualInsetsRight;
@@ -95,21 +101,20 @@ public class Key {
* {@link Keyboard#EDGE_LEFT}, {@link Keyboard#EDGE_RIGHT},
* {@link Keyboard#EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM}.
*/
- public final int mEdgeFlags;
+ private int mEdgeFlags;
/** Whether this is a functional key which has different key top than normal key */
public final boolean mFunctional;
/** Whether this key repeats itself when held down */
public final boolean mRepeatable;
- /** The Keyboard that this key belongs to */
- private final Keyboard mKeyboard;
-
/** The current pressed state of this key */
private boolean mPressed;
/** If this is a sticky key, is its highlight on? */
private boolean mHighlightOn;
/** Key is enabled and responds on press */
private boolean mEnabled = true;
+ /** Whether this key needs to show the "..." popup hint for special purposes */
+ private boolean mNeedsSpecialPopupHint;
// keyWidth constants
private static final int KEYWIDTH_FILL_RIGHT = 0;
@@ -153,16 +158,50 @@ public class Key {
android.R.attr.state_pressed
};
+ // RTL parenthesis character swapping map.
+ private static final Map<Integer, Integer> sRtlParenthesisMap = new HashMap<Integer, Integer>();
+
+ static {
+ // The all letters need to be mirrored are found at
+ // http://www.unicode.org/Public/6.0.0/ucd/extracted/DerivedBinaryProperties.txt
+ addRtlParenthesisPair('(', ')');
+ addRtlParenthesisPair('[', ']');
+ addRtlParenthesisPair('{', '}');
+ addRtlParenthesisPair('<', '>');
+ // \u00ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ // \u00bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ addRtlParenthesisPair('\u00ab', '\u00bb');
+ // \u2039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ // \u203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ addRtlParenthesisPair('\u2039', '\u203a');
+ // \u2264: LESS-THAN OR EQUAL TO
+ // \u2265: GREATER-THAN OR EQUAL TO
+ addRtlParenthesisPair('\u2264', '\u2265');
+ }
+
+ private static void addRtlParenthesisPair(int left, int right) {
+ sRtlParenthesisMap.put(left, right);
+ sRtlParenthesisMap.put(right, left);
+ }
+
+ public static int getRtlParenthesisCode(int code) {
+ if (sRtlParenthesisMap.containsKey(code)) {
+ return sRtlParenthesisMap.get(code);
+ } else {
+ return code;
+ }
+ }
+
/**
* This constructor is being used only for key in popup mini keyboard.
*/
- public Key(Resources res, Keyboard keyboard, CharSequence popupCharacter, int x, int y,
+ public Key(Resources res, KeyboardParams params, CharSequence popupCharacter, int x, int y,
int width, int height, int edgeFlags) {
- mKeyboard = keyboard;
- mHeight = height - keyboard.getVerticalGap();
- mGap = keyboard.getHorizontalGap();
+ mHeight = height - params.mVerticalGap;
+ mHorizontalGap = params.mHorizontalGap;
+ mVerticalGap = params.mVerticalGap;
mVisualInsetsLeft = mVisualInsetsRight = 0;
- mWidth = width - mGap;
+ mWidth = width - mHorizontalGap;
mEdgeFlags = edgeFlags;
mHintLabel = null;
mLabelOption = 0;
@@ -174,10 +213,11 @@ public class Key {
final String popupSpecification = popupCharacter.toString();
mLabel = PopupCharactersParser.getLabel(popupSpecification);
mOutputText = PopupCharactersParser.getOutputText(popupSpecification);
- mCode = PopupCharactersParser.getCode(res, popupSpecification);
- mIcon = keyboard.mIconsSet.getIcon(PopupCharactersParser.getIconId(popupSpecification));
+ final int code = PopupCharactersParser.getCode(res, popupSpecification);
+ mCode = params.mIsRtlKeyboard ? getRtlParenthesisCode(code) : code;
+ mIcon = params.mIconsSet.getIcon(PopupCharactersParser.getIconId(popupSpecification));
// Horizontal gap is divided equally to both sides of the key.
- mX = x + mGap / 2;
+ mX = x + mHorizontalGap / 2;
mY = y;
}
@@ -185,30 +225,30 @@ public class Key {
* Create a key with the given top-left coordinate and extract its attributes from the XML
* parser.
* @param res resources associated with the caller's context
- * @param row the row that this key belongs to. The row must already be attached to
- * a {@link Keyboard}.
+ * @param params the keyboard building parameters.
+ * @param row the row that this key belongs to.
* @param x the x coordinate of the top-left
* @param y the y coordinate of the top-left
* @param parser the XML parser containing the attributes for this key
* @param keyStyles active key styles set
*/
- public Key(Resources res, Row row, int x, int y, XmlResourceParser parser,
- KeyStyles keyStyles) {
- mKeyboard = row.getKeyboard();
+ public Key(Resources res, KeyboardParams params, Row row, int x, int y,
+ XmlResourceParser parser, KeyStyles keyStyles) {
final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
R.styleable.Keyboard);
int keyWidth;
try {
- mHeight = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+ mHeight = KeyboardBuilder.getDimensionOrFraction(keyboardAttr,
R.styleable.Keyboard_rowHeight,
- mKeyboard.getKeyboardHeight(), row.mDefaultHeight) - row.mVerticalGap;
- mGap = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+ params.mHeight, row.mRowHeight) - params.mVerticalGap;
+ mHorizontalGap = KeyboardBuilder.getDimensionOrFraction(keyboardAttr,
R.styleable.Keyboard_horizontalGap,
- mKeyboard.getDisplayWidth(), row.mDefaultHorizontalGap);
- keyWidth = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+ params.mWidth, params.mHorizontalGap);
+ mVerticalGap = params.mVerticalGap;
+ keyWidth = KeyboardBuilder.getDimensionOrFraction(keyboardAttr,
R.styleable.Keyboard_keyWidth,
- mKeyboard.getDisplayWidth(), row.mDefaultWidth);
+ params.mWidth, row.mDefaultKeyWidth);
} finally {
keyboardAttr.recycle();
}
@@ -226,8 +266,8 @@ public class Key {
style = keyStyles.getEmptyKeyStyle();
}
- final int keyboardWidth = mKeyboard.getDisplayWidth();
- int keyXPos = KeyboardParser.getDimensionOrFraction(keyAttr,
+ final int keyboardWidth = params.mOccupiedWidth;
+ int keyXPos = KeyboardBuilder.getDimensionOrFraction(keyAttr,
R.styleable.Keyboard_Key_keyXPos, keyboardWidth, x);
if (keyXPos < 0) {
// If keyXPos is negative, the actual x-coordinate will be k + keyXPos.
@@ -251,44 +291,52 @@ public class Key {
}
// Horizontal gap is divided equally to both sides of the key.
- mX = keyXPos + mGap / 2;
+ mX = keyXPos + mHorizontalGap / 2;
mY = y;
- mWidth = keyWidth - mGap;
+ mWidth = keyWidth - mHorizontalGap;
- final CharSequence[] popupCharacters = style.getTextArray(keyAttr,
- R.styleable.Keyboard_Key_popupCharacters);
+ CharSequence[] popupCharacters = style.getTextArray(
+ keyAttr, R.styleable.Keyboard_Key_popupCharacters);
+ if (params.mId.mPasswordInput) {
+ popupCharacters = PopupCharactersParser.filterOut(
+ res, popupCharacters, PopupCharactersParser.NON_ASCII_FILTER);
+ }
// In Arabic symbol layouts, we'd like to keep digits in popup characters regardless of
// config_digit_popup_characters_enabled.
- if (mKeyboard.mId.isAlphabetKeyboard() && !res.getBoolean(
+ if (params.mId.isAlphabetKeyboard() && !res.getBoolean(
R.bool.config_digit_popup_characters_enabled)) {
- mPopupCharacters = filterOutDigitPopupCharacters(popupCharacters);
+ mPopupCharacters = PopupCharactersParser.filterOut(
+ res, popupCharacters, PopupCharactersParser.DIGIT_FILTER);
} else {
mPopupCharacters = popupCharacters;
}
mMaxPopupColumn = style.getInt(keyboardAttr,
R.styleable.Keyboard_Key_maxPopupKeyboardColumn,
- mKeyboard.getMaxPopupKeyboardColumn());
+ params.mMaxPopupColumn);
mRepeatable = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable, false);
mFunctional = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isFunctional, false);
mSticky = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky, false);
mEnabled = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_enabled, true);
- mEdgeFlags = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyEdgeFlags, 0)
- | row.mRowEdgeFlags;
+ mEdgeFlags = 0;
- final KeyboardIconsSet iconsSet = mKeyboard.mIconsSet;
- mVisualInsetsLeft = KeyboardParser.getDimensionOrFraction(keyAttr,
+ final KeyboardIconsSet iconsSet = params.mIconsSet;
+ mVisualInsetsLeft = KeyboardBuilder.getDimensionOrFraction(keyAttr,
R.styleable.Keyboard_Key_visualInsetsLeft, keyboardWidth, 0);
- mVisualInsetsRight = KeyboardParser.getDimensionOrFraction(keyAttr,
+ mVisualInsetsRight = KeyboardBuilder.getDimensionOrFraction(keyAttr,
R.styleable.Keyboard_Key_visualInsetsRight, keyboardWidth, 0);
mPreviewIcon = iconsSet.getIcon(style.getInt(
keyAttr, R.styleable.Keyboard_Key_keyIconPreview,
KeyboardIconsSet.ICON_UNDEFINED));
- Keyboard.setDefaultBounds(mPreviewIcon);
mIcon = iconsSet.getIcon(style.getInt(
keyAttr, R.styleable.Keyboard_Key_keyIcon,
KeyboardIconsSet.ICON_UNDEFINED));
- Keyboard.setDefaultBounds(mIcon);
+ final int shiftedIconId = style.getInt(keyAttr, R.styleable.Keyboard_Key_keyIconShifted,
+ KeyboardIconsSet.ICON_UNDEFINED);
+ if (shiftedIconId != KeyboardIconsSet.ICON_UNDEFINED) {
+ final Drawable shiftedIcon = iconsSet.getIcon(shiftedIconId);
+ params.addShiftedIcon(this, shiftedIcon);
+ }
mHintLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyHintLabel);
mLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyLabel);
@@ -299,25 +347,20 @@ public class Key {
final int code = style.getInt(keyAttr, R.styleable.Keyboard_Key_code,
Keyboard.CODE_UNSPECIFIED);
if (code == Keyboard.CODE_UNSPECIFIED && !TextUtils.isEmpty(mLabel)) {
- mCode = mLabel.charAt(0);
+ final int firstChar = mLabel.charAt(0);
+ mCode = params.mIsRtlKeyboard ? getRtlParenthesisCode(firstChar) : firstChar;
} else if (code != Keyboard.CODE_UNSPECIFIED) {
mCode = code;
} else {
mCode = Keyboard.CODE_DUMMY;
}
-
- final Drawable shiftedIcon = iconsSet.getIcon(style.getInt(
- keyAttr, R.styleable.Keyboard_Key_keyIconShifted,
- KeyboardIconsSet.ICON_UNDEFINED));
- if (shiftedIcon != null)
- mKeyboard.getShiftedIcons().put(this, shiftedIcon);
} finally {
keyAttr.recycle();
}
}
- public CharSequence getCaseAdjustedLabel() {
- return mKeyboard.adjustLabelCase(mLabel);
+ public void addEdgeFlags(int flags) {
+ mEdgeFlags |= flags;
}
public Typeface selectTypeface(Typeface defaultTypeface) {
@@ -345,10 +388,30 @@ public class Key {
}
}
+ public boolean isAlignLeft() {
+ return (mLabelOption & LABEL_OPTION_ALIGN_LEFT) != 0;
+ }
+
+ public boolean isAlignRight() {
+ return (mLabelOption & LABEL_OPTION_ALIGN_RIGHT) != 0;
+ }
+
+ public boolean isAlignLeftOfCenter() {
+ return (mLabelOption & LABEL_OPTION_ALIGN_LEFT_OF_CENTER) != 0;
+ }
+
public boolean hasPopupHint() {
return (mLabelOption & LABEL_OPTION_HAS_POPUP_HINT) != 0;
}
+ public void setNeedsSpecialPopupHint(boolean needsSpecialPopupHint) {
+ mNeedsSpecialPopupHint = needsSpecialPopupHint;
+ }
+
+ public boolean needsSpecialPopupHint() {
+ return mNeedsSpecialPopupHint;
+ }
+
public boolean hasUppercaseLetter() {
return (mLabelOption & LABEL_OPTION_HAS_UPPERCASE_LETTER) != 0;
}
@@ -357,34 +420,12 @@ public class Key {
return (mLabelOption & LABEL_OPTION_HAS_HINT_LABEL) != 0;
}
- private static boolean isDigitPopupCharacter(CharSequence label) {
- return label != null && label.length() == 1 && Character.isDigit(label.charAt(0));
+ public boolean hasLabelWithIconLeft() {
+ return (mLabelOption & LABEL_OPTION_WITH_ICON_LEFT) != 0;
}
- private static CharSequence[] filterOutDigitPopupCharacters(CharSequence[] popupCharacters) {
- if (popupCharacters == null || popupCharacters.length < 1)
- return null;
- if (popupCharacters.length == 1 && isDigitPopupCharacter(
- PopupCharactersParser.getLabel(popupCharacters[0].toString())))
- return null;
- ArrayList<CharSequence> filtered = null;
- for (int i = 0; i < popupCharacters.length; i++) {
- final CharSequence popupSpec = popupCharacters[i];
- if (isDigitPopupCharacter(PopupCharactersParser.getLabel(popupSpec.toString()))) {
- if (filtered == null) {
- filtered = new ArrayList<CharSequence>();
- for (int j = 0; j < i; j++)
- filtered.add(popupCharacters[j]);
- }
- } else if (filtered != null) {
- filtered.add(popupSpec);
- }
- }
- if (filtered == null)
- return popupCharacters;
- if (filtered.size() == 0)
- return null;
- return filtered.toArray(new CharSequence[filtered.size()]);
+ public boolean hasLabelWithIconRight() {
+ return (mLabelOption & LABEL_OPTION_WITH_ICON_RIGHT) != 0;
}
public Drawable getIcon() {
@@ -441,15 +482,18 @@ public class Key {
* assume that all points between the key and the edge are considered to be on the key.
*/
public boolean isOnKey(int x, int y) {
+ final int left = mX - mHorizontalGap / 2;
+ final int right = left + mWidth + mHorizontalGap;
+ final int top = mY;
+ final int bottom = top + mHeight + mVerticalGap;
final int flags = mEdgeFlags;
+ if (flags == 0) {
+ return x >= left && x <= right && y >= top && y <= bottom;
+ }
final boolean leftEdge = (flags & Keyboard.EDGE_LEFT) != 0;
final boolean rightEdge = (flags & Keyboard.EDGE_RIGHT) != 0;
final boolean topEdge = (flags & Keyboard.EDGE_TOP) != 0;
final boolean bottomEdge = (flags & Keyboard.EDGE_BOTTOM) != 0;
- final int left = mX - mGap / 2;
- final int right = left + mWidth + mGap;
- final int top = mY;
- final int bottom = top + mHeight + mKeyboard.getVerticalGap();
// In order to mitigate rounding errors, we use (left <= x <= right) here.
return (x >= left || leftEdge) && (x <= right || rightEdge)
&& (y >= top || topEdge) && (y <= bottom || bottomEdge);
diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
index 6d25025c5..0a3acb48b 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -57,7 +57,7 @@ public class KeyDetector {
mCorrectionX = (int)correctionX;
mCorrectionY = (int)correctionY;
mKeyboard = keyboard;
- final int threshold = keyboard.getMostCommonKeyWidth();
+ final int threshold = keyboard.mMostCommonKeyWidth;
mProximityThresholdSquare = threshold * threshold;
}
@@ -153,7 +153,7 @@ public class KeyDetector {
}
private void getNearbyKeyCodes(final int[] allCodes) {
- final List<Key> keys = getKeyboard().getKeys();
+ final List<Key> keys = getKeyboard().mKeys;
final int[] indices = mIndices;
// allCodes[0] should always have the key code even if it is a non-letter key.
@@ -187,7 +187,7 @@ public class KeyDetector {
* @return The nearest key index
*/
public int getKeyIndexAndNearbyCodes(int x, int y, final int[] allCodes) {
- final List<Key> keys = getKeyboard().getKeys();
+ final List<Key> keys = getKeyboard().mKeys;
final int touchX = getTouchX(x);
final int touchY = getTouchY(y);
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 3e45793cb..f8e08b06a 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -16,25 +16,17 @@
package com.android.inputmethod.keyboard;
-import android.content.Context;
-import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
-import android.util.Log;
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
-import com.android.inputmethod.keyboard.internal.KeyboardParser;
+import com.android.inputmethod.keyboard.internal.KeyboardParams;
import com.android.inputmethod.keyboard.internal.KeyboardShiftState;
-import com.android.inputmethod.latin.R;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard
@@ -55,8 +47,6 @@ import java.util.Map;
* </pre>
*/
public class Keyboard {
- private static final String TAG = Keyboard.class.getSimpleName();
-
public static final int EDGE_LEFT = 0x01;
public static final int EDGE_RIGHT = 0x02;
public static final int EDGE_TOP = 0x04;
@@ -77,6 +67,8 @@ public class Keyboard {
public static final int CODE_CLOSING_SQUARE_BRACKET = ']';
public static final int CODE_CLOSING_CURLY_BRACKET = '}';
public static final int CODE_CLOSING_ANGLE_BRACKET = '>';
+ public static final int CODE_DIGIT0 = '0';
+ public static final int CODE_PLUS = '+';
/** Special keys code. These should be aligned with values/keycodes.xml */
@@ -87,216 +79,94 @@ public class Keyboard {
public static final int CODE_CANCEL = -4;
public static final int CODE_DELETE = -5;
public static final int CODE_SETTINGS = -6;
- public static final int CODE_SETTINGS_LONGPRESS = -7;
- public static final int CODE_SHORTCUT = -8;
+ public static final int CODE_SHORTCUT = -7;
// Code value representing the code is not specified.
public static final int CODE_UNSPECIFIED = -99;
- /** Horizontal gap default for all rows */
- private int mDefaultHorizontalGap;
-
- /** Default key width */
- private int mDefaultWidth;
-
- /** Default key height */
- private int mDefaultHeight;
-
- /** Default gap between rows */
- private int mDefaultVerticalGap;
-
- /** Popup keyboard template */
- private int mPopupKeyboardResId;
-
- /** Maximum column for popup keyboard */
- private int mMaxPopupColumn;
-
- /** List of shift keys in this keyboard and its icons and state */
- private final List<Key> mShiftKeys = new ArrayList<Key>();
- private final HashMap<Key, Drawable> mShiftedIcons = new HashMap<Key, Drawable>();
- private final HashMap<Key, Drawable> mNormalShiftIcons = new HashMap<Key, Drawable>();
- private final HashSet<Key> mShiftLockEnabled = new HashSet<Key>();
- private final KeyboardShiftState mShiftState = new KeyboardShiftState();
+ public final KeyboardId mId;
/** Total height of the keyboard, including the padding and keys */
- private int mTotalHeight;
-
- /**
- * Total width (minimum width) of the keyboard, including left side gaps and keys, but not any
- * gaps on the right side.
- */
- private int mMinWidth;
+ public final int mOccupiedHeight;
+ /** Total width of the keyboard, including the padding and keys */
+ public final int mOccupiedWidth;
- /** List of keys in this keyboard */
- private final List<Key> mKeys = new ArrayList<Key>();
+ public final int mHeight;
+ public final int mWidth;
- /** Width of the screen available to fit the keyboard */
- private final int mDisplayWidth;
+ /** Default row height */
+ public final int mDefaultRowHeight;
- /** Height of the screen */
- private final int mDisplayHeight;
+ /** Default gap between rows */
+ public final int mVerticalGap;
- /** Height of keyboard */
- private int mKeyboardHeight;
+ public final int mMostCommonKeyWidth;
- private int mMostCommonKeyWidth = 0;
+ /** Popup keyboard template */
+ public final int mPopupKeyboardResId;
- public final KeyboardId mId;
+ /** Maximum column for popup keyboard */
+ public final int mMaxPopupColumn;
- public final KeyboardIconsSet mIconsSet = new KeyboardIconsSet();
+ /** True if Right-To-Left keyboard */
+ public final boolean mIsRtlKeyboard;
- // Variables for pre-computing nearest keys.
+ /** List of keys and icons in this keyboard */
+ public final List<Key> mKeys;
+ public final List<Key> mShiftKeys;
+ public final Set<Key> mShiftLockKeys;
+ public final Map<Key, Drawable> mShiftedIcons;
+ public final Map<Key, Drawable> mUnshiftedIcons;
+ public final KeyboardIconsSet mIconsSet;
- // TODO: Change GRID_WIDTH and GRID_HEIGHT to private.
- public final int GRID_WIDTH;
- public final int GRID_HEIGHT;
+ private final KeyboardShiftState mShiftState = new KeyboardShiftState();
private final ProximityInfo mProximityInfo;
- /**
- * Creates a keyboard from the given xml key layout file.
- * @param context the application or service context
- * @param xmlLayoutResId the resource file that contains the keyboard layout and keys.
- * @param id keyboard identifier
- * @param width keyboard width
- */
+ public Keyboard(KeyboardParams params) {
+ mId = params.mId;
+ mOccupiedHeight = params.mOccupiedHeight;
+ mOccupiedWidth = params.mOccupiedWidth;
+ mHeight = params.mHeight;
+ mWidth = params.mWidth;
+ mMostCommonKeyWidth = params.mMostCommonKeyWidth;
+ mIsRtlKeyboard = params.mIsRtlKeyboard;
+ mPopupKeyboardResId = params.mPopupKeyboardResId;
+ mMaxPopupColumn = params.mMaxPopupColumn;
+
+ mDefaultRowHeight = params.mDefaultRowHeight;
+ mVerticalGap = params.mVerticalGap;
+
+ mKeys = Collections.unmodifiableList(params.mKeys);
+ mShiftKeys = Collections.unmodifiableList(params.mShiftKeys);
+ mShiftLockKeys = Collections.unmodifiableSet(params.mShiftLockKeys);
+ mShiftedIcons = Collections.unmodifiableMap(params.mShiftedIcons);
+ mUnshiftedIcons = Collections.unmodifiableMap(params.mUnshiftedIcons);
+ mIconsSet = params.mIconsSet;
- public Keyboard(Context context, int xmlLayoutResId, KeyboardId id, int width) {
- final Resources res = context.getResources();
- GRID_WIDTH = res.getInteger(R.integer.config_keyboard_grid_width);
- GRID_HEIGHT = res.getInteger(R.integer.config_keyboard_grid_height);
-
- final int horizontalEdgesPadding = (int)res.getDimension(
- R.dimen.keyboard_horizontal_edges_padding);
- mDisplayWidth = width - horizontalEdgesPadding * 2;
- // TODO: Adjust the height by referring to the height of area available for drawing as well.
- mDisplayHeight = res.getDisplayMetrics().heightPixels;
-
- mDefaultHorizontalGap = 0;
- setKeyWidth(mDisplayWidth / 10);
- mDefaultVerticalGap = 0;
- mDefaultHeight = mDefaultWidth;
- mId = id;
- loadKeyboard(context, xmlLayoutResId);
mProximityInfo = new ProximityInfo(
- GRID_WIDTH, GRID_HEIGHT, getMinWidth(), getHeight(), getKeyWidth(), mKeys);
- }
-
- public int getProximityInfo() {
- return mProximityInfo.getNativeProximityInfo();
- }
-
- public List<Key> getKeys() {
- return mKeys;
- }
-
- public int getHorizontalGap() {
- return mDefaultHorizontalGap;
- }
-
- public void setHorizontalGap(int gap) {
- mDefaultHorizontalGap = gap;
- }
-
- public int getVerticalGap() {
- return mDefaultVerticalGap;
- }
-
- public void setVerticalGap(int gap) {
- mDefaultVerticalGap = gap;
- }
-
- public int getRowHeight() {
- return mDefaultHeight;
- }
-
- public void setRowHeight(int height) {
- mDefaultHeight = height;
- }
-
- public int getKeyWidth() {
- return mDefaultWidth;
- }
-
- public void setKeyWidth(int width) {
- mDefaultWidth = width;
- }
-
- /**
- * Returns the total height of the keyboard
- * @return the total height of the keyboard
- */
- public int getHeight() {
- return mTotalHeight;
- }
-
- public void setHeight(int height) {
- mTotalHeight = height;
- }
-
- public int getMinWidth() {
- return mMinWidth;
- }
-
- public void setMinWidth(int minWidth) {
- mMinWidth = minWidth;
- }
-
- public int getDisplayHeight() {
- return mDisplayHeight;
- }
-
- public int getDisplayWidth() {
- return mDisplayWidth;
+ params.GRID_WIDTH, params.GRID_HEIGHT, mOccupiedWidth, mOccupiedHeight,
+ mMostCommonKeyWidth, mKeys);
}
- public int getKeyboardHeight() {
- return mKeyboardHeight;
+ public ProximityInfo getProximityInfo() {
+ return mProximityInfo;
}
- public void setKeyboardHeight(int height) {
- mKeyboardHeight = height;
- }
-
- public int getPopupKeyboardResId() {
- return mPopupKeyboardResId;
- }
-
- public void setPopupKeyboardResId(int resId) {
- mPopupKeyboardResId = resId;
- }
-
- public int getMaxPopupKeyboardColumn() {
- return mMaxPopupColumn;
- }
-
- public void setMaxPopupKeyboardColumn(int column) {
- mMaxPopupColumn = column;
- }
-
- public List<Key> getShiftKeys() {
- return mShiftKeys;
- }
-
- public Map<Key, Drawable> getShiftedIcons() {
- return mShiftedIcons;
- }
-
- public void enableShiftLock() {
- for (final Key key : getShiftKeys()) {
- mShiftLockEnabled.add(key);
- mNormalShiftIcons.put(key, key.getIcon());
- }
- }
-
- public boolean isShiftLockEnabled(Key key) {
- return mShiftLockEnabled.contains(key);
+ public boolean hasShiftLockKey() {
+ return !mShiftLockKeys.isEmpty();
}
public boolean setShiftLocked(boolean newShiftLockState) {
- final Map<Key, Drawable> shiftedIcons = getShiftedIcons();
- for (final Key key : getShiftKeys()) {
+ for (final Key key : mShiftLockKeys) {
+ // To represent "shift locked" state. The highlight is handled by background image that
+ // might be a StateListDrawable.
key.setHighlightOn(newShiftLockState);
- key.setIcon(newShiftLockState ? shiftedIcons.get(key) : mNormalShiftIcons.get(key));
+ // To represent "shifted" state. The key might have a shifted icon.
+ if (newShiftLockState && mShiftedIcons.containsKey(key)) {
+ key.setIcon(mShiftedIcons.get(key));
+ } else {
+ key.setIcon(mUnshiftedIcons.get(key));
+ }
}
mShiftState.setShiftLocked(newShiftLockState);
return true;
@@ -307,12 +177,11 @@ public class Keyboard {
}
public boolean setShifted(boolean newShiftState) {
- final Map<Key, Drawable> shiftedIcons = getShiftedIcons();
- for (final Key key : getShiftKeys()) {
+ for (final Key key : mShiftKeys) {
if (!newShiftState && !mShiftState.isShiftLocked()) {
- key.setIcon(mNormalShiftIcons.get(key));
+ key.setIcon(mUnshiftedIcons.get(key));
} else if (newShiftState && !mShiftState.isShiftedOrShiftLocked()) {
- key.setIcon(shiftedIcons.get(key));
+ key.setIcon(mShiftedIcons.get(key));
}
}
return mShiftState.setShifted(newShiftState);
@@ -373,61 +242,4 @@ public class Keyboard {
public int[] getNearestKeys(int x, int y) {
return mProximityInfo.getNearestKeys(x, y);
}
-
- /**
- * Compute the most common key width in order to use it as proximity key detection threshold.
- *
- * @return The most common key width in the keyboard
- */
- public int getMostCommonKeyWidth() {
- if (mMostCommonKeyWidth == 0) {
- final HashMap<Integer, Integer> histogram = new HashMap<Integer, Integer>();
- int maxCount = 0;
- int mostCommonWidth = 0;
- for (final Key key : mKeys) {
- final Integer width = key.mWidth + key.mGap;
- Integer count = histogram.get(width);
- if (count == null)
- count = 0;
- histogram.put(width, ++count);
- if (count > maxCount) {
- maxCount = count;
- mostCommonWidth = width;
- }
- }
- mMostCommonKeyWidth = mostCommonWidth;
- }
- return mMostCommonKeyWidth;
- }
-
- /**
- * Return true if spacebar needs showing preview even when "popup on keypress" is off.
- * @param keyIndex index of the pressing key
- * @return true if spacebar needs showing preview
- */
- public boolean needSpacebarPreview(int keyIndex) {
- return false;
- }
-
- private void loadKeyboard(Context context, int xmlLayoutResId) {
- try {
- KeyboardParser parser = new KeyboardParser(this, context);
- parser.parseKeyboard(xmlLayoutResId);
- // mMinWidth is the width of this keyboard which is maximum width of row.
- mMinWidth = parser.getMaxRowWidth();
- mTotalHeight = parser.getTotalHeight();
- } catch (XmlPullParserException e) {
- Log.w(TAG, "keyboard XML parse error: " + e);
- throw new IllegalArgumentException(e);
- } catch (IOException e) {
- Log.w(TAG, "keyboard XML parse error: " + e);
- throw new RuntimeException(e);
- }
- }
-
- public static void setDefaultBounds(Drawable drawable) {
- if (drawable != null)
- drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
- drawable.getIntrinsicHeight());
- }
}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
index 905f779c0..864091289 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
@@ -70,4 +70,10 @@ public interface KeyboardActionListener {
* Called when user released a finger outside any key.
*/
public void onCancelInput();
+
+ /**
+ * Send a non-"code input" custom request to the listener.
+ * @return true if the request has been consumed, false otherwise.
+ */
+ public boolean onCustomRequest(int requestCode);
}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
index b2600dd3b..d0a2f864c 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -42,8 +42,6 @@ public class KeyboardId {
public static final int F2KEY_MODE_SHORTCUT_IME = 2;
public static final int F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS = 3;
- private static final int MINI_KEYBOARD_ID_MARKER = -1;
-
public final Locale mLocale;
public final int mOrientation;
public final int mWidth;
@@ -55,10 +53,9 @@ public class KeyboardId {
public final boolean mHasSettingsKey;
public final int mF2KeyMode;
public final boolean mClobberSettingsKey;
- public final boolean mVoiceKeyEnabled;
- public final boolean mHasVoiceKey;
+ public final boolean mShortcutKeyEnabled;
+ public final boolean mHasShortcutKey;
public final int mImeAction;
- public final boolean mEnableShiftLock;
public final String mXmlName;
public final EditorInfo mAttribute;
@@ -67,8 +64,7 @@ public class KeyboardId {
public KeyboardId(String xmlName, int xmlId, Locale locale, int orientation, int width,
int mode, EditorInfo attribute, boolean hasSettingsKey, int f2KeyMode,
- boolean clobberSettingsKey, boolean voiceKeyEnabled, boolean hasVoiceKey,
- boolean enableShiftLock) {
+ boolean clobberSettingsKey, boolean shortcutKeyEnabled, boolean hasShortcutKey) {
final int inputType = (attribute != null) ? attribute.inputType : 0;
final int imeOptions = (attribute != null) ? attribute.imeOptions : 0;
this.mLocale = locale;
@@ -85,13 +81,12 @@ public class KeyboardId {
this.mHasSettingsKey = hasSettingsKey;
this.mF2KeyMode = f2KeyMode;
this.mClobberSettingsKey = clobberSettingsKey;
- this.mVoiceKeyEnabled = voiceKeyEnabled;
- this.mHasVoiceKey = hasVoiceKey;
+ this.mShortcutKeyEnabled = shortcutKeyEnabled;
+ this.mHasShortcutKey = hasShortcutKey;
// We are interested only in {@link EditorInfo#IME_MASK_ACTION} enum value and
// {@link EditorInfo#IME_FLAG_NO_ENTER_ACTION}.
this.mImeAction = imeOptions & (
EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION);
- this.mEnableShiftLock = enableShiftLock;
this.mXmlName = xmlName;
this.mAttribute = attribute;
@@ -107,40 +102,29 @@ public class KeyboardId {
hasSettingsKey,
f2KeyMode,
clobberSettingsKey,
- voiceKeyEnabled,
- hasVoiceKey,
+ shortcutKeyEnabled,
+ hasShortcutKey,
mImeAction,
- enableShiftLock,
});
}
- public KeyboardId cloneAsMiniKeyboard() {
- return new KeyboardId("mini popup keyboard", MINI_KEYBOARD_ID_MARKER, mLocale, mOrientation,
- mWidth, mMode, mAttribute, false, F2KEY_MODE_NONE, false, false, false, false);
- }
-
- public KeyboardId cloneWithNewLayout(String xmlName, int xmlId) {
+ public KeyboardId cloneWithNewXml(String xmlName, int xmlId) {
return new KeyboardId(xmlName, xmlId, mLocale, mOrientation, mWidth, mMode, mAttribute,
- mHasSettingsKey, mF2KeyMode, mClobberSettingsKey, mVoiceKeyEnabled, mHasVoiceKey,
- mEnableShiftLock);
+ false, F2KEY_MODE_NONE, false, false, false);
}
- public KeyboardId cloneWithNewGeometry(int width) {
+ public KeyboardId cloneWithNewGeometry(int orientation, int width) {
if (mWidth == width)
return this;
- return new KeyboardId(mXmlName, mXmlId, mLocale, mOrientation, width, mMode, mAttribute,
- mHasSettingsKey, mF2KeyMode, mClobberSettingsKey, mVoiceKeyEnabled, mHasVoiceKey,
- mEnableShiftLock);
+ return new KeyboardId(mXmlName, mXmlId, mLocale, orientation, width, mMode, mAttribute,
+ mHasSettingsKey, mF2KeyMode, mClobberSettingsKey, mShortcutKeyEnabled,
+ mHasShortcutKey);
}
public int getXmlId() {
return mXmlId;
}
- public boolean isMiniKeyboard() {
- return mXmlId == MINI_KEYBOARD_ID_MARKER;
- }
-
public boolean isAlphabetKeyboard() {
return mXmlId == R.xml.kbd_qwerty;
}
@@ -153,8 +137,8 @@ public class KeyboardId {
return mMode == MODE_PHONE;
}
- public boolean isPhoneSymbolsKeyboard() {
- return mXmlId == R.xml.kbd_phone_symbols;
+ public boolean isPhoneShiftKeyboard() {
+ return mXmlId == R.xml.kbd_phone_shift;
}
public boolean isNumberKeyboard() {
@@ -166,7 +150,7 @@ public class KeyboardId {
return other instanceof KeyboardId && equals((KeyboardId) other);
}
- boolean equals(KeyboardId other) {
+ private boolean equals(KeyboardId other) {
return other.mLocale.equals(this.mLocale)
&& other.mOrientation == this.mOrientation
&& other.mWidth == this.mWidth
@@ -177,10 +161,9 @@ public class KeyboardId {
&& other.mHasSettingsKey == this.mHasSettingsKey
&& other.mF2KeyMode == this.mF2KeyMode
&& other.mClobberSettingsKey == this.mClobberSettingsKey
- && other.mVoiceKeyEnabled == this.mVoiceKeyEnabled
- && other.mHasVoiceKey == this.mHasVoiceKey
- && other.mImeAction == this.mImeAction
- && other.mEnableShiftLock == this.mEnableShiftLock;
+ && other.mShortcutKeyEnabled == this.mShortcutKeyEnabled
+ && other.mHasShortcutKey == this.mHasShortcutKey
+ && other.mImeAction == this.mImeAction;
}
@Override
@@ -190,7 +173,7 @@ public class KeyboardId {
@Override
public String toString() {
- return String.format("[%s.xml %s %s%d %s %s %s%s%s%s%s%s%s%s]",
+ return String.format("[%s.xml %s %s%d %s %s %s%s%s%s%s%s%s]",
mXmlName,
mLocale,
(mOrientation == 1 ? "port" : "land"), mWidth,
@@ -201,9 +184,8 @@ public class KeyboardId {
(mNavigateAction ? " navigateAction" : ""),
(mPasswordInput ? " passwordInput" : ""),
(mHasSettingsKey ? " hasSettingsKey" : ""),
- (mVoiceKeyEnabled ? " voiceKeyEnabled" : ""),
- (mHasVoiceKey ? " hasVoiceKey" : ""),
- (mEnableShiftLock ? " enableShiftLock" : "")
+ (mShortcutKeyEnabled ? " shortcutKeyEnabled" : ""),
+ (mHasShortcutKey ? " hasShortcutKey" : "")
);
}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index bb21d7a63..811470c26 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -18,7 +18,9 @@ package com.android.inputmethod.keyboard;
import android.content.Context;
import android.content.SharedPreferences;
+import android.content.res.Configuration;
import android.content.res.Resources;
+import android.inputmethodservice.InputMethodService;
import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.InflateException;
@@ -27,7 +29,6 @@ import android.view.View;
import android.view.inputmethod.EditorInfo;
import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
-import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
import com.android.inputmethod.keyboard.internal.ModifierKeyState;
import com.android.inputmethod.keyboard.internal.ShiftKeyState;
import com.android.inputmethod.latin.LatinIME;
@@ -38,6 +39,7 @@ import com.android.inputmethod.latin.SubtypeSwitcher;
import com.android.inputmethod.latin.Utils;
import java.lang.ref.SoftReference;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
@@ -62,25 +64,29 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
private View mCurrentInputView;
private LatinKeyboardView mKeyboardView;
private LatinIME mInputMethodService;
+ private String mPackageName;
+ private Resources mResources;
// TODO: Combine these key state objects with auto mode switch state.
private ShiftKeyState mShiftKeyState = new ShiftKeyState("Shift");
private ModifierKeyState mSymbolKeyState = new ModifierKeyState("Symbol");
- private KeyboardId mSymbolsId;
- private KeyboardId mSymbolsShiftedId;
+ private KeyboardId mMainKeyboardId;
+ private KeyboardId mSymbolsKeyboardId;
+ private KeyboardId mSymbolsShiftedKeyboardId;
private KeyboardId mCurrentId;
private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboardCache =
new HashMap<KeyboardId, SoftReference<LatinKeyboard>>();
+ // TODO: Remove this cache object when {@link DisplayMetrics} has actual window width excluding
+ // system navigation bar.
+ private WindowWidthCache mWindowWidthCache;
+
+ private KeyboardLayoutState mSavedKeyboardState = new KeyboardLayoutState();
- private EditorInfo mAttribute;
- private boolean mIsSymbols;
/** mIsAutoCorrectionActive indicates that auto corrected word will be input instead of
* what user actually typed. */
private boolean mIsAutoCorrectionActive;
- private boolean mVoiceKeyEnabled;
- private boolean mVoiceButtonOnPrimary;
// TODO: Encapsulate these state handling to separate class and combine with ShiftKeyState
// and ModifierKeyState.
@@ -94,22 +100,135 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
private static final int SWITCH_STATE_CHORDING_SYMBOL = 6;
private int mSwitchState = SWITCH_STATE_ALPHA;
- // Indicates whether or not we have the settings key in option of settings
- private boolean mSettingsKeyEnabledInSettings;
- private static final int SETTINGS_KEY_MODE_AUTO = R.string.settings_key_mode_auto;
- private static final int SETTINGS_KEY_MODE_ALWAYS_SHOW =
- R.string.settings_key_mode_always_show;
- // NOTE: No need to have SETTINGS_KEY_MODE_ALWAYS_HIDE here because it's not being referred to
- // in the source code now.
- // Default is SETTINGS_KEY_MODE_AUTO.
- private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO;
-
private int mThemeIndex = -1;
private Context mThemeContext;
- private int mKeyboardWidth;
private static final KeyboardSwitcher sInstance = new KeyboardSwitcher();
+ private static class WindowWidthCache {
+ private final InputMethodService mService;
+ private final Resources mResources;
+ private final boolean mIsRegistered[] = new boolean[Configuration.ORIENTATION_SQUARE + 1];
+ private final int mWidth[] = new int[Configuration.ORIENTATION_SQUARE + 1];
+
+ public WindowWidthCache(InputMethodService service) {
+ mService = service;
+ mResources = service.getResources();
+
+ Arrays.fill(mIsRegistered, false);
+ Arrays.fill(mWidth, 0);
+ }
+
+ private int getCurrentWindowWidth() {
+ return mService.getWindow().getWindow().getDecorView().getWidth();
+ }
+
+ public int getWidth(Configuration conf) {
+ final int orientation = conf.orientation;
+ try {
+ final int width = mWidth[orientation];
+ if (mIsRegistered[orientation] || width > 0) {
+ // Return registered or cached window width for this orientation.
+ return width;
+ }
+ // Fall through
+ } catch (IndexOutOfBoundsException e) {
+ Log.w(TAG, "unknwon orientation value " + orientation);
+ // Fall through
+ }
+
+ // Return screen width as default window width.
+ return mResources.getDisplayMetrics().widthPixels;
+ }
+
+ public int getWidthOnSizeChanged(Configuration conf) {
+ final int orientation = conf.orientation;
+ try {
+ if (mIsRegistered[orientation]) {
+ // Return registered window width for this orientation.
+ return mWidth[orientation];
+ }
+
+ // Cache the current window width without registering.
+ final int width = getCurrentWindowWidth();
+ mWidth[orientation] = width;
+ return width;
+ } catch (IndexOutOfBoundsException e) {
+ Log.w(TAG, "unknwon orientation value " + orientation);
+ return 0;
+ }
+ }
+
+ public void registerWidth() {
+ final int orientation = mResources.getConfiguration().orientation;
+ try {
+ if (!mIsRegistered[orientation]) {
+ final int width = getCurrentWindowWidth();
+ if (width > 0) {
+ // Register current window width.
+ mWidth[orientation] = width;
+ mIsRegistered[orientation] = true;
+ }
+ }
+ } catch (IndexOutOfBoundsException e) {
+ Log.w(TAG, "unknwon orientation value " + orientation);
+ }
+ }
+ }
+
+ public class KeyboardLayoutState {
+ private boolean mIsValid;
+ private boolean mIsAlphabetMode;
+ private boolean mIsShiftLocked;
+ private boolean mIsShifted;
+
+ public boolean isValid() {
+ return mIsValid;
+ }
+
+ public void save() {
+ if (mCurrentId == null) {
+ return;
+ }
+ mIsAlphabetMode = isAlphabetMode();
+ if (mIsAlphabetMode) {
+ mIsShiftLocked = isShiftLocked();
+ mIsShifted = !mIsShiftLocked && isShiftedOrShiftLocked();
+ } else {
+ mIsShiftLocked = false;
+ mIsShifted = mCurrentId.equals(mSymbolsShiftedKeyboardId);
+ }
+ mIsValid = true;
+ }
+
+ public KeyboardId getKeyboardId() {
+ if (!mIsValid) return mMainKeyboardId;
+
+ if (mIsAlphabetMode) {
+ return mMainKeyboardId;
+ } else {
+ return mIsShifted ? mSymbolsShiftedKeyboardId : mSymbolsKeyboardId;
+ }
+ }
+
+ public void restore() {
+ if (!mIsValid) return;
+ mIsValid = false;
+
+ if (mIsAlphabetMode) {
+ final boolean isAlphabetMode = isAlphabetMode();
+ final boolean isShiftLocked = isAlphabetMode && isShiftLocked();
+ final boolean isShifted = !isShiftLocked && isShiftedOrShiftLocked();
+ if (mIsShiftLocked != isShiftLocked) {
+ toggleCapsLock();
+ } else if (mIsShifted != isShifted) {
+ onPressShift(false);
+ onReleaseShift(false);
+ }
+ }
+ }
+ }
+
public static KeyboardSwitcher getInstance() {
return sInstance;
}
@@ -119,11 +238,18 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
}
public static void init(LatinIME ims, SharedPreferences prefs) {
- sInstance.mInputMethodService = ims;
- sInstance.mPrefs = prefs;
- sInstance.mSubtypeSwitcher = SubtypeSwitcher.getInstance();
- sInstance.setContextThemeWrapper(ims, getKeyboardThemeIndex(ims, prefs));
- prefs.registerOnSharedPreferenceChangeListener(sInstance);
+ sInstance.initInternal(ims, prefs);
+ }
+
+ private void initInternal(LatinIME ims, SharedPreferences prefs) {
+ mInputMethodService = ims;
+ mPackageName = ims.getPackageName();
+ mResources = ims.getResources();
+ mPrefs = prefs;
+ mSubtypeSwitcher = SubtypeSwitcher.getInstance();
+ mWindowWidthCache = new WindowWidthCache(ims);
+ setContextThemeWrapper(ims, getKeyboardThemeIndex(ims, prefs));
+ prefs.registerOnSharedPreferenceChangeListener(this);
}
private static int getKeyboardThemeIndex(Context context, SharedPreferences prefs) {
@@ -148,162 +274,153 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
}
}
- public void loadKeyboard(EditorInfo attribute, boolean voiceKeyEnabled,
- boolean voiceButtonOnPrimary) {
- mSwitchState = SWITCH_STATE_ALPHA;
+ public void loadKeyboard(EditorInfo editorInfo, Settings.Values settingsValues) {
try {
- final boolean isSymbols = (mCurrentId != null) ? mCurrentId.isSymbolsKeyboard() : false;
- loadKeyboardInternal(attribute, voiceKeyEnabled, voiceButtonOnPrimary, isSymbols);
+ mMainKeyboardId = getKeyboardId(editorInfo, false, false, settingsValues);
+ mSymbolsKeyboardId = getKeyboardId(editorInfo, true, false, settingsValues);
+ mSymbolsShiftedKeyboardId = getKeyboardId(editorInfo, true, true, settingsValues);
+ setKeyboard(getKeyboard(mSavedKeyboardState.getKeyboardId()));
+ updateShiftState();
} catch (RuntimeException e) {
- // Get KeyboardId to record which keyboard has been failed to load.
- final KeyboardId id = getKeyboardId(attribute, false);
- Log.w(TAG, "loading keyboard failed: " + id, e);
- LatinImeLogger.logOnException(id.toString(), e);
+ Log.w(TAG, "loading keyboard failed: " + mMainKeyboardId, e);
+ LatinImeLogger.logOnException(mMainKeyboardId.toString(), e);
}
}
- private void loadKeyboardInternal(EditorInfo attribute, boolean voiceButtonEnabled,
- boolean voiceButtonOnPrimary, boolean isSymbols) {
- if (mKeyboardView == null) return;
+ public KeyboardLayoutState getKeyboardState() {
+ return mSavedKeyboardState;
+ }
- mAttribute = attribute;
- mVoiceKeyEnabled = voiceButtonEnabled;
- mVoiceButtonOnPrimary = voiceButtonOnPrimary;
- mIsSymbols = isSymbols;
- // Update the settings key state because number of enabled IMEs could have been changed
- mSettingsKeyEnabledInSettings = getSettingsKeyMode(mPrefs, mInputMethodService);
- final KeyboardId id = getKeyboardId(attribute, isSymbols);
+ public void onFinishInputView() {
+ mIsAutoCorrectionActive = false;
+ }
- // Note: This comment is only applied for phone number keyboard layout.
- // On non-xlarge device, "@integer/key_switch_alpha_symbol" key code is used to switch
- // between "phone keyboard" and "phone symbols keyboard". But on xlarge device,
- // "@integer/key_shift" key code is used for that purpose in order to properly display
- // "more" and "locked more" key labels. To achieve these behavior, we should initialize
- // mSymbolsId and mSymbolsShiftedId to "phone keyboard" and "phone symbols keyboard"
- // respectively here for xlarge device's layout switching.
- mSymbolsId = makeSiblingKeyboardId(id, R.xml.kbd_symbols, R.xml.kbd_phone);
- mSymbolsShiftedId = makeSiblingKeyboardId(
- id, R.xml.kbd_symbols_shift, R.xml.kbd_phone_symbols);
+ public void onHideWindow() {
+ mIsAutoCorrectionActive = false;
+ }
- setKeyboard(getKeyboard(id));
+ public void registerWindowWidth() {
+ mWindowWidthCache.registerWidth();
}
- public void onSizeChanged() {
- final int width = mInputMethodService.getWindow().getWindow().getDecorView().getWidth();
+ @SuppressWarnings("unused")
+ public void onSizeChanged(int w, int h, int oldw, int oldh) {
+ // TODO: This hack should be removed when display metric returns a proper width.
+ // Until then, the behavior of KeyboardSwitcher is suboptimal on a device that has a
+ // vertical system navigation bar in landscape screen orientation, for instance.
+ final Configuration conf = mResources.getConfiguration();
+ final int width = mWindowWidthCache.getWidthOnSizeChanged(conf);
+ // If the window width hasn't fixed yet or keyboard doesn't exist, nothing to do with.
if (width == 0 || mCurrentId == null)
return;
- mKeyboardWidth = width;
- // Set keyboard with new width.
- final KeyboardId newId = mCurrentId.cloneWithNewGeometry(width);
+ // Reload keyboard with new width.
+ final KeyboardId newId = mCurrentId.cloneWithNewGeometry(conf.orientation, width);
+ mInputMethodService.mHandler.postRestoreKeyboardLayout();
setKeyboard(getKeyboard(newId));
}
- private void setKeyboard(final Keyboard newKeyboard) {
+ private void setKeyboard(final Keyboard keyboard) {
final Keyboard oldKeyboard = mKeyboardView.getKeyboard();
- mKeyboardView.setKeyboard(newKeyboard);
- mCurrentId = newKeyboard.mId;
- final Resources res = mInputMethodService.getResources();
+ mKeyboardView.setKeyboard(keyboard);
+ mCurrentId = keyboard.mId;
+ mSwitchState = getSwitchState(mCurrentId);
+ updateShiftLockState(keyboard);
mKeyboardView.setKeyPreviewPopupEnabled(
- Settings.Values.isKeyPreviewPopupEnabled(mPrefs, res),
- Settings.Values.getKeyPreviewPopupDismissDelay(mPrefs, res));
+ Settings.Values.isKeyPreviewPopupEnabled(mPrefs, mResources),
+ Settings.Values.getKeyPreviewPopupDismissDelay(mPrefs, mResources));
final boolean localeChanged = (oldKeyboard == null)
- || !newKeyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
+ || !keyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
mInputMethodService.mHandler.startDisplayLanguageOnSpacebar(localeChanged);
}
+ private int getSwitchState(KeyboardId id) {
+ return id.equals(mMainKeyboardId) ? SWITCH_STATE_ALPHA : SWITCH_STATE_SYMBOL_BEGIN;
+ }
+
+ private void updateShiftLockState(Keyboard keyboard) {
+ if (mCurrentId.equals(mSymbolsShiftedKeyboardId)) {
+ // Symbol keyboard may have an ALT key that has a caps lock style indicator (a.k.a.
+ // sticky shift key). To show or dismiss the indicator, we need to call setShiftLocked()
+ // that takes care of the current keyboard having such ALT key or not.
+ keyboard.setShiftLocked(keyboard.hasShiftLockKey());
+ } else if (mCurrentId.equals(mSymbolsKeyboardId)) {
+ // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the
+ // indicator, we need to call setShiftLocked(false).
+ keyboard.setShiftLocked(false);
+ }
+ }
+
private LatinKeyboard getKeyboard(KeyboardId id) {
final SoftReference<LatinKeyboard> ref = mKeyboardCache.get(id);
LatinKeyboard keyboard = (ref == null) ? null : ref.get();
if (keyboard == null) {
- final Resources res = mInputMethodService.getResources();
- final Locale savedLocale = Utils.setSystemLocale(res,
- mSubtypeSwitcher.getInputLocale());
-
- keyboard = new LatinKeyboard(mThemeContext, id, id.mWidth);
-
- if (id.mEnableShiftLock) {
- keyboard.enableShiftLock();
+ final Locale savedLocale = Utils.setSystemLocale(
+ mResources, mSubtypeSwitcher.getInputLocale());
+ try {
+ keyboard = new LatinKeyboard.Builder(mThemeContext).load(id).build();
+ } finally {
+ Utils.setSystemLocale(mResources, savedLocale);
}
-
mKeyboardCache.put(id, new SoftReference<LatinKeyboard>(keyboard));
- if (DEBUG_CACHE)
+
+ if (DEBUG_CACHE) {
Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": "
+ ((ref == null) ? "LOAD" : "GCed") + " id=" + id);
-
- Utils.setSystemLocale(res, savedLocale);
+ }
} else if (DEBUG_CACHE) {
Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": HIT id=" + id);
}
keyboard.onAutoCorrectionStateChanged(mIsAutoCorrectionActive);
+ keyboard.setShiftLocked(false);
keyboard.setShifted(false);
// If the cached keyboard had been switched to another keyboard while the language was
// displayed on its spacebar, it might have had arbitrary text fade factor. In such case,
// we should reset the text fade factor. It is also applicable to shortcut key.
keyboard.setSpacebarTextFadeFactor(0.0f, null);
keyboard.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady(), null);
- keyboard.setSpacebarSlidingLanguageSwitchDiff(0);
return keyboard;
}
- private boolean hasVoiceKey(boolean isSymbols) {
- return mVoiceKeyEnabled && (isSymbols != mVoiceButtonOnPrimary);
- }
-
- private boolean hasSettingsKey(EditorInfo attribute) {
- return mSettingsKeyEnabledInSettings
- && !Utils.inPrivateImeOptions(mInputMethodService.getPackageName(),
- LatinIME.IME_OPTION_NO_SETTINGS_KEY, attribute);
- }
-
- private KeyboardId getKeyboardId(EditorInfo attribute, boolean isSymbols) {
- final int mode = Utils.getKeyboardMode(attribute);
- final boolean hasVoiceKey = hasVoiceKey(isSymbols);
+ private KeyboardId getKeyboardId(EditorInfo editorInfo, final boolean isSymbols,
+ final boolean isShift, Settings.Values settingsValues) {
+ final int mode = Utils.getKeyboardMode(editorInfo);
final int xmlId;
- final boolean enableShiftLock;
-
- if (isSymbols) {
- if (mode == KeyboardId.MODE_PHONE) {
- xmlId = R.xml.kbd_phone_symbols;
- } else if (mode == KeyboardId.MODE_NUMBER) {
- // Note: MODE_NUMBER keyboard layout has no "switch alpha symbol" key.
- xmlId = R.xml.kbd_number;
- } else {
- xmlId = R.xml.kbd_symbols;
- }
- enableShiftLock = false;
- } else {
- if (mode == KeyboardId.MODE_PHONE) {
- xmlId = R.xml.kbd_phone;
- enableShiftLock = false;
- } else if (mode == KeyboardId.MODE_NUMBER) {
- xmlId = R.xml.kbd_number;
- enableShiftLock = false;
+ switch (mode) {
+ case KeyboardId.MODE_PHONE:
+ xmlId = (isSymbols && isShift) ? R.xml.kbd_phone_shift : R.xml.kbd_phone;
+ break;
+ case KeyboardId.MODE_NUMBER:
+ xmlId = R.xml.kbd_number;
+ break;
+ default:
+ if (isSymbols) {
+ xmlId = isShift ? R.xml.kbd_symbols_shift : R.xml.kbd_symbols;
} else {
xmlId = R.xml.kbd_qwerty;
- enableShiftLock = true;
}
+ break;
}
- final boolean hasSettingsKey = hasSettingsKey(attribute);
- final int f2KeyMode = getF2KeyMode(mPrefs, mInputMethodService, attribute);
- final boolean clobberSettingsKey = Utils.inPrivateImeOptions(
- mInputMethodService.getPackageName(), LatinIME.IME_OPTION_NO_SETTINGS_KEY,
- attribute);
- final Resources res = mInputMethodService.getResources();
- final int orientation = res.getConfiguration().orientation;
- if (mKeyboardWidth == 0)
- mKeyboardWidth = res.getDisplayMetrics().widthPixels;
- final Locale locale = mSubtypeSwitcher.getInputLocale();
- return new KeyboardId(
- res.getResourceEntryName(xmlId), xmlId, locale, orientation, mKeyboardWidth,
- mode, attribute, hasSettingsKey, f2KeyMode, clobberSettingsKey, mVoiceKeyEnabled,
- hasVoiceKey, enableShiftLock);
- }
- private KeyboardId makeSiblingKeyboardId(KeyboardId base, int alphabet, int phone) {
- final int xmlId = base.mMode == KeyboardId.MODE_PHONE ? phone : alphabet;
- final String xmlName = mInputMethodService.getResources().getResourceEntryName(xmlId);
- return base.cloneWithNewLayout(xmlName, xmlId);
+ final boolean settingsKeyEnabled = settingsValues.isSettingsKeyEnabled(editorInfo);
+ final boolean noMicrophone = Utils.inPrivateImeOptions(
+ mPackageName, LatinIME.IME_OPTION_NO_MICROPHONE, editorInfo)
+ || Utils.inPrivateImeOptions(
+ null, LatinIME.IME_OPTION_NO_MICROPHONE_COMPAT, editorInfo);
+ final boolean voiceKeyEnabled = settingsValues.isVoiceKeyEnabled(editorInfo)
+ && !noMicrophone;
+ final boolean voiceKeyOnMain = settingsValues.isVoiceKeyOnMain();
+ final boolean noSettingsKey = Utils.inPrivateImeOptions(
+ mPackageName, LatinIME.IME_OPTION_NO_SETTINGS_KEY, editorInfo);
+ final boolean hasSettingsKey = settingsKeyEnabled && !noSettingsKey;
+ final int f2KeyMode = getF2KeyMode(settingsKeyEnabled, noSettingsKey);
+ final boolean hasShortcutKey = voiceKeyEnabled && (isSymbols != voiceKeyOnMain);
+ final Configuration conf = mResources.getConfiguration();
+
+ return new KeyboardId(
+ mResources.getResourceEntryName(xmlId), xmlId, mSubtypeSwitcher.getInputLocale(),
+ conf.orientation, mWindowWidthCache.getWidth(conf), mode, editorInfo,
+ hasSettingsKey, f2KeyMode, noSettingsKey, voiceKeyEnabled, hasShortcutKey);
}
public int getKeyboardMode() {
@@ -593,16 +710,11 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
if (isAlphabetMode())
return;
final LatinKeyboard keyboard;
- if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) {
- keyboard = getKeyboard(mSymbolsShiftedId);
- // Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To
- // enable the indicator, we need to call setShiftLocked(true).
- keyboard.setShiftLocked(true);
+ if (mCurrentId.equals(mSymbolsKeyboardId)
+ || !mCurrentId.equals(mSymbolsShiftedKeyboardId)) {
+ keyboard = getKeyboard(mSymbolsShiftedKeyboardId);
} else {
- keyboard = getKeyboard(mSymbolsId);
- // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the
- // indicator, we need to call setShiftLocked(false).
- keyboard.setShiftLocked(false);
+ keyboard = getKeyboard(mSymbolsKeyboardId);
}
setKeyboard(keyboard);
}
@@ -621,11 +733,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
}
private void toggleKeyboardMode() {
- loadKeyboardInternal(mAttribute, mVoiceKeyEnabled, mVoiceButtonOnPrimary, !mIsSymbols);
- if (mIsSymbols) {
- mSwitchState = SWITCH_STATE_SYMBOL_BEGIN;
+ if (mCurrentId.equals(mMainKeyboardId)) {
+ setKeyboard(getKeyboard(mSymbolsKeyboardId));
} else {
- mSwitchState = SWITCH_STATE_ALPHA;
+ setKeyboard(getKeyboard(mMainKeyboardId));
}
}
@@ -675,10 +786,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
// {@link #SWITCH_STATE_MOMENTARY}.
if (code == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) {
// Detected only the mode change key has been pressed, and then released.
- if (mIsSymbols) {
- mSwitchState = SWITCH_STATE_SYMBOL_BEGIN;
- } else {
+ if (mCurrentId.equals(mMainKeyboardId)) {
mSwitchState = SWITCH_STATE_ALPHA;
+ } else {
+ mSwitchState = SWITCH_STATE_SYMBOL_BEGIN;
}
} else if (getPointerCount() == 1) {
// Snap back to the previous keyboard mode if the user pressed the mode change key
@@ -788,11 +899,9 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PREF_KEYBOARD_LAYOUT.equals(key)) {
- final int layoutId = getKeyboardThemeIndex(mInputMethodService, sharedPreferences);
- postSetInputView(createInputView(layoutId, false));
- } else if (Settings.PREF_SETTINGS_KEY.equals(key)) {
- mSettingsKeyEnabledInSettings = getSettingsKeyMode(sharedPreferences,
- mInputMethodService);
+ final int themeIndex = getKeyboardThemeIndex(mInputMethodService, sharedPreferences);
+ postSetInputView(createInputView(themeIndex, false));
+ } else if (Settings.PREF_SHOW_SETTINGS_KEY.equals(key)) {
postSetInputView(createInputView(mThemeIndex, true));
}
}
@@ -810,41 +919,18 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
}
}
- private static boolean getSettingsKeyMode(SharedPreferences prefs, Context context) {
- final Resources res = context.getResources();
- final boolean showSettingsKeyOption = res.getBoolean(
- R.bool.config_enable_show_settings_key_option);
- if (showSettingsKeyOption) {
- final String settingsKeyMode = prefs.getString(Settings.PREF_SETTINGS_KEY,
- res.getString(DEFAULT_SETTINGS_KEY_MODE));
- // We show the settings key when 1) SETTINGS_KEY_MODE_ALWAYS_SHOW or
- // 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system
- if (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW))
- || (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_AUTO))
- && Utils.hasMultipleEnabledIMEsOrSubtypes(
- (InputMethodManagerCompatWrapper.getInstance(context))))) {
- return true;
- }
- return false;
- }
- // If the show settings key option is disabled, we always try showing the settings key.
- return true;
- }
-
- private static int getF2KeyMode(SharedPreferences prefs, Context context,
- EditorInfo attribute) {
- final boolean clobberSettingsKey = Utils.inPrivateImeOptions(
- context.getPackageName(), LatinIME.IME_OPTION_NO_SETTINGS_KEY, attribute);
- final Resources res = context.getResources();
- final String settingsKeyMode = prefs.getString(Settings.PREF_SETTINGS_KEY,
- res.getString(DEFAULT_SETTINGS_KEY_MODE));
- if (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_AUTO))) {
- return clobberSettingsKey ? KeyboardId.F2KEY_MODE_SHORTCUT_IME
- : KeyboardId.F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS;
- } else if (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW))) {
- return clobberSettingsKey ? KeyboardId.F2KEY_MODE_NONE : KeyboardId.F2KEY_MODE_SETTINGS;
- } else { // SETTINGS_KEY_MODE_ALWAYS_HIDE
+ private static int getF2KeyMode(boolean settingsKeyEnabled, boolean noSettingsKey) {
+ if (noSettingsKey) {
+ // Never shows the Settings key
return KeyboardId.F2KEY_MODE_SHORTCUT_IME;
}
+
+ if (settingsKeyEnabled) {
+ return KeyboardId.F2KEY_MODE_SETTINGS;
+ } else {
+ // It should be alright to fall back to the Settings key on 7-inch layouts
+ // even when the Settings key is not explicitly enabled.
+ return KeyboardId.F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS;
+ }
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index 2e0683115..2df2994f6 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -35,6 +35,7 @@ import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.RelativeLayout;
import android.widget.TextView;
import com.android.inputmethod.compat.FrameLayoutCompatUtils;
@@ -73,8 +74,6 @@ import java.util.HashMap;
* @attr ref R.styleable#KeyboardView_shadowRadius
*/
public class KeyboardView extends View implements PointerTracker.DrawingProxy {
- private static final boolean DEBUG_KEYBOARD_GRID = false;
-
// Miscellaneous constants
private static final int[] LONG_PRESSABLE_STATE_SET = { android.R.attr.state_long_pressable };
@@ -89,25 +88,23 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
private final KeyDrawParams mKeyDrawParams;
// Key preview
+ private final int mKeyPreviewLayoutId;
private final KeyPreviewDrawParams mKeyPreviewDrawParams;
- private final TextView mPreviewText;
private boolean mShowKeyPreviewPopup = true;
private final int mDelayBeforePreview;
private int mDelayAfterPreview;
private ViewGroup mPreviewPlacer;
// Drawing
- /** Whether the keyboard bitmap needs to be redrawn before it's blitted. **/
- private boolean mDrawPending;
- /** Notes if the keyboard just changed, so that we could possibly reallocate the mBuffer. */
- private boolean mKeyboardChanged;
+ /** Whether the keyboard bitmap buffer needs to be redrawn before it's blitted. **/
+ private boolean mBufferNeedsUpdate;
/** The dirty region in the keyboard bitmap */
private final Rect mDirtyRect = new Rect();
/** The key to invalidate. */
private Key mInvalidatedKey;
/** The dirty region for single key drawing */
private final Rect mInvalidatedKeyRect = new Rect();
- /** The keyboard bitmap for faster updates */
+ /** The keyboard bitmap buffer for faster updates */
private Bitmap mBuffer;
/** The canvas for the above mutable keyboard bitmap */
private Canvas mCanvas;
@@ -136,23 +133,23 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
@Override
public void handleMessage(Message msg) {
final KeyboardView keyboardView = getOuterInstance();
+ if (keyboardView == null) return;
final PointerTracker tracker = (PointerTracker) msg.obj;
switch (msg.what) {
case MSG_SHOW_KEY_PREVIEW:
keyboardView.showKey(msg.arg1, tracker);
break;
case MSG_DISMISS_KEY_PREVIEW:
- if (keyboardView.mPreviewText != null) {
- keyboardView.mPreviewText.setVisibility(View.INVISIBLE);
- }
+ tracker.getKeyPreviewText().setVisibility(View.INVISIBLE);
break;
}
}
public void showKeyPreview(long delay, int keyIndex, PointerTracker tracker) {
- final KeyboardView keyboardView = getOuterInstance();
removeMessages(MSG_SHOW_KEY_PREVIEW);
- if (keyboardView.mPreviewText.getVisibility() == VISIBLE || delay == 0) {
+ final KeyboardView keyboardView = getOuterInstance();
+ if (keyboardView == null) return;
+ if (tracker.getKeyPreviewText().getVisibility() == VISIBLE || delay == 0) {
// Show right away, if it's already visible and finger is moving around
keyboardView.showKey(keyIndex, tracker);
} else {
@@ -265,7 +262,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
public final Drawable mPreviewBackground;
public final Drawable mPreviewLeftBackground;
public final Drawable mPreviewRightBackground;
- public final Drawable mPreviewSpacebarBackground;
public final int mPreviewTextColor;
public final int mPreviewOffset;
public final int mPreviewHeight;
@@ -286,8 +282,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
R.styleable.KeyboardView_keyPreviewLeftBackground);
mPreviewRightBackground = a.getDrawable(
R.styleable.KeyboardView_keyPreviewRightBackground);
- mPreviewSpacebarBackground = a.getDrawable(
- R.styleable.KeyboardView_keyPreviewSpacebarBackground);
setAlpha(mPreviewBackground, PREVIEW_ALPHA);
setAlpha(mPreviewLeftBackground, PREVIEW_ALPHA);
setAlpha(mPreviewRightBackground, PREVIEW_ALPHA);
@@ -326,11 +320,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
mKeyDrawParams = new KeyDrawParams(a);
mKeyPreviewDrawParams = new KeyPreviewDrawParams(a, mKeyDrawParams);
- final int previewLayout = a.getResourceId(R.styleable.KeyboardView_keyPreviewLayout, 0);
- if (previewLayout != 0) {
- mPreviewText = (TextView) LayoutInflater.from(context).inflate(previewLayout, null);
- } else {
- mPreviewText = null;
+ mKeyPreviewLayoutId = a.getResourceId(R.styleable.KeyboardView_keyPreviewLayout, 0);
+ if (mKeyPreviewLayoutId == 0) {
mShowKeyPreviewPopup = false;
}
mBackgroundDimAmount = a.getFloat(R.styleable.KeyboardView_backgroundDimAmount, 0.5f);
@@ -359,14 +350,18 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
* @param keyboard the keyboard to display in this view
*/
public void setKeyboard(Keyboard keyboard) {
- // Remove any pending messages, except dismissing preview
+ // Remove any pending dismissing preview
mDrawingHandler.cancelAllShowKeyPreviews();
+ if (mKeyboard != null) {
+ PointerTracker.dismissAllKeyPreviews();
+ }
mKeyboard = keyboard;
LatinImeLogger.onSetKeyboard(keyboard);
requestLayout();
- mKeyboardChanged = true;
+ mDirtyRect.set(0, 0, getWidth(), getHeight());
+ mBufferNeedsUpdate = true;
invalidateAllKeys();
- final int keyHeight = keyboard.getRowHeight() - keyboard.getVerticalGap();
+ final int keyHeight = keyboard.mDefaultRowHeight - keyboard.mVerticalGap;
mKeyDrawParams.updateKeyHeight(keyHeight);
mKeyPreviewDrawParams.updateKeyHeight(keyHeight);
}
@@ -402,25 +397,21 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
}
@Override
- public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- // Round up a little
- if (mKeyboard == null) {
- setMeasuredDimension(
- getPaddingLeft() + getPaddingRight(), getPaddingTop() + getPaddingBottom());
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (mKeyboard != null) {
+ // The main keyboard expands to the display width.
+ final int height = mKeyboard.mOccupiedHeight + getPaddingTop() + getPaddingBottom();
+ setMeasuredDimension(widthMeasureSpec, height);
} else {
- int width = mKeyboard.getMinWidth() + getPaddingLeft() + getPaddingRight();
- if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) {
- width = MeasureSpec.getSize(widthMeasureSpec);
- }
- setMeasuredDimension(
- width, mKeyboard.getHeight() + getPaddingTop() + getPaddingBottom());
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
- if (mDrawPending || mBuffer == null || mKeyboardChanged) {
+ if (mBufferNeedsUpdate || mBuffer == null) {
+ mBufferNeedsUpdate = false;
onBufferDraw();
}
canvas.drawBitmap(mBuffer, 0, 0, null);
@@ -431,14 +422,11 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
final int height = getHeight();
if (width == 0 || height == 0)
return;
- if (mBuffer == null || mKeyboardChanged) {
- mKeyboardChanged = false;
- mDirtyRect.union(0, 0, width, height);
- }
if (mBuffer == null || mBuffer.getWidth() != width || mBuffer.getHeight() != height) {
if (mBuffer != null)
mBuffer.recycle();
mBuffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ mDirtyRect.union(0, 0, width, height);
if (mCanvas != null) {
mCanvas.setBitmap(mBuffer);
} else {
@@ -459,37 +447,20 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
+ getPaddingLeft();
final int keyDrawY = mInvalidatedKey.mY + getPaddingTop();
canvas.translate(keyDrawX, keyDrawY);
- onBufferDrawKey(mInvalidatedKey, canvas, mPaint, params, isManualTemporaryUpperCase);
+ onBufferDrawKey(mInvalidatedKey, mKeyboard, canvas, mPaint, params,
+ isManualTemporaryUpperCase);
canvas.translate(-keyDrawX, -keyDrawY);
} else {
// Draw all keys.
- for (final Key key : mKeyboard.getKeys()) {
+ for (final Key key : mKeyboard.mKeys) {
final int keyDrawX = key.mX + key.mVisualInsetsLeft + getPaddingLeft();
final int keyDrawY = key.mY + getPaddingTop();
canvas.translate(keyDrawX, keyDrawY);
- onBufferDrawKey(key, canvas, mPaint, params, isManualTemporaryUpperCase);
+ onBufferDrawKey(key, mKeyboard, canvas, mPaint, params, isManualTemporaryUpperCase);
canvas.translate(-keyDrawX, -keyDrawY);
}
}
- // TODO: Move this function to ProximityInfo for getting rid of
- // public declarations for
- // GRID_WIDTH and GRID_HEIGHT
- if (DEBUG_KEYBOARD_GRID) {
- Paint p = new Paint();
- p.setStyle(Paint.Style.STROKE);
- p.setStrokeWidth(1.0f);
- p.setColor(0x800000c0);
- int cw = (mKeyboard.getMinWidth() + mKeyboard.GRID_WIDTH - 1)
- / mKeyboard.GRID_WIDTH;
- int ch = (mKeyboard.getHeight() + mKeyboard.GRID_HEIGHT - 1)
- / mKeyboard.GRID_HEIGHT;
- for (int i = 0; i <= mKeyboard.GRID_WIDTH; i++)
- canvas.drawLine(i * cw, 0, i * cw, ch * mKeyboard.GRID_HEIGHT, p);
- for (int i = 0; i <= mKeyboard.GRID_HEIGHT; i++)
- canvas.drawLine(0, i * ch, cw * mKeyboard.GRID_WIDTH, i * ch, p);
- }
-
// Overlay a dark rectangle to dim the keyboard
if (needsToDimKeyboard()) {
mPaint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24);
@@ -497,7 +468,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
}
mInvalidatedKey = null;
- mDrawPending = false;
mDirtyRect.setEmpty();
}
@@ -505,8 +475,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
return false;
}
- private static void onBufferDrawKey(final Key key, final Canvas canvas, Paint paint,
- KeyDrawParams params, boolean isManualTemporaryUpperCase) {
+ private static void onBufferDrawKey(final Key key, final Keyboard keyboard, final Canvas canvas,
+ Paint paint, KeyDrawParams params, boolean isManualTemporaryUpperCase) {
final boolean debugShowAlign = LatinImeLogger.sVISUALDEBUG;
// Draw key background.
final int bgWidth = key.mWidth - key.mVisualInsetsLeft - key.mVisualInsetsRight
@@ -529,7 +499,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
canvas.translate(-bgX, -bgY);
// Draw key top visuals.
- final int keyWidth = key.mWidth;
+ final int keyWidth = key.mWidth - key.mVisualInsetsLeft - key.mVisualInsetsRight;
final int keyHeight = key.mHeight;
final float centerX = keyWidth * 0.5f;
final float centerY = keyHeight * 0.5f;
@@ -539,10 +509,11 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
}
// Draw key label.
+ final Drawable icon = key.getIcon();
float positionX = centerX;
if (key.mLabel != null) {
// Switch the character to uppercase if shift is pressed
- final CharSequence label = key.getCaseAdjustedLabel();
+ final CharSequence label = keyboard.adjustLabelCase(key.mLabel);
// For characters, use large font. For labels like "Done", use smaller font.
paint.setTypeface(key.selectTypeface(params.mKeyTextStyle));
final int labelSize = key.selectTextSize(params.mKeyLetterSize,
@@ -555,16 +526,25 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
final float baseline = centerY + labelCharHeight / 2;
// Horizontal label text alignment
- if ((key.mLabelOption & Key.LABEL_OPTION_ALIGN_LEFT) != 0) {
+ float labelWidth = 0;
+ if (key.isAlignLeft()) {
positionX = (int)params.mKeyLabelHorizontalPadding;
paint.setTextAlign(Align.LEFT);
- } else if ((key.mLabelOption & Key.LABEL_OPTION_ALIGN_RIGHT) != 0) {
+ } else if (key.isAlignRight()) {
positionX = keyWidth - (int)params.mKeyLabelHorizontalPadding;
paint.setTextAlign(Align.RIGHT);
- } else if ((key.mLabelOption & Key.LABEL_OPTION_ALIGN_LEFT_OF_CENTER) != 0) {
+ } else if (key.isAlignLeftOfCenter()) {
// TODO: Parameterise this?
positionX = centerX - labelCharWidth * 7 / 4;
paint.setTextAlign(Align.LEFT);
+ } else if (key.hasLabelWithIconLeft() && icon != null) {
+ labelWidth = getLabelWidth(label, paint) + icon.getIntrinsicWidth();
+ positionX = centerX + labelWidth / 2;
+ paint.setTextAlign(Align.RIGHT);
+ } else if (key.hasLabelWithIconRight() && icon != null) {
+ labelWidth = getLabelWidth(label, paint) + icon.getIntrinsicWidth();
+ positionX = centerX - labelWidth / 2;
+ paint.setTextAlign(Align.LEFT);
} else {
positionX = centerX;
paint.setTextAlign(Align.CENTER);
@@ -586,6 +566,19 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
// Turn off drop shadow
paint.setShadowLayer(0, 0, 0, 0);
+ if (icon != null) {
+ final int iconWidth = icon.getIntrinsicWidth();
+ final int iconHeight = icon.getIntrinsicHeight();
+ final int iconY = (keyHeight - iconHeight) / 2;
+ if (key.hasLabelWithIconLeft()) {
+ final int iconX = (int)(centerX - labelWidth / 2);
+ drawIcon(canvas, icon, iconX, iconY, iconWidth, iconHeight);
+ } else if (key.hasLabelWithIconRight()) {
+ final int iconX = (int)(centerX + labelWidth / 2 - iconWidth);
+ drawIcon(canvas, icon, iconX, iconY, iconWidth, iconHeight);
+ }
+ }
+
if (debugShowAlign) {
final Paint line = new Paint();
drawHorizontalLine(canvas, baseline, keyWidth, 0xc0008000, line);
@@ -639,16 +632,15 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
}
// Draw key icon.
- final Drawable icon = key.getIcon();
if (key.mLabel == null && icon != null) {
final int iconWidth = icon.getIntrinsicWidth();
final int iconHeight = icon.getIntrinsicHeight();
final int iconX, alignX;
final int iconY = (keyHeight - iconHeight) / 2;
- if ((key.mLabelOption & Key.LABEL_OPTION_ALIGN_LEFT) != 0) {
+ if (key.isAlignLeft()) {
iconX = (int)params.mKeyLabelHorizontalPadding;
alignX = iconX;
- } else if ((key.mLabelOption & Key.LABEL_OPTION_ALIGN_RIGHT) != 0) {
+ } else if (key.isAlignRight()) {
iconX = keyWidth - (int)params.mKeyLabelHorizontalPadding - iconWidth;
alignX = iconX + iconWidth;
} else { // Align center
@@ -665,7 +657,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
}
// Draw popup hint "..." at the bottom right corner of the key.
- if (key.hasPopupHint()) {
+ if ((key.hasPopupHint() && key.mPopupCharacters != null && key.mPopupCharacters.length > 0)
+ || key.needsSpecialPopupHint()) {
paint.setTextSize(params.mKeyHintLetterSize);
paint.setColor(params.mKeyHintLabelColor);
paint.setTextAlign(Align.CENTER);
@@ -728,6 +721,11 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
return width;
}
+ private static float getLabelWidth(CharSequence label, Paint paint) {
+ paint.getTextBounds(label.toString(), 0, label.length(), sTextBounds);
+ return sTextBounds.width();
+ }
+
private static void drawIcon(Canvas canvas, Drawable icon, int x, int y, int width,
int height) {
canvas.translate(x, y);
@@ -764,13 +762,21 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
mDrawingHandler.cancelAllMessages();
}
+ // Called by {@link PointerTracker} constructor to create a TextView.
+ @Override
+ public TextView inflateKeyPreviewText() {
+ final Context context = getContext();
+ if (mKeyPreviewLayoutId != 0) {
+ return (TextView)LayoutInflater.from(context).inflate(mKeyPreviewLayoutId, null);
+ } else {
+ return new TextView(context);
+ }
+ }
+
@Override
public void showKeyPreview(int keyIndex, PointerTracker tracker) {
if (mShowKeyPreviewPopup) {
mDrawingHandler.showKeyPreview(mDelayBeforePreview, keyIndex, tracker);
- } else if (mKeyboard.needSpacebarPreview(keyIndex)) {
- // Show key preview (in this case, slide language switcher) without any delay.
- showKey(keyIndex, tracker);
}
}
@@ -781,34 +787,30 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
@Override
public void dismissKeyPreview(PointerTracker tracker) {
- if (mShowKeyPreviewPopup) {
- mDrawingHandler.cancelShowKeyPreview(tracker);
- mDrawingHandler.dismissKeyPreview(mDelayAfterPreview, tracker);
- } else if (mKeyboard.needSpacebarPreview(KeyDetector.NOT_A_KEY)) {
- // Dismiss key preview (in this case, slide language switcher) without any delay.
- mPreviewText.setVisibility(View.INVISIBLE);
- }
+ mDrawingHandler.cancelShowKeyPreview(tracker);
+ mDrawingHandler.dismissKeyPreview(mDelayAfterPreview, tracker);
}
private void addKeyPreview(TextView keyPreview) {
if (mPreviewPlacer == null) {
- mPreviewPlacer = FrameLayoutCompatUtils.getPlacer(
- (ViewGroup)getRootView().findViewById(android.R.id.content));
+ mPreviewPlacer = new RelativeLayout(getContext());
+ final ViewGroup windowContentView =
+ (ViewGroup)getRootView().findViewById(android.R.id.content);
+ windowContentView.addView(mPreviewPlacer);
}
- final ViewGroup placer = mPreviewPlacer;
- placer.addView(keyPreview, FrameLayoutCompatUtils.newLayoutParam(placer, 0, 0));
+ mPreviewPlacer.addView(
+ keyPreview, FrameLayoutCompatUtils.newLayoutParam(mPreviewPlacer, 0, 0));
}
- // TODO: Introduce minimum duration for displaying key previews
- // TODO: Display up to two key previews when the user presses two keys at the same time
private void showKey(final int keyIndex, PointerTracker tracker) {
- final TextView previewText = mPreviewText;
+ final TextView previewText = tracker.getKeyPreviewText();
// If the key preview has no parent view yet, add it to the ViewGroup which can place
// key preview absolutely in SoftInputWindow.
if (previewText.getParent() == null) {
addKeyPreview(previewText);
}
+ mDrawingHandler.cancelDismissKeyPreview(tracker);
final Key key = tracker.getKey(keyIndex);
// If keyIndex is invalid or IME is already closed, we must not show key preview.
// Trying to show key preview while root window is closed causes
@@ -816,7 +818,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
if (key == null)
return;
- mDrawingHandler.cancelAllDismissKeyPreviews();
final KeyPreviewDrawParams params = mKeyPreviewDrawParams;
final int keyDrawX = key.mX + key.mVisualInsetsLeft;
final int keyDrawWidth = key.mWidth - key.mVisualInsetsLeft - key.mVisualInsetsRight;
@@ -831,18 +832,14 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, params.mPreviewTextSize);
previewText.setTypeface(params.mKeyTextStyle);
}
- previewText.setText(key.getCaseAdjustedLabel());
+ previewText.setText(mKeyboard.adjustLabelCase(key.mLabel));
} else {
final Drawable previewIcon = key.getPreviewIcon();
previewText.setCompoundDrawables(null, null, null,
previewIcon != null ? previewIcon : key.getIcon());
previewText.setText(null);
}
- if (key.mCode == Keyboard.CODE_SPACE) {
- previewText.setBackgroundDrawable(params.mPreviewSpacebarBackground);
- } else {
- previewText.setBackgroundDrawable(params.mPreviewBackground);
- }
+ previewText.setBackgroundDrawable(params.mPreviewBackground);
previewText.measure(MEASURESPEC_UNSPECIFIED, MEASURESPEC_UNSPECIFIED);
final int previewWidth = Math.max(previewText.getMeasuredWidth(), keyDrawWidth
@@ -877,7 +874,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
*/
public void invalidateAllKeys() {
mDirtyRect.union(0, 0, getWidth(), getHeight());
- mDrawPending = true;
+ mBufferNeedsUpdate = true;
invalidate();
}
@@ -897,18 +894,23 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
final int y = key.mY + getPaddingTop();
mInvalidatedKeyRect.set(x, y, x + key.mWidth, y + key.mHeight);
mDirtyRect.union(mInvalidatedKeyRect);
- onBufferDraw();
+ mBufferNeedsUpdate = true;
invalidate(mInvalidatedKeyRect);
}
public void closing() {
- mPreviewText.setVisibility(View.GONE);
+ PointerTracker.dismissAllKeyPreviews();
cancelAllMessages();
mDirtyRect.union(0, 0, getWidth(), getHeight());
requestLayout();
}
+ @Override
+ public boolean dismissPopupPanel() {
+ return false;
+ }
+
public void purgeKeyboardAndClosing() {
mKeyboard = null;
closing();
@@ -918,5 +920,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
closing();
+ if (mPreviewPlacer != null) {
+ mPreviewPlacer.removeAllViews();
+ }
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
index d925b8c33..1b6f57b92 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
@@ -31,23 +31,22 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
-import com.android.inputmethod.keyboard.internal.SlidingLocaleDrawable;
+import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
+import com.android.inputmethod.keyboard.internal.KeyboardBuilder;
+import com.android.inputmethod.keyboard.internal.KeyboardParams;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.SubtypeSwitcher;
+import com.android.inputmethod.latin.Utils;
import java.lang.ref.SoftReference;
import java.util.Arrays;
import java.util.HashMap;
-import java.util.List;
import java.util.Locale;
// TODO: We should remove this class
public class LatinKeyboard extends Keyboard {
private static final int SPACE_LED_LENGTH_PERCENT = 80;
- public static final int CODE_NEXT_LANGUAGE = -100;
- public static final int CODE_PREV_LANGUAGE = -101;
-
private final Resources mRes;
private final Theme mTheme;
private final SubtypeSwitcher mSubtypeSwitcher = SubtypeSwitcher.getInstance();
@@ -55,34 +54,20 @@ public class LatinKeyboard extends Keyboard {
/* Space key and its icons, drawables and colors. */
private final Key mSpaceKey;
private final Drawable mSpaceIcon;
- private final Drawable mSpacePreviewIcon;
- private final int mSpaceKeyIndex;
private final boolean mAutoCorrectionSpacebarLedEnabled;
private final Drawable mAutoCorrectionSpacebarLedIcon;
private final int mSpacebarTextColor;
private final int mSpacebarTextShadowColor;
private float mSpacebarTextFadeFactor = 0.0f;
- private final int mSpacebarLanguageSwitchThreshold;
- private int mSpacebarSlidingLanguageSwitchDiff;
- private final SlidingLocaleDrawable mSlidingLocaleIcon;
private final HashMap<Integer, SoftReference<BitmapDrawable>> mSpaceDrawableCache =
new HashMap<Integer, SoftReference<BitmapDrawable>>();
+ private final boolean mIsSpacebarTriggeringPopupByLongPress;
/* Shortcut key and its icons if available */
private final Key mShortcutKey;
private final Drawable mEnabledShortcutIcon;
private final Drawable mDisabledShortcutIcon;
- // BLACK LEFT-POINTING TRIANGLE and two spaces.
- public static final String ARROW_LEFT = "\u25C0 ";
- // Two spaces and BLACK RIGHT-POINTING TRIANGLE.
- public static final String ARROW_RIGHT = " \u25B6";
-
- // Minimum width of spacebar dragging to trigger the language switch (represented by the number
- // of the most common key width of this keyboard).
- private static final int SPACEBAR_DRAG_WIDTH = 3;
- // Minimum width of space key preview (proportional to keyboard width).
- private static final float SPACEBAR_POPUP_MIN_RATIO = 0.5f;
// Height in space key the language name will be drawn. (proportional to space key height)
public static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f;
// If the full language name needs to be smaller than this value to be drawn on space key,
@@ -92,35 +77,20 @@ public class LatinKeyboard extends Keyboard {
private static final String SMALL_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR = "small";
private static final String MEDIUM_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR = "medium";
- public LatinKeyboard(Context context, KeyboardId id, int width) {
- super(context, id.getXmlId(), id, width);
+ private LatinKeyboard(Context context, LatinKeyboardParams params) {
+ super(params);
mRes = context.getResources();
mTheme = context.getTheme();
- final List<Key> keys = getKeys();
- int spaceKeyIndex = -1;
- int shortcutKeyIndex = -1;
- final int keyCount = keys.size();
- for (int index = 0; index < keyCount; index++) {
- // For now, assuming there are up to one space key and one shortcut key respectively.
- switch (keys.get(index).mCode) {
- case CODE_SPACE:
- spaceKeyIndex = index;
- break;
- case CODE_SHORTCUT:
- shortcutKeyIndex = index;
- break;
- }
- }
-
// The index of space key is available only after Keyboard constructor has finished.
- mSpaceKey = (spaceKeyIndex >= 0) ? keys.get(spaceKeyIndex) : null;
+ mSpaceKey = params.mSpaceKey;
mSpaceIcon = (mSpaceKey != null) ? mSpaceKey.getIcon() : null;
- mSpacePreviewIcon = (mSpaceKey != null) ? mSpaceKey.getPreviewIcon() : null;
- mSpaceKeyIndex = spaceKeyIndex;
- mShortcutKey = (shortcutKeyIndex >= 0) ? keys.get(shortcutKeyIndex) : null;
+ mShortcutKey = params.mShortcutKey;
mEnabledShortcutIcon = (mShortcutKey != null) ? mShortcutKey.getIcon() : null;
+ final int longPressSpaceKeyTimeout =
+ mRes.getInteger(R.integer.config_long_press_space_key_timeout);
+ mIsSpacebarTriggeringPopupByLongPress = (longPressSpaceKeyTimeout > 0);
final TypedArray a = context.obtainStyledAttributes(
null, R.styleable.LatinKeyboard, R.attr.latinKeyboardStyle, R.style.LatinKeyboard);
@@ -133,19 +103,41 @@ public class LatinKeyboard extends Keyboard {
mSpacebarTextShadowColor = a.getColor(
R.styleable.LatinKeyboard_spacebarTextShadowColor, 0);
a.recycle();
+ }
- // The threshold is "key width" x 1.25
- mSpacebarLanguageSwitchThreshold = (getMostCommonKeyWidth() * 5) / 4;
+ private static class LatinKeyboardParams extends KeyboardParams {
+ public Key mSpaceKey = null;
+ public Key mShortcutKey = null;
- if (mSpaceKey != null && mSpacePreviewIcon != null) {
- final int slidingIconWidth = Math.max(mSpaceKey.mWidth,
- (int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO));
- final int spaceKeyheight = mSpacePreviewIcon.getIntrinsicHeight();
- mSlidingLocaleIcon = new SlidingLocaleDrawable(
- context, mSpacePreviewIcon, slidingIconWidth, spaceKeyheight);
- mSlidingLocaleIcon.setBounds(0, 0, slidingIconWidth, spaceKeyheight);
- } else {
- mSlidingLocaleIcon = null;
+ @Override
+ public void onAddKey(Key key) {
+ super.onAddKey(key);
+
+ switch (key.mCode) {
+ case Keyboard.CODE_SPACE:
+ mSpaceKey = key;
+ break;
+ case Keyboard.CODE_SHORTCUT:
+ mShortcutKey = key;
+ break;
+ }
+ }
+ }
+
+ public static class Builder extends KeyboardBuilder<LatinKeyboardParams> {
+ public Builder(Context context) {
+ super(context, new LatinKeyboardParams());
+ }
+
+ @Override
+ public Builder load(KeyboardId id) {
+ super.load(id);
+ return this;
+ }
+
+ @Override
+ public LatinKeyboard build() {
+ return new LatinKeyboard(mContext, mParams);
}
}
@@ -193,8 +185,13 @@ public class LatinKeyboard extends Keyboard {
}
private void updateSpacebarForLocale(boolean isAutoCorrection) {
- if (mSpaceKey == null)
- return;
+ if (mSpaceKey == null) return;
+ final InputMethodManagerCompatWrapper imm = InputMethodManagerCompatWrapper.getInstance();
+ if (imm == null) return;
+ // The "..." popup hint for triggering something by a long-pressing the spacebar
+ final boolean shouldShowInputMethodPicker = mIsSpacebarTriggeringPopupByLongPress
+ && Utils.hasMultipleEnabledIMEsOrSubtypes(imm, true /* include aux subtypes */);
+ mSpaceKey.setNeedsSpecialPopupHint(shouldShowInputMethodPicker);
// If application locales are explicitly selected.
if (mSubtypeSwitcher.needsToDisplayLanguage()) {
mSpaceKey.setIcon(getSpaceDrawable(
@@ -219,8 +216,7 @@ public class LatinKeyboard extends Keyboard {
final Rect bounds = new Rect();
// Estimate appropriate language name text size to fit in maxTextWidth.
- String language = ARROW_LEFT + SubtypeSwitcher.getFullDisplayName(locale, true)
- + ARROW_RIGHT;
+ String language = SubtypeSwitcher.getFullDisplayName(locale, true);
int textWidth = getTextWidth(paint, language, origTextSize, bounds);
// Assuming text width and text size are proportional to each other.
float textSize = origTextSize * Math.min(width / textWidth, 1.0f);
@@ -232,7 +228,7 @@ public class LatinKeyboard extends Keyboard {
final boolean useShortName;
if (useMiddleName) {
- language = ARROW_LEFT + SubtypeSwitcher.getMiddleDisplayLanguage(locale) + ARROW_RIGHT;
+ language = SubtypeSwitcher.getMiddleDisplayLanguage(locale);
textWidth = getTextWidth(paint, language, origTextSize, bounds);
textSize = origTextSize * Math.min(width / textWidth, 1.0f);
useShortName = (textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME)
@@ -242,7 +238,7 @@ public class LatinKeyboard extends Keyboard {
}
if (useShortName) {
- language = ARROW_LEFT + SubtypeSwitcher.getShortDisplayLanguage(locale) + ARROW_RIGHT;
+ language = SubtypeSwitcher.getShortDisplayLanguage(locale);
textWidth = getTextWidth(paint, language, origTextSize, bounds);
textSize = origTextSize * Math.min(width / textWidth, 1.0f);
}
@@ -327,68 +323,11 @@ public class LatinKeyboard extends Keyboard {
return buffer;
}
- public void setSpacebarSlidingLanguageSwitchDiff(int diff) {
- mSpacebarSlidingLanguageSwitchDiff = diff;
- }
-
- public void updateSpacebarPreviewIcon(int diff) {
- if (mSpacebarSlidingLanguageSwitchDiff == diff)
- return;
- mSpacebarSlidingLanguageSwitchDiff = diff;
- if (mSlidingLocaleIcon == null)
- return;
- mSlidingLocaleIcon.setDiff(diff);
- if (Math.abs(diff) == Integer.MAX_VALUE) {
- mSpaceKey.setPreviewIcon(mSpacePreviewIcon);
- } else {
- mSpaceKey.setPreviewIcon(mSlidingLocaleIcon);
- }
- mSpaceKey.getPreviewIcon().invalidateSelf();
- }
-
- public boolean shouldTriggerSpacebarSlidingLanguageSwitch(int diff) {
- // On phone and number layouts, sliding language switch is disabled.
- // TODO: Sort out how to enable language switch on these layouts.
- if (isPhoneKeyboard() || isNumberKeyboard())
- return false;
- return Math.abs(diff) > mSpacebarLanguageSwitchThreshold;
- }
-
- /**
- * Return true if spacebar needs showing preview even when "popup on keypress" is off.
- * @param keyIndex index of the pressing key
- * @return true if spacebar needs showing preview
- */
- @Override
- public boolean needSpacebarPreview(int keyIndex) {
- // This method is called when "popup on keypress" is off.
- if (!mSubtypeSwitcher.useSpacebarLanguageSwitcher())
- return false;
- // Dismiss key preview.
- if (keyIndex == KeyDetector.NOT_A_KEY)
- return true;
- // Key is not a spacebar.
- if (keyIndex != mSpaceKeyIndex)
- return false;
- // The language switcher will be displayed only when the dragging distance is greater
- // than the threshold.
- return shouldTriggerSpacebarSlidingLanguageSwitch(mSpacebarSlidingLanguageSwitchDiff);
- }
-
- public int getLanguageChangeDirection() {
- if (mSpaceKey == null || mSubtypeSwitcher.getEnabledKeyboardLocaleCount() <= 1
- || Math.abs(mSpacebarSlidingLanguageSwitchDiff)
- < getMostCommonKeyWidth() * SPACEBAR_DRAG_WIDTH) {
- return 0; // No change
- }
- return mSpacebarSlidingLanguageSwitchDiff > 0 ? 1 : -1;
- }
-
@Override
public int[] getNearestKeys(int x, int y) {
// Avoid dead pixels at edges of the keyboard
- return super.getNearestKeys(Math.max(0, Math.min(x, getMinWidth() - 1)),
- Math.max(0, Math.min(y, getHeight() - 1)));
+ return super.getNearestKeys(Math.max(0, Math.min(x, mOccupiedWidth - 1)),
+ Math.max(0, Math.min(y, mOccupiedHeight - 1)));
}
public static int getTextSizeFromTheme(Theme theme, int style, int defValue) {
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java
index 078d89f49..12aadcb5c 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java
@@ -269,7 +269,7 @@ public class LatinKeyboardBaseView extends KeyboardView implements PointerTracke
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO: Should notify InputMethodService instead?
- KeyboardSwitcher.getInstance().onSizeChanged();
+ KeyboardSwitcher.getInstance().onSizeChanged(w, h, oldw, oldh);
}
/**
@@ -281,15 +281,12 @@ public class LatinKeyboardBaseView extends KeyboardView implements PointerTracke
*/
@Override
public void setKeyboard(Keyboard keyboard) {
- if (getKeyboard() != null) {
- PointerTracker.dismissAllKeyPreviews();
- }
// Remove any pending messages, except dismissing preview
mKeyTimerHandler.cancelKeyTimers();
super.setKeyboard(keyboard);
mKeyDetector.setKeyboard(
keyboard, -getPaddingLeft(), -getPaddingTop() + mVerticalCorrection);
- mKeyDetector.setProximityThreshold(keyboard.getMostCommonKeyWidth());
+ mKeyDetector.setProximityThreshold(keyboard.mMostCommonKeyWidth);
PointerTracker.setKeyDetector(mKeyDetector);
mPopupPanelCache.clear();
}
@@ -348,7 +345,6 @@ public class LatinKeyboardBaseView extends KeyboardView implements PointerTracke
}
// This default implementation returns a popup mini keyboard panel.
- // A derived class may return a language switcher popup panel, for instance.
protected PopupPanel onCreatePopupPanel(Key parentKey) {
if (parentKey.mPopupCharacters == null)
return null;
@@ -361,7 +357,7 @@ public class LatinKeyboardBaseView extends KeyboardView implements PointerTracke
(PopupMiniKeyboardView)container.findViewById(R.id.mini_keyboard_view);
final Keyboard parentKeyboard = getKeyboard();
final Keyboard miniKeyboard = new MiniKeyboardBuilder(
- this, parentKeyboard.getPopupKeyboardResId(), parentKey, parentKeyboard).build();
+ this, parentKeyboard.mPopupKeyboardResId, parentKey, parentKeyboard).build();
miniKeyboardView.setKeyboard(miniKeyboard);
container.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
@@ -401,11 +397,10 @@ public class LatinKeyboardBaseView extends KeyboardView implements PointerTracke
mPopupPanel = popupPanel;
mPopupPanelPointerTrackerId = tracker.mPointerId;
- tracker.onLongPressed();
- popupPanel.showPanel(this, parentKey, tracker, mPopupWindow);
+ popupPanel.showPopupPanel(this, parentKey, tracker, mPopupWindow);
final int translatedX = popupPanel.translateX(tracker.getLastX());
final int translatedY = popupPanel.translateY(tracker.getLastY());
- tracker.onDownEvent(translatedX, translatedY, SystemClock.uptimeMillis(), popupPanel);
+ tracker.onShowPopupPanel(translatedX, translatedY, SystemClock.uptimeMillis(), popupPanel);
invalidateAllKeys();
return true;
@@ -547,11 +542,12 @@ public class LatinKeyboardBaseView extends KeyboardView implements PointerTracke
@Override
public void closing() {
super.closing();
- dismissMiniKeyboard();
+ dismissPopupPanel();
mPopupPanelCache.clear();
}
- public boolean dismissMiniKeyboard() {
+ @Override
+ public boolean dismissPopupPanel() {
if (mPopupWindow != null && mPopupWindow.isShowing()) {
mPopupWindow.dismiss();
mPopupPanel = null;
@@ -563,14 +559,14 @@ public class LatinKeyboardBaseView extends KeyboardView implements PointerTracke
}
public boolean handleBack() {
- return dismissMiniKeyboard();
+ return dismissPopupPanel();
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
+ // Drop non-hover touch events when touch exploration is enabled.
if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) {
- return AccessibleKeyboardViewProxy.getInstance().dispatchTouchEvent(event)
- || super.dispatchTouchEvent(event);
+ return false;
}
return super.dispatchTouchEvent(event);
@@ -587,15 +583,22 @@ public class LatinKeyboardBaseView extends KeyboardView implements PointerTracke
return super.dispatchPopulateAccessibilityEvent(event);
}
- public boolean onHoverEvent(MotionEvent event) {
- // Since reflection doesn't support calling superclass methods, this
- // method checks for the existence of onHoverEvent() in the View class
- // before returning a value.
+ /**
+ * Receives hover events from the input framework. This method overrides
+ * View.dispatchHoverEvent(MotionEvent) on SDK version ICS or higher. On
+ * lower SDK versions, this method is never called.
+ *
+ * @param event The motion event to be dispatched.
+ * @return {@code true} if the event was handled by the view, {@code false}
+ * otherwise
+ */
+ public boolean dispatchHoverEvent(MotionEvent event) {
if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) {
final PointerTracker tracker = getPointerTracker(0);
- return AccessibleKeyboardViewProxy.getInstance().onHoverEvent(event, tracker);
+ return AccessibleKeyboardViewProxy.getInstance().dispatchHoverEvent(event, tracker);
}
+ // Reflection doesn't support calling superclass methods.
return false;
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index 617961b59..dad37e728 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -23,6 +23,7 @@ import android.util.Log;
import android.view.MotionEvent;
import com.android.inputmethod.deprecated.VoiceProxy;
+import com.android.inputmethod.latin.LatinIME;
import com.android.inputmethod.latin.LatinImeLogger;
import com.android.inputmethod.latin.Utils;
@@ -40,8 +41,6 @@ public class LatinKeyboardView extends LatinKeyboardBaseView {
private boolean mDisableDisambiguation;
/** The distance threshold at which we start treating the touch session as a multi-touch */
private int mJumpThresholdSquare = Integer.MAX_VALUE;
- /** The y coordinate of the last row */
- private int mLastRowY;
private int mLastX;
private int mLastY;
@@ -55,57 +54,60 @@ public class LatinKeyboardView extends LatinKeyboardBaseView {
@Override
public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) {
- LatinKeyboard latinKeyboard = getLatinKeyboard();
- if (latinKeyboard != null
- && (latinKeyboard.isPhoneKeyboard() || latinKeyboard.isNumberKeyboard())) {
- // Phone and number keyboard never shows popup preview (except language switch).
- super.setKeyPreviewPopupEnabled(false, delay);
- } else {
- super.setKeyPreviewPopupEnabled(previewEnabled, delay);
+ final Keyboard keyboard = getKeyboard();
+ if (keyboard instanceof LatinKeyboard) {
+ final LatinKeyboard latinKeyboard = (LatinKeyboard)keyboard;
+ if (latinKeyboard.isPhoneKeyboard() || latinKeyboard.isNumberKeyboard()) {
+ // Phone and number keyboard never shows popup preview.
+ super.setKeyPreviewPopupEnabled(false, delay);
+ return;
+ }
}
+ super.setKeyPreviewPopupEnabled(previewEnabled, delay);
}
@Override
public void setKeyboard(Keyboard newKeyboard) {
super.setKeyboard(newKeyboard);
// One-seventh of the keyboard width seems like a reasonable threshold
- mJumpThresholdSquare = newKeyboard.getMinWidth() / 7;
- mJumpThresholdSquare *= mJumpThresholdSquare;
- // Assuming there are 4 rows, this is the coordinate of the last row
- mLastRowY = (newKeyboard.getHeight() * 3) / 4;
- }
-
- private LatinKeyboard getLatinKeyboard() {
- Keyboard keyboard = getKeyboard();
- if (keyboard instanceof LatinKeyboard) {
- return (LatinKeyboard)keyboard;
- } else {
- return null;
- }
+ final int jumpThreshold = newKeyboard.mOccupiedWidth / 7;
+ mJumpThresholdSquare = jumpThreshold * jumpThreshold;
}
public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboard oldKeyboard) {
- final LatinKeyboard currentKeyboard = getLatinKeyboard();
+ final Keyboard keyboard = getKeyboard();
// We should not set text fade factor to the keyboard which does not display the language on
// its spacebar.
- if (currentKeyboard != null && currentKeyboard == oldKeyboard)
- currentKeyboard.setSpacebarTextFadeFactor(fadeFactor, this);
+ if (keyboard instanceof LatinKeyboard && keyboard == oldKeyboard) {
+ ((LatinKeyboard)keyboard).setSpacebarTextFadeFactor(fadeFactor, this);
+ }
}
@Override
protected boolean onLongPress(Key key, PointerTracker tracker) {
- int primaryCode = key.mCode;
+ final int primaryCode = key.mCode;
+ final Keyboard keyboard = getKeyboard();
+ if (keyboard instanceof LatinKeyboard) {
+ final LatinKeyboard latinKeyboard = (LatinKeyboard) keyboard;
+ if (primaryCode == Keyboard.CODE_DIGIT0 && latinKeyboard.isPhoneKeyboard()) {
+ tracker.onLongPressed();
+ // Long pressing on 0 in phone number keypad gives you a '+'.
+ return invokeOnKey(Keyboard.CODE_PLUS);
+ }
+ if (primaryCode == Keyboard.CODE_SHIFT && latinKeyboard.isAlphaKeyboard()) {
+ tracker.onLongPressed();
+ return invokeOnKey(Keyboard.CODE_CAPSLOCK);
+ }
+ }
if (primaryCode == Keyboard.CODE_SETTINGS || primaryCode == Keyboard.CODE_SPACE) {
- tracker.onLongPressed();
// Both long pressing settings key and space key invoke IME switcher dialog.
- return invokeOnKey(Keyboard.CODE_SETTINGS_LONGPRESS);
- } else if (primaryCode == '0' && getLatinKeyboard().isPhoneKeyboard()) {
- tracker.onLongPressed();
- // Long pressing on 0 in phone number keypad gives you a '+'.
- return invokeOnKey('+');
- } else if (primaryCode == Keyboard.CODE_SHIFT) {
- tracker.onLongPressed();
- return invokeOnKey(Keyboard.CODE_CAPSLOCK);
+ if (getKeyboardActionListener().onCustomRequest(
+ LatinIME.CODE_SHOW_INPUT_METHOD_PICKER)) {
+ tracker.onLongPressed();
+ return true;
+ } else {
+ return super.onLongPress(key, tracker);
+ }
} else {
return super.onLongPress(key, tracker);
}
@@ -127,7 +129,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView {
* the sudden moves subside, a DOWN event is simulated for the second key.
* @param me the motion event
* @return true if the event was consumed, so that it doesn't continue to be handled by
- * KeyboardView.
+ * {@link LatinKeyboardBaseView}.
*/
private boolean handleSuddenJump(MotionEvent me) {
// If device has distinct multi touch panel, there is no need to check sudden jump.
@@ -157,11 +159,8 @@ public class LatinKeyboardView extends LatinKeyboardBaseView {
case MotionEvent.ACTION_MOVE:
// Is this a big jump?
final int distanceSquare = (mLastX - x) * (mLastX - x) + (mLastY - y) * (mLastY - y);
- // Check the distance and also if the move is not entirely within the bottom row
- // If it's only in the bottom row, it might be an intentional slide gesture
- // for language switching
- if (distanceSquare > mJumpThresholdSquare
- && (mLastY < mLastRowY || y < mLastRowY)) {
+ // Check the distance.
+ if (distanceSquare > mJumpThresholdSquare) {
// If we're not yet dropping events, start dropping and send an UP event
if (!mDroppingEvents) {
mDroppingEvents = true;
@@ -201,7 +200,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView {
@Override
public boolean onTouchEvent(MotionEvent me) {
- if (getLatinKeyboard() == null) return true;
+ if (getKeyboard() == null) return true;
// If there was a sudden jump, return without processing the actual motion event.
if (handleSuddenJump(me)) {
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
index 44f9f195c..08e7d7e19 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
@@ -16,28 +16,14 @@
package com.android.inputmethod.keyboard;
-import android.content.Context;
+import com.android.inputmethod.keyboard.internal.MiniKeyboardBuilder.MiniKeyboardParams;
public class MiniKeyboard extends Keyboard {
- private int mDefaultKeyCoordX;
+ private final int mDefaultKeyCoordX;
- public MiniKeyboard(Context context, int xmlLayoutResId, Keyboard parentKeyboard) {
- super(context, xmlLayoutResId, parentKeyboard.mId.cloneAsMiniKeyboard(),
- parentKeyboard.getMinWidth());
- // HACK: Current mini keyboard design totally relies on the 9-patch padding about horizontal
- // and vertical key spacing. To keep the visual of mini keyboard as is, these hacks are
- // needed to keep having the same horizontal and vertical key spacing.
- setHorizontalGap(0);
- setVerticalGap(parentKeyboard.getVerticalGap() / 2);
-
- // TODO: When we have correctly padded key background 9-patch drawables for mini keyboard,
- // revert the above hacks and uncomment the following lines.
- //setHorizontalGap(parentKeyboard.getHorizontalGap());
- //setVerticalGap(parentKeyboard.getVerticalGap());
- }
-
- public void setDefaultCoordX(int pos) {
- mDefaultKeyCoordX = pos;
+ public MiniKeyboard(MiniKeyboardParams params) {
+ super(params);
+ mDefaultKeyCoordX = params.getDefaultKeyCoordX() + params.mDefaultKeyWidth / 2;
}
public int getDefaultCoordX() {
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
index 1ec0dda15..84bd44c30 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
@@ -37,7 +37,7 @@ public class MiniKeyboardKeyDetector extends KeyDetector {
@Override
public int getKeyIndexAndNearbyCodes(int x, int y, final int[] allCodes) {
- final List<Key> keys = getKeyboard().getKeys();
+ final List<Key> keys = getKeyboard().mKeys;
final int touchX = getTouchX(x);
final int touchY = getTouchY(y);
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 8d7496c54..1f8119a0f 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -19,11 +19,11 @@ package com.android.inputmethod.keyboard;
import android.content.Context;
import android.content.res.Resources;
import android.util.Log;
+import android.widget.TextView;
import com.android.inputmethod.keyboard.internal.PointerTrackerQueue;
import com.android.inputmethod.latin.LatinImeLogger;
import com.android.inputmethod.latin.R;
-import com.android.inputmethod.latin.SubtypeSwitcher;
import java.util.ArrayList;
import java.util.Arrays;
@@ -65,9 +65,11 @@ public class PointerTracker {
public interface DrawingProxy {
public void invalidateKey(Key key);
+ public TextView inflateKeyPreviewText();
public void showKeyPreview(int keyIndex, PointerTracker tracker);
public void cancelShowKeyPreview(PointerTracker tracker);
public void dismissKeyPreview(PointerTracker tracker);
+ public boolean dismissPopupPanel();
}
public interface TimerProxy {
@@ -100,6 +102,7 @@ public class PointerTracker {
private Keyboard mKeyboard;
private List<Key> mKeys;
private int mKeyQuarterWidthSquared;
+ private final TextView mKeyPreviewText;
// The position and time at which first down event occurred.
private long mDownTime;
@@ -118,9 +121,12 @@ public class PointerTracker {
// true if keyboard layout has been changed.
private boolean mKeyboardLayoutHasBeenChanged;
- // true if event is already translated to a key action (long press or mini-keyboard)
+ // true if event is already translated to a key action.
private boolean mKeyAlreadyProcessed;
+ // true if this pointer has been long-pressed and is showing a popup panel.
+ private boolean mIsShowingPopupPanel;
+
// true if this pointer is repeatable key
private boolean mIsRepeatableKey;
@@ -133,12 +139,6 @@ public class PointerTracker {
// ignore modifier key if true
private boolean mIgnoreModifierKey;
- // TODO: Remove these hacking variables
- // true if this pointer is in sliding language switch
- private boolean mIsInSlidingLanguageSwitch;
- private int mSpaceKeyIndex;
- private static SubtypeSwitcher sSubtypeSwitcher;
-
// Empty {@link KeyboardActionListener}
private static final KeyboardActionListener EMPTY_LISTENER = new KeyboardActionListener() {
@Override
@@ -151,6 +151,8 @@ public class PointerTracker {
public void onTextInput(CharSequence text) {}
@Override
public void onCancelInput() {}
+ @Override
+ public boolean onCustomRequest(int requestCode) { return false; }
};
public static void init(boolean hasDistinctMultitouch, Context context) {
@@ -172,7 +174,6 @@ public class PointerTracker {
sTouchNoiseThresholdDistanceSquared = (int)(
touchNoiseThresholdDistance * touchNoiseThresholdDistance);
sKeyboardSwitcher = KeyboardSwitcher.getInstance();
- sSubtypeSwitcher = SubtypeSwitcher.getInstance();
}
public static PointerTracker getPointerTracker(final int id, KeyEventHandler handler) {
@@ -207,8 +208,7 @@ public class PointerTracker {
public static void dismissAllKeyPreviews() {
for (final PointerTracker tracker : sTrackers) {
- tracker.setReleasedKeyGraphics();
- tracker.dismissKeyPreview();
+ tracker.setReleasedKeyGraphics(tracker.mKeyIndex);
}
}
@@ -220,6 +220,11 @@ public class PointerTracker {
mListener = handler.getKeyboardActionListener();
mDrawingProxy = handler.getDrawingProxy();
mTimerProxy = handler.getTimerProxy();
+ mKeyPreviewText = mDrawingProxy.inflateKeyPreviewText();
+ }
+
+ public TextView getKeyPreviewText() {
+ return mKeyPreviewText;
}
// Returns true if keyboard has been changed by this callback.
@@ -282,8 +287,8 @@ public class PointerTracker {
public void setKeyDetectorInner(KeyDetector keyDetector) {
mKeyDetector = keyDetector;
mKeyboard = keyDetector.getKeyboard();
- mKeys = mKeyboard.getKeys();
- final int keyQuarterWidth = mKeyboard.getKeyWidth() / 4;
+ mKeys = mKeyboard.mKeys;
+ final int keyQuarterWidth = mKeyboard.mMostCommonKeyWidth / 4;
mKeyQuarterWidthSquared = keyQuarterWidth * keyQuarterWidth;
}
@@ -326,18 +331,10 @@ public class PointerTracker {
return mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null);
}
- public boolean isSpaceKey(int keyIndex) {
- Key key = getKey(keyIndex);
- return key != null && key.mCode == Keyboard.CODE_SPACE;
- }
-
- public void setReleasedKeyGraphics() {
- setReleasedKeyGraphics(mKeyIndex);
- }
-
private void setReleasedKeyGraphics(int keyIndex) {
+ mDrawingProxy.dismissKeyPreview(this);
final Key key = getKey(keyIndex);
- if (key != null) {
+ if (key != null && key.isEnabled()) {
key.onReleased();
mDrawingProxy.invalidateKey(key);
}
@@ -346,11 +343,23 @@ public class PointerTracker {
private void setPressedKeyGraphics(int keyIndex) {
final Key key = getKey(keyIndex);
if (key != null && key.isEnabled()) {
+ if (isKeyPreviewRequired(key)) {
+ mDrawingProxy.showKeyPreview(keyIndex, this);
+ }
key.onPressed();
mDrawingProxy.invalidateKey(key);
}
}
+ // The modifier key, such as shift key, should not show its key preview.
+ private static boolean isKeyPreviewRequired(Key key) {
+ final int code = key.mCode;
+ if (isModifierCode(code) || code == Keyboard.CODE_DELETE
+ || code == Keyboard.CODE_ENTER || code == Keyboard.CODE_SPACE)
+ return false;
+ return true;
+ }
+
public int getLastX() {
return mLastX;
}
@@ -436,7 +445,6 @@ public class PointerTracker {
mKeyAlreadyProcessed = false;
mIsRepeatableKey = false;
mIsInSlidingKeyInput = false;
- mIsInSlidingLanguageSwitch = false;
mIgnoreModifierKey = false;
if (isValidKeyIndex(keyIndex)) {
// This onPress call may have changed keyboard layout. Those cases are detected at
@@ -447,7 +455,6 @@ public class PointerTracker {
startRepeatKey(keyIndex);
startLongPressTimer(keyIndex);
- showKeyPreview(keyIndex);
setPressedKeyGraphics(keyIndex);
}
}
@@ -464,12 +471,6 @@ public class PointerTracker {
if (mKeyAlreadyProcessed)
return;
- // TODO: Remove this hacking code
- if (mIsInSlidingLanguageSwitch) {
- ((LatinKeyboard)mKeyboard).updateSpacebarPreviewIcon(x - mKeyX);
- showKeyPreview(mSpaceKeyIndex);
- return;
- }
final int lastX = mLastX;
final int lastY = mLastY;
final int oldKeyIndex = mKeyIndex;
@@ -486,7 +487,6 @@ public class PointerTracker {
keyIndex = onMoveKey(x, y);
onMoveToNewKey(keyIndex, x, y);
startLongPressTimer(keyIndex);
- showKeyPreview(keyIndex);
setPressedKeyGraphics(keyIndex);
} else if (isMajorEnoughMoveToBeOnNewKey(x, y, keyIndex)) {
// The pointer has been slid in to the new key from the previous key, we must call
@@ -506,7 +506,6 @@ public class PointerTracker {
onMoveToNewKey(keyIndex, x, y);
startLongPressTimer(keyIndex);
setPressedKeyGraphics(keyIndex);
- showKeyPreview(keyIndex);
} else {
// HACK: On some devices, quick successive touches may be translated to sudden
// move by touch panel firmware. This hack detects the case and translates the
@@ -518,35 +517,14 @@ public class PointerTracker {
if (DEBUG_MODE)
Log.w(TAG, String.format("onMoveEvent: sudden move is translated to "
+ "up[%d,%d]/down[%d,%d] events", lastX, lastY, x, y));
- onUpEventInternal(lastX, lastY, eventTime, true);
+ onUpEventInternal(lastX, lastY, eventTime);
onDownEventInternal(x, y, eventTime);
} else {
mKeyAlreadyProcessed = true;
- dismissKeyPreview();
setReleasedKeyGraphics(oldKeyIndex);
}
}
}
- // TODO: Remove this hack code
- else if (isSpaceKey(keyIndex) && !mIsInSlidingLanguageSwitch
- && mKeyboard instanceof LatinKeyboard) {
- final LatinKeyboard keyboard = ((LatinKeyboard)mKeyboard);
- if (sSubtypeSwitcher.useSpacebarLanguageSwitcher()
- && sSubtypeSwitcher.getEnabledKeyboardLocaleCount() > 1) {
- final int diff = x - mKeyX;
- if (keyboard.shouldTriggerSpacebarSlidingLanguageSwitch(diff)) {
- // Detect start sliding language switch.
- mIsInSlidingLanguageSwitch = true;
- mSpaceKeyIndex = keyIndex;
- keyboard.updateSpacebarPreviewIcon(diff);
- // Display spacebar slide language switcher.
- showKeyPreview(keyIndex);
- final PointerTrackerQueue queue = sPointerTrackerQueue;
- if (queue != null)
- queue.releaseAllPointersExcept(this, eventTime, true);
- }
- }
- }
} else {
if (oldKey != null && isMajorEnoughMoveToBeOnNewKey(x, y, keyIndex)) {
// The pointer has been slid out from the previous key, we must call onRelease() to
@@ -559,7 +537,6 @@ public class PointerTracker {
onMoveToNewKey(keyIndex, x, y);
} else {
mKeyAlreadyProcessed = true;
- dismissKeyPreview();
}
}
}
@@ -574,27 +551,26 @@ public class PointerTracker {
if (isModifier()) {
// Before processing an up event of modifier key, all pointers already being
// tracked should be released.
- queue.releaseAllPointersExcept(this, eventTime, true);
+ queue.releaseAllPointersExcept(this, eventTime);
} else {
queue.releaseAllPointersOlderThan(this, eventTime);
}
queue.remove(this);
}
- onUpEventInternal(x, y, eventTime, true);
+ onUpEventInternal(x, y, eventTime);
}
// Let this pointer tracker know that one of newer-than-this pointer trackers got an up event.
// This pointer tracker needs to keep the key top graphics "pressed", but needs to get a
// "virtual" up event.
- public void onPhantomUpEvent(int x, int y, long eventTime, boolean updateReleasedKeyGraphics) {
+ public void onPhantomUpEvent(int x, int y, long eventTime) {
if (DEBUG_EVENT)
printTouchEvent("onPhntEvent:", x, y, eventTime);
- onUpEventInternal(x, y, eventTime, updateReleasedKeyGraphics);
+ onUpEventInternal(x, y, eventTime);
mKeyAlreadyProcessed = true;
}
- private void onUpEventInternal(int x, int y, long eventTime,
- boolean updateReleasedKeyGraphics) {
+ private void onUpEventInternal(int x, int y, long eventTime) {
mTimerProxy.cancelKeyTimers();
mDrawingProxy.cancelShowKeyPreview(this);
mIsInSlidingKeyInput = false;
@@ -608,34 +584,27 @@ public class PointerTracker {
keyY = mKeyY;
}
final int keyIndex = onUpKey(keyX, keyY, eventTime);
- dismissKeyPreview();
- if (updateReleasedKeyGraphics)
- setReleasedKeyGraphics(keyIndex);
+ setReleasedKeyGraphics(keyIndex);
+ if (mIsShowingPopupPanel) {
+ mDrawingProxy.dismissPopupPanel();
+ mIsShowingPopupPanel = false;
+ }
if (mKeyAlreadyProcessed)
return;
- // TODO: Remove this hacking code
- if (mIsInSlidingLanguageSwitch) {
- setReleasedKeyGraphics(mSpaceKeyIndex);
- final int languageDir = ((LatinKeyboard)mKeyboard).getLanguageChangeDirection();
- if (languageDir != 0) {
- final int code = (languageDir == 1)
- ? LatinKeyboard.CODE_NEXT_LANGUAGE : LatinKeyboard.CODE_PREV_LANGUAGE;
- // This will change keyboard layout.
- mListener.onCodeInput(code, new int[] {code}, keyX, keyY);
- }
- mIsInSlidingLanguageSwitch = false;
- ((LatinKeyboard)mKeyboard).setSpacebarSlidingLanguageSwitchDiff(0);
- return;
- }
if (!mIsRepeatableKey) {
detectAndSendKey(keyIndex, keyX, keyY);
}
}
+ public void onShowPopupPanel(int x, int y, long eventTime, KeyEventHandler handler) {
+ onLongPressed();
+ onDownEvent(x, y, eventTime, handler);
+ mIsShowingPopupPanel = true;
+ }
+
public void onLongPressed() {
mKeyAlreadyProcessed = true;
- setReleasedKeyGraphics();
- dismissKeyPreview();
+ setReleasedKeyGraphics(mKeyIndex);
final PointerTrackerQueue queue = sPointerTrackerQueue;
if (queue != null) {
queue.remove(this);
@@ -648,7 +617,7 @@ public class PointerTracker {
final PointerTrackerQueue queue = sPointerTrackerQueue;
if (queue != null) {
- queue.releaseAllPointersExcept(this, eventTime, true);
+ queue.releaseAllPointersExcept(this, eventTime);
queue.remove(this);
}
onCancelEventInternal();
@@ -657,15 +626,17 @@ public class PointerTracker {
private void onCancelEventInternal() {
mTimerProxy.cancelKeyTimers();
mDrawingProxy.cancelShowKeyPreview(this);
- dismissKeyPreview();
setReleasedKeyGraphics(mKeyIndex);
mIsInSlidingKeyInput = false;
+ if (mIsShowingPopupPanel) {
+ mDrawingProxy.dismissPopupPanel();
+ mIsShowingPopupPanel = false;
+ }
}
private void startRepeatKey(int keyIndex) {
final Key key = getKey(keyIndex);
if (key != null && key.mRepeatable) {
- dismissKeyPreview();
onRepeatKey(keyIndex);
mTimerProxy.startKeyRepeatTimer(sDelayBeforeKeyRepeatStart, keyIndex, this);
mIsRepeatableKey = true;
@@ -695,31 +666,9 @@ public class PointerTracker {
}
}
- // The modifier key, such as shift key, should not show its key preview.
- private boolean isKeyPreviewNotRequired(int keyIndex) {
- final Key key = getKey(keyIndex);
- if (key == null || !key.isEnabled())
- return true;
- // Such as spacebar sliding language switch.
- if (mKeyboard.needSpacebarPreview(keyIndex))
- return false;
- final int code = key.mCode;
- return isModifierCode(code) || code == Keyboard.CODE_DELETE
- || code == Keyboard.CODE_ENTER || code == Keyboard.CODE_SPACE;
- }
-
- private void showKeyPreview(int keyIndex) {
- if (isKeyPreviewNotRequired(keyIndex))
- return;
- mDrawingProxy.showKeyPreview(keyIndex, this);
- }
-
- private void dismissKeyPreview() {
- mDrawingProxy.dismissKeyPreview(this);
- }
-
private void startLongPressTimer(int keyIndex) {
Key key = getKey(keyIndex);
+ if (key == null) return;
if (key.mCode == Keyboard.CODE_SHIFT) {
if (sLongPressShiftKeyTimeout > 0) {
mTimerProxy.startLongPressTimer(sLongPressShiftKeyTimeout, keyIndex, this);
diff --git a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java
index 5ab44d063..fb932e3e8 100644
--- a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java
@@ -59,19 +59,16 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel {
public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) {
mParentKeyboardView.getKeyboardActionListener()
.onCodeInput(primaryCode, keyCodes, x, y);
- mParentKeyboardView.dismissMiniKeyboard();
}
@Override
public void onTextInput(CharSequence text) {
mParentKeyboardView.getKeyboardActionListener().onTextInput(text);
- mParentKeyboardView.dismissMiniKeyboard();
}
@Override
public void onCancelInput() {
mParentKeyboardView.getKeyboardActionListener().onCancelInput();
- mParentKeyboardView.dismissMiniKeyboard();
}
@Override
@@ -82,6 +79,8 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel {
public void onRelease(int primaryCode, boolean withSliding) {
mParentKeyboardView.getKeyboardActionListener().onRelease(primaryCode, withSliding);
}
+ @Override
+ public boolean onCustomRequest(int requestCode) { return false; }
};
public PopupMiniKeyboardView(Context context, AttributeSet attrs) {
@@ -108,6 +107,18 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel {
}
@Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final Keyboard keyboard = getKeyboard();
+ if (keyboard != null) {
+ final int width = keyboard.mOccupiedWidth + getPaddingLeft() + getPaddingRight();
+ final int height = keyboard.mOccupiedHeight + getPaddingTop() + getPaddingBottom();
+ setMeasuredDimension(width, height);
+ } else {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+ }
+
+ @Override
public void setKeyboard(Keyboard keyboard) {
super.setKeyboard(keyboard);
mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(),
@@ -147,7 +158,7 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel {
}
@Override
- public void showPanel(LatinKeyboardBaseView parentKeyboardView, Key parentKey,
+ public void showPopupPanel(LatinKeyboardBaseView parentKeyboardView, Key parentKey,
PointerTracker tracker, PopupWindow window) {
mParentKeyboardView = parentKeyboardView;
final View container = (View)getParent();
@@ -161,9 +172,9 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel {
final int miniKeyboardLeft = pointX - miniKeyboard.getDefaultCoordX()
+ parentKeyboardView.getPaddingLeft();
final int x = Math.max(0, Math.min(miniKeyboardLeft,
- parentKeyboardView.getWidth() - miniKeyboard.getMinWidth()))
+ parentKeyboardView.getWidth() - miniKeyboard.mOccupiedWidth))
- container.getPaddingLeft() + mCoordinates[0];
- final int y = pointY - parentKeyboard.getVerticalGap()
+ final int y = pointY - parentKeyboard.mVerticalGap
- (container.getMeasuredHeight() - container.getPaddingBottom())
+ parentKeyboardView.getPaddingTop() + mCoordinates[1];
@@ -180,6 +191,11 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel {
}
@Override
+ public boolean dismissPopupPanel() {
+ return mParentKeyboardView.dismissPopupPanel();
+ }
+
+ @Override
public int translateX(int x) {
return x - mOriginX;
}
diff --git a/java/src/com/android/inputmethod/keyboard/PopupPanel.java b/java/src/com/android/inputmethod/keyboard/PopupPanel.java
index f94d1c562..dc526e74f 100644
--- a/java/src/com/android/inputmethod/keyboard/PopupPanel.java
+++ b/java/src/com/android/inputmethod/keyboard/PopupPanel.java
@@ -26,7 +26,7 @@ public interface PopupPanel extends PointerTracker.KeyEventHandler {
* @param tracker the pointer tracker that pressesd the parent key
* @param window PopupWindow to be used to show this popup panel
*/
- public void showPanel(LatinKeyboardBaseView parentKeyboardView, Key parentKey,
+ public void showPopupPanel(LatinKeyboardBaseView parentKeyboardView, Key parentKey,
PointerTracker tracker, PopupWindow window);
/**
diff --git a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
index aadedc69d..5e73d6300 100644
--- a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
+++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
@@ -17,8 +17,10 @@
package com.android.inputmethod.keyboard;
import com.android.inputmethod.latin.Utils;
+import com.android.inputmethod.latin.spellcheck.SpellCheckerProximityInfo;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
public class ProximityInfo {
@@ -54,6 +56,19 @@ public class ProximityInfo {
computeNearestNeighbors(keyWidth, keys);
}
+ public static ProximityInfo getDummyProximityInfo() {
+ return new ProximityInfo(1, 1, 1, 1, 1, Collections.<Key>emptyList());
+ }
+
+ public static ProximityInfo getSpellCheckerProximityInfo() {
+ final ProximityInfo spellCheckerProximityInfo = getDummyProximityInfo();
+ spellCheckerProximityInfo.mNativeProximityInfo =
+ spellCheckerProximityInfo.setProximityInfoNative(
+ SpellCheckerProximityInfo.ROW_SIZE,
+ 480, 300, 10, 3, SpellCheckerProximityInfo.PROXIMITY);
+ return spellCheckerProximityInfo;
+ }
+
private int mNativeProximityInfo;
static {
Utils.loadNativeLibrary();
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
index 30d9692a8..c0dba4173 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
@@ -20,7 +20,7 @@ import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.util.Log;
-import com.android.inputmethod.keyboard.internal.KeyboardParser.ParseException;
+import com.android.inputmethod.keyboard.internal.KeyboardBuilder.ParseException;
import com.android.inputmethod.latin.R;
import java.util.ArrayList;
@@ -212,19 +212,19 @@ public class KeyStyles {
public void parseKeyStyleAttributes(TypedArray keyStyleAttr, TypedArray keyAttrs,
XmlResourceParser parser) {
- String styleName = keyStyleAttr.getString(R.styleable.Keyboard_KeyStyle_styleName);
+ final String styleName = keyStyleAttr.getString(R.styleable.Keyboard_KeyStyle_styleName);
if (DEBUG) Log.d(TAG, String.format("<%s styleName=%s />",
- KeyboardParser.TAG_KEY_STYLE, styleName));
+ KeyboardBuilder.TAG_KEY_STYLE, styleName));
if (mStyles.containsKey(styleName))
throw new ParseException("duplicate key style declared: " + styleName, parser);
final DeclaredKeyStyle style = new DeclaredKeyStyle();
if (keyStyleAttr.hasValue(R.styleable.Keyboard_KeyStyle_parentStyle)) {
- String parentStyle = keyStyleAttr.getString(
+ final String parentStyle = keyStyleAttr.getString(
R.styleable.Keyboard_KeyStyle_parentStyle);
final DeclaredKeyStyle parent = mStyles.get(parentStyle);
if (parent == null)
- throw new ParseException("Unknown parentStyle " + parent, parser);
+ throw new ParseException("Unknown parentStyle " + parentStyle, parser);
style.addParent(parent);
}
style.parseKeyStyleAttributes(keyAttrs);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
index e35db8955..de04ecd6c 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.util.Xml;
@@ -36,12 +37,11 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.Arrays;
-import java.util.List;
/**
- * Parser for BaseKeyboard.
+ * Keyboard Building helper.
*
- * This class parses Keyboard XML file and fill out keys in Keyboard.
+ * This class parses Keyboard XML file and eventually build a Keyboard.
* The Keyboard XML file looks like:
* <pre>
* &gt;!-- xml/keyboard.xml --&lt;
@@ -107,8 +107,8 @@ import java.util.List;
* </pre>
*/
-public class KeyboardParser {
- private static final String TAG = KeyboardParser.class.getSimpleName();
+public class KeyboardBuilder<KP extends KeyboardParams> {
+ private static final String TAG = KeyboardBuilder.class.getSimpleName();
private static final boolean DEBUG = false;
// Keyboard XML Tags
@@ -123,38 +123,52 @@ public class KeyboardParser {
private static final String TAG_DEFAULT = "default";
public static final String TAG_KEY_STYLE = "key-style";
- private final Keyboard mKeyboard;
- private final Context mContext;
- private final Resources mResources;
+ protected final KP mParams;
+ protected final Context mContext;
+ protected final Resources mResources;
+ private final DisplayMetrics mDisplayMetrics;
- private int mKeyboardTopPadding;
- private int mKeyboardBottomPadding;
- private int mHorizontalEdgesPadding;
private int mCurrentX = 0;
private int mCurrentY = 0;
- private int mMaxRowWidth = 0;
- private int mTotalHeight = 0;
private Row mCurrentRow = null;
+ private boolean mLeftEdge;
+ private Key mRightEdgeKey = null;
private final KeyStyles mKeyStyles = new KeyStyles();
- public KeyboardParser(Keyboard keyboard, Context context) {
- mKeyboard = keyboard;
+ public KeyboardBuilder(Context context, KP params) {
mContext = context;
final Resources res = context.getResources();
mResources = res;
- mHorizontalEdgesPadding = (int)res.getDimension(R.dimen.keyboard_horizontal_edges_padding);
+ mDisplayMetrics = res.getDisplayMetrics();
+
+ mParams = params;
+ mParams.mHorizontalEdgesPadding = (int)res.getDimension(
+ R.dimen.keyboard_horizontal_edges_padding);
+
+ mParams.GRID_WIDTH = res.getInteger(R.integer.config_keyboard_grid_width);
+ mParams.GRID_HEIGHT = res.getInteger(R.integer.config_keyboard_grid_height);
}
- public int getMaxRowWidth() {
- return mMaxRowWidth;
+ public KeyboardBuilder<KP> load(KeyboardId id) {
+ mParams.mId = id;
+ try {
+ parseKeyboard(id.getXmlId());
+ } catch (XmlPullParserException e) {
+ Log.w(TAG, "keyboard XML parse error: " + e);
+ throw new IllegalArgumentException(e);
+ } catch (IOException e) {
+ Log.w(TAG, "keyboard XML parse error: " + e);
+ throw new RuntimeException(e);
+ }
+ return this;
}
- public int getTotalHeight() {
- return mTotalHeight;
+ public Keyboard build() {
+ return new Keyboard(mParams);
}
- public void parseKeyboard(int resId) throws XmlPullParserException, IOException {
- if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_KEYBOARD, mKeyboard.mId));
+ private void parseKeyboard(int resId) throws XmlPullParserException, IOException {
+ if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_KEYBOARD, mParams.mId));
final XmlResourceParser parser = mResources.getXml(resId);
int event;
while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
@@ -163,7 +177,7 @@ public class KeyboardParser {
if (TAG_KEYBOARD.equals(tag)) {
parseKeyboardAttributes(parser);
startKeyboard();
- parseKeyboardContent(parser, mKeyboard.getKeys());
+ parseKeyboardContent(parser, false);
break;
} else {
throw new IllegalStartTag(parser, TAG_KEYBOARD);
@@ -194,15 +208,14 @@ public class KeyboardParser {
}
private void parseKeyboardAttributes(XmlResourceParser parser) {
- final Keyboard keyboard = mKeyboard;
- final int displayWidth = keyboard.getDisplayWidth();
+ final int displayWidth = mDisplayMetrics.widthPixels;
final TypedArray keyboardAttr = mContext.obtainStyledAttributes(
Xml.asAttributeSet(parser), R.styleable.Keyboard, R.attr.keyboardStyle,
R.style.Keyboard);
final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
R.styleable.Keyboard_Key);
try {
- final int displayHeight = keyboard.getDisplayHeight();
+ final int displayHeight = mDisplayMetrics.heightPixels;
final int keyboardHeight = (int)keyboardAttr.getDimension(
R.styleable.Keyboard_keyboardHeight, displayHeight / 2);
final int maxKeyboardHeight = getDimensionOrFraction(keyboardAttr,
@@ -217,60 +230,67 @@ public class KeyboardParser {
}
// Keyboard height will not exceed maxKeyboardHeight and will not be less than
// minKeyboardHeight.
- final int height = Math.max(
+ mParams.mOccupiedHeight = Math.max(
Math.min(keyboardHeight, maxKeyboardHeight), minKeyboardHeight);
-
-
- keyboard.setKeyboardHeight(height);
- keyboard.setKeyWidth(getDimensionOrFraction(keyboardAttr,
- R.styleable.Keyboard_keyWidth, displayWidth, displayWidth / 10));
- keyboard.setRowHeight(getDimensionOrFraction(keyboardAttr,
- R.styleable.Keyboard_rowHeight, height, 50));
- keyboard.setHorizontalGap(getDimensionOrFraction(keyboardAttr,
- R.styleable.Keyboard_horizontalGap, displayWidth, 0));
- keyboard.setVerticalGap(getDimensionOrFraction(keyboardAttr,
- R.styleable.Keyboard_verticalGap, height, 0));
- keyboard.setPopupKeyboardResId(keyboardAttr.getResourceId(
- R.styleable.Keyboard_popupKeyboardTemplate, 0));
- keyboard.setMaxPopupKeyboardColumn(keyAttr.getInt(
- R.styleable.Keyboard_Key_maxPopupKeyboardColumn, 5));
-
- mKeyboard.mIconsSet.loadIcons(keyboardAttr);
- mKeyboardTopPadding = getDimensionOrFraction(keyboardAttr,
- R.styleable.Keyboard_keyboardTopPadding, height, 0);
- mKeyboardBottomPadding = getDimensionOrFraction(keyboardAttr,
- R.styleable.Keyboard_keyboardBottomPadding, height, 0);
+ mParams.mOccupiedWidth = mParams.mId.mWidth;
+ mParams.mTopPadding = getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_keyboardTopPadding, mParams.mOccupiedHeight, 0);
+ mParams.mBottomPadding = getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_keyboardBottomPadding, mParams.mOccupiedHeight, 0);
+
+ final int height = mParams.mOccupiedHeight;
+ final int width = mParams.mOccupiedWidth - mParams.mHorizontalEdgesPadding * 2
+ - mParams.mHorizontalCenterPadding;
+ mParams.mHeight = height;
+ mParams.mWidth = width;
+ mParams.mDefaultKeyWidth = getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_keyWidth, width, width / 10);
+ mParams.mDefaultRowHeight = getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_rowHeight, height, height / 4);
+ mParams.mHorizontalGap = getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_horizontalGap, width, 0);
+ mParams.mVerticalGap = getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_verticalGap, height, 0);
+
+ mParams.mIsRtlKeyboard = keyboardAttr.getBoolean(
+ R.styleable.Keyboard_isRtlKeyboard, false);
+ mParams.mPopupKeyboardResId = keyboardAttr.getResourceId(
+ R.styleable.Keyboard_popupKeyboardTemplate, 0);
+ mParams.mMaxPopupColumn = keyAttr.getInt(
+ R.styleable.Keyboard_Key_maxPopupKeyboardColumn, 5);
+
+ mParams.mIconsSet.loadIcons(keyboardAttr);
} finally {
keyAttr.recycle();
keyboardAttr.recycle();
}
}
- private void parseKeyboardContent(XmlResourceParser parser, List<Key> keys)
+ private void parseKeyboardContent(XmlResourceParser parser, boolean skip)
throws XmlPullParserException, IOException {
int event;
while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (event == XmlPullParser.START_TAG) {
final String tag = parser.getName();
if (TAG_ROW.equals(tag)) {
- Row row = new Row(mResources, mKeyboard, parser);
+ Row row = parseRowAttributes(parser);
if (DEBUG) Log.d(TAG, String.format("<%s>", TAG_ROW));
- if (keys != null)
+ if (!skip)
startRow(row);
- parseRowContent(parser, row, keys);
+ parseRowContent(parser, row, skip);
} else if (TAG_INCLUDE.equals(tag)) {
- parseIncludeKeyboardContent(parser, keys);
+ parseIncludeKeyboardContent(parser, skip);
} else if (TAG_SWITCH.equals(tag)) {
- parseSwitchKeyboardContent(parser, keys);
+ parseSwitchKeyboardContent(parser, skip);
} else if (TAG_KEY_STYLE.equals(tag)) {
- parseKeyStyle(parser, keys);
+ parseKeyStyle(parser, skip);
} else {
throw new IllegalStartTag(parser, TAG_ROW);
}
} else if (event == XmlPullParser.END_TAG) {
final String tag = parser.getName();
if (TAG_KEYBOARD.equals(tag)) {
- endKeyboard(mKeyboard.getVerticalGap());
+ endKeyboard();
break;
} else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag)
|| TAG_MERGE.equals(tag)) {
@@ -285,22 +305,36 @@ public class KeyboardParser {
}
}
- private void parseRowContent(XmlResourceParser parser, Row row, List<Key> keys)
+ private Row parseRowAttributes(XmlResourceParser parser) {
+ final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard);
+ try {
+ if (a.hasValue(R.styleable.Keyboard_horizontalGap))
+ throw new IllegalAttribute(parser, "horizontalGap");
+ if (a.hasValue(R.styleable.Keyboard_verticalGap))
+ throw new IllegalAttribute(parser, "verticalGap");
+ return new Row(mResources, mParams, parser);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ private void parseRowContent(XmlResourceParser parser, Row row, boolean skip)
throws XmlPullParserException, IOException {
int event;
while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (event == XmlPullParser.START_TAG) {
final String tag = parser.getName();
if (TAG_KEY.equals(tag)) {
- parseKey(parser, row, keys);
+ parseKey(parser, row, skip);
} else if (TAG_SPACER.equals(tag)) {
- parseSpacer(parser, row, keys);
+ parseSpacer(parser, row, skip);
} else if (TAG_INCLUDE.equals(tag)) {
- parseIncludeRowContent(parser, row, keys);
+ parseIncludeRowContent(parser, row, skip);
} else if (TAG_SWITCH.equals(tag)) {
- parseSwitchRowContent(parser, row, keys);
+ parseSwitchRowContent(parser, row, skip);
} else if (TAG_KEY_STYLE.equals(tag)) {
- parseKeyStyle(parser, keys);
+ parseKeyStyle(parser, skip);
} else {
throw new IllegalStartTag(parser, TAG_KEY);
}
@@ -308,7 +342,7 @@ public class KeyboardParser {
final String tag = parser.getName();
if (TAG_ROW.equals(tag)) {
if (DEBUG) Log.d(TAG, String.format("</%s>", TAG_ROW));
- if (keys != null)
+ if (!skip)
endRow();
break;
} else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag)
@@ -324,26 +358,24 @@ public class KeyboardParser {
}
}
- private void parseKey(XmlResourceParser parser, Row row, List<Key> keys)
+ private void parseKey(XmlResourceParser parser, Row row, boolean skip)
throws XmlPullParserException, IOException {
- if (keys == null) {
+ if (skip) {
checkEndTag(TAG_KEY, parser);
} else {
- Key key = new Key(mResources, row, mCurrentX, mCurrentY, parser, mKeyStyles);
+ Key key = new Key(mResources, mParams, row, mCurrentX, mCurrentY, parser, mKeyStyles);
if (DEBUG) Log.d(TAG, String.format("<%s%s keyLabel=%s code=%d popupCharacters=%s />",
TAG_KEY, (key.isEnabled() ? "" : " disabled"), key.mLabel, key.mCode,
Arrays.toString(key.mPopupCharacters)));
checkEndTag(TAG_KEY, parser);
- keys.add(key);
- if (key.mCode == Keyboard.CODE_SHIFT)
- mKeyboard.getShiftKeys().add(key);
+ mParams.onAddKey(key);
endKey(key);
}
}
- private void parseSpacer(XmlResourceParser parser, Row row, List<Key> keys)
+ private void parseSpacer(XmlResourceParser parser, Row row, boolean skip)
throws XmlPullParserException, IOException {
- if (keys == null) {
+ if (skip) {
checkEndTag(TAG_SPACER, parser);
} else {
if (DEBUG) Log.d(TAG, String.format("<%s />", TAG_SPACER));
@@ -351,14 +383,14 @@ public class KeyboardParser {
R.styleable.Keyboard);
if (keyboardAttr.hasValue(R.styleable.Keyboard_horizontalGap))
throw new IllegalAttribute(parser, "horizontalGap");
- final int keyboardWidth = mKeyboard.getDisplayWidth();
+ final int keyboardWidth = mParams.mWidth;
final int keyWidth = getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyWidth,
- keyboardWidth, row.mDefaultWidth);
+ keyboardWidth, row.mDefaultKeyWidth);
keyboardAttr.recycle();
final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
R.styleable.Keyboard_Key);
- int keyXPos = KeyboardParser.getDimensionOrFraction(keyAttr,
+ int keyXPos = KeyboardBuilder.getDimensionOrFraction(keyAttr,
R.styleable.Keyboard_Key_keyXPos, keyboardWidth, mCurrentX);
if (keyXPos < 0) {
// If keyXPos is negative, the actual x-coordinate will be display_width + keyXPos.
@@ -370,19 +402,19 @@ public class KeyboardParser {
}
}
- private void parseIncludeKeyboardContent(XmlResourceParser parser, List<Key> keys)
+ private void parseIncludeKeyboardContent(XmlResourceParser parser, boolean skip)
throws XmlPullParserException, IOException {
- parseIncludeInternal(parser, null, keys);
+ parseIncludeInternal(parser, null, skip);
}
- private void parseIncludeRowContent(XmlResourceParser parser, Row row, List<Key> keys)
+ private void parseIncludeRowContent(XmlResourceParser parser, Row row, boolean skip)
throws XmlPullParserException, IOException {
- parseIncludeInternal(parser, row, keys);
+ parseIncludeInternal(parser, row, skip);
}
- private void parseIncludeInternal(XmlResourceParser parser, Row row, List<Key> keys)
+ private void parseIncludeInternal(XmlResourceParser parser, Row row, boolean skip)
throws XmlPullParserException, IOException {
- if (keys == null) {
+ if (skip) {
checkEndTag(TAG_INCLUDE, parser);
} else {
final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
@@ -396,11 +428,11 @@ public class KeyboardParser {
throw new ParseException("No keyboardLayout attribute in <include/>", parser);
if (DEBUG) Log.d(TAG, String.format("<%s keyboardLayout=%s />",
TAG_INCLUDE, mResources.getResourceEntryName(keyboardLayout)));
- parseMerge(mResources.getLayout(keyboardLayout), row, keys);
+ parseMerge(mResources.getLayout(keyboardLayout), row, skip);
}
}
- private void parseMerge(XmlResourceParser parser, Row row, List<Key> keys)
+ private void parseMerge(XmlResourceParser parser, Row row, boolean skip)
throws XmlPullParserException, IOException {
int event;
while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
@@ -408,9 +440,9 @@ public class KeyboardParser {
final String tag = parser.getName();
if (TAG_MERGE.equals(tag)) {
if (row == null) {
- parseKeyboardContent(parser, keys);
+ parseKeyboardContent(parser, skip);
} else {
- parseRowContent(parser, row, keys);
+ parseRowContent(parser, row, skip);
}
break;
} else {
@@ -421,28 +453,28 @@ public class KeyboardParser {
}
}
- private void parseSwitchKeyboardContent(XmlResourceParser parser, List<Key> keys)
+ private void parseSwitchKeyboardContent(XmlResourceParser parser, boolean skip)
throws XmlPullParserException, IOException {
- parseSwitchInternal(parser, null, keys);
+ parseSwitchInternal(parser, null, skip);
}
- private void parseSwitchRowContent(XmlResourceParser parser, Row row, List<Key> keys)
+ private void parseSwitchRowContent(XmlResourceParser parser, Row row, boolean skip)
throws XmlPullParserException, IOException {
- parseSwitchInternal(parser, row, keys);
+ parseSwitchInternal(parser, row, skip);
}
- private void parseSwitchInternal(XmlResourceParser parser, Row row, List<Key> keys)
+ private void parseSwitchInternal(XmlResourceParser parser, Row row, boolean skip)
throws XmlPullParserException, IOException {
- if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_SWITCH, mKeyboard.mId));
+ if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_SWITCH, mParams.mId));
boolean selected = false;
int event;
while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (event == XmlPullParser.START_TAG) {
final String tag = parser.getName();
if (TAG_CASE.equals(tag)) {
- selected |= parseCase(parser, row, selected ? null : keys);
+ selected |= parseCase(parser, row, selected ? true : skip);
} else if (TAG_DEFAULT.equals(tag)) {
- selected |= parseDefault(parser, row, selected ? null : keys);
+ selected |= parseDefault(parser, row, selected ? true : skip);
} else {
throw new IllegalStartTag(parser, TAG_KEY);
}
@@ -458,21 +490,21 @@ public class KeyboardParser {
}
}
- private boolean parseCase(XmlResourceParser parser, Row row, List<Key> keys)
+ private boolean parseCase(XmlResourceParser parser, Row row, boolean skip)
throws XmlPullParserException, IOException {
final boolean selected = parseCaseCondition(parser);
if (row == null) {
// Processing Rows.
- parseKeyboardContent(parser, selected ? keys : null);
+ parseKeyboardContent(parser, selected ? skip : true);
} else {
// Processing Keys.
- parseRowContent(parser, row, selected ? keys : null);
+ parseRowContent(parser, row, selected ? skip : true);
}
return selected;
}
private boolean parseCaseCondition(XmlResourceParser parser) {
- final KeyboardId id = mKeyboard.mId;
+ final KeyboardId id = mParams.mId;
if (id == null)
return true;
@@ -493,10 +525,10 @@ public class KeyboardParser {
R.styleable.Keyboard_Case_f2KeyMode, id.mF2KeyMode);
final boolean clobberSettingsKeyMatched = matchBoolean(a,
R.styleable.Keyboard_Case_clobberSettingsKey, id.mClobberSettingsKey);
- final boolean voiceEnabledMatched = matchBoolean(a,
- R.styleable.Keyboard_Case_voiceKeyEnabled, id.mVoiceKeyEnabled);
- final boolean voiceKeyMatched = matchBoolean(a,
- R.styleable.Keyboard_Case_hasVoiceKey, id.mHasVoiceKey);
+ final boolean shortcutKeyEnabledMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_shortcutKeyEnabled, id.mShortcutKeyEnabled);
+ final boolean hasShortcutKeyMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_hasShortcutKey, id.mHasShortcutKey);
// As noted at {@link KeyboardId} class, we are interested only in enum value masked by
// {@link android.view.inputmethod.EditorInfo#IME_MASK_ACTION} and
// {@link android.view.inputmethod.EditorInfo#IME_FLAG_NO_ENTER_ACTION}. So matching
@@ -511,7 +543,7 @@ public class KeyboardParser {
R.styleable.Keyboard_Case_countryCode, id.mLocale.getCountry());
final boolean selected = modeMatched && navigateActionMatched && passwordInputMatched
&& hasSettingsKeyMatched && f2KeyModeMatched && clobberSettingsKeyMatched
- && voiceEnabledMatched && voiceKeyMatched && imeActionMatched &&
+ && shortcutKeyEnabledMatched && hasShortcutKeyMatched && imeActionMatched &&
localeCodeMatched && languageCodeMatched && countryCodeMatched;
if (DEBUG) Log.d(TAG, String.format("<%s%s%s%s%s%s%s%s%s%s%s%s%s> %s", TAG_CASE,
@@ -523,8 +555,9 @@ public class KeyboardParser {
a.getInt(R.styleable.Keyboard_Case_f2KeyMode, -1)), "f2KeyMode"),
booleanAttr(a, R.styleable.Keyboard_Case_clobberSettingsKey,
"clobberSettingsKey"),
- booleanAttr(a, R.styleable.Keyboard_Case_voiceKeyEnabled, "voiceKeyEnabled"),
- booleanAttr(a, R.styleable.Keyboard_Case_hasVoiceKey, "hasVoiceKey"),
+ booleanAttr(
+ a, R.styleable.Keyboard_Case_shortcutKeyEnabled, "shortcutKeyEnabled"),
+ booleanAttr(a, R.styleable.Keyboard_Case_hasShortcutKey, "hasShortcutKey"),
textAttr(EditorInfoCompatUtils.imeOptionsName(
a.getInt(R.styleable.Keyboard_Case_imeAction, -1)), "imeAction"),
textAttr(a.getString(R.styleable.Keyboard_Case_localeCode), "localeCode"),
@@ -580,18 +613,18 @@ public class KeyboardParser {
return false;
}
- private boolean parseDefault(XmlResourceParser parser, Row row, List<Key> keys)
+ private boolean parseDefault(XmlResourceParser parser, Row row, boolean skip)
throws XmlPullParserException, IOException {
if (DEBUG) Log.d(TAG, String.format("<%s>", TAG_DEFAULT));
if (row == null) {
- parseKeyboardContent(parser, keys);
+ parseKeyboardContent(parser, skip);
} else {
- parseRowContent(parser, row, keys);
+ parseRowContent(parser, row, skip);
}
return true;
}
- private void parseKeyStyle(XmlResourceParser parser, List<Key> keys) {
+ private void parseKeyStyle(XmlResourceParser parser, boolean skip) {
TypedArray keyStyleAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
R.styleable.Keyboard_KeyStyle);
TypedArray keyAttrs = mResources.obtainAttributes(Xml.asAttributeSet(parser),
@@ -600,7 +633,7 @@ public class KeyboardParser {
if (!keyStyleAttr.hasValue(R.styleable.Keyboard_KeyStyle_styleName))
throw new ParseException("<" + TAG_KEY_STYLE
+ "/> needs styleName attribute", parser);
- if (keys != null)
+ if (!skip)
mKeyStyles.parseKeyStyleAttributes(keyStyleAttr, keyAttrs, parser);
} finally {
keyStyleAttr.recycle();
@@ -616,36 +649,45 @@ public class KeyboardParser {
}
private void startKeyboard() {
- mCurrentY += mKeyboardTopPadding;
+ mCurrentY += mParams.mTopPadding;
}
private void startRow(Row row) {
mCurrentX = 0;
- setSpacer(mCurrentX, mHorizontalEdgesPadding);
+ setSpacer(mCurrentX, mParams.mHorizontalEdgesPadding);
mCurrentRow = row;
+ mLeftEdge = true;
+ mRightEdgeKey = null;
}
private void endRow() {
if (mCurrentRow == null)
throw new InflateException("orphant end row tag");
- setSpacer(mCurrentX, mHorizontalEdgesPadding);
- if (mCurrentX > mMaxRowWidth)
- mMaxRowWidth = mCurrentX;
- mCurrentY += mCurrentRow.mDefaultHeight;
+ if (mRightEdgeKey != null) {
+ mRightEdgeKey.addEdgeFlags(Keyboard.EDGE_RIGHT);
+ mRightEdgeKey = null;
+ }
+ setSpacer(mCurrentX, mParams.mHorizontalEdgesPadding);
+ mCurrentY += mCurrentRow.mRowHeight;
mCurrentRow = null;
}
private void endKey(Key key) {
- mCurrentX = key.mX - key.mGap / 2 + key.mWidth + key.mGap;
+ mCurrentX = key.mX - key.mHorizontalGap / 2 + key.mWidth + key.mHorizontalGap;
+ if (mLeftEdge) {
+ key.addEdgeFlags(Keyboard.EDGE_LEFT);
+ mLeftEdge = false;
+ }
+ mRightEdgeKey = key;
}
- private void endKeyboard(int defaultVerticalGap) {
- mCurrentY += mKeyboardBottomPadding;
- mTotalHeight = mCurrentY - defaultVerticalGap;
+ private void endKeyboard() {
}
private void setSpacer(int keyXPos, int width) {
mCurrentX = keyXPos + width;
+ mLeftEdge = false;
+ mRightEdgeKey = null;
}
public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) {
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java
index 535a6954c..2d8b7bf11 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java
@@ -21,7 +21,6 @@ import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.Log;
-import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.R;
public class KeyboardIconsSet {
@@ -31,44 +30,33 @@ public class KeyboardIconsSet {
// This should be aligned with Keyboard.keyIcon enum.
private static final int ICON_SHIFT_KEY = 1;
- private static final int ICON_TO_SYMBOL_KEY = 2;
- private static final int ICON_TO_SYMBOL_KEY_WITH_SHORTCUT = 3;
- private static final int ICON_DELETE_KEY = 4;
- private static final int ICON_DELETE_RTL_KEY = 5;
- private static final int ICON_SETTINGS_KEY = 6;
- private static final int ICON_SHORTCUT_KEY = 7;
- private static final int ICON_SPACE_KEY = 8;
- private static final int ICON_RETURN_KEY = 9;
- private static final int ICON_SEARCH_KEY = 10;
- private static final int ICON_TAB_KEY = 11;
+ private static final int ICON_DELETE_KEY = 2;
+ private static final int ICON_SETTINGS_KEY = 3; // This is also represented as "@icon/3" in XML.
+ private static final int ICON_SPACE_KEY = 4;
+ private static final int ICON_RETURN_KEY = 5;
+ private static final int ICON_SEARCH_KEY = 6;
+ private static final int ICON_TAB_KEY = 7; // This is also represented as "@icon/7" in XML.
+ private static final int ICON_SHORTCUT_KEY = 8;
+ private static final int ICON_SHORTCUT_FOR_LABEL = 9;
// This should be aligned with Keyboard.keyIconShifted enum.
- private static final int ICON_SHIFTED_SHIFT_KEY = 12;
+ private static final int ICON_SHIFTED_SHIFT_KEY = 10;
// This should be aligned with Keyboard.keyIconPreview enum.
- private static final int ICON_PREVIEW_SPACE_KEY = 13;
- private static final int ICON_PREVIEW_TAB_KEY = 14;
- private static final int ICON_PREVIEW_SETTINGS_KEY = 15;
- private static final int ICON_PREVIEW_SHORTCUT_KEY = 16;
+ private static final int ICON_PREVIEW_TAB_KEY = 11;
+ private static final int ICON_PREVIEW_SETTINGS_KEY = 12;
+ private static final int ICON_PREVIEW_SHORTCUT_KEY = 13;
- private static final int ICON_LAST = 16;
+ private static final int ICON_LAST = 13;
private final Drawable mIcons[] = new Drawable[ICON_LAST + 1];
- private static final int getIconId(int attrIndex) {
+ private static final int getIconId(final int attrIndex) {
switch (attrIndex) {
case R.styleable.Keyboard_iconShiftKey:
return ICON_SHIFT_KEY;
- case R.styleable.Keyboard_iconToSymbolKey:
- return ICON_TO_SYMBOL_KEY;
- case R.styleable.Keyboard_iconToSymbolKeyWithShortcut:
- return ICON_TO_SYMBOL_KEY_WITH_SHORTCUT;
case R.styleable.Keyboard_iconDeleteKey:
return ICON_DELETE_KEY;
- case R.styleable.Keyboard_iconDeleteRtlKey:
- return ICON_DELETE_RTL_KEY;
case R.styleable.Keyboard_iconSettingsKey:
return ICON_SETTINGS_KEY;
- case R.styleable.Keyboard_iconShortcutKey:
- return ICON_SHORTCUT_KEY;
case R.styleable.Keyboard_iconSpaceKey:
return ICON_SPACE_KEY;
case R.styleable.Keyboard_iconReturnKey:
@@ -77,10 +65,12 @@ public class KeyboardIconsSet {
return ICON_SEARCH_KEY;
case R.styleable.Keyboard_iconTabKey:
return ICON_TAB_KEY;
+ case R.styleable.Keyboard_iconShortcutKey:
+ return ICON_SHORTCUT_KEY;
+ case R.styleable.Keyboard_iconShortcutForLabel:
+ return ICON_SHORTCUT_FOR_LABEL;
case R.styleable.Keyboard_iconShiftedShiftKey:
return ICON_SHIFTED_SHIFT_KEY;
- case R.styleable.Keyboard_iconPreviewSpaceKey:
- return ICON_PREVIEW_SPACE_KEY;
case R.styleable.Keyboard_iconPreviewTabKey:
return ICON_PREVIEW_TAB_KEY;
case R.styleable.Keyboard_iconPreviewSettingsKey:
@@ -92,16 +82,14 @@ public class KeyboardIconsSet {
}
}
- public void loadIcons(TypedArray keyboardAttrs) {
+ public void loadIcons(final TypedArray keyboardAttrs) {
final int count = keyboardAttrs.getIndexCount();
for (int i = 0; i < count; i++) {
final int attrIndex = keyboardAttrs.getIndex(i);
final int iconId = getIconId(attrIndex);
if (iconId != ICON_UNDEFINED) {
try {
- final Drawable icon = keyboardAttrs.getDrawable(attrIndex);
- Keyboard.setDefaultBounds(icon);
- mIcons[iconId] = icon;
+ mIcons[iconId] = setDefaultBounds(keyboardAttrs.getDrawable(attrIndex));
} catch (Resources.NotFoundException e) {
Log.w(TAG, "Drawable resource for icon #" + iconId + " not found");
}
@@ -109,11 +97,18 @@ public class KeyboardIconsSet {
}
}
- public Drawable getIcon(int iconId) {
+ public Drawable getIcon(final int iconId) {
if (iconId == ICON_UNDEFINED)
return null;
if (iconId < 0 || iconId >= mIcons.length)
throw new IllegalArgumentException("icon id is out of range: " + iconId);
return mIcons[iconId];
}
+
+ private static Drawable setDefaultBounds(final Drawable icon) {
+ if (icon != null) {
+ icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
+ }
+ return icon;
+ }
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java
new file mode 100644
index 000000000..4ccaa72d2
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard.internal;
+
+import android.graphics.drawable.Drawable;
+
+import com.android.inputmethod.keyboard.Key;
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardId;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class KeyboardParams {
+ public KeyboardId mId;
+
+ public int mOccupiedHeight;
+ public int mOccupiedWidth;
+
+ public int mHeight;
+ public int mWidth;
+
+ public int mTopPadding;
+ public int mBottomPadding;
+ public int mHorizontalEdgesPadding;
+ public int mHorizontalCenterPadding;
+
+ public int mDefaultRowHeight;
+ public int mDefaultKeyWidth;
+ public int mHorizontalGap;
+ public int mVerticalGap;
+
+ public boolean mIsRtlKeyboard;
+ public int mPopupKeyboardResId;
+ public int mMaxPopupColumn;
+
+ public int GRID_WIDTH;
+ public int GRID_HEIGHT;
+
+ public final List<Key> mKeys = new ArrayList<Key>();
+ public final List<Key> mShiftKeys = new ArrayList<Key>();
+ public final Set<Key> mShiftLockKeys = new HashSet<Key>();
+ public final Map<Key, Drawable> mShiftedIcons = new HashMap<Key, Drawable>();
+ public final Map<Key, Drawable> mUnshiftedIcons = new HashMap<Key, Drawable>();
+ public final KeyboardIconsSet mIconsSet = new KeyboardIconsSet();
+
+ public int mMostCommonKeyWidth = 0;
+
+ public void onAddKey(Key key) {
+ mKeys.add(key);
+ updateHistogram(key);
+ if (key.mCode == Keyboard.CODE_SHIFT) {
+ mShiftKeys.add(key);
+ if (key.mSticky) {
+ mShiftLockKeys.add(key);
+ }
+ }
+ }
+
+ public void addShiftedIcon(Key key, Drawable icon) {
+ mUnshiftedIcons.put(key, key.getIcon());
+ mShiftedIcons.put(key, icon);
+ }
+
+ private int mMaxCount = 0;
+ private final Map<Integer, Integer> mHistogram = new HashMap<Integer, Integer>();
+
+ private void updateHistogram(Key key) {
+ final Integer width = key.mWidth + key.mHorizontalGap;
+ final int count = (mHistogram.containsKey(width) ? mHistogram.get(width) : 0) + 1;
+ mHistogram.put(width, count);
+ if (count > mMaxCount) {
+ mMaxCount = count;
+ mMostCommonKeyWidth = width;
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java
index cc89579bb..31a291cef 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java
@@ -16,8 +16,6 @@
package com.android.inputmethod.keyboard.internal;
-import android.content.Context;
-import android.content.res.Resources;
import android.graphics.Paint;
import android.graphics.Rect;
@@ -27,26 +25,30 @@ import com.android.inputmethod.keyboard.KeyboardView;
import com.android.inputmethod.keyboard.MiniKeyboard;
import com.android.inputmethod.latin.R;
-import java.util.List;
-
-public class MiniKeyboardBuilder {
- private final Resources mRes;
- private final MiniKeyboard mKeyboard;
+public class MiniKeyboardBuilder extends
+ KeyboardBuilder<MiniKeyboardBuilder.MiniKeyboardParams> {
private final CharSequence[] mPopupCharacters;
- private final MiniKeyboardLayoutParams mParams;
- /* package */ static class MiniKeyboardLayoutParams {
- public final int mKeyWidth;
- public final int mRowHeight;
- /* package */ final int mTopRowAdjustment;
- public final int mNumRows;
- public final int mNumColumns;
- public final int mLeftKeys;
- public final int mRightKeys; // includes default key.
- public int mTopPadding;
+ public static class MiniKeyboardParams extends KeyboardParams {
+ /* package */ int mTopRowAdjustment;
+ public int mNumRows;
+ public int mNumColumns;
+ public int mLeftKeys;
+ public int mRightKeys; // includes default key.
+
+ public MiniKeyboardParams() {
+ super();
+ }
+
+ /* package for test */ MiniKeyboardParams(int numKeys, int maxColumns, int keyWidth,
+ int rowHeight, int coordXInParent, int parentKeyboardWidth) {
+ super();
+ setParameters(
+ numKeys, maxColumns, keyWidth, rowHeight, coordXInParent, parentKeyboardWidth);
+ }
/**
- * The object holding mini keyboard layout parameters.
+ * Set keyboard parameters of mini keyboard.
*
* @param numKeys number of keys in this mini keyboard.
* @param maxColumns number of maximum columns of this mini keyboard.
@@ -54,15 +56,15 @@ public class MiniKeyboardBuilder {
* @param rowHeight mini keyboard row height in pixel, including vertical gap.
* @param coordXInParent coordinate x of the popup key in parent keyboard.
* @param parentKeyboardWidth parent keyboard width in pixel.
- * parent keyboard.
*/
- public MiniKeyboardLayoutParams(int numKeys, int maxColumns, int keyWidth, int rowHeight,
+ public void setParameters(int numKeys, int maxColumns, int keyWidth, int rowHeight,
int coordXInParent, int parentKeyboardWidth) {
- if (parentKeyboardWidth / keyWidth < maxColumns)
+ if (parentKeyboardWidth / keyWidth < maxColumns) {
throw new IllegalArgumentException("Keyboard is too small to hold mini keyboard: "
+ parentKeyboardWidth + " " + keyWidth + " " + maxColumns);
- mKeyWidth = keyWidth;
- mRowHeight = rowHeight;
+ }
+ mDefaultKeyWidth = keyWidth;
+ mDefaultRowHeight = rowHeight;
final int numRows = (numKeys + maxColumns - 1) / maxColumns;
mNumRows = numRows;
@@ -108,6 +110,9 @@ public class MiniKeyboardBuilder {
} else {
mTopRowAdjustment = -1;
}
+
+ mWidth = mOccupiedWidth = mNumColumns * mDefaultKeyWidth;
+ mHeight = mOccupiedHeight = mNumRows * mDefaultRowHeight + mVerticalGap;
}
// Return key position according to column count (0 is default).
@@ -160,19 +165,19 @@ public class MiniKeyboardBuilder {
}
public int getDefaultKeyCoordX() {
- return mLeftKeys * mKeyWidth;
+ return mLeftKeys * mDefaultKeyWidth;
}
public int getX(int n, int row) {
- final int x = getColumnPos(n) * mKeyWidth + getDefaultKeyCoordX();
+ final int x = getColumnPos(n) * mDefaultKeyWidth + getDefaultKeyCoordX();
if (isTopRow(row)) {
- return x + mTopRowAdjustment * (mKeyWidth / 2);
+ return x + mTopRowAdjustment * (mDefaultKeyWidth / 2);
}
return x;
}
public int getY(int row) {
- return (mNumRows - 1 - row) * mRowHeight + mTopPadding;
+ return (mNumRows - 1 - row) * mDefaultRowHeight + mTopPadding;
}
public int getRowFlags(int row) {
@@ -185,42 +190,32 @@ public class MiniKeyboardBuilder {
private boolean isTopRow(int rowCount) {
return rowCount == mNumRows - 1;
}
-
- public void setTopPadding (int topPadding) {
- mTopPadding = topPadding;
- }
-
- public int getKeyboardHeight() {
- return mNumRows * mRowHeight + mTopPadding;
- }
-
- public int getKeyboardWidth() {
- return mNumColumns * mKeyWidth;
- }
}
- public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key parentKey,
+ public MiniKeyboardBuilder(KeyboardView view, int xmlId, Key parentKey,
Keyboard parentKeyboard) {
- final Context context = view.getContext();
- mRes = context.getResources();
- final MiniKeyboard keyboard = new MiniKeyboard(
- context, layoutTemplateResId, parentKeyboard);
- mKeyboard = keyboard;
+ super(view.getContext(), new MiniKeyboardParams());
+ load(parentKeyboard.mId.cloneWithNewXml(mResources.getResourceEntryName(xmlId), xmlId));
+
+ // HACK: Current mini keyboard design totally relies on the 9-patch padding about horizontal
+ // and vertical key spacing. To keep the visual of mini keyboard as is, these hacks are
+ // needed to keep having the same horizontal and vertical key spacing.
+ mParams.mHorizontalGap = 0;
+ mParams.mVerticalGap = mParams.mTopPadding = parentKeyboard.mVerticalGap / 2;
+ // TODO: When we have correctly padded key background 9-patch drawables for mini keyboard,
+ // revert the above hacks and uncomment the following lines.
+ //mParams.mHorizontalGap = parentKeyboard.mHorizontalGap;
+ //mParams.mVerticalGap = parentKeyboard.mVerticalGap;
+
+ mParams.mIsRtlKeyboard = parentKeyboard.mIsRtlKeyboard;
mPopupCharacters = parentKey.mPopupCharacters;
- final int keyWidth = getMaxKeyWidth(view, mPopupCharacters, keyboard.getKeyWidth());
- final MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+ final int keyWidth = getMaxKeyWidth(view, mPopupCharacters, mParams.mDefaultKeyWidth);
+ mParams.setParameters(
mPopupCharacters.length, parentKey.mMaxPopupColumn,
- keyWidth, parentKeyboard.getRowHeight(),
- parentKey.mX + (parentKey.mWidth + parentKey.mGap) / 2 - keyWidth / 2,
+ keyWidth, parentKeyboard.mDefaultRowHeight,
+ parentKey.mX + (mParams.mDefaultKeyWidth - keyWidth) / 2,
view.getMeasuredWidth());
- params.setTopPadding(keyboard.getVerticalGap());
- mParams = params;
-
- keyboard.setRowHeight(params.mRowHeight);
- keyboard.setHeight(params.getKeyboardHeight());
- keyboard.setMinWidth(params.getKeyboardWidth());
- keyboard.setDefaultCoordX(params.getDefaultKeyCoordX() + params.mKeyWidth / 2);
}
private static int getMaxKeyWidth(KeyboardView view, CharSequence[] popupCharacters,
@@ -249,17 +244,16 @@ public class MiniKeyboardBuilder {
return Math.max(minKeyWidth, maxWidth + horizontalPadding);
}
+ @Override
public MiniKeyboard build() {
- final MiniKeyboard keyboard = mKeyboard;
- final List<Key> keys = keyboard.getKeys();
- final MiniKeyboardLayoutParams params = mParams;
+ final MiniKeyboardParams params = mParams;
for (int n = 0; n < mPopupCharacters.length; n++) {
final CharSequence label = mPopupCharacters[n];
final int row = n / params.mNumColumns;
- final Key key = new Key(mRes, keyboard, label, params.getX(n, row), params.getY(row),
- params.mKeyWidth, params.mRowHeight, params.getRowFlags(row));
- keys.add(key);
+ final Key key = new Key(mResources, params, label, params.getX(n, row), params.getY(row),
+ params.mDefaultKeyWidth, params.mDefaultRowHeight, params.getRowFlags(row));
+ params.onAddKey(key);
}
- return keyboard;
+ return new MiniKeyboard(params);
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
index 545b27fdc..55175e046 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
@@ -37,22 +37,21 @@ public class PointerTrackerQueue {
if (t.isModifier()) {
oldestPos++;
} else {
- t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime, true);
+ t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime);
queue.remove(oldestPos);
}
}
}
public void releaseAllPointers(long eventTime) {
- releaseAllPointersExcept(null, eventTime, true);
+ releaseAllPointersExcept(null, eventTime);
}
- public void releaseAllPointersExcept(PointerTracker tracker, long eventTime,
- boolean updateReleasedKeyGraphics) {
+ public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) {
for (PointerTracker t : mQueue) {
if (t == tracker)
continue;
- t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime, updateReleasedKeyGraphics);
+ t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime);
}
mQueue.clear();
if (tracker != null)
diff --git a/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java b/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java
index 8276f5d78..032489e66 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java
@@ -23,6 +23,8 @@ import android.util.Log;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.R;
+import java.util.ArrayList;
+
/**
* String parser of popupCharacters attribute of Key.
* The string is comma separated texts each of which represents one popup key.
@@ -182,4 +184,54 @@ public class PopupCharactersParser {
super(message);
}
}
+
+ public interface CodeFilter {
+ public boolean shouldFilterOut(int code);
+ }
+
+ public static final CodeFilter DIGIT_FILTER = new CodeFilter() {
+ @Override
+ public boolean shouldFilterOut(int code) {
+ return Character.isDigit(code);
+ }
+ };
+
+ public static final CodeFilter NON_ASCII_FILTER = new CodeFilter() {
+ @Override
+ public boolean shouldFilterOut(int code) {
+ return code < 0x20 || code > 0x7e;
+ }
+ };
+
+ public static CharSequence[] filterOut(Resources res, CharSequence[] popupCharacters,
+ CodeFilter filter) {
+ if (popupCharacters == null || popupCharacters.length < 1) {
+ return null;
+ }
+ if (popupCharacters.length == 1
+ && filter.shouldFilterOut(getCode(res, popupCharacters[0].toString()))) {
+ return null;
+ }
+ ArrayList<CharSequence> filtered = null;
+ for (int i = 0; i < popupCharacters.length; i++) {
+ final CharSequence popupSpec = popupCharacters[i];
+ if (filter.shouldFilterOut(getCode(res, popupSpec.toString()))) {
+ if (filtered == null) {
+ filtered = new ArrayList<CharSequence>();
+ for (int j = 0; j < i; j++) {
+ filtered.add(popupCharacters[j]);
+ }
+ }
+ } else if (filtered != null) {
+ filtered.add(popupSpec);
+ }
+ }
+ if (filtered == null) {
+ return popupCharacters;
+ }
+ if (filtered.size() == 0) {
+ return null;
+ }
+ return filtered.toArray(new CharSequence[filtered.size()]);
+ }
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/Row.java b/java/src/com/android/inputmethod/keyboard/internal/Row.java
index 06aadcc05..d53fe12e2 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/Row.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/Row.java
@@ -31,43 +31,19 @@ import com.android.inputmethod.latin.R;
*/
public class Row {
/** Default width of a key in this row. */
- public final int mDefaultWidth;
+ public final int mDefaultKeyWidth;
/** Default height of a key in this row. */
- public final int mDefaultHeight;
- /** Default horizontal gap between keys in this row. */
- public final int mDefaultHorizontalGap;
- /** Vertical gap following this row. */
- public final int mVerticalGap;
- /**
- * Edge flags for this row of keys. Possible values that can be assigned are
- * {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM}
- */
- public final int mRowEdgeFlags;
+ public final int mRowHeight;
- private final Keyboard mKeyboard;
-
- public Row(Resources res, Keyboard keyboard, XmlResourceParser parser) {
- this.mKeyboard = keyboard;
- final int keyboardWidth = keyboard.getDisplayWidth();
- final int keyboardHeight = keyboard.getKeyboardHeight();
+ public Row(Resources res, KeyboardParams params, XmlResourceParser parser) {
+ final int keyboardWidth = params.mWidth;
+ final int keyboardHeight = params.mHeight;
TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
R.styleable.Keyboard);
- mDefaultWidth = KeyboardParser.getDimensionOrFraction(a,
- R.styleable.Keyboard_keyWidth, keyboardWidth, keyboard.getKeyWidth());
- mDefaultHeight = KeyboardParser.getDimensionOrFraction(a,
- R.styleable.Keyboard_rowHeight, keyboardHeight, keyboard.getRowHeight());
- mDefaultHorizontalGap = KeyboardParser.getDimensionOrFraction(a,
- R.styleable.Keyboard_horizontalGap, keyboardWidth, keyboard.getHorizontalGap());
- mVerticalGap = KeyboardParser.getDimensionOrFraction(a,
- R.styleable.Keyboard_verticalGap, keyboardHeight, keyboard.getVerticalGap());
- a.recycle();
- a = res.obtainAttributes(Xml.asAttributeSet(parser),
- R.styleable.Keyboard_Row);
- mRowEdgeFlags = a.getInt(R.styleable.Keyboard_Row_rowEdgeFlags, 0);
+ mDefaultKeyWidth = KeyboardBuilder.getDimensionOrFraction(a,
+ R.styleable.Keyboard_keyWidth, keyboardWidth, params.mDefaultKeyWidth);
+ mRowHeight = KeyboardBuilder.getDimensionOrFraction(a,
+ R.styleable.Keyboard_rowHeight, keyboardHeight, params.mDefaultRowHeight);
a.recycle();
}
-
- public Keyboard getKeyboard() {
- return mKeyboard;
- }
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/SlidingLocaleDrawable.java b/java/src/com/android/inputmethod/keyboard/internal/SlidingLocaleDrawable.java
deleted file mode 100644
index ef3ea4c12..000000000
--- a/java/src/com/android/inputmethod/keyboard/internal/SlidingLocaleDrawable.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2010 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.keyboard.internal;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.Paint.Align;
-import android.graphics.PixelFormat;
-import android.graphics.drawable.Drawable;
-import android.text.TextPaint;
-import android.view.ViewConfiguration;
-
-import com.android.inputmethod.keyboard.Keyboard;
-import com.android.inputmethod.keyboard.LatinKeyboard;
-import com.android.inputmethod.latin.R;
-import com.android.inputmethod.latin.SubtypeSwitcher;
-
-/**
- * Animation to be displayed on the spacebar preview popup when switching languages by swiping the
- * spacebar. It draws the current, previous and next languages and moves them by the delta of touch
- * movement on the spacebar.
- */
-public class SlidingLocaleDrawable extends Drawable {
- private static final int SLIDE_SPEED_MULTIPLIER_RATIO = 150;
- private final int mWidth;
- private final int mHeight;
- private final Drawable mBackground;
- private final int mSpacebarTextColor;
- private final TextPaint mTextPaint;
- private final int mMiddleX;
- private final boolean mDrawArrows;
- private final int mThreshold;
-
- private int mDiff;
- private boolean mHitThreshold;
- private String mCurrentLanguage;
- private String mNextLanguage;
- private String mPrevLanguage;
-
- public SlidingLocaleDrawable(Context context, Drawable background, int width, int height) {
- mBackground = background;
- Keyboard.setDefaultBounds(background);
- mWidth = width;
- mHeight = height;
- final TextPaint textPaint = new TextPaint();
- textPaint.setTextSize(LatinKeyboard.getTextSizeFromTheme(
- context.getTheme(), android.R.style.TextAppearance_Medium, 18));
- textPaint.setColor(Color.TRANSPARENT);
- textPaint.setAntiAlias(true);
- mTextPaint = textPaint;
- mMiddleX = (background != null) ? (mWidth - mBackground.getIntrinsicWidth()) / 2 : 0;
-
- final TypedArray a = context.obtainStyledAttributes(
- null, R.styleable.KeyboardView, R.attr.keyboardViewStyle, R.style.KeyboardView);
- mSpacebarTextColor = a.getColor(R.styleable.KeyboardView_keyPreviewTextColor, 0);
- final int spacebarPreviewBackrgound = a.getResourceId(
- R.styleable.KeyboardView_keyPreviewSpacebarBackground, 0);
- // If spacebar preview background is transparent, we need not draw arrows.
- mDrawArrows = (spacebarPreviewBackrgound != R.drawable.transparent);
- a.recycle();
-
- mThreshold = ViewConfiguration.get(context).getScaledTouchSlop();
- }
-
- public void setDiff(int diff) {
- if (diff == Integer.MAX_VALUE) {
- mHitThreshold = false;
- mCurrentLanguage = null;
- return;
- }
- mDiff = Math.max(diff, diff * SLIDE_SPEED_MULTIPLIER_RATIO / 100);
- if (mDiff > mWidth) mDiff = mWidth;
- if (mDiff < -mWidth) mDiff = -mWidth;
- if (Math.abs(mDiff) > mThreshold) mHitThreshold = true;
- invalidateSelf();
- }
-
-
- @Override
- public void draw(Canvas canvas) {
- canvas.save();
- if (mHitThreshold) {
- Paint paint = mTextPaint;
- final int width = mWidth;
- final int height = mHeight;
- final int diff = mDiff;
- canvas.clipRect(0, 0, width, height);
- if (mCurrentLanguage == null) {
- SubtypeSwitcher subtypeSwitcher = SubtypeSwitcher.getInstance();
- mCurrentLanguage = subtypeSwitcher.getInputLanguageName();
- mNextLanguage = subtypeSwitcher.getNextInputLanguageName();
- mPrevLanguage = subtypeSwitcher.getPreviousInputLanguageName();
- }
- // Draw language text.
- final float baseline = mHeight * LatinKeyboard.SPACEBAR_LANGUAGE_BASELINE
- - paint.descent();
- paint.setColor(mSpacebarTextColor);
- paint.setTextAlign(Align.CENTER);
- canvas.drawText(mCurrentLanguage, width / 2 + diff, baseline, paint);
- canvas.drawText(mNextLanguage, diff - width / 2, baseline, paint);
- canvas.drawText(mPrevLanguage, diff + width + width / 2, baseline, paint);
- if (mDrawArrows) {
- paint.setTextAlign(Align.LEFT);
- canvas.drawText(LatinKeyboard.ARROW_LEFT, 0, baseline, paint);
- paint.setTextAlign(Align.RIGHT);
- canvas.drawText(LatinKeyboard.ARROW_RIGHT, width, baseline, paint);
- }
- }
- if (mBackground != null) {
- canvas.translate(mMiddleX, 0);
- mBackground.draw(canvas);
- }
- canvas.restore();
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
-
- @Override
- public void setAlpha(int alpha) {
- // Ignore
- }
-
- @Override
- public void setColorFilter(ColorFilter cf) {
- // Ignore
- }
-
- @Override
- public int getIntrinsicWidth() {
- return mWidth;
- }
-
- @Override
- public int getIntrinsicHeight() {
- return mHeight;
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 9748d6006..6a6a0a4ee 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -156,10 +156,11 @@ public class BinaryDictionary extends Dictionary {
}
}
+ // proximityInfo may not be null.
@Override
- public void getWords(final WordComposer codes, final WordCallback callback) {
- final int count = getSuggestions(codes, mKeyboardSwitcher.getLatinKeyboard(),
- mOutputChars, mScores);
+ public void getWords(final WordComposer codes, final WordCallback callback,
+ final ProximityInfo proximityInfo) {
+ final int count = getSuggestions(codes, proximityInfo, mOutputChars, mScores);
for (int j = 0; j < count; ++j) {
if (mScores[j] < 1) break;
@@ -179,8 +180,9 @@ public class BinaryDictionary extends Dictionary {
return mNativeDict != 0;
}
- /* package for test */ int getSuggestions(final WordComposer codes, final Keyboard keyboard,
- char[] outputChars, int[] scores) {
+ // proximityInfo may not be null.
+ /* package for test */ int getSuggestions(final WordComposer codes,
+ final ProximityInfo proximityInfo, char[] outputChars, int[] scores) {
if (!isValidDictionary()) return -1;
final int codesSize = codes.size();
@@ -196,9 +198,8 @@ public class BinaryDictionary extends Dictionary {
Arrays.fill(outputChars, (char) 0);
Arrays.fill(scores, 0);
- final int proximityInfo = keyboard == null ? 0 : keyboard.getProximityInfo();
return getSuggestionsNative(
- mNativeDict, proximityInfo,
+ mNativeDict, proximityInfo.getNativeProximityInfo(),
codes.getXCoordinates(), codes.getYCoordinates(), mInputCodes, codesSize,
mFlags, outputChars, scores);
}
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
index 76a230f82..f4ba0bcdc 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
@@ -19,8 +19,11 @@ package com.android.inputmethod.latin;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;
+import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
@@ -28,7 +31,8 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Locale;
@@ -37,47 +41,111 @@ import java.util.Locale;
* file from the dictionary provider
*/
public class BinaryDictionaryFileDumper {
+ private static final String TAG = BinaryDictionaryFileDumper.class.getSimpleName();
+
/**
* The size of the temporary buffer to copy files.
*/
static final int FILE_READ_BUFFER_SIZE = 1024;
+ private static final String DICTIONARY_PROJECTION[] = { "id" };
+
// Prevents this class to be accidentally instantiated.
private BinaryDictionaryFileDumper() {
}
/**
- * Generates a file name that matches the locale passed as an argument.
- * The file name is basically the result of the .toString() method, except we replace
- * any @File.separator with an underscore to avoid generating a file name that may not
- * be created.
+ * Escapes a string for any characters that may be suspicious for a file or directory name.
+ *
+ * Concretely this does a sort of URL-encoding except it will encode everything that's not
+ * alphanumeric or underscore. (true URL-encoding leaves alone characters like '*', which
+ * we cannot allow here)
+ */
+ // TODO: create a unit test for this method
+ private static String replaceFileNameDangerousCharacters(String name) {
+ // This assumes '%' is fully available as a non-separator, normal
+ // character in a file name. This is probably true for all file systems.
+ final StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < name.length(); ++i) {
+ final int codePoint = name.codePointAt(i);
+ if (Character.isLetterOrDigit(codePoint) || '_' == codePoint) {
+ sb.appendCodePoint(codePoint);
+ } else {
+ sb.append('%');
+ sb.append(Integer.toHexString(codePoint));
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Find out the cache directory associated with a specific locale.
+ */
+ private static String getCacheDirectoryForLocale(Locale locale, Context context) {
+ final String relativeDirectoryName = replaceFileNameDangerousCharacters(locale.toString());
+ final String absoluteDirectoryName = context.getFilesDir() + File.separator
+ + relativeDirectoryName;
+ final File directory = new File(absoluteDirectoryName);
+ if (!directory.exists()) {
+ if (!directory.mkdirs()) {
+ Log.e(TAG, "Could not create the directory for locale" + locale);
+ }
+ }
+ return absoluteDirectoryName;
+ }
+
+ /**
+ * Generates a file name for the id and locale passed as an argument.
+ *
+ * In the current implementation the file name returned will always be unique for
+ * any id/locale pair, but please do not expect that the id can be the same for
+ * different dictionaries with different locales. An id should be unique for any
+ * dictionary.
+ * The file name is pretty much an URL-encoded version of the id inside a directory
+ * named like the locale, except it will also escape characters that look dangerous
+ * to some file systems.
+ * @param id the id of the dictionary for which to get a file name
* @param locale the locale for which to get the file name
* @param context the context to use for getting the directory
* @return the name of the file to be created
*/
- private static String getCacheFileNameForLocale(Locale locale, Context context) {
- // The following assumes two things :
- // 1. That File.separator is not the same character as "_"
- // I don't think any android system will ever use "_" as a path separator
- // 2. That no two locales differ by only a File.separator versus a "_"
- // Since "_" can't be part of locale components this should be safe.
- // Examples:
- // en -> en
- // en_US_POSIX -> en_US_POSIX
- // en__foo/bar -> en__foo_bar
- final String[] separator = { File.separator };
- final String[] empty = { "_" };
- final CharSequence basename = TextUtils.replace(locale.toString(), separator, empty);
- return context.getFilesDir() + File.separator + basename;
+ private static String getCacheFileName(String id, Locale locale, Context context) {
+ final String fileName = replaceFileNameDangerousCharacters(id);
+ return getCacheDirectoryForLocale(locale, context) + File.separator + fileName;
}
/**
- * Return for a given locale the provider URI to query to get the dictionary.
+ * Return for a given locale or dictionary id the provider URI to get the dictionary.
*/
- public static Uri getProviderUri(Locale locale) {
+ private static Uri getProviderUri(String path) {
return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
.authority(BinaryDictionary.DICTIONARY_PACK_AUTHORITY).appendPath(
- locale.toString()).build();
+ path).build();
+ }
+
+ /**
+ * Queries a content provider for the list of dictionaries for a specific locale
+ * available to copy into Latin IME.
+ */
+ private static List<String> getDictIdList(final Locale locale, final Context context) {
+ final ContentResolver resolver = context.getContentResolver();
+ final Uri dictionaryPackUri = getProviderUri(locale.toString());
+
+ final Cursor c = resolver.query(dictionaryPackUri, DICTIONARY_PROJECTION, null, null, null);
+ if (null == c) return Collections.<String>emptyList();
+ if (c.getCount() <= 0 || !c.moveToFirst()) {
+ c.close();
+ return Collections.<String>emptyList();
+ }
+
+ final List<String> list = new ArrayList<String>();
+ do {
+ final String id = c.getString(0);
+ if (TextUtils.isEmpty(id)) continue;
+ list.add(id);
+ } while (c.moveToNext());
+ c.close();
+ return list;
}
/**
@@ -94,31 +162,26 @@ public class BinaryDictionaryFileDumper {
* @throw FileNotFoundException if the provider returns non-existent data.
* @throw IOException if the provider-returned data could not be read.
*/
- public static List<AssetFileAddress> getDictSetFromContentProvider(Locale locale,
- Context context) throws FileNotFoundException, IOException {
- // TODO: check whether the dictionary is the same or not and if it is, return the cached
- // file.
- // TODO: This should be able to read a number of files from the dictionary pack, copy
- // them all and return them.
+ public static List<AssetFileAddress> getDictSetFromContentProvider(final Locale locale,
+ final Context context) throws FileNotFoundException, IOException {
final ContentResolver resolver = context.getContentResolver();
- final Uri dictionaryPackUri = getProviderUri(locale);
- final AssetFileDescriptor afd = resolver.openAssetFileDescriptor(dictionaryPackUri, "r");
- if (null == afd) return null;
- final String fileName =
- copyFileTo(afd.createInputStream(), getCacheFileNameForLocale(locale, context));
- return Arrays.asList(AssetFileAddress.makeFromFileName(fileName));
- }
-
- /**
- * Accepts a file as dictionary data for some locale and returns the name of a file.
- *
- * This will make the data in the input file the cached dictionary for this locale, overwriting
- * any previous cached data.
- */
- public static String getDictionaryFileFromFile(String fileName, Locale locale,
- Context context) throws FileNotFoundException, IOException {
- return copyFileTo(new FileInputStream(fileName), getCacheFileNameForLocale(locale,
- context));
+ final List<String> idList = getDictIdList(locale, context);
+ final List<AssetFileAddress> fileAddressList = new ArrayList<AssetFileAddress>();
+ for (String id : idList) {
+ final Uri wordListUri = getProviderUri(id);
+ final AssetFileDescriptor afd =
+ resolver.openAssetFileDescriptor(wordListUri, "r");
+ if (null == afd) continue;
+ final String fileName = copyFileTo(afd.createInputStream(),
+ getCacheFileName(id, locale, context));
+ afd.close();
+ if (0 >= resolver.delete(wordListUri, null, null)) {
+ // I'd rather not print the word list ID to the log here out of security concerns
+ Log.e(TAG, "Could not have the dictionary pack delete a word list");
+ }
+ fileAddressList.add(AssetFileAddress.makeFromFileName(fileName));
+ }
+ return fileAddressList;
}
/**
@@ -129,8 +192,11 @@ public class BinaryDictionaryFileDumper {
*/
public static String getDictionaryFileFromResource(int resource, Locale locale,
Context context) throws FileNotFoundException, IOException {
- return copyFileTo(context.getResources().openRawResource(resource),
- getCacheFileNameForLocale(locale, context));
+ final Resources res = context.getResources();
+ final Locale savedLocale = Utils.setSystemLocale(res, locale);
+ final InputStream stream = res.openRawResource(resource);
+ Utils.setSystemLocale(res, savedLocale);
+ return copyFileTo(stream, getCacheFileName(Integer.toString(resource), locale, context));
}
/**
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
index 7ce92920d..4b1c05adf 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
@@ -18,6 +18,7 @@ package com.android.inputmethod.latin;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
import android.util.Log;
import java.io.FileNotFoundException;
@@ -42,8 +43,13 @@ class BinaryDictionaryGetter {
/**
* Returns a file address from a resource, or null if it cannot be opened.
*/
- private static AssetFileAddress loadFallbackResource(Context context, int fallbackResId) {
- final AssetFileDescriptor afd = context.getResources().openRawResourceFd(fallbackResId);
+ private static AssetFileAddress loadFallbackResource(final Context context,
+ final int fallbackResId, final Locale locale) {
+ final Resources res = context.getResources();
+ final Locale savedLocale = Utils.setSystemLocale(res, locale);
+ final AssetFileDescriptor afd = res.openRawResourceFd(fallbackResId);
+ Utils.setSystemLocale(res, savedLocale);
+
if (afd == null) {
Log.e(TAG, "Found the resource but cannot read it. Is it compressed? resId="
+ fallbackResId);
@@ -57,9 +63,6 @@ class BinaryDictionaryGetter {
* Returns a list of file addresses for a given locale, trying relevant methods in order.
*
* Tries to get binary dictionaries from various sources, in order:
- * - Uses a private method of getting a private dictionaries, as implemented by the
- * PrivateBinaryDictionaryGetter class.
- * If that fails:
* - Uses a content provider to get a public dictionary set, as per the protocol described
* in BinaryDictionaryFileDumper.
* If that fails:
@@ -70,28 +73,23 @@ class BinaryDictionaryGetter {
*/
public static List<AssetFileAddress> getDictionaryFiles(Locale locale, Context context,
int fallbackResId) {
- // Try first to query a private package signed the same way for private files.
- final List<AssetFileAddress> privateFiles =
- PrivateBinaryDictionaryGetter.getDictionaryFiles(locale, context);
- if (null != privateFiles) {
- return privateFiles;
- } else {
- try {
- // If that was no-go, try to find a publicly exported dictionary.
- List<AssetFileAddress> listFromContentProvider =
- BinaryDictionaryFileDumper.getDictSetFromContentProvider(locale, context);
- if (null != listFromContentProvider) {
- return listFromContentProvider;
- }
- // If the list is null, fall through and return the fallback
- } catch (FileNotFoundException e) {
- Log.e(TAG, "Unable to create dictionary file from provider for locale "
- + locale.toString() + ": falling back to internal dictionary");
- } catch (IOException e) {
- Log.e(TAG, "Unable to read source data for locale "
- + locale.toString() + ": falling back to internal dictionary");
+ try {
+ List<AssetFileAddress> listFromContentProvider =
+ BinaryDictionaryFileDumper.getDictSetFromContentProvider(locale, context);
+ if (null != listFromContentProvider) {
+ return listFromContentProvider;
}
- return Arrays.asList(loadFallbackResource(context, fallbackResId));
+ // If the list is null, fall through and return the fallback
+ } catch (FileNotFoundException e) {
+ Log.e(TAG, "Unable to create dictionary file from provider for locale "
+ + locale.toString() + ": falling back to internal dictionary");
+ } catch (IOException e) {
+ Log.e(TAG, "Unable to read source data for locale "
+ + locale.toString() + ": falling back to internal dictionary");
}
+ final AssetFileAddress fallbackAsset = loadFallbackResource(context, fallbackResId,
+ locale);
+ if (null == fallbackAsset) return null;
+ return Arrays.asList(fallbackAsset);
}
}
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index 96225f2e9..d779c8565 100644
--- a/java/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -52,14 +52,11 @@ import java.util.ArrayList;
import java.util.List;
public class CandidateView extends LinearLayout implements OnClickListener, OnLongClickListener {
-
public interface Listener {
public boolean addWordToDictionary(String word);
public void pickSuggestionManually(int index, CharSequence word);
}
- private static final CharacterStyle BOLD_SPAN = new StyleSpan(Typeface.BOLD);
- private static final CharacterStyle UNDERLINE_SPAN = new UnderlineSpan();
// The maximum number of suggestions available. See {@link Suggest#mPrefMaxSuggestions}.
private static final int MAX_SUGGESTIONS = 18;
private static final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;
@@ -68,11 +65,6 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
private static final boolean DBG = LatinImeLogger.sDBG;
private final ViewGroup mCandidatesStrip;
- private final int mCandidateCountInStrip;
- private static final int DEFAULT_CANDIDATE_COUNT_IN_STRIP = 3;
- private final ViewGroup mCandidatesPaneControl;
- private final TextView mExpandCandidatesPane;
- private final TextView mCloseCandidatesPane;
private ViewGroup mCandidatesPane;
private ViewGroup mCandidatesPaneContainer;
private View mKeyboardView;
@@ -81,17 +73,6 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
private final ArrayList<TextView> mInfos = new ArrayList<TextView>();
private final ArrayList<View> mDividers = new ArrayList<View>();
- private final int mCandidateStripHeight;
- private final CharacterStyle mInvertedForegroundColorSpan;
- private final CharacterStyle mInvertedBackgroundColorSpan;
- private final int mAutoCorrectHighlight;
- private static final int AUTO_CORRECT_BOLD = 0x01;
- private static final int AUTO_CORRECT_UNDERLINE = 0x02;
- private static final int AUTO_CORRECT_INVERT = 0x04;
- private final int mColorTypedWord;
- private final int mColorAutoCorrect;
- private final int mColorSuggestedCandidate;
-
private final PopupWindow mPreviewPopup;
private final TextView mPreviewText;
@@ -103,9 +84,9 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
private boolean mShowingAutoCorrectionInverted;
private boolean mShowingAddToDictionary;
- private final CandidateViewLayoutParams mParams;
- private static final int PUNCTUATIONS_IN_STRIP = 6;
- private static final float MIN_TEXT_XSCALE = 0.75f;
+ private final SuggestionsStripParams mStripParams;
+ private final SuggestionsPaneParams mPaneParams;
+ private static final float MIN_TEXT_XSCALE = 0.70f;
private final UiHandler mHandler = new UiHandler(this);
@@ -158,118 +139,355 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
}
}
- private static class CandidateViewLayoutParams {
- public final TextPaint mPaint;
+ private static class CandidateViewParams {
public final int mPadding;
public final int mDividerWidth;
public final int mDividerHeight;
- public final int mControlWidth;
- private final int mAutoCorrectHighlight;
+ public final int mCandidateStripHeight;
- public final ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>();
+ protected final List<TextView> mWords;
+ protected final List<View> mDividers;
+ protected final List<TextView> mInfos;
- public int mCountInStrip;
- // True if the mCountInStrip suggestions can fit in suggestion strip in equally divided
- // width without squeezing the text.
- public boolean mCanUseFixedWidthColumns;
- public int mMaxWidth;
- public int mAvailableWidthForWords;
- public int mConstantWidthForPaddings;
- public int mVariableWidthForWords;
- public float mScaleX;
+ protected CandidateViewParams(List<TextView> words, List<View> dividers,
+ List<TextView> infos) {
+ mWords = words;
+ mDividers = dividers;
+ mInfos = infos;
- public CandidateViewLayoutParams(Resources res, TextView word, View divider, View control,
- int autoCorrectHighlight) {
- mPaint = new TextPaint();
- final float textSize = res.getDimension(R.dimen.candidate_text_size);
- mPaint.setTextSize(textSize);
+ final TextView word = words.get(0);
+ final View divider = dividers.get(0);
mPadding = word.getCompoundPaddingLeft() + word.getCompoundPaddingRight();
divider.measure(WRAP_CONTENT, MATCH_PARENT);
mDividerWidth = divider.getMeasuredWidth();
mDividerHeight = divider.getMeasuredHeight();
- mControlWidth = control.getMeasuredWidth();
- mAutoCorrectHighlight = autoCorrectHighlight;
+
+ final Resources res = word.getResources();
+ mCandidateStripHeight = res.getDimensionPixelOffset(R.dimen.candidate_strip_height);
}
+ }
- public void layoutStrip(SuggestedWords suggestions, int maxWidth, int maxCount) {
- final int size = suggestions.size();
- if (size == 0) return;
- setupTexts(suggestions, size, mAutoCorrectHighlight);
- mCountInStrip = Math.min(maxCount, size);
- mScaleX = 1.0f;
+ private static class SuggestionsPaneParams extends CandidateViewParams {
+ public SuggestionsPaneParams(List<TextView> words, List<View> dividers,
+ List<TextView> infos) {
+ super(words, dividers, infos);
+ }
+
+ public int layout(SuggestedWords suggestions, ViewGroup paneView, int from, int textColor,
+ int paneWidth) {
+ final int count = Math.min(mWords.size(), suggestions.size());
+ View centeringFrom = null, lastView = null;
+ int x = 0, y = 0;
+ for (int index = from; index < count; index++) {
+ final int pos = index;
+ final TextView word = mWords.get(pos);
+ final View divider = mDividers.get(pos);
+ final TextPaint paint = word.getPaint();
+ word.setTextColor(textColor);
+ final CharSequence styled = suggestions.getWord(pos);
+
+ final TextView info;
+ if (DBG) {
+ final CharSequence debugInfo = getDebugInfo(suggestions, index);
+ if (debugInfo != null) {
+ info = mInfos.get(index);
+ info.setText(debugInfo);
+ } else {
+ info = null;
+ }
+ } else {
+ info = null;
+ }
- do {
- mMaxWidth = maxWidth;
- if (size > mCountInStrip) {
- mMaxWidth -= mControlWidth;
+ final CharSequence text;
+ final float scaleX;
+ paint.setTextScaleX(1.0f);
+ final int textWidth = getTextWidth(styled, paint);
+ int available = paneWidth - x - mPadding;
+ if (textWidth >= available) {
+ // Needs new row, centering previous row.
+ centeringCandidates(paneView, centeringFrom, lastView, x, paneWidth);
+ x = 0;
+ y += mCandidateStripHeight;
+ }
+ if (x != 0) {
+ // Add divider if this isn't the left most suggestion in current row.
+ paneView.addView(divider);
+ FrameLayoutCompatUtils.placeViewAt(divider, x, y
+ + (mCandidateStripHeight - mDividerHeight) / 2, mDividerWidth,
+ mDividerHeight);
+ x += mDividerWidth;
+ }
+ available = paneWidth - x - mPadding;
+ text = getEllipsizedText(styled, available, paint);
+ scaleX = paint.getTextScaleX();
+ word.setText(text);
+ word.setTextScaleX(scaleX);
+ paneView.addView(word);
+ lastView = word;
+ if (x == 0)
+ centeringFrom = word;
+ word.measure(WRAP_CONTENT,
+ MeasureSpec.makeMeasureSpec(mCandidateStripHeight, MeasureSpec.EXACTLY));
+ final int width = word.getMeasuredWidth();
+ final int height = word.getMeasuredHeight();
+ FrameLayoutCompatUtils.placeViewAt(word, x, y + (mCandidateStripHeight - height)
+ / 2, width, height);
+ x += width;
+ if (info != null) {
+ paneView.addView(info);
+ lastView = info;
+ info.measure(WRAP_CONTENT, WRAP_CONTENT);
+ final int infoWidth = info.getMeasuredWidth();
+ FrameLayoutCompatUtils.placeViewAt(info, x - infoWidth, y, infoWidth,
+ info.getMeasuredHeight());
}
+ }
+ if (x != 0) {
+ // Centering last candidates row.
+ centeringCandidates(paneView, centeringFrom, lastView, x, paneWidth);
+ }
+
+ return count - from;
+ }
+ }
+
+ private static class SuggestionsStripParams extends CandidateViewParams {
+ private static final int DEFAULT_CANDIDATE_COUNT_IN_STRIP = 3;
+ private static final int DEFAULT_CENTER_CANDIDATE_PERCENTILE = 40;
+ private static final int PUNCTUATIONS_IN_STRIP = 6;
+
+ private final int mColorTypedWord;
+ private final int mColorAutoCorrect;
+ private final int mColorSuggestedCandidate;
+ private final int mCandidateCountInStrip;
+ private final float mCenterCandidateWeight;
+ private final int mCenterCandidateIndex;
+ private final Drawable mMoreCandidateHint;
+
+ private static final CharacterStyle BOLD_SPAN = new StyleSpan(Typeface.BOLD);
+ private static final CharacterStyle UNDERLINE_SPAN = new UnderlineSpan();
+ private final CharacterStyle mInvertedForegroundColorSpan;
+ private final CharacterStyle mInvertedBackgroundColorSpan;
+ private static final int AUTO_CORRECT_BOLD = 0x01;
+ private static final int AUTO_CORRECT_UNDERLINE = 0x02;
+ private static final int AUTO_CORRECT_INVERT = 0x04;
+
+ private final TextPaint mPaint;
+ private final int mAutoCorrectHighlight;
+
+ private final ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>();
+
+ public boolean mMoreSuggestionsAvailable;
+
+ public SuggestionsStripParams(Context context, AttributeSet attrs, int defStyle,
+ List<TextView> words, List<View> dividers, List<TextView> infos) {
+ super(words, dividers, infos);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.CandidateView, defStyle, R.style.CandidateViewStyle);
+ mAutoCorrectHighlight = a.getInt(R.styleable.CandidateView_autoCorrectHighlight, 0);
+ mColorTypedWord = a.getColor(R.styleable.CandidateView_colorTypedWord, 0);
+ mColorAutoCorrect = a.getColor(R.styleable.CandidateView_colorAutoCorrect, 0);
+ mColorSuggestedCandidate = a.getColor(R.styleable.CandidateView_colorSuggested, 0);
+ mCandidateCountInStrip = a.getInt(
+ R.styleable.CandidateView_candidateCountInStrip,
+ DEFAULT_CANDIDATE_COUNT_IN_STRIP);
+ mCenterCandidateWeight = a.getInt(
+ R.styleable.CandidateView_centerCandidatePercentile,
+ DEFAULT_CENTER_CANDIDATE_PERCENTILE) / 100.0f;
+ a.recycle();
+
+ mCenterCandidateIndex = mCandidateCountInStrip / 2;
+ final Resources res = context.getResources();
+ mMoreCandidateHint = res.getDrawable(R.drawable.more_suggestions_hint);
+
+ mInvertedForegroundColorSpan = new ForegroundColorSpan(mColorTypedWord ^ 0x00ffffff);
+ mInvertedBackgroundColorSpan = new BackgroundColorSpan(mColorTypedWord);
- tryLayout();
+ mPaint = new TextPaint();
+ final float textSize = res.getDimension(R.dimen.candidate_text_size);
+ mPaint.setTextSize(textSize);
+ }
+
+ public int getTextColor() {
+ return mColorTypedWord;
+ }
+
+ private CharSequence getStyledCandidateWord(CharSequence word, boolean isAutoCorrect) {
+ if (!isAutoCorrect)
+ return word;
+ final int len = word.length();
+ final Spannable spannedWord = new SpannableString(word);
+ if ((mAutoCorrectHighlight & AUTO_CORRECT_BOLD) != 0)
+ spannedWord.setSpan(BOLD_SPAN, 0, len, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+ if ((mAutoCorrectHighlight & AUTO_CORRECT_UNDERLINE) != 0)
+ spannedWord.setSpan(UNDERLINE_SPAN, 0, len, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+ return spannedWord;
+ }
+
+ private static boolean willAutoCorrect(SuggestedWords suggestions) {
+ return !suggestions.mTypedWordValid && suggestions.mHasMinimalSuggestion;
+ }
+
+ private int getWordPosition(int index, SuggestedWords suggestions) {
+ // TODO: This works for 3 suggestions. Revisit this algorithm when there are 5 or more
+ // suggestions.
+ final int centerPos = willAutoCorrect(suggestions) ? 1 : 0;
+ if (index == mCenterCandidateIndex) {
+ return centerPos;
+ } else if (index == centerPos) {
+ return mCenterCandidateIndex;
+ } else {
+ return index;
+ }
+ }
+
+ private int getCandidateTextColor(int index, SuggestedWords suggestions, int pos) {
+ // TODO: Need to revisit this logic with bigram suggestions
+ final boolean isSuggestedCandidate = (pos != 0);
+
+ final int color;
+ if (index == mCenterCandidateIndex && willAutoCorrect(suggestions)) {
+ color = mColorAutoCorrect;
+ } else if (isSuggestedCandidate) {
+ color = mColorSuggestedCandidate;
+ } else {
+ color = mColorTypedWord;
+ }
+
+ final SuggestedWordInfo info = (pos < suggestions.size())
+ ? suggestions.getInfo(pos) : null;
+ if (info != null && info.isPreviousSuggestedWord()) {
+ return applyAlpha(color, 0.5f);
+ } else {
+ return color;
+ }
+ }
+
+ private static int applyAlpha(final int color, final float alpha) {
+ final int newAlpha = (int)(Color.alpha(color) * alpha);
+ return Color.argb(newAlpha, Color.red(color), Color.green(color), Color.blue(color));
+ }
+
+ public CharSequence getInvertedText(CharSequence text) {
+ if ((mAutoCorrectHighlight & AUTO_CORRECT_INVERT) == 0)
+ return null;
+ final int len = text.length();
+ final Spannable word = new SpannableString(text);
+ word.setSpan(mInvertedBackgroundColorSpan, 0, len, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+ word.setSpan(mInvertedForegroundColorSpan, 0, len, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+ return word;
+ }
+
+ public int layout(SuggestedWords suggestions, ViewGroup stripView, ViewGroup paneView,
+ int stripWidth) {
+ if (suggestions.isPunctuationSuggestions()) {
+ return layoutPunctuationSuggestions(suggestions, stripView);
+ }
+
+ final int countInStrip = mCandidateCountInStrip;
+ setupTexts(suggestions, countInStrip);
+ mMoreSuggestionsAvailable = (suggestions.size() > countInStrip);
+ int x = 0;
+ for (int index = 0; index < countInStrip; index++) {
+ final int pos = getWordPosition(index, suggestions);
- if (mCanUseFixedWidthColumns) {
- return;
+ if (index != 0) {
+ final View divider = mDividers.get(pos);
+ // Add divider if this isn't the left most suggestion in candidate strip.
+ stripView.addView(divider);
}
- if (mVariableWidthForWords <= mAvailableWidthForWords) {
- return;
+
+ final CharSequence styled = mTexts.get(pos);
+ final TextView word = mWords.get(pos);
+ if (index == mCenterCandidateIndex && mMoreSuggestionsAvailable) {
+ // TODO: This "more suggestions hint" should have nicely designed icon.
+ word.setCompoundDrawablesWithIntrinsicBounds(
+ null, null, null, mMoreCandidateHint);
+ } else {
+ word.setCompoundDrawables(null, null, null, null);
}
- final float scaleX = mAvailableWidthForWords / (float)mVariableWidthForWords;
- if (scaleX >= MIN_TEXT_XSCALE) {
- mScaleX = scaleX;
- return;
+ // Disable this candidate if the suggestion is null or empty.
+ word.setEnabled(!TextUtils.isEmpty(styled));
+ word.setTextColor(getCandidateTextColor(index, suggestions, pos));
+ final int width = getCandidateWidth(index, stripWidth);
+ final CharSequence text = getEllipsizedText(styled, width, word.getPaint());
+ final float scaleX = word.getTextScaleX();
+ word.setText(text); // TextView.setText() resets text scale x to 1.0.
+ word.setTextScaleX(scaleX);
+ stripView.addView(word);
+ setLayoutWeight(word, getCandidateWeight(index), mCandidateStripHeight);
+
+ if (DBG) {
+ final CharSequence debugInfo = getDebugInfo(suggestions, pos);
+ if (debugInfo != null) {
+ final TextView info = mInfos.get(pos);
+ info.setText(debugInfo);
+ paneView.addView(info);
+ info.measure(WRAP_CONTENT, WRAP_CONTENT);
+ final int infoWidth = info.getMeasuredWidth();
+ final int y = info.getMeasuredHeight();
+ FrameLayoutCompatUtils.placeViewAt(info, x, 0, infoWidth, y);
+ x += infoWidth * 2;
+ }
}
+ }
- mCountInStrip--;
- } while (mCountInStrip > 1);
- }
-
- public void tryLayout() {
- final int maxCount = mCountInStrip;
- final int dividers = mDividerWidth * (maxCount - 1);
- mConstantWidthForPaddings = dividers + mPadding * maxCount;
- mAvailableWidthForWords = mMaxWidth - mConstantWidthForPaddings;
-
- mPaint.setTextScaleX(mScaleX);
- final int maxFixedWidthForWord = (mMaxWidth - dividers) / maxCount - mPadding;
- mCanUseFixedWidthColumns = true;
- mVariableWidthForWords = 0;
- for (int i = 0; i < maxCount; i++) {
- final int width = getTextWidth(mTexts.get(i), mPaint);
- if (width > maxFixedWidthForWord)
- mCanUseFixedWidthColumns = false;
- mVariableWidthForWords += width;
+ return countInStrip;
+ }
+
+ private int getCandidateWidth(int index, int maxWidth) {
+ final int paddings = mPadding * mCandidateCountInStrip;
+ final int dividers = mDividerWidth * (mCandidateCountInStrip - 1);
+ final int availableWidth = maxWidth - paddings - dividers;
+ return (int)(availableWidth * getCandidateWeight(index));
+ }
+
+ private float getCandidateWeight(int index) {
+ if (index == mCenterCandidateIndex) {
+ return mCenterCandidateWeight;
+ } else {
+ // TODO: Revisit this for cases of 5 or more suggestions
+ return (1.0f - mCenterCandidateWeight) / (mCandidateCountInStrip - 1);
}
}
- private void setupTexts(SuggestedWords suggestions, int count, int autoCorrectHighlight) {
+ private void setupTexts(SuggestedWords suggestions, int countInStrip) {
mTexts.clear();
- for (int i = 0; i < count; i++) {
- final CharSequence suggestion = suggestions.getWord(i);
- if (suggestion == null) {
- // Skip an empty suggestion, but we need to add a place-holder for it in order
- // to avoid an exception in the loop in updateSuggestions().
- mTexts.add("");
- continue;
- }
-
- final boolean isAutoCorrect = suggestions.mHasMinimalSuggestion
- && ((i == 1 && !suggestions.mTypedWordValid)
- || (i == 0 && suggestions.mTypedWordValid));
- // HACK: even if i == 0, we use mColorOther when this suggestion's length is 1
- // and there are multiple suggestions, such as the default punctuation list.
- // TODO: Need to revisit this logic with bigram suggestions
- final CharSequence styled = getStyledCandidateWord(suggestion, isAutoCorrect,
- autoCorrectHighlight);
+ final int count = Math.min(suggestions.size(), countInStrip);
+ for (int pos = 0; pos < count; pos++) {
+ final CharSequence word = suggestions.getWord(pos);
+ final boolean isAutoCorrect = pos == 1 && willAutoCorrect(suggestions);
+ final CharSequence styled = getStyledCandidateWord(word, isAutoCorrect);
mTexts.add(styled);
}
+ for (int pos = count; pos < countInStrip; pos++) {
+ // Make this inactive for touches in layout().
+ mTexts.add(null);
+ }
}
- @Override
- public String toString() {
- return String.format(
- "count=%d width=%d avail=%d fixcol=%s scaleX=%4.2f const=%d var=%d",
- mCountInStrip, mMaxWidth, mAvailableWidthForWords, mCanUseFixedWidthColumns,
- mScaleX, mConstantWidthForPaddings, mVariableWidthForWords);
+ private int layoutPunctuationSuggestions(SuggestedWords suggestions, ViewGroup stripView) {
+ final int countInStrip = Math.min(suggestions.size(), PUNCTUATIONS_IN_STRIP);
+ for (int index = 0; index < countInStrip; index++) {
+ if (index != 0) {
+ // Add divider if this isn't the left most suggestion in candidate strip.
+ stripView.addView(mDividers.get(index));
+ }
+
+ final TextView word = mWords.get(index);
+ word.setEnabled(true);
+ word.setTextColor(mColorTypedWord);
+ final CharSequence text = suggestions.getWord(index);
+ word.setText(text);
+ word.setTextScaleX(1.0f);
+ word.setCompoundDrawables(null, null, null, null);
+ stripView.addView(word);
+ setLayoutWeight(word, 1.0f, mCandidateStripHeight);
+ }
+ mMoreSuggestionsAvailable = false;
+ return countInStrip;
}
}
@@ -296,18 +514,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
setBackgroundDrawable(LinearLayoutCompatUtils.getBackgroundDrawable(
context, attrs, defStyle, R.style.CandidateViewStyle));
- final TypedArray a = context.obtainStyledAttributes(
- attrs, R.styleable.CandidateView, defStyle, R.style.CandidateViewStyle);
- mAutoCorrectHighlight = a.getInt(R.styleable.CandidateView_autoCorrectHighlight, 0);
- mColorTypedWord = a.getColor(R.styleable.CandidateView_colorTypedWord, 0);
- mColorAutoCorrect = a.getColor(R.styleable.CandidateView_colorAutoCorrect, 0);
- mColorSuggestedCandidate = a.getColor(R.styleable.CandidateView_colorSuggested, 0);
- mCandidateCountInStrip = a.getInt(
- R.styleable.CandidateView_candidateCountInStrip, DEFAULT_CANDIDATE_COUNT_IN_STRIP);
- a.recycle();
-
- Resources res = context.getResources();
- LayoutInflater inflater = LayoutInflater.from(context);
+ final LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(R.layout.candidates_strip, this);
mPreviewPopup = new PopupWindow(context);
@@ -318,58 +525,26 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
mPreviewPopup.setBackgroundDrawable(null);
mCandidatesStrip = (ViewGroup)findViewById(R.id.candidates_strip);
- mCandidateStripHeight = res.getDimensionPixelOffset(R.dimen.candidate_strip_height);
- for (int i = 0; i < MAX_SUGGESTIONS; i++) {
+ for (int pos = 0; pos < MAX_SUGGESTIONS; pos++) {
final TextView word = (TextView)inflater.inflate(R.layout.candidate_word, null);
- word.setTag(i);
+ word.setTag(pos);
word.setOnClickListener(this);
- if (i == 0)
- word.setOnLongClickListener(this);
+ word.setOnLongClickListener(this);
mWords.add(word);
+ final View divider = inflater.inflate(R.layout.candidate_divider, null);
+ divider.setTag(pos);
+ divider.setOnClickListener(this);
+ mDividers.add(divider);
mInfos.add((TextView)inflater.inflate(R.layout.candidate_info, null));
- mDividers.add(inflater.inflate(R.layout.candidate_divider, null));
}
mTouchToSave = findViewById(R.id.touch_to_save);
mWordToSave = (TextView)findViewById(R.id.word_to_save);
mWordToSave.setOnClickListener(this);
- mInvertedForegroundColorSpan = new ForegroundColorSpan(mColorTypedWord ^ 0x00ffffff);
- mInvertedBackgroundColorSpan = new BackgroundColorSpan(mColorTypedWord);
-
- final TypedArray keyboardViewAttr = context.obtainStyledAttributes(
- attrs, R.styleable.KeyboardView, R.attr.keyboardViewStyle, R.style.KeyboardView);
- final Drawable expandBackground = keyboardViewAttr.getDrawable(
- R.styleable.KeyboardView_keyBackground);
- final Drawable closeBackground = keyboardViewAttr.getDrawable(
- R.styleable.KeyboardView_keyBackground);
- final int keyTextColor = keyboardViewAttr.getColor(
- R.styleable.KeyboardView_keyTextColor, 0xFF000000);
- keyboardViewAttr.recycle();
-
- mCandidatesPaneControl = (ViewGroup)findViewById(R.id.candidates_pane_control);
- mExpandCandidatesPane = (TextView)findViewById(R.id.expand_candidates_pane);
- mExpandCandidatesPane.setBackgroundDrawable(expandBackground);
- mExpandCandidatesPane.setTextColor(keyTextColor);
- mExpandCandidatesPane.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- expandCandidatesPane();
- }
- });
- mCloseCandidatesPane = (TextView)findViewById(R.id.close_candidates_pane);
- mCloseCandidatesPane.setBackgroundDrawable(closeBackground);
- mCloseCandidatesPane.setTextColor(keyTextColor);
- mCloseCandidatesPane.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- closeCandidatesPane();
- }
- });
- mCandidatesPaneControl.measure(WRAP_CONTENT, WRAP_CONTENT);
-
- mParams = new CandidateViewLayoutParams(res,
- mWords.get(0), mDividers.get(0), mCandidatesPaneControl, mAutoCorrectHighlight);
+ mStripParams = new SuggestionsStripParams(context, attrs, defStyle, mWords, mDividers,
+ mInfos);
+ mPaneParams = new SuggestionsPaneParams(mWords, mDividers, mInfos);
}
/**
@@ -390,7 +565,6 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
if (suggestions == null)
return;
mSuggestions = suggestions;
- mExpandCandidatesPane.setEnabled(false);
if (mShowingAutoCorrectionInverted) {
mHandler.postUpdateSuggestions();
} else {
@@ -398,181 +572,30 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
}
}
- private static CharSequence getStyledCandidateWord(CharSequence word, boolean isAutoCorrect,
- int autoCorrectHighlight) {
- if (!isAutoCorrect)
- return word;
- final Spannable spannedWord = new SpannableString(word);
- if ((autoCorrectHighlight & AUTO_CORRECT_BOLD) != 0)
- spannedWord.setSpan(BOLD_SPAN, 0, word.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
- if ((autoCorrectHighlight & AUTO_CORRECT_UNDERLINE) != 0)
- spannedWord.setSpan(UNDERLINE_SPAN, 0, word.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
- return spannedWord;
- }
-
- private int getCandidateTextColor(boolean isAutoCorrect, boolean isSuggestedCandidate,
- SuggestedWordInfo info) {
- final int color;
- if (isAutoCorrect) {
- color = mColorAutoCorrect;
- } else if (isSuggestedCandidate) {
- color = mColorSuggestedCandidate;
- } else {
- color = mColorTypedWord;
- }
- if (info != null && info.isPreviousSuggestedWord()) {
- final int newAlpha = (int)(Color.alpha(color) * 0.5f);
- return Color.argb(newAlpha, Color.red(color), Color.green(color), Color.blue(color));
- } else {
- return color;
- }
- }
-
private void updateSuggestions() {
- final SuggestedWords suggestions = mSuggestions;
- final List<SuggestedWordInfo> suggestedWordInfoList = suggestions.mSuggestedWordInfoList;
- final int paneWidth = getWidth();
- final CandidateViewLayoutParams params = mParams;
-
clear();
closeCandidatesPane();
- if (suggestions.size() == 0)
+ if (mSuggestions.size() == 0)
return;
- params.layoutStrip(suggestions, paneWidth, suggestions.isPunctuationSuggestions()
- ? PUNCTUATIONS_IN_STRIP : mCandidateCountInStrip);
-
- final int count = Math.min(mWords.size(), suggestions.size());
- if (count <= params.mCountInStrip && !DBG) {
- mCandidatesPaneControl.setVisibility(GONE);
- } else {
- mCandidatesPaneControl.setVisibility(VISIBLE);
- mExpandCandidatesPane.setVisibility(VISIBLE);
- mExpandCandidatesPane.setEnabled(true);
- }
-
- final int countInStrip = params.mCountInStrip;
- View centeringFrom = null, lastView = null;
- int x = 0, y = 0, infoX = 0;
- for (int i = 0; i < count; i++) {
- final int pos;
- if (i <= 1) {
- final boolean willAutoCorrect = !suggestions.mTypedWordValid
- && suggestions.mHasMinimalSuggestion;
- pos = willAutoCorrect ? 1 - i : i;
- } else {
- pos = i;
- }
- final CharSequence suggestion = suggestions.getWord(pos);
- if (suggestion == null) continue;
-
- final SuggestedWordInfo suggestionInfo = (suggestedWordInfoList != null)
- ? suggestedWordInfoList.get(pos) : null;
- final boolean isAutoCorrect = suggestions.mHasMinimalSuggestion
- && ((pos == 1 && !suggestions.mTypedWordValid)
- || (pos == 0 && suggestions.mTypedWordValid));
- // HACK: even if i == 0, we use mColorOther when this suggestion's length is 1
- // and there are multiple suggestions, such as the default punctuation list.
- // TODO: Need to revisit this logic with bigram suggestions
- final boolean isSuggestedCandidate = (pos != 0);
- final boolean isPunctuationSuggestions = (suggestion.length() == 1 && count > 1);
-
- final TextView word = mWords.get(pos);
- final TextPaint paint = word.getPaint();
- // TODO: Reorder candidates in strip as appropriate. The center candidate should hold
- // the word when space is typed (valid typed word or auto corrected word).
- word.setTextColor(getCandidateTextColor(isAutoCorrect,
- isSuggestedCandidate || isPunctuationSuggestions, suggestionInfo));
- final CharSequence styled = params.mTexts.get(pos);
-
- final TextView info;
- if (DBG && suggestionInfo != null
- && !TextUtils.isEmpty(suggestionInfo.getDebugString())) {
- info = mInfos.get(i);
- info.setText(suggestionInfo.getDebugString());
- } else {
- info = null;
- }
+ final int width = getWidth();
+ final int countInStrip = mStripParams.layout(
+ mSuggestions, mCandidatesStrip, mCandidatesPane, width);
+ final int countInPane = mPaneParams.layout(
+ mSuggestions, mCandidatesPane, countInStrip, mStripParams.getTextColor(), width);
+ }
- final CharSequence text;
- final float scaleX;
- if (i < countInStrip) {
- if (i == 0 && params.mCountInStrip == 1) {
- text = getEllipsizedText(styled, params.mMaxWidth, paint);
- scaleX = paint.getTextScaleX();
- } else {
- text = styled;
- scaleX = params.mScaleX;
- }
- word.setText(text);
- word.setTextScaleX(scaleX);
- if (i != 0) {
- // Add divider if this isn't the left most suggestion in candidate strip.
- mCandidatesStrip.addView(mDividers.get(i));
- }
- mCandidatesStrip.addView(word);
- if (params.mCanUseFixedWidthColumns) {
- setLayoutWeight(word, 1.0f, mCandidateStripHeight);
- } else {
- final int width = getTextWidth(text, paint) + params.mPadding;
- setLayoutWeight(word, width, mCandidateStripHeight);
- }
- if (info != null) {
- mCandidatesPane.addView(info);
- info.measure(WRAP_CONTENT, WRAP_CONTENT);
- final int width = info.getMeasuredWidth();
- y = info.getMeasuredHeight();
- FrameLayoutCompatUtils.placeViewAt(info, infoX, 0, width, y);
- infoX += width * 2;
- }
- } else {
- paint.setTextScaleX(1.0f);
- final int textWidth = getTextWidth(styled, paint);
- int available = paneWidth - x - params.mPadding;
- if (textWidth >= available) {
- // Needs new row, centering previous row.
- centeringCandidates(centeringFrom, lastView, x, paneWidth);
- x = 0;
- y += mCandidateStripHeight;
- }
- if (x != 0) {
- // Add divider if this isn't the left most suggestion in current row.
- final View divider = mDividers.get(i);
- mCandidatesPane.addView(divider);
- FrameLayoutCompatUtils.placeViewAt(
- divider, x, y + (mCandidateStripHeight - params.mDividerHeight) / 2,
- params.mDividerWidth, params.mDividerHeight);
- x += params.mDividerWidth;
- }
- available = paneWidth - x - params.mPadding;
- text = getEllipsizedText(styled, available, paint);
- scaleX = paint.getTextScaleX();
- word.setText(text);
- word.setTextScaleX(scaleX);
- mCandidatesPane.addView(word);
- lastView = word;
- if (x == 0) centeringFrom = word;
- word.measure(WRAP_CONTENT,
- MeasureSpec.makeMeasureSpec(mCandidateStripHeight, MeasureSpec.EXACTLY));
- final int width = word.getMeasuredWidth();
- final int height = word.getMeasuredHeight();
- FrameLayoutCompatUtils.placeViewAt(
- word, x, y + (mCandidateStripHeight - height) / 2, width, height);
- x += width;
- if (info != null) {
- mCandidatesPane.addView(info);
- lastView = info;
- info.measure(WRAP_CONTENT, WRAP_CONTENT);
- final int infoWidth = info.getMeasuredWidth();
- FrameLayoutCompatUtils.placeViewAt(
- info, x - infoWidth, y, infoWidth, info.getMeasuredHeight());
+ private static CharSequence getDebugInfo(SuggestedWords suggestions, int pos) {
+ if (DBG && pos < suggestions.size()) {
+ final SuggestedWordInfo wordInfo = suggestions.getInfo(pos);
+ if (wordInfo != null) {
+ final CharSequence debugInfo = wordInfo.getDebugString();
+ if (!TextUtils.isEmpty(debugInfo)) {
+ return debugInfo;
}
}
}
- if (x != 0) {
- // Centering last candidates row.
- centeringCandidates(centeringFrom, lastView, x, paneWidth);
- }
+ return null;
}
private static void setLayoutWeight(View v, float weight, int height) {
@@ -585,13 +608,13 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
}
}
- private void centeringCandidates(View from, View to, int width, int paneWidth) {
- final ViewGroup pane = mCandidatesPane;
- final int fromIndex = pane.indexOfChild(from);
- final int toIndex = pane.indexOfChild(to);
- final int offset = (paneWidth - width) / 2;
+ private static void centeringCandidates(ViewGroup parent, View from, View to, int width,
+ int parentWidth) {
+ final int fromIndex = parent.indexOfChild(from);
+ final int toIndex = parent.indexOfChild(to);
+ final int offset = (parentWidth - width) / 2;
for (int index = fromIndex; index <= toIndex; index++) {
- offsetMargin(pane.getChildAt(index), offset, 0);
+ offsetMargin(parent.getChildAt(index), offset, 0);
}
}
@@ -609,14 +632,17 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
TextPaint paint) {
paint.setTextScaleX(1.0f);
final int width = getTextWidth(text, paint);
- final float scaleX = Math.min(maxWidth / (float)width, 1.0f);
+ if (width <= maxWidth) {
+ return text;
+ }
+ final float scaleX = maxWidth / (float)width;
if (scaleX >= MIN_TEXT_XSCALE) {
paint.setTextScaleX(scaleX);
return text;
}
// Note that TextUtils.ellipsize() use text-x-scale as 1.0 if ellipsize is needed. To get
- // squeezed and ellipsezed text, passes enlarged width (maxWidth / MIN_TEXT_XSCALE).
+ // squeezed and ellipsized text, passes enlarged width (maxWidth / MIN_TEXT_XSCALE).
final CharSequence ellipsized = TextUtils.ellipsize(
text, paint, maxWidth / MIN_TEXT_XSCALE, TextUtils.TruncateAt.MIDDLE);
paint.setTextScaleX(MIN_TEXT_XSCALE);
@@ -655,31 +681,30 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
}
private void expandCandidatesPane() {
- mExpandCandidatesPane.setVisibility(GONE);
- mCloseCandidatesPane.setVisibility(VISIBLE);
mCandidatesPaneContainer.setMinimumHeight(mKeyboardView.getMeasuredHeight());
mCandidatesPaneContainer.setVisibility(VISIBLE);
mKeyboardView.setVisibility(GONE);
}
private void closeCandidatesPane() {
- mExpandCandidatesPane.setVisibility(VISIBLE);
- mCloseCandidatesPane.setVisibility(GONE);
mCandidatesPaneContainer.setVisibility(GONE);
mKeyboardView.setVisibility(VISIBLE);
}
+ private void toggleCandidatesPane() {
+ if (mCandidatesPaneContainer.getVisibility() == VISIBLE) {
+ closeCandidatesPane();
+ } else {
+ expandCandidatesPane();
+ }
+ }
+
public void onAutoCorrectionInverted(CharSequence autoCorrectedWord) {
- if ((mAutoCorrectHighlight & AUTO_CORRECT_INVERT) == 0)
+ final CharSequence inverted = mStripParams.getInvertedText(autoCorrectedWord);
+ if (inverted == null)
return;
final TextView tv = mWords.get(1);
- final Spannable word = new SpannableString(autoCorrectedWord);
- final int wordLength = word.length();
- word.setSpan(mInvertedBackgroundColorSpan, 0, wordLength,
- Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
- word.setSpan(mInvertedForegroundColorSpan, 0, wordLength,
- Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
- tv.setText(word);
+ tv.setText(inverted);
mShowingAutoCorrectionInverted = true;
}
@@ -691,7 +716,6 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
mWordToSave.setText(word);
mShowingAddToDictionary = true;
mCandidatesStrip.setVisibility(GONE);
- mCandidatesPaneControl.setVisibility(GONE);
mTouchToSave.setVisibility(VISIBLE);
}
@@ -724,7 +748,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
return;
final TextView previewText = mPreviewText;
- previewText.setTextColor(mColorTypedWord);
+ previewText.setTextColor(mStripParams.mColorTypedWord);
previewText.setText(word);
previewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
@@ -751,18 +775,11 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
@Override
public boolean onLongClick(View view) {
- final Object tag = view.getTag();
- if (!(tag instanceof Integer))
+ if (mStripParams.mMoreSuggestionsAvailable) {
+ toggleCandidatesPane();
return true;
- final int index = (Integer) tag;
- if (index >= mSuggestions.size())
- return true;
-
- final CharSequence word = mSuggestions.getWord(index);
- if (word.length() < 2)
- return false;
- addToDictionary(word);
- return true;
+ }
+ return false;
}
@Override
@@ -773,6 +790,11 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
return;
}
+ if (view == mCandidatesPane) {
+ closeCandidatesPane();
+ return;
+ }
+
final Object tag = view.getTag();
if (!(tag instanceof Integer))
return;
diff --git a/java/src/com/android/inputmethod/latin/ContactsDictionary.java b/java/src/com/android/inputmethod/latin/ContactsDictionary.java
index 66a041508..8a7dfb839 100644
--- a/java/src/com/android/inputmethod/latin/ContactsDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ContactsDictionary.java
@@ -49,20 +49,28 @@ public class ContactsDictionary extends ExpandableDictionary {
private long mLastLoadedContacts;
- public ContactsDictionary(Context context, int dicTypeId) {
+ public ContactsDictionary(final Context context, final int dicTypeId) {
super(context, dicTypeId);
+ registerObserver(context);
+ loadDictionary();
+ }
+
+ private synchronized void registerObserver(final Context context) {
// Perform a managed query. The Activity will handle closing and requerying the cursor
// when needed.
+ if (mObserver != null) return;
ContentResolver cres = context.getContentResolver();
-
cres.registerContentObserver(
- Contacts.CONTENT_URI, true,mObserver = new ContentObserver(null) {
+ Contacts.CONTENT_URI, true, mObserver = new ContentObserver(null) {
@Override
public void onChange(boolean self) {
setRequiresReload(true);
}
});
- loadDictionary();
+ }
+
+ public void reopen(final Context context) {
+ registerObserver(context);
}
@Override
diff --git a/java/src/com/android/inputmethod/latin/DebugSettings.java b/java/src/com/android/inputmethod/latin/DebugSettings.java
index fd62d61c3..2f1e7c2b8 100644
--- a/java/src/com/android/inputmethod/latin/DebugSettings.java
+++ b/java/src/com/android/inputmethod/latin/DebugSettings.java
@@ -33,7 +33,6 @@ public class DebugSettings extends PreferenceActivity
private boolean mServiceNeedsRestart = false;
private CheckBoxPreference mDebugMode;
- private CheckBoxPreference mUseSpacebarLanguageSwitch;
@Override
protected void onCreate(Bundle icicle) {
@@ -61,13 +60,6 @@ public class DebugSettings extends PreferenceActivity
updateDebugMode();
mServiceNeedsRestart = true;
}
- } else if (key.equals(SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCH_KEY)) {
- if (mUseSpacebarLanguageSwitch != null) {
- mUseSpacebarLanguageSwitch.setChecked(
- prefs.getBoolean(SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCH_KEY,
- getResources().getBoolean(
- R.bool.config_use_spacebar_language_switcher)));
- }
}
}
diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java
index c7737b9a2..c35b42877 100644
--- a/java/src/com/android/inputmethod/latin/Dictionary.java
+++ b/java/src/com/android/inputmethod/latin/Dictionary.java
@@ -1,12 +1,12 @@
/*
* Copyright (C) 2008 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
@@ -16,6 +16,8 @@
package com.android.inputmethod.latin;
+import com.android.inputmethod.keyboard.ProximityInfo;
+
/**
* Abstract base class for a dictionary that can do a fuzzy search for words based on a set of key
* strokes.
@@ -25,7 +27,7 @@ public abstract class Dictionary {
* Whether or not to replicate the typed word in the suggested list, even if it's valid.
*/
protected static final boolean INCLUDE_TYPED_WORD_IF_VALID = false;
-
+
/**
* The weight to give to a word if it's length is the same as the number of typed characters.
*/
@@ -57,13 +59,15 @@ public abstract class Dictionary {
}
/**
- * Searches for words in the dictionary that match the characters in the composer. Matched
+ * Searches for words in the dictionary that match the characters in the composer. Matched
* words are added through the callback object.
* @param composer the key sequence to match
* @param callback the callback object to send matched words to as possible candidates
+ * @param proximityInfo the object for key proximity. May be ignored by some implementations.
* @see WordCallback#addWord(char[], int, int, int, int, DataType)
*/
- abstract public void getWords(final WordComposer composer, final WordCallback callback);
+ abstract public void getWords(final WordComposer composer, final WordCallback callback,
+ final ProximityInfo proximityInfo);
/**
* Searches for pairs in the bigram dictionary that matches the previous word and all the
@@ -83,7 +87,7 @@ public abstract class Dictionary {
* @return true if the word exists, false otherwise
*/
abstract public boolean isValidWord(CharSequence word);
-
+
/**
* Compares the contents of the character array with the typed word and returns true if they
* are the same.
diff --git a/java/src/com/android/inputmethod/latin/DictionaryCollection.java b/java/src/com/android/inputmethod/latin/DictionaryCollection.java
index 5e7de3e6b..739153044 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryCollection.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryCollection.java
@@ -16,7 +16,10 @@
package com.android.inputmethod.latin;
+import com.android.inputmethod.keyboard.ProximityInfo;
+
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -32,17 +35,24 @@ public class DictionaryCollection extends Dictionary {
}
public DictionaryCollection(Dictionary... dictionaries) {
- mDictionaries = new CopyOnWriteArrayList<Dictionary>(dictionaries);
+ if (null == dictionaries) {
+ mDictionaries = new CopyOnWriteArrayList<Dictionary>();
+ } else {
+ mDictionaries = new CopyOnWriteArrayList<Dictionary>(dictionaries);
+ mDictionaries.removeAll(Collections.singleton(null));
+ }
}
public DictionaryCollection(Collection<Dictionary> dictionaries) {
mDictionaries = new CopyOnWriteArrayList<Dictionary>(dictionaries);
+ mDictionaries.removeAll(Collections.singleton(null));
}
@Override
- public void getWords(final WordComposer composer, final WordCallback callback) {
+ public void getWords(final WordComposer composer, final WordCallback callback,
+ final ProximityInfo proximityInfo) {
for (final Dictionary dict : mDictionaries)
- dict.getWords(composer, callback);
+ dict.getWords(composer, callback, proximityInfo);
}
@Override
@@ -66,6 +76,6 @@ public class DictionaryCollection extends Dictionary {
}
public void addDictionary(Dictionary newDict) {
- mDictionaries.add(newDict);
+ if (null != newDict) mDictionaries.add(newDict);
}
}
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFactory.java b/java/src/com/android/inputmethod/latin/DictionaryFactory.java
index bba331868..39b4f63a5 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFactory.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFactory.java
@@ -48,29 +48,61 @@ public class DictionaryFactory {
int fallbackResId) {
if (null == locale) {
Log.e(TAG, "No locale defined for dictionary");
- return new DictionaryCollection(createBinaryDictionary(context, fallbackResId));
+ return new DictionaryCollection(createBinaryDictionary(context, fallbackResId, locale));
}
final List<Dictionary> dictList = new LinkedList<Dictionary>();
- for (final AssetFileAddress f : BinaryDictionaryGetter.getDictionaryFiles(locale,
- context, fallbackResId)) {
- dictList.add(new BinaryDictionary(context, f.mFilename, f.mOffset, f.mLength, null));
+ final List<AssetFileAddress> assetFileList =
+ BinaryDictionaryGetter.getDictionaryFiles(locale, context, fallbackResId);
+ if (null != assetFileList) {
+ for (final AssetFileAddress f : assetFileList) {
+ final BinaryDictionary binaryDictionary =
+ new BinaryDictionary(context, f.mFilename, f.mOffset, f.mLength, null);
+ if (binaryDictionary.isValidDictionary()) {
+ dictList.add(binaryDictionary);
+ }
+ }
}
- if (null == dictList) return null;
- return new DictionaryCollection(dictList);
+ // null == dictList is not supposed to be possible, but better safe than sorry and it's
+ // safer for future extension. In this case, rather than returning null, it should be safer
+ // to return an empty DictionaryCollection.
+ if (null == dictList) {
+ return new DictionaryCollection();
+ } else {
+ if (dictList.isEmpty()) {
+ // The list may be empty if no dictionaries have been added. The getter should not
+ // return an empty list, but if it does we end up here. Likewise, if the files
+ // we found could not be opened by the native code for any reason (format mismatch,
+ // file too big to fit in memory, etc) then we could have an empty list. In this
+ // case we want to fall back on the resource.
+ return new DictionaryCollection(createBinaryDictionary(context, fallbackResId,
+ locale));
+ } else {
+ return new DictionaryCollection(dictList);
+ }
+ }
}
/**
* Initializes a dictionary from a raw resource file
* @param context application context for reading resources
* @param resId the resource containing the raw binary dictionary
+ * @param locale the locale to use for the resource
* @return an initialized instance of BinaryDictionary
*/
- protected static BinaryDictionary createBinaryDictionary(Context context, int resId) {
+ protected static BinaryDictionary createBinaryDictionary(final Context context,
+ final int resId, final Locale locale) {
AssetFileDescriptor afd = null;
try {
- afd = context.getResources().openRawResourceFd(resId);
+ final Resources res = context.getResources();
+ if (null != locale) {
+ final Locale savedLocale = Utils.setSystemLocale(res, locale);
+ afd = res.openRawResourceFd(resId);
+ Utils.setSystemLocale(res, savedLocale);
+ } else {
+ afd = res.openRawResourceFd(resId);
+ }
if (afd == null) {
Log.e(TAG, "Found the resource but it is compressed. resId=" + resId);
return null;
diff --git a/java/src/com/android/inputmethod/latin/EditingUtils.java b/java/src/com/android/inputmethod/latin/EditingUtils.java
index e56aa695d..634dbbdfc 100644
--- a/java/src/com/android/inputmethod/latin/EditingUtils.java
+++ b/java/src/com/android/inputmethod/latin/EditingUtils.java
@@ -33,6 +33,7 @@ public class EditingUtils {
* Number of characters we want to look back in order to identify the previous word
*/
private static final int LOOKBACK_CHARACTER_NUM = 15;
+ private static final int INVALID_CURSOR_POSITION = -1;
private EditingUtils() {
// Unintentional empty constructor for singleton.
@@ -63,10 +64,11 @@ public class EditingUtils {
}
private static int getCursorPosition(InputConnection connection) {
+ if (null == connection) return INVALID_CURSOR_POSITION;
ExtractedText extracted = connection.getExtractedText(
new ExtractedTextRequest(), 0);
if (extracted == null) {
- return -1;
+ return INVALID_CURSOR_POSITION;
}
return extracted.startOffset + extracted.selectionStart;
}
@@ -79,6 +81,7 @@ public class EditingUtils {
* represents the cursor, then "hello " will be returned.
*/
public static String getWordAtCursor(InputConnection connection, String separators) {
+ // getWordRangeAtCursor returns null if the connection is null
Range r = getWordRangeAtCursor(connection, separators);
return (r == null) ? null : r.mWord;
}
@@ -88,6 +91,7 @@ public class EditingUtils {
* getWordAtCursor.
*/
public static void deleteWordAtCursor(InputConnection connection, String separators) {
+ // getWordRangeAtCursor returns null if the connection is null
Range range = getWordRangeAtCursor(connection, separators);
if (range == null) return;
@@ -165,6 +169,7 @@ public class EditingUtils {
public static CharSequence getPreviousWord(InputConnection connection,
String sentenceSeperators) {
//TODO: Should fix this. This could be slow!
+ if (null == connection) return null;
CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0);
return getPreviousWord(prev, sentenceSeperators);
}
@@ -194,6 +199,7 @@ public class EditingUtils {
}
public static CharSequence getThisWord(InputConnection connection, String sentenceSeperators) {
+ if (null == connection) return null;
final CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0);
return getThisWord(prev, sentenceSeperators);
}
@@ -256,12 +262,14 @@ public class EditingUtils {
int selStart, int selEnd, String wordSeparators) {
if (selStart == selEnd) {
// There is just a cursor, so get the word at the cursor
+ // getWordRangeAtCursor returns null if the connection is null
EditingUtils.Range range = getWordRangeAtCursor(ic, wordSeparators);
if (range != null && !TextUtils.isEmpty(range.mWord)) {
return new SelectedWord(selStart - range.mCharsBefore, selEnd + range.mCharsAfter,
range.mWord);
}
} else {
+ if (null == ic) return null;
// Is the previous character empty or a word separator? If not, return null.
CharSequence charsBefore = ic.getTextBeforeCursor(1, 0);
if (!isWordBoundary(charsBefore, wordSeparators)) {
diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
index 97a4a1816..35d1541ff 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.os.AsyncTask;
import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.ProximityInfo;
import java.util.LinkedList;
@@ -193,7 +194,8 @@ public class ExpandableDictionary extends Dictionary {
}
@Override
- public void getWords(final WordComposer codes, final WordCallback callback) {
+ public void getWords(final WordComposer codes, final WordCallback callback,
+ final ProximityInfo proximityInfo) {
synchronized (mUpdatingLock) {
// If we need to update, start off a background task
if (mRequiresReload) startDictionaryLoadingTaskLocked();
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index b7a795221..c28e40d95 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -29,7 +29,6 @@ import android.inputmethodservice.InputMethodService;
import android.media.AudioManager;
import android.net.ConnectivityManager;
import android.os.Debug;
-import android.os.IBinder;
import android.os.Message;
import android.os.SystemClock;
import android.preference.PreferenceActivity;
@@ -45,8 +44,6 @@ import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
-import android.view.Window;
-import android.view.WindowManager;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.ExtractedText;
@@ -63,9 +60,11 @@ import com.android.inputmethod.compat.SuggestionSpanUtils;
import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
import com.android.inputmethod.deprecated.VoiceProxy;
import com.android.inputmethod.deprecated.recorrection.Recorrection;
+import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardActionListener;
import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.keyboard.KeyboardSwitcher.KeyboardLayoutState;
import com.android.inputmethod.keyboard.KeyboardView;
import com.android.inputmethod.keyboard.LatinKeyboard;
import com.android.inputmethod.keyboard.LatinKeyboardView;
@@ -114,6 +113,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// Key events coming any faster than this are long-presses.
private static final int QUICK_PRESS = 200;
+ private static final int SCREEN_ORIENTATION_CHANGE_DETECTION_DELAY = 2;
+ private static final int ACCUMULATE_START_INPUT_VIEW_DELAY = 20;
+ private static final int RESTORE_KEYBOARD_STATE_DELAY = 500;
+
/**
* The name of the scheme used by the Package Manager to warn of a new package installation,
* replacement or removal.
@@ -142,8 +145,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private Suggest mSuggest;
private CompletionInfo[] mApplicationSpecifiedCompletions;
- private AlertDialog mOptionsDialog;
-
private InputMethodManagerCompatWrapper mImm;
private Resources mResources;
private SharedPreferences mPrefs;
@@ -156,6 +157,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private UserDictionary mUserDictionary;
private UserBigramDictionary mUserBigramDictionary;
private UserUnigramDictionary mUserUnigramDictionary;
+ private boolean mIsUserDictionaryAvaliable;
// TODO: Create an inner class to group options and pseudo-options to improve readability.
// These variables are initialized according to the {@link EditorInfo#inputType}.
@@ -168,7 +170,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private WordComposer mWordComposer = new WordComposer();
private CharSequence mBestWord;
private boolean mHasUncommittedTypedChars;
- private boolean mHasDictionary;
// Magic space: a space that should disappear on space/apostrophe insertion, move after the
// punctuation on punctuation insertion, and become a real space on alpha char insertion.
private boolean mJustAddedMagicSpace; // This indicates whether the last char is a magic space.
@@ -178,7 +179,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private int mCorrectionMode;
private int mCommittedLength;
- private int mOrientation;
// Keep track of the last selection range to decide if we need to show word alternatives
private int mLastSelectionStart;
private int mLastSelectionEnd;
@@ -197,6 +197,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// TODO: Move this flag to VoiceProxy
private boolean mConfigurationChanging;
+ // Member variables for remembering the current device orientation.
+ private int mDisplayOrientation;
+ private int mDisplayWidth;
+ private int mDisplayHeight;
+
// Object for reacting to adding/removing a dictionary pack.
private BroadcastReceiver mDictionaryPackInstallReceiver =
new DictionaryPackInstallBroadcastReceiver(this);
@@ -204,7 +209,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// Keeps track of most recently inserted text (multi-character key) for reverting
private CharSequence mEnteredText;
-
public final UIHandler mHandler = new UIHandler(this);
public static class UIHandler extends StaticInnerHandlerWrapper<LatinIME> {
@@ -216,6 +220,30 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private static final int MSG_DISMISS_LANGUAGE_ON_SPACEBAR = 5;
private static final int MSG_SPACE_TYPED = 6;
private static final int MSG_SET_BIGRAM_PREDICTIONS = 7;
+ private static final int MSG_CONFIRM_ORIENTATION_CHANGE = 8;
+ private static final int MSG_START_INPUT_VIEW = 9;
+ private static final int MSG_RESTORE_KEYBOARD_LAYOUT = 10;
+
+ private static class OrientationChangeArgs {
+ public final int mOldWidth;
+ public final int mOldHeight;
+ private int mRetryCount;
+
+ public OrientationChangeArgs(int oldw, int oldh) {
+ mOldWidth = oldw;
+ mOldHeight = oldh;
+ mRetryCount = 0;
+ }
+
+ public boolean hasTimedOut() {
+ mRetryCount++;
+ return mRetryCount >= 10;
+ }
+
+ public boolean hasOrientationChangeFinished(DisplayMetrics dm) {
+ return dm.widthPixels != mOldWidth && dm.heightPixels != mOldHeight;
+ }
+ }
public UIHandler(LatinIME outerInstance) {
super(outerInstance);
@@ -264,6 +292,25 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
(LatinKeyboard)msg.obj);
}
break;
+ case MSG_CONFIRM_ORIENTATION_CHANGE: {
+ final OrientationChangeArgs args = (OrientationChangeArgs)msg.obj;
+ final Resources res = latinIme.mResources;
+ final DisplayMetrics dm = res.getDisplayMetrics();
+ if (args.hasTimedOut() || args.hasOrientationChangeFinished(dm)) {
+ latinIme.setDisplayGeometry(res.getConfiguration(), dm);
+ } else {
+ // It seems orientation changing is on going.
+ postConfirmOrientationChange(args);
+ }
+ break;
+ }
+ case MSG_START_INPUT_VIEW:
+ latinIme.onStartInputView((EditorInfo)msg.obj, false);
+ break;
+ case MSG_RESTORE_KEYBOARD_LAYOUT:
+ removeMessages(MSG_UPDATE_SHIFT_STATE);
+ ((KeyboardLayoutState)msg.obj).restore();
+ break;
}
}
@@ -353,6 +400,49 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public boolean isAcceptingDoubleSpaces() {
return hasMessages(MSG_SPACE_TYPED);
}
+
+ public void postRestoreKeyboardLayout() {
+ final LatinIME latinIme = getOuterInstance();
+ final KeyboardLayoutState state = latinIme.mKeyboardSwitcher.getKeyboardState();
+ if (state.isValid()) {
+ removeMessages(MSG_RESTORE_KEYBOARD_LAYOUT);
+ sendMessageDelayed(
+ obtainMessage(MSG_RESTORE_KEYBOARD_LAYOUT, state),
+ RESTORE_KEYBOARD_STATE_DELAY);
+ }
+ }
+
+ private void postConfirmOrientationChange(OrientationChangeArgs args) {
+ removeMessages(MSG_CONFIRM_ORIENTATION_CHANGE);
+ // Will confirm whether orientation change has finished or not again.
+ sendMessageDelayed(obtainMessage(MSG_CONFIRM_ORIENTATION_CHANGE, args),
+ SCREEN_ORIENTATION_CHANGE_DETECTION_DELAY);
+ }
+
+ public void startOrientationChanging(int oldw, int oldh) {
+ postConfirmOrientationChange(new OrientationChangeArgs(oldw, oldh));
+ final LatinIME latinIme = getOuterInstance();
+ latinIme.mKeyboardSwitcher.getKeyboardState().save();
+ postRestoreKeyboardLayout();
+ }
+
+ public boolean postStartInputView(EditorInfo attribute) {
+ if (hasMessages(MSG_CONFIRM_ORIENTATION_CHANGE) || hasMessages(MSG_START_INPUT_VIEW)) {
+ removeMessages(MSG_START_INPUT_VIEW);
+ // Postpone onStartInputView by ACCUMULATE_START_INPUT_VIEW_DELAY and see if
+ // orientation change has finished.
+ sendMessageDelayed(obtainMessage(MSG_START_INPUT_VIEW, attribute),
+ ACCUMULATE_START_INPUT_VIEW_DELAY);
+ return true;
+ }
+ return false;
+ }
+ }
+
+ private void setDisplayGeometry(Configuration conf, DisplayMetrics metric) {
+ mDisplayOrientation = conf.orientation;
+ mDisplayWidth = metric.widthPixels;
+ mDisplayHeight = metric.heightPixels;
}
@Override
@@ -361,14 +451,15 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mPrefs = prefs;
LatinImeLogger.init(this, prefs);
LanguageSwitcherProxy.init(this, prefs);
- SubtypeSwitcher.init(this, prefs);
+ InputMethodManagerCompatWrapper.init(this);
+ SubtypeSwitcher.init(this);
KeyboardSwitcher.init(this, prefs);
Recorrection.init(this, prefs);
AccessibilityUtils.init(this, prefs);
super.onCreate();
- mImm = InputMethodManagerCompatWrapper.getInstance(this);
+ mImm = InputMethodManagerCompatWrapper.getInstance();
mInputMethodId = Utils.getInputMethodId(mImm, getPackageName());
mSubtypeSwitcher = SubtypeSwitcher.getInstance();
mKeyboardSwitcher = KeyboardSwitcher.getInstance();
@@ -391,7 +482,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
}
- mOrientation = res.getConfiguration().orientation;
+ setDisplayGeometry(res.getConfiguration(), res.getDisplayMetrics());
// Register to receive ringer mode change and network state change.
// Also receive installation and removal of a dictionary pack.
@@ -418,7 +509,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
if (null == mPrefs) mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
if (null == mSubtypeSwitcher) mSubtypeSwitcher = SubtypeSwitcher.getInstance();
mSettingsValues = new Settings.Values(mPrefs, this, mSubtypeSwitcher.getInputLocaleStr());
- resetContactsDictionary();
+ resetContactsDictionary(null == mSuggest ? null : mSuggest.getContactsDictionary());
}
private void initSuggest() {
@@ -427,8 +518,12 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
final Resources res = mResources;
final Locale savedLocale = Utils.setSystemLocale(res, keyboardLocale);
+ final ContactsDictionary oldContactsDictionary;
if (mSuggest != null) {
+ oldContactsDictionary = mSuggest.getContactsDictionary();
mSuggest.close();
+ } else {
+ oldContactsDictionary = null;
}
int mainDicResId = Utils.getMainDictionaryResourceId(res);
@@ -440,8 +535,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mUserDictionary = new UserDictionary(this, localeStr);
mSuggest.setUserDictionary(mUserDictionary);
+ mIsUserDictionaryAvaliable = mUserDictionary.isEnabled();
- resetContactsDictionary();
+ resetContactsDictionary(oldContactsDictionary);
mUserUnigramDictionary
= new UserUnigramDictionary(this, this, localeStr, Suggest.DIC_USER_UNIGRAM);
@@ -456,11 +552,36 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
Utils.setSystemLocale(res, savedLocale);
}
- private void resetContactsDictionary() {
- if (null == mSuggest) return;
- ContactsDictionary contactsDictionary = mSettingsValues.mUseContactsDict
- ? new ContactsDictionary(this, Suggest.DIC_CONTACTS) : null;
- mSuggest.setContactsDictionary(contactsDictionary);
+ /**
+ * Resets the contacts dictionary in mSuggest according to the user settings.
+ *
+ * This method takes an optional contacts dictionary to use. Since the contacts dictionary
+ * does not depend on the locale, it can be reused across different instances of Suggest.
+ * The dictionary will also be opened or closed as necessary depending on the settings.
+ *
+ * @param oldContactsDictionary an optional dictionary to use, or null
+ */
+ private void resetContactsDictionary(final ContactsDictionary oldContactsDictionary) {
+ final boolean shouldSetDictionary = (null != mSuggest && mSettingsValues.mUseContactsDict);
+
+ final ContactsDictionary dictionaryToUse;
+ if (!shouldSetDictionary) {
+ // Make sure the dictionary is closed. If it is already closed, this is a no-op,
+ // so it's safe to call it anyways.
+ if (null != oldContactsDictionary) oldContactsDictionary.close();
+ dictionaryToUse = null;
+ } else if (null != oldContactsDictionary) {
+ // Make sure the old contacts dictionary is opened. If it is already open, this is a
+ // no-op, so it's safe to call it anyways.
+ oldContactsDictionary.reopen(this);
+ dictionaryToUse = oldContactsDictionary;
+ } else {
+ dictionaryToUse = new ContactsDictionary(this, Suggest.DIC_CONTACTS);
+ }
+
+ if (null != mSuggest) {
+ mSuggest.setContactsDictionary(dictionaryToUse);
+ }
}
/* package private */ void resetSuggestMainDict() {
@@ -488,11 +609,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public void onConfigurationChanged(Configuration conf) {
mSubtypeSwitcher.onConfigurationChanged(conf);
// If orientation changed while predicting, commit the change
- if (conf.orientation != mOrientation) {
- InputConnection ic = getCurrentInputConnection();
+ if (conf.orientation != mDisplayOrientation) {
+ mHandler.startOrientationChanging(mDisplayWidth, mDisplayHeight);
+ final InputConnection ic = getCurrentInputConnection();
commitTyped(ic);
if (ic != null) ic.finishComposingText(); // For voice input
- mOrientation = conf.orientation;
if (isShowingOptionDialog())
mOptionsDialog.dismiss();
}
@@ -529,6 +650,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
@Override
public void onStartInputView(EditorInfo attribute, boolean restarting) {
+ mHandler.postRestoreKeyboardLayout();
+ if (mHandler.postStartInputView(attribute)) {
+ return;
+ }
+
final KeyboardSwitcher switcher = mKeyboardSwitcher;
LatinKeyboardView inputView = switcher.getKeyboardView();
@@ -550,8 +676,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// know now whether this is a password text field, because we need to know now whether we
// want to enable the voice button.
final VoiceProxy voiceIme = mVoiceProxy;
- voiceIme.resetVoiceStates(InputTypeCompatUtils.isPasswordInputType(attribute.inputType)
- || InputTypeCompatUtils.isVisiblePasswordInputType(attribute.inputType));
+ final int inputType = (attribute != null) ? attribute.inputType : 0;
+ voiceIme.resetVoiceStates(InputTypeCompatUtils.isPasswordInputType(inputType)
+ || InputTypeCompatUtils.isVisiblePasswordInputType(inputType));
initializeInputAttributes(attribute);
@@ -576,10 +703,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
LanguageSwitcherProxy.loadSettings();
if (mSubtypeSwitcher.isKeyboardMode()) {
- switcher.loadKeyboard(attribute,
- mSubtypeSwitcher.isShortcutImeEnabled() && voiceIme.isVoiceButtonEnabled(),
- voiceIme.isVoiceButtonOnPrimary());
- switcher.updateShiftState();
+ switcher.loadKeyboard(attribute, mSettingsValues);
}
if (mCandidateView != null)
@@ -588,8 +712,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// Delay updating suggestions because keyboard input view may not be shown at this point.
mHandler.postUpdateSuggestions();
- updateCorrectionMode();
-
inputView.setKeyPreviewPopupEnabled(mSettingsValues.mKeyPreviewPopupOn,
mSettingsValues.mKeyPreviewPopupDismissDelay);
inputView.setProximityCorrectionEnabled(true);
@@ -668,7 +790,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
super.onFinishInput();
LatinImeLogger.commit();
- mKeyboardSwitcher.onAutoCorrectionStateChanged(false);
mVoiceProxy.flushVoiceInputLogs(mConfigurationChanging);
@@ -681,6 +802,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
@Override
public void onFinishInputView(boolean finishingInput) {
super.onFinishInputView(finishingInput);
+ mKeyboardSwitcher.onFinishInputView();
KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
if (inputView != null) inputView.cancelAllMessages();
// Remove pending messages related to update suggestions
@@ -719,7 +841,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
final boolean selectionChanged = (newSelStart != candidatesEnd
|| newSelEnd != candidatesEnd) && mLastSelectionStart != newSelStart;
final boolean candidatesCleared = candidatesStart == -1 && candidatesEnd == -1;
- if (((mComposingStringBuilder.length() > 0 && mHasUncommittedTypedChars)
+ if (!mExpectingUpdateSelection
+ && ((mComposingStringBuilder.length() > 0 && mHasUncommittedTypedChars)
|| mVoiceProxy.isVoiceInputHighlighted())
&& (selectionChanged || candidatesCleared)) {
if (candidatesCleared) {
@@ -737,7 +860,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
setPunctuationSuggestions();
}
TextEntryState.reset();
- InputConnection ic = getCurrentInputConnection();
+ final InputConnection ic = getCurrentInputConnection();
if (ic != null) {
ic.finishComposingText();
}
@@ -802,7 +925,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
@Override
public void hideWindow() {
LatinImeLogger.commit();
- mKeyboardSwitcher.onAutoCorrectionStateChanged(false);
+ mKeyboardSwitcher.onHideWindow();
if (TRACE) Debug.stopMethodTracing();
if (mOptionsDialog != null && mOptionsDialog.isShowing()) {
@@ -847,7 +970,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
if (onEvaluateInputViewShown() && mCandidateViewContainer != null) {
final boolean shouldShowCandidates = shown
&& (needsInputViewShown ? mKeyboardSwitcher.isInputViewShown() : true);
- if (isExtractViewShown()) {
+ if (isFullscreenMode()) {
// No need to have extra space to show the key preview.
mCandidateViewContainer.setMinimumHeight(0);
mCandidateViewContainer.setVisibility(
@@ -942,7 +1065,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
event.getAction(), event.getKeyCode(), event.getRepeatCount(),
event.getDeviceId(), event.getScanCode(),
KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON);
- InputConnection ic = getCurrentInputConnection();
+ final InputConnection ic = getCurrentInputConnection();
if (ic != null)
ic.sendKeyEvent(newEvent);
return true;
@@ -952,12 +1075,12 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
return super.onKeyUp(keyCode, event);
}
- public void commitTyped(InputConnection inputConnection) {
+ public void commitTyped(final InputConnection ic) {
if (!mHasUncommittedTypedChars) return;
mHasUncommittedTypedChars = false;
if (mComposingStringBuilder.length() > 0) {
- if (inputConnection != null) {
- inputConnection.commitText(mComposingStringBuilder, 1);
+ if (ic != null) {
+ ic.commitText(mComposingStringBuilder, 1);
}
mCommittedLength = mComposingStringBuilder.length();
TextEntryState.acceptedTyped(mComposingStringBuilder);
@@ -968,7 +1091,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
public boolean getCurrentAutoCapsState() {
- InputConnection ic = getCurrentInputConnection();
+ final InputConnection ic = getCurrentInputConnection();
EditorInfo ei = getCurrentInputEditorInfo();
if (mSettingsValues.mAutoCap && ic != null && ei != null
&& ei.inputType != InputType.TYPE_NULL) {
@@ -992,25 +1115,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
}
- private static boolean canBeFollowedByPeriod(final int codePoint) {
- // TODO: Check again whether there really ain't a better way to check this.
- // TODO: This should probably be language-dependant...
- return Character.isLetterOrDigit(codePoint)
- || codePoint == Keyboard.CODE_SINGLE_QUOTE
- || codePoint == Keyboard.CODE_DOUBLE_QUOTE
- || codePoint == Keyboard.CODE_CLOSING_PARENTHESIS
- || codePoint == Keyboard.CODE_CLOSING_SQUARE_BRACKET
- || codePoint == Keyboard.CODE_CLOSING_CURLY_BRACKET
- || codePoint == Keyboard.CODE_CLOSING_ANGLE_BRACKET;
- }
-
private void maybeDoubleSpace() {
if (mCorrectionMode == Suggest.CORRECTION_NONE) return;
final InputConnection ic = getCurrentInputConnection();
if (ic == null) return;
final CharSequence lastThree = ic.getTextBeforeCursor(3, 0);
if (lastThree != null && lastThree.length() == 3
- && canBeFollowedByPeriod(lastThree.charAt(0))
+ && Utils.canBeFollowedByPeriod(lastThree.charAt(0))
&& lastThree.charAt(1) == Keyboard.CODE_SPACE
&& lastThree.charAt(2) == Keyboard.CODE_SPACE
&& mHandler.isAcceptingDoubleSpaces()) {
@@ -1026,10 +1137,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
}
- private void maybeRemovePreviousPeriod(CharSequence text) {
- final InputConnection ic = getCurrentInputConnection();
- if (ic == null) return;
-
+ // "ic" must not null
+ private void maybeRemovePreviousPeriod(final InputConnection ic, CharSequence text) {
// When the text's first character is '.', remove the previous period
// if there is one.
CharSequence lastOne = ic.getTextBeforeCursor(1, 0);
@@ -1069,25 +1178,31 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
private void onSettingsKeyPressed() {
- if (isShowingOptionDialog())
- return;
+ if (isShowingOptionDialog()) return;
if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) {
showSubtypeSelectorAndSettings();
- } else if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) {
+ } else if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm, false /* exclude aux subtypes */)) {
showOptionsMenu();
} else {
launchSettings();
}
}
- private void onSettingsKeyLongPressed() {
- if (!isShowingOptionDialog()) {
- if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) {
+ // Virtual codes representing custom requests. These are used in onCustomRequest() below.
+ public static final int CODE_SHOW_INPUT_METHOD_PICKER = 1;
+
+ @Override
+ public boolean onCustomRequest(int requestCode) {
+ if (isShowingOptionDialog()) return false;
+ switch (requestCode) {
+ case CODE_SHOW_INPUT_METHOD_PICKER:
+ if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm, true /* include aux subtypes */)) {
mImm.showInputMethodPicker();
- } else {
- launchSettings();
+ return true;
}
+ return false;
}
+ return false;
}
private boolean isShowingOptionDialog() {
@@ -1131,15 +1246,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
case Keyboard.CODE_SETTINGS:
onSettingsKeyPressed();
break;
- case Keyboard.CODE_SETTINGS_LONGPRESS:
- onSettingsKeyLongPressed();
- break;
- case LatinKeyboard.CODE_NEXT_LANGUAGE:
- toggleLanguage(true);
- break;
- case LatinKeyboard.CODE_PREV_LANGUAGE:
- toggleLanguage(false);
- break;
case Keyboard.CODE_CAPSLOCK:
switcher.toggleCapsLock();
break;
@@ -1174,12 +1280,12 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
@Override
public void onTextInput(CharSequence text) {
mVoiceProxy.commitVoiceInput();
- InputConnection ic = getCurrentInputConnection();
+ final InputConnection ic = getCurrentInputConnection();
if (ic == null) return;
mRecorrection.abortRecorrection(false);
ic.beginBatchEdit();
commitTyped(ic);
- maybeRemovePreviousPeriod(text);
+ maybeRemovePreviousPeriod(ic, text);
ic.commitText(text, 1);
ic.endBatchEdit();
mKeyboardSwitcher.updateShiftState();
@@ -1229,14 +1335,14 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
TextEntryState.backspace();
if (TextEntryState.isUndoCommit()) {
- revertLastWord(deleteChar);
+ revertLastWord(ic);
ic.endBatchEdit();
return;
}
if (justReplacedDoubleSpace) {
- if (revertDoubleSpace()) {
- ic.endBatchEdit();
- return;
+ if (revertDoubleSpace(ic)) {
+ ic.endBatchEdit();
+ return;
}
}
@@ -1251,7 +1357,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// different behavior only in the case of picking the first
// suggestion (typed word). It's intentional to have made this
// inconsistent with backspacing after selecting other suggestions.
- revertLastWord(true /* deleteChar */);
+ revertLastWord(ic);
} else {
sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL);
if (mDeleteCount > DELETE_ACCELERATE_AT) {
@@ -1297,7 +1403,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
int code = primaryCode;
- if (isAlphabet(code) && isSuggestionsRequested() && !isCursorTouchingWord()) {
+ if ((isAlphabet(code) || mSettingsValues.isSymbolExcludedFromWordSeparators(code))
+ && isSuggestionsRequested() && !isCursorTouchingWord()) {
if (!mHasUncommittedTypedChars) {
mHasUncommittedTypedChars = true;
mComposingStringBuilder.setLength(0);
@@ -1334,7 +1441,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
mComposingStringBuilder.append((char) code);
mWordComposer.add(code, keyCodes, x, y);
- InputConnection ic = getCurrentInputConnection();
+ final InputConnection ic = getCurrentInputConnection();
if (ic != null) {
// If it's the first letter, make note of auto-caps state
if (mWordComposer.size() == 1) {
@@ -1378,9 +1485,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// not to auto correct, but accept the typed word. For instance,
// in Italian dov' should not be expanded to dove' because the elision
// requires the last vowel to be removed.
- final boolean shouldAutoCorrect =
- (mSettingsValues.mAutoCorrectEnabled || mSettingsValues.mQuickFixes)
- && !mInputTypeNoAutoCorrect && mHasDictionary;
+ final boolean shouldAutoCorrect = mSettingsValues.mAutoCorrectEnabled
+ && !mInputTypeNoAutoCorrect;
if (shouldAutoCorrect && primaryCode != Keyboard.CODE_SINGLE_QUOTE) {
pickedDefault = pickDefaultSuggestion(primaryCode);
} else {
@@ -1455,7 +1561,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public boolean isShowingSuggestionsStrip() {
return (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_VALUE)
|| (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE
- && mOrientation == Configuration.ORIENTATION_PORTRAIT);
+ && mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT);
}
public boolean isCandidateStripVisible() {
@@ -1514,10 +1620,17 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
final WordComposer wordComposer = mWordComposer;
// TODO: May need a better way of retrieving previous word
- CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
- mSettingsValues.mWordSeparators);
- SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
- mKeyboardSwitcher.getKeyboardView(), wordComposer, prevWord);
+ final InputConnection ic = getCurrentInputConnection();
+ final CharSequence prevWord;
+ if (null == ic) {
+ prevWord = null;
+ } else {
+ prevWord = EditingUtils.getPreviousWord(ic, mSettingsValues.mWordSeparators);
+ }
+ // getSuggestedWordBuilder handles gracefully a null value of prevWord
+ final SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
+ mKeyboardSwitcher.getKeyboardView(), wordComposer, prevWord,
+ mKeyboardSwitcher.getLatinKeyboard().getProximityInfo());
boolean autoCorrectionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasAutoCorrection();
final CharSequence typedWord = wordComposer.getTypedWord();
@@ -1594,15 +1707,15 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mSettingsValues.mWordSeparators);
final boolean recorrecting = TextEntryState.isRecorrecting();
- InputConnection ic = getCurrentInputConnection();
+ final InputConnection ic = getCurrentInputConnection();
if (ic != null) {
ic.beginBatchEdit();
}
if (mApplicationSpecifiedCompletionOn && mApplicationSpecifiedCompletions != null
&& index >= 0 && index < mApplicationSpecifiedCompletions.length) {
- CompletionInfo ci = mApplicationSpecifiedCompletions[index];
if (ic != null) {
- ic.commitCompletion(ci);
+ final CompletionInfo completionInfo = mApplicationSpecifiedCompletions[index];
+ ic.commitCompletion(completionInfo);
}
mCommittedLength = suggestion.length();
if (mCandidateView != null) {
@@ -1626,7 +1739,12 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// for punctuation entered through the suggestion strip, it should be considered
// a magic space even if it was a normal space. This is meant to help in case the user
// pressed space on purpose of displaying the suggestion strip punctuation.
- final char primaryCode = suggestion.charAt(0);
+ final int rawPrimaryCode = suggestion.charAt(0);
+ // Maybe apply the "bidi mirrored" conversions for parentheses
+ final LatinKeyboard keyboard = mKeyboardSwitcher.getLatinKeyboard();
+ final int primaryCode = keyboard.mIsRtlKeyboard
+ ? Key.getRtlParenthesisCode(rawPrimaryCode) : rawPrimaryCode;
+
final CharSequence beforeText = ic != null ? ic.getTextBeforeCursor(1, 0) : "";
final int toLeft = (ic == null || TextUtils.isEmpty(beforeText))
? 0 : beforeText.charAt(0);
@@ -1663,9 +1781,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
sendMagicSpace();
}
- // We should show the hint if the user pressed the first entry AND either:
+ // We should show the "Touch again to save" hint if the user pressed the first entry
+ // AND either:
// - There is no dictionary (we know that because we tried to load it => null != mSuggest
- // AND mHasDictionary is false)
+ // AND mSuggest.hasMainDictionary() is false)
// - There is a dictionary and the word is not in it
// Please note that if mSuggest is null, it means that everything is off: suggestion
// and correction, so we shouldn't try to show the hint
@@ -1673,7 +1792,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// to do with the autocorrection setting.
final boolean showingAddToDictionaryHint = index == 0 && mSuggest != null
// If there is no dictionary the hint should be shown.
- && (!mHasDictionary
+ && (!mSuggest.hasMainDictionary()
// If "suggestion" is not in the dictionary, the hint should be shown.
|| !AutoCorrection.isValidWord(
mSuggest.getUnigramDictionaries(), suggestion, true));
@@ -1694,7 +1813,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// take a noticeable delay to update them which may feel uneasy.
}
if (showingAddToDictionaryHint) {
- mCandidateView.showAddToDictionaryHint(suggestion);
+ if (mIsUserDictionaryAvaliable) {
+ mCandidateView.showAddToDictionaryHint(suggestion);
+ } else {
+ mHandler.postUpdateSuggestions();
+ }
}
if (ic != null) {
ic.endBatchEdit();
@@ -1705,10 +1828,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
* Commits the chosen word to the text field and saves it for later retrieval.
*/
private void commitBestWord(CharSequence bestWord) {
- KeyboardSwitcher switcher = mKeyboardSwitcher;
+ final KeyboardSwitcher switcher = mKeyboardSwitcher;
if (!switcher.isKeyboardAvailable())
return;
- InputConnection ic = getCurrentInputConnection();
+ final InputConnection ic = getCurrentInputConnection();
if (ic != null) {
mVoiceProxy.rememberReplacedWord(bestWord, mSettingsValues.mWordSeparators);
SuggestedWords suggestedWords = mCandidateView.getSuggestions();
@@ -1733,7 +1856,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
final CharSequence prevWord = EditingUtils.getThisWord(getCurrentInputConnection(),
mSettingsValues.mWordSeparators);
SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
- mKeyboardSwitcher.getKeyboardView(), sEmptyWordComposer, prevWord);
+ mKeyboardSwitcher.getKeyboardView(), sEmptyWordComposer, prevWord,
+ mKeyboardSwitcher.getLatinKeyboard().getProximityInfo());
if (builder.size() > 0) {
// Explicitly supply an empty typed word (the no-second-arg version of
@@ -1788,16 +1912,19 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// We don't want to register as bigrams words separated by a separator.
// For example "I will, and you too" : we don't want the pair ("will" "and") to be
// a bigram.
- CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
- mSettingsValues.mWordSeparators);
- if (!TextUtils.isEmpty(prevWord)) {
- mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString());
+ final InputConnection ic = getCurrentInputConnection();
+ if (null != ic) {
+ final CharSequence prevWord =
+ EditingUtils.getPreviousWord(ic, mSettingsValues.mWordSeparators);
+ if (!TextUtils.isEmpty(prevWord)) {
+ mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString());
+ }
}
}
}
public boolean isCursorTouchingWord() {
- InputConnection ic = getCurrentInputConnection();
+ final InputConnection ic = getCurrentInputConnection();
if (ic == null) return false;
CharSequence toLeft = ic.getTextBeforeCursor(1, 0);
CharSequence toRight = ic.getTextAfterCursor(1, 0);
@@ -1814,36 +1941,34 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
return false;
}
- private boolean sameAsTextBeforeCursor(InputConnection ic, CharSequence text) {
+ // "ic" must not null
+ private boolean sameAsTextBeforeCursor(final InputConnection ic, CharSequence text) {
CharSequence beforeText = ic.getTextBeforeCursor(text.length(), 0);
return TextUtils.equals(text, beforeText);
}
- private void revertLastWord(boolean deleteChar) {
+ // "ic" must not null
+ private void revertLastWord(final InputConnection ic) {
if (mHasUncommittedTypedChars || mComposingStringBuilder.length() <= 0) {
sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL);
return;
}
- final InputConnection ic = getCurrentInputConnection();
- final CharSequence punctuation = ic.getTextBeforeCursor(1, 0);
- if (deleteChar) ic.deleteSurroundingText(1, 0);
+ final CharSequence separator = ic.getTextBeforeCursor(1, 0);
+ ic.deleteSurroundingText(1, 0);
final CharSequence textToTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0);
- final int toDeleteLength = (!TextUtils.isEmpty(textToTheLeft)
- && mSettingsValues.isWordSeparator(textToTheLeft.charAt(0)))
- ? mCommittedLength - 1 : mCommittedLength;
- ic.deleteSurroundingText(toDeleteLength, 0);
-
- // Re-insert punctuation only when the deleted character was word separator and the
- // composing text wasn't equal to the auto-corrected text.
- if (deleteChar
- && !TextUtils.isEmpty(punctuation)
- && mSettingsValues.isWordSeparator(punctuation.charAt(0))
+ ic.deleteSurroundingText(mCommittedLength, 0);
+
+ // Re-insert "separator" only when the deleted character was word separator and the
+ // composing text wasn't equal to the auto-corrected text which can be found before
+ // the cursor.
+ if (!TextUtils.isEmpty(separator)
+ && mSettingsValues.isWordSeparator(separator.charAt(0))
&& !TextUtils.equals(mComposingStringBuilder, textToTheLeft)) {
ic.commitText(mComposingStringBuilder, 1);
TextEntryState.acceptedTyped(mComposingStringBuilder);
- ic.commitText(punctuation, 1);
- TextEntryState.typedCharacter(punctuation.charAt(0), true,
+ ic.commitText(separator, 1);
+ TextEntryState.typedCharacter(separator.charAt(0), true,
WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
// Clear composing text
mComposingStringBuilder.setLength(0);
@@ -1856,9 +1981,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mHandler.postUpdateSuggestions();
}
- private boolean revertDoubleSpace() {
+ // "ic" must not null
+ private boolean revertDoubleSpace(final InputConnection ic) {
mHandler.cancelDoubleSpacesTimer();
- final InputConnection ic = getCurrentInputConnection();
// Here we test whether we indeed have a period and a space before us. This should not
// be needed, but it's there just in case something went wrong.
final CharSequence textBeforeCursor = ic.getTextBeforeCursor(2, 0);
@@ -1894,32 +2019,19 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
setInputView(mKeyboardSwitcher.onCreateInputView());
}
// Reload keyboard because the current language has been changed.
- mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(),
- mSubtypeSwitcher.isShortcutImeEnabled() && mVoiceProxy.isVoiceButtonEnabled(),
- mVoiceProxy.isVoiceButtonOnPrimary());
+ mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(), mSettingsValues);
initSuggest();
loadSettings();
- mKeyboardSwitcher.updateShiftState();
- }
-
- // "reset" and "next" are used only for USE_SPACEBAR_LANGUAGE_SWITCHER.
- private void toggleLanguage(boolean next) {
- if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()) {
- mSubtypeSwitcher.toggleLanguage(next);
- }
- // The following is necessary because on API levels < 10, we don't get notified when
- // subtype changes.
- if (!CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED)
- onRefreshKeyboard();
}
@Override
public void onPress(int primaryCode, boolean withSliding) {
- if (mKeyboardSwitcher.isVibrateAndSoundFeedbackRequired()) {
+ final KeyboardSwitcher switcher = mKeyboardSwitcher;
+ switcher.registerWindowWidth();
+ if (switcher.isVibrateAndSoundFeedbackRequired()) {
vibrate();
playKeyClick(primaryCode);
}
- KeyboardSwitcher switcher = mKeyboardSwitcher;
final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) {
switcher.onPressShift(withSliding);
@@ -2015,9 +2127,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private void updateCorrectionMode() {
// TODO: cleanup messy flags
- mHasDictionary = mSuggest != null ? mSuggest.hasMainDictionary() : false;
- final boolean shouldAutoCorrect = (mSettingsValues.mAutoCorrectEnabled
- || mSettingsValues.mQuickFixes) && !mInputTypeNoAutoCorrect && mHasDictionary;
+ final boolean shouldAutoCorrect = mSettingsValues.mAutoCorrectEnabled
+ && !mInputTypeNoAutoCorrect;
mCorrectionMode = (shouldAutoCorrect && mSettingsValues.mAutoCorrectEnabled)
? Suggest.CORRECTION_FULL
: (shouldAutoCorrect ? Suggest.CORRECTION_BASIC : Suggest.CORRECTION_NONE);
@@ -2031,7 +2142,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private void updateAutoTextEnabled() {
if (mSuggest == null) return;
- mSuggest.setQuickFixesEnabled(mSettingsValues.mQuickFixes
+ // We want to use autotext if the settings are asking for auto corrections, and if
+ // the input language is the same as the system language (because autotext will only
+ // work in the system language so if we are entering text in a different language we
+ // do not want it on).
+ // We used to look at the "quick fixes" option instead of mAutoCorrectEnabled, but
+ // this option was redundant and confusing and therefore removed.
+ mSuggest.setQuickFixesEnabled(mSettingsValues.mAutoCorrectEnabled
&& SubtypeSwitcher.getInstance().isSystemLanguageSameAsInputLanguage());
}
@@ -2048,14 +2165,14 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
protected void launchSettings() {
- launchSettings(Settings.class);
+ launchSettingsClass(Settings.class);
}
public void launchDebugSettings() {
- launchSettings(DebugSettings.class);
+ launchSettingsClass(DebugSettings.class);
}
- protected void launchSettings(Class<? extends PreferenceActivity> settingsClass) {
+ protected void launchSettingsClass(Class<? extends PreferenceActivity> settingsClass) {
handleClose();
Intent intent = new Intent();
intent.setClass(LatinIME.this, settingsClass);
@@ -2088,7 +2205,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
}
};
- showOptionsMenuInternal(title, items, listener);
+ final AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ .setItems(items, listener)
+ .setTitle(title);
+ showOptionDialogInternal(builder.create());
}
private void showOptionsMenu() {
@@ -2111,28 +2231,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
}
};
- showOptionsMenuInternal(title, items, listener);
- }
-
- private void showOptionsMenuInternal(CharSequence title, CharSequence[] items,
- DialogInterface.OnClickListener listener) {
- final IBinder windowToken = mKeyboardSwitcher.getKeyboardView().getWindowToken();
- if (windowToken == null) return;
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setCancelable(true);
- builder.setIcon(R.drawable.ic_dialog_keyboard);
- builder.setNegativeButton(android.R.string.cancel, null);
- builder.setItems(items, listener);
- builder.setTitle(title);
- mOptionsDialog = builder.create();
- mOptionsDialog.setCanceledOnTouchOutside(true);
- Window window = mOptionsDialog.getWindow();
- WindowManager.LayoutParams lp = window.getAttributes();
- lp.token = windowToken;
- lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
- window.setAttributes(lp);
- window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
- mOptionsDialog.show();
+ final AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ .setItems(items, listener)
+ .setTitle(title);
+ showOptionDialogInternal(builder.create());
}
@Override
diff --git a/java/src/com/android/inputmethod/latin/PrivateBinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/PrivateBinaryDictionaryGetter.java
deleted file mode 100644
index eb740e111..000000000
--- a/java/src/com/android/inputmethod/latin/PrivateBinaryDictionaryGetter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.Context;
-
-import java.util.List;
-import java.util.Locale;
-
-class PrivateBinaryDictionaryGetter {
- private PrivateBinaryDictionaryGetter() {}
- public static List<AssetFileAddress> getDictionaryFiles(Locale locale, Context context) {
- return null;
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java
index 33e9bc35f..4c2627be3 100644
--- a/java/src/com/android/inputmethod/latin/Settings.java
+++ b/java/src/com/android/inputmethod/latin/Settings.java
@@ -16,13 +16,6 @@
package com.android.inputmethod.latin;
-import com.android.inputmethod.compat.CompatUtils;
-import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
-import com.android.inputmethod.compat.InputMethodServiceCompatWrapper;
-import com.android.inputmethod.deprecated.VoiceProxy;
-import com.android.inputmethod.compat.VibratorCompatWrapper;
-import com.android.inputmethodcommon.InputMethodSettingsActivity;
-
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -40,12 +33,20 @@ import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
-import android.speech.SpeechRecognizer;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.Log;
+import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
+import com.android.inputmethod.compat.CompatUtils;
+import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
+import com.android.inputmethod.compat.InputMethodServiceCompatWrapper;
+import com.android.inputmethod.compat.InputTypeCompatUtils;
+import com.android.inputmethod.compat.VibratorCompatWrapper;
+import com.android.inputmethod.deprecated.VoiceProxy;
+import com.android.inputmethodcommon.InputMethodSettingsActivity;
+
import java.util.Arrays;
import java.util.Locale;
@@ -60,7 +61,7 @@ public class Settings extends InputMethodSettingsActivity
public static final String PREF_KEY_PREVIEW_POPUP_ON = "popup_on";
public static final String PREF_RECORRECTION_ENABLED = "recorrection_enabled";
public static final String PREF_AUTO_CAP = "auto_cap";
- public static final String PREF_SETTINGS_KEY = "settings_key";
+ public static final String PREF_SHOW_SETTINGS_KEY = "show_settings_key";
public static final String PREF_VOICE_SETTINGS_KEY = "voice_mode";
public static final String PREF_INPUT_LANGUAGE = "input_language";
public static final String PREF_SELECTED_LANGUAGES = "selected_languages";
@@ -68,7 +69,6 @@ public class Settings extends InputMethodSettingsActivity
public static final String PREF_CONFIGURE_DICTIONARIES_KEY = "configure_dictionaries_key";
public static final String PREF_CORRECTION_SETTINGS_KEY = "correction_settings";
- public static final String PREF_QUICK_FIXES = "quick_fixes";
public static final String PREF_SHOW_SUGGESTIONS_SETTING = "show_suggestions_setting";
public static final String PREF_AUTO_CORRECTION_THRESHOLD = "auto_correction_threshold";
public static final String PREF_DEBUG_SETTINGS = "debug_settings";
@@ -103,6 +103,7 @@ public class Settings extends InputMethodSettingsActivity
public final String mMagicSpaceSwappers;
public final String mSuggestPuncs;
public final SuggestedWords mSuggestPuncList;
+ private final String mSymbolsExcludedFromWordSeparators;
// From preferences:
public final boolean mSoundOn; // Sound setting private to Latin IME (see mSilentModeOn)
@@ -110,7 +111,6 @@ public class Settings extends InputMethodSettingsActivity
public final boolean mKeyPreviewPopupOn;
public final int mKeyPreviewPopupDismissDelay;
public final boolean mAutoCap;
- public final boolean mQuickFixes;
public final boolean mAutoCorrectEnabled;
public final double mAutoCorrectionThreshold;
// Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary
@@ -119,6 +119,10 @@ public class Settings extends InputMethodSettingsActivity
public final boolean mBigramPredictionEnabled;
public final boolean mUseContactsDict;
+ private final boolean mShowSettingsKey;
+ private final boolean mVoiceKeyEnabled;
+ private final boolean mVoiceKeyOnMain;
+
public Values(final SharedPreferences prefs, final Context context,
final String localeStr) {
final Resources res = context.getResources();
@@ -149,10 +153,13 @@ public class Settings extends InputMethodSettingsActivity
mMagicSpaceSwappers = res.getString(R.string.magic_space_swapping_symbols);
String wordSeparators = mMagicSpaceStrippers + mMagicSpaceSwappers
+ res.getString(R.string.magic_space_promoting_symbols);
- final String notWordSeparators = res.getString(R.string.non_word_separator_symbols);
- for (int i = notWordSeparators.length() - 1; i >= 0; --i) {
- wordSeparators = wordSeparators.replace(notWordSeparators.substring(i, i + 1), "");
+ final String symbolsExcludedFromWordSeparators =
+ res.getString(R.string.symbols_excluded_from_word_separators);
+ for (int i = symbolsExcludedFromWordSeparators.length() - 1; i >= 0; --i) {
+ wordSeparators = wordSeparators.replace(
+ symbolsExcludedFromWordSeparators.substring(i, i + 1), "");
}
+ mSymbolsExcludedFromWordSeparators = symbolsExcludedFromWordSeparators;
mWordSeparators = wordSeparators;
mSuggestPuncs = res.getString(R.string.suggested_punctuations);
// TODO: it would be nice not to recreate this each time we change the configuration
@@ -163,21 +170,25 @@ public class Settings extends InputMethodSettingsActivity
mVibrateOn = hasVibrator && prefs.getBoolean(Settings.PREF_VIBRATE_ON, false);
mSoundOn = prefs.getBoolean(Settings.PREF_SOUND_ON,
res.getBoolean(R.bool.config_default_sound_enabled));
-
mKeyPreviewPopupOn = isKeyPreviewPopupEnabled(prefs, res);
mKeyPreviewPopupDismissDelay = getKeyPreviewPopupDismissDelay(prefs, res);
mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, true);
- mQuickFixes = isQuickFixesEnabled(prefs, res);
-
mAutoCorrectEnabled = isAutoCorrectEnabled(prefs, res);
mBigramSuggestionEnabled = mAutoCorrectEnabled
&& isBigramSuggestionEnabled(prefs, res, mAutoCorrectEnabled);
mBigramPredictionEnabled = mBigramSuggestionEnabled
&& isBigramPredictionEnabled(prefs, res);
-
mAutoCorrectionThreshold = getAutoCorrectionThreshold(prefs, res);
-
mUseContactsDict = prefs.getBoolean(Settings.PREF_KEY_USE_CONTACTS_DICT, true);
+ final boolean defaultShowSettingsKey = res.getBoolean(
+ R.bool.config_default_show_settings_key);
+ mShowSettingsKey = prefs.getBoolean(Settings.PREF_SHOW_SETTINGS_KEY,
+ defaultShowSettingsKey);
+ final String voiceModeMain = res.getString(R.string.voice_mode_main);
+ final String voiceModeOff = res.getString(R.string.voice_mode_off);
+ final String voiceMode = prefs.getString(PREF_VOICE_SETTINGS_KEY, voiceModeMain);
+ mVoiceKeyEnabled = voiceMode != null && !voiceMode.equals(voiceModeOff);
+ mVoiceKeyOnMain = voiceMode != null && voiceMode.equals(voiceModeMain);
Utils.setSystemLocale(res, savedLocale);
}
@@ -190,6 +201,10 @@ public class Settings extends InputMethodSettingsActivity
return mWordSeparators.contains(String.valueOf((char)code));
}
+ public boolean isSymbolExcludedFromWordSeparators(int code) {
+ return mSymbolsExcludedFromWordSeparators.contains(String.valueOf((char)code));
+ }
+
public boolean isMagicSpaceStripper(int code) {
return mMagicSpaceStrippers.contains(String.valueOf((char)code));
}
@@ -198,17 +213,6 @@ public class Settings extends InputMethodSettingsActivity
return mMagicSpaceSwappers.contains(String.valueOf((char)code));
}
- // Helper methods
- private static boolean isQuickFixesEnabled(SharedPreferences sp, Resources resources) {
- final boolean showQuickFixesOption = resources.getBoolean(
- R.bool.config_enable_quick_fixes_option);
- if (!showQuickFixesOption) {
- return isAutoCorrectEnabled(sp, resources);
- }
- return sp.getBoolean(Settings.PREF_QUICK_FIXES, resources.getBoolean(
- R.bool.config_default_quick_fixes));
- }
-
private static boolean isAutoCorrectEnabled(SharedPreferences sp, Resources resources) {
final String currentAutoCorrectionSetting = sp.getString(
Settings.PREF_AUTO_CORRECTION_THRESHOLD,
@@ -287,13 +291,28 @@ public class Settings extends InputMethodSettingsActivity
}
return builder.setIsPunctuationSuggestions().build();
}
+
+ public boolean isSettingsKeyEnabled(EditorInfo attribute) {
+ return mShowSettingsKey;
+ }
+
+ public boolean isVoiceKeyEnabled(EditorInfo attribute) {
+ final boolean shortcutImeEnabled = SubtypeSwitcher.getInstance().isShortcutImeEnabled();
+ final int inputType = (attribute != null) ? attribute.inputType : 0;
+ return shortcutImeEnabled && mVoiceKeyEnabled
+ && !InputTypeCompatUtils.isPasswordInputType(inputType);
+ }
+
+ public boolean isVoiceKeyOnMain() {
+ return mVoiceKeyOnMain;
+ }
}
private PreferenceScreen mInputLanguageSelection;
private ListPreference mVoicePreference;
- private ListPreference mSettingsKeyPreference;
+ private CheckBoxPreference mShowSettingsKeyPreference;
private ListPreference mShowCorrectionSuggestionsPreference;
- private ListPreference mAutoCorrectionThreshold;
+ private ListPreference mAutoCorrectionThresholdPreference;
private ListPreference mKeyPreviewPopupDismissDelay;
// Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary
private CheckBoxPreference mBigramSuggestion;
@@ -304,15 +323,13 @@ public class Settings extends InputMethodSettingsActivity
private AlertDialog mDialog;
- private VoiceProxy.VoiceLoggerWrapper mVoiceLogger;
-
private boolean mOkClicked = false;
private String mVoiceModeOff;
private void ensureConsistencyOfAutoCorrectionSettings() {
final String autoCorrectionOff = getResources().getString(
R.string.auto_correction_threshold_mode_index_off);
- final String currentSetting = mAutoCorrectionThreshold.getValue();
+ final String currentSetting = mAutoCorrectionThresholdPreference.getValue();
mBigramSuggestion.setEnabled(!currentSetting.equals(autoCorrectionOff));
mBigramPrediction.setEnabled(!currentSetting.equals(autoCorrectionOff));
}
@@ -340,7 +357,7 @@ public class Settings extends InputMethodSettingsActivity
mInputLanguageSelection = (PreferenceScreen) findPreference(PREF_SUBTYPES);
mInputLanguageSelection.setOnPreferenceClickListener(this);
mVoicePreference = (ListPreference) findPreference(PREF_VOICE_SETTINGS_KEY);
- mSettingsKeyPreference = (ListPreference) findPreference(PREF_SETTINGS_KEY);
+ mShowSettingsKeyPreference = (CheckBoxPreference) findPreference(PREF_SHOW_SETTINGS_KEY);
mShowCorrectionSuggestionsPreference =
(ListPreference) findPreference(PREF_SHOW_SUGGESTIONS_SETTING);
SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
@@ -349,9 +366,9 @@ public class Settings extends InputMethodSettingsActivity
mVoiceModeOff = getString(R.string.voice_mode_off);
mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff)
.equals(mVoiceModeOff));
- mVoiceLogger = VoiceProxy.VoiceLoggerWrapper.getInstance(context);
- mAutoCorrectionThreshold = (ListPreference) findPreference(PREF_AUTO_CORRECTION_THRESHOLD);
+ mAutoCorrectionThresholdPreference =
+ (ListPreference) findPreference(PREF_AUTO_CORRECTION_THRESHOLD);
mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTIONS);
mBigramPrediction = (CheckBoxPreference) findPreference(PREF_BIGRAM_PREDICTIONS);
mDebugSettingsPreference = findPreference(PREF_DEBUG_SETTINGS);
@@ -372,7 +389,7 @@ public class Settings extends InputMethodSettingsActivity
final boolean showSettingsKeyOption = res.getBoolean(
R.bool.config_enable_show_settings_key_option);
if (!showSettingsKeyOption) {
- generalSettings.removePreference(mSettingsKeyPreference);
+ generalSettings.removePreference(mShowSettingsKeyPreference);
}
final boolean showVoiceKeyOption = res.getBoolean(
@@ -401,12 +418,6 @@ public class Settings extends InputMethodSettingsActivity
generalSettings.removePreference(findPreference(PREF_RECORRECTION_ENABLED));
}
- final boolean showQuickFixesOption = res.getBoolean(
- R.bool.config_enable_quick_fixes_option);
- if (!showQuickFixesOption) {
- textCorrectionGroup.removePreference(findPreference(PREF_QUICK_FIXES));
- }
-
final boolean showBigramSuggestionsOption = res.getBoolean(
R.bool.config_enable_bigram_suggestions_option);
if (!showBigramSuggestionsOption) {
@@ -447,16 +458,18 @@ public class Settings extends InputMethodSettingsActivity
}
}
+ @SuppressWarnings("unused")
@Override
public void onResume() {
super.onResume();
- if (!VoiceProxy.VOICE_INSTALLED
- || !SpeechRecognizer.isRecognitionAvailable(getActivityInternal())) {
- getPreferenceScreen().removePreference(mVoicePreference);
- } else {
+ final boolean isShortcutImeEnabled = SubtypeSwitcher.getInstance().isShortcutImeEnabled();
+ if (isShortcutImeEnabled
+ || (VoiceProxy.VOICE_INSTALLED
+ && VoiceProxy.isRecognitionAvailable(getActivityInternal()))) {
updateVoiceModeSummary();
+ } else {
+ getPreferenceScreen().removePreference(mVoicePreference);
}
- updateSettingsKeySummary();
updateShowCorrectionSuggestionsSummary();
updateKeyPreviewPopupDelaySummary();
}
@@ -488,7 +501,6 @@ public class Settings extends InputMethodSettingsActivity
mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff)
.equals(mVoiceModeOff));
updateVoiceModeSummary();
- updateSettingsKeySummary();
updateShowCorrectionSuggestionsSummary();
updateKeyPreviewPopupDelaySummary();
}
@@ -498,7 +510,7 @@ public class Settings extends InputMethodSettingsActivity
if (pref == mInputLanguageSelection) {
startActivity(CompatUtils.getInputLanguageSelectionIntent(
Utils.getInputMethodId(
- InputMethodManagerCompatWrapper.getInstance(getActivityInternal()),
+ InputMethodManagerCompatWrapper.getInstance(),
getActivityInternal().getApplicationInfo().packageName), 0));
return true;
}
@@ -512,12 +524,6 @@ public class Settings extends InputMethodSettingsActivity
mShowCorrectionSuggestionsPreference.getValue())]);
}
- private void updateSettingsKeySummary() {
- mSettingsKeyPreference.setSummary(
- getResources().getStringArray(R.array.settings_key_modes)
- [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]);
- }
-
private void updateKeyPreviewPopupDelaySummary() {
final ListPreference lp = mKeyPreviewPopupDismissDelay;
lp.setSummary(lp.getEntries()[lp.findIndexOfValue(lp.getValue())]);
@@ -541,6 +547,7 @@ public class Settings extends InputMethodSettingsActivity
[mVoicePreference.findIndexOfValue(mVoicePreference.getValue())]);
}
+ @Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case VOICE_INPUT_CONFIRM_DIALOG:
@@ -549,12 +556,9 @@ public class Settings extends InputMethodSettingsActivity
public void onClick(DialogInterface dialog, int whichButton) {
if (whichButton == DialogInterface.BUTTON_NEGATIVE) {
mVoicePreference.setValue(mVoiceModeOff);
- mVoiceLogger.settingsWarningDialogCancel();
} else if (whichButton == DialogInterface.BUTTON_POSITIVE) {
mOkClicked = true;
- mVoiceLogger.settingsWarningDialogOk();
}
- updateVoicePreference();
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(getActivityInternal())
@@ -583,7 +587,6 @@ public class Settings extends InputMethodSettingsActivity
AlertDialog dialog = builder.create();
mDialog = dialog;
dialog.setOnDismissListener(this);
- mVoiceLogger.settingsWarningDialogShown();
return dialog;
default:
Log.e(TAG, "unknown dialog " + id);
@@ -593,16 +596,10 @@ public class Settings extends InputMethodSettingsActivity
@Override
public void onDismiss(DialogInterface dialog) {
- mVoiceLogger.settingsWarningDialogDismissed();
if (!mOkClicked) {
// This assumes that onPreferenceClick gets called first, and this if the user
// agreed after the warning, we set the mOkClicked value to true.
mVoicePreference.setValue(mVoiceModeOff);
}
}
-
- private void updateVoicePreference() {
- boolean isChecked = !mVoicePreference.getValue().equals(mVoiceModeOff);
- mVoiceLogger.voiceInputSettingEnabled(isChecked);
- }
}
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index 8fc19ae87..0a391a77e 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -16,16 +16,8 @@
package com.android.inputmethod.latin;
-import com.android.inputmethod.compat.InputMethodInfoCompatWrapper;
-import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
-import com.android.inputmethod.compat.InputMethodSubtypeCompatWrapper;
-import com.android.inputmethod.deprecated.VoiceProxy;
-import com.android.inputmethod.keyboard.KeyboardSwitcher;
-import com.android.inputmethod.keyboard.LatinKeyboard;
-
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -37,6 +29,13 @@ import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
+import com.android.inputmethod.compat.InputMethodInfoCompatWrapper;
+import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
+import com.android.inputmethod.compat.InputMethodSubtypeCompatWrapper;
+import com.android.inputmethod.deprecated.VoiceProxy;
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.keyboard.LatinKeyboard;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -52,7 +51,6 @@ public class SubtypeSwitcher {
private static final String VOICE_MODE = "voice";
private static final String SUBTYPE_EXTRAVALUE_REQUIRE_NETWORK_CONNECTIVITY =
"requireNetworkConnectivity";
- public static final String USE_SPACEBAR_LANGUAGE_SWITCH_KEY = "use_spacebar_language_switch";
private final TextUtils.SimpleStringSplitter mLocaleSplitter =
new TextUtils.SimpleStringSplitter(LOCALE_SEPARATER);
@@ -62,13 +60,10 @@ public class SubtypeSwitcher {
private /* final */ InputMethodManagerCompatWrapper mImm;
private /* final */ Resources mResources;
private /* final */ ConnectivityManager mConnectivityManager;
- private /* final */ boolean mConfigUseSpacebarLanguageSwitcher;
- private /* final */ SharedPreferences mPrefs;
private final ArrayList<InputMethodSubtypeCompatWrapper>
mEnabledKeyboardSubtypesOfCurrentInputMethod =
new ArrayList<InputMethodSubtypeCompatWrapper>();
private final ArrayList<String> mEnabledLanguagesOfCurrentInputMethod = new ArrayList<String>();
- private final LanguageBarInfo mLanguageBarInfo = new LanguageBarInfo();
/*-----------------------------------------------------------*/
// Variants which should be changed only by reload functions.
@@ -81,7 +76,6 @@ public class SubtypeSwitcher {
private Locale mSystemLocale;
private Locale mInputLocale;
private String mInputLocaleStr;
- private String mInputMethodId;
private VoiceProxy.VoiceInputWrapper mVoiceInputWrapper;
/*-----------------------------------------------------------*/
@@ -91,9 +85,9 @@ public class SubtypeSwitcher {
return sInstance;
}
- public static void init(LatinIME service, SharedPreferences prefs) {
+ public static void init(LatinIME service) {
SubtypeLocale.init(service);
- sInstance.initialize(service, prefs);
+ sInstance.initialize(service);
sInstance.updateAllParameters();
}
@@ -101,10 +95,10 @@ public class SubtypeSwitcher {
// Intentional empty constructor for singleton.
}
- private void initialize(LatinIME service, SharedPreferences prefs) {
+ private void initialize(LatinIME service) {
mService = service;
mResources = service.getResources();
- mImm = InputMethodManagerCompatWrapper.getInstance(service);
+ mImm = InputMethodManagerCompatWrapper.getInstance();
mConnectivityManager = (ConnectivityManager) service.getSystemService(
Context.CONNECTIVITY_SERVICE);
mEnabledKeyboardSubtypesOfCurrentInputMethod.clear();
@@ -115,11 +109,9 @@ public class SubtypeSwitcher {
mCurrentSubtype = null;
mAllEnabledSubtypesOfCurrentInputMethod = null;
mVoiceInputWrapper = null;
- mPrefs = prefs;
final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
mIsNetworkConnected = (info != null && info.isConnected());
- mInputMethodId = Utils.getInputMethodId(mImm, service.getPackageName());
}
// Update all parameters stored in SubtypeSwitcher.
@@ -133,9 +125,6 @@ public class SubtypeSwitcher {
// Update parameters which are changed outside LatinIME. This parameters affect UI so they
// should be updated every time onStartInputview.
public void updateParametersOnStartInputView() {
- mConfigUseSpacebarLanguageSwitcher = mPrefs.getBoolean(USE_SPACEBAR_LANGUAGE_SWITCH_KEY,
- mService.getResources().getBoolean(
- R.bool.config_use_spacebar_language_switcher));
updateEnabledSubtypes();
updateShortcutIME();
}
@@ -170,10 +159,6 @@ public class SubtypeSwitcher {
Log.w(TAG, "Last subtype was disabled. Update to the current one.");
}
updateSubtype(mImm.getCurrentInputMethodSubtype());
- } else {
- // mLanguageBarInfo.update() will be called in updateSubtype so there is no need
- // to call this in the if-clause above.
- mLanguageBarInfo.update();
}
}
@@ -273,7 +258,6 @@ public class SubtypeSwitcher {
mVoiceInputWrapper.reset();
}
}
- mLanguageBarInfo.update();
}
// Update the current input locale from Locale string.
@@ -334,7 +318,7 @@ public class SubtypeSwitcher {
// when the API level is 10 or previous.
mService.notifyOnCurrentInputMethodSubtypeChanged(subtype);
}
- }.execute();
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public Drawable getShortcutIcon() {
@@ -377,13 +361,17 @@ public class SubtypeSwitcher {
}
public boolean isShortcutImeEnabled() {
- if (mShortcutInputMethodInfo == null)
+ if (mShortcutInputMethodInfo == null) {
return false;
- if (mShortcutSubtype == null)
+ }
+ if (mShortcutSubtype == null) {
return true;
+ }
// For compatibility, if the shortcut subtype is dummy, we assume the shortcut IME
// (built-in voice dummy subtype) is available.
- if (!mShortcutSubtype.hasOriginalObject()) return true;
+ if (!mShortcutSubtype.hasOriginalObject()) {
+ return true;
+ }
final boolean allowsImplicitlySelectedSubtypes = true;
for (final InputMethodSubtypeCompatWrapper enabledSubtype :
mImm.getEnabledInputMethodSubtypeList(
@@ -427,10 +415,6 @@ public class SubtypeSwitcher {
return mEnabledKeyboardSubtypesOfCurrentInputMethod.size();
}
- public boolean useSpacebarLanguageSwitcher() {
- return mConfigUseSpacebarLanguageSwitcher;
- }
-
public boolean needsToDisplayLanguage() {
return mNeedsToDisplayLanguage;
}
@@ -508,75 +492,6 @@ public class SubtypeSwitcher {
KeyboardSwitcher.getInstance().getKeyboardView().getWindowToken());
}
- //////////////////////////////////////
- // Spacebar Language Switch support //
- //////////////////////////////////////
-
- private class LanguageBarInfo {
- private int mCurrentKeyboardSubtypeIndex;
- private InputMethodSubtypeCompatWrapper mNextKeyboardSubtype;
- private InputMethodSubtypeCompatWrapper mPreviousKeyboardSubtype;
- private String mNextLanguage;
- private String mPreviousLanguage;
- public LanguageBarInfo() {
- update();
- }
-
- private String getNextLanguage() {
- return mNextLanguage;
- }
-
- private String getPreviousLanguage() {
- return mPreviousLanguage;
- }
-
- public InputMethodSubtypeCompatWrapper getNextKeyboardSubtype() {
- return mNextKeyboardSubtype;
- }
-
- public InputMethodSubtypeCompatWrapper getPreviousKeyboardSubtype() {
- return mPreviousKeyboardSubtype;
- }
-
- public void update() {
- if (!mConfigUseSpacebarLanguageSwitcher
- || mEnabledKeyboardSubtypesOfCurrentInputMethod == null
- || mEnabledKeyboardSubtypesOfCurrentInputMethod.size() == 0) return;
- mCurrentKeyboardSubtypeIndex = getCurrentIndex();
- mNextKeyboardSubtype = getNextKeyboardSubtypeInternal(mCurrentKeyboardSubtypeIndex);
- Locale locale = Utils.constructLocaleFromString(mNextKeyboardSubtype.getLocale());
- mNextLanguage = getFullDisplayName(locale, true);
- mPreviousKeyboardSubtype = getPreviousKeyboardSubtypeInternal(
- mCurrentKeyboardSubtypeIndex);
- locale = Utils.constructLocaleFromString(mPreviousKeyboardSubtype.getLocale());
- mPreviousLanguage = getFullDisplayName(locale, true);
- }
-
- private int normalize(int index) {
- final int N = mEnabledKeyboardSubtypesOfCurrentInputMethod.size();
- final int ret = index % N;
- return ret < 0 ? ret + N : ret;
- }
-
- private int getCurrentIndex() {
- final int N = mEnabledKeyboardSubtypesOfCurrentInputMethod.size();
- for (int i = 0; i < N; ++i) {
- if (mEnabledKeyboardSubtypesOfCurrentInputMethod.get(i).equals(mCurrentSubtype)) {
- return i;
- }
- }
- return 0;
- }
-
- private InputMethodSubtypeCompatWrapper getNextKeyboardSubtypeInternal(int index) {
- return mEnabledKeyboardSubtypesOfCurrentInputMethod.get(normalize(index + 1));
- }
-
- private InputMethodSubtypeCompatWrapper getPreviousKeyboardSubtypeInternal(int index) {
- return mEnabledKeyboardSubtypesOfCurrentInputMethod.get(normalize(index - 1));
- }
- }
-
public static String getFullDisplayName(Locale locale, boolean returnsNameInThisLocale) {
if (returnsNameInThisLocale) {
return toTitleCase(SubtypeLocale.getFullDisplayName(locale), locale);
@@ -609,14 +524,6 @@ public class SubtypeSwitcher {
return getDisplayLanguage(getInputLocale());
}
- public String getNextInputLanguageName() {
- return mLanguageBarInfo.getNextLanguage();
- }
-
- public String getPreviousInputLanguageName() {
- return mLanguageBarInfo.getPreviousLanguage();
- }
-
/////////////////////////////
// Other utility functions //
/////////////////////////////
@@ -653,24 +560,4 @@ public class SubtypeSwitcher {
supportedLocalesString.split("\\s+"));
return voiceInputSupportedLocales.contains(locale);
}
-
- private void changeToNextSubtype() {
- final InputMethodSubtypeCompatWrapper subtype =
- mLanguageBarInfo.getNextKeyboardSubtype();
- switchToTargetIME(mInputMethodId, subtype);
- }
-
- private void changeToPreviousSubtype() {
- final InputMethodSubtypeCompatWrapper subtype =
- mLanguageBarInfo.getPreviousKeyboardSubtype();
- switchToTargetIME(mInputMethodId, subtype);
- }
-
- public void toggleLanguage(boolean next) {
- if (next) {
- changeToNextSubtype();
- } else {
- changeToPreviousSubtype();
- }
- }
}
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 8ae653f2f..a2d66f398 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -22,6 +22,8 @@ import android.text.TextUtils;
import android.util.Log;
import android.view.View;
+import com.android.inputmethod.keyboard.ProximityInfo;
+
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
@@ -86,6 +88,7 @@ public class Suggest implements Dictionary.WordCallback {
private AutoCorrection mAutoCorrection;
private Dictionary mMainDict;
+ private ContactsDictionary mContactsDict;
private WhitelistDictionary mWhiteListDictionary;
private final Map<String, Dictionary> mUnigramDictionaries = new HashMap<String, Dictionary>();
private final Map<String, Dictionary> mBigramDictionaries = new HashMap<String, Dictionary>();
@@ -102,6 +105,8 @@ public class Suggest implements Dictionary.WordCallback {
private ArrayList<CharSequence> mSuggestions = new ArrayList<CharSequence>();
ArrayList<CharSequence> mBigramSuggestions = new ArrayList<CharSequence>();
+ // TODO: maybe this should be synchronized, it's quite scary as it is.
+ // TODO: if it becomes synchronized, also move initPool in the thread in initAsynchronously
private ArrayList<CharSequence> mStringPool = new ArrayList<CharSequence>();
private CharSequence mTypedWord;
@@ -111,27 +116,39 @@ public class Suggest implements Dictionary.WordCallback {
private int mCorrectionMode = CORRECTION_BASIC;
- public Suggest(Context context, int dictionaryResId, Locale locale) {
- init(context, DictionaryFactory.createDictionaryFromManager(context, locale,
- dictionaryResId));
+ public Suggest(final Context context, final int dictionaryResId, final Locale locale) {
+ initAsynchronously(context, dictionaryResId, locale);
}
/* package for test */ Suggest(Context context, File dictionary, long startOffset, long length,
Flag[] flagArray) {
- init(null, DictionaryFactory.createDictionaryForTest(context, dictionary, startOffset,
- length, flagArray));
+ initSynchronously(null, DictionaryFactory.createDictionaryForTest(context, dictionary,
+ startOffset, length, flagArray));
}
- private void init(Context context, Dictionary mainDict) {
- mMainDict = mainDict;
- addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, mainDict);
- addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, mainDict);
+ private void initWhitelistAndAutocorrectAndPool(final Context context) {
mWhiteListDictionary = WhitelistDictionary.init(context);
addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_WHITELIST, mWhiteListDictionary);
mAutoCorrection = new AutoCorrection();
initPool();
}
+ private void initAsynchronously(final Context context, final int dictionaryResId,
+ final Locale locale) {
+ resetMainDict(context, dictionaryResId, locale);
+
+ // TODO: read the whitelist and init the pool asynchronously too.
+ // initPool should be done asynchronously but the pool is not thread-safe at the moment.
+ initWhitelistAndAutocorrectAndPool(context);
+ }
+
+ private void initSynchronously(Context context, Dictionary mainDict) {
+ mMainDict = mainDict;
+ addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, mainDict);
+ addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, mainDict);
+ initWhitelistAndAutocorrectAndPool(context);
+ }
+
private void addOrReplaceDictionary(Map<String, Dictionary> dictionaries, String key,
Dictionary dict) {
final Dictionary oldDict = (dict == null)
@@ -142,12 +159,18 @@ public class Suggest implements Dictionary.WordCallback {
}
}
- public void resetMainDict(Context context, int dictionaryResId, Locale locale) {
- final Dictionary newMainDict = DictionaryFactory.createDictionaryFromManager(
- context, locale, dictionaryResId);
- mMainDict = newMainDict;
- addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, newMainDict);
- addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, newMainDict);
+ public void resetMainDict(final Context context, final int dictionaryResId,
+ final Locale locale) {
+ mMainDict = null;
+ new Thread("InitializeBinaryDictionary") {
+ public void run() {
+ final Dictionary newMainDict = DictionaryFactory.createDictionaryFromManager(
+ context, locale, dictionaryResId);
+ mMainDict = newMainDict;
+ addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, newMainDict);
+ addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, newMainDict);
+ }
+ }.start();
}
private void initPool() {
@@ -169,10 +192,16 @@ public class Suggest implements Dictionary.WordCallback {
mCorrectionMode = mode;
}
+ // The main dictionary could have been loaded asynchronously. Don't cache the return value
+ // of this method.
public boolean hasMainDictionary() {
return mMainDict != null;
}
+ public ContactsDictionary getContactsDictionary() {
+ return mContactsDict;
+ }
+
public Map<String, Dictionary> getUnigramDictionaries() {
return mUnigramDictionaries;
}
@@ -194,7 +223,8 @@ public class Suggest implements Dictionary.WordCallback {
* the contacts dictionary by passing null to this method. In this case no contacts dictionary
* won't be used.
*/
- public void setContactsDictionary(Dictionary contactsDictionary) {
+ public void setContactsDictionary(ContactsDictionary contactsDictionary) {
+ mContactsDict = contactsDictionary;
addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_CONTACTS, contactsDictionary);
addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_CONTACTS, contactsDictionary);
}
@@ -243,9 +273,10 @@ public class Suggest implements Dictionary.WordCallback {
* @param prevWordForBigram previous word (used only for bigram)
* @return suggested words object.
*/
- public SuggestedWords getSuggestions(View view, WordComposer wordComposer,
- CharSequence prevWordForBigram) {
- return getSuggestedWordBuilder(view, wordComposer, prevWordForBigram).build();
+ public SuggestedWords getSuggestions(final View view, final WordComposer wordComposer,
+ final CharSequence prevWordForBigram, final ProximityInfo proximityInfo) {
+ return getSuggestedWordBuilder(view, wordComposer, prevWordForBigram,
+ proximityInfo).build();
}
private CharSequence capitalizeWord(boolean all, boolean first, CharSequence word) {
@@ -279,8 +310,9 @@ public class Suggest implements Dictionary.WordCallback {
}
// TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder
- public SuggestedWords.Builder getSuggestedWordBuilder(View view, WordComposer wordComposer,
- CharSequence prevWordForBigram) {
+ public SuggestedWords.Builder getSuggestedWordBuilder(final View view,
+ final WordComposer wordComposer, CharSequence prevWordForBigram,
+ final ProximityInfo proximityInfo) {
LatinImeLogger.onStartSuggestion(prevWordForBigram);
mAutoCorrection.init();
mIsFirstCharCapitalized = wordComposer.isFirstCharCapitalized();
@@ -345,7 +377,7 @@ public class Suggest implements Dictionary.WordCallback {
if (key.equals(DICT_KEY_USER_UNIGRAM) || key.equals(DICT_KEY_WHITELIST))
continue;
final Dictionary dictionary = mUnigramDictionaries.get(key);
- dictionary.getWords(wordComposer, this);
+ dictionary.getWords(wordComposer, this, proximityInfo);
}
}
CharSequence autoText = null;
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index 84db17504..c1c46fa47 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -16,6 +16,7 @@
package com.android.inputmethod.latin;
+import android.text.TextUtils;
import android.view.inputmethod.CompletionInfo;
import java.util.ArrayList;
@@ -30,7 +31,7 @@ public class SuggestedWords {
public final boolean mTypedWordValid;
public final boolean mHasMinimalSuggestion;
public final boolean mIsPunctuationSuggestions;
- public final List<SuggestedWordInfo> mSuggestedWordInfoList;
+ private final List<SuggestedWordInfo> mSuggestedWordInfoList;
private SuggestedWords(List<CharSequence> words, boolean typedWordValid,
boolean hasMinimalSuggestion, boolean isPunctuationSuggestions,
@@ -54,6 +55,10 @@ public class SuggestedWords {
return mWords.get(pos);
}
+ public SuggestedWordInfo getInfo(int pos) {
+ return mSuggestedWordInfoList != null ? mSuggestedWordInfoList.get(pos) : null;
+ }
+
public boolean hasAutoCorrectionWord() {
return mHasMinimalSuggestion && size() > 1 && !mTypedWordValid;
}
@@ -105,14 +110,18 @@ public class SuggestedWords {
}
private Builder addWord(CharSequence word, SuggestedWordInfo suggestedWordInfo) {
- mWords.add(word);
- mSuggestedWordInfoList.add(suggestedWordInfo);
+ if (!TextUtils.isEmpty(word)) {
+ mWords.add(word);
+ // It's okay if suggestedWordInfo is null since it's checked where it's used.
+ mSuggestedWordInfoList.add(suggestedWordInfo);
+ }
return this;
}
public Builder setApplicationSpecifiedCompletions(CompletionInfo[] infos) {
- for (CompletionInfo info : infos)
- addWord(info.getText());
+ for (CompletionInfo info : infos) {
+ if (null != info) addWord(info.getText());
+ }
return this;
}
diff --git a/java/src/com/android/inputmethod/latin/UserDictionary.java b/java/src/com/android/inputmethod/latin/UserDictionary.java
index 2aaa26c8d..6608d8268 100644
--- a/java/src/com/android/inputmethod/latin/UserDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserDictionary.java
@@ -26,6 +26,8 @@ import android.net.Uri;
import android.os.RemoteException;
import android.provider.UserDictionary.Words;
+import com.android.inputmethod.keyboard.ProximityInfo;
+
public class UserDictionary extends ExpandableDictionary {
private static final String[] PROJECTION_QUERY = {
@@ -38,23 +40,24 @@ public class UserDictionary extends ExpandableDictionary {
Words.FREQUENCY,
Words.LOCALE,
};
-
+
private ContentObserver mObserver;
private String mLocale;
public UserDictionary(Context context, String locale) {
super(context, Suggest.DIC_USER);
mLocale = locale;
- // Perform a managed query. The Activity will handle closing and requerying the cursor
+ // Perform a managed query. The Activity will handle closing and re-querying the cursor
// when needed.
ContentResolver cres = context.getContentResolver();
-
- cres.registerContentObserver(Words.CONTENT_URI, true, mObserver = new ContentObserver(null) {
+
+ mObserver = new ContentObserver(null) {
@Override
public void onChange(boolean self) {
setRequiresReload(true);
}
- });
+ };
+ cres.registerContentObserver(Words.CONTENT_URI, true, mObserver);
loadDictionary();
}
@@ -76,6 +79,17 @@ public class UserDictionary extends ExpandableDictionary {
addWords(cursor);
}
+ public boolean isEnabled() {
+ final ContentResolver cr = getContext().getContentResolver();
+ final ContentProviderClient client = cr.acquireContentProviderClient(Words.CONTENT_URI);
+ if (client != null) {
+ client.release();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
/**
* Adds a word to the dictionary and makes it persistent.
* @param word the word to add. If the word is capitalized, then the dictionary will
@@ -138,8 +152,9 @@ public class UserDictionary extends ExpandableDictionary {
}
@Override
- public synchronized void getWords(final WordComposer codes, final WordCallback callback) {
- super.getWords(codes, callback);
+ public synchronized void getWords(final WordComposer codes, final WordCallback callback,
+ final ProximityInfo proximityInfo) {
+ super.getWords(codes, callback, proximityInfo);
}
@Override
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index 6bdc0a857..1a6260a4e 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -111,35 +111,43 @@ public class Utils {
}
}
- public static boolean hasMultipleEnabledIMEsOrSubtypes(InputMethodManagerCompatWrapper imm) {
+ public static boolean hasMultipleEnabledIMEsOrSubtypes(
+ final InputMethodManagerCompatWrapper imm,
+ final boolean shouldIncludeAuxiliarySubtypes) {
final List<InputMethodInfoCompatWrapper> enabledImis = imm.getEnabledInputMethodList();
- // Filters out IMEs that have auxiliary subtypes only (including either implicitly or
- // explicitly enabled ones).
- final ArrayList<InputMethodInfoCompatWrapper> filteredImis =
- new ArrayList<InputMethodInfoCompatWrapper>();
+ // Number of the filtered IMEs
+ int filteredImisCount = 0;
- outerloop:
for (InputMethodInfoCompatWrapper imi : enabledImis) {
// We can return true immediately after we find two or more filtered IMEs.
- if (filteredImis.size() > 1) return true;
+ if (filteredImisCount > 1) return true;
final List<InputMethodSubtypeCompatWrapper> subtypes =
imm.getEnabledInputMethodSubtypeList(imi, true);
- // IMEs that have no subtypes should be included.
+ // IMEs that have no subtypes should be counted.
if (subtypes.isEmpty()) {
- filteredImis.add(imi);
+ ++filteredImisCount;
continue;
}
- // IMEs that have one or more non-auxiliary subtypes should be included.
+
+ int auxCount = 0;
for (InputMethodSubtypeCompatWrapper subtype : subtypes) {
- if (!subtype.isAuxiliary()) {
- filteredImis.add(imi);
- continue outerloop;
+ if (subtype.isAuxiliary()) {
+ ++auxCount;
}
}
+ final int nonAuxCount = subtypes.size() - auxCount;
+
+ // IMEs that have one or more non-auxiliary subtypes should be counted.
+ // If shouldIncludeAuxiliarySubtypes is true, IMEs that have two or more auxiliary
+ // subtypes should be counted as well.
+ if (nonAuxCount > 0 || (shouldIncludeAuxiliarySubtypes && auxCount > 1)) {
+ ++filteredImisCount;
+ continue;
+ }
}
- return filteredImis.size() > 1
+ return filteredImisCount > 1
// imm.getEnabledInputMethodSubtypeList(null, false) will return the current IME's enabled
// input method subtype (The current IME should be LatinIME.)
|| imm.getEnabledInputMethodSubtypeList(null, false).size() > 1;
@@ -190,6 +198,18 @@ public class Utils {
}
}
+ public static boolean canBeFollowedByPeriod(final int codePoint) {
+ // TODO: Check again whether there really ain't a better way to check this.
+ // TODO: This should probably be language-dependant...
+ return Character.isLetterOrDigit(codePoint)
+ || codePoint == Keyboard.CODE_SINGLE_QUOTE
+ || codePoint == Keyboard.CODE_DOUBLE_QUOTE
+ || codePoint == Keyboard.CODE_CLOSING_PARENTHESIS
+ || codePoint == Keyboard.CODE_CLOSING_SQUARE_BRACKET
+ || codePoint == Keyboard.CODE_CLOSING_CURLY_BRACKET
+ || codePoint == Keyboard.CODE_CLOSING_ANGLE_BRACKET;
+ }
+
/* package */ static class RingCharBuffer {
private static RingCharBuffer sRingCharBuffer = new RingCharBuffer();
private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC';
@@ -546,11 +566,11 @@ public class Utils {
}
}
- public static int getKeyboardMode(EditorInfo attribute) {
- if (attribute == null)
+ public static int getKeyboardMode(EditorInfo editorInfo) {
+ if (editorInfo == null)
return KeyboardId.MODE_TEXT;
- final int inputType = attribute.inputType;
+ final int inputType = editorInfo.inputType;
final int variation = inputType & InputType.TYPE_MASK_VARIATION;
switch (inputType & InputType.TYPE_MASK_CLASS) {
@@ -587,11 +607,11 @@ public class Utils {
}
public static boolean inPrivateImeOptions(String packageName, String key,
- EditorInfo attribute) {
- if (attribute == null)
+ EditorInfo editorInfo) {
+ if (editorInfo == null)
return false;
return containsInCsv(packageName != null ? packageName + "." + key : key,
- attribute.privateImeOptions);
+ editorInfo.privateImeOptions);
}
/**
diff --git a/java/src/com/android/inputmethod/latin/WhitelistDictionary.java b/java/src/com/android/inputmethod/latin/WhitelistDictionary.java
index 4377373d2..639c96681 100644
--- a/java/src/com/android/inputmethod/latin/WhitelistDictionary.java
+++ b/java/src/com/android/inputmethod/latin/WhitelistDictionary.java
@@ -21,6 +21,8 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
+import com.android.inputmethod.keyboard.ProximityInfo;
+
import java.util.HashMap;
public class WhitelistDictionary extends Dictionary {
@@ -89,7 +91,8 @@ public class WhitelistDictionary extends Dictionary {
// Not used for WhitelistDictionary. We use getWhitelistedWord() in Suggest.java instead
@Override
- public void getWords(WordComposer composer, WordCallback callback) {
+ public void getWords(final WordComposer composer, final WordCallback callback,
+ final ProximityInfo proximityInfo) {
}
@Override
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
new file mode 100644
index 000000000..44e999572
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.latin.spellcheck;
+
+import android.content.res.Resources;
+import android.service.textservice.SpellCheckerService;
+import android.service.textservice.SpellCheckerService.Session;
+import android.view.textservice.SuggestionsInfo;
+import android.view.textservice.TextInfo;
+
+import com.android.inputmethod.compat.ArraysCompatUtils;
+import com.android.inputmethod.keyboard.Key;
+import com.android.inputmethod.keyboard.ProximityInfo;
+import com.android.inputmethod.latin.Dictionary;
+import com.android.inputmethod.latin.Dictionary.DataType;
+import com.android.inputmethod.latin.Dictionary.WordCallback;
+import com.android.inputmethod.latin.DictionaryFactory;
+import com.android.inputmethod.latin.Utils;
+import com.android.inputmethod.latin.WordComposer;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Service for spell checking, using LatinIME's dictionaries and mechanisms.
+ */
+public class AndroidSpellCheckerService extends SpellCheckerService {
+ private static final String TAG = AndroidSpellCheckerService.class.getSimpleName();
+ private static final boolean DBG = true;
+
+ private final static String[] emptyArray = new String[0];
+ private final ProximityInfo mProximityInfo = ProximityInfo.getSpellCheckerProximityInfo();
+ private final Map<String, Dictionary> mDictionaries =
+ Collections.synchronizedMap(new TreeMap<String, Dictionary>());
+
+ @Override
+ public Session createSession() {
+ return new AndroidSpellCheckerSession();
+ }
+
+ private static class SuggestionsGatherer implements WordCallback {
+ private final int DEFAULT_SUGGESTION_LENGTH = 16;
+ private final String[] mSuggestions;
+ private final int[] mScores;
+ private final int mMaxLength;
+ private int mLength = 0;
+
+ SuggestionsGatherer(final int maxLength) {
+ mMaxLength = maxLength;
+ mSuggestions = new String[mMaxLength];
+ mScores = new int[mMaxLength];
+ }
+
+ @Override
+ synchronized public boolean addWord(char[] word, int wordOffset, int wordLength, int score,
+ int dicTypeId, DataType dataType) {
+ final int positionIndex = ArraysCompatUtils.binarySearch(mScores, 0, mLength, score);
+ // binarySearch returns the index if the element exists, and -<insertion index> - 1
+ // if it doesn't. See documentation for binarySearch.
+ final int insertIndex = positionIndex >= 0 ? positionIndex : -positionIndex - 1;
+
+ if (mLength < mMaxLength) {
+ final int copyLen = mLength - insertIndex;
+ ++mLength;
+ System.arraycopy(mScores, insertIndex, mScores, insertIndex + 1, copyLen);
+ System.arraycopy(mSuggestions, insertIndex, mSuggestions, insertIndex + 1, copyLen);
+ } else {
+ if (insertIndex == 0) return true;
+ System.arraycopy(mScores, 1, mScores, 0, insertIndex);
+ System.arraycopy(mSuggestions, 1, mSuggestions, 0, insertIndex);
+ }
+ mScores[insertIndex] = score;
+ mSuggestions[insertIndex] = new String(word, wordOffset, wordLength);
+
+ return true;
+ }
+
+ public String[] getGatheredSuggestions() {
+ if (0 == mLength) return null;
+
+ final String[] results = new String[mLength];
+ for (int i = mLength - 1; i >= 0; --i) {
+ results[mLength - i - 1] = mSuggestions[i];
+ }
+ return results;
+ }
+ }
+
+ private Dictionary getDictionary(final String locale) {
+ Dictionary dictionary = mDictionaries.get(locale);
+ if (null == dictionary) {
+ final Resources resources = getResources();
+ final int fallbackResourceId = Utils.getMainDictionaryResourceId(resources);
+ final Locale localeObject = Utils.constructLocaleFromString(locale);
+ dictionary = DictionaryFactory.createDictionaryFromManager(this, localeObject,
+ fallbackResourceId);
+ mDictionaries.put(locale, dictionary);
+ }
+ return dictionary;
+ }
+
+ private class AndroidSpellCheckerSession extends Session {
+ @Override
+ public void onCreate() {
+ }
+
+ // 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 arguments. It may split or group words, and
+ * even perform grammatical analysis.
+ */
+ @Override
+ public SuggestionsInfo onGetSuggestions(final TextInfo textInfo,
+ final int suggestionsLimit) {
+ final String locale = getLocale();
+ final Dictionary dictionary = getDictionary(locale);
+ final String text = textInfo.getText();
+
+ final SuggestionsGatherer suggestionsGatherer =
+ new SuggestionsGatherer(suggestionsLimit);
+ final WordComposer composer = new WordComposer();
+ final int length = text.length();
+ for (int i = 0; i < length; ++i) {
+ final int character = text.codePointAt(i);
+ final int proximityIndex = SpellCheckerProximityInfo.getIndexOf(character);
+ final int[] proximities;
+ if (-1 == proximityIndex) {
+ proximities = new int[] { character };
+ } else {
+ proximities = Arrays.copyOfRange(SpellCheckerProximityInfo.PROXIMITY,
+ proximityIndex, proximityIndex + SpellCheckerProximityInfo.ROW_SIZE);
+ }
+ composer.add(character, proximities,
+ WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
+ }
+ dictionary.getWords(composer, suggestionsGatherer, mProximityInfo);
+ final boolean isInDict = dictionary.isValidWord(text);
+ final String[] suggestions = suggestionsGatherer.getGatheredSuggestions();
+
+ final int flags =
+ (isInDict ? SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY : 0)
+ | (null != suggestions
+ ? SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO : 0);
+ return new SuggestionsInfo(flags, suggestions);
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SpellChecker.java b/java/src/com/android/inputmethod/latin/spellcheck/SpellChecker.java
deleted file mode 100644
index 63c6d69d7..000000000
--- a/java/src/com/android/inputmethod/latin/spellcheck/SpellChecker.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin.spellcheck;
-
-import android.content.Context;
-import android.content.res.Resources;
-
-import com.android.inputmethod.compat.ArraysCompatUtils;
-import com.android.inputmethod.latin.Dictionary;
-import com.android.inputmethod.latin.Dictionary.DataType;
-import com.android.inputmethod.latin.Dictionary.WordCallback;
-import com.android.inputmethod.latin.DictionaryFactory;
-import com.android.inputmethod.latin.Utils;
-import com.android.inputmethod.latin.WordComposer;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Implements spell checking methods.
- */
-public class SpellChecker {
-
- public final Dictionary mDictionary;
-
- public SpellChecker(final Context context, final Locale locale) {
- final Resources resources = context.getResources();
- final int fallbackResourceId = Utils.getMainDictionaryResourceId(resources);
- mDictionary = DictionaryFactory.createDictionaryFromManager(context, locale,
- fallbackResourceId);
- }
-
- // Note : this must be reentrant
- /**
- * Finds out whether a word is in the dictionary or not.
- *
- * @param text the sequence containing the word to check for.
- * @param start the index of the first character of the word in text.
- * @param end the index of the next-to-last character in text.
- * @return true if the word is in the dictionary, false otherwise.
- */
- public boolean isCorrect(final CharSequence text, final int start, final int end) {
- return mDictionary.isValidWord(text.subSequence(start, end));
- }
-
- private static class SuggestionsGatherer implements WordCallback {
- private final int DEFAULT_SUGGESTION_LENGTH = 16;
- private final List<String> mSuggestions = new LinkedList<String>();
- private int[] mScores = new int[DEFAULT_SUGGESTION_LENGTH];
- private int mLength = 0;
-
- @Override
- synchronized public boolean addWord(char[] word, int wordOffset, int wordLength, int score,
- int dicTypeId, DataType dataType) {
- if (mLength >= mScores.length) {
- final int newLength = mScores.length * 2;
- mScores = new int[newLength];
- }
- final int positionIndex = ArraysCompatUtils.binarySearch(mScores, 0, mLength, score);
- // binarySearch returns the index if the element exists, and -<insertion index> - 1
- // if it doesn't. See documentation for binarySearch.
- final int insertionIndex = positionIndex >= 0 ? positionIndex : -positionIndex - 1;
- System.arraycopy(mScores, insertionIndex, mScores, insertionIndex + 1,
- mLength - insertionIndex);
- mLength += 1;
- mScores[insertionIndex] = score;
- mSuggestions.add(insertionIndex, new String(word, wordOffset, wordLength));
- return true;
- }
-
- public List<String> getGatheredSuggestions() {
- return mSuggestions;
- }
- }
-
- // 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
- * arguments. It may split or group words, and even perform grammatical
- * analysis.
- *
- * @param text the sequence containing the word to check for.
- * @param start the index of the first character of the word in text.
- * @param end the index of the next-to-last character in text.
- * @return a list of possible suggestions to replace the text.
- */
- public List<String> getSuggestions(final CharSequence text, final int start, final int end) {
- final SuggestionsGatherer suggestionsGatherer = new SuggestionsGatherer();
- final WordComposer composer = new WordComposer();
- for (int i = start; i < end; ++i) {
- int character = text.charAt(i);
- composer.add(character, new int[] { character },
- WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
- }
- mDictionary.getWords(composer, suggestionsGatherer);
- return suggestionsGatherer.getGatheredSuggestions();
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerProximityInfo.java b/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerProximityInfo.java
new file mode 100644
index 000000000..abcf7e52a
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerProximityInfo.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.latin.spellcheck;
+
+import com.android.inputmethod.keyboard.KeyDetector;
+import com.android.inputmethod.keyboard.ProximityInfo;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+public class SpellCheckerProximityInfo {
+ final private static int NUL = KeyDetector.NOT_A_CODE;
+
+ // This must be the same as MAX_PROXIMITY_CHARS_SIZE else it will not work inside
+ // native code - this value is passed at creation of the binary object and reused
+ // as the size of the passed array afterwards so they can't be different.
+ final public static int ROW_SIZE = ProximityInfo.MAX_PROXIMITY_CHARS_SIZE;
+
+ // This is a map from the code point to the index in the PROXIMITY array.
+ // At the time the native code to read the binary dictionary needs the proximity info be passed
+ // as a flat array spaced by MAX_PROXIMITY_CHARS_SIZE columns, one for each input character.
+ // Since we need to build such an array, we want to be able to search in our big proximity data
+ // quickly by character, and a map is probably the best way to do this.
+ final private static TreeMap<Integer, Integer> INDICES = new TreeMap<Integer, Integer>();
+
+ // The proximity here is the union of
+ // - the proximity for a QWERTY keyboard.
+ // - the proximity for an AZERTY keyboard.
+ // - the proximity for a QWERTZ keyboard.
+ // ...plus, add all characters in the ('a', 'e', 'i', 'o', 'u') set to each other.
+ //
+ // The reasoning behind this construction is, almost any alphabetic text we may want
+ // to spell check has been entered with one of the keyboards above. Also, specifically
+ // to English, many spelling errors consist of the last vowel of the word being wrong
+ // because in English vowels tend to merge with each other in pronunciation.
+ final public static int[] PROXIMITY = {
+ 'q', 'w', 's', 'a', 'z', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'w', 'q', 'a', 's', 'd', 'e', 'x', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'e', 'w', 's', 'd', 'f', 'r', 'a', 'i', 'o', 'u', NUL, NUL, NUL, NUL, NUL, NUL,
+ 'r', 'e', 'd', 'f', 'g', 't', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 't', 'r', 'f', 'g', 'h', 'y', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'y', 't', 'g', 'h', 'j', 'u', 'a', 's', 'd', 'x', NUL, NUL, NUL, NUL, NUL, NUL,
+ 'u', 'y', 'h', 'j', 'k', 'i', 'a', 'e', 'o', NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'i', 'u', 'j', 'k', 'l', 'o', 'a', 'e', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'o', 'i', 'k', 'l', 'p', 'a', 'e', 'u', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'p', 'o', 'l', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+
+ 'a', 'z', 'x', 's', 'w', 'q', 'e', 'i', 'o', 'u', NUL, NUL, NUL, NUL, NUL, NUL,
+ 's', 'q', 'a', 'z', 'x', 'c', 'd', 'e', 'w', NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'd', 'w', 's', 'x', 'c', 'v', 'f', 'r', 'e', 'w', NUL, NUL, NUL, NUL, NUL, NUL,
+ 'f', 'e', 'd', 'c', 'v', 'b', 'g', 't', 'r', NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'g', 'r', 'f', 'v', 'b', 'n', 'h', 'y', 't', NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'h', 't', 'g', 'b', 'n', 'm', 'j', 'u', 'y', NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'j', 'y', 'h', 'n', 'm', 'k', 'i', 'u', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'k', 'u', 'j', 'm', 'l', 'o', 'i', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'l', 'i', 'k', 'p', 'o', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+
+ 'z', 'a', 's', 'd', 'x', 't', 'g', 'h', 'j', 'u', 'q', 'e', NUL, NUL, NUL, NUL,
+ 'x', 'z', 'a', 's', 'd', 'c', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'c', 'x', 's', 'd', 'f', 'v', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'v', 'c', 'd', 'f', 'g', 'b', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'b', 'v', 'f', 'g', 'h', 'n', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'n', 'b', 'g', 'h', 'j', 'm', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ 'm', 'n', 'h', 'j', 'k', 'l', 'o', 'p', NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL, NUL,
+ };
+ static {
+ for (int i = 0; i < PROXIMITY.length; i += ROW_SIZE) {
+ if (NUL != PROXIMITY[i]) INDICES.put(PROXIMITY[i], i);
+ }
+ }
+ public static int getIndexOf(int characterCode) {
+ final Integer result = INDICES.get(characterCode);
+ if (null == result) return -1;
+ return result;
+ }
+}