diff options
Diffstat (limited to 'java')
478 files changed, 20426 insertions, 19550 deletions
diff --git a/java/Android.mk b/java/Android.mk index 03d48aaa7..60c321ab2 100644 --- a/java/Android.mk +++ b/java/Android.mk @@ -13,7 +13,11 @@ LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime LOCAL_STATIC_JAVA_LIBRARIES := android-common -#LOCAL_AAPT_FLAGS := -0 .dict +# Do not compress dictionary files to mmap dict data runtime +LOCAL_AAPT_FLAGS := -0 .dict + +# Include all the resources regardless of system supported locales +LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true LOCAL_SDK_VERSION := current diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index b1e5ec6f6..de4ac610c 100755..100644 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -8,7 +8,7 @@ <uses-permission android:name="android.permission.READ_CONTACTS" /> <application android:label="@string/english_ime_name" - android:backupAgent="LatinIMEBackupAgent" + android:backupAgent="BackupAgent" android:killAfterRestore="false"> <service android:name="LatinIME" @@ -20,13 +20,13 @@ <meta-data android:name="android.view.im" android:resource="@xml/method" /> </service> - <activity android:name="LatinIMESettings" android:label="@string/english_ime_settings"> + <activity android:name="Settings" android:label="@string/english_ime_settings"> <intent-filter> <action android:name="android.intent.action.MAIN"/> </intent-filter> </activity> - <activity android:name="LatinIMEDebugSettings" android:label="@string/english_ime_debug_settings"> + <activity android:name="DebugSettings" android:label="@string/english_ime_debug_settings"> <intent-filter> <action android:name="android.intent.action.MAIN"/> </intent-filter> diff --git a/java/proguard.flags b/java/proguard.flags index 829a096c0..9096855e8 100644 --- a/java/proguard.flags +++ b/java/proguard.flags @@ -5,4 +5,12 @@ -keep class com.android.inputmethod.latin.Suggest { <init>(...); + com.android.inputmethod.latin.SuggestedWords getSuggestions(...); +} + +-keep class com.android.inputmethod.latin.UserBigramDictionary { + void setDatabaseMax(int); + void setDatabaseDelete(int); + void waitUntilUpdateDBDone(); + void waitForDictionaryLoading(); } diff --git a/java/res/drawable-hdpi/btn_candidate_normal.9.png b/java/res/drawable-hdpi/btn_candidate_normal.9.png Binary files differnew file mode 100644 index 000000000..0ccdb6ab2 --- /dev/null +++ b/java/res/drawable-hdpi/btn_candidate_normal.9.png diff --git a/java/res/drawable-hdpi/list_selector_background_pressed.9.png b/java/res/drawable-hdpi/btn_candidate_pressed.9.png Binary files differindex ba79cf7f8..ba79cf7f8 100644 --- a/java/res/drawable-hdpi/list_selector_background_pressed.9.png +++ b/java/res/drawable-hdpi/btn_candidate_pressed.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png Binary files differnew file mode 100644 index 000000000..d13386a0c --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.png Binary files differnew file mode 100644 index 000000000..95b73c07e --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_holo.9.png Binary files differnew file mode 100644 index 000000000..3bd224911 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_holo.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png Binary files differnew file mode 100644 index 000000000..77a0e7d75 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_holo.9.png Binary files differnew file mode 100644 index 000000000..1760075a8 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_holo.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_holo.9.png Binary files differnew file mode 100644 index 000000000..b6d0dbca7 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_holo.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.png Binary files differnew file mode 100644 index 000000000..763c538d3 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png Binary files differnew file mode 100644 index 000000000..328fe160a --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_holo.9.png Binary files differnew file mode 100644 index 000000000..e0129ab10 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-hdpi/ic_subtype_keyboard.png b/java/res/drawable-hdpi/ic_subtype_keyboard.png Binary files differdeleted file mode 100644 index 7015e266a..000000000 --- a/java/res/drawable-hdpi/ic_subtype_keyboard.png +++ /dev/null diff --git a/java/res/drawable-hdpi/ic_subtype_mic.png b/java/res/drawable-hdpi/ic_subtype_mic.png Binary files differdeleted file mode 100644 index cb86a5598..000000000 --- a/java/res/drawable-hdpi/ic_subtype_mic.png +++ /dev/null diff --git a/java/res/drawable-hdpi/key_hint_at_holo.9.png b/java/res/drawable-hdpi/key_hint_at_holo.9.png Binary files differnew file mode 100644 index 000000000..ebde12dd9 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_at_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_at_large_holo.9.png b/java/res/drawable-hdpi/key_hint_at_large_holo.9.png Binary files differnew file mode 100644 index 000000000..29d21bc58 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_at_large_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_colon_holo.9.png b/java/res/drawable-hdpi/key_hint_colon_holo.9.png Binary files differnew file mode 100644 index 000000000..14c46990d --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_colon_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-hdpi/key_hint_colon_large_holo.9.png Binary files differnew file mode 100644 index 000000000..91e788323 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_colon_large_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_comma_holo.9.png b/java/res/drawable-hdpi/key_hint_comma_holo.9.png Binary files differnew file mode 100644 index 000000000..82e4a93b7 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_comma_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_dash_holo.9.png b/java/res/drawable-hdpi/key_hint_dash_holo.9.png Binary files differnew file mode 100644 index 000000000..2ee22ba79 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_dash_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png Binary files differnew file mode 100644 index 000000000..0da933239 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_equal_holo.9.png b/java/res/drawable-hdpi/key_hint_equal_holo.9.png Binary files differnew file mode 100644 index 000000000..f5a9ba2f4 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_equal_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png Binary files differnew file mode 100644 index 000000000..6887156a5 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png Binary files differnew file mode 100644 index 000000000..e20a13715 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_larger_holo.9.png b/java/res/drawable-hdpi/key_hint_larger_holo.9.png Binary files differnew file mode 100644 index 000000000..50652bb13 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_larger_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png Binary files differnew file mode 100644 index 000000000..52ee86a0f --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png Binary files differnew file mode 100644 index 000000000..b0ed388ad --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_period_holo.9.png b/java/res/drawable-hdpi/key_hint_period_holo.9.png Binary files differnew file mode 100644 index 000000000..8d798a57f --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_period_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_plus_holo.9.png b/java/res/drawable-hdpi/key_hint_plus_holo.9.png Binary files differnew file mode 100644 index 000000000..f1d232e99 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_plus_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-hdpi/key_hint_plus_large_holo.9.png Binary files differnew file mode 100644 index 000000000..5f7d31563 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_plus_large_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_question_holo.9.png b/java/res/drawable-hdpi/key_hint_question_holo.9.png Binary files differnew file mode 100644 index 000000000..9055c7688 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_question_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_question_large_holo.9.png b/java/res/drawable-hdpi/key_hint_question_large_holo.9.png Binary files differnew file mode 100644 index 000000000..ade394cdd --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_question_large_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_quote_holo.9.png b/java/res/drawable-hdpi/key_hint_quote_holo.9.png Binary files differnew file mode 100644 index 000000000..361e3a8e4 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_quote_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png Binary files differnew file mode 100644 index 000000000..cc5e8d710 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png Binary files differnew file mode 100644 index 000000000..7f9e8c90e --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png Binary files differnew file mode 100644 index 000000000..5e1a45c0e --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_slash_holo.9.png b/java/res/drawable-hdpi/key_hint_slash_holo.9.png Binary files differnew file mode 100644 index 000000000..645586a30 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_slash_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png Binary files differnew file mode 100644 index 000000000..75c3bb1a6 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_smaller_holo.9.png b/java/res/drawable-hdpi/key_hint_smaller_holo.9.png Binary files differnew file mode 100644 index 000000000..2a0587cbd --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_smaller_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_star_holo.9.png b/java/res/drawable-hdpi/key_hint_star_holo.9.png Binary files differnew file mode 100644 index 000000000..9f33b9830 --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_star_holo.9.png diff --git a/java/res/drawable-hdpi/key_hint_underline_holo.9.png b/java/res/drawable-hdpi/key_hint_underline_holo.9.png Binary files differnew file mode 100644 index 000000000..a8841d08c --- /dev/null +++ b/java/res/drawable-hdpi/key_hint_underline_holo.9.png diff --git a/java/res/drawable-hdpi/keyboard_background_holo.9.png b/java/res/drawable-hdpi/keyboard_background_holo.9.png Binary files differnew file mode 100644 index 000000000..87aa98e8e --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_background_holo.9.png diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png Binary files differnew file mode 100644 index 000000000..571f3aa37 --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png diff --git a/java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.png Binary files differnew file mode 100644 index 000000000..2b529b887 --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.png diff --git a/java/res/drawable-hdpi/mic_slash_holo.png b/java/res/drawable-hdpi/mic_slash_holo.png Binary files differnew file mode 100644 index 000000000..8108b6e13 --- /dev/null +++ b/java/res/drawable-hdpi/mic_slash_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.png Binary files differnew file mode 100644 index 000000000..f99a0edcf --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.png diff --git a/java/res/drawable-hdpi/working.png b/java/res/drawable-hdpi/working.png Binary files differindex 5ea702307..5ea702307 100755..100644 --- a/java/res/drawable-hdpi/working.png +++ b/java/res/drawable-hdpi/working.png diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png Binary files differnew file mode 100755 index 000000000..603bf0e15 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png Binary files differnew file mode 100755 index 000000000..6ddd516e7 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png Binary files differnew file mode 100644 index 000000000..67a204f85 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png Binary files differnew file mode 100755 index 000000000..65fdeb353 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png Binary files differnew file mode 100644 index 000000000..63cbe60a3 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png Binary files differnew file mode 100644 index 000000000..0dd33b429 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png Binary files differnew file mode 100755 index 000000000..7ec915fe8 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png Binary files differnew file mode 100755 index 000000000..439271723 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png Binary files differnew file mode 100755 index 000000000..c2cc32044 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png diff --git a/java/res/drawable-land-mdpi/hint_popup_holo.9.png b/java/res/drawable-land-mdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..6ad605d97 --- /dev/null +++ b/java/res/drawable-land-mdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_at_holo.9.png b/java/res/drawable-land-mdpi/key_hint_at_holo.9.png Binary files differnew file mode 100644 index 000000000..3bb805618 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_at_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png Binary files differnew file mode 100644 index 000000000..30505cfcd --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png Binary files differnew file mode 100644 index 000000000..85e733cc1 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png Binary files differnew file mode 100644 index 000000000..535b0f2a4 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png Binary files differnew file mode 100644 index 000000000..f9391623b --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png b/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png Binary files differnew file mode 100644 index 000000000..1cb0bdfaa --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png Binary files differnew file mode 100644 index 000000000..7e7ceb3fc --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png b/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png Binary files differnew file mode 100644 index 000000000..8e570595c --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png Binary files differnew file mode 100644 index 000000000..df273d863 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png Binary files differnew file mode 100644 index 000000000..002eb0562 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png b/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png Binary files differnew file mode 100644 index 000000000..37c05275e --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png Binary files differnew file mode 100644 index 000000000..97e1f1449 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png Binary files differnew file mode 100644 index 000000000..36add5d51 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_period_holo.9.png b/java/res/drawable-land-mdpi/key_hint_period_holo.9.png Binary files differnew file mode 100644 index 000000000..4a70f07dc --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_period_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png Binary files differnew file mode 100644 index 000000000..7698a5806 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png Binary files differnew file mode 100644 index 000000000..206d99073 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_question_holo.9.png b/java/res/drawable-land-mdpi/key_hint_question_holo.9.png Binary files differnew file mode 100644 index 000000000..5beea0911 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_question_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png Binary files differnew file mode 100644 index 000000000..6932031b6 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png Binary files differnew file mode 100644 index 000000000..401399b08 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png Binary files differnew file mode 100644 index 000000000..daf3bc091 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png Binary files differnew file mode 100644 index 000000000..63a3875b5 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png Binary files differnew file mode 100644 index 000000000..3c217b058 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png b/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png Binary files differnew file mode 100644 index 000000000..98545f0ac --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png Binary files differnew file mode 100644 index 000000000..a3a02973c --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png b/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png Binary files differnew file mode 100644 index 000000000..5af183644 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_star_holo.9.png b/java/res/drawable-land-mdpi/key_hint_star_holo.9.png Binary files differnew file mode 100644 index 000000000..18304d738 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_star_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png Binary files differnew file mode 100644 index 000000000..6d6873751 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png diff --git a/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png Binary files differnew file mode 100644 index 000000000..50f99a191 --- /dev/null +++ b/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png diff --git a/java/res/drawable-mdpi/btn_candidate_normal.9.png b/java/res/drawable-mdpi/btn_candidate_normal.9.png Binary files differnew file mode 100644 index 000000000..fa6c0feff --- /dev/null +++ b/java/res/drawable-mdpi/btn_candidate_normal.9.png diff --git a/java/res/drawable-mdpi/list_selector_background_pressed.9.png b/java/res/drawable-mdpi/btn_candidate_pressed.9.png Binary files differindex 02b4e9a53..02b4e9a53 100644 --- a/java/res/drawable-mdpi/list_selector_background_pressed.9.png +++ b/java/res/drawable-mdpi/btn_candidate_pressed.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png Binary files differnew file mode 100644 index 000000000..9b604559b --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png Binary files differnew file mode 100644 index 000000000..6b35d0506 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png Binary files differnew file mode 100644 index 000000000..ffea49f3f --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_holo.9.png Binary files differnew file mode 100644 index 000000000..dba6e38e9 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_holo.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png Binary files differnew file mode 100644 index 000000000..7307d62b8 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png Binary files differnew file mode 100644 index 000000000..2cab62b62 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_normal_holo.9.png Binary files differnew file mode 100644 index 000000000..93f120755 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_light_normal_holo.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png Binary files differindex 02d0fcf93..0c3ffbf8f 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_holo.9.png Binary files differnew file mode 100644 index 000000000..99eaa8446 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_holo.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_holo.9.png Binary files differnew file mode 100644 index 000000000..2d4365eec --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-mdpi/cancel_holo.9.png b/java/res/drawable-mdpi/cancel_holo.9.png Binary files differnew file mode 100644 index 000000000..74f967eb9 --- /dev/null +++ b/java/res/drawable-mdpi/cancel_holo.9.png diff --git a/java/res/drawable-mdpi/hint_popup_holo.9.png b/java/res/drawable-mdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..6ad605d97 --- /dev/null +++ b/java/res/drawable-mdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-mdpi/ic_subtype_keyboard.png b/java/res/drawable-mdpi/ic_subtype_keyboard.png Binary files differdeleted file mode 100644 index 0d7ebd4e5..000000000 --- a/java/res/drawable-mdpi/ic_subtype_keyboard.png +++ /dev/null diff --git a/java/res/drawable-mdpi/ic_subtype_mic.png b/java/res/drawable-mdpi/ic_subtype_mic.png Binary files differdeleted file mode 100644 index 247d5b3a9..000000000 --- a/java/res/drawable-mdpi/ic_subtype_mic.png +++ /dev/null diff --git a/java/res/drawable-mdpi/key_hint_at_holo.9.png b/java/res/drawable-mdpi/key_hint_at_holo.9.png Binary files differnew file mode 100644 index 000000000..3bb805618 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_at_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-mdpi/key_hint_at_large_holo.9.png Binary files differnew file mode 100644 index 000000000..30505cfcd --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_at_large_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-mdpi/key_hint_colon_holo.9.png Binary files differnew file mode 100644 index 000000000..85e733cc1 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_colon_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png Binary files differnew file mode 100644 index 000000000..535b0f2a4 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-mdpi/key_hint_comma_holo.9.png Binary files differnew file mode 100644 index 000000000..82e4a93b7 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_comma_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_dash_holo.9.png b/java/res/drawable-mdpi/key_hint_dash_holo.9.png Binary files differnew file mode 100644 index 000000000..2ee22ba79 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_dash_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png Binary files differnew file mode 100644 index 000000000..0da933239 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_equal_holo.9.png b/java/res/drawable-mdpi/key_hint_equal_holo.9.png Binary files differnew file mode 100644 index 000000000..f5a9ba2f4 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_equal_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png Binary files differnew file mode 100644 index 000000000..df273d863 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png Binary files differnew file mode 100644 index 000000000..002eb0562 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_larger_holo.9.png b/java/res/drawable-mdpi/key_hint_larger_holo.9.png Binary files differnew file mode 100644 index 000000000..50652bb13 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_larger_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png Binary files differnew file mode 100644 index 000000000..52ee86a0f --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png Binary files differnew file mode 100644 index 000000000..b0ed388ad --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_period_holo.9.png b/java/res/drawable-mdpi/key_hint_period_holo.9.png Binary files differnew file mode 100644 index 000000000..8d798a57f --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_period_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-mdpi/key_hint_plus_holo.9.png Binary files differnew file mode 100644 index 000000000..f1d232e99 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_plus_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-mdpi/key_hint_plus_large_holo.9.png Binary files differnew file mode 100644 index 000000000..5f7d31563 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_plus_large_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_question_holo.9.png b/java/res/drawable-mdpi/key_hint_question_holo.9.png Binary files differnew file mode 100644 index 000000000..5beea0911 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_question_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-mdpi/key_hint_question_large_holo.9.png Binary files differnew file mode 100644 index 000000000..6932031b6 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_question_large_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-mdpi/key_hint_quote_holo.9.png Binary files differnew file mode 100644 index 000000000..401399b08 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_quote_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png Binary files differnew file mode 100644 index 000000000..daf3bc091 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png Binary files differnew file mode 100644 index 000000000..7f9e8c90e --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png Binary files differnew file mode 100644 index 000000000..5e1a45c0e --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_slash_holo.9.png b/java/res/drawable-mdpi/key_hint_slash_holo.9.png Binary files differnew file mode 100644 index 000000000..645586a30 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_slash_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png Binary files differnew file mode 100644 index 000000000..75c3bb1a6 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_smaller_holo.9.png b/java/res/drawable-mdpi/key_hint_smaller_holo.9.png Binary files differnew file mode 100644 index 000000000..2a0587cbd --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_smaller_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_star_holo.9.png b/java/res/drawable-mdpi/key_hint_star_holo.9.png Binary files differnew file mode 100644 index 000000000..9f33b9830 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_star_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-mdpi/key_hint_underline_holo.9.png Binary files differnew file mode 100644 index 000000000..6d6873751 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_underline_holo.9.png diff --git a/java/res/drawable-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-mdpi/key_hint_underline_large_holo.9.png Binary files differnew file mode 100644 index 000000000..50f99a191 --- /dev/null +++ b/java/res/drawable-mdpi/key_hint_underline_large_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_background_holo.9.png b/java/res/drawable-mdpi/keyboard_background_holo.9.png Binary files differnew file mode 100644 index 000000000..c56c704bb --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_background_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_at.9.png b/java/res/drawable-mdpi/keyboard_hint_at.9.png Binary files differnew file mode 100644 index 000000000..69baedef4 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_hint_at.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_colon.9.png b/java/res/drawable-mdpi/keyboard_hint_colon.9.png Binary files differnew file mode 100644 index 000000000..9d0d7cbab --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_hint_colon.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png b/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png Binary files differnew file mode 100644 index 000000000..d24aa0f07 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png b/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png Binary files differnew file mode 100644 index 000000000..f6cc7fe84 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_greater.9.png b/java/res/drawable-mdpi/keyboard_hint_greater.9.png Binary files differnew file mode 100644 index 000000000..5210392bf --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_hint_greater.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_plus.9.png b/java/res/drawable-mdpi/keyboard_hint_plus.9.png Binary files differnew file mode 100644 index 000000000..d1d85ac87 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_hint_plus.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_question.9.png b/java/res/drawable-mdpi/keyboard_hint_question.9.png Binary files differnew file mode 100644 index 000000000..37f6e5f36 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_hint_question.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_quote.9.png b/java/res/drawable-mdpi/keyboard_hint_quote.9.png Binary files differnew file mode 100644 index 000000000..e7d2cb5e3 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_hint_quote.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_smaller.9.png b/java/res/drawable-mdpi/keyboard_hint_smaller.9.png Binary files differnew file mode 100644 index 000000000..76553cf96 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_hint_smaller.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_star.9.png b/java/res/drawable-mdpi/keyboard_hint_star.9.png Binary files differnew file mode 100644 index 000000000..47978c46c --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_hint_star.9.png diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png Binary files differnew file mode 100644 index 000000000..a7acb4a4d --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.png Binary files differnew file mode 100644 index 000000000..264524e22 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_popup_panel_background_holo.9.png b/java/res/drawable-mdpi/keyboard_popup_panel_background_holo.9.png Binary files differnew file mode 100644 index 000000000..6c21bba8f --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_popup_panel_background_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png Binary files differnew file mode 100644 index 000000000..a5afb7dcb --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png diff --git a/java/res/drawable-mdpi/mic_slash_holo.png b/java/res/drawable-mdpi/mic_slash_holo.png Binary files differnew file mode 100644 index 000000000..8ee41b61a --- /dev/null +++ b/java/res/drawable-mdpi/mic_slash_holo.png diff --git a/java/res/drawable-mdpi/ok_cancel_holo.9.png b/java/res/drawable-mdpi/ok_cancel_holo.9.png Binary files differnew file mode 100644 index 000000000..cd53d55d9 --- /dev/null +++ b/java/res/drawable-mdpi/ok_cancel_holo.9.png diff --git a/java/res/drawable-mdpi/speak_now_level0_holo.png b/java/res/drawable-mdpi/speak_now_level0_holo.png Binary files differnew file mode 100644 index 000000000..d2934780a --- /dev/null +++ b/java/res/drawable-mdpi/speak_now_level0_holo.png diff --git a/java/res/drawable-mdpi/speak_now_level1_holo.png b/java/res/drawable-mdpi/speak_now_level1_holo.png Binary files differnew file mode 100644 index 000000000..ff79e0d5f --- /dev/null +++ b/java/res/drawable-mdpi/speak_now_level1_holo.png diff --git a/java/res/drawable-mdpi/speak_now_level2_holo.png b/java/res/drawable-mdpi/speak_now_level2_holo.png Binary files differnew file mode 100644 index 000000000..8b3ea30cf --- /dev/null +++ b/java/res/drawable-mdpi/speak_now_level2_holo.png diff --git a/java/res/drawable-mdpi/speak_now_level3_holo.png b/java/res/drawable-mdpi/speak_now_level3_holo.png Binary files differnew file mode 100644 index 000000000..cd940b741 --- /dev/null +++ b/java/res/drawable-mdpi/speak_now_level3_holo.png diff --git a/java/res/drawable-mdpi/speak_now_level4_holo.png b/java/res/drawable-mdpi/speak_now_level4_holo.png Binary files differnew file mode 100644 index 000000000..87d781d8f --- /dev/null +++ b/java/res/drawable-mdpi/speak_now_level4_holo.png diff --git a/java/res/drawable-mdpi/speak_now_level5_holo.png b/java/res/drawable-mdpi/speak_now_level5_holo.png Binary files differnew file mode 100644 index 000000000..bffe1e0ec --- /dev/null +++ b/java/res/drawable-mdpi/speak_now_level5_holo.png diff --git a/java/res/drawable-mdpi/speak_now_level6_holo.png b/java/res/drawable-mdpi/speak_now_level6_holo.png Binary files differnew file mode 100644 index 000000000..74e0f9882 --- /dev/null +++ b/java/res/drawable-mdpi/speak_now_level6_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_delete_holo.png b/java/res/drawable-mdpi/sym_keyboard_delete_holo.png Binary files differnew file mode 100644 index 000000000..364d9c4c5 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_delete_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num0_holo.png b/java/res/drawable-mdpi/sym_keyboard_num0_holo.png Binary files differnew file mode 100644 index 000000000..21b98ebbd --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num0_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num1_holo.png b/java/res/drawable-mdpi/sym_keyboard_num1_holo.png Binary files differnew file mode 100644 index 000000000..e95a64b55 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num1_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num2_holo.png b/java/res/drawable-mdpi/sym_keyboard_num2_holo.png Binary files differnew file mode 100644 index 000000000..e08856718 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num2_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num3_holo.png b/java/res/drawable-mdpi/sym_keyboard_num3_holo.png Binary files differnew file mode 100644 index 000000000..9739127ae --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num3_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num4_holo.png b/java/res/drawable-mdpi/sym_keyboard_num4_holo.png Binary files differnew file mode 100644 index 000000000..d17262e8d --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num4_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num5_holo.png b/java/res/drawable-mdpi/sym_keyboard_num5_holo.png Binary files differnew file mode 100644 index 000000000..7135b178a --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num5_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num6_holo.png b/java/res/drawable-mdpi/sym_keyboard_num6_holo.png Binary files differnew file mode 100644 index 000000000..184483a56 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num6_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num7_holo.png b/java/res/drawable-mdpi/sym_keyboard_num7_holo.png Binary files differnew file mode 100644 index 000000000..950ce0eba --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num7_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num8_holo.png b/java/res/drawable-mdpi/sym_keyboard_num8_holo.png Binary files differnew file mode 100644 index 000000000..8e50ea653 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num8_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num9_holo.png b/java/res/drawable-mdpi/sym_keyboard_num9_holo.png Binary files differnew file mode 100644 index 000000000..32b2b9cfc --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num9_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_numbpound_holo.png b/java/res/drawable-mdpi/sym_keyboard_numbpound_holo.png Binary files differnew file mode 100644 index 000000000..39d743535 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_numbpound_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_numbstar_holo.png b/java/res/drawable-mdpi/sym_keyboard_numbstar_holo.png Binary files differnew file mode 100644 index 000000000..d2dc465dd --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_numbstar_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_return_holo.png b/java/res/drawable-mdpi/sym_keyboard_return_holo.png Binary files differnew file mode 100644 index 000000000..195b8b83f --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_return_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_settings_holo.png b/java/res/drawable-mdpi/sym_keyboard_settings_holo.png Binary files differnew file mode 100644 index 000000000..e23affd68 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_settings_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_holo.png b/java/res/drawable-mdpi/sym_keyboard_shift_holo.png Binary files differnew file mode 100644 index 000000000..068701d37 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_shift_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_lock.png b/java/res/drawable-mdpi/sym_keyboard_shift_lock.png Binary files differdeleted file mode 100644 index 244179c2d..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_shift_lock.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-mdpi/sym_keyboard_shift_locked_holo.png Binary files differnew file mode 100644 index 000000000..07cbdb3fe --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_shift_locked_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_space_holo.png b/java/res/drawable-mdpi/sym_keyboard_space_holo.png Binary files differnew file mode 100644 index 000000000..d39fdcae5 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_space_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_holo.png b/java/res/drawable-mdpi/sym_keyboard_voice_holo.png Binary files differnew file mode 100644 index 000000000..363ccb1c8 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_voice_holo.png diff --git a/java/res/drawable-mdpi/top_suggest_line_holo.9.png b/java/res/drawable-mdpi/top_suggest_line_holo.9.png Binary files differnew file mode 100644 index 000000000..56066712d --- /dev/null +++ b/java/res/drawable-mdpi/top_suggest_line_holo.9.png diff --git a/java/res/drawable-xlarge/btn_center_default.9.png b/java/res/drawable-xlarge/btn_center_default.9.png Binary files differnew file mode 100755 index 000000000..d5ec36ba4 --- /dev/null +++ b/java/res/drawable-xlarge/btn_center_default.9.png diff --git a/java/res/drawable-xlarge/btn_center_pressed.9.png b/java/res/drawable-xlarge/btn_center_pressed.9.png Binary files differnew file mode 100755 index 000000000..593a679d0 --- /dev/null +++ b/java/res/drawable-xlarge/btn_center_pressed.9.png diff --git a/java/res/drawable-xlarge/btn_center_selected.9.png b/java/res/drawable-xlarge/btn_center_selected.9.png Binary files differnew file mode 100644 index 000000000..f1914a886 --- /dev/null +++ b/java/res/drawable-xlarge/btn_center_selected.9.png diff --git a/java/res/drawable-xlarge/caution.png b/java/res/drawable-xlarge/caution.png Binary files differnew file mode 100755 index 000000000..eaef53425 --- /dev/null +++ b/java/res/drawable-xlarge/caution.png diff --git a/java/res/drawable-xlarge/mic_base.png b/java/res/drawable-xlarge/mic_base.png Binary files differnew file mode 100644 index 000000000..53e29ff4b --- /dev/null +++ b/java/res/drawable-xlarge/mic_base.png diff --git a/java/res/drawable-xlarge/mic_full.png b/java/res/drawable-xlarge/mic_full.png Binary files differnew file mode 100644 index 000000000..e3e3dfac3 --- /dev/null +++ b/java/res/drawable-xlarge/mic_full.png diff --git a/java/res/drawable-xlarge/mic_slash.png b/java/res/drawable-xlarge/mic_slash.png Binary files differnew file mode 100644 index 000000000..1dd05c5b4 --- /dev/null +++ b/java/res/drawable-xlarge/mic_slash.png diff --git a/java/res/drawable-xlarge/vs_dialog_blue.9.png b/java/res/drawable-xlarge/vs_dialog_blue.9.png Binary files differnew file mode 100644 index 000000000..cf27e8f43 --- /dev/null +++ b/java/res/drawable-xlarge/vs_dialog_blue.9.png diff --git a/java/res/drawable-xlarge/vs_dialog_red.9.png b/java/res/drawable-xlarge/vs_dialog_red.9.png Binary files differnew file mode 100644 index 000000000..6c08d5a30 --- /dev/null +++ b/java/res/drawable-xlarge/vs_dialog_red.9.png diff --git a/java/res/drawable-xlarge/vs_dialog_yellow.9.png b/java/res/drawable-xlarge/vs_dialog_yellow.9.png Binary files differnew file mode 100644 index 000000000..2fb06c263 --- /dev/null +++ b/java/res/drawable-xlarge/vs_dialog_yellow.9.png diff --git a/java/res/drawable-xlarge/vs_popup_mic_edge.png b/java/res/drawable-xlarge/vs_popup_mic_edge.png Binary files differnew file mode 100644 index 000000000..4ff6337a2 --- /dev/null +++ b/java/res/drawable-xlarge/vs_popup_mic_edge.png diff --git a/java/res/drawable/background_voice.xml b/java/res/drawable/background_voice.xml new file mode 100644 index 000000000..3b6137df3 --- /dev/null +++ b/java/res/drawable/background_voice.xml @@ -0,0 +1,25 @@ +<?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. +*/ +--> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <gradient + android:startColor="#ff000000" + android:endColor="#ff000e29" + android:angle="90" /> +</shape>
\ No newline at end of file diff --git a/java/res/xml/popup_comma.xml b/java/res/drawable/btn_candidate.xml index 7666f4b62..b0c1c3038 100644 --- a/java/res/xml/popup_comma.xml +++ b/java/res/drawable/btn_candidate.xml @@ -18,22 +18,12 @@ */ --> -<Keyboard +<selector xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" > - <Row - android:rowEdgeFlags="top|bottom" - > - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="," - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> + <item + android:state_pressed="true" + android:drawable="@drawable/btn_candidate_pressed" /> + <item + android:drawable="@drawable/btn_candidate_normal" /> +</selector> diff --git a/java/res/xml/dictionary.xml b/java/res/drawable/btn_candidate_holo.xml index 7b770a8b4..66cd2460b 100644 --- a/java/res/xml/dictionary.xml +++ b/java/res/drawable/btn_candidate_holo.xml @@ -18,6 +18,10 @@ */ --> -<dictionary> - <part name = "main" /> -</dictionary>
\ No newline at end of file +<selector + xmlns:android="http://schemas.android.com/apk/res/android" +> + <item + android:state_pressed="true" + android:drawable="@drawable/btn_keyboard_key_popup_selected_holo" /> +</selector> diff --git a/java/res/drawable/btn_center.xml b/java/res/drawable/btn_center.xml new file mode 100644 index 000000000..9998b56e2 --- /dev/null +++ b/java/res/drawable/btn_center.xml @@ -0,0 +1,40 @@ +<?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. +*/ +--> + +<selector + xmlns:android="http://schemas.android.com/apk/res/android" + android:exitFadeDuration="@android:integer/config_mediumAnimTime"> + <item + android:state_window_focused="false" + android:state_enabled="true" + android:drawable="@drawable/btn_center_default" /> + <item + android:state_pressed="true" + android:drawable="@drawable/btn_center_pressed" /> + <item + android:state_focused="true" + android:state_enabled="true" + android:drawable="@drawable/btn_center_selected" /> + <item + android:state_enabled="true" + android:drawable="@drawable/btn_center_default" /> + <item + android:drawable="@drawable/btn_center_default" /> +</selector>
\ No newline at end of file diff --git a/java/res/drawable/btn_center_default.9.png b/java/res/drawable/btn_center_default.9.png Binary files differnew file mode 100755 index 000000000..d5ec36ba4 --- /dev/null +++ b/java/res/drawable/btn_center_default.9.png diff --git a/java/res/drawable/btn_center_pressed.9.png b/java/res/drawable/btn_center_pressed.9.png Binary files differnew file mode 100755 index 000000000..593a679d0 --- /dev/null +++ b/java/res/drawable/btn_center_pressed.9.png diff --git a/java/res/drawable/btn_center_selected.9.png b/java/res/drawable/btn_center_selected.9.png Binary files differnew file mode 100644 index 000000000..f1914a886 --- /dev/null +++ b/java/res/drawable/btn_center_selected.9.png diff --git a/java/res/drawable/btn_keyboard_key_honeycomb.xml b/java/res/drawable/btn_keyboard_key_honeycomb.xml new file mode 100644 index 000000000..3dab8430f --- /dev/null +++ b/java/res/drawable/btn_keyboard_key_honeycomb.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<!-- TODO: Remove "gingerbread" from file name and rename this to "btn_keyboard_key.xml". --> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + + <!-- Functional keys. --> + + <item android:state_single="true" android:state_pressed="true" + android:drawable="@drawable/btn_keyboard_key_dark_pressed_holo" /> + <item android:state_single="true" + android:drawable="@drawable/btn_keyboard_key_dark_normal_holo" /> + + <!-- Toggle keys. Use checkable/checked state. --> + + <item android:state_checkable="true" android:state_checked="true" android:state_pressed="true" + android:drawable="@drawable/btn_keyboard_key_dark_pressed_on_holo" /> + <item android:state_checkable="true" android:state_pressed="true" + android:drawable="@drawable/btn_keyboard_key_dark_pressed_off_holo" /> + <item android:state_checkable="true" android:state_checked="true" + android:drawable="@drawable/btn_keyboard_key_dark_normal_on_holo" /> + <item android:state_checkable="true" + android:drawable="@drawable/btn_keyboard_key_dark_normal_off_holo" /> + + <!-- Normal keys --> + + <item android:state_pressed="true" + android:drawable="@drawable/btn_keyboard_key_light_pressed_holo" /> + <item android:drawable="@drawable/btn_keyboard_key_light_normal_holo" /> +</selector> diff --git a/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml b/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml new file mode 100644 index 000000000..6c2713650 --- /dev/null +++ b/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" + android:drawable="@drawable/btn_keyboard_key_popup_selected_holo" /> +</selector> diff --git a/java/res/drawable/caution.png b/java/res/drawable/caution.png Binary files differnew file mode 100755 index 000000000..eaef53425 --- /dev/null +++ b/java/res/drawable/caution.png diff --git a/java/res/drawable/ic_subtype_keyboard_cs.png b/java/res/drawable/ic_subtype_keyboard_cs.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_cs.png diff --git a/java/res/drawable/ic_subtype_keyboard_da.png b/java/res/drawable/ic_subtype_keyboard_da.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_da.png diff --git a/java/res/drawable/ic_subtype_keyboard_de.png b/java/res/drawable/ic_subtype_keyboard_de.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_de.png diff --git a/java/res/drawable/ic_subtype_keyboard_en_gb.png b/java/res/drawable/ic_subtype_keyboard_en_gb.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_en_gb.png diff --git a/java/res/drawable/ic_subtype_keyboard_en_us.png b/java/res/drawable/ic_subtype_keyboard_en_us.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_en_us.png diff --git a/java/res/drawable/ic_subtype_keyboard_es.png b/java/res/drawable/ic_subtype_keyboard_es.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_es.png diff --git a/java/res/drawable/ic_subtype_keyboard_es_us.png b/java/res/drawable/ic_subtype_keyboard_es_us.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_es_us.png diff --git a/java/res/drawable/ic_subtype_keyboard_fr.png b/java/res/drawable/ic_subtype_keyboard_fr.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_fr.png diff --git a/java/res/drawable/ic_subtype_keyboard_fr_ca.png b/java/res/drawable/ic_subtype_keyboard_fr_ca.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_fr_ca.png diff --git a/java/res/drawable/ic_subtype_keyboard_fr_ch.png b/java/res/drawable/ic_subtype_keyboard_fr_ch.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_fr_ch.png diff --git a/java/res/drawable/ic_subtype_keyboard_it.png b/java/res/drawable/ic_subtype_keyboard_it.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_it.png diff --git a/java/res/drawable/ic_subtype_keyboard_nb.png b/java/res/drawable/ic_subtype_keyboard_nb.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_nb.png diff --git a/java/res/drawable/ic_subtype_keyboard_nl.png b/java/res/drawable/ic_subtype_keyboard_nl.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_nl.png diff --git a/java/res/drawable/ic_subtype_keyboard_ru.png b/java/res/drawable/ic_subtype_keyboard_ru.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_ru.png diff --git a/java/res/drawable/ic_subtype_keyboard_sr.png b/java/res/drawable/ic_subtype_keyboard_sr.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_sr.png diff --git a/java/res/drawable/ic_subtype_keyboard_sv.png b/java/res/drawable/ic_subtype_keyboard_sv.png Binary files differnew file mode 100644 index 000000000..001a38c5c --- /dev/null +++ b/java/res/drawable/ic_subtype_keyboard_sv.png diff --git a/java/res/drawable/ic_subtype_mic_cs.png b/java/res/drawable/ic_subtype_mic_cs.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_cs.png diff --git a/java/res/drawable/ic_subtype_mic_de.png b/java/res/drawable/ic_subtype_mic_de.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_de.png diff --git a/java/res/drawable/ic_subtype_mic_en_au.png b/java/res/drawable/ic_subtype_mic_en_au.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_en_au.png diff --git a/java/res/drawable/ic_subtype_mic_en_gb.png b/java/res/drawable/ic_subtype_mic_en_gb.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_en_gb.png diff --git a/java/res/drawable/ic_subtype_mic_en_in.png b/java/res/drawable/ic_subtype_mic_en_in.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_en_in.png diff --git a/java/res/drawable/ic_subtype_mic_en_nz.png b/java/res/drawable/ic_subtype_mic_en_nz.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_en_nz.png diff --git a/java/res/drawable/ic_subtype_mic_en_us.png b/java/res/drawable/ic_subtype_mic_en_us.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_en_us.png diff --git a/java/res/drawable/ic_subtype_mic_es.png b/java/res/drawable/ic_subtype_mic_es.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_es.png diff --git a/java/res/drawable/ic_subtype_mic_fr.png b/java/res/drawable/ic_subtype_mic_fr.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_fr.png diff --git a/java/res/drawable/ic_subtype_mic_it.png b/java/res/drawable/ic_subtype_mic_it.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_it.png diff --git a/java/res/drawable/ic_subtype_mic_ja.png b/java/res/drawable/ic_subtype_mic_ja.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_ja.png diff --git a/java/res/drawable/ic_subtype_mic_ko.png b/java/res/drawable/ic_subtype_mic_ko.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_ko.png diff --git a/java/res/drawable/ic_subtype_mic_nl.png b/java/res/drawable/ic_subtype_mic_nl.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_nl.png diff --git a/java/res/drawable/ic_subtype_mic_pl.png b/java/res/drawable/ic_subtype_mic_pl.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_pl.png diff --git a/java/res/drawable/ic_subtype_mic_pt.png b/java/res/drawable/ic_subtype_mic_pt.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_pt.png diff --git a/java/res/drawable/ic_subtype_mic_ru.png b/java/res/drawable/ic_subtype_mic_ru.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_ru.png diff --git a/java/res/drawable/ic_subtype_mic_tr.png b/java/res/drawable/ic_subtype_mic_tr.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_tr.png diff --git a/java/res/drawable/ic_subtype_mic_zh_cn.png b/java/res/drawable/ic_subtype_mic_zh_cn.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_zh_cn.png diff --git a/java/res/drawable/ic_subtype_mic_zh_tw.png b/java/res/drawable/ic_subtype_mic_zh_tw.png Binary files differnew file mode 100644 index 000000000..03c0b6982 --- /dev/null +++ b/java/res/drawable/ic_subtype_mic_zh_tw.png diff --git a/java/res/drawable/keyboard_key_feedback_honeycomb.xml b/java/res/drawable/keyboard_key_feedback_honeycomb.xml new file mode 100644 index 000000000..dd9b53e46 --- /dev/null +++ b/java/res/drawable/keyboard_key_feedback_honeycomb.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_long_pressable="true" + android:drawable="@drawable/keyboard_key_feedback_more_background" /> + <item android:drawable="@drawable/keyboard_key_feedback_background_holo" /> +</selector> diff --git a/java/res/drawable/mic_base.png b/java/res/drawable/mic_base.png Binary files differnew file mode 100644 index 000000000..53e29ff4b --- /dev/null +++ b/java/res/drawable/mic_base.png diff --git a/java/res/drawable/mic_full.png b/java/res/drawable/mic_full.png Binary files differnew file mode 100644 index 000000000..e3e3dfac3 --- /dev/null +++ b/java/res/drawable/mic_full.png diff --git a/java/res/drawable/mic_slash.png b/java/res/drawable/mic_slash.png Binary files differnew file mode 100644 index 000000000..1dd05c5b4 --- /dev/null +++ b/java/res/drawable/mic_slash.png diff --git a/java/res/drawable/vs_dialog_blue.9.png b/java/res/drawable/vs_dialog_blue.9.png Binary files differnew file mode 100644 index 000000000..cf27e8f43 --- /dev/null +++ b/java/res/drawable/vs_dialog_blue.9.png diff --git a/java/res/drawable/vs_dialog_red.9.png b/java/res/drawable/vs_dialog_red.9.png Binary files differnew file mode 100644 index 000000000..6c08d5a30 --- /dev/null +++ b/java/res/drawable/vs_dialog_red.9.png diff --git a/java/res/drawable/vs_dialog_yellow.9.png b/java/res/drawable/vs_dialog_yellow.9.png Binary files differnew file mode 100644 index 000000000..2fb06c263 --- /dev/null +++ b/java/res/drawable/vs_dialog_yellow.9.png diff --git a/java/res/drawable/vs_popup_mic_edge.png b/java/res/drawable/vs_popup_mic_edge.png Binary files differnew file mode 100644 index 000000000..4ff6337a2 --- /dev/null +++ b/java/res/drawable/vs_popup_mic_edge.png diff --git a/java/res/layout-xlarge/candidate.xml b/java/res/layout-xlarge/candidate.xml new file mode 100644 index 000000000..74532a1e2 --- /dev/null +++ b/java/res/layout-xlarge/candidate.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="@dimen/candidate_strip_height" + android:orientation="horizontal" + android:paddingRight="@dimen/candidate_padding" +> + <ImageView + android:id="@+id/candidate_divider" + android:layout_width="wrap_content" + android:layout_height="@dimen/candidate_strip_height" + android:visibility="gone" + android:focusable="false" + android:clickable="false" + android:src="@drawable/keyboard_suggest_strip_divider" + android:gravity="center_vertical|center_horizontal" /> + <Button + android:id="@+id/candidate_word" + android:layout_width="wrap_content" + android:layout_height="@dimen/candidate_strip_height" + android:minWidth="@dimen/candidate_min_width" + android:textSize="@dimen/candidate_text_size" + android:textColor="@color/candidate_normal" + android:background="@drawable/btn_candidate_holo" + android:focusable="true" + android:clickable="true" + android:gravity="center_vertical|center_horizontal" + android:paddingLeft="@dimen/candidate_padding" /> + <TextView + android:id="@+id/candidate_debug_info" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:visibility="gone" + android:textSize="10dip" + android:textColor="#ff808080" + android:focusable="false" + android:clickable="false" + android:gravity="bottom" + android:paddingLeft="4dip" /> +</LinearLayout> diff --git a/java/res/xml/popup_slash.xml b/java/res/layout-xlarge/candidate_preview.xml index a38fde0e4..61d5f8e7b 100644 --- a/java/res/xml/popup_slash.xml +++ b/java/res/layout-xlarge/candidate_preview.xml @@ -18,22 +18,12 @@ */ --> -<Keyboard +<TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top|bottom" - > - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="/" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="18sp" + android:textColor="?android:attr/textColorPrimaryInverse" + android:minWidth="32dip" + android:gravity="center" + android:background="@drawable/keyboard_popup_panel_background_holo" /> diff --git a/java/res/layout-xlarge/candidates.xml b/java/res/layout-xlarge/candidates.xml new file mode 100644 index 000000000..e2ddb84b1 --- /dev/null +++ b/java/res/layout-xlarge/candidates.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="@dimen/candidate_strip_height" + android:background="@drawable/keyboard_suggest_strip_holo" + android:paddingRight="@dimen/candidate_strip_padding" + android:paddingLeft="@dimen/candidate_strip_padding" +> + <HorizontalScrollView + android:id="@+id/candidates_scroll_view" + android:layout_width="wrap_content" + android:layout_height="@dimen/candidate_strip_height" + android:fadingEdge="horizontal" + android:fadingEdgeLength="@dimen/candidate_strip_fading_edge_length" + android:scrollbars="none" + > + <com.android.inputmethod.latin.CandidateView + android:id="@+id/candidates" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="@dimen/candidate_strip_height" + android:background="@drawable/keyboard_suggest_strip_holo" /> + </HorizontalScrollView> +</LinearLayout> diff --git a/java/res/layout-xlarge/keyboard_popup_honeycomb.xml b/java/res/layout-xlarge/keyboard_popup_honeycomb.xml new file mode 100644 index 000000000..0b8229ca5 --- /dev/null +++ b/java/res/layout-xlarge/keyboard_popup_honeycomb.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:background="@drawable/keyboard_popup_panel_background_holo" + android:paddingLeft="40dip" + android:paddingRight="40dip" + > + <com.android.inputmethod.keyboard.KeyboardView + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + android:id="@+id/KeyboardView" + android:layout_alignParentBottom="true" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/latinkeyboard_transparent" + + latin:keyBackground="@drawable/btn_keyboard_key_honeycomb_popup" + latin:keyHysteresisDistance="0dip" + latin:verticalCorrection="@dimen/mini_keyboard_vertical_correction" + /> +</LinearLayout> diff --git a/java/res/layout/candidate.xml b/java/res/layout/candidate.xml new file mode 100644 index 000000000..f2c4126b3 --- /dev/null +++ b/java/res/layout/candidate.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="@dimen/candidate_strip_height" + android:orientation="horizontal" + android:paddingRight="@dimen/candidate_padding" +> + <ImageView + android:id="@+id/candidate_divider" + android:layout_width="wrap_content" + android:layout_height="@dimen/candidate_strip_height" + android:visibility="gone" + android:focusable="false" + android:clickable="false" + android:src="@drawable/keyboard_suggest_strip_divider" + android:gravity="center_vertical|center_horizontal" /> + <Button + android:id="@+id/candidate_word" + android:layout_width="wrap_content" + android:layout_height="@dimen/candidate_strip_height" + android:minWidth="@dimen/candidate_min_width" + android:textSize="@dimen/candidate_text_size" + android:textColor="@color/candidate_normal" + android:background="@drawable/btn_candidate" + android:focusable="true" + android:clickable="true" + android:gravity="center_vertical|center_horizontal" + android:paddingLeft="@dimen/candidate_padding" /> + <TextView + android:id="@+id/candidate_debug_info" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:visibility="gone" + android:textSize="10dip" + android:textColor="#ff808080" + android:focusable="false" + android:clickable="false" + android:gravity="bottom" + android:paddingLeft="4dip" /> +</LinearLayout> diff --git a/java/res/layout/candidates.xml b/java/res/layout/candidates.xml index b89d44290..1b8d04183 100644 --- a/java/res/layout/candidates.xml +++ b/java/res/layout/candidates.xml @@ -1,38 +1,45 @@ <?xml version="1.0" encoding="utf-8"?> <!-- -/* +/* ** -** Copyright 2008, The Android Open Source Project +** Copyright 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 +** 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. */ --> <LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="horizontal" - android:layout_width="match_parent" - android:layout_height="@dimen/candidate_strip_height" - android:background="@drawable/keyboard_suggest_strip" - > - - <com.android.inputmethod.latin.CandidateView - android:id="@+id/candidates" + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="@dimen/candidate_strip_height" + android:background="@drawable/keyboard_suggest_strip" + android:paddingRight="@dimen/candidate_strip_padding" + android:paddingLeft="@dimen/candidate_strip_padding" +> + <HorizontalScrollView + android:id="@+id/candidates_scroll_view" android:layout_width="wrap_content" android:layout_height="@dimen/candidate_strip_height" - android:layout_weight="1" android:fadingEdge="horizontal" android:fadingEdgeLength="@dimen/candidate_strip_fading_edge_length" - /> - + android:scrollbars="none" + > + <com.android.inputmethod.latin.CandidateView + android:id="@+id/candidates" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="@dimen/candidate_strip_height" + android:background="@drawable/keyboard_suggest_strip" /> + </HorizontalScrollView> </LinearLayout> diff --git a/java/res/layout/input_basic.xml b/java/res/layout/input_basic.xml index 168eba691..7b85bae94 100644 --- a/java/res/layout/input_basic.xml +++ b/java/res/layout/input_basic.xml @@ -18,7 +18,7 @@ */ --> -<com.android.inputmethod.latin.LatinKeyboardView +<com.android.inputmethod.keyboard.LatinKeyboardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" android:id="@+id/LatinkeyboardBaseView" diff --git a/java/res/layout/input_basic_highcontrast.xml b/java/res/layout/input_basic_highcontrast.xml index 19ff1db11..d9200fd5e 100644 --- a/java/res/layout/input_basic_highcontrast.xml +++ b/java/res/layout/input_basic_highcontrast.xml @@ -18,7 +18,7 @@ */ --> -<com.android.inputmethod.latin.LatinKeyboardView +<com.android.inputmethod.keyboard.LatinKeyboardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" diff --git a/java/res/layout/input_gingerbread.xml b/java/res/layout/input_gingerbread.xml index 73cf0a3fa..6233e6dc6 100644 --- a/java/res/layout/input_gingerbread.xml +++ b/java/res/layout/input_gingerbread.xml @@ -18,17 +18,17 @@ */ --> -<com.android.inputmethod.latin.LatinKeyboardView +<com.android.inputmethod.keyboard.LatinKeyboardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" android:id="@+id/LatinkeyboardBaseView" android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingTop="@dimen/keyboard_top_padding" android:paddingBottom="@dimen/keyboard_bottom_padding" android:background="@drawable/keyboard_dark_background" - android:textStyle="bold" latin:keyBackground="@drawable/btn_keyboard_key_gingerbread" - latin:keyTextStyle="bold" + latin:keyLetterStyle="bold" /> diff --git a/java/res/layout/input_honeycomb.xml b/java/res/layout/input_honeycomb.xml new file mode 100644 index 000000000..6ccc63c2b --- /dev/null +++ b/java/res/layout/input_honeycomb.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<com.android.inputmethod.keyboard.LatinKeyboardView + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + android:id="@+id/LatinkeyboardBaseView" + android:layout_alignParentBottom="true" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="@dimen/keyboard_top_padding" + android:paddingBottom="@dimen/keyboard_bottom_padding" + android:background="@drawable/keyboard_background_holo" + + latin:keyBackground="@drawable/btn_keyboard_key_honeycomb" + latin:keyPreviewLayout="@layout/key_preview_honeycomb" + latin:popupLayout="@layout/keyboard_popup_honeycomb" + latin:keyTextColorDisabled="#FF63666D" + latin:keyLetterStyle="bold" + latin:shadowColor="#00000000" + latin:shadowRadius="0.0" + /> diff --git a/java/res/layout/input_stone_bold.xml b/java/res/layout/input_stone_bold.xml index e3588bb22..bf25e1597 100644 --- a/java/res/layout/input_stone_bold.xml +++ b/java/res/layout/input_stone_bold.xml @@ -18,7 +18,7 @@ */ --> -<com.android.inputmethod.latin.LatinKeyboardView +<com.android.inputmethod.keyboard.LatinKeyboardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" android:id="@+id/LatinkeyboardBaseView" @@ -26,12 +26,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/keyboard_background" - android:textStyle="bold" latin:keyBackground="@drawable/btn_keyboard_key_stone" latin:keyTextColor="@color/latinkeyboard_key_color_black" latin:shadowColor="@color/latinkeyboard_key_color_white" - latin:keyTextStyle="bold" - latin:symbolColorScheme="black" + latin:keyLetterStyle="bold" + latin:colorScheme="black" latin:popupLayout="@layout/input_stone_popup" /> diff --git a/java/res/layout/input_stone_normal.xml b/java/res/layout/input_stone_normal.xml index fd7bf85fc..cf4708612 100644 --- a/java/res/layout/input_stone_normal.xml +++ b/java/res/layout/input_stone_normal.xml @@ -18,7 +18,7 @@ */ --> -<com.android.inputmethod.latin.LatinKeyboardView +<com.android.inputmethod.keyboard.LatinKeyboardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" android:id="@+id/LatinkeyboardBaseView" @@ -30,6 +30,6 @@ latin:keyBackground="@drawable/btn_keyboard_key_stone" latin:keyTextColor="@color/latinkeyboard_key_color_black" latin:shadowColor="@color/latinkeyboard_key_color_white" - latin:symbolColorScheme="black" + latin:colorScheme="black" latin:popupLayout="@layout/input_stone_popup" /> diff --git a/java/res/layout/input_stone_popup.xml b/java/res/layout/input_stone_popup.xml index f159625f7..b4da04536 100644 --- a/java/res/layout/input_stone_popup.xml +++ b/java/res/layout/input_stone_popup.xml @@ -25,9 +25,9 @@ android:orientation="horizontal" android:background="@drawable/keyboard_popup_panel_background" > - <com.android.inputmethod.latin.LatinKeyboardBaseView + <com.android.inputmethod.keyboard.KeyboardView xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - android:id="@+id/LatinKeyboardBaseView" + android:id="@+id/KeyboardView" android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" diff --git a/java/res/layout/key_preview_honeycomb.xml b/java/res/layout/key_preview_honeycomb.xml new file mode 100644 index 000000000..a90fe5588 --- /dev/null +++ b/java/res/layout/key_preview_honeycomb.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="80sp" + android:textSize="40sp" + android:textColor="@color/latinkeyboard_key_color_white" + android:minWidth="24dip" + android:gravity="center" + android:background="@drawable/keyboard_key_feedback_honeycomb" + /> diff --git a/java/res/layout/keyboard_popup.xml b/java/res/layout/keyboard_popup.xml index 9ecbcd4e9..ac8134bfb 100644 --- a/java/res/layout/keyboard_popup.xml +++ b/java/res/layout/keyboard_popup.xml @@ -26,9 +26,9 @@ android:paddingLeft="16dip" android:paddingRight="16dip" > - <com.android.inputmethod.latin.LatinKeyboardBaseView + <com.android.inputmethod.keyboard.KeyboardView xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - android:id="@+id/LatinKeyboardBaseView" + android:id="@+id/KeyboardView" android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" diff --git a/java/res/layout/keyboard_popup_honeycomb.xml b/java/res/layout/keyboard_popup_honeycomb.xml new file mode 100644 index 000000000..e5fcbd44c --- /dev/null +++ b/java/res/layout/keyboard_popup_honeycomb.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:background="@drawable/keyboard_popup_panel_background_holo" + android:paddingLeft="24dip" + android:paddingRight="24dip" + > + <com.android.inputmethod.keyboard.KeyboardView + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + android:id="@+id/KeyboardView" + android:layout_alignParentBottom="true" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/latinkeyboard_transparent" + + latin:keyBackground="@drawable/btn_keyboard_key_honeycomb_popup" + latin:keyHysteresisDistance="0dip" + latin:verticalCorrection="@dimen/mini_keyboard_vertical_correction" + /> +</LinearLayout> diff --git a/java/res/layout/recognition_status.xml b/java/res/layout/recognition_status.xml index 49af77360..9474d6f58 100644 --- a/java/res/layout/recognition_status.xml +++ b/java/res/layout/recognition_status.xml @@ -16,83 +16,86 @@ ** See the License for the specific language governing permissions and ** limitations under the License. */ ---> - - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:background="@android:color/black" - android:paddingBottom="0dip" - android:paddingLeft="0dip" - android:paddingRight="0dip" -> - - <LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/main_image" - android:orientation="vertical" - android:background="@drawable/voice_ime_background" - android:scaleType="fitXY" - android:layout_width="match_parent" - android:layout_height="180dip" - android:paddingBottom="2dip" - android:paddingTop="2dip" - > - - <TextView android:id="@+id/text" - android:text="@string/voice_initializing" +--> +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_marginTop="15dip" - android:textSize="28sp" - android:textColor="#ffffff" - android:layout_gravity="center_horizontal" - /> - - <ImageView android:id="@+id/image" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_marginTop="20dip" - android:layout_gravity="center_horizontal" - android:src="@drawable/mic_slash" - /> - - <ProgressBar android:id="@+id/progress" - android:layout_height="60dip" - android:layout_width="60dip" - android:layout_gravity="center" - android:visibility="gone" - android:indeterminate="true" - android:indeterminateOnly="false" - /> - - - - </LinearLayout> - - <LinearLayout android:id="@+id/button" - android:orientation="vertical" - android:background="@drawable/ok_cancel" - android:scaleType="fitXY" android:layout_width="match_parent" - android:layout_height="42dip" - android:paddingLeft="1dip" - android:paddingRight="1dip" - > - - <TextView android:id="@+id/button_text" - android:text="@string/cancel" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_marginTop="7dip" - android:textSize="19sp" - android:textColor="#ffffff" - android:layout_gravity="center_horizontal" - /> + android:background="@drawable/background_voice"> + <LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/popup_layout" + android:orientation="vertical" + android:layout_height="371dip" + android:layout_width="500dip" + android:layout_centerInParent="true" + android:background="@drawable/vs_dialog_red"> + <TextView + android:id="@+id/text" + android:text="@string/voice_error" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:singleLine="true" + android:layout_marginTop="10dip" + android:textSize="28sp" + android:textColor="#ffffff" + android:layout_gravity="center" + android:visibility="invisible"/> + <RelativeLayout + android:layout_height="0dip" + android:layout_width="match_parent" + android:layout_weight="1.0"> + <com.android.inputmethod.voice.SoundIndicator + android:id="@+id/sound_indicator" + android:src="@drawable/mic_full" + android:background="@drawable/mic_base" + android:adjustViewBounds="true" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_centerInParent="true" + android:visibility="gone"/> + <ImageView + android:id="@+id/image" + android:src="@drawable/mic_slash" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_centerInParent="true" + android:visibility="visible"/> + <ProgressBar + android:id="@+id/progress" + android:indeterminate="true" + android:indeterminateOnly="false" + android:layout_height="60dip" + android:layout_width="60dip" + android:layout_centerInParent="true" + android:visibility="gone"/> + </RelativeLayout> + <!-- + The text is set by the code. We specify a random text (voice_error), so the + text view does not have a zero height. This is necessary to keep the slash + mic and the recording mic is the same position + --> + <TextView + android:id="@+id/language" + android:text="@string/voice_error" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:singleLine="true" + android:textSize="14sp" + android:layout_marginBottom="3dip" + android:layout_gravity="center" + android:textColor="#ffffff" + android:visibility="invisible"/> + <Button + android:id="@+id/button" + android:layout_width="match_parent" + android:layout_height="54dip" + android:singleLine="true" + android:focusable="true" + android:text="@string/cancel" + android:layout_gravity="center_horizontal" + android:background="@drawable/btn_center" + android:textColor="#ffffff" + android:textSize="19sp" /> </LinearLayout> - -</LinearLayout> - +</RelativeLayout> diff --git a/java/res/raw/main.dict b/java/res/raw/main.dict Binary files differindex a456cf3d3..a456cf3d3 100755..100644 --- a/java/res/raw/main.dict +++ b/java/res/raw/main.dict diff --git a/java/res/raw/type3.ogg b/java/res/raw/type3.ogg Binary files differindex 20e670807..20e670807 100755..100644 --- a/java/res/raw/type3.ogg +++ b/java/res/raw/type3.ogg diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml index 89b5ef365..df7710cc1 100644 --- a/java/res/values-ar/strings.xml +++ b/java/res/values-ar/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"اهتزاز عند الضغط على مفتاح"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"صوت عند الضغط على مفتاح"</string> <string name="popup_on_keypress" msgid="123894815723512944">"انبثاق عند الضغط على المفاتيح"</string> - <string name="hit_correction" msgid="4855351009261318389">"تصحيح أخطاء الكتابة"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"تمكين تصحيح خطأ الإدخال"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"أخطاء في الإدخال الأفقي"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"تمكين تصحيح خطأ الإدخال"</string> - <string name="auto_correction" msgid="7911639788808958255">"اقتراحات الكلمات"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"تصحيح الكلمة السابقة تلقائيًا"</string> - <string name="prediction" msgid="466220283138359837">"اقتراحات الكلمات"</string> - <string name="prediction_category" msgid="7027100625580696660">"إعدادات اقتراحات الكلمات"</string> - <string name="prediction_summary" msgid="459788228830873110">"تمكين الإكمال التلقائي أثناء الكتابة"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"إكمال تلقائي"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"زيادة حجم الحقل النصي"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"إخفاء اقتراحات الكلمات في طريقة العرض الأفقية"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"إعدادات اقتراحات الكلمات"</string> <string name="auto_cap" msgid="1719746674854628252">"استخدام الأحرف الكبيرة تلقائيًا"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"استخدام الأحرف الكبيرة في بداية الجملة"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"ترقيم تلقائي"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"إصلاحات سريعة"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"تصحيح الأخطاء المكتوبة الشائعة"</string> - <string name="show_suggestions" msgid="507074425254289133">"عرض الاقتراحات"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"عرض الكلمات المقترحة أثناء الكتابة"</string> - <string name="auto_complete" msgid="1103196318775486023">"إكمال تلقائي"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"مفتاح المسافة والترقيم لإدخال كلمة محددة تلقائيًا"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"التصحيح التلقائي"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"مسافة وترقيم لإدخال كلمة محددة تلقائيا"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"إيقاف"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"معتدل"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"حاد"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"اقتراحات ثنائية"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"استخدام الكلمة السابقة لتحسين الاقتراح"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"لا شيء"</item> - <item msgid="1669461741568287396">"أساسي"</item> - <item msgid="4894328801530136615">"متقدم"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : تم الحفظ"</string> - <string name="tip_long_press" msgid="6101270866284343344">"اضغط باستمرار على أحد المفاتيح لأسفل لمشاهدة علامات التشكيل"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"اضغط على مفتاح الرجوع ↶ لإغلاق لوحة المفاتيح في أي نقطة"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"الدخول إلى الأرقام والرموز"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"اضغط مع الاستمرار على أقصى يمين الكلمة لإضافتها إلى القاموس"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"المس هذا التلميح للمتابعة »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"المس هنا لإغلاق هذا التلميح وبدء الكتابة!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"تفتح لوحة المفاتيح في أي وقت تلمس فيه حقلًا نصيًا"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"المس مع الاستمرار أحد المفاتيح لعرض علامات التشكيل"\n"(ø, ö, ô, ó, وهكذا)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"التبديل إلى الأرقام والرموز من خلال لمس هذا الزر"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"يمكنك الرجوع إلى الأحرف من خلال لمس هذا المفتاح مرة أخرى"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"المس هذا المفتاح مع الاستمرار لتغيير إعدادات لوحة المفاتيح، مثل الإكمال التلقائي"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"جربه!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"تنفيذ"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ب ت ث"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"الإدخال الصوتي"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"الإدخال الصوتي غير معتمد حاليًا للغتك، ولكنه يعمل باللغة الإنجليزية."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"الإدخال الصوتي هو ميزة تجريبية تستخدم التعرف على الكلام المتصل في Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"لتشغيل الإدخال الصوتي، انتقل إلى إعدادات لوحة المفاتيح."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"لاستخدام الإدخال الصوتي، اضغط على زر الميكروفون أو مرر إصبعك عبر لوحة المفاتيح على الشاشة."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"الإدخال الصوتي هو ميزة تجريبية تستخدم التعرف على الكلام المتصل في Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"لتشغيل الإدخال الصوتي، انتقل إلى إعدادات لوحة المفاتيح."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"لاستخدام الإدخال الصوتي، اضغط على زر الميكروفون أو مرر إصبعك عبر لوحة المفاتيح على الشاشة."</string> <string name="voice_listening" msgid="467518160751321844">"تحدث الآن"</string> <string name="voice_working" msgid="6666937792815731889">"العمل"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"إلغاء"</string> <string name="ok" msgid="7898366843681727667">"موافق"</string> <string name="voice_input" msgid="2466640768843347841">"الإدخال الصوتي"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"في لوحة المفاتيح الرئيسية"</item> - <item msgid="8529385602829095903">"على لوحة مفاتيح الرموز"</item> - <item msgid="7283103513488381103">"إيقاف"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"الميكروفون في لوحة المفاتيح الرئيسية"</item> - <item msgid="6907837061058876770">"الميكروفون على لوحة مفاتيح الرموز"</item> - <item msgid="3664304608587798036">"تم تعطيل الإدخال الصوتي"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"إرسال تلقائي بعد الصوت"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"الضغط تلقائيًا على المفتاح enter عند البحث أو الانتقال إلى الحقل التالي."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"افتح لوحة المفاتيح"\n</b></font><font size="3">\n</font>"المس أي حقل نصي."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"إغلاق لوحة المفاتيح"\n</b></font><font size="3">\n</font>"اضغط على المفتاح \"رجوع\"."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"المس أحد مفاتيح الخيارات مع الاستمرار"\n</b></font><font size="3">\n</font>"الدخول إلى الترقيم والحركات."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"إعدادات لوحة المفاتيح"\n</b></font><font size="3">\n</font>"المس مع الاستمرار المفتاح "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">"com."</string> - <string name="popular_domain_1" msgid="1370572248164278467">"net."</string> - <string name="popular_domain_2" msgid="3036812463748402878">"org."</string> - <string name="popular_domain_3" msgid="8718639560809452028">"gov."</string> - <string name="popular_domain_4" msgid="35359437471311470">"edu."</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"لوحة مفاتيح رئيسية"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"لوحة مفاتيح الرموز"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"إيقاف"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"ميكروفون على لوحة مفاتيح رئيسية"</string> + <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="language_selection_title" msgid="1651299598555326750">"لغات الإدخال"</string> <string name="language_selection_summary" msgid="187110938289512256">"مرر إصبعك على مفتاح المسافة لتغيير اللغة"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"تمكين ملاحظات المستخدم"</string> <string name="prefs_description_log" msgid="5827825607258246003">"المساعدة في تحسين محرر طريقة الإرسال هذا من خلال إرسال إحصاءات الاستخدام وتقارير الأعطال تلقائيًا إلى Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"المس لتصحيح الكلمات"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"المس الكلمات المدخلة لتصحيحها"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"المس الكلمات المدخلة لتصحيحها"</string> <string name="keyboard_layout" msgid="437433231038683666">"مظهر لوحة المفاتيح"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"لوحة مفاتيح"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"صوت"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"لوحة مفاتيح تشيكية"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"لوحة مفاتيح دانماركية"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"لوحة مفاتيح ألمانية"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"لوحة مفاتيح إنجليزية (بريطانيا العظمى)"</string> + <!-- outdated translation 2979257184475020604 --> <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_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"لوحة مفاتيح فرنسية"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_ru_keyboard" msgid="1383995915064277943">"لوحة مفاتيح روسية"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"لوحة مفاتيح صربية"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"لوحة مفاتيح سويدية"</string> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"صوت تشيكي"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"صوت ألماني"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"صوت إنجليزي (أستراليا)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"صوت إنجليزي (بريطانيا العظمى)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"صوت إنجليزي (الهند)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"صوت إنجليزي (نيوزلندا)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"صوت إنجليزي (الولايات المتحدة)"</string> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"صوت صيني (الصين)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"صوت صيني (تايوان)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml index 83cfaac3a..00beb7953 100644 --- a/java/res/values-bg/strings.xml +++ b/java/res/values-bg/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Да вибрира при натискане на клавиш"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натискане на клавиш"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Изскачащ прозорец при натискане на клавиш"</string> - <string name="hit_correction" msgid="4855351009261318389">"Коригиране на грешките при въвеждане"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Активиране на корекция на грешки при въвеждане"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Грешки при въвеждане в хоризонтален изглед"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Активиране на корекция на грешки при въвеждане"</string> - <string name="auto_correction" msgid="7911639788808958255">"Предложения на думи"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Автоматично коригиране на предишната дума"</string> - <string name="prediction" msgid="466220283138359837">"Предложения на думи"</string> - <string name="prediction_category" msgid="7027100625580696660">"Настройки за предложения на думи"</string> - <string name="prediction_summary" msgid="459788228830873110">"Активиране на автодовършване, докато пишете"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Автодовършване"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Размерът на текстовото поле да се увеличи"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Скриване на предложенията на думи в хоризонтален изглед"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Настройки за предложения на думи"</string> <string name="auto_cap" msgid="1719746674854628252">"Автоматично поставяне на главни букви"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Поставя главна буква в началото на изреченията"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Автоматично поставяне на пунктуация"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Бързи корекции"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Коригира най-честите грешки при въвеждане"</string> - <string name="show_suggestions" msgid="507074425254289133">"Показване на предложения"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Показване на предложения, докато пишете"</string> - <string name="auto_complete" msgid="1103196318775486023">"Автоматично завършване"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Клавишът за интервал и пунктуация поставя автоматично откроена дума"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Автомат. корекция"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Интервалът и пунктуацията автоматично вмъкват откроената дума"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Изкл."</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умерено"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Агресивно"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Предложения за биграми"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Използване на предишната дума за подобряване на предложението"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Няма"</item> - <item msgid="1669461741568287396">"Основен"</item> - <item msgid="4894328801530136615">"Разширени"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Запазено"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Задръжте клавиша, за да видите ударенията (ø, ö и т.н.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Натиснете клавиша „Назад“ ↶, за да затворите клавиатурата във всяка една точка"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Достъп до номера и символи"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Натиснете и задръжте върху най-лявата дума, за да я добавите към речника"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Докоснете съвета, за да продължите »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Докоснете тук, за да затворите този съвет и да започнете да пишете!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Клавиатурата се отваря при всяко докосване на текстово поле"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Докоснете и задръжте клавиша, за да видите ударенията"\n"(ø, ö, ô, ó и т.н.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Докосването на този клавиш води до преминаване към цифри и символи"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Върнете се към използване на букви чрез повторно докосване на този клавиш"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Докоснете и задръжте клавиша за промяна на настройките на клавиатурата, напр. автодовършване"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Пробвайте!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Старт"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"АБВГ"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Гласово въвеждане"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"За вашия език понастоящем не се поддържа гласово въвеждане, но можете да го използвате на английски."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Гласовото въвеждане е експериментална функция, използваща разпознаването на реч в мрежата на Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"За да изключите гласовото въвеждане, отворете настройките на клавиатурата."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"За да използвате гласово въвеждане, натиснете бутона на микрофона или плъзнете пръст през екранната клавиатура."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовото въвеждане е експериментална функция, използваща разпознаването на реч в мрежата на Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"За да изключите гласовото въвеждане, отворете настройките на клавиатурата."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"За да използвате гласово въвеждане, натиснете бутона на микрофона или плъзнете пръст през екранната клавиатура."</string> <string name="voice_listening" msgid="467518160751321844">"Говорете сега"</string> <string name="voice_working" msgid="6666937792815731889">"Обработва се"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Отказ"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Гласово въвеждане"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"На основната клавиатура"</item> - <item msgid="8529385602829095903">"На клавиатурата на символите"</item> - <item msgid="7283103513488381103">"Изкл."</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Микрофон на основната клавиатура"</item> - <item msgid="6907837061058876770">"Микрофон на клавиатурата на символите"</item> - <item msgid="3664304608587798036">"Гласовото въвеждане е деактивирано"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Автоматично изпращане след глас"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Да се натиска автоматично „Enter“ при търсене или преминаване към следващото поле."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Отворете клавиатурата"\n</b></font><font size="3">\n</font>"Докоснете текстово поле."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Затваряне на клавиатурата"\n</b></font><font size="3">\n</font>"Натиснете клавиша „Назад“."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Докоснете и задръжте клавиш за опции"\n</b></font><font size="3">\n</font>"Използвайте пунктуация и акценти."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Настройки на клавиатурата"\n</b></font><font size="3">\n</font>"Докоснете и задръжте клавиша "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На осн. клавиатура"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На клав. на симв."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Изкл."</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Микр. на осн. клав."</string> + <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="language_selection_title" msgid="1651299598555326750">"Входни езици"</string> <string name="language_selection_summary" msgid="187110938289512256">"Плъзнете пръст по клавиша за интервал за промяна на езика"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Активиране на отзивите от потребителите"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Помогнете за подобряването на този редактор за въвеждане чрез автоматично изпращане до Google на статистически данни за употребата и сигнали за сривове."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Докоснете, за да поправите думите"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Докоснете въведените думи, за да ги поправите"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Докоснете въведените думи, за да ги поправите"</string> <string name="keyboard_layout" msgid="437433231038683666">"Тема на клавиатурата"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"клавиатура"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"гласово"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"чешка клавиатура"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"датска клавиатура"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"немска клавиатура"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"английска (Великобритания) клавиатура"</string> + <!-- outdated translation 2979257184475020604 --> <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_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"френска клавиатура"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_ru_keyboard" msgid="1383995915064277943">"руска клавиатура"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"сръбска клавиатура"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"шведска клавиатура"</string> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"чешки, гласово"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"немски, гласово"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"английски (Австралия), гласово"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"английски (Великобритания), гласово"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"английски (Индия), гласово"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"английски (Нова Зеландия), гласово"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"английски (САЩ), гласово"</string> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"китайски (Китай), гласово"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"китайски (Тайван), гласово"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml index e143dfb4f..0b9851d14 100644 --- a/java/res/values-ca/strings.xml +++ b/java/res/values-ca/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Corregeix els errors ortogràfics"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Activa la correcció d\'errors d\'entrada"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Errors d\'entrada en horitzontal"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activa la correcció d\'errors d\'entrada"</string> - <string name="auto_correction" msgid="7911639788808958255">"Suggeriments de paraules"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corregeix automàticament la paraula anterior"</string> - <string name="prediction" msgid="466220283138359837">"Suggeriments de paraules"</string> - <string name="prediction_category" msgid="7027100625580696660">"Configuració de suggeriment de paraules"</string> - <string name="prediction_summary" msgid="459788228830873110">"Activa l\'emplenament automàtic mentre s\'escriu"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Emplenament automàtic"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Augmenta la mida del camp de text"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Oculta els suggeriments de paraules en visualització horitzontal"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Configuració de suggeriment de paraules"</string> <string name="auto_cap" msgid="1719746674854628252">"Majúscules automàtiques"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Posa l\'inici d\'una frase en majúscula"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Puntuació automàtica"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Mostra els suggeriments"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Visualitza paraules suggerides mentre s\'escriu"</string> - <string name="auto_complete" msgid="1103196318775486023">"Emplenament automàtic"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"La barra espaiadora i la puntuació insereixen automàticament la paraula ressaltada"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Correcció automàtica"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"B. esp. i punt. ins. aut. par ress."</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactiva"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderada"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Estricta"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Suggeriments Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilitza la paraula anterior per millorar el suggeriment"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Cap"</item> - <item msgid="1669461741568287396">"Bàsic"</item> - <item msgid="4894328801530136615">"Avançat"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: desada"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Manteniu una tecla premuda per veure\'n les variants (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Premeu la tecla Enrere ↶ per tancar el teclat en qualsevol moment"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Accedeix a números i símbols"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Manteniu premuda la paraula de l\'extrem esquerre per afegir-la al diccionari"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Toqueu aquest suggeriment per continuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Toqueu aquí per tancar aquest suggeriment i començar a escriure."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"S\'obre el teclat cada vegada que toqueu un camp de text"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Manteniu premuda una tecla per veure\'n les variants"\n"(ø, ö, ô, ó, etc.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Toqueu aquesta tecla per canviar als números i als símbols"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Torneu a tocar aquesta tecla per tornar a les lletres"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Manteniu premuda aquesta tecla per canviar la configuració del teclat, com ara l\'emplenament automàtic"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Proveu-ho!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Vés"</string> <string name="label_next_key" msgid="362972844525672568">"Següent"</string> <string name="label_done_key" msgid="2441578748772529288">"Fet"</string> <string name="label_send_key" msgid="2815056534433717444">"Envia"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada de veu"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualment, l\'entrada de veu no és compatible amb el vostre idioma, però funciona en anglès."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"L\'entrada de veu és una funció experimental que utilitza el reconeixement de la parla en xarxa de Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Per desactivar l\'entada de veu, aneu a la configuració del teclat."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Per utilitzar l\'entrada de veu, premeu el botó del micròfon o feu lliscar el dit pel teclat en pantalla."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'entrada de veu és una funció experimental que utilitza el reconeixement de la parla en xarxa de Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per desactivar l\'entada de veu, aneu a la configuració del teclat."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Per utilitzar l\'entrada de veu, premeu el botó del micròfon o feu lliscar el dit pel teclat en pantalla."</string> <string name="voice_listening" msgid="467518160751321844">"Parleu ara"</string> <string name="voice_working" msgid="6666937792815731889">"S\'està treballant"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancel·la"</string> <string name="ok" msgid="7898366843681727667">"D\'acord"</string> <string name="voice_input" msgid="2466640768843347841">"Entrada de veu"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Al teclat principal"</item> - <item msgid="8529385602829095903">"Al teclat de símbols"</item> - <item msgid="7283103513488381103">"Desactivat"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Micròfon al teclat principal"</item> - <item msgid="6907837061058876770">"Micròfon al teclat de símbols"</item> - <item msgid="3664304608587798036">"L\'entrada de veu està desactivada"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Enviament automàtic després de la veu"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Prem automàticament Retorn en cercar o en anar al camp següent."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Obrir el teclat"\n</b></font><font size="3">\n</font>"Toqueu qualsevol camp de text."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tancar el teclat"\n</b></font><font size="3">\n</font>"Premeu la tecla Enrere."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Manteniu premuda una tecla per veure les opcions"\n</b></font><font size="3">\n</font>"Accediu a la puntuació i als accents."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Configuració del teclat"\n</b></font><font size="3">\n</font>"Manteniu premuda la tecla "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Al teclat principal"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Al tecl. de símb."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Desactivada"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micr. a tecl. princ."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micr. a 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="language_selection_title" msgid="1651299598555326750">"Idiomes d\'entrada"</string> <string name="language_selection_summary" msgid="187110938289512256">"Feu lliscar el dit a la barra espaiadora per canviar l\'idioma"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Activa els comentaris de l\'usuari"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ajuda a millorar aquest editor de mètodes d\'entrada enviant automàticament estadístiques d\'ús i informes de bloqueigs a Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Toca per corregir paraules"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Toca les paraules introduïdes per corregir-les"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca les paraules introduïdes per corregir-les"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema del teclat"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclat"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"veu"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclat txec"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclat danès"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclat alemany "</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclat anglès (Gran Bretanya)"</string> + <!-- outdated translation 2979257184475020604 --> <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> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclat francès"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Veu txeca"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Veu alemanya"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Veu anglesa (Austràlia)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Veu anglesa (Gran Bretanya)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Veu anglesa (Índia)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Veu anglesa (Nova Zelanda)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Veu anglesa (Estats Units)"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Veu espanyola"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Veu francesa"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Veu japonesa"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Veu coreana"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Veu xinesa (Xina)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Veu xinesa (Taiwan)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-cs/donottranslate-altchars.xml b/java/res/values-cs/donottranslate-altchars.xml index d91a0e449..f19ac0026 100644 --- a/java/res/values-cs/donottranslate-altchars.xml +++ b/java/res/values-cs/donottranslate-altchars.xml @@ -18,17 +18,16 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">áàâãäåæ</string> - <string name="alternates_for_e">3éěèêë</string> - <string name="alternates_for_i">íìîï8</string> - <string name="alternates_for_o">óòôõöœø9</string> - <string name="alternates_for_u">ůúùûü7</string> - <string name="alternates_for_s">š§ß</string> - <string name="alternates_for_n">ňñ</string> - <string name="alternates_for_c">čç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">á,à,â,ã,ä,å,æ</string> + <string name="alternates_for_e">3,é,ě,è,ê,ë</string> + <string name="alternates_for_i">í,ì,î,ï,8</string> + <string name="alternates_for_o">ó,ò,ô,õ,ö,œ,ø,9</string> + <string name="alternates_for_u">ů,ú,ù,û,ü,7</string> + <string name="alternates_for_s">š,§,ß</string> + <string name="alternates_for_n">ň,ñ</string> + <string name="alternates_for_c">č,ç</string> <string name="alternates_for_d">ď</string> - <string name="alternates_for_r">ř4</string> - <string name="alternates_for_t">ť5</string> + <string name="alternates_for_r">ř,4</string> + <string name="alternates_for_t">ť,5</string> <string name="alternates_for_z">ž</string> </resources> diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 7a4cf782f..642d8f1b4 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Opravovat překlepy"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Povolit opravu chyb vstupu"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Chyby vstupu v zobrazení na šířku"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Povolit opravu chyb vstupu"</string> - <string name="auto_correction" msgid="7911639788808958255">"Návrhy slov"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automaticky opravit předchozí slovo"</string> - <string name="prediction" msgid="466220283138359837">"Návrhy slov"</string> - <string name="prediction_category" msgid="7027100625580696660">"Nastavení návrhů slov"</string> - <string name="prediction_summary" msgid="459788228830873110">"Povolit automatické dokončování při psaní"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatické dokončování"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Zvětšit textové pole"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skrýt návrhy slov v zobrazení na šířku"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Nastavení návrhů slov"</string> <string name="auto_cap" msgid="1719746674854628252">"Velká písmena automaticky"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Zahájit větu velkým písmenem"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatická interpunkce"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Zobrazit návrhy"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Zobrazovat navržená slova během psaní"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automatické dokončování"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo."</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Automatické opravy"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Mezerníkem nebo interpunkčním znaménkem automaticky vložíte zvýrazněné slovo."</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Vypnuto"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mírné"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivní"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Návrh Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Použít předchozí slovo ke zlepšení návrhu"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Žádný"</item> - <item msgid="1669461741568287396">"Základní"</item> - <item msgid="4894328801530136615">"Pokročilé"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Uloženo"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Podržením klávesy zobrazíte diakritiku (á, ž apod.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Stisknutím klávesy Zpět ↶ můžete klávesnici kdykoli zavřít."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Přístup k číslům a symbolům"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Stisknutím a podržením slova zcela vlevo toto slovo přidáte do slovníku."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Chcete-li pokračovat, dotkněte se tohoto tipu »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Chcete-li tento tip zavřít a začít psát, dotkněte se zde."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klávesnice se otevře vždy, když se dotknete textového pole."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Přidržením klávesy zobrazíte diakritiku"\n"(ó, ø, ö, ô apod.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Chcete-li přepnout na režim zadávání číslic a symbolů, dotkněte se této klávesy."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Chcete-li přejít zpět k zadávání písmen, dotkněte se této klávesy znovu."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Přidržením této klávesy změníte nastavení klávesnice (např. automatické dokončování)."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Vyzkoušejte si to."</b></string> <string name="label_go_key" msgid="1635148082137219148">"Přejít"</string> <string name="label_next_key" msgid="362972844525672568">"Další"</string> <string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string> <string name="label_send_key" msgid="2815056534433717444">"Odeslat"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"Alt"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pro váš jazyk aktuálně není hlasový vstup podporován, ale funguje v angličtině."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Hlasový vstup je experimentální funkce, která využívá síťové rozpoznávání řeči společnosti Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Chcete-li vypnout hlasový vstup, přejděte do nastavení klávesnice."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Chcete-li použít hlasový vstup, stiskněte tlačítko mikrofonu nebo přejeďte prstem přes klávesnici na obrazovce."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup je experimentální funkce, která využívá síťové rozpoznávání řeči společnosti Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Chcete-li vypnout hlasový vstup, přejděte do nastavení klávesnice."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Chcete-li použít hlasový vstup, stiskněte tlačítko mikrofonu nebo přejeďte prstem přes klávesnici na obrazovce."</string> <string name="voice_listening" msgid="467518160751321844">"Mluvte"</string> <string name="voice_working" msgid="6666937792815731889">"Probíhá zpracování"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Zrušit"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Hlasový vstup"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Na hlavní klávesnici"</item> - <item msgid="8529385602829095903">"Na klávesnici se symboly"</item> - <item msgid="7283103513488381103">"Vypnout"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon na hlavní klávesnici"</item> - <item msgid="6907837061058876770">"Mikrofon na klávesnici se symboly"</item> - <item msgid="3664304608587798036">"Hlasový vstup je deaktivován"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Po hlasovém vstupu automaticky odeslat"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Při vyhledávání nebo přechodu na další pole automaticky stisknout Enter."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otevřete klávesnici"\n</b></font><font size="3">\n</font>"Dotkněte se libovolného textového pole."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zavřete klávesnici"\n</b></font><font size="3">\n</font>"Stiskněte tlačítko Zpět."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Přidržením klávesy zobrazte možnosti"\n</b></font><font size="3">\n</font>"Přístup k interpunkčním znaménkům a diakritice."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Nastavení klávesnice"\n</b></font><font size="3">\n</font>"Dotkněte se klávesy "<b>"?123"</b>" a přidržte ji."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".cz"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".net"</string> - <string name="popular_domain_4" msgid="35359437471311470">".eu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na hlavní klávesnici"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klávesnici se symb."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Vypnuto"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr. na hlav. kláv."</string> + <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="language_selection_title" msgid="1651299598555326750">"Vstupní jazyky"</string> <string name="language_selection_summary" msgid="187110938289512256">"Jazyk můžete změnit posunutím prstu po mezerníku."</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Aktivovat zasílání statistik užívání a zpráv o selhání"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Automatickým zasíláním statistik o užívání editoru zadávání dat a zpráv o jeho selhání do Googlu můžete přispět k vylepšení tohoto nástroje."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotykem aktivujete opravy"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dotknete-li se slov, která jste napsali, můžete je opravit."</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotknete-li se slov, která jste napsali, můžete je opravit."</string> <string name="keyboard_layout" msgid="437433231038683666">"Motiv klávesnice"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klávesnice"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"hlas"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-da/donottranslate-altchars.xml b/java/res/values-da/donottranslate-altchars.xml index b1cc8b627..ca1df7c25 100644 --- a/java/res/values-da/donottranslate-altchars.xml +++ b/java/res/values-da/donottranslate-altchars.xml @@ -18,21 +18,23 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">áàâąã</string> - <string name="alternates_for_e">3éèêëę€</string> - <string name="alternates_for_i">íìîï8</string> - <string name="alternates_for_o">óòôõ9</string> - <string name="alternates_for_u">úùûū7</string> - <string name="alternates_for_s">śšşß</string> - <string name="alternates_for_n">ńñň</string> - <string name="alternates_for_c">çćč</string> - <string name="alternates_for_y">ýÿü6</string> - <string name="alternates_for_d">ðď</string> - <string name="alternates_for_r">ř4</string> - <string name="alternates_for_t">ťþ5</string> - <string name="alternates_for_z">źžż</string> + <string name="alternates_for_a">á,à,â,ą,ã</string> + <string name="alternates_for_e">3,é,è,ê,ë,ę,€</string> + <string name="alternates_for_i">í,ì,î,ï,8</string> + <string name="alternates_for_o">ó,ò,ô,õ,9</string> + <string name="alternates_for_u">ú,ù,û,ū,7</string> + <string name="alternates_for_s">ś,š,ş,ß</string> + <string name="alternates_for_n">ń,ñ,ň</string> + <string name="alternates_for_c">ç,ć,č</string> + <string name="alternates_for_y">ý,ÿ,ü,6</string> + <string name="alternates_for_d">ð,ď</string> + <string name="alternates_for_r">ř,4</string> + <string name="alternates_for_t">ť,þ,5</string> + <string name="alternates_for_z">ź,ž,ż</string> <string name="alternates_for_l">ł</string> <string name="alternates_for_v">w</string> - <string name="alternates_for_ae">ä</string> - <string name="alternates_for_oe">öœ</string> + <string name="keylabel_for_scandinavia_row2_10">æ</string> + <string name="keylabel_for_scandinavia_row2_11">ø</string> + <string name="alternates_for_scandinavia_row2_10">ä</string> + <string name="alternates_for_scandinavia_row2_11">ö,œ</string> </resources> diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index c4d67fd60..ad8166e24 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Ret stavefejl"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Aktiver fejlretning af input"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Inputfejl i landskab"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Aktiver fejlretning af input"</string> - <string name="auto_correction" msgid="7911639788808958255">"Ordforslag"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Ret automatisk det forrige ord"</string> - <string name="prediction" msgid="466220283138359837">"Ordforslag"</string> - <string name="prediction_category" msgid="7027100625580696660">"Indstillinger for ordforslag"</string> - <string name="prediction_summary" msgid="459788228830873110">"Aktiver automatisk udfyldelse, når du indtaster"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatisk udfyldelse"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Forøg tekstfeltets størrelse"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skjul ordforslag i landskabsvisning"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Indstillinger for ordforslag"</string> <string name="auto_cap" msgid="1719746674854628252">"Skriv aut. med stort"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Første bogstav i en sætning skrives med stort"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Foretag automatisk tegnsætning"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Hurtige løsninger"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Retter almindelige stavefejl"</string> - <string name="show_suggestions" msgid="507074425254289133">"Vis forslag"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Vis ordforslag under indtastning"</string> - <string name="auto_complete" msgid="1103196318775486023">"Udfyld automatisk"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Mellemrumstast og tegnsætning indsætter automatisk fremhævet ord"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Automatisk retning"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Mellemrumstast og tegnsætn. indsætter automatisk fremhævet ord"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Fra"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Beskeden"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressiv"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram-forslag"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Brug forrige ord for at forbedre forslag"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Ingen"</item> - <item msgid="1669461741568287396">"Grundlæggende"</item> - <item msgid="4894328801530136615">"Avanceret"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Gemt"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Hold en tast nede for at se accenter (ø, ö osv.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Tryk på knappen Tilbage ↶ for når som helst at lukke for tastaturet"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Få adgang til tal og symboler"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tryk og hold på ordet længst til venstre for at føje det til ordbogen"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Berør dette tip for at fortsætte »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Berør her for at lukke dette tip og begynde at indtaste!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastaturet åbner når som helst, du berører et tekstfelt"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tryk på en tast, og hold den nede for a vise accenter"\n"(ø, ö, ô, ó osv.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Skift til tal og symboler ved at røre denne tast"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Gå tilbage til bogstaver ved at berøre denne tast igen"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tryk på denne tast, og hold den nede for at ændre tastaturindstillingerne, som f.eks. automatisk udfyldelse"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prøv det!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Gå"</string> <string name="label_next_key" msgid="362972844525672568">"Næste"</string> <string name="label_done_key" msgid="2441578748772529288">"Udfør"</string> <string name="label_send_key" msgid="2815056534433717444">"Send"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Stemmeinput"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmeinput understøttes i øjeblikket ikke for dit sprog, men fungerer på engelsk."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Stemme-input er en funktion på forsøgsbasis, som bruger Googles netværksstemmegenkendelse."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Slå stemmeinput fra i indstillingerne for tastaturet."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"For at bruge stemme-input skal du trykke på knappen mikrofon eller lade glide fingeren hen over skærmtastaturet."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Stemme-input er en funktion på forsøgsbasis, som bruger Googles netværksstemmegenkendelse."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Slå stemmeinput fra i indstillingerne for tastaturet."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"For at bruge stemme-input skal du trykke på knappen mikrofon eller lade glide fingeren hen over skærmtastaturet."</string> <string name="voice_listening" msgid="467518160751321844">"Tal nu"</string> <string name="voice_working" msgid="6666937792815731889">"Arbejder"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Annuller"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Stemmeinput"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"På hovedtastatur"</item> - <item msgid="8529385602829095903">"På symboltastatur"</item> - <item msgid="7283103513488381103">"Fra"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon på hovedtastatur"</item> - <item msgid="6907837061058876770">"Mikrofon på symboltastatur"</item> - <item msgid="3664304608587798036">"Stemmeinput er deaktiveret"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Send automatisk efter stemme"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Tryk automatisk på enter, når du søger eller går til det næste felt."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Åbn tastaturet"\n</b></font><font size="3">\n</font>"Tryk på et hvilket som helst tekstfelt."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Luk tastaturet"\n</b></font><font size="3">\n</font>"Tryk på knappen Tilbage."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tryk på en tast, og hold den nede for valgmuligheder"\n</b></font><font size="3">\n</font>"Få adgang til tegnsætning og accenter."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastaturindstillinger"\n</b></font><font size="3">\n</font>"Tryk på tasten "<b>"?123"</b>", og hold den nede."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På hovedtastatur"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På symboltastatur"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Fra"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik. på hovedtastatur"</string> + <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="language_selection_title" msgid="1651299598555326750">"Inputsprog"</string> <string name="language_selection_summary" msgid="187110938289512256">"Træk fingeren på mellemrumstasten for at skifte sprog"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brugerfeedback"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Vær med til at forbedre denne inputmetode ved at sende anvendelsesstatistikker og rapporter om nedbrud til Google."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryk for at rette ord igen"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Du kan rette ordene igen ved at trykke på de ord, du har indtastet"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Du kan rette ordene igen ved at trykke på de ord, du har indtastet"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tastaturtema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatur"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"stemme"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-de/donottranslate-altchars.xml b/java/res/values-de/donottranslate-altchars.xml index df27bce28..6c1abc6d0 100644 --- a/java/res/values-de/donottranslate-altchars.xml +++ b/java/res/values-de/donottranslate-altchars.xml @@ -19,13 +19,7 @@ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="alternates_for_a">ä</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">ö9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ</string> + <string name="alternates_for_o">ö,9</string> + <string name="alternates_for_y">ý,ÿ</string> <string name="alternates_for_z">6</string> </resources> diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index b29bbb501..26f907dc5 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -26,68 +26,51 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Eingabefehler korrigieren"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Korrektur von Eingabefehlern aktivieren"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Eingabefehler im Querformat"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Korrektur von Eingabefehlern aktivieren"</string> - <string name="auto_correction" msgid="7911639788808958255">"Wortvorschläge"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Vorheriges Wort automatisch korrigieren"</string> - <string name="prediction" msgid="466220283138359837">"Wortvorschläge"</string> - <string name="prediction_category" msgid="7027100625580696660">"Einstellungen für Wortvorschläge"</string> - <string name="prediction_summary" msgid="459788228830873110">"Automatische Vervollständigung während der Eingabe aktivieren"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autom. vervollständigen"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Textfeld vergrößern"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Wortvorschläge in Querformat ausblenden"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Einstellungen für Wortvorschläge"</string> <string name="auto_cap" msgid="1719746674854628252">"Autom. Groß-/Kleinschr."</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Sätze mit Großbuchstaben beginnen"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Autom. Zeichensetzung"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Quick Fixes"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Korrigiert gängige Tippfehler"</string> - <string name="show_suggestions" msgid="507074425254289133">"Vorschläge anzeigen"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Vorgeschlagene Wörter während des Tippens anzeigen"</string> - <string name="auto_complete" msgid="1103196318775486023">"Autom. vervollständigen"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Leertaste und Interpunktion fügen autom. ein markiertes Wort ein"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Wortvorschläge"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Vorheriges Wort automatisch korrigieren"</string> + <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) --> + <skip /> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigramm-Vorschläge"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Zur Verbesserung des Vorschlags vorheriges Wort verwenden"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Kein"</item> - <item msgid="1669461741568287396">"Standard"</item> - <item msgid="4894328801530136615">"Erweitert"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: gespeichert"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Zur Anzeige von Umlauten (ä, ö usw.) Taste gedrückt halten"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Zum Schließen der Tastatur ↶ drücken"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Auf Zahlen und Symbole zugreifen"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Lange auf das Wort ganz links außen drücken, um es zum Wörterbuch hinzuzufügen"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Diesen Hinweis berühren, um fortzufahren »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Hier berühren, um diesen Hinweis zu schließen und mit dem Tippen zu beginnen!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Die Tastatur wird immer dann geöffnet, wenn Sie ein Textfeld berühren."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Halten Sie eine Taste gedrückt, um Akzente anzuzeigen"\n"(ø, ö, ô, ó usw.)."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Wechseln Sie zu Ziffern und Symbolen, indem Sie diese Taste berühren."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Durch erneutes Drücken dieser Taste gelangen Sie zurück zu den Buchstaben."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Halten Sie diese Taste gedrückt, um die Tastatureinstellungen, wie beispielsweise die automatische Vervollständigung, zu ändern."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Probieren Sie es aus!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Los"</string> <string name="label_next_key" msgid="362972844525672568">"Weiter"</string> <string name="label_done_key" msgid="2441578748772529288">"Fertig"</string> <string name="label_send_key" msgid="2815056534433717444">"Senden"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Spracheingabe"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spracheingaben werden derzeit nicht für Ihre Sprache unterstützt, funktionieren jedoch in Englisch."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Die Spracheingabe ist eine Funktion im Versuchsstadium, die die vernetzte Spracherkennung von Google verwendet."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Wenn Sie die Spracheingabe deaktivieren möchten, rufen Sie die Tastatureinstellungen auf."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Um die Spracheingabe zu verwenden, drücken Sie die Mikrofontaste oder ziehen Sie Ihren Finger über die Bildschirmtastatur."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Die Spracheingabe ist eine Funktion im Versuchsstadium, die die vernetzte Spracherkennung von Google verwendet."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Wenn Sie die Spracheingabe deaktivieren möchten, rufen Sie die Tastatureinstellungen auf."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Um die Spracheingabe zu verwenden, drücken Sie die Mikrofontaste oder ziehen Sie Ihren Finger über die Bildschirmtastatur."</string> <string name="voice_listening" msgid="467518160751321844">"Jetzt sprechen"</string> <string name="voice_working" msgid="6666937792815731889">"Vorgang läuft"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +87,18 @@ <string name="cancel" msgid="6830980399865683324">"Abbrechen"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Spracheingabe"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Auf Haupttastatur"</item> - <item msgid="8529385602829095903">"Auf Symboltastatur"</item> - <item msgid="7283103513488381103">"Aus"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon auf Haupttastatur"</item> - <item msgid="6907837061058876770">"Mikrofon auf Symboltastatur"</item> - <item msgid="3664304608587798036">"Spracheingabe ist deaktiviert"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Nach Sprachaufnahme automatisch senden"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Drücken Sie auf die Eingabetaste, wenn Sie einen Suchvorgang durchführen oder zum nächsten Feld wechseln."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Tastatur öffnen"\n</b></font><font size="3">\n</font>"Berühren Sie ein beliebiges Textfeld."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tastatur schließen"\n</b></font><font size="3">\n</font>"Drücken Sie die Zurücktaste."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Für Optionen eine Taste berühren und gedrückt halten"\n</b></font><font size="3">\n</font>"Greifen Sie auf Satzzeichen und Akzente zu."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastatureinstellungen"\n</b></font><font size="3">\n</font>"Berühren und halten Sie die Taste "<b>"?123"</b>" gedrückt."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) --> + <skip /> + <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) --> + <skip /> + <!-- no translation found for voice_input_modes_off (3745699748218082014) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_off (63875609591897607) --> + <skip /> <string name="selectInputMethod" msgid="315076553378705821">"Eingabemethode auswählen"</string> <string name="language_selection_title" msgid="1651299598555326750">"Eingabesprachen"</string> <string name="language_selection_summary" msgid="187110938289512256">"Finger über die Leertaste bewegen, um die Eingabesprache zu wechseln"</string> @@ -133,8 +107,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Nutzer-Feedback aktivieren"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Tragen Sie zur Verbesserung dieses Eingabemethodeneditors bei, indem Sie automatisch Nutzungsstatistiken und Absturzberichte an Google senden."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Wortkorrektur"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Sie können Wörter korrigieren, indem Sie die eingegebenen Wörter berühren."</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Sie können Wörter korrigieren, indem Sie die eingegebenen Wörter berühren."</string> <string name="keyboard_layout" msgid="437433231038683666">"Tastaturdesign"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"Tastatur"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"Sprache"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index d69f4cfb5..3b98aa5cc 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Δόνηση κατά το πάτημα πλήκτρων"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Ήχος κατά το πάτημα πλήκτρων"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Εμφάνιση με το πάτημα πλήκτρου"</string> - <string name="hit_correction" msgid="4855351009261318389">"Διόρθωση σφαλμάτων πληκτρολόγησης"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Ενεργοποίηση διόρθωσης σφαλμάτων εισόδου"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Σφάλματα οριζόντιας εισαγωγής"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Ενεργοποίηση διόρθωσης σφαλμάτων εισόδου"</string> - <string name="auto_correction" msgid="7911639788808958255">"Υποδείξεις λέξεων"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Αυτόματη διόρθωση της προηγούμενης λέξης"</string> - <string name="prediction" msgid="466220283138359837">"Υποδείξεις λέξεων"</string> - <string name="prediction_category" msgid="7027100625580696660">"Ρυθμίσεις υποδείξεων λέξεων"</string> - <string name="prediction_summary" msgid="459788228830873110">"Ενεργοποίηση αυτόματης συμπλήρωσης κατά την πληκτρολόγηση"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Αυτόματη συμπλήρωση"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Αυξήστε το μέγεθος του πεδίου κειμένου"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Απόκρυψη υποδείξεων λέξεων στην οριζόντια προβολή"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Ρυθμίσεις υποδείξεων λέξεων"</string> <string name="auto_cap" msgid="1719746674854628252">"Αυτόματη χρήση κεφαλαίων"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Κεφαλαίο το πρώτο γράμμα της πρότασης"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Αυτόματος τονισμός"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Γρήγορες διορθώσεις"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Διορθώνει συνηθισμένα λάθη πληκτρολόγησης"</string> - <string name="show_suggestions" msgid="507074425254289133">"Εμφάνιση υποδείξεων"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση"</string> - <string name="auto_complete" msgid="1103196318775486023">"Αυτόματη συμπλήρωση"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Τα πλήκ.διαστήμ.και τονισμού εισάγ.αυτόμ.την επιλ.λέξη"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Αυτόματη διόρθωση"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Κενό και σημείο στίξης προσθέτουν την επισημασμένη λέξη"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Απενεργοποίηση"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Μέτρια"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Υψηλή"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Προτάσεις bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Χρήση προηγούμενης λέξης για τη βελτίωση πρότασης"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Καμία"</item> - <item msgid="1669461741568287396">"Βασική"</item> - <item msgid="4894328801530136615">"Σύνθετη"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Αποθηκεύτηκε"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Κρατήστε πατημένο ένα πλήκτρο για να δείτε τους τονισμένους χαρακτήρες (ø, ö, κ.τ.λ.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Πατήστε το πλήκτρο Πίσω ↶ για να κλείσετε το πληκτρολόγιο ανά πάσα στιγμή"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Πρόσβαση σε αριθμούς και σύμβολα"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Κρατήστε πατημένη τη λέξη στην άκρη αριστερά, για να την προσθέσετε στο λεξικό"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Αγγίξτε αυτή τη συμβουλή για να συνεχίσετε »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Αγγίξτε εδώ για να κλείσετε τη συμβουλή και να ξεκινήσετε την πληκτρολόγηση!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Το πληκτρολόγιο ανοίγει κάθε φορά που αγγίζετε ένα πεδίο κειμένου"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Αγγίξτε και κρατήστε κάποιο πλήκτρο για να προβάλετε τους τονισμένους χαρακτήρες"\n"(ø, ö, ô, ó κ.τ.λ.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Αλλαγή σε αριθμούς και σύμβολα με το πάτημα αυτού του πλήκτρου"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Επιστρέψτε στα γράμματα αγγίζοντας ξανά αυτό το πλήκτρο"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Αγγίξτε και κρατήστε πατημένο αυτό το πληκτρολόγιο για να αλλάξετε τις ρυθμίσεις πληκτρολογίου, όπως η αυτόματη συμπλήρωση"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Δοκιμάστε το!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Μετάβαση"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ΑΒΓ"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Φωνητική είσοδος"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Η φωνητική είσοδος δεν υποστηρίζεται αυτή τη στιγμή για τη γλώσσα σας, ωστόσο λειτουργεί στα Αγγλικά."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Οι φωνητικές εντολές είναι μια πειραματική λειτουργία, η οποία χρησιμοποιεί τη δικτυακή αναγνώριση ομιλίας της Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Για να απενεργοποιήσετε τη φωνητική είσοδο, μεταβείτε στις ρυθμίσεις πληκτρολογίου."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Για να χρησιμοποιήσετε τις φωνητικές εντολές, πιέστε το κουμπί μικροφώνου ή σύρετε το δάχτυλό σας κατά μήκος του πληκτρολογίου της οθόνης."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Οι φωνητικές εντολές είναι μια πειραματική λειτουργία, η οποία χρησιμοποιεί τη δικτυακή αναγνώριση ομιλίας της Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Για να απενεργοποιήσετε τη φωνητική είσοδο, μεταβείτε στις ρυθμίσεις πληκτρολογίου."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Για να χρησιμοποιήσετε τις φωνητικές εντολές, πιέστε το κουμπί μικροφώνου ή σύρετε το δάχτυλό σας κατά μήκος του πληκτρολογίου της οθόνης."</string> <string name="voice_listening" msgid="467518160751321844">"Μιλήστε τώρα"</string> <string name="voice_working" msgid="6666937792815731889">"Σε λειτουργία"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Ακύρωση"</string> <string name="ok" msgid="7898366843681727667">"ΟΚ"</string> <string name="voice_input" msgid="2466640768843347841">"Φωνητική είσοδος"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Στο κύριο πληκτρολόγιο"</item> - <item msgid="8529385602829095903">"Πληκτρολόγιο συμβόλων ενεργοποίησης"</item> - <item msgid="7283103513488381103">"Απενεργοποίηση"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Μικρόφωνο στο κύριο πληκτρολόγιο"</item> - <item msgid="6907837061058876770">"Μικρόφωνο στο πληκτρολόγιο συμβόλων"</item> - <item msgid="3664304608587798036">"Η φωνητική είσοδος είναι απενεργοποιημένη"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Αυτόματη υποβολή μετά από ήχο"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Πατήστε enter αυτόματα κατά την αναζήτηση ή τη μετάβαση στο επόμενο πεδίο."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Ανοίξτε το πληκτρολόγιο"\n</b></font><font size="3">\n</font>"Αγγίξτε οποιοδήποτε πεδίο κειμένου."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Κλείστε το πληκτρολόγιο"\n</b></font><font size="3">\n</font>"Πατήστε το πλήκτρο Πίσω."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Αγγίξτε και κρατήστε ένα πλήκτρο για ορισμό επιλογών"\n</b></font><font size="3">\n</font>"Πρόσβαση στα σημεία στίξης και τονισμού."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Ρυθμίσεις πληκτρολογίου"\n</b></font><font size="3">\n</font>"Αγγίξτε και κρατήστε το πλήκτρο "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Στο κύριο πληκτρολ."</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Πληκτρ. συμβ. ενερ."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Απενεργοποίηση"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Μικ. στο κύριο πληκ."</string> + <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="language_selection_title" msgid="1651299598555326750">"Γλώσσες εισόδου"</string> <string name="language_selection_summary" msgid="187110938289512256">"Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Ενεργοποίηση σχολίων χρηστών"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Βοηθήστε μας να βελτιώσουμε αυτό το πρόγραμμα επεξεργασίας μεθόδου εισόδου στέλνοντας αυτόματα στατιστικά στοιχεία και αναφορές σφαλμάτων στην Google."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Αγγίξτε για να διορθώσετε ξανά τις λέξεις"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Μπορείτε να διορθώσετε ξανά τις λέξεις αγγίζοντας τις λέξεις που έχετε πληκτρολογήσει"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Μπορείτε να διορθώσετε ξανά τις λέξεις αγγίζοντας τις λέξεις που έχετε πληκτρολογήσει"</string> <string name="keyboard_layout" msgid="437433231038683666">"Θέμα πληκτρολογίου"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"πληκτρολόγιο"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"φωνητική"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml index 56d666a3c..8e6a4cdbe 100644 --- a/java/res/values-en-rGB/strings.xml +++ b/java/res/values-en-rGB/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Correct typing errors"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Enable input error correction"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Landscape input errors"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Enable input error correction"</string> - <string name="auto_correction" msgid="7911639788808958255">"Word suggestions"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automatically correct the previous word"</string> - <string name="prediction" msgid="466220283138359837">"Word suggestions"</string> - <string name="prediction_category" msgid="7027100625580696660">"Word suggestion settings"</string> - <string name="prediction_summary" msgid="459788228830873110">"Enable auto-completion while typing"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Auto-completion"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Increase text field size"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Hide word suggestions in landscape view"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Word suggestion settings"</string> <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Capitalise the start of a sentence"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Auto-punctuate"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Quick fixes"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrects commonly typed mistakes"</string> - <string name="show_suggestions" msgid="507074425254289133">"Show suggestions"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Display suggested words while typing"</string> - <string name="auto_complete" msgid="1103196318775486023">"Auto-complete"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Spacebar and punctuation automatically insert highlighted word"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Auto-correction"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Spacebar and punctuation insert highlighted word automatically"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Off"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Modest"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressive"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram Suggestions"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Use previous word to improve suggestion"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"None"</item> - <item msgid="1669461741568287396">"Basic"</item> - <item msgid="4894328801530136615">"Advanced"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Saved"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Hold a key down to see accents (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Press the back key ↶ to close the keyboard at any point"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Access numbers and symbols"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"press and hold the left-most word to add it to the dictionary"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Touch this hint to continue »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Touch here to close this hint and start typing!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"The keyboard opens any time you touch a text field"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Touch & hold a key to view accents"\n"(ø, ö, ô, ó and so on)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Switch to numbers and symbols by touching this key"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Go back to letters by touching this key again"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Touch & hold this key to change keyboard settings, like auto-complete"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Try it!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Go"</string> <string name="label_next_key" msgid="362972844525672568">"Next"</string> <string name="label_done_key" msgid="2441578748772529288">"Done"</string> <string name="label_send_key" msgid="2815056534433717444">"Send"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Voice input"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Voice input is not currently supported for your language, but does work in English."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Voice input is an experimental feature using Google\'s networked speech recognition."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"To turn off voice input, go to keyboard settings."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"To use voice input, press the microphone button or slide your finger across the on-screen keyboard."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Voice input is an experimental feature using Google\'s networked speech recognition."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"To turn off voice input, go to keyboard settings."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"To use voice input, press the microphone button or slide your finger across the on-screen keyboard."</string> <string name="voice_listening" msgid="467518160751321844">"Speak now"</string> <string name="voice_working" msgid="6666937792815731889">"Working"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancel"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Voice input"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"On main keyboard"</item> - <item msgid="8529385602829095903">"On symbols keyboard"</item> - <item msgid="7283103513488381103">"Off"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mic on main keyboard"</item> - <item msgid="6907837061058876770">"Mic on symbols keyboard"</item> - <item msgid="3664304608587798036">"Voice input is disabled"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Auto-submit after voice"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Automatically press enter when searching or going to the next field."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Open the keyboard"\n</b></font><font size="3">\n</font>"Touch any text field."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Close the keyboard"\n</b></font><font size="3">\n</font>"Press the Back key."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Touch & hold a key for options"\n</b></font><font size="3">\n</font>"Access punctuation and accents."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Keyboard settings"\n</b></font><font size="3">\n</font>"Touch & hold the "<b>"?123"</b>" key."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"On main keyboard"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"On symbols keyboard"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Off"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic on main keyboard"</string> + <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="language_selection_title" msgid="1651299598555326750">"Input languages"</string> <string name="language_selection_summary" msgid="187110938289512256">"Slide finger on spacebar to change language"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Enable user feedback"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Help improve this input method editor by sending usage statistics and crash reports automatically to Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Touch to correct words"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Touch words entered to correct them"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Touch words entered to correct them"</string> <string name="keyboard_layout" msgid="437433231038683666">"Keyboard Theme"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"keyboard"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voice"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Czech Keyboard"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danish Keyboard"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"German Keyboard"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"English (Great Britain) Keyboard"</string> + <!-- outdated translation 2979257184475020604 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"English (United States) Keyboard"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish Keyboard"</string> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French Keyboard"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Czech Voice"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"German Voice"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"English (Australia) Voice"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"English (Great Britain) Voice"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"English (India) Voice"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"English (New Zealand) Voice"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"English (United States) Voice"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanish Voice"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"French Voice"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanese Voice"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korean Voice"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Chinese (China) Voice"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Chinese (Taiwan) Voice"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-en/donottranslate-altchars.xml b/java/res/values-en/donottranslate-altchars.xml index 083befa19..baded885a 100644 --- a/java/res/values-en/donottranslate-altchars.xml +++ b/java/res/values-en/donottranslate-altchars.xml @@ -18,10 +18,9 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåāæ</string> - <string name="alternates_for_e">3èéêëē</string> - <string name="alternates_for_i">ìíîïī8</string> - <string name="alternates_for_o">òóôõöōœø9</string> - <string name="alternates_for_u">ùúûüū7</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">à,á,â,ã,ä,å,ā,æ</string> + <string name="alternates_for_e">3,è,é,ê,ë,ē</string> + <string name="alternates_for_i">ì,í,î,ï,ī,8</string> + <string name="alternates_for_o">ò,ó,ô,õ,ö,ō,œ,ø,9</string> + <string name="alternates_for_u">ù,ú,û,ü,ū,7</string> </resources> diff --git a/java/res/values-es-rUS-xlarge/strings.xml b/java/res/values-es-rUS-xlarge/strings.xml new file mode 100644 index 000000000..3362f443d --- /dev/null +++ b/java/res/values-es-rUS-xlarge/strings.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- XL --> + <string name="sound_on_keypress" msgid="5115009797011251176">"Sonar al pulsar teclas"</string> + <!-- XL --> + <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="7967799451177275866">"Configuración de sugerencia de palabra"</string> + <!-- XL --> + <string name="auto_cap" msgid="6033382411344449470">"Uso de mayúsculas automático"</string> + <!-- XL --> + <string name="auto_correction_summary" msgid="6260001790426244084">"La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada."</string> + <!-- XL --> + <string name="auto_correction_threshold_mode_off" msgid="4899978031827517261">"Apagado"</string> + <!-- XL --> + <string name="auto_correction_threshold_mode_aggeressive" msgid="6091003457668724585">"Intenso"</string> + <!-- XL --> + <string name="bigram_suggestion" msgid="7146707435859263625">"Sugerencias de bigramas"</string> + <!-- XL --> + <string name="label_done_key" msgid="5392116476778838314">"Listo"</string> + <!-- XL --> + <string name="voice_warning_title" msgid="7559175513146431282">"Entrada de voz"</string> + <!-- XL --> + <string name="voice_warning_may_not_understand" msgid="5450473727606344027">"La entrada de voz utiliza el reconocimiento de voz de Google. "<a href="http://m.google.com/privacy">"Aplica la Política de privacidad de Google para celulares"</a>"."</string> + <!-- XL --> + <string name="voice_warning_how_to_turn_off" msgid="8461922898209345270">"Para desactivar la entrada por voz, ve a la configuración de métodos de entrada."</string> + <!-- XL --> + <string name="voice_hint_dialog_message" msgid="6099357096490592798">"Para utilizar entrada de voz, presiona el botón micrófono."</string> + <!-- XL --> + <string name="voice_input" msgid="6634874497844843576">"Entrada de voz"</string> + <!-- XL --> + <string name="voice_input_modes_off" msgid="1577817314089496020">"Apagado"</string> + <!-- XL --> + <string name="voice_input_modes_summary_off" msgid="3854831353403775554">"La entrada por voz está inhabilitada."</string> + <!-- XL --> + <string name="prefs_enable_recorrection_summary" msgid="3119549956172710725">"Toca las palabras ingresadas que desees corregir, solo cuando las sugerencias estén visibles."</string> + <!-- XL --> + <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="6025220568171384248">"Mostrar sugerencias"</string> + <!-- XL --> + <string name="prefs_show_suggestions_summary" msgid="2564386479780335351">"Mostrar palabras sugeridas al escribir"</string> + <!-- XL --> + <string name="prefs_suggestion_visibility_show_name" msgid="8350173747634837929">"Mostrar siempre"</string> + <!-- XL --> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="670278993111469619">"Mostrar en modo retrato"</string> + <!-- XL --> + <string name="prefs_suggestion_visibility_hide_name" msgid="2750493093338023345">"Ocultar siempre"</string> + <!-- XL --> + <string name="label_to_alpha_key" msgid="3103719164112604010">"ABC"</string> + <!-- XL --> + <string name="subtype_mode_cs_keyboard" msgid="1186679497674833204">"Teclado en checo"</string> + <!-- XL --> + <string name="subtype_mode_da_keyboard" msgid="1395637124037817510">"Teclado en danés"</string> + <!-- XL --> + <string name="subtype_mode_de_keyboard" msgid="1145552122692431122">"Teclado en alemán"</string> + <!-- XL --> + <string name="subtype_mode_en_GB_keyboard" msgid="5050923189634470413">"Teclado en inglés (Reino Unido)"</string> + <!-- XL --> + <string name="subtype_mode_en_US_keyboard" msgid="3435344903704397043">"Teclado en inglés (EE.UU.)"</string> + <!-- XL --> + <string name="subtype_mode_es_keyboard" msgid="1030419781157491328">"Teclado en español"</string> + <!-- XL --> + <string name="subtype_mode_es_US_keyboard" msgid="5792199241357098918">"Teclado en español (EE.UU.)"</string> + <!-- XL --> + <string name="subtype_mode_fr_keyboard" msgid="4855416218650524164">"Teclado en francés"</string> + <!-- XL --> + <string name="subtype_mode_fr_CA_keyboard" msgid="6458285776720480201">"Teclado en francés (Canadá)"</string> + <!-- XL --> + <string name="subtype_mode_fr_CH_keyboard" msgid="5966960427086795964">"Teclado en francés (Suiza)"</string> + <!-- XL --> + <string name="subtype_mode_it_keyboard" msgid="6927754583816493555">"Teclado en italiano"</string> + <!-- XL --> + <string name="subtype_mode_nb_keyboard" msgid="771634025467668613">"Teclado en noruego"</string> + <!-- XL --> + <string name="subtype_mode_nl_keyboard" msgid="3397048533451717478">"Teclado en holandés"</string> + <!-- XL --> + <string name="subtype_mode_ru_keyboard" msgid="3812694929448916712">"Teclado en ruso"</string> + <!-- XL --> + <string name="subtype_mode_sr_keyboard" msgid="7947963963114184275">"Teclado en serbio"</string> + <!-- XL --> + <string name="subtype_mode_sv_keyboard" msgid="3874083866564515371">"Teclado en sueco"</string> + <!-- XL --> + <string name="subtype_mode_cs_voice" msgid="8290007904951946296">"Voz en checo"</string> + <!-- XL --> + <string name="subtype_mode_de_voice" msgid="672328729666823853">"Voz en alemán"</string> + <!-- XL --> + <string name="subtype_mode_en_AU_voice" msgid="4170989257043892770">"Voz en inglés (Australia)"</string> + <!-- XL --> + <string name="subtype_mode_en_GB_voice" msgid="3134961988951205695">"Voz en inglés (Reino Unido)"</string> + <!-- XL --> + <string name="subtype_mode_en_IN_voice" msgid="5699787782487633128">"Voz en inglés (India)"</string> + <!-- XL --> + <string name="subtype_mode_en_NZ_voice" msgid="4121688717194804130">"Voz en inglés (Nueva Zelanda)"</string> + <!-- XL --> + <string name="subtype_mode_en_US_voice" msgid="8006563098744135975">"Voz en inglés (EE.UU.)"</string> + <!-- XL --> + <string name="subtype_mode_es_voice" msgid="1243071504878834350">"Voz en español"</string> + <!-- XL --> + <string name="subtype_mode_fr_voice" msgid="2048805677248981105">"Voz en francés"</string> + <!-- XL --> + <string name="subtype_mode_ja_voice" msgid="1855513591711108481">"Voz en japonés"</string> + <!-- XL --> + <string name="subtype_mode_ko_voice" msgid="3453153041889151316">"Voz en coreano"</string> + <!-- XL --> + <string name="subtype_mode_pl_voice" msgid="6730658974157645735">"Voz en polaco"</string> + <!-- XL --> + <string name="subtype_mode_pt_voice" msgid="4508062762756741654">"Voz en portugués"</string> + <!-- XL --> + <string name="subtype_mode_ru_voice" msgid="554299262138845594">"Voz en ruso"</string> + <!-- XL --> + <string name="subtype_mode_tr_voice" msgid="5242644971865917801">"Voz en turco"</string> + <!-- XL --> + <string name="subtype_mode_zh_CN_voice" msgid="4505329319557358473">"Voz en chino (China, simplificado)"</string> + <!-- XL --> + <string name="subtype_mode_zh_TW_voice" msgid="3976996097508134329">"Voz en chino (Taiwán, tradicional)"</string> + <!-- XL --> + <string name="prefs_usability_study_mode" msgid="8423000345880575687">"Modo estudio de usabilidad"</string> +</resources> diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 3abc8ded6..db842c612 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -26,68 +26,48 @@ <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 sobre keypress"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corregir errores de escritura"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Habilitar corrección de error de entrada"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Errores de entrada apaisada"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Habilitar corrección de error de entrada"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugerencias de palabras"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corregir automáticamente la palabra anterior"</string> - <string name="prediction" msgid="466220283138359837">"Sugerencias de palabras"</string> - <string name="prediction_category" msgid="7027100625580696660">"Configuración de sugerencia de palabra"</string> - <string name="prediction_summary" msgid="459788228830873110">"Habilitar finalización automática al escribir"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Finalización automática"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar el tamaño del campo de texto"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugerencias de palabras en vista apaisada"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Configuración de sugerencia de palabra"</string> <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Poner en mayúscula el inicio de una oración"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Puntuación automática"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Mostrar sugerencias"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Mostrar palabras sugeridas mientras escribe"</string> - <string name="auto_complete" msgid="1103196318775486023">"Completar automát."</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada."</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Corrección automática"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"La barra espaciadora y la puntuación insertan automáticamente la palabra resaltada"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivado"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderado"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Total"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Sugerencias de Vigoran"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utiliza la palabra anterior para mejorar la sugerencia"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Ninguno"</item> - <item msgid="1669461741568287396">"Básico"</item> - <item msgid="4894328801530136615">"Avanzado"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Mantén una tecla presionada para ver los acentos (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Pulsa la tecla hacia atrás ↶ para cerrar el teclado en cualquier momento"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Acceder a números y símbolos"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Presiona y mantén presionada la palabra de la izquierda para agregarla al diccionario"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Toca esta sugerencia para continuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Toca aquí para cerrar esta sugerencia y comenzar a escribir."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"El teclado se abre cada vez que tocas un campo de texto."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Toca y mantén presionada una tecla para ver los acentos"\n"(ø, ö, ô, ó, y así sucesivamente)."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Cambia de números a símbolos tocando esta tecla."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Vuelve a letras tocando esta tecla nuevamente."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Toca y mantén presionada esta tecla para cambiar la configuración del teclado, como completar automáticamente."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"¡Pruébalo!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Ir"</string> <string name="label_next_key" msgid="362972844525672568">"Siguiente"</string> <string name="label_done_key" msgid="2441578748772529288">"Hecho"</string> <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada por voz"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La entrada por voz no está admitida en tu idioma, pero sí funciona en inglés."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La entrada por voz es una característica experimental que utiliza la red de reconocimiento de voz de Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar la entrada por voz, ve a configuración del teclado."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para realizar entrada por voz, presiona el botón del micrófono o desliza tus dedos por el teclado en pantalla."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada por voz es una característica experimental que utiliza la red de reconocimiento de voz de Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar la entrada por voz, ve a configuración del teclado."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para realizar entrada por voz, presiona el botón del micrófono o desliza tus dedos por el teclado en pantalla."</string> <string name="voice_listening" msgid="467518160751321844">"Habla ahora"</string> <string name="voice_working" msgid="6666937792815731889">"Procesando"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> <string name="ok" msgid="7898366843681727667">"Aceptar"</string> <string name="voice_input" msgid="2466640768843347841">"Entrada por voz"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"En el teclado principal"</item> - <item msgid="8529385602829095903">"En el teclado de símbolos"</item> - <item msgid="7283103513488381103">"Apagado"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Micrófono en el teclado principal"</item> - <item msgid="6907837061058876770">"Micrófono en el teclado de símbolos"</item> - <item msgid="3664304608587798036">"La entrada por voz está inhabilitada."</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Enviar automáticamente después del audio"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Presionar automáticamente Ingresar al buscar o ir al campo siguiente."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abrir el teclado"\n</b></font><font size="3">\n</font>"Tocar cualquier campo de texto."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Cerrar el teclado"\n</b></font><font size="3">\n</font>"Presionar la tecla Atrás."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tocar & y mantener presionada una tecla para las opciones"\n</b></font><font size="3">\n</font>"Acceder a puntuación y acentos."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Configuración del teclado"\n</b></font><font size="3">\n</font>"Tocar & y mantener presionada la tecla "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"En el teclado principal"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"En el teclado de símbolos"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Desactivado"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micrófono en el teclado principal"</string> + <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="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> <string name="language_selection_summary" msgid="187110938289512256">"Deslizarse manualmente por la barra espaciadora para cambiar el idioma"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Habilitar los comentarios del usuario"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ayuda a mejorar este editor de método de introducción de texto al enviar las estadísticas de uso y los informes de error a Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corregir palabras"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Toca las palabras ingresadas que desees corregir"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca las palabras ingresadas que desees corregir"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema del teclado"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"Teclado"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"Voz"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-es/donottranslate-altchars.xml b/java/res/values-es/donottranslate-altchars.xml index 721062d2d..35187d0de 100644 --- a/java/res/values-es/donottranslate-altchars.xml +++ b/java/res/values-es/donottranslate-altchars.xml @@ -19,12 +19,6 @@ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="alternates_for_a">á</string> - <string name="alternates_for_e">3é</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">ó9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_e">3,é</string> + <string name="alternates_for_o">ó,9</string> </resources> diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index cd6dc8ee1..4658b219d 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -25,69 +25,49 @@ <string name="english_ime_input_options" msgid="3909945612939668554">"Opciones introducción texto"</string> <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"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corregir errores de escritura"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Habilitar la introducción de corrección de errores"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Errores de introducción de datos en vista horizontal"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Habilitar la introducción de corrección de errores"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugerencias de palabras"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corregir automáticamente la palabra anterior"</string> - <string name="prediction" msgid="466220283138359837">"Sugerencias de palabras"</string> - <string name="prediction_category" msgid="7027100625580696660">"Ajustes de sugerencia de palabras"</string> - <string name="prediction_summary" msgid="459788228830873110">"Habilitar Autocompletar al escribir"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autocompletar"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar el tamaño del campo de texto"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugerencias de palabras en la vista horizontal"</string> - <string name="auto_cap" msgid="1719746674854628252">"Uso de mayúsculas auto."</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Escribir en mayúscula el principio de la frase"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Puntuación automática"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> + <string name="popup_on_keypress" msgid="123894815723512944">"Popup al pulsar tecla"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Ajustes de sugerencia de palabras"</string> + <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</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="show_suggestions" msgid="507074425254289133">"Mostrar sugerencias"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Muestra las palabras sugeridas mientras se escribe."</string> - <string name="auto_complete" msgid="1103196318775486023">"Autocompletar"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"La barra espaciadora y los signos de puntuación insertan automáticamente la palabra resaltada."</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Autocorrección"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Espacio o punt para insertar resalt"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivada"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Parcial"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Total"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Sugerencias de bigramas"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Usar palabra anterior para mejorar sugerencias"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Ninguno"</item> - <item msgid="1669461741568287396">"Básico"</item> - <item msgid="4894328801530136615">"Avanzado"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Mantén pulsada una tecla para ver los caracteres acentuados (ø, ö, etc.)."</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Pulsa la tecla \"Atrás\" ↶ para cerrar el teclado en cualquier momento."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Acceso a números y símbolos"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Mantén pulsada la palabra situada más a la izquierda para añadirla al diccionario."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Toca esta sugerencia para continuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Toca aquí para cerrar la sugerencia y comenzar a escribir."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"El teclado se abre cada vez que tocas un campo de texto"</b>"."</string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Mantén pulsada una tecla para ver los caracteres acentuados"\n"(ø, ö, ô, ó, etc.)."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Cambiar a números y a símbolos tocando esta tecla"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Volver a las letras tocando esta tecla de nuevo"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Mantén pulsada esta tecla para cambiar la configuración de teclado a, por ejemplo, autocompletar"</b>"."</string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"¡Pruébalo!"</b></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_send_key" msgid="2815056534433717444">"Enviar"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Introducción de voz"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente la introducción de voz no está disponible en tu idioma, pero se puede utilizar en inglés."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La introducción de voz es una función en fase experimental que utiliza la tecnología de reconocimiento de voz en red de Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar la función de introducción de voz, accede a la configuración del teclado."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para utilizar la función de introducción de voz, pulsa el botón de micrófono o desliza el dedo por el teclado en pantalla."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La introducción de voz es una función en fase experimental que utiliza la tecnología de reconocimiento de voz en red de Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar la función de introducción de voz, accede a la configuración del teclado."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para utilizar la función de introducción de voz, pulsa el botón de micrófono o desliza el dedo por el teclado en pantalla."</string> <string name="voice_listening" msgid="467518160751321844">"Habla ahora"</string> <string name="voice_working" msgid="6666937792815731889">"En curso"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> <string name="ok" msgid="7898366843681727667">"Aceptar"</string> <string name="voice_input" msgid="2466640768843347841">"Introducción de voz"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"En teclado principal"</item> - <item msgid="8529385602829095903">"En teclado de símbolos"</item> - <item msgid="7283103513488381103">"Desactivado"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Micrófono en teclado principal"</item> - <item msgid="6907837061058876770">"Micrófono en teclado de símbolos"</item> - <item msgid="3664304608587798036">"La función de introducción de voz no está habilitada."</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Enviar automáticamente después de la introducción de voz"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Pulsar Intro automáticamente al buscar o al pasar al siguiente campo"</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abrir el teclado"\n</b></font><font size="3">\n</font>"Toca cualquier campo de texto."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Cerrar el teclado"\n</b></font><font size="3">\n</font>"Pulsa la tecla \"Atrás\"."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Mantén pulsada una tecla para acceder a las opciones."\n</b></font><font size="3">\n</font>"Accede a los signos de puntuación y a los acentos."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Ajustes del teclado"\n</b></font><font size="3">\n</font>"Mantén pulsada la tecla "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"En teclado principal"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"En teclado símbolos"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Desactivada"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micro en tecl princ"</string> + <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">"Entrada de voz inhab"</string> <string name="selectInputMethod" msgid="315076553378705821">"Seleccionar método de introducción de texto"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas"</string> <string name="language_selection_summary" msgid="187110938289512256">"Deslizar el dedo por la barra espaciadora para cambiar el idioma"</string> @@ -132,9 +97,79 @@ <string name="has_dictionary" msgid="6071847973466625007">"Hay un diccionario disponible."</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Habilitar comentarios de usuarios"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ayuda a mejorar este editor de método de introducción de texto enviando estadísticas de uso e informes de error a Google."</string> - <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corregir palabras"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tocar palabras introducidas para corregirlas"</string> + <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corregir"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tocar palabras introducidas para corregirlas"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema de teclado"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclado"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voz"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml index cc4391a05..d724e8ad2 100644 --- a/java/res/values-fa/strings.xml +++ b/java/res/values-fa/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"لرزش با فشار کلید"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"صدا با فشار کلید"</string> <string name="popup_on_keypress" msgid="123894815723512944">"بازشو با فشار کلید"</string> - <string name="hit_correction" msgid="4855351009261318389">"تصحیح خطاهای تایپی"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"فعال کردن تصحیح خطای ورودی"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"خطاهای ورود افقی"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"فعال کردن تصحیح خطای ورودی"</string> - <string name="auto_correction" msgid="7911639788808958255">"پیشنهادات کلمه"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"تصحیح خودکار کلمه قبلی"</string> - <string name="prediction" msgid="466220283138359837">"پیشنهادات کلمه"</string> - <string name="prediction_category" msgid="7027100625580696660">"تنظیمات پیشنهاد کلمه"</string> - <string name="prediction_summary" msgid="459788228830873110">"فعال کردن تکمیل خودکار در حین تایپ"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"تکمیل خودکار"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"افزایش اندازه قسمت متنی"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"پنهان کردن پیشنهادات کلمه در نمای افقی"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"تنظیمات پیشنهاد کلمه"</string> <string name="auto_cap" msgid="1719746674854628252">"نوشتن با حروف بزرگ خودکار"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"بزرگ کردن اول هر جمله"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"نشان گذاری خودکار"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"راه حل های سریع"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"تصحیح خطاهای تایپی رایج"</string> - <string name="show_suggestions" msgid="507074425254289133">"نمایش پیشنهادات"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"نمایش واژه های پیشنهادی در حین تایپ"</string> - <string name="auto_complete" msgid="1103196318775486023">"تکمیل خودکار"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"کلید خط فاصله و علائم نگارشی به صورت خودکار کلمه برجسته شده را وارد می کنند."</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"تصحیح خودکار"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"با استفاده از کلید فاصله و علامتگذاری کلمه برجسته شده بصورت خودکار درج می شود"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"خاموش"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"متوسط"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"فعال"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"توضیحات بیگرام"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"برای بهبود پیشنهاد از کلمه قبلی استفاده شود"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"هیچکدام"</item> - <item msgid="1669461741568287396">"پایه"</item> - <item msgid="4894328801530136615">"پیشرفته"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ذخیره شد"</string> - <string name="tip_long_press" msgid="6101270866284343344">"برای مشاهده علائم تکیه (ø، ö و موارد دیگر) کلیدی را پایین نگه دارید"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"برای بستن صفحه کلید در هر نقطه که بخواهید، کلید برگشت ↶ را فشار دهید"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"دسترسی به اعداد و نمادها"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"انتهای سمت چپ واژه را برای افزودن آن به فرهنگ لغت فشار داده و نگه دارید"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"این نکته را برای ادامه لمس کنید »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"برای بستن این نکته و شروع تایپ، اینجا را لمس کنید!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"هر زمان که قسمت متنی را لمس می کنید، صفحه کلید باز می شود"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"یک کلید را برای مشاهده تکیه های صدا لمس کرده و نگه دارید (ø، ö، ô، ó و موارد دیگر)"\n</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"تغییر شماره ها و نمادها با لمس این کلید"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"با لمس مجدد این کلید، به حروف برگردید"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"این کلید را برای تغییر تنظیمات صفحه کلید مانند تکمیل خودکار لمس کرده و فشار دهید"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"امتحان کنید!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"برو"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"ورودی صوتی"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ورودی صوتی در حال حاضر برای زبان شما پشتیبانی نمی شود اما برای زبان انگلیسی فعال است."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"ورودی صوتی یک ویژگی آزمایشی با استفاده از تشخیص گفتار شبکه Google است."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"برای خاموش کردن ورودی صدا، به تنظیمات صفحه کلید بروید."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"برای استفاده از ورودی صوتی، دکمه میکروفن را فشار دهید یا انگشت خود را روی صفحه کلید روی صفحه حرکت دهید."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ورودی صوتی یک ویژگی آزمایشی با استفاده از تشخیص گفتار شبکه Google است."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"برای خاموش کردن ورودی صدا، به تنظیمات صفحه کلید بروید."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"برای استفاده از ورودی صوتی، دکمه میکروفن را فشار دهید یا انگشت خود را روی صفحه کلید روی صفحه حرکت دهید."</string> <string name="voice_listening" msgid="467518160751321844">"اکنون صحبت کنید"</string> <string name="voice_working" msgid="6666937792815731889">"در حال کار"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"لغو"</string> <string name="ok" msgid="7898366843681727667">"تأیید"</string> <string name="voice_input" msgid="2466640768843347841">"ورودی صوتی"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"در صفحه کلید اصلی"</item> - <item msgid="8529385602829095903">"در صفحه کلید نمادها"</item> - <item msgid="7283103513488381103">"خاموش"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"میکروفن در صفحه کلید اصلی"</item> - <item msgid="6907837061058876770">"میکروفن در صفحه کلید نمادها"</item> - <item msgid="3664304608587798036">"ورودی صوتی غیر فعال شده است"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"ارائه خودکار بعد از صدا"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"هنگام جستجو یا رفتن به قسمت بعدی، Enter را به صورت خودکار فشار دهید."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"صفحه کلید را باز کنید"\n</b></font><font size="3">\n</font>"هر قسمت متنی را لمس کنید."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"بستن صفحه کلید"\n</b></font><font size="3">\n</font>"کلید برگشت را فشار دهید."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"یک کلید را برای گزینه های"\n</b></font><font size="3">\n</font>" دسترسی به علائم نگارشی و تکیه های صدا لمس کرده و نگه دارید."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"تنظیمات صفحه کلید"\n</b></font><font size="3">\n</font>"کلید "<b>"?123"</b>" را لمس کرده و نگهدارید."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"در صفحه کلید اصلی"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"در صفحه کلید نمادها"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"خاموش"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"میکروفن در صفحه کلید اصلی"</string> + <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="language_selection_title" msgid="1651299598555326750">"زبان های ورودی"</string> <string name="language_selection_summary" msgid="187110938289512256">"برای تغییر زبان انگشت را روی کلید فاصله بلغزانید"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"فعال کردن بازخورد کاربر"</string> <string name="prefs_description_log" msgid="5827825607258246003">"با ارسال خودکار آمارهای کاربرد و گزارش های خرابی به Google، به بهبود این ویرایشگر روش ورودی کمک کنید."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"برای تصحیح کلمات لمس کنید"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"برای تصحیح کلمات وارد شده آنها را لمس کنید"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"برای تصحیح کلمات وارد شده آنها را لمس کنید"</string> <string name="keyboard_layout" msgid="437433231038683666">"طرح زمینه صفحه کلید"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"صفحه کلید"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"صوتی"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"صفحه کلید چک"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"صفحه کلید دانمارکی"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"صفحه کلید آلمانی"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"صفحه کلید انگلیسی (بریتانیای کبیر)"</string> + <!-- outdated translation 2979257184475020604 --> <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_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"صفحه کلید فرانسوی"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_ru_keyboard" msgid="1383995915064277943">"صفحه کلید روسی"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"صفحه کلید صربی"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"صفحه کلید سوئدی"</string> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"صدای چک"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"صدای آلمانی"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"صدای انگلیسی (استرالیا)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"صدای انگلیسی (بریتانیای کبیر)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"صدای انگلیسی (هندوستان)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"صدای انگلیسی (نیوزیلند)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"صدای انگلیسی (ایالات متحده)"</string> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"صدای چینی (چین)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"صدای چینی (تایوان)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml index 3c36a632e..8a2470a87 100644 --- a/java/res/values-fi/strings.xml +++ b/java/res/values-fi/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Korjaa kirjoitusvirheet"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Ota syöttövirheen korjaus käyttöön"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Vaakasuunnan syöttövirheet"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Ota syöttövirheen korjaus käyttöön"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sanaehdotukset"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Korjaa edellinen sana automaattisesti"</string> - <string name="prediction" msgid="466220283138359837">"Sanaehdotukset"</string> - <string name="prediction_category" msgid="7027100625580696660">"Sanaehdotusasetukset"</string> - <string name="prediction_summary" msgid="459788228830873110">"Ota automaattinen täydennys käyttöön kirjoitettaessa"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automaattinen täydennys"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Suurenna tekstikenttää"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Piilota sanaehdotukset vaakasuuntaisessa näkymässä"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Sanaehdotusasetukset"</string> <string name="auto_cap" msgid="1719746674854628252">"Automaattiset isot kirjaimet"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Aloittaa lauseet isolla kirjaimella"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automaattiset välimerkit"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Pikakorjaukset"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Korjaa yleiset kirjoitusvirheet"</string> - <string name="show_suggestions" msgid="507074425254289133">"Näytä ehdotukset"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Näytä sanaehdotukset kirjoitettaessa"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automaattinen täydennys"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Välilyönti ja välimerkki lisäävät automaattisesti korostetun sanan"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Autom. korjaus"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Välilyönti ja välimerkit lisäävät korostetun sanan automaattisesti"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Älä käytä"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Osittainen"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Täysi"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram-ehdotukset"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Paranna ehdotusta aiemman sanan avulla"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Ei mitään"</item> - <item msgid="1669461741568287396">"Tavallinen"</item> - <item msgid="4894328801530136615">"Edistynyt"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Tallennettu"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Näet aksenttimerkit (ø, ö jne.) pitämällä näppäintä painettuna."</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Voit sulkea näppäimistön milloin tahansa painamalla Takaisin-painiketta ↶"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Käytä numeroita ja symboleita"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Lisää vasemmanpuoleinen sana sanakirjaan pitämällä sitä painettuna"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Jatka koskettamalla tätä vihjettä »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Sulje tämä vihje ja aloita kirjoittaa koskettamalla tätä!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Näppäimistö avautuu, kun kosketat tekstikenttää"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Näytä aksenttimerkit pitämällä näppäintä painettuna"\n"(ø, ö, ô, ó ja niin edelleen"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Vaihda numeroihin ja symboleihin koskettamalla tätä näppäintä"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Siirry takaisin kirjaimiin koskettamalla tätä näppäintä uudelleen"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Muuta näppäimistön asetuksia, kuten automaattista täydentämistä, pitämällä tätä näppäintä painettuna"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Kokeile!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Siirry"</string> <string name="label_next_key" msgid="362972844525672568">"Seuraava"</string> <string name="label_done_key" msgid="2441578748772529288">"Valmis"</string> <string name="label_send_key" msgid="2815056534433717444">"Lähetä"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Äänisyöte"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Äänisyötettä ei vielä tueta kielelläsi, mutta voit käyttää sitä englanniksi."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Äänisyöte on kokeellinen Googlen puheentunnistusta käyttävä ominaisuus."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Siirry näppäimistön asetuksiin poistaaksesi äänisyötteen käytöstä."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Käytä äänisyötettä painamalla mikrofonipainiketta tai liu\'uttamalla sormeasi näytön näppäimistön poikki."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Äänisyöte on kokeellinen Googlen puheentunnistusta käyttävä ominaisuus."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Siirry näppäimistön asetuksiin poistaaksesi äänisyötteen käytöstä."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Käytä äänisyötettä painamalla mikrofonipainiketta tai liu\'uttamalla sormeasi näytön näppäimistön poikki."</string> <string name="voice_listening" msgid="467518160751321844">"Puhu nyt"</string> <string name="voice_working" msgid="6666937792815731889">"Työstetään"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Peruuta"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Äänisyöte"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Päänäppäimistössä"</item> - <item msgid="8529385602829095903">"Symbolinäppäimistössä"</item> - <item msgid="7283103513488381103">"Pois käytöstä"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Päänäppäimistön mikrofoni"</item> - <item msgid="6907837061058876770">"Symbolinäppäimistön mikrofoni"</item> - <item msgid="3664304608587798036">"Äänisyöte ei ole käytössä"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Lähetä automaattisesti puheen jälkeen"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Paina automaattisesti enter-näppäintä tehdessäsi hakuja tai siirtyessäsi seuraavaan kenttään."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Avaa näppäimistö"\n</b></font><font size="3">\n</font>"Kosketa tekstikenttää."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Sulje näppäimistö"\n</b></font><font size="3">\n</font>"Paina Takaisin-näppäintä."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Näet asetukset pitämällä näppäintä painettuna"\n</b></font><font size="3">\n</font>"Käytä välimerkkejä ja aksenttimerkkejä."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Näppäimistön asetukset"\n</b></font><font size="3">\n</font>"Pidä painettuna"<b>"?123"</b>"-näppäintä."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Päänäppäimistössä"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Symbolinäppäimistössä"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Älä näytä"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr. päänäppäim."</string> + <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="language_selection_title" msgid="1651299598555326750">"Syöttökielet"</string> <string name="language_selection_summary" msgid="187110938289512256">"Vaihda kieltä liu\'uttamalla sormea välilyöntinäppäimellä"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Ota käyttäjäpalaute käyttöön"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Auta parantamaan tätä syöttötavan muokkausohjelmaa lähettämällä automaattisesti käyttötietoja ja kaatumisraportteja Googlelle."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Korjaa sanoja koskettamalla"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Korjaa sanoja koskettamalla niitä"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Korjaa sanoja koskettamalla niitä"</string> <string name="keyboard_layout" msgid="437433231038683666">"Näppäimistön teema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"näppäimistö"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"ääni"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Näppäimistö: tšekki"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Näppäimistö: tanska"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Ääni: saksa"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Ääni: englanti (Iso-Britannia)"</string> + <!-- outdated translation 2979257184475020604 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Näppäimistö: englanti (Yhdysvallat)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Näppäimistö: espanja"</string> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Näppäimistö: ranska"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Ääni: tšekki"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Ääni: saksa"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Ääni: englanti (Australia)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Ääni: englanti (Iso-Britannia)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Ääni: englanti (Intia)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Ääni: englanti (Uusi-Seelanti)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Ääni: englanti (Yhdysvallat)"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Ääni: espanja"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Ääni: ranska"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Ääni: japani"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Ääni: korea"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Ääni: kiina (Kiina)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Ääni: kiina (Taiwan)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-fr/donottranslate-altchars.xml b/java/res/values-fr/donottranslate-altchars.xml index 874d89dab..830119d52 100644 --- a/java/res/values-fr/donottranslate-altchars.xml +++ b/java/res/values-fr/donottranslate-altchars.xml @@ -18,15 +18,7 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">1àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">1,à,á,â,ã,ä,å,æ</string> <string name="alternates_for_q"></string> <string name="alternates_for_w"></string> <string name="alternates_for_z">2</string> diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index f8f4bac09..cbbcae9b6 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -26,68 +26,51 @@ <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 à chaque touche"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corriger les fautes de frappe"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Activer la correction des erreurs de saisie"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Erreurs de saisie en mode paysage"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activer la correction des erreurs de saisie"</string> - <string name="auto_correction" msgid="7911639788808958255">"Saisie prédictive"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corriger automatiquement le mot précédent"</string> - <string name="prediction" msgid="466220283138359837">"Saisie prédictive"</string> - <string name="prediction_category" msgid="7027100625580696660">"Paramètres de la saisie prédictive"</string> - <string name="prediction_summary" msgid="459788228830873110">"Activer la saisie semi-automatique"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Saisie semi-automatique"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Agrandir le champ de texte"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Masquer la saisie prédictive en mode paysage"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Paramètres de la saisie prédictive"</string> <string name="auto_cap" msgid="1719746674854628252">"Majuscules auto"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Mettre en majuscule la première lettre de chaque phrase"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Ponctuation automatique"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Afficher les suggestions"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Afficher les suggestions de terme lors de la saisie"</string> - <string name="auto_complete" msgid="1103196318775486023">"Saisie semi-automatique"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Insérer auto. le terme surligné avec barre espace/ponctuation"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <string name="prefs_settings_key" msgid="4623341240804046498">"Afficher la touche des paramètres"</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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Saisie prédictive"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Corriger automatiquement le mot précédent"</string> + <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) --> + <skip /> <string name="bigram_suggestion" msgid="1323347224043514969">"Suggestions de type bigramme"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Améliorer la suggestion en fonction du mot précédent"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Aucun"</item> - <item msgid="1669461741568287396">"Simple"</item> - <item msgid="4894328801530136615">"Avancé"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : enregistré"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Maintenir une touche enfoncée pour afficher les accents (à, é, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Appuyez sur la touche Retour ↶ pour fermer le clavier à tout moment."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Accéder aux chiffres et symboles"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Appuyer et maintenir le doigt sur le mot le plus à gauche pour l\'ajouter au dictionnaire"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Touchez ce conseil pour continuer »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Touchez ici pour fermer ce conseil et commencer à saisir votre texte."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Le clavier s\'affiche à chaque fois que vous touchez une zone de texte."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Maintenez une touche enfoncée pour afficher les accents"\n"(ø, ö, ô, ó, etc.)"</b>"."</string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Appuyez sur cette touche pour basculer vers les chiffres et les symboles."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Appuyez de nouveau sur cette touche pour retourner aux lettres."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Maintenez cette touche enfoncée afin de modifier les paramètres du clavier, tels que la saisie semi-automatique."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Essayez !"</b></string> <string name="label_go_key" msgid="1635148082137219148">"OK"</string> <string name="label_next_key" msgid="362972844525672568">"Suivant"</string> <string name="label_done_key" msgid="2441578748772529288">"OK"</string> <string name="label_send_key" msgid="2815056534433717444">"Envoyer"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Saisie vocale"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La saisie vocale n\'est pas encore prise en charge pour votre langue, mais elle fonctionne en anglais."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La saisie vocale est une fonctionnalité expérimentale qui fait appel à la reconnaissance vocale en réseau de Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Pour désactiver la saisie vocale, accédez aux paramètres du clavier."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Pour utiliser la saisie vocale, appuyez sur la touche du microphone ou faites glisser votre doigt sur le clavier à l\'écran."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La saisie vocale est une fonctionnalité expérimentale qui fait appel à la reconnaissance vocale en réseau de Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Pour désactiver la saisie vocale, accédez aux paramètres du clavier."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Pour utiliser la saisie vocale, appuyez sur la touche du microphone ou faites glisser votre doigt sur le clavier à l\'écran."</string> <string name="voice_listening" msgid="467518160751321844">"Parlez maintenant"</string> <string name="voice_working" msgid="6666937792815731889">"Traitement en cours"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +87,18 @@ <string name="cancel" msgid="6830980399865683324">"Annuler"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Saisie vocale"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Sur le clavier principal"</item> - <item msgid="8529385602829095903">"Sur le clavier des symboles"</item> - <item msgid="7283103513488381103">"Désactivée"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Micro sur le clavier principal"</item> - <item msgid="6907837061058876770">"Micro sur le clavier des symboles"</item> - <item msgid="3664304608587798036">"Saisie vocale désactivée"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Envoi automatique après la saisie vocale"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Appuyez automatiquement sur Entrée pour effectuer une recherche ou accéder au champ suivant."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Ouvrir le clavier"\n</b></font><font size="3">\n</font>"Appuyez sur un champ de texte."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Fermer le clavier"\n</b></font><font size="3">\n</font>"Appuyez sur la touche Retour."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Appuyez sur une touche de manière prolongée pour accéder aux options"\n</b></font><font size="3">\n</font>"Accédez aux signes de ponctuation et aux accents."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Paramètres du clavier"\n</b></font><font size="3">\n</font>"Appuyez sur la touche "<b>"?123"</b>" de manière prolongée."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gouv"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) --> + <skip /> + <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) --> + <skip /> + <!-- no translation found for voice_input_modes_off (3745699748218082014) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_off (63875609591897607) --> + <skip /> <string name="selectInputMethod" msgid="315076553378705821">"Sélectionner un mode de saisie."</string> <string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string> <string name="language_selection_summary" msgid="187110938289512256">"Faites glisser votre doigt sur la barre d\'espacement pour changer la langue."</string> @@ -133,8 +107,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Autoriser les commentaires des utilisateurs"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'incident à Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Appuyer pour corriger les suggestions"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Appuyer sur les mots saisis pour les corriger"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Appuyer sur les mots saisis pour les corriger"</string> <string name="keyboard_layout" msgid="437433231038683666">"Thème du clavier"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"clavier"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voix"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml index 82d66168f..0fdedf919 100644 --- a/java/res/values-hr/strings.xml +++ b/java/res/values-hr/strings.xml @@ -26,68 +26,51 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Ispravi pogreške u pisanju"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Omogućavanje ispravka pogreške pri unosu"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Pogreške pri pejzažnom unosu"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Omogućavanje ispravka pogreške pri unosu"</string> - <string name="auto_correction" msgid="7911639788808958255">"Prijedlozi riječi"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automatsko ispravljanje prethodne riječi"</string> - <string name="prediction" msgid="466220283138359837">"Prijedlozi riječi"</string> - <string name="prediction_category" msgid="7027100625580696660">"Postavke prijedloga riječi"</string> - <string name="prediction_summary" msgid="459788228830873110">"Omogućavanje automatskog dovršavanja pri upisivanju"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatsko dovršavanje"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Povećaj tekstualno polje"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Sakrij prijedloge riječi u pejzažnom prikazu"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Postavke prijedloga riječi"</string> <string name="auto_cap" msgid="1719746674854628252">"Automatsko pisanje velikih slova"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Stavi veliko slovo na početku rečenice"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatsko stavljanje interpunkcije"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Pokaži prijedloge"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Prikazivanje predloženih riječi prilikom upisivanja"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automatsko dovršavanje"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Razmaknica i interpunkcija automatski umeću istaknutu riječ"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Prijedlozi riječi"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Automatsko ispravljanje prethodne riječi"</string> + <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) --> + <skip /> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram prijedlozi"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Upotrijebi prethodnu riječ radi poboljšanja prijedloga"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nijedan"</item> - <item msgid="1669461741568287396">"Osnovni"</item> - <item msgid="4894328801530136615">"Napredno"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Spremljeno"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Pritisnite i držite tipku da biste vidjeli naglaske (ø, ö itd.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Pritisnite tipku \"Natrag\" ↶ za zatvaranje tipkovnice"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Pristup brojevima i simbolima"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Pritisnite i držite krajnju lijevu riječ da biste je dodali u rječnik."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Dodirnite ovaj savjet za nastavak »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Dodirnite ovdje da biste zatvorili savjet i počeli upisivati!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tipkovnica se otvara svaki put kada dodirnete tekstualno polje"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Dodirnite i držite tipku da biste vidjeli naglaske"\n"(ø, ö, ô, ó i tako dalje)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Prijeđite na brojeve i simbole dodirom na ovu tipku"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Dodirnite ponovo ovu tipku za povratak na slova"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Dodirnite i držite ovu tipku da biste promijenili postavke tipkovnice, poput automatskog dovršavanja"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Isprobajte!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Idi"</string> <string name="label_next_key" msgid="362972844525672568">"Dalje"</string> <string name="label_done_key" msgid="2441578748772529288">"Gotovo"</string> <string name="label_send_key" msgid="2815056534433717444">"Pošalji"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Glasovni unos"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Vaš jezik trenutno nije podržan za glasovni unos, ali radi za engleski."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Glasovni unos je pokusna značajka koja koristi Googleovo umreženo prepoznavanje govora."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Za isključivanje glasovnog unosa idite na postavke tipkovnice."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Da biste koristili glasovni unos pritisnite gumb mikrofona ili kliznite prstom preko tipkovnice na zaslonu."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni unos je pokusna značajka koja koristi Googleovo umreženo prepoznavanje govora."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Za isključivanje glasovnog unosa idite na postavke tipkovnice."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Da biste koristili glasovni unos pritisnite gumb mikrofona ili kliznite prstom preko tipkovnice na zaslonu."</string> <string name="voice_listening" msgid="467518160751321844">"Govorite sad"</string> <string name="voice_working" msgid="6666937792815731889">"Obrada"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +87,18 @@ <string name="cancel" msgid="6830980399865683324">"Odustani"</string> <string name="ok" msgid="7898366843681727667">"U redu"</string> <string name="voice_input" msgid="2466640768843347841">"Glasovni unos"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Na glavnoj tipkovnici"</item> - <item msgid="8529385602829095903">"Na tipkovnici sa simbolima"</item> - <item msgid="7283103513488381103">"Isključeno"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon na glavnoj tipkovnici"</item> - <item msgid="6907837061058876770">"Mikrofon na tipkovnici sa simbolima"</item> - <item msgid="3664304608587798036">"Glasovni unos je onemogućen"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automatski pošalji nakon glasovnog unosa"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Automatski se pritišće \"Enter\" kad pretražujete ili idete na sljedeće polje."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otvaranje tipkovnice"\n</b></font><font size="3">\n</font>"Dodirnite bilo koje tekstualno polje"</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zatvaranje tipkovnice"\n</b></font><font size="3">\n</font>"Pritisnite tipku \"Natrag\"."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Dodirnite i držite tipku da biste vidjeli opcije"\n</b></font><font size="3">\n</font>"Pristup interpunkciji i naglascima."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Postavke tipkovnice"\n</b></font><font size="3">\n</font>"Dodirnite i držite tipku "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) --> + <skip /> + <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) --> + <skip /> + <!-- no translation found for voice_input_modes_off (3745699748218082014) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_off (63875609591897607) --> + <skip /> <string name="selectInputMethod" msgid="315076553378705821">"Odabir ulazne metode"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jezici unosa"</string> <string name="language_selection_summary" msgid="187110938289512256">"Kliznite prstom po razmaknici za promjenu jezika"</string> @@ -133,8 +107,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Omogući korisničke povratne informacije"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Pomozite u poboljšanju ovog urednika ulazne metode automatskim slanjem statistike upotrebe i padova Googleu."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dodirnite za ispravak riječi"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dodirnite unesene riječi radi ispravka"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dodirnite unesene riječi radi ispravka"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema tipkovnice"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tipkovnica"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"glas"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Češka tipkovnica"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danska tipkovnica"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Njemačka tipkovnica"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engleska (Velika Britanija) tipkovnica"</string> + <!-- outdated translation 2979257184475020604 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engleska (SAD) tipkovnica"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španjolska tipkovnica"</string> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francuska tipkovnica"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Češki glas"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Njemački glas"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Engleski (Australija) glas"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Engleski (Velika Britanija) glas"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Engleski (Indija) glas"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Engleski (Novi Zeland) glas"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Engleski (SAD) glas"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Španjolski glas"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Francuski glas"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanski glas"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korejski glas"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Kineski (Kina) glas"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Kineski (Tajvan) glas"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml index 7c2f2164f..85de7ab90 100644 --- a/java/res/values-hu/strings.xml +++ b/java/res/values-hu/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Gépelési hibák kijavítása"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Beviteli hibák javításának engedélyezése"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Fekvő beviteli hibák"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Beviteli hibák javításának engedélyezése"</string> - <string name="auto_correction" msgid="7911639788808958255">"Szójavaslatok"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Az előző szó automatikus kijavítása"</string> - <string name="prediction" msgid="466220283138359837">"Szójavaslatok"</string> - <string name="prediction_category" msgid="7027100625580696660">"Szójavaslati beállítások"</string> - <string name="prediction_summary" msgid="459788228830873110">"Automatikus kiegészítés engedélyezése gépelés közben"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatikus kiegészítés"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"A szövegmező méretének növelése"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Szójavaslatok elrejtése fekvő nézetben"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Szójavaslati beállítások"</string> <string name="auto_cap" msgid="1719746674854628252">"Automatikusan nagy kezdőbetű"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Nagybetűvel kezdi a mondatot"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatikus központozás"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Javaslatok megjelenítése"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"A javasolt szavak megjelenítése gépelés közben"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automatikus kiegészítés"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"A szóköz és az írásjelek használata automatikusan beszúrja a kiemelt szót"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Automatikus javítás"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"A szóköz és az írásjel automatikusan beilleszti a kiemelt szót"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Ki"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mérsékelt"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresszív"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram javaslatok"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Előző szó használata a javaslatok javításához"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nincs"</item> - <item msgid="1669461741568287396">"Alap"</item> - <item msgid="4894328801530136615">"Speciális"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : mentve"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Az ékezetes betűk megtekintéséhez tartsa lenyomva valamelyik billentyűt (ø, ö stb.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"A vissza gomb ↶ megnyomásával bármikor elrejtheti a billentyűzetet"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Számok és szimbólumok elérése"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"A szótárhoz történő hozzáadásához nyomja meg hosszan a bal oldali legszélső szót"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"A folytatáshoz érintse meg ezt a tippet »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Érintse meg itt a tipp bezárásához és a gépelés megkezdéséhez."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Szövegmező megérintésekor a billentyűzet mindig megjelenik"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Érintse meg és tartsa lenyomva valamelyik billentyűt az ékezetes betűk megtekintéséhez"\n"(ø, ö, ô, ó stb.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Számokra és szimbólumokra ennek a billentyűnek a megérintésével válthat"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"A billentyű újbóli megérintésével visszatérhet a betűkhöz"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Érintse meg és tartsa lenyomva ezt a billentyűt a billentyűzet-beállítások (pl. az automatikus kiegészítés) módosításához"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Próbálja ki!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Ugrás"</string> <string name="label_next_key" msgid="362972844525672568">"Tovább"</string> <string name="label_done_key" msgid="2441578748772529288">"Kész"</string> <string name="label_send_key" msgid="2815056534433717444">"Küldés"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Hangbevitel"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A hangbevitel szolgáltatás jelenleg nem támogatja az Ön nyelvét, ám angolul működik."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A hangbevitel a Google hálózati beszédfelismerését alkalmazó kísérleti funkció."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"A hangbevitelt a billentyűzet beállításai között lehet kikapcsolni."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"A hangbevitel használatához nyomja meg a mikrofon gombját vagy húzza végig az ujját a képernyő-billentyűzeten."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A hangbevitel a Google hálózati beszédfelismerését alkalmazó kísérleti funkció."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"A hangbevitelt a billentyűzet beállításai között lehet kikapcsolni."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"A hangbevitel használatához nyomja meg a mikrofon gombját vagy húzza végig az ujját a képernyő-billentyűzeten."</string> <string name="voice_listening" msgid="467518160751321844">"Most beszéljen"</string> <string name="voice_working" msgid="6666937792815731889">"Feldolgozás"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Mégse"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Hangbevitel"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Főbillentyűzeten"</item> - <item msgid="8529385602829095903">"Szimbólumbillentyűzeten"</item> - <item msgid="7283103513488381103">"Ki"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon a főbillentyűzeten"</item> - <item msgid="6907837061058876770">"Mikrofon a szimbólumbillentyűzeten"</item> - <item msgid="3664304608587798036">"A hangbevitel ki van kapcsolva"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automatikus küldés a beszéd után"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Az Enter automatikus megnyomása keresés vagy a következő mezőre ugrás során."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"A billentyűzet megjelenítése"\n</b></font><font size="3">\n</font>"Érintse meg valamelyik szövegmezőt."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"A billentyűzet bezárása"\n</b></font><font size="3">\n</font>"Nyomja meg a Vissza billentyűt."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"A lehetőségek megjelenítéséhez érintse meg és tartsa lenyomva valamelyik billentyűt"\n</b></font><font size="3">\n</font>"Az írásjelek és az ékezetes betűk elérése."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Billentyűzetbeállítások"\n</b></font><font size="3">\n</font>"Érintse meg és tartsa lenyomva a "<b>"?123"</b>" billentyűt."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"A fő billentyűzeten"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Szimbólumoknál"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Ki"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr. a billentyűzeten"</string> + <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="language_selection_title" msgid="1651299598555326750">"Beviteli nyelvek"</string> <string name="language_selection_summary" msgid="187110938289512256">"A nyelv módosításához húzza végig az ujját a szóköz billentyűn"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Felhasználói visszajelzés engedélyezése"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Segíthet ennek a beviteli módszernek a javításában, ha engedélyezi a használati statisztikák és a hibajelentések elküldését a Google-nak."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Javítás a szavak megérintésével"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"A beírt szavakat megérintve kijavíthatja őket"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"A beírt szavakat megérintve kijavíthatja őket"</string> <string name="keyboard_layout" msgid="437433231038683666">"Billentyűzettéma"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"billentyűzet"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"hang"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Cseh billentyűzet"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dán billentyűzet"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Német billentyűzet"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angol (brit) billentyűzet"</string> + <!-- outdated translation 2979257184475020604 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angol (amerikai) billentyűzet"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanyol billentyűzet"</string> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francia billentyűzet"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Cseh hang"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Német hang"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Angol (ausztrál) hang"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Angol (brit) hang"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Angol (indiai) hang"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Angol (új-zélandi) hang"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Angol (amerikai) hang"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanyol hang"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Francia hang"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japán hang"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreai hang"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Kínai (kínai) hang"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Kínai (tajvani) hang"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml index ec5be6711..9e0d0a009 100644 --- a/java/res/values-in/strings.xml +++ b/java/res/values-in/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Perbaiki kesalahan ketik"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Aktifkan perbaikan galat masukan"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Galat masukan lanskap"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Aktifkan perbaikan galat masukan"</string> - <string name="auto_correction" msgid="7911639788808958255">"Saran kata"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Perbaiki kata sebelumnya secara otomatis"</string> - <string name="prediction" msgid="466220283138359837">"Saran kata"</string> - <string name="prediction_category" msgid="7027100625580696660">"Setelan saran kata"</string> - <string name="prediction_summary" msgid="459788228830873110">"Aktifkan pengisian otomatis saat mengetik"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Pengisian otomatis"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Tambah ukuran bidang teks"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Sembunyikan saran kata dalam tampilan melintang"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Setelan saran kata"</string> <string name="auto_cap" msgid="1719746674854628252">"Kapitalisasi otomatis"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Kapitalisasi awal kalimat"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Beri tanda baca otomatis"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Perbaikan cepat"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Memperbaiki kesalahan ketik umum"</string> - <string name="show_suggestions" msgid="507074425254289133">"Perlihatkan saran"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Tampilkan kata yang disarankan ketika mengetik"</string> - <string name="auto_complete" msgid="1103196318775486023">"Pengisian otomatis"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Bilah spasi dan tanda baca secara otomatis memasukkan kata yang disorot"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Koreksi otomatis"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Spasi dan tanda baca secara otomatis dimasukkan ke kata yang disorot"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Mati"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Sederhana"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresif"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Saran Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Gunakan kata sebelumnya untuk meningkatkan sara"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Tak Satu Pun"</item> - <item msgid="1669461741568287396">"Dasar"</item> - <item msgid="4894328801530136615">"Lanjutan"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Telah disimpan"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Tahan tombol untuk melihat aksen (ø, ö, dll.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Tekan tombol kembali ↶ untuk menutup keyboard kapan saja"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Akses angka dan simbol"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tekan terus kata yang paling kiri untuk menambahkannya ke kamus"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Sentuh petunjuk ini untuk melanjutkan »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Sentuh di sini untuk menutup petunjuk dan mulailah mengetik!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Keyboard terbuka setiap kali Anda menyentuh bidang teks"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Sentuh & tahan tombol untuk melihat aksen"\n"(ø, ö, ô, ó, dan seterusnya)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Beralih ke angka dan simbol dengan menekan tombol ini"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Kembali ke huruf dengan menekan tombol ini lagi"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Sentuh & tahan tombol ini untuk mengubah setelan keyboard, seperti lengkapi otomatis"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Cobalah!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Buka"</string> <string name="label_next_key" msgid="362972844525672568">"Berikutnya"</string> <string name="label_done_key" msgid="2441578748772529288">"Selesai"</string> <string name="label_send_key" msgid="2815056534433717444">"Kirimkan"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Masukan suara"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Masukan suara saat ini tidak didukung untuk bahasa Anda, tetapi bekerja dalam Bahasa Inggris."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Masukan suara adalah fitur eksperimental yang menggunakan pengenal suara berjaringan Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Untuk mematikan masukan suara, buka setelan keyboard."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Untuk menggunakan masukan suara, tekan tombol mikrofon atau geser jari Anda di sepanjang keyboard pada layar."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Masukan suara adalah fitur eksperimental yang menggunakan pengenal suara berjaringan Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Untuk mematikan masukan suara, buka setelan keyboard."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Untuk menggunakan masukan suara, tekan tombol mikrofon atau geser jari Anda di sepanjang keyboard pada layar."</string> <string name="voice_listening" msgid="467518160751321844">"Ucapkan sekarang"</string> <string name="voice_working" msgid="6666937792815731889">"Bekerja"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Batal"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Masukan suara"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Di keyboard utama"</item> - <item msgid="8529385602829095903">"Di keyboard simbol"</item> - <item msgid="7283103513488381103">"Mati"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mik di keyboard utama"</item> - <item msgid="6907837061058876770">"Mik di keyboard simbol"</item> - <item msgid="3664304608587798036">"Masukan suara dinonaktifkan"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Kirim otomatis setelah suara"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Tekan enter secara otomatis saat menelusuri atau menuju ke bidang berikutnya."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Buka keyboard"\n</b></font><font size="3">\n</font>"Sentuh bidang teks mana pun."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tutup keyboard"\n</b></font><font size="3">\n</font>"Tekan tombol Kembali."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Sentuh & tahan tombol tertentu untuk opsi"\n</b></font><font size="3">\n</font>"Akses tanda baca dan aksen."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Setelan keyboard"\n</b></font><font size="3">\n</font>"Sentuh & tahan tombol "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pada keyboard utama"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pada keyboard simbol"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Mati"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik pada keyboard utama"</string> + <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="language_selection_title" msgid="1651299598555326750">"Bahasa masukan"</string> <string name="language_selection_summary" msgid="187110938289512256">"Geser jari pada bilah spasi untuk mengubah bahasa"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Aktifkan umpan balik pengguna"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Bantu tingkatkan metode editor masukan dengan mengirim statistik penggunaan dan laporan kerusakan ke Google secara otomatis."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Sentuh untuk memperbaiki kata"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Sentuk kata yang dimasukkan untuk memperbaikinya"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Sentuk kata yang dimasukkan untuk memperbaikinya"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema Keyboard"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"keyboard"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"suara"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Keyboard Cheska"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Keyboard Denmark"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Keyboard Jerman"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Keyboard Inggris (Inggris Raya)"</string> + <!-- outdated translation 2979257184475020604 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Keyboard Inggris (Amerika Serikat)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Keyboard Spanyol"</string> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Keyboard Prancis"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Suara Cheska"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Suara Jerman"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Suara Bahasa Inggris (Australia)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Suara Bahasa Inggris (Inggris Raya)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Suara Bahasa Inggris (India)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Suara Bahasa Inggris (Selandia Baru)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Suara Bahasa Inggris (Amerika Serikat)"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Suara Bahasa Spanyol"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Suara Prancis"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Suara Jepang"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Suara Bahasa Korea"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Suara Bahasa China (China)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Suara Bahasa China (Taiwan)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-it/donottranslate-altchars.xml b/java/res/values-it/donottranslate-altchars.xml index 23960171b..0e4a285f1 100644 --- a/java/res/values-it/donottranslate-altchars.xml +++ b/java/res/values-it/donottranslate-altchars.xml @@ -18,13 +18,8 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àá</string> - <string name="alternates_for_e">3èé</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òó9</string> - <string name="alternates_for_u">ùúûü7</string> + <string name="alternates_for_a">à,á</string> + <string name="alternates_for_e">3,è,é</string> + <string name="alternates_for_o">ò,ó,9</string> <string name="alternates_for_s">§</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> </resources> diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 94cdb967f..1c80e3d87 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -26,68 +26,48 @@ <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 alla pressione di un tasto"</string> - <string name="hit_correction" msgid="4855351009261318389">"Correggi errori di digitazione"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Attiva la correzione degli errori di inserimento"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Errori di inserimento in visualizzazione orizzontale"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Attiva la correzione degli errori di inserimento"</string> - <string name="auto_correction" msgid="7911639788808958255">"Suggerimenti parola"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Correggi automaticamente la parola precedente"</string> - <string name="prediction" msgid="466220283138359837">"Suggerimenti parola"</string> - <string name="prediction_category" msgid="7027100625580696660">"Impostazioni suggerimento parole"</string> - <string name="prediction_summary" msgid="459788228830873110">"Attiva il completamento automatico durante la digitazione"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Completamento automatico"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Aumenta dimensioni campo di testo"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Nascondi i suggerimenti delle parole in visualizzazione orizzontale"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Impostazioni suggerimento parole"</string> <string name="auto_cap" msgid="1719746674854628252">"Maiuscole automatiche"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Rendi maiuscole le iniziali delle frasi"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Punteggiatura automat."</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Mostra suggerimenti"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Visualizza le parole suggerite durante la digitazione"</string> - <string name="auto_complete" msgid="1103196318775486023">"Completamento autom."</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Barra spaziatrice e punteggiatura inseriscono la parola evidenziata"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <string name="prefs_settings_key" msgid="4623341240804046498">"Mostra tasto impostazioni"</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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Correzione automatica"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Barra spaziatrice/punteggiatura inseriscono la parola evidenziata"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Off"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Media"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Massima"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Suggerimenti sui bigrammi"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilizza parola precedente per migliorare il suggerimento"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nessuna"</item> - <item msgid="1669461741568287396">"Base"</item> - <item msgid="4894328801530136615">"Avanzate"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : parola salvata"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Tieni premuto un tasto per vedere le lettere con segni diacritici (ø, ö etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Premi il tasto Indietro ↶ per chiudere la tastiera"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Accedi a numeri e simboli"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tieni premuto sulla parola all\'estrema sinistra per aggiungerla al dizionario"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Tocca questo suggerimento per continuare »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Tocca qui per chiudere questo suggerimento e iniziare a digitare."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"La tastiera si apre ogni volta che tocchi un campo di testo"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tocca e tieni premuto un pulsante per visualizzare le lettere con segni diacritici"\n"(ø, ö, ô, ó e così via)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Passa a numeri e simboli toccando questo pulsante"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Torna alle lettere toccando di nuovo questo pulsante"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tocca e tieni premuto questo pulsante per modificare le impostazioni della tastiera, come il completamento automatico"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prova!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Vai"</string> <string name="label_next_key" msgid="362972844525672568">"Avanti"</string> <string name="label_done_key" msgid="2441578748772529288">"Fine"</string> <string name="label_send_key" msgid="2815056534433717444">"Invia"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Comandi vocali"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"I comandi vocali non sono attualmente supportati per la tua lingua ma funzionano in inglese."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"I comandi vocali sono una funzione sperimentale che utilizza il riconoscimento vocale in rete di Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Per disattivare i comandi vocali, vai alle impostazioni della tastiera."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Per utilizzare i comandi vocali, premi il pulsante del microfono o fai scorrere il dito sulla tastiera sullo schermo."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"I comandi vocali sono una funzione sperimentale che utilizza il riconoscimento vocale in rete di Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per disattivare i comandi vocali, vai alle impostazioni della tastiera."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Per utilizzare i comandi vocali, premi il pulsante del microfono o fai scorrere il dito sulla tastiera sullo schermo."</string> <string name="voice_listening" msgid="467518160751321844">"Parla ora"</string> <string name="voice_working" msgid="6666937792815731889">"Elaborazione in corso"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Annulla"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Comandi vocali"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Su tastiera principale"</item> - <item msgid="8529385602829095903">"Su tastiera simboli"</item> - <item msgid="7283103513488381103">"Non attivi"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfono su tastiera principale"</item> - <item msgid="6907837061058876770">"Microfono su tastiera simboli"</item> - <item msgid="3664304608587798036">"Comandi vocali disabilitati"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Invia automaticamente dopo comando vocale"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Premi automaticamente \"Invio\" durante una ricerca o un passaggio al campo successivo."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Apertura tastiera"\n</b></font><font size="3">\n</font>"Tocca qualsiasi campo di testo."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Chiusura tastiera"\n</b></font><font size="3">\n</font>"Premi il tasto Indietro."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tocca e tieni premuto un pulsante per le opzioni"\n</b></font><font size="3">\n</font>"Accesso a punteggiatura e accenti."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Impostazioni tastiera"\n</b></font><font size="3">\n</font>"Tocca e tieni premuto il pulsante "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Su tastiera principale"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Su tastiera simboli"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Off"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic su tastiera princ."</string> + <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="language_selection_title" msgid="1651299598555326750">"Lingue comandi"</string> <string name="language_selection_summary" msgid="187110938289512256">"Scorri il dito sulla barra spaziatrice per cambiare la lingua"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Attiva commenti degli utenti"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Aiuta a migliorare l\'editor del metodo di inserimento inviando automaticamente a Google statistiche sull\'utilizzo e segnalazioni sugli arresti anomali."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocca per correggere di nuovo le parole"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Puoi correggere di nuovo le parole toccando quelle che hai digitato"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Puoi correggere di nuovo le parole toccando quelle che hai digitato"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema della tastiera"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastiera"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"vocale"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml index abc5c397c..326f8b38a 100644 --- a/java/res/values-iw/strings.xml +++ b/java/res/values-iw/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"רטט עם לחיצה על מקשים"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"צלילים עם לחיצה על מקשים"</string> <string name="popup_on_keypress" msgid="123894815723512944">"חלון קופץ עם לחיצה על מקשים"</string> - <string name="hit_correction" msgid="4855351009261318389">"תקן שגיאות הקלדה"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"הפוך תיקון שגיאות קלט לפעיל"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"שגיאות קלט בפריסה לרוחב"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"הפוך תיקון שגיאות קלט לפעיל"</string> - <string name="auto_correction" msgid="7911639788808958255">"הצעות למילים"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"תקן באופן אוטומטי את המילה הקודמת"</string> - <string name="prediction" msgid="466220283138359837">"הצעות למילים"</string> - <string name="prediction_category" msgid="7027100625580696660">"הגדרות של הצעות מילים"</string> - <string name="prediction_summary" msgid="459788228830873110">"הפוך השלמה אוטומטית לפעילה בעת הקלדה"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"השלמה אוטומטית"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"הגדל את הגודל של שדה הטקסט"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"הסתר הצעות למילים בתצוגה לרוחב"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"הגדרות של הצעות מילים"</string> <string name="auto_cap" msgid="1719746674854628252">"הפיכה אוטומטית של אותיות לרישיות"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"הוסף אות רישית בתחילת משפט"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"פיסוק אוטומטי"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"תיקונים מהירים"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"מתקן שגיאות הקלדה נפוצות"</string> - <string name="show_suggestions" msgid="507074425254289133">"הצג הצעות"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"הצג הצעות למילים בעת הקלדה"</string> - <string name="auto_complete" msgid="1103196318775486023">"השלמה אוטומטית"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"הקשה על מקש הרווח וסימני הפיסוק תוסיף באופן אוטומטי את המילה המסומנת"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"תיקון אוטומטי"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"הקשה על מקש הרווח וסימני הפיסוק תוסיף באופן אוטומטי את המילה המסומנת"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"כבוי"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"מצומצם"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"מחמיר"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"הצעות של צמדי אותיות (Bigram)"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"השתמש במילה הקודמת כדי לשפר את ההצעה"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"ללא"</item> - <item msgid="1669461741568287396">"בסיסי"</item> - <item msgid="4894328801530136615">"מתקדם"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : נשמרה"</string> - <string name="tip_long_press" msgid="6101270866284343344">"החזק מקש לחוץ כדי לראות אקצנטים (ø, ö וכדומה)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"לחץ על המקש \'הקודם\' ↶ כדי לסגור את המקלדת בכל עת"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"גישה למספרים וסמלים"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"לחץ על המילה השמאלית הקיצונית והחזק אותה לחוצה כדי להוסיף למילון"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"גע ברמז זה כדי להמשיך »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"גע כאן כדי לסגור רמז זה ולהתחיל בהקלדה!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"המקלדת נפתחת בכל פעם שאתה נוגע בשדה טקסט"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"גע במקש והחזק אותו לחוץ כדי להציג אקצנטים"\n"(ø, ö, ô, ó וכדומה)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"עבור למספרים וסמלים על ידי נגיעה במקש זה"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"חזור לאותיות על ידי מגע במקש זה שוב"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"גע במקש זה והחזק אותו לחוץ כדי לשנות את הגדרות המקלדת, כגון השלמה אוטומטית"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"נסה אותו!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"בצע"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"קלט קולי"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"קלט קולי אינו נתמך בשלב זה בשפתך, אך הוא פועל באנגלית."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"קלט קולי הוא תכונה ניסיונית של זיהוי הדיבור ברשת של Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"כדי לכבות את הקלט הקולי, עבור להגדרות מקלדת."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"כדי להשתמש בקלט הקולי, לחץ על לחצן המיקרופון או החלק את האצבע על המקלדת שבמסך."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"קלט קולי הוא תכונה ניסיונית של זיהוי הדיבור ברשת של Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"כדי לכבות את הקלט הקולי, עבור להגדרות מקלדת."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"כדי להשתמש בקלט הקולי, לחץ על לחצן המיקרופון או החלק את האצבע על המקלדת שבמסך."</string> <string name="voice_listening" msgid="467518160751321844">"דבר כעת"</string> <string name="voice_working" msgid="6666937792815731889">"פועל"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"ביטול"</string> <string name="ok" msgid="7898366843681727667">"אישור"</string> <string name="voice_input" msgid="2466640768843347841">"קלט קולי"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"במקלדת הראשית"</item> - <item msgid="8529385602829095903">"מקלדת סמלים מופעלת"</item> - <item msgid="7283103513488381103">"כבוי"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"מיקרופון במקלדת הראשית"</item> - <item msgid="6907837061058876770">"מיקרופון במקלדת סמלים"</item> - <item msgid="3664304608587798036">"הקלט הקולי מושבת"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"שליחה אוטומטית לאחר הקלטת קול"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"הקש על Enter באופן אוטומטי בעת חיפוש או מעבר לשדה הבא."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"פתח את המקלדת"\n</b></font><font size="3">\n</font>"גע בשדה טקסט כלשהו."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"סגור את המקלדת"\n</b></font><font size="3">\n</font>"לחץ על הלחצן \'הקודם\'."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"גע במקש והחזק אותו לחוץ לקבלת אפשרויות"\n</b></font><font size="3">\n</font>"קבל גישה לסימני פיסוק ואקצנטים."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"הגדרות מקלדת"\n</b></font><font size="3">\n</font>"גע במקש "<b>"?123"</b>" והחזק אותו לחוץ."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"במקלדת הראשית"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"במקלדת הסמלים"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"כבוי"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"מיקרופון במקלדת הראשית"</string> + <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="language_selection_title" msgid="1651299598555326750">"שפות קלט"</string> <string name="language_selection_summary" msgid="187110938289512256">"החלק את האצבע על מקש הרווח כדי לשנות שפה"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"הפוך משוב ממשתמשים לפעיל"</string> <string name="prefs_description_log" msgid="5827825607258246003">"עזור לשפר שיטת קלט זו על ידי שליחה אוטומטית של סטטיסטיקת שימוש ודוחות קריסת מחשב ל-Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"גע כדי לתקן מילים"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"גע במילים שהוזנו כדי לתקן אותן"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"גע במילים שהוזנו כדי לתקן אותן"</string> <string name="keyboard_layout" msgid="437433231038683666">"עיצוב מקלדת"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"מקלדת"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"קולי"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"מקלדת צ\'כית"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"מקלדת דנית"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"מקלדת גרמנית "</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"מקלדת אנגלית (בריטניה)"</string> + <!-- outdated translation 2979257184475020604 --> <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_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"מקלדת צרפתית"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_ru_keyboard" msgid="1383995915064277943">"מקלדת רוסית"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"מקלדת סרבית"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"מקלדת שוודית"</string> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Google Voice צ\'כי"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Google Voice גרמני"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Google Voice אנגלי (אוסטרליה)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Google Voice אנגלי (בריטניה)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Google Voice אנגלי (הודו)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Googel Voice אנגלי (ניו זילנד)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"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> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Google Voice יפני"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Google Voice קוריאני"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Google Voice סיני (סין)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Google Voice סיני (טייוואן)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 71a67a2f6..da7e58c2b 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -26,68 +26,51 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"キー操作バイブ"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"キー操作音"</string> <string name="popup_on_keypress" msgid="123894815723512944">"キー押下時ポップアップ"</string> - <string name="hit_correction" msgid="4855351009261318389">"入力ミス補正"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"入力間違いを自動修正する"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"横表示での入力修正"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"入力間違いを自動修正する"</string> - <string name="auto_correction" msgid="7911639788808958255">"入力候補表示"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"前の単語を自動修正する"</string> - <string name="prediction" msgid="466220283138359837">"入力候補表示"</string> - <string name="prediction_category" msgid="7027100625580696660">"入力候補の設定"</string> - <string name="prediction_summary" msgid="459788228830873110">"オートコンプリートを使用する"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"オートコンプリート"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"入力作業スペースを広げる"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"横表示では入力候補を表示しない"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"入力候補の設定"</string> <string name="auto_cap" msgid="1719746674854628252">"自動大文字変換"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"英字入力で文頭文字を大文字にする"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"句読点を自動入力"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"クイックフィックス"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"よくある誤字・脱字を修正します"</string> - <string name="show_suggestions" msgid="507074425254289133">"入力候補を表示"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"入力時に入力候補を表示する"</string> - <string name="auto_complete" msgid="1103196318775486023">"オートコンプリート"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"反転表示されている変換候補をスペースまたは句読点キーで挿入する"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"入力候補表示"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"前の単語を自動修正する"</string> + <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) --> + <skip /> <string name="bigram_suggestion" msgid="1323347224043514969">"バイグラム入力候補表示"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"直前の単語から入力候補を予測します"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"なし"</item> - <item msgid="1669461741568287396">"基本"</item> - <item msgid="4894328801530136615">"高度"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:保存しました"</string> - <string name="tip_long_press" msgid="6101270866284343344">"キー長押しでアクセント文字を表示(ø、öなど)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"戻るキーでキーボードを閉じます"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"数字と記号"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"一番左の単語を長押しすると辞書に追加されます"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"続けるにはここをタッチ"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"タッチしてこのヒントを終了し、入力を開始してください。"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"テキストフィールドを選択するとキーボードが表示されます"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"キーを長押しするとアクセント付き文字"\n"(ø、ö、ô、óなど)が表示されます"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"このキーを押すと、数字/記号入力に切り替わります"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"このキーを押すと、文字入力に再度切り替わります"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"オートコンプリートなどのキーボードの設定を変更するには、このキーを長押しします"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"試してみてください。"</b></string> <string name="label_go_key" msgid="1635148082137219148">"実行"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"音声入力"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"音声入力は現在英語には対応していますが、日本語には対応していません。"</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"音声入力はGoogleのネットワーク音声認識技術を利用した試験段階の機能です。"</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"音声入力をOFFにするには、キーボードの設定を開きます。"</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"音声入力するには、マイクボタンを押すか画面キーボードをスワイプしてください。"</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"音声入力はGoogleのネットワーク音声認識技術を利用した試験段階の機能です。"</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"音声入力をOFFにするには、キーボードの設定を開きます。"</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"音声入力するには、マイクボタンを押すか画面キーボードをスワイプしてください。"</string> <string name="voice_listening" msgid="467518160751321844">"お話しください"</string> <string name="voice_working" msgid="6666937792815731889">"処理中"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +87,18 @@ <string name="cancel" msgid="6830980399865683324">"キャンセル"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"音声入力"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"メインキーボード上"</item> - <item msgid="8529385602829095903">"記号キーボード上"</item> - <item msgid="7283103513488381103">"OFF"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"メインキーボードのマイク"</item> - <item msgid="6907837061058876770">"記号キーボードのマイク"</item> - <item msgid="3664304608587798036">"音声入力は無効です"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"入力後に自動送信する"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"検索または次のフィールドに進む際、Enterキーが自動的に押されます。"</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"キーボードを開く"\n</b></font><font size="3">\n</font>"テキストフィールドをタップします。"</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"キーボードを閉じる"\n</b></font><font size="3">\n</font>"[戻る]キーを押します。"</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"キーを長押しして選択する"\n</b></font><font size="3">\n</font>"句読点キーとアクセント文字を表示します。"</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"キーボードの設定"\n</b></font><font size="3">\n</font>"["<b>"?123"</b>"]キーを長押しします。"</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) --> + <skip /> + <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) --> + <skip /> + <!-- no translation found for voice_input_modes_off (3745699748218082014) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_off (63875609591897607) --> + <skip /> <string name="selectInputMethod" msgid="315076553378705821">"入力方法の選択"</string> <string name="language_selection_title" msgid="1651299598555326750">"入力言語"</string> <string name="language_selection_summary" msgid="187110938289512256">"スペースバーで指をスライドさせて言語を変更する"</string> @@ -133,8 +107,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"ユーザーフィードバックを有効にする"</string> <string name="prefs_description_log" msgid="5827825607258246003">"IMEの機能向上のため、使用統計状況やクラッシュレポートをGoogleに自動送信します。"</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"タップして語句を再修正"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"入力した語句をタップすると語句を再修正できます"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"入力した語句をタップすると語句を再修正できます"</string> <string name="keyboard_layout" msgid="437433231038683666">"キーボードテーマ"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"キーボード"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"音声"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index ab3aa91b0..938ad7e8a 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"키를 누를 때 진동 발생"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"키를 누를 때 소리 발생"</string> <string name="popup_on_keypress" msgid="123894815723512944">"키를 누를 때 팝업"</string> - <string name="hit_correction" msgid="4855351009261318389">"입력 오류 수정"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"입력 오류 수정 사용"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"가로 입력 오류"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"입력 오류 수정 사용"</string> - <string name="auto_correction" msgid="7911639788808958255">"단어 추천"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"이전 단어를 자동으로 수정"</string> - <string name="prediction" msgid="466220283138359837">"단어 추천"</string> - <string name="prediction_category" msgid="7027100625580696660">"단어 추천 설정"</string> - <string name="prediction_summary" msgid="459788228830873110">"입력할 때 자동 완성 사용"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"자동 완성"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"입력란 크기 늘리기"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"가로 보기에서 추천 단어 숨기기"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"단어 추천 설정"</string> <string name="auto_cap" msgid="1719746674854628252">"자동 대문자화"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"문장의 첫 글자를 대문자로 표시"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"자동 구두점 입력"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"빠른 수정"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"자주 발생하는 오타를 수정합니다."</string> - <string name="show_suggestions" msgid="507074425254289133">"추천 단어 표시"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"글자를 입력하는 동안 추천 단어를 표시"</string> - <string name="auto_complete" msgid="1103196318775486023">"자동 완성"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"스페이스바와 문장부호 키로 강조 표시된 단어를 자동 삽입"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"자동 수정"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"스페이스바와 구두점을 사용하면 강조 표시된 단어가 자동으로 삽입됩니다."</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"사용 안함"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"보통"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"적극적"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram 추천"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"이전 단어를 사용하여 추천 기능 개선"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"없음"</item> - <item msgid="1669461741568287396">"기본"</item> - <item msgid="4894328801530136615">"고급"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: 저장됨"</string> - <string name="tip_long_press" msgid="6101270866284343344">"키를 길게 누르면 악센트(ø, ö 등)가 표시됩니다."</string> - <string name="tip_dismiss" msgid="7585579046862204381">"키보드를 닫으려면 언제든지 뒤로 키(↶)를 누르세요."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"숫자 및 기호 사용"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"맨 왼쪽에 있는 단어를 길게 누르면 사전에 추가됩니다."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"계속하려면 힌트를 터치하세요. »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"힌트를 닫고 입력을 시작하려면 여기를 터치하세요."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"언제든지 입력란을 터치하면 키보드가 열립니다."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"키를 길게 터치하면 악센트"\n"(ø, ö, ô, ó 등)가 표시됩니다."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"이 키를 터치하면 숫자 및 기호 키보드로 전환됩니다."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"이 키를 다시 터치하면 문자 키보드로 돌아갑니다."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"자동 완성과 같은 키보드 설정을 변경하려면 이 키를 길게 터치하세요."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"이제 사용해 보세요."</b></string> <string name="label_go_key" msgid="1635148082137219148">"이동"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"음성 입력"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"음성 입력은 현재 자국어로 지원되지 않으며 영어로 작동됩니다."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"음성 입력은 Google의 네트워크화된 음성 인식을 사용하는 실험적 기능입니다."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"음성 입력을 사용하지 않으려면 키보드 설정으로 이동하세요."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"음성 입력을 사용하려면 마이크 버튼을 누르거나 터치 키보드 위로 손가락을 미끄러지듯 움직이세요."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"음성 입력은 Google의 네트워크화된 음성 인식을 사용하는 실험적 기능입니다."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"음성 입력을 사용하지 않으려면 키보드 설정으로 이동하세요."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"음성 입력을 사용하려면 마이크 버튼을 누르거나 터치 키보드 위로 손가락을 미끄러지듯 움직이세요."</string> <string name="voice_listening" msgid="467518160751321844">"지금 말하세요."</string> <string name="voice_working" msgid="6666937792815731889">"인식 중"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"취소"</string> <string name="ok" msgid="7898366843681727667">"확인"</string> <string name="voice_input" msgid="2466640768843347841">"음성 입력"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"기본 키보드"</item> - <item msgid="8529385602829095903">"기호 키보드"</item> - <item msgid="7283103513488381103">"사용 안함"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"기본 키보드의 마이크"</item> - <item msgid="6907837061058876770">"기호 키보드의 마이크"</item> - <item msgid="3664304608587798036">"음성 입력이 사용 중지됨"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"음성을 입력한 다음 자동 제출"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"검색하거나 다음 입력란으로 이동할 때 자동으로 Enter 키를 누릅니다."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"키보드 열기"\n</b></font><font size="3">\n</font>"아무 텍스트 입력란이나 터치하세요."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"키보드 닫기"\n</b></font><font size="3">\n</font>"\'뒤로\' 키를 누르세요."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"키를 길게 눌러 옵션 보기"\n</b></font><font size="3">\n</font>"문장 부호 및 악센트 기호 입력창이 열립니다."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"키보드 설정"\n</b></font><font size="3">\n</font><b>"?123"</b>" 키를 길게 누르세요."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"기본 키보드"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"기호 키보드"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"사용 안함"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"기본 키보드의 마이크"</string> + <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="language_selection_title" msgid="1651299598555326750">"입력 언어"</string> <string name="language_selection_summary" msgid="187110938289512256">"손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"사용자 의견 사용"</string> <string name="prefs_description_log" msgid="5827825607258246003">"사용 통계 및 충돌 보고서를 Google에 자동으로 전송하여 입력 방법 편집기의 개선에 도움을 줍니다."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"터치하여 단어 다시 수정"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"입력한 단어를 터치하면 다시 수정할 수 있습니다."</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"입력한 단어를 터치하면 다시 수정할 수 있습니다."</string> <string name="keyboard_layout" msgid="437433231038683666">"키보드 테마"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"키보드"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"음성"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml index 043f4b363..7df124bfc 100644 --- a/java/res/values-land/dimens.xml +++ b/java/res/values-land/dimens.xml @@ -19,17 +19,20 @@ --> <resources> + <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 --> + <dimen name="keyboardHeight">1.060in</dimen> <!-- key_height + key_bottom_gap = popup_key_height --> - <dimen name="key_height">0.250in</dimen> +<!-- <dimen name="key_height">0.250in</dimen>--> <dimen name="key_bottom_gap">0.020in</dimen> <dimen name="popup_key_height">0.270in</dimen> + <dimen name="keyboard_top_padding">0.0in</dimen> <dimen name="keyboard_bottom_padding">0.0in</dimen> <dimen name="candidate_strip_height">38dip</dimen> <dimen name="candidate_strip_fading_edge_length">63dip</dimen> <dimen name="spacebar_vertical_correction">2dip</dimen> <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> - <!-- popup_key_height x 1.7 --> - <dimen name="mini_keyboard_slide_allowance">0.459in</dimen> - <!-- popup_key_height x 1.0 --> + <!-- popup_key_height x 1.2 --> + <dimen name="mini_keyboard_slide_allowance">0.324in</dimen> + <!-- popup_key_height x -1.0 --> <dimen name="mini_keyboard_vertical_correction">-0.270in</dimen> </resources> diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml index 09208049a..fbabac811 100644 --- a/java/res/values-lt/strings.xml +++ b/java/res/values-lt/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Taisyti rašybos klaidas"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Įgalinti įvesties klaidos taisymą"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Gulsčia įvestis"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Įgalinti įvesties klaidos taisymą"</string> - <string name="auto_correction" msgid="7911639788808958255">"Žodžių pasiūlymai"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automatiškai taisyti ankstesnį žodį"</string> - <string name="prediction" msgid="466220283138359837">"Žodžių pasiūlymai"</string> - <string name="prediction_category" msgid="7027100625580696660">"Žodžių pasiūlymo nustatymai"</string> - <string name="prediction_summary" msgid="459788228830873110">"Įgalinti automatinį užbaigimą, kai įvedinėjamas tekstas"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatinis užbaigimas"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Padidinti teksto lauko dydį"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Gulsčiame rodinyje slėpti žodžių pasiūlymus"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Žodžių pasiūlymo nustatymai"</string> <string name="auto_cap" msgid="1719746674854628252">"Automatinis didžiųjų raidžių rašymas"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Sakinio pradžią rašyti didžiąja raide"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatiškai dėti skyrybos ženklus"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Rodyti pasiūlymus"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Įvedant tekstą pateikti siūlomus žodžius"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automatiškai užbaigti"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Tarpo klavišas ir skyrybos ženklai automatiškai įterpia paryškintą žodį"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Automatinis taisymas"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Tarpo kl. ir skyryb. ženkl. autom. įterp. paryšk. žodž."</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Išjungta"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Vidutinis"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Atkaklus"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Digramų pasiūlymai"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Naudoti ankstesnį žodį pasiūlymui patobulinti"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nėra"</item> - <item msgid="1669461741568287396">"Paprastas"</item> - <item msgid="4894328801530136615">"Išplėstinis"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: išsaugota"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Laikykite klavišą nuspaudę, kad pamatytumėte kirčius (ø, ö ir t. t.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Paspauskite klavišą „Atgal“ ↶, kad uždarytumėte klaviatūrą"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Pasiekti skaičius ir simbolius"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Paspauskite ir laikykite nuspaudę kairiausią žodį, kad pridėtumėte jį prie žodyno"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Palieskite šią užuominą, jei norite tęsti »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Paleiskite čia, kad uždarytumėte šią užuominą ir pradėtumėte įvedinėti tekstą!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klaviatūra atsidarys kaskart, kai paliesite teksto lauką"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Palieskite ir laikykite klavišą, kad pamatytumėte kirčius"\n"(ø, ö, ô, ó, and so on)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Perjunkite į skaičius ir simbolius, paliesdami šį klavišą"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Grįžkite prie raidžių dar kartą paliesdami šį klavišą"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Palieskite ir laikykite šį klavišą, kad pakeistumėte klaviatūros nustatymus, pvz., automatinį užbaigimą"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Išbandykite tai!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Pradėti"</string> <string name="label_next_key" msgid="362972844525672568">"Kitas"</string> <string name="label_done_key" msgid="2441578748772529288">"Atlikta"</string> <string name="label_send_key" msgid="2815056534433717444">"Siųsti"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Balso įvestis"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Šiuo metu balso įvestis jūsų kompiuteryje nepalaikoma, bet ji veikia anglų k."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Balso įvestis – tai eksperimentinė funkcija, naudojanti „Google“ tinklo kalbos atpažinimą."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Jei norite išjungti balso įvestį, eikite į klaviatūros nustatymus."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Jei norite naudoti balso įvestį, paspauskite mikrofono mygtuką arba pirštu slyskite ekranine klaviatūra."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balso įvestis – tai eksperimentinė funkcija, naudojanti „Google“ tinklo kalbos atpažinimą."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Jei norite išjungti balso įvestį, eikite į klaviatūros nustatymus."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Jei norite naudoti balso įvestį, paspauskite mikrofono mygtuką arba pirštu slyskite ekranine klaviatūra."</string> <string name="voice_listening" msgid="467518160751321844">"Kalbėkite dabar"</string> <string name="voice_working" msgid="6666937792815731889">"Veikia"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Atšaukti"</string> <string name="ok" msgid="7898366843681727667">"Gerai"</string> <string name="voice_input" msgid="2466640768843347841">"Balso įvestis"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Pagrindinėje klaviatūroje"</item> - <item msgid="8529385602829095903">"Simbolių klaviatūroje"</item> - <item msgid="7283103513488381103">"Išjungta"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Pagrindinės klaviatūros mikrofonas"</item> - <item msgid="6907837061058876770">"Mikrofonas simbolių klaviatūroje"</item> - <item msgid="3664304608587798036">"Balso įvestis išjungta"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automatiškai pateikti po balso"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Automatiškai spausti „Įvesti“ ieškant ar einant į kitą lauką."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Atidarykite klaviatūrą"\n</b></font><font size="3">\n</font>"Palieskite bet kurį teksto lauką."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Uždarykite klaviatūrą"\n</b></font><font size="3">\n</font>"Paspauskite klavišą „Atgal“."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Palieskite ir laikykite klavišą, kad pamatytumėte parinktis"\n</b></font><font size="3">\n</font>"Pasiekite skyrybos ženklus ir kirčius."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Klaviatūros nustatymai"\n</b></font><font size="3">\n</font>"Palieskite ir laikykite klavišą "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pagr. klaviatūroje"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Simbolių klaviatūr."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Išjungta"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrof. pagr. klav."</string> + <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="language_selection_title" msgid="1651299598555326750">"Įvesties kalbos"</string> <string name="language_selection_summary" msgid="187110938289512256">"Pirštu slyskite tarpo klavišu, kad pakeistumėte kalbą"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Įgalinti naudotojų atsiliepimus"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Padėkite patobulinti šią įvesties metodo redagavimo programą automatiškai „Google“ siųsdami naudojimo statistiką ir strigčių ataskaitas."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Jei norite ištaisyti žodžius, palieskite"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Jei norite ištaisyti įvestus žodžius, palieskite juos"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Jei norite ištaisyti įvestus žodžius, palieskite juos"</string> <string name="keyboard_layout" msgid="437433231038683666">"Klaviatūros tema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klaviatūra"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"Voice"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Čekiška klaviatūra"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Daniška klaviatūra"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Vokiška klaviatūra"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angliška (Didžioji Britanija) klaviatūra"</string> + <!-- outdated translation 2979257184475020604 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angliška (Jungtinės Amerikos Valstijos) klaviatūra"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ispaniška klaviatūra"</string> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Prancūziška klaviatūra"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"„Voice“ čekų k."</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"„Voice“ vokiečių k."</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"„Voice“ anglų k. (Australija)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"„Voice“ anglų k. (Didžioji Britanija)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"„Voice“ anglų k. (Indija)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"„Voice“ anglų k. (Naujoji Zelandija)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"„Voice“ anglų k. (Jungtinės Amerikos Valstijos)"</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> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <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> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"„Voice“ kinų k. (Kinija)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"„Voice“ kinų k. (Taivanas)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml index 3c0be2519..28cc0bf5f 100644 --- a/java/res/values-lv/strings.xml +++ b/java/res/values-lv/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Labot drukas kļūdas"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Iespējot ievades kļūdu labošanu"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Ainavas orientācijas ievades kļūdas"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Iespējot ievades kļūdu labošanu"</string> - <string name="auto_correction" msgid="7911639788808958255">"Vārdu ieteikumi"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automātiski labot iepriekšējo vārdu"</string> - <string name="prediction" msgid="466220283138359837">"Vārdu ieteikumi"</string> - <string name="prediction_category" msgid="7027100625580696660">"Vārdu ieteikumu iestatījumi"</string> - <string name="prediction_summary" msgid="459788228830873110">"Iespējot automātisko pabeigšanu ievades laikā"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automātiska pabeigšana"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Palielināt teksta lauka lielumu"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ainavas skatījumā slēpt vārdu ieteikumus"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Vārdu ieteikumu iestatījumi"</string> <string name="auto_cap" msgid="1719746674854628252">"Automātiska lielo burtu lietošana"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Sākt teikumu ar lielo burtu"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automātiska pieturzīmju lietošana"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Rādīt ieteikumus"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Ievades laikā attēlot ieteiktos vārdus"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automātiska pabeigšana"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Automātiski ievietot iezīmēto vārdu, izmantojot atstarpes taustiņu un pieturzīmes"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Automāt. korekcija"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Atst. un pieturz.aut.ievieto atz.v."</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Izslēgta"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mērena"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresīva"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram ieteikumi"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Ieteikuma uzlabošanai izmantot iepriekšējo vārdu"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nav"</item> - <item msgid="1669461741568287396">"Pamata"</item> - <item msgid="4894328801530136615">"Uzlabots"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: saglabāts"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Turiet taustiņu nospiestu, lai skatītu uzsvēruma zīmes (ø, ö u.c.)."</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Jebkurā brīdī nospiediet taustiņu Atpakaļ ↶, lai aizvērtu tastatūru."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Piekļūt cipariem un simboliem"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Nospiediet kreisajā pusē esošo vārdu un turiet, lai pievienotu to vārdnīcai."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Pieskarieties šim ieteikumam, lai turpinātu »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Pieskarieties šeit, lai aizvērtu šo ieteikumu un sāktu ievadi."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastatūra tiek atvērta ikreiz, kad pieskaraties teksta laukam"</b>"."</string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Pieskarieties taustiņam un turiet, lai skatītu uzsvara zīmes"\n"(ø, ö, ô, ó utt.)."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Pieskarieties šim taustiņam, lai izmantotu ciparus un simbolus."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Vēlreiz pieskarieties šim taustiņam, lai atkal izmantotu burtus."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Pieskarieties taustiņam un turiet, lai mainītu tastatūras iestatījumus, piemēram, automātisko pabeigšanu."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Izmēģiniet to!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Sākt"</string> <string name="label_next_key" msgid="362972844525672568">"Tālāk"</string> <string name="label_done_key" msgid="2441578748772529288">"Gatavs"</string> <string name="label_send_key" msgid="2815056534433717444">"Sūtīt"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Balss ievade"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Balss ievade jūsu valodā pašlaik netiek atbalstīta, taču tā ir pieejama angļu valodā."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Balss ievade ir izmēģinājuma funkcija, kuras pamatā ir Google tīkla runas atpazīšanas līdzeklis."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Lai izslēgtu balss ievadi, atveriet tastatūras iestatījumus."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Lai izmantotu balss ievadi, nospiediet mikrofona pogu vai slidiniet pirkstus pāri ekrāna tastatūrai."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balss ievade ir izmēģinājuma funkcija, kuras pamatā ir Google tīkla runas atpazīšanas līdzeklis."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Lai izslēgtu balss ievadi, atveriet tastatūras iestatījumus."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Lai izmantotu balss ievadi, nospiediet mikrofona pogu vai slidiniet pirkstus pāri ekrāna tastatūrai."</string> <string name="voice_listening" msgid="467518160751321844">"Runājiet!"</string> <string name="voice_working" msgid="6666937792815731889">"Notiek apstrāde"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Atcelt"</string> <string name="ok" msgid="7898366843681727667">"Labi"</string> <string name="voice_input" msgid="2466640768843347841">"Balss ievade"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Izmantojot galveno tastatūru"</item> - <item msgid="8529385602829095903">"Izmantojot simbolu tastatūru"</item> - <item msgid="7283103513488381103">"Izsl."</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Galvenās tastatūras mikrofons"</item> - <item msgid="6907837061058876770">"Simbolu tastatūras mikrofons"</item> - <item msgid="3664304608587798036">"Balss ievade ir atspējota"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automātiski iesniegt pēc balss ievades"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Automātiski nospiest ievades taustiņu, meklējot vai pārejot uz nākamo lauku."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Tastatūras atvēršana"\n</b></font><font size="3">\n</font>"Pieskarieties jebkuram teksta laukam."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tastatūras aizvēršana"\n</b></font><font size="3">\n</font>"Nospiediet taustiņu Atpakaļ."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Pieskarieties taustiņam un turiet, lai skatītu opcijas."\n</b></font><font size="3">\n</font>"Piekļūstiet pieturzīmēm un uzsvara zīmēm."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastatūras iestatījumi"\n</b></font><font size="3">\n</font>"Pieskarieties taustiņam "<b>"?123"</b>" un turiet."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Uz galv. tastatūras"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Uz simbolu tastat."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Izslēgts"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr.uz galv.tastat."</string> + <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="language_selection_title" msgid="1651299598555326750">"Ievades valodas"</string> <string name="language_selection_summary" msgid="187110938289512256">"Slidiniet pirkstu uz atstarpes taustiņa, lai mainītu valodu"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Iespējot lietotāju atsauksmes"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Palīdziet uzlabot šo ievades metodes redaktoru, automātiski nosūtot lietojuma statistiku un pārskatus par avārijām uzņēmumam Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Pieskarties, lai izlabotu vārdus"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Pieskarties ievadītajiem vārdiem, lai tos labotu"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pieskarties ievadītajiem vārdiem, lai tos labotu"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tastatūras motīvs"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatūra"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"balss"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Čehu tastatūra"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dāņu tastatūra"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Vācu tastatūra"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angļu tastatūra (Lielbritānija)"</string> + <!-- outdated translation 2979257184475020604 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angļu tastatūra (ASV)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spāņu tastatūra"</string> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franču tastatūra"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Itālieš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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voice čehu valodā"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voice vācu valodā"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Voice angļu valodā (Austrālija)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Voice angļu valodā (Lielbritānija)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Voice angļu valodā (Indija)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Voice angļu valodā (Jaunzēlande)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Voice angļu valodā (ASV)"</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> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <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> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Voice ķīniešu valodā (Ķīna)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Voice ķīniešu valodā (Taivāna)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-nb/donottranslate-altchars.xml b/java/res/values-nb/donottranslate-altchars.xml index 6257dfc31..c65dea9fb 100644 --- a/java/res/values-nb/donottranslate-altchars.xml +++ b/java/res/values-nb/donottranslate-altchars.xml @@ -18,20 +18,22 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">äáàâąã</string> - <string name="alternates_for_e">3éèêëę€</string> - <string name="alternates_for_i">íìîï8</string> - <string name="alternates_for_o">öóòôõ9</string> - <string name="alternates_for_u">üúùûū7</string> - <string name="alternates_for_s">śšşß</string> - <string name="alternates_for_n">ńñň</string> - <string name="alternates_for_c">çćč</string> - <string name="alternates_for_y">ýÿ6</string> - <string name="alternates_for_d">ðď</string> - <string name="alternates_for_r">ř4</string> - <string name="alternates_for_t">ťþ5</string> - <string name="alternates_for_z">źžż</string> + <string name="alternates_for_a">ä,á,à,â,ą,ã</string> + <string name="alternates_for_e">3,é,è,ê,ë,ę,€</string> + <string name="alternates_for_i">í,ì,î,ï,8</string> + <string name="alternates_for_o">ö,ó,ò,ô,õ,9</string> + <string name="alternates_for_u">ü,ú,ù,û,ū,7</string> + <string name="alternates_for_s">ś,š,ş,ß</string> + <string name="alternates_for_n">ń,ñ,ň</string> + <string name="alternates_for_c">ç,ć,č</string> + <string name="alternates_for_d">ð,ď</string> + <string name="alternates_for_r">ř,4</string> + <string name="alternates_for_t">ť,þ,5</string> + <string name="alternates_for_z">ź,ž,ż</string> <string name="alternates_for_l">ł</string> <string name="alternates_for_v">w</string> - <string name="alternates_for_oe">œ</string> + <string name="keylabel_for_scandinavia_row2_10">ø</string> + <string name="keylabel_for_scandinavia_row2_11">æ</string> + <string name="alternates_for_scandinavia_row2_10">ö</string> + <string name="alternates_for_scandinavia_row2_11">ä</string> </resources> diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index c98b8f4da..7e5b45301 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Rett opp skrivefeil"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Slå på retting av skrivefeil"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Rett opp skrivefeil i breddeformat"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Slå på retting av skrivefeil"</string> - <string name="auto_correction" msgid="7911639788808958255">"Autokorrektur"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Autokorriger forrige ord"</string> - <string name="prediction" msgid="466220283138359837">"Ordforslag"</string> - <string name="prediction_category" msgid="7027100625580696660">"Innstillinger for ordforslag"</string> - <string name="prediction_summary" msgid="459788228830873110">"Skru på autofullføring under skriving"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autofullfør"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Større tekstfelt"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skjul ordforslag i breddeformat"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Innstillinger for ordforslag"</string> <string name="auto_cap" msgid="1719746674854628252">"Stor forbokstav"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Start automatisk setninger med stor bokstav"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatisk punktum"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Autokorrektur"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Retter vanlige stavefeil"</string> - <string name="show_suggestions" msgid="507074425254289133">"Vis forslag"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Vis foreslåtte ord under skriving"</string> - <string name="auto_complete" msgid="1103196318775486023">"Autofullføring"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Mellomrom og punktum setter automatisk inn valgt ord"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Automatisk retting"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Mellomromstast og tegnsettingstegn setter automatisk inn det uthevede ordet"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Av"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderat"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Omfattende"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram-forslag"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Bruk forrige ord til å forbedre forslaget"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Ingen"</item> - <item msgid="1669461741568287396">"Grunnleggende"</item> - <item msgid="4894328801530136615">"Avansert"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Lagret"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Hold en tast nede for å se aksenterte tegn (ø, ö, osv.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Trykk tilbakeknappen, ↶, for å lukke tastaturet"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Få tilgang til tall og symboler"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Trykk lenge på ordet lengst til venstre for å legge det til i ordlisten"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Trykk på dette hintet for å forsette »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Trykk her for å lukke dette hintet og begynne å skrive!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastaturet åpnes når du tar på et tekstfelt"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Trykk på og hold nede en tast for å se aksenter"\n"(ø, ö, ô, ó, osv.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Bytt til tall og symboler ved å trykke på denne tasten"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Gå tilbake til bokstaver igjen ved å trykke på denne tasten"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Trykk på og hold nede denne tasten for å endre tastaturinnstillinger, som autofullføring"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prøv det!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Gå"</string> <string name="label_next_key" msgid="362972844525672568">"Neste"</string> <string name="label_done_key" msgid="2441578748772529288">"Utfør"</string> <string name="label_send_key" msgid="2815056534433717444">"Send"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Stemmedata"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmedata håndteres foreløpig ikke på ditt språk, men fungerer på engelsk."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Talekommandoer er en eksperimentell funksjon som bruker Googles nettverksbaserte talegjenkjenning."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Gå til innstillinger for tastatur for å slå av stemmedata."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Du bruker talekommandoer ved å trykke på mikrofonknappen eller skyve fingeren over tastaturet på skjermen."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Talekommandoer er en eksperimentell funksjon som bruker Googles nettverksbaserte talegjenkjenning."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Gå til innstillinger for tastatur for å slå av stemmedata."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Du bruker talekommandoer ved å trykke på mikrofonknappen eller skyve fingeren over tastaturet på skjermen."</string> <string name="voice_listening" msgid="467518160751321844">"Snakk nå"</string> <string name="voice_working" msgid="6666937792815731889">"Arbeider"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Avbryt"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Talekommando"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"På hovedtastatur"</item> - <item msgid="8529385602829095903">"På talltastatur"</item> - <item msgid="7283103513488381103">"Av"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon på hovedtastatur"</item> - <item msgid="6907837061058876770">"Mikrofon på talltastatur"</item> - <item msgid="3664304608587798036">"Talekommando er deaktivert"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Send inn automatisk etter tale"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Trykk Enter automatisk ved søk eller flytting til neste felt."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Åpne tastaturet"\n</b></font><font size="3">\n</font>"Trykk på et tekstfelt."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Lukke tastaturet"\n</b></font><font size="3">\n</font>"Trykk på tilbaketasten."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Trykk og hold nede en tast for flere valg"\n</b></font><font size="3">\n</font>"Få tilgang til skilletegn og aksenter."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Innstillinger for tastatur"\n</b></font><font size="3">\n</font>"Trykk på & hold "<b>"?123"</b>"-tasten."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".no"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".com"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".net"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".org"</string> - <string name="popular_domain_4" msgid="35359437471311470">".info"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På hovedtastatur"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På talltastatur"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Av"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon på hovedtast."</string> + <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="language_selection_title" msgid="1651299598555326750">"Inndataspråk"</string> <string name="language_selection_summary" msgid="187110938289512256">"Dra fingeren på mellomromstasten for å endre språk"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brukertilbakemelding"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ved å sende bruksstatistikk og programstopprapporter til Google automatisk, hjelper du oss med å gjøre redigeringsfunksjonen for denne inndatametoden enda bedre."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Trykk for å endre ord"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Du kan endre innskrevne ord ved å trykke på dem"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Du kan endre innskrevne ord ved å trykke på dem"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tastaturtema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatur"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"stemme"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-nl/donottranslate-altchars.xml b/java/res/values-nl/donottranslate-altchars.xml deleted file mode 100644 index d3beafade..000000000 --- a/java/res/values-nl/donottranslate-altchars.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> -</resources> diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index c907344eb..e5243c83d 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Trillen bij druk op toets"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Geluid bij druk op een toets"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pop-up bij toetsaanslag"</string> - <string name="hit_correction" msgid="4855351009261318389">"Typefouten corrigeren"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Foutcorrectie tijdens invoer inschakelen"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Invoerfouten in liggende weergave"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Foutcorrectie tijdens invoer inschakelen"</string> - <string name="auto_correction" msgid="7911639788808958255">"Woordsuggesties"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Het vorige woord automatisch corrigeren"</string> - <string name="prediction" msgid="466220283138359837">"Woordsuggesties"</string> - <string name="prediction_category" msgid="7027100625580696660">"Instellingen voor woordsuggesties"</string> - <string name="prediction_summary" msgid="459788228830873110">"Automatisch voltooien tijdens typen inschakelen"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatisch voltooien"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Tekstveld vergroten"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Woordsuggesties verbergen in liggende weergave"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Instellingen voor woordsuggesties"</string> <string name="auto_cap" msgid="1719746674854628252">"Auto-hoofdlettergebruik"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Hoofdletter gebruiken aan het begin van een zin"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatische interpunctie"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Suggesties weergeven"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Voorgestelde woorden weergeven tijdens typen"</string> - <string name="auto_complete" msgid="1103196318775486023">"Auto-aanvullen"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Gemarkeerd woord automatisch invoegen met spatiebalk en interpunctie"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Auto-correctie"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Woord inv. met spatieb. en interp."</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Uitgeschakeld"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Normaal"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agressief"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Digram-suggesties"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Vorig woord gebruiken om suggestie te verbeteren"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Geen"</item> - <item msgid="1669461741568287396">"Basis"</item> - <item msgid="4894328801530136615">"Geavanceerd"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: opgeslagen"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Houd een toets ingedrukt om diakritische tekens weer te geven (ø, ö, enzovoort)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Druk op elk gewenst moment op de toets Terug ↶ om het toetsenbord te sluiten"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Toegang tot cijfers en symbolen"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Blijf drukken op het meest linkse woord om het toe te voegen aan het woordenboek"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Raak deze tip aan om door te gaan »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Raak dit punt aan om deze tip te sluiten en te beginnen met typen."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Het toetsenbord wordt geopend wanneer u een tekstveld aanraakt"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Blijf een toets aanraken om diakritische tekens weer te geven"\n"(ø, ö, ô, ó, enzovoort)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Schakel over naar cijfers en symbolen door deze toets aan te raken"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Ga terug naar letters door deze toets nogmaals aan te raken"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Blijf deze toets aanraken om toetsenbordinstellingen te wijzigen, zoals auto-aanvullen"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Probeer het zelf!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Beginnen"</string> <string name="label_next_key" msgid="362972844525672568">"Volgende"</string> <string name="label_done_key" msgid="2441578748772529288">"Gereed"</string> <string name="label_send_key" msgid="2815056534433717444">"Verzenden"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"Alt"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Spraakinvoer"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spraakinvoer wordt momenteel niet ondersteund in uw taal, maar is wel beschikbaar in het Engels."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Spraakinvoer is een experimentele functie met de spraakherkenning van het Google-netwerk."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Als u spraakinvoer wilt uitschakelen, gaat u naar de toetsenbordinstellingen."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Als u spraakinvoer gebruikt, drukt u op de microfoonknop of schuift u uw vinger over het schermtoetsenbord."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Spraakinvoer is een experimentele functie met de spraakherkenning van het Google-netwerk."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Als u spraakinvoer wilt uitschakelen, gaat u naar de toetsenbordinstellingen."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Als u spraakinvoer gebruikt, drukt u op de microfoonknop of schuift u uw vinger over het schermtoetsenbord."</string> <string name="voice_listening" msgid="467518160751321844">"Nu spreken"</string> <string name="voice_working" msgid="6666937792815731889">"Wordt uitgevoerd"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Annuleren"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Spraakinvoer"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Op hoofdtoetsenbord"</item> - <item msgid="8529385602829095903">"Op toetsenbord voor symbolen"</item> - <item msgid="7283103513488381103">"Uit"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfoon op hoofdtoetsenbord"</item> - <item msgid="6907837061058876770">"Microfoon op toetsenbord voor symbolen"</item> - <item msgid="3664304608587798036">"Spraakinvoer is uitgeschakeld"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automatisch verzenden na spraak"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Drukt automatisch op Enter tijdens het zoeken of wanneer u naar het volgende veld wilt gaan."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Het toetsenbord openen"\n</b></font><font size="3">\n</font>"Raak een tekstveld aan."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Het toetsenbord sluiten"\n</b></font><font size="3">\n</font>"Druk op de terugtoets."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Een toets blijven aanraken voor opties"\n</b></font><font size="3">\n</font>"Toegang tot interpunctie en diakritische tekens."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Toetsenbordinstellingen"\n</b></font><font size="3">\n</font>"Blijf de toets \'"<b>"?123"</b>"\' aanraken."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Op hoofdtoetsenbord"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Op symbooltoetsenb."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Uitgeschakeld"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic op hoofdtoetsb."</string> + <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="language_selection_title" msgid="1651299598555326750">"Invoertalen"</string> <string name="language_selection_summary" msgid="187110938289512256">"Schuif uw vinger over de spatiebalk om de taal te wijzigen"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Gebruikersfeedback inschakelen."</string> <string name="prefs_description_log" msgid="5827825607258246003">"Help deze invoermethode te verbeteren door automatisch gebruiksstatistieken en crashmeldingen naar Google te verzenden."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Raak aan om woorden opnieuw te corrigeren"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"U kunt woorden opnieuw corrigeren door woorden aan te raken die u heeft getypt"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"U kunt woorden opnieuw corrigeren door woorden aan te raken die u heeft getypt"</string> <string name="keyboard_layout" msgid="437433231038683666">"Toetsenbordthema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"toetsenbord"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"spraak"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-pl/donottranslate-altchars.xml b/java/res/values-pl/donottranslate-altchars.xml index da6b5fd5c..df8c52b47 100644 --- a/java/res/values-pl/donottranslate-altchars.xml +++ b/java/res/values-pl/donottranslate-altchars.xml @@ -19,14 +19,11 @@ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="alternates_for_a">ą</string> - <string name="alternates_for_e">ę3</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">ó9</string> - <string name="alternates_for_u">ùúûü7</string> + <string name="alternates_for_e">ę,3</string> + <string name="alternates_for_o">ó,9</string> <string name="alternates_for_s">ś</string> <string name="alternates_for_n">ń</string> <string name="alternates_for_c">ć</string> - <string name="alternates_for_y">ýÿ6</string> - <string name="alternates_for_z">źż</string> + <string name="alternates_for_z">ź,ż</string> <string name="alternates_for_l">ł</string> </resources> diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index a2f429e23..2f0b064ab 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -26,68 +26,48 @@ <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">"Wyświetlaj po naciśnięciu klawisza"</string> - <string name="hit_correction" msgid="4855351009261318389">"Popraw błędy pisowni"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Włącz poprawianie błędów wprowadzania"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Błędy wprowadzania w orientacji poziomej"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Włącz poprawianie błędów wprowadzania"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugestie słów"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automatycznie poprawiaj poprzednie słowo"</string> - <string name="prediction" msgid="466220283138359837">"Sugestie słów"</string> - <string name="prediction_category" msgid="7027100625580696660">"Ustawienia propozycji słów"</string> - <string name="prediction_summary" msgid="459788228830873110">"Włącz autouzupełnianie podczas wpisywania"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autouzupełnianie"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Zwiększ rozmiar pola tekstowego"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Wyłącz sugestie słów w orientacji poziomej"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Ustawienia propozycji słów"</string> <string name="auto_cap" msgid="1719746674854628252">"Wstawiaj wielkie litery"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Zamieniaj na wielką pierwszą literę zdania"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatyczna interpunkcja"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Pokaż sugestie"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Wyświetl sugerowane słowa podczas wpisywania"</string> - <string name="auto_complete" msgid="1103196318775486023">"Autouzupełnianie"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Spacja i znaki przestankowe wstawiają wyróżnione słowo"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Autokorekta"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Spacja i znaki przestankowe automatycznie wstawiają podświetlone słowo"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Wyłącz"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Umiarkowana"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresywna"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Sugestie dla bigramów"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Używaj poprzedniego wyrazu, aby polepszyć sugestię"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Brak"</item> - <item msgid="1669461741568287396">"Podstawowy"</item> - <item msgid="4894328801530136615">"Zaawansowany"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Zapisano"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Przytrzymaj klawisz, aby wyświetlić znaki akcentowane (ą, ó itp.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Naciśnij klawisz cofania ↶, aby zamknąć klawiaturę w dowolnym momencie"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Przejdź do cyfr i symboli"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Naciśnij i przytrzymaj słowo po lewej stronie w celu dodania go do słownika"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Dotknij tej podpowiedzi, aby kontynuować »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Dotknij tutaj, aby zamknąć tę podpowiedź i zacząć pisać!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klawiatura jest otwierana po każdym dotknięciu pola tekstowego."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Dotknij i przytrzymaj klawisz, aby wyświetlić znaki akcentowane"\n"(ą, ę, ł, ó itd.)."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Przełącz na cyfry i symbole, dotykając tego klawisza."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Wróć do trybu liter, dotykając ponownie tego klawisza."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Dotknij i przytrzymaj ten klawisz, aby zmienić ustawienia klawiatury, takie jak autouzupełnianie."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Wypróbuj!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"OK"</string> <string name="label_next_key" msgid="362972844525672568">"Dalej"</string> <string name="label_done_key" msgid="2441578748772529288">"Gotowe"</string> <string name="label_send_key" msgid="2815056534433717444">"Wyślij"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Wprowadzanie głosowe"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Wprowadzanie głosowe obecnie nie jest obsługiwane w Twoim języku, ale działa w języku angielskim."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Wprowadzanie głosowe to funkcja eksperymentalna wykorzystująca funkcję firmy Google umożliwiającą rozpoznawanie mowy przy użyciu sieci."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Aby wyłączyć wprowadzanie głosowe, przejdź do ustawień klawiatury."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Aby skorzystać z wprowadzania głosowego, naciśnij przycisk mikrofonu lub przesuń palcem po klawiaturze ekranowej."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Wprowadzanie głosowe to funkcja eksperymentalna wykorzystująca funkcję firmy Google umożliwiającą rozpoznawanie mowy przy użyciu sieci."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Aby wyłączyć wprowadzanie głosowe, przejdź do ustawień klawiatury."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Aby skorzystać z wprowadzania głosowego, naciśnij przycisk mikrofonu lub przesuń palcem po klawiaturze ekranowej."</string> <string name="voice_listening" msgid="467518160751321844">"Mów teraz"</string> <string name="voice_working" msgid="6666937792815731889">"W toku"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Anuluj"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Wprowadzanie głosowe"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Na klawiaturze głównej"</item> - <item msgid="8529385602829095903">"Na klawiaturze z symbolami"</item> - <item msgid="7283103513488381103">"Wyłączone"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon na klawiaturze głównej"</item> - <item msgid="6907837061058876770">"Mikrofon na klawiaturze z symbolami"</item> - <item msgid="3664304608587798036">"Wprowadzanie głosowe jest wyłączone"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automatyczne przesyłanie uruchamiane głosem"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Podczas wyszukiwania lub przechodzenia do następnego pola automatycznie naciśnij klawisz Enter."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otwórz klawiaturę"\n</b></font><font size="3">\n</font>"Dotknij dowolnego pola tekstowego."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zamknij klawiaturę"\n</b></font><font size="3">\n</font>"Naciśnij klawisz Wróć."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Dotknij klawisza i przytrzymaj go, aby wyświetlić opcje"\n</b></font><font size="3">\n</font>"Dostęp do znaków przestankowych i akcentowanych."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Ustawienia klawiatury"\n</b></font><font size="3">\n</font>"Dotknij klawisza "<b>"?123"</b>" i przytrzymaj go."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na klawiaturze głównej"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klawiaturze z symbolami"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Wyłącz"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon na klawiaturze głównej"</string> + <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 metodę wprowadzania"</string> <string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string> <string name="language_selection_summary" msgid="187110938289512256">"Przesuń palcem po spacji, aby zmienić język"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Włącz przesyłanie opinii użytkownika"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Pomóż ulepszyć edytor tej metody wprowadzania, automatycznie wysyłając do Google statystyki użycia i raporty o awariach."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotknij, aby ponownie poprawić słowa"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Możesz ponownie poprawiać wprowadzone słowa, dotykając ich"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Możesz ponownie poprawiać wprowadzone słowa, dotykając ich"</string> <string name="keyboard_layout" msgid="437433231038683666">"Motyw klawiatury"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klawiatura"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"głosowe"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-pt-rPT/donottranslate-altchars.xml b/java/res/values-pt-rPT/donottranslate-altchars.xml deleted file mode 100644 index d3beafade..000000000 --- a/java/res/values-pt-rPT/donottranslate-altchars.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> -</resources> diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 01d96edc5..c95e84d92 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Corrigir erros de escrita"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Activar a correcção de erros de entrada"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Erros de entrada na horizontal"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activar a correcção de erros de entrada"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugestões de palavras"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corrigir automaticamente a palavra anterior"</string> - <string name="prediction" msgid="466220283138359837">"Sugestões de palavras"</string> - <string name="prediction_category" msgid="7027100625580696660">"Definições de sugestão de palavras"</string> - <string name="prediction_summary" msgid="459788228830873110">"Activar a conclusão automática durante a escrita"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Conclusão automática"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar o tamanho do campo de texto"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugestões de palavras na vista horizontal"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Definições de sugestão de palavras"</string> <string name="auto_cap" msgid="1719746674854628252">"Letras maiúsculas automáticas"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Colocar inicial maiúscula no início de uma frase"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Pontuação automática"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Mostrar sugestões"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Apresentar sugestões de palavras ao escrever"</string> - <string name="auto_complete" msgid="1103196318775486023">"Conclusão automática"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"A barra de espaços e a pontuação inserem automaticamente uma palavra realçada"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Auto correcção"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"A barra de espaço e a pontuação inserem automaticamente uma palavra realçada"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desligar"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderada"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agressiva"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Sugestões Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilizar a palavra anterior para melhorar a sugestão"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nenhum"</item> - <item msgid="1669461741568287396">"Básico"</item> - <item msgid="4894328801530136615">"Avançados"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Mantenha uma tecla premida para ver os acentos (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Prima a tecla de retrocesso ↶ para fechar o teclado a qualquer momento"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Aceder a números e símbolos"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Prima e mantenha premida a palavra mais à esquerda para a adicionar ao dicionário"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Toque nesta sugestão para continuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Toque aqui para fechar esta sugestão e começar a escrever!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"O teclado abre quando tocar num campo de texto"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Mantenha premida uma tecla para ver os acentos"\n"(ø, ö, ô, ó, etc.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Mude para números e símbolos tocando nesta tecla"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Regresse às letras tocando novamente nesta tecla"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Mantenha premida esta tecla para alterar definições do teclado, tais como a conclusão automática"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Experimente!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Ir"</string> <string name="label_next_key" msgid="362972844525672568">"Seguinte"</string> <string name="label_done_key" msgid="2441578748772529288">"Feito"</string> <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente, a entrada de voz não é suportada para o seu idioma, mas funciona em inglês."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A entrada de voz é uma funcionalidade experimental que utiliza o reconhecimento de voz em rede da Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar a entrada de voz, aceda às definições do teclado."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para utilizar a entrada de voz, prima o botão do microfone ou deslize o dedo no teclado do ecrã."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de voz é uma funcionalidade experimental que utiliza o reconhecimento de voz em rede da Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar a entrada de voz, aceda às definições do teclado."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para utilizar a entrada de voz, prima o botão do microfone ou deslize o dedo no teclado do ecrã."</string> <string name="voice_listening" msgid="467518160751321844">"Falar agora"</string> <string name="voice_working" msgid="6666937792815731889">"A executar"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Entrada de voz"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"No teclado principal"</item> - <item msgid="8529385602829095903">"No teclado de símbolos"</item> - <item msgid="7283103513488381103">"Desactivada"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfone no teclado principal"</item> - <item msgid="6907837061058876770">"Microfone no teclado de símbolos"</item> - <item msgid="3664304608587798036">"A entrada de voz está desactivada"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Enviar automaticamente depois da voz"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Premir automaticamente ENTER ao pesquisar ou avançar para o campo seguinte."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abra o teclado"\n</b></font><font size="3">\n</font>"Toque em qualquer campo de texto."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Feche o teclado"\n</b></font><font size="3">\n</font>"Prima a tecla \"Anterior\"."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Mantenha premida uma tecla para as opções"\n</b></font><font size="3">\n</font>"Aceder a pontuação e acentos."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Definições do teclado"\n</b></font><font size="3">\n</font>"Mantenha premida a tecla "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"No teclado principal"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"No teclado símbolos"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Desligar"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic. tecl. principal"</string> + <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="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> <string name="language_selection_summary" msgid="187110938289512256">"Deslize o dedo pela barra de espaço para alterar o idioma"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Activar comentários do utilizador"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Envie automaticamente estatísticas de utilização e relatórios de falhas para a Google e ajude-nos a melhor este editor de método de introdução."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para voltar a corrigir palavras"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Pode voltar a corrigir palavras tocando naquelas que escreveu"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pode voltar a corrigir palavras tocando naquelas que escreveu"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema do teclado"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclado"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voz"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-pt/donottranslate-altchars.xml b/java/res/values-pt/donottranslate-altchars.xml deleted file mode 100644 index d3beafade..000000000 --- a/java/res/values-pt/donottranslate-altchars.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> -</resources> diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 0acaf25d6..831a9c517 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -26,68 +26,51 @@ <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 tocar a tecla"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corrigir erros de digitação"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Ativar a correção de erro de entrada"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Erros de entrada de paisagem"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Ativar a correção de erro de entrada"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugestões de palavra"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corrigir automaticamente a palavra anterior"</string> - <string name="prediction" msgid="466220283138359837">"Sugestões de palavra"</string> - <string name="prediction_category" msgid="7027100625580696660">"Configurações de sugestão de palavra"</string> - <string name="prediction_summary" msgid="459788228830873110">"Ativar a conclusão automática durante a digitação"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Conclusão automática"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar o tamanho do arquivo de texto"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugestões de palavra na visualização da paisagem"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Configurações de sugestão de palavra"</string> <string name="auto_cap" msgid="1719746674854628252">"Capitaliz. automática"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Colocar em maiúscula o início de uma frase"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Pontuação automática"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Mostrar sugestões"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Exibir sugestões de palavras durante a digitação"</string> - <string name="auto_complete" msgid="1103196318775486023">"Conclusão automática"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Barra de espaço e pontuação inserem a palavra destacada"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de configuraçõ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">"Sempre ocultar"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Sugestões de palavra"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Corrigir automaticamente a palavra anterior"</string> + <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) --> + <skip /> <string name="bigram_suggestion" msgid="1323347224043514969">"Sugestões de bigrama"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Usar palavra anterior para melhorar a sugestão"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nenhum"</item> - <item msgid="1669461741568287396">"Básico"</item> - <item msgid="4894328801530136615">"Avançado"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Salvo"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Segure uma tecla pressionada para ver os acentos (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Apertar a tecla voltar ↶ para fechar o teclado, em qualquer ponto"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Acessar números e símbolos"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Pressione e segure a palavra mais à esquerda para adicioná-la ao dicionário"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Toque nesta dica para continuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Toque aqui para fechar esta dica e começar a digitar!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"O teclado abre toda vez que você tocar em um campo de texto"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tocar e segurar uma tecla para visualizar acentos"\n"(ø, ö, ô, ó e assim por diante)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Alternar para números e símbolos tocando nessa tecla"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Voltar às letras tocando novamente nessa tecla"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tocar e segurar esta tecla para alterar as configurações do teclado, como a conclusão automática"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Experimente!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Ir"</string> <string name="label_next_key" msgid="362972844525672568">"Avançar"</string> <string name="label_done_key" msgid="2441578748772529288">"Feito"</string> <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A entrada de voz não é suportada no momento para o seu idioma, mas funciona em inglês."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A entrada de voz é um recurso experimental que usa o reconhecimento de fala de rede do Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desativar a entrada de voz, vá para as configurações do teclado."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para usar a entrada de voz, pressione o botão com o microfone ou deslize o dedo sobre o teclado na tela."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de voz é um recurso experimental que usa o reconhecimento de fala de rede do Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desativar a entrada de voz, vá para as configurações do teclado."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para usar a entrada de voz, pressione o botão com o microfone ou deslize o dedo sobre o teclado na tela."</string> <string name="voice_listening" msgid="467518160751321844">"Fale agora"</string> <string name="voice_working" msgid="6666937792815731889">"Trabalhando"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +87,18 @@ <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Entrada de voz"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"No teclado principal"</item> - <item msgid="8529385602829095903">"No teclado de símbolos"</item> - <item msgid="7283103513488381103">"Desativado"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfone no teclado principal"</item> - <item msgid="6907837061058876770">"Microfone no teclado de símbolos"</item> - <item msgid="3664304608587798036">"Entrada de voz desativada"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Enviar automaticamente depois de falar"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Pressione Enter automaticamente ao pesquisar ou ir para o próximo campo."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abra o teclado"\n</b></font><font size="3">\n</font>"Toque em qualquer campo de texto."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Feche o teclado"\n</b></font><font size="3">\n</font>"Pressione a tecla Voltar."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Toque e mantenha pressionada uma tecla para ver as opções"\n</b></font><font size="3">\n</font>"Acesse a pontuação e as pronúncias."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Configurações de teclado"\n</b></font><font size="3">\n</font>"Toque e mantenha pressionada a tecla "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) --> + <skip /> + <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) --> + <skip /> + <!-- no translation found for voice_input_modes_off (3745699748218082014) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_off (63875609591897607) --> + <skip /> <string name="selectInputMethod" msgid="315076553378705821">"Selecionar método de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> <string name="language_selection_summary" msgid="187110938289512256">"Deslize o dedo na barra de espaços para alterar o idioma"</string> @@ -133,8 +107,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Ativar comentário do usuário"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ajude a melhorar este editor de método de entrada enviando automaticamente ao Google estatísticas de uso e relatórios de falhas."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Toque para corrigir novamente as palavras"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Você pode fazer novamente a correção tocando nas palavras digitadas"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Você pode fazer novamente a correção tocando nas palavras digitadas"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema do teclado"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclado"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voz"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-rm/donottranslate-altchars.xml b/java/res/values-rm/donottranslate-altchars.xml index f17026fa9..b44c3c005 100644 --- a/java/res/values-rm/donottranslate-altchars.xml +++ b/java/res/values-rm/donottranslate-altchars.xml @@ -18,13 +18,5 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóöôõœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_o">ò,ó,ö,ô,õ,œ,ø,9</string> </resources> diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml index 47afae9a6..2b828a466 100644 --- a/java/res/values-rm/strings.xml +++ b/java/res/values-rm/strings.xml @@ -27,28 +27,22 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Curreger sbagls d\'endataziun"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Activar la correctura da sbagls d\'endataziun"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Sbagls d\'endataziun en il format orizontal"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activar la correctura da sbagls d\'endataziun"</string> - <string name="auto_correction" msgid="7911639788808958255">"Propostas da pleds"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Curreger automaticamain il pled precedent"</string> - <string name="prediction" msgid="466220283138359837">"Propostas da pleds"</string> - <string name="prediction_category" msgid="7027100625580696660">"Parameters da las propostas per pleds"</string> - <string name="prediction_summary" msgid="459788228830873110">"Activar la cumplettaziun automatica durant l\'endataziun"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Cumplettaziun automatica"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Engrondir il champ da text"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Zuppentar propostas da pleds en il format orizontal"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Parameters da las propostas per pleds"</string> <string name="auto_cap" msgid="1719746674854628252">"Maiusclas automaticas"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Scriver grond l\'entschatta da mintga frasa"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Interpuncziun automatica"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Correcturas sveltas"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Curregia sbagls da tippar currents"</string> - <string name="show_suggestions" msgid="507074425254289133">"Mussar las propostas"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Mussar pleds proponids durant l\'endataziun"</string> - <string name="auto_complete" msgid="1103196318775486023">"Cumplettaziun automatica"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Inserir auto. il pled marcà cun la tasta da vid/interpuncziun"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <!-- no translation found for prefs_settings_key (4623341240804046498) --> <skip /> <!-- no translation found for settings_key_mode_auto_name (2993460277873684680) --> @@ -57,42 +51,34 @@ <skip /> <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) --> <skip /> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Propostas da pleds"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Curreger automaticamain il pled precedent"</string> + <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) --> + <skip /> <string name="bigram_suggestion" msgid="1323347224043514969">"Propostas da tip bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Meglierar la proposta cun agid dal pled precedent"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nagin"</item> - <item msgid="1669461741568287396">"Simpel"</item> - <item msgid="4894328801530136615">"Avanzà"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Memorisà"</string> - <string name="tip_long_press" msgid="6101270866284343344">"\"Tegnair smatgà per mussar ils accents (à, é, etc.)\""</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Smatgar ↶ per serrar la tastatura"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Acceder a cifras e simbols"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Smatgar ditg sin il pled dal tut a sanestra per l\'agiuntar al dicziunari"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Tutgar quest commentari per cuntinuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"\"Tutgar qua, per serrar quest commentari e cumenzar a tippar!\""</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"La tastatura vegn adina averta sche Vus tutgais in champ da text."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501">"\""<b>"Tegnai smatgà ina tasta per mussar ils segns spezials"\n"(ø, ö, ô, ó etc.)."</b>"\""</string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Midai a numers e simbols cun tutgar quest buttun."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Turnai a letras cun smatgar danovamain quest buttun."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128">"\""<b>"Tegnai smatgà quest buttun per midar ils parameters da tastatura, sco p. ex. la cumplettaziun automatica."</b>"\""</string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Empruvai!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Dai"</string> <string name="label_next_key" msgid="362972844525672568">"Vinavant"</string> <string name="label_done_key" msgid="2441578748772529288">"Finì"</string> <string name="label_send_key" msgid="2815056534433717444">"Trametter"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <skip /> + <!-- no translation found for label_more_key (3760239494604948502) --> + <skip /> + <!-- no translation found for label_pause_key (181098308428035340) --> + <skip /> + <!-- no translation found for label_wait_key (6402152600878093134) --> + <skip /> <string name="voice_warning_title" msgid="4419354150908395008">"Cumonds vocals"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"\"Cumonds vocals en Vossa lingua na vegnan actualmain betg sustegnids, ma la funcziun è disponibla per englais.\""</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"\"Per deactivar ils cumonds vocals, avri ils parameters da tastatura.\""</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"\"Per utilisar ils cumonds vocals, smatgai il buttun dal microfon u stritgai cun il det sur la tastatura dal visur.\""</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"\"Per deactivar ils cumonds vocals, avri ils parameters da tastatura.\""</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"\"Per utilisar ils cumonds vocals, smatgai il buttun dal microfon u stritgai cun il det sur la tastatura dal visur.\""</string> <string name="voice_listening" msgid="467518160751321844">"Ussa discurrer"</string> <string name="voice_working" msgid="6666937792815731889">"Operaziun en progress"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -109,27 +95,18 @@ <string name="cancel" msgid="6830980399865683324">"Interrumper"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Cumonds vocals"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Sin la tastatura principala"</item> - <item msgid="8529385602829095903">"Sin la tastatura da simbols"</item> - <item msgid="7283103513488381103">"Deactivà"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfon sin la tastatura principala"</item> - <item msgid="6907837061058876770">"Microfon sin la tastatura da simbols"</item> - <item msgid="3664304608587798036">"Ils cumonds vocals èn deactivads"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Trametter automaticamain suenter il cumond vocal"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Smatgai sin la tasta enter sche Vus exequis ina tschertga u siglis al proxim champ."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Avrir la tastatura"\n</b></font><font size="3">\n</font>"Tutgai inqual champ da text."</string> - <string name="close_the_keyboard" msgid="6251022259044940103">"\""<font size="17"><b>"Serrar la tastatura"\n</b></font><font size="3">\n</font>"Smatgai il buttun \"\"Enavos\"\".\""</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tutgar e tegnair smatgà in buttun per acceder a las opziuns"\n</b></font><font size="3">\n</font>"Accedi a segns d\'interpuncziun ed accents."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Parameters da tastatura"\n</b></font><font size="3">\n</font>"Tutgai e tegnai smatgà il buttun "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) --> + <skip /> + <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) --> + <skip /> + <!-- no translation found for voice_input_modes_off (3745699748218082014) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_off (63875609591897607) --> + <skip /> <!-- no translation found for selectInputMethod (315076553378705821) --> <skip /> <string name="language_selection_title" msgid="1651299598555326750">"Linguas da cumonds vocals"</string> @@ -140,9 +117,79 @@ <string name="prefs_description_log" msgid="5827825607258246003">"Gidai a meglierar quest editur da la metoda d\'endataziun cun trametter automaticamain datas statisticas davart l\'utilisaziun e rapports da collaps a Google."</string> <!-- no translation found for prefs_enable_recorrection (4588408906649533582) --> <skip /> - <!-- no translation found for prefs_enable_recorrection_summary (1056068922330206170) --> + <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) --> <skip /> <string name="keyboard_layout" msgid="437433231038683666">"Design da la tastatura"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatura"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"vusch"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml index e0628ca6a..f8739d7f9 100644 --- a/java/res/values-ro/strings.xml +++ b/java/res/values-ro/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Corectaţi erorile de dactilografiere"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Activaţi corectarea erorii de intrare"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Erori de introducere în modul peisaj"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activaţi corectarea erorii de intrare"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugestii de cuvinte"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corecţie automată a cuvântului anterior"</string> - <string name="prediction" msgid="466220283138359837">"Sugestii de cuvinte"</string> - <string name="prediction_category" msgid="7027100625580696660">"Setările sugestiei de cuvinte"</string> - <string name="prediction_summary" msgid="459788228830873110">"Activaţi completarea automată în timpul introducerii textului"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Completare automată"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Măriţi dimensiunea câmpului text"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ascundeţi sugestiile de cuvinte în vizualizarea de tip peisaj"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Setările sugestiei de cuvinte"</string> <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalizare"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Doresc să se scrie cu majusculă începutul propoziţiilor"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Punctuaţie automată"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Afişaţi sugestiile"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Afişare sugestii de cuvinte în timpul introducerii de text"</string> - <string name="auto_complete" msgid="1103196318775486023">"Completare automată"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Bara de spaţiu şi punctuaţia inserează automat un cuvânt evidenţiat"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Autocorecţie"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Spaţiile/pct. inserează cuv. subl."</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Dezactivată"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderată"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivă"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Sugestii pentru cuvinte de două litere"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilizaţi cuvântul anterior pentru a îmbunătăţi sugestia"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Niciunul"</item> - <item msgid="1669461741568287396">"De bază"</item> - <item msgid="4894328801530136615">"Avansat"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: salvat"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Ţineţi o tastă apăsată pentru a vedea accentele (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Apăsaţi tasta Înapoi ↶ pentru a închide oricând tastatura"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Accesaţi numere şi simboluri"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Apăsaţi şi ţineţi apăsat pe cuvântul cel mai din stânga, pentru a-l adăuga la dicţionar"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Atingeţi acest indiciu pentru a continua »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Atingeţi aici pentru a închide acest indiciu şi începeţi să introduceţi text!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastatura se deschide de fiecare dată când atingeţi un câmp text"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Atingeţi şi ţineţi apăsată o tastă pentru a vizualiza accentele"\n"(ø, ö, ô, ó etc.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Comutaţi între numere şi simboluri atingând această tastă"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Reveniţi la litere prin atingerea acestei taste din nou"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Apăsaţi şi ţineţi apăsată această tastă pentru a schimba setările tastaturii, cum ar fi completarea automată"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Încercaţi!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Accesaţi"</string> <string name="label_next_key" msgid="362972844525672568">"Înainte"</string> <string name="label_done_key" msgid="2441578748772529288">"Terminat"</string> <string name="label_send_key" msgid="2815056534433717444">"Trimiteţi"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Intrare voce"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Intrarea vocală nu este acceptată în prezent pentru limba dvs., însă funcţionează în limba engleză."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Intrarea vocală este o funcţie experimentală ce utilizează recunoaşterea vocală în reţea oferită de Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Pentru a dezactiva intrarea vocală, accesaţi setările tastaturii."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Pentru a utiliza intrarea vocală, apăsaţi butonul de microfon sau glisaţi degetul de-a lungul tastaturii de pe ecran."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Intrarea vocală este o funcţie experimentală ce utilizează recunoaşterea vocală în reţea oferită de Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Pentru a dezactiva intrarea vocală, accesaţi setările tastaturii."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Pentru a utiliza intrarea vocală, apăsaţi butonul de microfon sau glisaţi degetul de-a lungul tastaturii de pe ecran."</string> <string name="voice_listening" msgid="467518160751321844">"Vorbiţi acum"</string> <string name="voice_working" msgid="6666937792815731889">"Se analizează"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Anulaţi"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Intrare voce"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Pe tastatura principală"</item> - <item msgid="8529385602829095903">"Pe tastatura de simboluri"</item> - <item msgid="7283103513488381103">"Dezactivat"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfon pe tastatura principală"</item> - <item msgid="6907837061058876770">"Microfon pe tastatura de simboluri"</item> - <item msgid="3664304608587798036">"Intrarea vocală este dezactivată"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Trimitere automată după intrarea vocală"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Apăsaţi automat tasta Enter atunci când se face o căutare sau când se trece la câmpul următor."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Deschideţi tastatura"\n</b></font><font size="3">\n</font>"Atingeţi orice câmp de text."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Închideţi tastatura"\n</b></font><font size="3">\n</font>"Apăsaţi pe tasta Înapoi."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Atingeţi şi ţineţi apăsată o tastă pentru opţiuni"\n</b></font><font size="3">\n</font>"Accesaţi punctuaţia şi accentele."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Setările tastaturii"\n</b></font><font size="3">\n</font>"Atingeţi şi ţineţi apăsată tasta "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pe tastat. princip."</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pe tastat. simbol."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Dezactivată"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic. pe tast. princ."</string> + <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="language_selection_title" msgid="1651299598555326750">"Selectaţi limba"</string> <string name="language_selection_summary" msgid="187110938289512256">"Glisaţi degetul pe bara de spaţiu pentru a schimba limba"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Activaţi feedback de la utilizatori"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ajutaţi la îmbunătăţirea acestui instrument de editare a metodelor de introducere a textului trimiţând în mod automat la Google statistici de utilizare şi rapoarte de blocare."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Atingeţi pentru a corecta cuvintele"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Atingeţi cuvintele introduse pentru a le corecta"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Atingeţi cuvintele introduse pentru a le corecta"</string> <string name="keyboard_layout" msgid="437433231038683666">"Temă pentru tastatură"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatură"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voce"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tastatură cehă"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Tastatură daneză"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tastatură germană"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastatură engleză (Marea Britanie)"</string> + <!-- outdated translation 2979257184475020604 --> <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> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastatură franceză"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voce cehă"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voce germană"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Voce engleză (Australia)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Voce engleză (Marea Britanie)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Voce engleză (India)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Voce engleză (Noua Zeelandă)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Voce engleză (S.U.A.)"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voce spaniolă"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voce franceză"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voce japoneză"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voce coreeană"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Voce chineză (China)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Voce chineză (Taiwan)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-ru/donottranslate-altchars.xml b/java/res/values-ru/donottranslate-altchars.xml index 46241a62a..c4f9d66d3 100644 --- a/java/res/values-ru/donottranslate-altchars.xml +++ b/java/res/values-ru/donottranslate-altchars.xml @@ -18,15 +18,6 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">èéêë</string> - <string name="alternates_for_i">ìíîï</string> - <string name="alternates_for_o">òóôõöœø</string> - <string name="alternates_for_u">ùúûü</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ</string> <string name="alternates_for_cyrillic_e">ё5</string> <string name="alternates_for_cyrillic_soft_sign">ъ</string> </resources> diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index ae5e3917b..d892009ce 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -26,70 +26,50 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Виброотклик клавиш"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук клавиш"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Показывать при нажатии"</string> - <string name="hit_correction" msgid="4855351009261318389">"Исправлять опечатки"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Включить исправление ошибок при вводе"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Ошибки при вводе в горизонтальной ориентации"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Включить исправление ошибок при вводе"</string> - <string name="auto_correction" msgid="7911639788808958255">"Предложение слов"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Автоматически исправлять предыдущее слово"</string> - <string name="prediction" msgid="466220283138359837">"Предложение слов"</string> - <string name="prediction_category" msgid="7027100625580696660">"Настройки подсказок"</string> - <string name="prediction_summary" msgid="459788228830873110">"Включить автоматическое завершение слов при вводе"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Автоматическое завершение"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Увеличить размер текстового поля"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Скрывать предложение слов в горизонтальной ориентации"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Настройки подсказок"</string> <string name="auto_cap" msgid="1719746674854628252">"Автоподст. заглавных"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Делать заглавной первую букву предложения"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Автопунктуация"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Быстрое исправление"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Исправлять распространенные опечатки"</string> - <string name="show_suggestions" msgid="507074425254289133">"Предлагать варианты"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Предлагать варианты слов во время ввода"</string> - <string name="auto_complete" msgid="1103196318775486023">"Автозавершение"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"При нажатии пробела вставлять предложенное слово"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Автоисправление"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"При нажатии пробела или знака препинания вставлять предложенное слово"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Выкл."</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умеренное"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Активное"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Биграммные подсказки"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Используйте предыдущее слово, чтобы исправить подсказку"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Нет"</item> - <item msgid="1669461741568287396">"Основной"</item> - <item msgid="4894328801530136615">"Дополнительно"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: сохранено"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Удерживайте клавишу, чтобы увидеть варианты с диакритическими знаками (ø, ö и т.д.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Нажмите клавишу \"Назад\" ↶, чтобы закрыть клавиатуру в любой момент"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Открыть цифры и символы"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Нажмите и удерживайте слово слева, чтобы добавить его в словарь"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Чтобы продолжить, нажмите на эту подсказку »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Нажмите здесь, чтобы закрыть подсказку и начать вводить текст."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Клавиатура появляется автоматически при касании текстового поля"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Нажмите и удерживайте клавишу для отображения вариантов с диакритическими знаками "\n"(ø, ö, ô, ó и т. п.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Для переключения между вводом цифр и символов используйте эту клавишу"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Чтобы вернуться к буквенной клавиатуре, снова нажмите на эту клавишу"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Чтобы изменить настройки клавиатуры (такие как автозавершение), нажмите и удерживайте эту клавишу"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Попробуйте!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Поиск"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"АБВ"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Голосовой ввод"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"В настоящее время функция голосового ввода не поддерживает ваш язык, но вы можете пользоваться ей на английском."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Голосовой ввод – экспериментальная функция на основе технологии сетевого распознавания речи от Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Функция голосового ввода отключается в настройках клавиатуры."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Чтобы использовать голосовой ввод, нажмите кнопку микрофона или проведите пальцем по экранной клавиатуре."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовой ввод – экспериментальная функция на основе технологии сетевого распознавания речи от Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Функция голосового ввода отключается в настройках клавиатуры."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Чтобы использовать голосовой ввод, нажмите кнопку микрофона или проведите пальцем по экранной клавиатуре."</string> <string name="voice_listening" msgid="467518160751321844">"Говорите"</string> - <string name="voice_working" msgid="6666937792815731889">"Выполняется обработка"</string> + <string name="voice_working" msgid="6666937792815731889">"Обработка запроса"</string> <string name="voice_initializing" msgid="661962047129906646"></string> <string name="voice_error" msgid="5140896300312186162">"Ошибка. Повторите попытку."</string> <string name="voice_network_error" msgid="6649556447401862563">"Ошибка подключения"</string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Отмена"</string> <string name="ok" msgid="7898366843681727667">"ОК"</string> <string name="voice_input" msgid="2466640768843347841">"Голосовой ввод"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"На основной клавиатуре"</item> - <item msgid="8529385602829095903">"На клавиатуре символов"</item> - <item msgid="7283103513488381103">"Выкл."</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Микрофон на основной клавиатуре"</item> - <item msgid="6907837061058876770">"Микрофон на клавиатуре символов"</item> - <item msgid="3664304608587798036">"Голосовой ввод отключен"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Автоматически отправлять по окончании голосового ввода"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Автоматически нажимать \"Ввод\" при поиске или переходе к следующему полю."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Открытие клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите на любое текстовое поле."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Закрытие клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите клавишу \"Назад\"."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Нажмите и удерживайте клавишу для вызова параметров"\n</b></font><font size="3">\n</font>"Доступ к пунктуационным и диакритическим знакам."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Настройки клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите и удерживайте клавишу "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На осн. клавиатуре"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На клавиатуре симв."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Выкл."</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Микр. на осн. клав."</string> + <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="language_selection_title" msgid="1651299598555326750">"Языки ввода"</string> <string name="language_selection_summary" msgid="187110938289512256">"Для изменения языка проведите пальцем по пробелу"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Включить отправку сведений"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Помогите усовершенствовать редактор способа ввода, разрешив отправку статистики и отчетов о сбоях в Google."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Исправление нажатием"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Нажмите на слово, чтобы исправить его"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Нажмите на слово, чтобы исправить его"</string> <string name="keyboard_layout" msgid="437433231038683666">"Вид клавиатуры"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"клавиатура"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"голосовой"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml index 89e3bea29..a34afd7d6 100644 --- a/java/res/values-sk/strings.xml +++ b/java/res/values-sk/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Opravovať preklepy"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Povoliť opravu chýb vstupu"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Chyby vstupu v zobrazení na šírku"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Povoliť opravu chýb vstupu"</string> - <string name="auto_correction" msgid="7911639788808958255">"Návrhy slov"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automaticky opraviť predchádzajúce slovo"</string> - <string name="prediction" msgid="466220283138359837">"Návrhy slov"</string> - <string name="prediction_category" msgid="7027100625580696660">"Nastavenia návrhov slov"</string> - <string name="prediction_summary" msgid="459788228830873110">"Povoliť automatické dokončovanie pri písaní"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatické dokončovanie"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Zväčšiť textové pole"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skryť návrhy slov v zobrazení na šírku"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Nastavenia návrhov slov"</string> <string name="auto_cap" msgid="1719746674854628252">"Veľké písmená automaticky"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Začať vetu veľkým písmenom"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatická interpunkcia"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Zobraziť návrhy"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Zobrazovať navrhované slová počas písania"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automatické dokončovanie"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Stlačením medzerníka alebo interpunkčného znamienka automaticky vložíte zvýraznené slovo."</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Automatické opravy"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Medzerník a interpunkčné znaky automaticky vložia zvýraznené slovo"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Vypnuté"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mierne"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresívne"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Návrh Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Na zlepšenie návrhu použiť predchádzajúce slovo"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Žiadne"</item> - <item msgid="1669461741568287396">"Základné"</item> - <item msgid="4894328801530136615">"Rozšírené"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Uložené"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Podržaním klávesu zobrazíte diakritiku (á, ž atď.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Stlačením klávesu Späť ↶ môžete klávesnicu kedykoľvek zavrieť."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Prístup k číslam a symbolom"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Stlačením a podržaním slova úplne vľavo toto slovo pridáte do slovníka."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Ak chcete pokračovať, dotknite sa tohto tipu »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Ak chcete tento tip zavrieť a začať písať, dotknite sa tu."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klávesnica sa otvorí vždy, keď sa dotknete textového poľa."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Pridržaním klávesu zobrazíte diakritiku"\n"(ó, ø, ö, ô apod.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Ak chcete prepnúť na režim zadávania číslic a symbolov, dotknite sa tohto klávesu."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Ak chcete prejsť späť na zadávanie písmen, dotknite sa znova tohto klávesu."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Pridržaním tohto klávesu zmeníte nastavenia klávesnice (napr. automatické dokončovanie)."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Skúste si to."</b></string> <string name="label_go_key" msgid="1635148082137219148">"Hľadať"</string> <string name="label_next_key" msgid="362972844525672568">"Ďalej"</string> <string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string> <string name="label_send_key" msgid="2815056534433717444">"Odoslať"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pre váš jazyk aktuálne nie je hlasový vstup podporovaný, ale funguje v angličtine."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Hlasový vstup je experimentálna funkcia, ktorá využíva sieťové rozpoznanie reči spoločnosti Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Ak chcete vypnúť hlasový vstup, prejdite na nastavenia klávesnice."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Ak chcete použiť hlasový vstup, stlačte tlačidlo mikrofónu alebo prejdite prstom po klávesnici na obrazovke."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup je experimentálna funkcia, ktorá využíva sieťové rozpoznanie reči spoločnosti Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ak chcete vypnúť hlasový vstup, prejdite na nastavenia klávesnice."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ak chcete použiť hlasový vstup, stlačte tlačidlo mikrofónu alebo prejdite prstom po klávesnici na obrazovke."</string> <string name="voice_listening" msgid="467518160751321844">"Hovorte"</string> <string name="voice_working" msgid="6666937792815731889">"Prebieha spracovanie"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Zrušiť"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Hlasový vstup"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Na hlavnej klávesnici"</item> - <item msgid="8529385602829095903">"Na klávesnici so symbolmi"</item> - <item msgid="7283103513488381103">"Vypnuté"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofón na hlavnej klávesnici"</item> - <item msgid="6907837061058876770">"Mikrofón na klávesnici so symbolmi"</item> - <item msgid="3664304608587798036">"Hlasový vstup je zakázaný"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Po hlasovom vstupe automaticky odoslať"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Pri vyhľadávaní alebo prechode na ďalšie pole automaticky stlačiť kláves Enter."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otvorte klávesnicu"\n</b></font><font size="3">\n</font>"Dotknite sa ľubovoľného textového poľa."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zatvorte klávesnicu"\n</b></font><font size="3">\n</font>"Stlačte tlačidlo Späť."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Dotknutím a pridržaním klávesu zobrazíte možnosti"\n</b></font><font size="3">\n</font>"Prístup k interpunkčným znamienkam a diakritike."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Nastavenia klávesnice"\n</b></font><font size="3">\n</font>"Dotknite sa klávesu "<b>"?123"</b>" a podržte ho."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".sk"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".net"</string> - <string name="popular_domain_4" msgid="35359437471311470">".eu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na hlavnej klávesnici"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klávesnici so symbolmi"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Vypnuté"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofón na hlavnej klávesnici"</string> + <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="language_selection_title" msgid="1651299598555326750">"Jazyky vstupu"</string> <string name="language_selection_summary" msgid="187110938289512256">"Jazyk môžete zmeniť posunutím prsta po medzerníku."</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Povoliť spätnú väzbu od používateľov"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Automatickým zasielaním štatistík o využívaní editora metódy vstupu a správ o jeho zlyhaní do služby Google môžete prispieť k vylepšeniu tohto nástroja."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotykom opravíte slová"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dotykom zadaným slov ich opravíte"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotykom zadaným slov ich opravíte"</string> <string name="keyboard_layout" msgid="437433231038683666">"Motív klávesnice"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klávesnica"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"hlasová"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"klávesnica – čeština"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"klávesnica – dánčina"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"klávesnica – nemčina"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"hlas – angličtina (Veľká Británia)"</string> + <!-- outdated translation 2979257184475020604 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"klávesnica – angličtina (Spojené štáty)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"klávesnica – španielčina"</string> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"klávesnica – francúzština"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"hlas – čeština"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"hlas – nemčina"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"hlas – angličtina (Austrália)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"hlas – angličtina (Veľká Británia)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"hlas – angličtina (India)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"hlas – angličtina (Nový Zéland)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"klávesnica – angličtina (Spojené štáty)"</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> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <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> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"hlas – čínština (Čína)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"hlas – čínština (Taiwan)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml index 090e0b92e..b71414aac 100644 --- a/java/res/values-sl/strings.xml +++ b/java/res/values-sl/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Popravljanje tipkarskih napak"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Omogoči popravljanje napak pri vnosu"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Napake pri vnosu v ležečem položaju"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Omogoči popravljanje napak pri vnosu"</string> - <string name="auto_correction" msgid="7911639788808958255">"Predlogi besed"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Samodejno popravi prejšnjo besedo"</string> - <string name="prediction" msgid="466220283138359837">"Predlogi besed"</string> - <string name="prediction_category" msgid="7027100625580696660">"Nastavitve za predlaganje besede"</string> - <string name="prediction_summary" msgid="459788228830873110">"Omogoči samodokončanje med tipkanjem"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Samodokončanje"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Povečaj velikost besedilnega polja"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skrij predloge besed v ležečem pogledu"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Nastavitve za predlaganje besede"</string> <string name="auto_cap" msgid="1719746674854628252">"Samodejne velike začetnice"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Napiši začetek stavka z veliko začetnico"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Samodejno vstavljanje ločil"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Hitri popravki"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Popravi pogoste tipkarske napake"</string> - <string name="show_suggestions" msgid="507074425254289133">"Pokaži predloge"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Prikaži predlagane besede med tipkanjem"</string> - <string name="auto_complete" msgid="1103196318775486023">"Samodokončanje"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Preslednica in ločila samodejno vnesejo označeno besedo"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Samodejni popravek"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Preslednico in ločila samodejno vstavijo označeno besedo"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Izklopljeno"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Zmerno"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivno"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigramni predlogi"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Predlog izboljšaj s prejšnjo besedo"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Brez"</item> - <item msgid="1669461741568287396">"Osnovni"</item> - <item msgid="4894328801530136615">"Dodatno"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: shranjeno"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Držite tipko, da prikažete poudarke (ø, ö itd.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Kadar koli lahko pritisnete tipko »Nazaj« ↶, da zaprete tipkovnico"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Dostop do številk in simbolov"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Če besedo želite dodati v slovar, jo pridržite"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Dotaknite se tega nasveta za nadaljevanje »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Dotaknite se tukaj, da zaprete nasvet in začnete tipkati!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tipkovnice se odpre, kadar se dotaknete besedilnega polja"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Za ogled poudarkov pridržite tipko"\n"(ø, ö, ô, ó itd.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Preklopite na številke in simbole z dotikom te tipke"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Na črke se vrnete, če se še enkrat dotaknete te tipke"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Pridržite to tipko, če želite spremeniti nastavitve tipkovnice, npr. samodokončanje"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Poskusite!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Pojdi"</string> <string name="label_next_key" msgid="362972844525672568">"Naprej"</string> <string name="label_done_key" msgid="2441578748772529288">"Dokončano"</string> <string name="label_send_key" msgid="2815056534433717444">"Pošlji"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Glasovni vnos"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Glasovni vnos trenutno ni podprt v vašem jeziku, deluje pa v angleščini."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Glasovni vnos je poskusna funkcija, ki uporablja Googlovo omrežno prepoznavanje govora."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Če želite izklopiti glasovni vnos, pojdite na nastavitve tipkovnice."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Če želite uporabiti glasovni vnos, pritisnite gumb z mikrofonom ali podrsajte s prstom po zaslonski tipkovnici."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni vnos je poskusna funkcija, ki uporablja Googlovo omrežno prepoznavanje govora."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Če želite izklopiti glasovni vnos, pojdite na nastavitve tipkovnice."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Če želite uporabiti glasovni vnos, pritisnite gumb z mikrofonom ali podrsajte s prstom po zaslonski tipkovnici."</string> <string name="voice_listening" msgid="467518160751321844">"Začnite govoriti"</string> <string name="voice_working" msgid="6666937792815731889">"Obdelava"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Prekliči"</string> <string name="ok" msgid="7898366843681727667">"V redu"</string> <string name="voice_input" msgid="2466640768843347841">"Glasovni vnos"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Na glavni tipkovnici"</item> - <item msgid="8529385602829095903">"Na tipkovnici s simboli"</item> - <item msgid="7283103513488381103">"Izklopljeno"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon na glavni tipkovnici"</item> - <item msgid="6907837061058876770">"Mikrofon na tipkovnici s simboli"</item> - <item msgid="3664304608587798036">"Glasovni vnos je onemogočen"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Samodejno pošlji po govoru"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Samodejno pritisni »Enter« pri iskanju ali prehodu na naslednje polje."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Odprite tipkovnico"\n</b></font><font size="3">\n</font>"Dotaknite se katerega koli besedilnega polja."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zaprite tipkovnico"\n</b></font><font size="3">\n</font>"Pritisnite tipko »Nazaj«."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Pridržite tipko za ogled možnosti"\n</b></font><font size="3">\n</font>"Dostop do ločil in poudarkov."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Nastavitve "\n</b></font><font size="3">\n</font>"Pridržite tipko "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na glavni tipkovnici"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na tipk. s simboli"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Izklopljeno"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik. na glavni tipk."</string> + <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="language_selection_title" msgid="1651299598555326750">"Jeziki vnosa"</string> <string name="language_selection_summary" msgid="187110938289512256">"Podrsajte s prstom po preslednici, da zamenjate jezik"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Omogoči povratne informacije uporabnikov"</string> <string name="prefs_description_log" msgid="5827825607258246003">"S samodejnim pošiljanjem statističnih podatkov o uporabi in poročil o zrušitvah Googlu nam lahko pomagate izboljšati urejevalnik načina vnosa."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotaknite se besed in jih popravite"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dotaknite se vnesenih besed in jih popravite"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotaknite se vnesenih besed in jih popravite"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema tipkovnice"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tipkovnica"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"govor"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Češka tipkovnica"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danska tipkovnica"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Nemška tipkovnica"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tipkovnica za britansko angleščino"</string> + <!-- outdated translation 2979257184475020604 --> <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> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francoska tipkovnica"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Govor v češčini"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Govor v nemščini"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Govor v avstralski angleščini"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Govor v britanski angleščini"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Govor v indijski angleščini"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Govor v novozelandski angleščini"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Govor v ameriški 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> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <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> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Govor v kitajščini"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Govor v tajvanski kitajščini"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml index 7b00501a5..436176481 100644 --- a/java/res/values-sr/strings.xml +++ b/java/res/values-sr/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вибрирај на притисак тастера"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук на притисак тастера"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Искачући прозор приликом притиска тастера"</string> - <string name="hit_correction" msgid="4855351009261318389">"Исправи грешке у куцању"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Омогућавање исправљања грешака током уноса"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Грешке приликом уноса у положеном приказу"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Омогућавање исправљања грешака током уноса"</string> - <string name="auto_correction" msgid="7911639788808958255">"Предлагање речи"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Аутоматско исправљање претходне речи"</string> - <string name="prediction" msgid="466220283138359837">"Предлагање речи"</string> - <string name="prediction_category" msgid="7027100625580696660">"Подешавања за предлагање речи"</string> - <string name="prediction_summary" msgid="459788228830873110">"Омогућавање аутоматског довршавања током уноса текста"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Аутоматско довршавање"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Повећај величину поља за текст"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Скривање предложених речи у положеном приказу"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Подешавања за предлагање речи"</string> <string name="auto_cap" msgid="1719746674854628252">"Аутоматски унос великих слова"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Унос великог слова на почетку реченице"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Аутоматска интерпункција"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Брзе исправке"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Исправља честе грешке у куцању"</string> - <string name="show_suggestions" msgid="507074425254289133">"Прикажи предлоге"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Приказивање предложених речи током уноса текста"</string> - <string name="auto_complete" msgid="1103196318775486023">"Аутоматско довршавање"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Означена реч се аутоматски умеће када притиснете размак или знак интерпункције"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Аутоматско исправљање"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Истакнута реч се аутоматски умеће када притиснете размак или знак интерпункције"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Искључи"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умерено"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Агресивно"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram предлози"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Користи претходну реч за побољшање предлога"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Ништа"</item> - <item msgid="1669461741568287396">"Основни"</item> - <item msgid="4894328801530136615">"Напредно"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Сачувано"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Држите тастер да бисте видели акценте (ø, ö итд.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Притисните тастер „Назад“ ↶ у било ком тренутку да бисте затворили тастатуру"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Приступите бројевима и симболима"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Притисните и држите прву реч са леве стране да бисте је додали у речник"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Додирните овај савет да бисте наставили »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Додирните овде да бисте затворили овај савет и почели да уносите текст!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Тастатура се отвара сваки пут када додирнете поље за текст"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Додирните и држите тастер да бисте видели акценте"\n"(ø, ö, ô, ó, и тако даље)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Пређите на бројеве и симболе тако што ћете додирнути овај тастер"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Вратите се на слова тако што ћете поново додирнути овај тастер"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Додирните и држите овај тастер да бисте променили подешавања тастатуре, као што је аутоматско довршавање"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Пробајте!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Иди"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Гласовни унос"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Гласовни унос тренутно није подржан за ваш језик, али функционише на енглеском."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Гласовни унос је експериментална функција која користи Google-ово мрежно препознавање гласа."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Да бисте искључили гласовни унос, идите на подешавања тастатуре."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Да бисте користили гласовни унос, притисните дугме за микрофон или превуците прст преко тастатуре на екрану."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовни унос је експериментална функција која користи Google-ово мрежно препознавање гласа."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Да бисте искључили гласовни унос, идите на подешавања тастатуре."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Да бисте користили гласовни унос, притисните дугме за микрофон или превуците прст преко тастатуре на екрану."</string> <string name="voice_listening" msgid="467518160751321844">"Говорите сада"</string> <string name="voice_working" msgid="6666937792815731889">"Обрада"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Откажи"</string> <string name="ok" msgid="7898366843681727667">"Потврди"</string> <string name="voice_input" msgid="2466640768843347841">"Гласовни унос"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"На главној тастатури"</item> - <item msgid="8529385602829095903">"На тастатури са симболима"</item> - <item msgid="7283103513488381103">"Искључено"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Микрофон на главној тастатури"</item> - <item msgid="6907837061058876770">"Микрофон на тастатури са симболима"</item> - <item msgid="3664304608587798036">"Гласовни унос је онемогућен"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Аутоматски пошаљи после гласа"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Аутоматски притисак на enter приликом претраге или преласка на следеће поље."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Активирање тастатуре"\n</b></font><font size="3">\n</font>"Додирните било које поље за текст."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Затварање тастатуре"\n</b></font><font size="3">\n</font>"Притисните тастер „Назад“."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Додирните и држите тастер да би се приказале опције"\n</b></font><font size="3">\n</font>"Приступ знаковима интерпункције и акцентима."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Подешавања тастатуре"\n</b></font><font size="3">\n</font>"Додирните и држите тастер "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На главној тастатури"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На тастатури са симболима"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Искључи"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Микрофон на главној тастатури"</string> + <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="language_selection_title" msgid="1651299598555326750">"Језици за унос"</string> <string name="language_selection_summary" msgid="187110938289512256">"Превуците прст преко тастера за размак да бисте променили језик"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Омогући повратну информацију корисника"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Помозите да се побољша овај уређивач режима уноса тако што ће се аутоматски послати статистика о коришћењу и извештаји о грешкама компанији Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Додирните да бисте исправили речи"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Додирните унете речи да бисте их исправили"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Додирните унете речи да бисте их исправили"</string> <string name="keyboard_layout" msgid="437433231038683666">"Тема тастатуре"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"тастатура"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"глас"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Језик тастатуре: чешки"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Језик тастатуре: дански"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Језик тастатуре: немачки"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Језик тастатуре: енглески (Велика Британија)"</string> + <!-- outdated translation 2979257184475020604 --> <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_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Језик тастатуре: француски"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_ru_keyboard" msgid="1383995915064277943">"Језик тастатуре: руски"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Језик тастатуре: српски"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Језик тастатуре: шведски"</string> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"глас на чешком"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"глас на немачком"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"глас на енглеском (Аустралија)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"глас на енглеском (Велика Британија)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"глас на енглеском (Индија)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"енглески (Нови Зеланд) аудио"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"глас на енглеском (САД)"</string> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"глас на кинеском (Кина)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"глас на кинеском (Тајван)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-sv/donottranslate-altchars.xml b/java/res/values-sv/donottranslate-altchars.xml index 4d26e6c47..e156de896 100644 --- a/java/res/values-sv/donottranslate-altchars.xml +++ b/java/res/values-sv/donottranslate-altchars.xml @@ -18,21 +18,23 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">áàâąã</string> - <string name="alternates_for_e">3éèêëę€</string> - <string name="alternates_for_i">íìîï8</string> - <string name="alternates_for_o">óòôõ9</string> - <string name="alternates_for_u">úùûū7</string> - <string name="alternates_for_s">śšşß</string> - <string name="alternates_for_n">ńñň</string> - <string name="alternates_for_c">çćč</string> - <string name="alternates_for_y">ýÿü6</string> - <string name="alternates_for_d">ðď</string> - <string name="alternates_for_r">ř4</string> - <string name="alternates_for_t">ťþ5</string> - <string name="alternates_for_z">źžż</string> + <string name="alternates_for_a">á,à,â,ą,ã</string> + <string name="alternates_for_e">3,é,è,ê,ë,ę,€</string> + <string name="alternates_for_i">í,ì,î,ï,8</string> + <string name="alternates_for_o">ó,ò,ô,õ,9</string> + <string name="alternates_for_u">ú,ù,û,ū,7</string> + <string name="alternates_for_s">ś,š,ş,ß</string> + <string name="alternates_for_n">ń,ñ,ň</string> + <string name="alternates_for_c">ç,ć,č</string> + <string name="alternates_for_y">ý,ÿ,ü,6</string> + <string name="alternates_for_d">ð,ď</string> + <string name="alternates_for_r">ř,4</string> + <string name="alternates_for_t">ť,þ,5</string> + <string name="alternates_for_z">ź,ž,ż</string> <string name="alternates_for_l">ł</string> <string name="alternates_for_v">w</string> - <string name="alternates_for_a_umlaut">æ</string> - <string name="alternates_for_o_umlaut">øœ</string> + <string name="keylabel_for_scandinavia_row2_10">ö</string> + <string name="keylabel_for_scandinavia_row2_11">ä</string> + <string name="alternates_for_scandinavia_row2_10">ø,œ</string> + <string name="alternates_for_scandinavia_row2_11">æ</string> </resources> diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 755ee05db..2b8483e69 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Rätta skrivfel"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Aktivera rättning av felaktiga inmatningar"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Inmatningsfel i liggande vy"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Aktivera rättning av felaktiga inmatningar"</string> - <string name="auto_correction" msgid="7911639788808958255">"Ordförslag"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Rätta automatiskt föregående ord"</string> - <string name="prediction" msgid="466220283138359837">"Ordförslag"</string> - <string name="prediction_category" msgid="7027100625580696660">"Inställningar för ordförslag"</string> - <string name="prediction_summary" msgid="459788228830873110">"Aktivera Komplettera automatiskt när du skriver"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Komplettera automatiskt"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Gör textfältet större"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Dölj ordförslag i liggande vy"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Inställningar för ordförslag"</string> <string name="auto_cap" msgid="1719746674854628252">"Automatiska versaler"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Använd versal i början av mening"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatiska punkter"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Visa förslag"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Visar ordförslag när du skriver"</string> - <string name="auto_complete" msgid="1103196318775486023">"Komplettera automatiskt"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Blanksteg och punkt infogar automatiskt markerat ord"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Autokorrigering"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Blanksteg och skiljetecken infogar automatiskt markerade ord"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Av"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Måttlig"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressiv"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigramförslag"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Förbättra förslaget med föregående ord"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Inget"</item> - <item msgid="1669461741568287396">"Grundinställningar"</item> - <item msgid="4894328801530136615">"Avancerade"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: sparat"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Håll nere en tangent om du vill visa accenter (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Tryck på Tillbaka ↶ om du vill stänga tangentbordet"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"För siffror och symboler"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tryck och håll ned ordet längst till vänster om du vill lägga till det i ordlistan"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Tryck på tipset för att fortsätta »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Tryck här om du vill stänga tipset och börja skriva!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tangentbordet öppnas när du trycker på ett textfält"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tryck och håll nere en tangent om du vill visa accenter"\n"(ø, ö, ô, ó och så vidare)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Växla till siffror och symboler med den här tangenten"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Återvänd till bokstäver genom att trycka på tangenten en gång till"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tryck och håll ned tangenten om du vill ändra inställningarna för tangentbordet, till exempel Komplettera automatiskt"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Testa!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Kör"</string> <string name="label_next_key" msgid="362972844525672568">"Nästa"</string> <string name="label_done_key" msgid="2441578748772529288">"Färdig"</string> <string name="label_send_key" msgid="2815056534433717444">"Skicka"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Röstindata"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Röstindata stöds inte på ditt språk än, men tjänsten fungerar på engelska."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Röstinmatning är en funktion på experimentstadiet som använder Googles nätverks taligenkänning."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Om du vill stänga av röstindata öppnar du inställningarna för tangentbordet."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Om du vill använda röstinmatning trycker du på mikrofonknappen eller drar fingret över tangentbordet på skärmen."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Röstinmatning är en funktion på experimentstadiet som använder Googles nätverks taligenkänning."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Om du vill stänga av röstindata öppnar du inställningarna för tangentbordet."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Om du vill använda röstinmatning trycker du på mikrofonknappen eller drar fingret över tangentbordet på skärmen."</string> <string name="voice_listening" msgid="467518160751321844">"Tala nu"</string> <string name="voice_working" msgid="6666937792815731889">"Fungerar"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Avbryt"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Röstindata"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"På huvudtangentbordet"</item> - <item msgid="8529385602829095903">"På symboltangentbordet"</item> - <item msgid="7283103513488381103">"Av"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon på huvudtangentbordet"</item> - <item msgid="6907837061058876770">"Mikrofon på symboltangentbordet"</item> - <item msgid="3664304608587798036">"Röstindata är inaktiverat"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Skicka automatiskt efter röst"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Tryck automatiskt på retur vid sökning eller när du fortsätter till nästa fält."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Öppna tangentbordet"\n</b></font><font size="3">\n</font>"Tryck på ett textfält."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Stäng tangentbordet"\n</b></font><font size="3">\n</font>"Tryck på Tillbaka."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tryck länge på en tangent om du vill se alternativ"\n</b></font><font size="3">\n</font>"Använda skiljetecken och accenter."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tangentbordsinställningar"\n</b></font><font size="3">\n</font>"Tryck länge på tangenten"<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På huvudtangentbord"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På symboltangentbord"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Av"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mick huvudtangentbord"</string> + <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="language_selection_title" msgid="1651299598555326750">"Inmatningsspråk"</string> <string name="language_selection_summary" msgid="187110938289512256">"Dra med fingret på blanksteg om du vill ändra språk"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Aktivera synpunkter från användare"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Du kan hjälpa till att förbättra inmatningsmetoden genom att automatiskt skicka användningsstatistik och felrapporter till Google."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryck om du vill korrigera om ord"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Du kan korrigera om ord genom att trycka på ord som du har skrivit"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Du kan korrigera om ord genom att trycka på ord som du har skrivit"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tangentbordstema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tangentbord"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"röst"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml index 0812a894d..0e5f1886f 100644 --- a/java/res/values-th/strings.xml +++ b/java/res/values-th/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"สั่นเมื่อกดปุ่ม"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"ส่งเสียงเมื่อกดปุ่ม"</string> <string name="popup_on_keypress" msgid="123894815723512944">"ป๊อปอัปเมื่อกดแป้น"</string> - <string name="hit_correction" msgid="4855351009261318389">"แก้ไขข้อผิดพลาดในการพิมพ์"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"เปิดการใช้งานการแก้ไขข้อผิดพลาดในการป้อนข้อมูล"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"ข้อผิดพลาดในการป้อนข้อมูลแนวนอน"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"เปิดการใช้งานการแก้ไขข้อผิดพลาดในการป้อนข้อมูล"</string> - <string name="auto_correction" msgid="7911639788808958255">"การแนะนำคำ"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"แก้ไขคำก่อนหน้าอัตโนมัติ"</string> - <string name="prediction" msgid="466220283138359837">"การแนะนำคำ"</string> - <string name="prediction_category" msgid="7027100625580696660">"การตั้งค่าการแนะนำคำ"</string> - <string name="prediction_summary" msgid="459788228830873110">"เปิดใช้งานการเติมคำอัตโนมัติขณะพิมพ์"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"เติมคำอัตโนมัติ"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"เพิ่มขนาดฟิลด์ข้อความ"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"ซ่อนการแนะนำคำในมุมมองแนวนอน"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"การตั้งค่าการแนะนำคำ"</string> <string name="auto_cap" msgid="1719746674854628252">"ปรับเป็นตัวพิมพ์ใหญ่อัตโนมัติ"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"ใช้ตัวพิมพ์ใหญ่เมื่อขึ้นต้นประโยค"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"ใส่เครื่องหมายวรรคตอนอัตโนมัติ"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"แก้ไขด่วน"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"แก้ไขข้อผิดพลาดในการพิมพ์ที่พบบ่อย"</string> - <string name="show_suggestions" msgid="507074425254289133">"แสดงคำแนะนำ"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"แสดงคำที่แนะนำขณะพิมพ์"</string> - <string name="auto_complete" msgid="1103196318775486023">"เติมคำอัตโนมัติ"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"ใช้แป้นเคาะวรรคและเครื่องหมายวรรคตอนเพื่อแทรกคำที่ไฮไลต์โดยอัตโนมัติ"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"การแก้ไขอัตโนมัติ"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"เคาะวรรคและวรรคตอนเพื่อแทรกคำที่ไฮไลต์โดยอัตโนมัติ"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ปิด"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"ปานกลาง"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"เข้มงวด"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"คำแนะนำ Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"ใช้คำก่อนหน้านี้เพื่อปรับปรุงคำแนะนำ"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"ไม่มี"</item> - <item msgid="1669461741568287396">"พื้นฐาน"</item> - <item msgid="4894328801530136615">"ขั้นสูง"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : บันทึกแล้ว"</string> - <string name="tip_long_press" msgid="6101270866284343344">"กดปุ่มค้างไว้เพื่อดูการออกเสียง (ø, ö, ฯลฯ)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"กดปุ่ม ย้อนกลับ เพื่อปิดแป้นพิมพ์เมื่อใดก็ได้"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"เข้าถึงหมายเลขและสัญลักษณ์"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"กดคำซ้ายสุดค้างไว้เพื่อเพิ่มลงในพจนานุกรม"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"แตะคำแนะนำนี้เพื่อทำงานต่อ »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"แตะที่นี่เพื่อปิดคำแนะนำนี้และเริ่มพิมพ์!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"แป้นพิมพ์จะเปิดขึ้นเมื่อคุณแตะฟิลด์ข้อความ"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"แตะปุ่มค้างไว้เพื่อดูการออกเสียง"\n"(ø, ö, ô, ó และอื่นๆ)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"เปลี่ยนเป็นตัวเลขและสัญลักษณ์เมื่อแตะปุ่มนี้"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"กลับไปที่ตัวอักษรโดยการแตะปุ่มนี้อีกครั้ง"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"แตะปุ่มนี้ค้างไว้เพื่อเปลี่ยนการตั้งค่าแป้นพิมพ์ เช่น การเติมคำอัตโนมัติ"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"ลองดูสิ!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"ไป"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"การป้อนข้อมูลด้วยเสียง"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ขณะนี้การป้อนข้อมูลด้วยเสียงยังไม่ได้รับการสนับสนุนในภาษาของคุณ แต่ใช้ได้ในภาษาอังกฤษ"</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"การป้อนข้อมูลด้วยเสียงเป็นคุณลักษณะทดลองที่ใช้การจดจำเสียงที่มีการสร้างเครือข่ายไว้ของ Google"</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"หากต้องการปิดการป้อนข้อมูลด้วยเสียง ไปที่การตั้งค่าแป้นพิมพ์"</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"หากต้องการใช้การป้อนข้อมูลด้วยเสียง กดปุ่มไมโครโฟนหรือเลื่อนนิ้วผ่านแป้นพิมพ์บนหน้าจอ"</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"การป้อนข้อมูลด้วยเสียงเป็นคุณลักษณะทดลองที่ใช้การจดจำเสียงที่มีการสร้างเครือข่ายไว้ของ Google"</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"หากต้องการปิดการป้อนข้อมูลด้วยเสียง ไปที่การตั้งค่าแป้นพิมพ์"</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"หากต้องการใช้การป้อนข้อมูลด้วยเสียง กดปุ่มไมโครโฟนหรือเลื่อนนิ้วผ่านแป้นพิมพ์บนหน้าจอ"</string> <string name="voice_listening" msgid="467518160751321844">"พูดได้เลย"</string> <string name="voice_working" msgid="6666937792815731889">"กำลังทำงาน"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"ยกเลิก"</string> <string name="ok" msgid="7898366843681727667">"ตกลง"</string> <string name="voice_input" msgid="2466640768843347841">"การป้อนข้อมูลด้วยเสียง"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"บนแป้นพิมพ์หลัก"</item> - <item msgid="8529385602829095903">"บนแป้นพิมพ์สัญลักษณ์"</item> - <item msgid="7283103513488381103">"ปิด"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"ไมโครโฟนบนแป้นพิมพ์หลัก"</item> - <item msgid="6907837061058876770">"ไมโครโฟนบนแป้นพิมพ์สัญลักษณ์"</item> - <item msgid="3664304608587798036">"การป้อนข้อมูลด้วยเสียงถูกปิดการใช้งาน"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"ส่งอัตโนมัติหลังบันทึกเสียง"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"กด Enter อัตโนมัติเมื่อค้นหาหรือไปที่ฟิลด์ถัดไป"</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"เปิดแป้นพิมพ์"\n</b></font><font size="3">\n</font>"แตะฟิลด์ข้อความใดก็ได้"</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"ปิดแป้นพิมพ์"\n</b></font><font size="3">\n</font>"กดปุ่ม ย้อนกลับ"</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"แตะปุ่มค้างไว้เพื่อดูตัวเลือก "\n</b></font><font size="3">\n</font>"เข้าถึงเครื่องหมายวรรคตอนและการออกเสียง"</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"การตั้งค่าแป้นพิมพ์"\n</b></font><font size="3">\n</font>"แตะปุ่ม "<b>"?123"</b>"ค้างไว้"</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"บนแป้นพิมพ์หลัก"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"บนแป้นพิมพ์สัญลักษณ์"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"ปิด"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"ไมค์บนแป้นพิมพ์หลัก"</string> + <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="language_selection_title" msgid="1651299598555326750">"ภาษาในการป้อนข้อมูล"</string> <string name="language_selection_summary" msgid="187110938289512256">"เลื่อนนิ้วไปบนแป้นเคาะวรรคเพื่อเปลี่ยนภาษา"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"เปิดใช้งานการแสดงความคิดเห็นจากผู้ใช้"</string> <string name="prefs_description_log" msgid="5827825607258246003">"ช่วยปรับปรุงตัวแก้ไขวิธีการป้อนข้อมูลนี้โดยการส่งสถิติการใช้งานและรายงานการขัดข้องถึง Google โดยอัตโนมัติ"</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"แตะเพื่อแก้ไขคำ"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"แตะคำที่ป้อนไว้เพื่อแก้ไข"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"แตะคำที่ป้อนไว้เพื่อแก้ไข"</string> <string name="keyboard_layout" msgid="437433231038683666">"ชุดรูปแบบแป้นพิมพ์"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"แป้นพิมพ์"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"เสียง"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"แป้นพิมพ์ภาษาเช็ก"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"แป้นพิมพ์ภาษาเดนมาร์ก"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"แป้นพิมพ์ภาษาเยอรมัน"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"แป้นพิมพ์ภาษาอังกฤษ (สหราชอาณาจักร)"</string> + <!-- outdated translation 2979257184475020604 --> <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_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"แป้นพิมพ์ภาษาฝรั่งเศส"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_ru_keyboard" msgid="1383995915064277943">"แป้นพิมพ์ภาษารัสเซีย"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"แป้นพิมพ์ภาษาเซอร์เบีย"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"แป้นพิมพ์ภาษาสวีเดน"</string> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"เสียงภาษาเช็ก"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"เสียงภาษาเยอรมัน"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"เสียงภาษาอังกฤษ (ออสเตรเลีย)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"เสียงภาษาอังกฤษ (สหราชอาณาจักร)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"เสียงภาษาอังกฤษ (อินเดีย)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"เสียงภาษาอังกฤษ (นิวซีแลนด์)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"เสียงภาษาอังกฤษ (สหรัฐอเมริกา)"</string> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"เสียงภาษาจีน (จีน)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"เสียงภาษาจีน (ไต้หวัน)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml index 2ab36ea35..921de0382 100644 --- a/java/res/values-tl/strings.xml +++ b/java/res/values-tl/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Itama ang mga error sa pag-type"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Paganahin ang pagtatama ng error sa pag-input"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Mga error sa pag-input ng landscape"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Paganahin ang pagtatama ng error sa pag-input"</string> - <string name="auto_correction" msgid="7911639788808958255">"Mga suhestiyon ng salita"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Awtomatikong itama ang nakaraang salita"</string> - <string name="prediction" msgid="466220283138359837">"Mga suhestiyon ng salita"</string> - <string name="prediction_category" msgid="7027100625580696660">"Mga setting ng suhestiyon ng salita"</string> - <string name="prediction_summary" msgid="459788228830873110">"Paganahin ang awtomatikong pagkumpleto habang nagta-type"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Awtomatikong pagkumpleto"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Taasan ang laki ng field ng teksto"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Itago ang mga suhestiyon ng salita sa lanscape na view"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Mga setting ng suhestiyon ng salita"</string> <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalization"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"I-capitalize ang simula ng isang pangungusap"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"I-auto-punctuate"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Ipakita ang mga suhestiyon"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Ipakita ang mga iminumungkahing salita habang nagta-type"</string> - <string name="auto_complete" msgid="1103196318775486023">"I-auto-complete"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Awtomatikong ipinapasok ng spacebar at bantas ang naka-highlight na salita"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Awtomatikong pagwasto"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Awtomatikong inilalagay ng spacebar at bantas ang naka-highlight na salita"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Naka-off"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Modest"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresibo"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Mga Suhestiyon na Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Gamitin ang nakaraang salita upang pahusayin ang suhestiyon"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Wala"</item> - <item msgid="1669461741568287396">"Batayan"</item> - <item msgid="4894328801530136615">"Advanced"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Na-save"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Pinduting nang matagal ang isang key pababa upang makita ang mga accent (ø, ö, atbp.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Pindutin ang key na bumalik ↶ upang isara ang keyboard anumang oras"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"I-access ang mga numero at simbolo"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Pindutin nang matagal ang salita sa kaliwang bahagi upang idagdag ito sa diksyunaryo"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Galawin ang pahiwatig na ito upang magpatuloy »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Galawin dito upang isara ang pahiwatig na ito at simulan ang pag-type!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Nagbubukas ang keyboard anumang oras na galawin mo ang field ng teksto"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Galawin & pinduting nang matagal ang isang key upang tingnan ang mga accent"\n"(ø, ö, ô, ó, at iba pa)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Lumipat sa mga numero at simbolo sa pamamagitan ng paggalaw sa key na "</b>" na ito"</string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Pumunta muli sa mga titik sa pamamagitan ng muling paggalaw sa key na ito"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Galawin & pinduting nang matagal ang key na ito upang baguhin ang mga setting ng keyboard, tulad ng awtomatikong pagkumpleto"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Subukan ito!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Pumunta"</string> <string name="label_next_key" msgid="362972844525672568">"Susunod"</string> <string name="label_done_key" msgid="2441578748772529288">"Tapos na"</string> <string name="label_send_key" msgid="2815056534433717444">"Ipadala"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Pag-input ng boses"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Hindi kasalukuyang suportado ang pag-input ng boses para sa iyong wika, ngunit gumagana sa Ingles."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ang pag-input ng boses ay isang tampok na pang-eksperimento na gumagamit ng naka-network na pagkilala sa pananalita ng Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Upang i-off ang pag-input ng boses, pumunta sa mga setting ng keyboard."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Upang gumamit ng pag-input ng boses, pindutin ang pindutang microphone o i-slide ang iyong daliri sa screen keyboard."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ang pag-input ng boses ay isang tampok na pang-eksperimento na gumagamit ng naka-network na pagkilala sa pananalita ng Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Upang i-off ang pag-input ng boses, pumunta sa mga setting ng keyboard."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Upang gumamit ng pag-input ng boses, pindutin ang pindutang microphone o i-slide ang iyong daliri sa screen keyboard."</string> <string name="voice_listening" msgid="467518160751321844">"Magsalita ngayon"</string> <string name="voice_working" msgid="6666937792815731889">"Nagtatrabaho"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Kanselahin"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Pag-input ng boses"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"I-on ang pangunahing keyboard"</item> - <item msgid="8529385602829095903">"Sa mga simbolo ng keyboard"</item> - <item msgid="7283103513488381103">"Naka-off"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mic sa pangunahing keyboard"</item> - <item msgid="6907837061058876770">"Mic sa keyboard ng mga simbolo"</item> - <item msgid="3664304608587798036">"Hindi pinagana ang pag-input ng boses"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Awtomatikong isumite pagkatapos ng boses"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Awtomatikong pindutin ang enter kapag naghahanap o pupunta sa susunod na field."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Buksan ang keyboard"\n</b></font><font size="3">\n</font>"Galawin ang kahit anong field ng teksto."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Isara ang keyboard"\n</b></font><font size="3">\n</font>"Pindutin ang key na Bumalik."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Galawin & pinduting nang matagal ang isang key para sa mga pagpipilian"\n</b></font><font size="3">\n</font>"I-access ang bantas at mga accent."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Mga setting ng keyboard"\n</b></font><font size="3">\n</font>"Galawin & pindutin nang matagal ang "<b>"?123"</b>" na key."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Sa pangunahing keyboard"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sa keyboard ng mga simbolo"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Naka-off"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic sa pangunahing keyboard"</string> + <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="language_selection_title" msgid="1651299598555326750">"Mag-input ng mga wika"</string> <string name="language_selection_summary" msgid="187110938289512256">"I-slide ang daliri sa spacebar upang palitan ang wika"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Paganahin ang feedback ng user"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Tumulong na pahusayin ang editor ng paraan ng pag-input na ito sa pamamagitan ng awtomatikong pagpapadala ng mga istatistika ng paggamit at mga ulat ng crash sa Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Pindutin upang itama ang mga salita"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Pindutin ang mga ipinasok na salita upang itama ang mga ito"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pindutin ang mga ipinasok na salita upang itama ang mga ito"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema ng Keyboard"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"keyboard"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"boses"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Czech na Keyboard"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danish na Keyboard"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"German Keyboard"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Ingles (Great Britain) na Keyboard"</string> + <!-- outdated translation 2979257184475020604 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Ingles (Estados Unidos) na Keyboard"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish na Keyboard"</string> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French na Keyboard"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italian 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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Czech na Boses"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"German Boses"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Ingles (Australia) na Boses"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Ingles (Great Britain) na Boses"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Ingles (India) na Boses"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Ingles (New Zealand) na Boses"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Ingles (Estados Unidos) 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> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanese na Boses"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korean na Boses"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Chinese (China) na Boses"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Chinese (Taiwan) na Boses"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-tr/donottranslate-altchars.xml b/java/res/values-tr/donottranslate-altchars.xml index 4200d949e..5e98cc30e 100644 --- a/java/res/values-tr/donottranslate-altchars.xml +++ b/java/res/values-tr/donottranslate-altchars.xml @@ -18,14 +18,8 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">öòóôõœø9</string> - <string name="alternates_for_u">üùúû7</string> - <string name="alternates_for_s">ş§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_o">ö,ò,ó,ô,õ,œ,ø,9</string> + <string name="alternates_for_u">ü,ù,ú,û,7</string> + <string name="alternates_for_s">ş,§,ß</string> <string name="alternates_for_g">ğ</string> -</resources>
\ No newline at end of file +</resources> diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 599ddb20a..a4c197b62 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Yazım hatalarını düzelt"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Giriş hatası düzeltmeyi etkinleştir"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Yatay giriş hataları"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Giriş hatası düzeltmeyi etkinleştir"</string> - <string name="auto_correction" msgid="7911639788808958255">"Kelime önerileri"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Önceki kelimeyi otomatik olarak düzelt"</string> - <string name="prediction" msgid="466220283138359837">"Kelime önerileri"</string> - <string name="prediction_category" msgid="7027100625580696660">"Kelime önerme ayarları"</string> - <string name="prediction_summary" msgid="459788228830873110">"Yazarken otomatik tamamlamayı etkinleştir"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Otomatik tamamlama"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Metin alanı boyutunu artır"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Yatay görünümde kelime önerilerini gizle"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Kelime önerme ayarları"</string> <string name="auto_cap" msgid="1719746674854628252">"Otomatik olarak büyük harf yap"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Cümlenin baş harfini büyük yap"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Otomatik noktalama"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Önerileri göster"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Yazarken önerilen kelimeleri görüntüle"</string> - <string name="auto_complete" msgid="1103196318775486023">"Otomatik tamamla"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Boşluk tuşu ve noktalama vurgulanan kelimeyi otomatik ekler"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Otomatik düzeltme"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Boşluk tuşu ve noktalama işaretleri vurgulanan kelimeyi otomatik ekler"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Kapalı"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Ölçülü"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresif"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram Önerileri"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Öneriyi geliştirmek için önceki kelimeyi kullanın"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Yok"</item> - <item msgid="1669461741568287396">"Temel"</item> - <item msgid="4894328801530136615">"Gelişmiş"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kaydedildi"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Vurguları görmek için bir tuşu basılı tutun (ø, ö, v.b.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Klavyeyi herhangi bir anda kapatmak için geri tuşuna ↶ basın"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Sayılara ve simgelere erişin"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Sözlüğe eklemek için en soldaki kelimeye basın ve basılı tutun"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Devam etmek için bu ipucuna dokunun »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Bu ipucunu kapatmak için buraya dokunun ve yazmaya başlayın!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Bir metin alanına dokunduğunuzda klavye açılır"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Vurguları görüntülemek için bir tuşa basın ve basılı tutun"\n"(ø, ö, ô, ó v.b.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Bu tuşa dokunarak sayılar ve simgeler arasında geçiş yap"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Bu tuşa tekrar dokunarak harflere geri dönün"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Otomatik tamamlama gibi klavye ayarlarını değiştirmek için bu tuşa basın ve basılı tutun"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Deneyin!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Git"</string> <string name="label_next_key" msgid="362972844525672568">"İleri"</string> <string name="label_done_key" msgid="2441578748772529288">"Bitti"</string> <string name="label_send_key" msgid="2815056534433717444">"Gönder"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Ses girişi"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Ses girişi, şu anda sizin diliniz için desteklenmiyor ama İngilizce dilinde kullanılabilir."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ses girişi, Google\'ın ağ bağlantılı ses tanıma işlevini kullanan deneysel bir özelliktir."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Ses girişini kapatmak için klavye ayarlarına gidin."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Ses girişini kullanmak için mikrofon düğmesine basın veya parmağınızı dokunmatik klavye üzerinde kaydırın."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ses girişi, Google\'ın ağ bağlantılı ses tanıma işlevini kullanan deneysel bir özelliktir."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ses girişini kapatmak için klavye ayarlarına gidin."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ses girişini kullanmak için mikrofon düğmesine basın veya parmağınızı dokunmatik klavye üzerinde kaydırın."</string> <string name="voice_listening" msgid="467518160751321844">"Şimdi konuşun"</string> <string name="voice_working" msgid="6666937792815731889">"Çalışıyor"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"İptal"</string> <string name="ok" msgid="7898366843681727667">"Tamam"</string> <string name="voice_input" msgid="2466640768843347841">"Ses girişi"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Ana klavyede"</item> - <item msgid="8529385602829095903">"Simge klavyesinde"</item> - <item msgid="7283103513488381103">"Kapalı"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Ana klavyedeki mikrofon"</item> - <item msgid="6907837061058876770">"Simge klavyesindeki mikrofon"</item> - <item msgid="3664304608587798036">"Sesle giriş devre dışı bırakıldı"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Sesten sonra otomatik gönder"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Arama yaparken veya bir sonraki alana giderken enter tuşuna otomatik olarak basın."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Klavyeyi açın"\n</b></font><font size="3">\n</font>"Herhangi bir metin alanına dokunun."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Klavyeyi kapatın"\n</b></font><font size="3">\n</font>"Geri tuşuna basın."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Seçenekler için bir tuşa dokunun ve basılı tutun"\n</b></font><font size="3">\n</font>"Noktalama ve vurgulama işaretlerine erişin."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Klavye ayarları"\n</b></font><font size="3">\n</font><b>"?123"</b>" tuşuna dokunun ve basılı tutun."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Ana klavyede"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Simge klavyesinde"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Kapalı"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Ana klavyede mikrfn"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Simge klavysnd mikrf"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Sesle giriş devr dşı"</string> <string name="selectInputMethod" msgid="315076553378705821">"Giriş yöntemini seç"</string> <string name="language_selection_title" msgid="1651299598555326750">"Giriş dilleri"</string> <string name="language_selection_summary" msgid="187110938289512256">"Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Kullanıcı geri bildirimini etkinleştir"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Kullanım istatistiklerini ve kilitlenme raporlarını Google\'a otomatik olarak göndererek bu giriş yöntemi düzenleyicisinin iyileştirilmesine yardımcı olun."</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Kelimeleri düzeltmek için dokunun"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Yazdığınız kelimelere dokunarak kelimelerde düzeltme yapabilirsiniz"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Yazdığınız kelimelere dokunarak kelimelerde düzeltme yapabilirsiniz"</string> <string name="keyboard_layout" msgid="437433231038683666">"Klavye Teması"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klavye"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"ses"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml index 8788021be..f90e8e98e 100644 --- a/java/res/values-uk/strings.xml +++ b/java/res/values-uk/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вібр при натиску клав."</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натиску клав."</string> <string name="popup_on_keypress" msgid="123894815723512944">"Сплив. при нат.клав."</string> - <string name="hit_correction" msgid="4855351009261318389">"Виправ. помилки вводу"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Увімкн. виправл. помилок вводу"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Помилки альбомного вводу"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Увімкн. виправл. помилок вводу"</string> - <string name="auto_correction" msgid="7911639788808958255">"Пропозиції слів"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Автоматично виправляти попереднє слово"</string> - <string name="prediction" msgid="466220283138359837">"Пропозиції слів"</string> - <string name="prediction_category" msgid="7027100625580696660">"Налашт-ня пропозицій слів"</string> - <string name="prediction_summary" msgid="459788228830873110">"Увімкн. автозаповнення при вводі"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Автозаповнення"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Збільш. розмір текст. поля"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Сховати пропозиції слів в альбом. режимі"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Налашт-ня пропозицій слів"</string> <string name="auto_cap" msgid="1719746674854628252">"Авто викор. вел. літер"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Поч. писати речення з великої літери"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Авто пунктуація"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Шв. виправлення"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Виправляє поширені помилки"</string> - <string name="show_suggestions" msgid="507074425254289133">"Показати пропозиції"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Відображати при вводі пропоновані слова"</string> - <string name="auto_complete" msgid="1103196318775486023">"Автозаповнення"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Пробіл і пунктуація автоматично вставляє виділене слово"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Автомат. виправлення"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Пробіл і пунктуація автоматично вставляють виділене слово"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Вимк."</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Середнє"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Повне"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Двобуквені пропозиції"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Викор. попер. слово для покращ. пропозиції"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Немає"</item> - <item msgid="1669461741568287396">"Базовий"</item> - <item msgid="4894328801530136615">"Розшир."</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : збережено"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Утр. клав. натис., щоб див. нагол. (ø, ö, тощо)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Натисн. клавішу назад ↶, щоб будь-коли закрити клавіат."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Доступ до цифр і символів"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Натисн. і утримуйте ліве крайнє слово, щоб додати його до словн."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Натис. цю підказку для продовж.»"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Натисн. тут, щоб закрити цю підказку і почати ввод."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Клавіатура відривається при торканні текстового поля"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Натис. і утрим. клавішу для перегл. наголосів"\n"(ø, ö, ô, ó тощо)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Перемк. до цифр і символів, натиснувши цю кнопку "</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Поверніться до літер, знову натиснувши цю клавішу"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Натис. і утрим. клавішу, щоб змін. налашт-ння клавіат., такі як автозапов."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Спробуйте!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Іти"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Голос. ввід"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Голос. ввід наразі не підтрим. для вашої мови, але можна користуватися англійською."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Голос. ввід є експеремент. ф-цією, яка викор. мережеве розпізнавання голосу Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Щоб вимкн. голос ввід, йдіть до налашт-нь клавіатури."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Щоб викор. голос. ввід, натисніть кнопку мікрофона або пересуньте палець на екранній клавіатурі."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голос. ввід є експеремент. ф-цією, яка викор. мережеве розпізнавання голосу Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Щоб вимкн. голос ввід, йдіть до налашт-нь клавіатури."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Щоб викор. голос. ввід, натисніть кнопку мікрофона або пересуньте палець на екранній клавіатурі."</string> <string name="voice_listening" msgid="467518160751321844">"Диктуйте"</string> <string name="voice_working" msgid="6666937792815731889">"Працює"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Скасувати"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Голос. ввід"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"На осн. клавіатурі"</item> - <item msgid="8529385602829095903">"Символьна клавіатура"</item> - <item msgid="7283103513488381103">"Вимк."</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Miкр. на осн. клавіатурі"</item> - <item msgid="6907837061058876770">"Miкр. на символ. клавіатурі"</item> - <item msgid="3664304608587798036">"Голос. ввід вимкнуто"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Авто подав. після гол. пош."</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Автомат. натиск. enter під час пошуку або переходу до наступного поля."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Відкр. клавіатуру"\n</b></font><font size="3">\n</font>"Натисн. якесь текст. поле."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Закрити клавіатуру"\n</b></font><font size="3">\n</font>"Натисн. клавішу Назад."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Натис.і утрим. клавішк для отрим. парам."\n</b></font><font size="3">\n</font>"Доступ до пункт. та наголос."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Налашт-ння клавіатури"\n</b></font><font size="3">\n</font>"Натисн. і утрим. клавішу "<b>"?123"</b></string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На основ. клавіатурі"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Символьна клавіатура"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Вимк."</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Miкр. на осн. клав."</string> + <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="language_selection_title" msgid="1651299598555326750">"Мови вводу"</string> <string name="language_selection_summary" msgid="187110938289512256">"Переміст. палець на пробіл, щоб змін. мову"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Увімк. відгуки корист."</string> <string name="prefs_description_log" msgid="5827825607258246003">"Допоможіть покращ. редактор методу введ., автомат. надсилаючи в Google статистику використ. та звіти про збої."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Торкн., щоб виправ. слова"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Торкн. введених слів, щоб виправити їх"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Торкн. введених слів, щоб виправити їх"</string> <string name="keyboard_layout" msgid="437433231038683666">"Тема клавіатури"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"клавіатура"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"голос."</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Чеська розкладка"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Данська розкладка"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Німецька розкладка"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Англ. розкладка (Великобританія)"</string> + <!-- outdated translation 2979257184475020604 --> <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_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Франц. розкладка"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_ru_keyboard" msgid="1383995915064277943">"Російська розкладка"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Сербська розкладка"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Шведська розкладка"</string> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Чеський голос"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Німецький голос"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Англ. голос (Австралія)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Англ. голос (Великобританія)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Англ. голос (Індія)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Англ. голос (Нова Зеландія)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Англійський голос (США)"</string> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Китайський голос (Китай)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Китайськ. голос (Тайвань)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml index 53ec91c1b..e84ddf6a1 100644 --- a/java/res/values-vi/strings.xml +++ b/java/res/values-vi/strings.xml @@ -26,68 +26,48 @@ <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> - <string name="hit_correction" msgid="4855351009261318389">"Sửa lỗi đánh máy"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Bật sửa lỗi nhập"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Lỗi nhập theo khổ ngang"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Bật sửa lỗi nhập"</string> - <string name="auto_correction" msgid="7911639788808958255">"Đề xuất từ"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Tự động sửa từ trước đó"</string> - <string name="prediction" msgid="466220283138359837">"Đề xuất từ"</string> - <string name="prediction_category" msgid="7027100625580696660">"Cài đặt đề xuất từ"</string> - <string name="prediction_summary" msgid="459788228830873110">"Bật tự động hoàn tất khi nhập"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Tự động hoàn tất"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Tăng kích cỡ trường văn bản"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ẩn đề xuất từ trong chế độ xem ngang"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Cài đặt đề xuất từ"</string> <string name="auto_cap" msgid="1719746674854628252">"Tự động viết hoa"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Viết hoa chữ cái đầu câu"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Tự động chấm câu"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></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="show_suggestions" msgid="507074425254289133">"Hiển thị đề xuất"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Hiển thị từ được đề xuất khi nhập"</string> - <string name="auto_complete" msgid="1103196318775486023">"Tự động hoàn tất"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Dấu cách và dấu câu tự động chèn vào từ được đánh dấu"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"Tự động sửa"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"Dấu cách và dấu câu tự động chèn vào từ được đánh dấu"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Tắt"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Đơn giản"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Linh hoạt"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"Đề xuất Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Sử dụng từ trước đó để cải tiến đề xuất"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Không"</item> - <item msgid="1669461741568287396">"Cơ bản"</item> - <item msgid="4894328801530136615">"Nâng cao"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Đã lưu"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Giữ phím xuống để xem dấu trọng âm (ø, ö, v.v...)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Nhấn phím quay lại ↶ để đóng bàn phím bất kỳ lúc nào"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Truy cập các số và ký hiệu"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Nhấn và giữ từ ngoài cùng bên trái để thêm từ đó vào từ điển"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Chạm vào gợi ý này để tiếp tục »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Chạm vào đây để đóng gợi ý này và bắt đầu nhập"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Bàn phím mở ra bất cứ khi nào bạn chạm vào trường văn bản"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Chạm & giữ phím để xem dấu trọng âm"\n"(ø, ö, ô, ó, v.v...)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Chuyển sang số và ký hiệu bằng cách chạm vào phím này"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Quay lại các chữ cái bằng cách chạm vào phím này lần nữa"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Chạm & giữ phím này để thay đổi cài đặt bàn phím, như tự động hoàn tất"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Hãy dùng thử!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Đến"</string> <string name="label_next_key" msgid="362972844525672568">"Tiếp theo"</string> <string name="label_done_key" msgid="2441578748772529288">"Xong"</string> <string name="label_send_key" msgid="2815056534433717444">"Gửi"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"Nhập liệu bằng giọng nói"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Nhập liệu bằng giọng nói hiện không được hỗ trợ cho ngôn ngữ của bạn nhưng hoạt động với ngôn ngữ tiếng Anh."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Nhập liệu bằng giọng nói là tính năng thử nghiệm sử dụng nhận dạng tiếng nói được kết nối mạng của Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Để tắt nhập liệu bằng giọng nói, đi tới cài đặt bàn phím."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Để sử dụng nhập liệu bằng giọng nói, hãy nhấn nút micrô hoặc trượt ngón tay trên bàn phím ảo."</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Nhập liệu bằng giọng nói là tính năng thử nghiệm sử dụng nhận dạng tiếng nói được kết nối mạng của Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Để tắt nhập liệu bằng giọng nói, đi tới cài đặt bàn phím."</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Để sử dụng nhập liệu bằng giọng nói, hãy nhấn nút micrô hoặc trượt ngón tay trên bàn phím ảo."</string> <string name="voice_listening" msgid="467518160751321844">"Xin mời nói"</string> <string name="voice_working" msgid="6666937792815731889">"Đang hoạt động"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"Huỷ"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Nhập liệu bằng giọng nói"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Trên bàn phím chính"</item> - <item msgid="8529385602829095903">"Trên bàn phím có biểu tượng"</item> - <item msgid="7283103513488381103">"Tắt"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Micrô trên bàn phím chính"</item> - <item msgid="6907837061058876770">"Micrô trên bàn phím có biểu tượng"</item> - <item msgid="3664304608587798036">"Nhập liệu bằng giọng nói đã bị vô hiệu hoá"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Tự động gửi sau thoại"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Tự đông nhấn enter khi tìm kiếm hoặc đi tới trường tiếp theo."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Mở bàn phím"\n</b></font><font size="3">\n</font>"Chạm vào bất kỳ trường văn bản nào."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Đóng bàn phím"\n</b></font><font size="3">\n</font>"Nhấn phím Quay lại."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Chạm & giữ phím cho các tuỳ chọn"\n</b></font><font size="3">\n</font>"Truy cập dấu câu và dấu trọng âm."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Cài đặt bàn phím"\n</b></font><font size="3">\n</font>"Chạm & giữ phím "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Trên bàn phím chính"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Trên bàn phím biểu tượng"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Tắt"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micrô trên bàn phím chính"</string> + <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="language_selection_title" msgid="1651299598555326750">"Ngôn ngữ nhập"</string> <string name="language_selection_summary" msgid="187110938289512256">"Trượt ngón tay trên phím cách để thay đổi ngôn ngữ"</string> @@ -133,8 +98,48 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Bật phản hồi của người dùng"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Giúp nâng cao trình chỉnh sửa phương thức nhập này bằng cách tự động gửi thống kê sử dụng và báo cáo sự cố cho Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Chạm để sửa từ"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Chạm các từ đã nhập để sửa"</string> + <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Chạm các từ đã nhập để sửa"</string> <string name="keyboard_layout" msgid="437433231038683666">"Chủ đề bàn phím"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"bàn phím"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"thoại"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Bàn phím tiếng Séc"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Bàn phím tiếng Đan Mạch"</string> + <!-- outdated translation 5111274665584117449 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Bàn phím tiếng Đức"</string> + <!-- outdated translation 2339748210942078577 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Bàn phím tiếng Anh (Anh)"</string> + <!-- outdated translation 2979257184475020604 --> <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> + <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Bàn phím tiếng Pháp"</string> + <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) --> + <skip /> + <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) --> + <skip /> + <!-- outdated translation 2281078537437195027 --> <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_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> + <!-- outdated translation 157536957128878726 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Giọng nói tiếng Séc"</string> + <!-- outdated translation 309350321180102217 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Giọng nói tiếng Đức"</string> + <string name="subtype_mode_en_AU_voice" msgid="1103892562629586486">"Giọng nói tiếng Anh (Úc)"</string> + <!-- outdated translation 3773764031764533262 --> <string name="subtype_mode_en_GB_voice" msgid="7868802451720612888">"Giọng nói tiếng Anh (Anh)"</string> + <string name="subtype_mode_en_IN_voice" msgid="4834879535045820293">"Giọng nói tiếng Anh (Ấn Độ)"</string> + <string name="subtype_mode_en_NZ_voice" msgid="2739391364469645636">"Giọng nói tiếng Anh (New Zealand)"</string> + <!-- outdated translation 1582519352222847297 --> <string name="subtype_mode_en_US_voice" msgid="2300580846081472319">"Giọng nói tiếng Anh (Mỹ)"</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> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <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> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <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> + <!-- outdated translation 3154514897179707124 --> <string name="subtype_mode_zh_CN_voice" msgid="6452442204238513331">"Giọng nói tiếng Trung (Trung Quốc)"</string> + <!-- outdated translation 1524137359275360490 --> <string name="subtype_mode_zh_TW_voice" msgid="3640444875378221940">"Giọng nói tiếng Trung (Đài Loan)"</string> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-xlarge-land/dimens.xml b/java/res/values-xlarge-land/dimens.xml new file mode 100644 index 000000000..625dd263c --- /dev/null +++ b/java/res/values-xlarge-land/dimens.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<resources> + <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 --> + <dimen name="keyboardHeight">58.0mm</dimen> + <!-- key_height + key_bottom_gap = popup_key_height --> + <!-- <dimen name="key_height">14.5mm</dimen> --> + <dimen name="key_bottom_gap">0.0mm</dimen> + <dimen name="key_horizontal_gap">0.0mm</dimen> + <dimen name="popup_key_height">13.0mm</dimen> + <dimen name="keyboard_top_padding">1.1mm</dimen> + <dimen name="keyboard_bottom_padding">0.0mm</dimen> + <!-- key_height x 1.0 --> + <dimen name="key_preview_height">13.0mm</dimen> + + <dimen name="key_letter_size">28dip</dimen> + <dimen name="key_label_text_size">20dip</dimen> + <!-- left or right padding of label alignment --> + <dimen name="key_label_horizontal_alignment_padding">18dip</dimen> + <dimen name="candidate_strip_padding">40.0mm</dimen> +</resources> diff --git a/java/res/values-xlarge/config.xml b/java/res/values-xlarge/config.xml new file mode 100644 index 000000000..004b39b92 --- /dev/null +++ b/java/res/values-xlarge/config.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<resources> + <bool name="config_enable_show_settings_key_option">false</bool> + <bool name="config_enable_show_subtype_settings">false</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_candidate_highlight_font_color_enabled">false</bool> + <bool name="config_swipe_down_dismiss_keyboard_enabled">false</bool> + <bool name="config_sliding_key_input_enabled">false</bool> + <bool name="config_digit_popup_characters_enabled">false</bool> + <!-- Whether or not Popup on key press is enabled by default --> + <bool name="config_default_popup_preview">false</bool> + <bool name="config_use_spacebar_language_switcher">false</bool> + <!-- The language is never displayed if == 0, always displayed if < 0 --> + <integer name="config_delay_before_fadeout_language_on_spacebar">1200</integer> + <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. --> + <string name="config_default_keyboard_theme_id" translatable="false">5</string> + <string name="config_text_size_of_language_on_spacebar" translatable="false">medium</string> + <integer name="config_max_popup_keyboard_column">9</integer> +</resources> diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml new file mode 100644 index 000000000..11ad6b184 --- /dev/null +++ b/java/res/values-xlarge/dimens.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<resources> + <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 --> + <dimen name="keyboardHeight">48.0mm</dimen> + <!-- key_height + key_bottom_gap = popup_key_height --> + <!-- <dimen name="key_height">14.5mm</dimen> --> + <dimen name="key_bottom_gap">0.0mm</dimen> + <dimen name="key_horizontal_gap">0.0mm</dimen> + <dimen name="popup_key_height">10.0mm</dimen> + <dimen name="keyboard_top_padding">1.1mm</dimen> + <dimen name="keyboard_bottom_padding">0.0mm</dimen> + <!-- key_height x 1.0 --> + <dimen name="key_preview_height">13.0mm</dimen> + <dimen name="mini_keyboard_key_horizontal_padding">12dip</dimen> + <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> + <!-- popup_key_height x 1.2 --> + <dimen name="mini_keyboard_slide_allowance">15.6mm</dimen> + <!-- popup_key_height x -1.0 --> + <dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen> + + <dimen name="key_letter_size">26dip</dimen> + <dimen name="key_label_text_size">16dip</dimen> + <dimen name="key_preview_text_size_large">24dip</dimen> + <!-- left or right padding of label alignment --> + <dimen name="key_label_horizontal_alignment_padding">6dip</dimen> + <dimen name="keyboard_bottom_row_vertical_correction">10.0mm</dimen> + + <dimen name="candidate_strip_height">46dip</dimen> + <dimen name="candidate_strip_padding">15.0mm</dimen> + <dimen name="candidate_min_width">0.3in</dimen> + <dimen name="candidate_padding">12dip</dimen> + <dimen name="candidate_text_size">22dip</dimen> +</resources> diff --git a/java/res/values-zh-rCN/donottranslate-altchars.xml b/java/res/values-xlarge/donottranslate.xml index c165b11c5..672dea589 100644 --- a/java/res/values-zh-rCN/donottranslate-altchars.xml +++ b/java/res/values-xlarge/donottranslate.xml @@ -18,13 +18,6 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">èéêë</string> - <string name="alternates_for_i">ìíîï</string> - <string name="alternates_for_o">òóôõöœø</string> - <string name="alternates_for_u">ùúûü</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ</string> + <!-- Default value of the visibility of the suggestion strip --> + <string name="prefs_suggestion_visibility_default_value" translatable="false">2</string> </resources> diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 7a4bcea0f..8b6ff2567 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -26,68 +26,51 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"按键时振动"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"按键时播放音效"</string> <string name="popup_on_keypress" msgid="123894815723512944">"按键时显示弹出窗口"</string> - <string name="hit_correction" msgid="4855351009261318389">"纠正输入错误"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"启用输入错误纠正功能"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"横向输入错误"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"启用输入错误纠正功能"</string> - <string name="auto_correction" msgid="7911639788808958255">"字词建议"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"自动纠正前面的字词"</string> - <string name="prediction" msgid="466220283138359837">"字词建议"</string> - <string name="prediction_category" msgid="7027100625580696660">"字词建议设置"</string> - <string name="prediction_summary" msgid="459788228830873110">"输入时启用自动填写功能"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"自动完成"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"扩大文字字段"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"在横向视图中隐藏字词建议"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"字词建议设置"</string> <string name="auto_cap" msgid="1719746674854628252">"自动大写"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"句首字母大写"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"自动加标点"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"快速纠正"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"纠正常见的输入错误"</string> - <string name="show_suggestions" msgid="507074425254289133">"显示建议"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"输入时启用联想提示"</string> - <string name="auto_complete" msgid="1103196318775486023">"自动填写"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"按空格键和标点符号时自动插入突出显示的字词"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"字词建议"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"自动纠正前面的字词"</string> + <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) --> + <skip /> <string name="bigram_suggestion" msgid="1323347224043514969">"双连词建议"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"使用以前的字词改进建议"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"无"</item> - <item msgid="1669461741568287396">"基本模式"</item> - <item msgid="4894328801530136615">"高级"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已保存"</string> - <string name="tip_long_press" msgid="6101270866284343344">"按住某个键可看到重音符号(例如 ø、ö 等)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"随时可以通过按后退键 ↶ 关闭键盘"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"访问数字和符号"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"长按最左侧的字可将其添加到词典中"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"轻触此提示继续 »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"轻触此处可关闭该提示,然后便可开始输入内容!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"您可以随时通过触摸文字字段打开键盘"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"轻触并按住某个键可以查看重音符号"\n"(ø、ö、ô、ó 等)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"轻触该键即可切换到数字和符号键盘"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"再次轻触该键即可返回字母键盘"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"触摸并按住该键可更改键盘设置,例如自动完成"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"试试吧!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"开始"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"语音输入"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"语音输入功能当前还不支持您的语言,您只能输入英语语音。"</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"语音输入是一项试验性的功能,它采用了 Google 的网络语音识别功能。"</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"要关闭语音输入功能,请转至键盘设置。"</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"要使用语音输入,请按麦克风按钮或者在屏幕键盘上滑动手指。"</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"语音输入是一项试验性的功能,它采用了 Google 的网络语音识别功能。"</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"要关闭语音输入功能,请转至键盘设置。"</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"要使用语音输入,请按麦克风按钮或者在屏幕键盘上滑动手指。"</string> <string name="voice_listening" msgid="467518160751321844">"请开始说话"</string> <string name="voice_working" msgid="6666937792815731889">"正在处理"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +87,18 @@ <string name="cancel" msgid="6830980399865683324">"取消"</string> <string name="ok" msgid="7898366843681727667">"确定"</string> <string name="voice_input" msgid="2466640768843347841">"语音输入"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"主键盘上"</item> - <item msgid="8529385602829095903">"符号键盘上"</item> - <item msgid="7283103513488381103">"关"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"主键盘上的麦克风"</item> - <item msgid="6907837061058876770">"符号键盘上的麦克风"</item> - <item msgid="3664304608587798036">"已停用语音输入"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"语音结束后自动提交"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"搜索或转到下一字段时自动按 Enter。"</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"打开键盘"\n</b></font><font size="3">\n</font>"触摸任意文本字段。"</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"关闭键盘"\n</b></font><font size="3">\n</font>"按“返回”键。"</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"触摸并按住选项键"\n</b></font><font size="3">\n</font>"进入标点/重音符号界面。"</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"键盘设置"\n</b></font><font size="3">\n</font>"触摸并按住 "<b>"?123"</b>" 键。"</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) --> + <skip /> + <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) --> + <skip /> + <!-- no translation found for voice_input_modes_off (3745699748218082014) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_off (63875609591897607) --> + <skip /> <string name="selectInputMethod" msgid="315076553378705821">"选择输入法"</string> <string name="language_selection_title" msgid="1651299598555326750">"输入语言"</string> <string name="language_selection_summary" msgid="187110938289512256">"在空格键上滑动手指可更改语言"</string> @@ -133,8 +107,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"启用用户反馈"</string> <string name="prefs_description_log" msgid="5827825607258246003">"自动向 Google 发送使用情况统计信息和崩溃报告,帮助改进该输入法编辑器。"</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"触摸即可更正字词"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"您可以触摸已键入的字词,对其进行更正"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"您可以触摸已键入的字词,对其进行更正"</string> <string name="keyboard_layout" msgid="437433231038683666">"键盘主题"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"键盘"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"语音"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index cbd079633..6f680d9e8 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -26,68 +26,48 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"按鍵時震動"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"按鍵時播放音效"</string> <string name="popup_on_keypress" msgid="123894815723512944">"按鍵時顯示彈出式視窗"</string> - <string name="hit_correction" msgid="4855351009261318389">"修正輸入錯誤"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"啟用輸入錯誤修正功能"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"橫向輸入錯誤"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"啟用輸入錯誤修正功能"</string> - <string name="auto_correction" msgid="7911639788808958255">"字詞建議"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"自動修正前一個字詞"</string> - <string name="prediction" msgid="466220283138359837">"字詞建議"</string> - <string name="prediction_category" msgid="7027100625580696660">"字詞建議設定"</string> - <string name="prediction_summary" msgid="459788228830873110">"輸入時啟用自動完成"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"自動完成"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"放大文字欄位大小"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"在橫向檢視模式中隱藏字詞建議"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"字詞建議設定"</string> <string name="auto_cap" msgid="1719746674854628252">"自動大寫"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"句首字母大寫"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"自動標點"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"快速修正"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"修正一般打字錯誤"</string> - <string name="show_suggestions" msgid="507074425254289133">"顯示建議"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"打字時顯示建議字詞"</string> - <string name="auto_complete" msgid="1103196318775486023">"自動完成"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <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> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> + <string name="auto_correction" msgid="4979925752001319458">"自動修正"</string> + <string name="auto_correction_summary" msgid="2591572172085659910">"在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"關閉"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"普通模式"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"加強模式"</string> <string name="bigram_suggestion" msgid="1323347224043514969">"雙連詞建議"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"根據前一個字詞自動找出更適合的建議"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"無"</item> - <item msgid="1669461741568287396">"基本模式"</item> - <item msgid="4894328801530136615">"進階模式"</item> - </string-array> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已儲存"</string> - <string name="tip_long_press" msgid="6101270866284343344">"按住按鍵可查看重音符號 (ø、ö 等)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"隨時可以透過按後退鍵 ↶ 關閉鍵盤"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"使用數字和符號"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"按住最左邊的字詞,將其新增到字典中"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"輕觸此提示繼續 »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"輕觸此處以關閉提示,並開始打字!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"輕觸文字欄位時即會開啟鍵盤"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"輕觸並按住某個鍵即可查看聲調"\n"(ø、ö、ô、ó 等)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"輕觸此鍵即可切換到數字和符號鍵盤"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"再次輕觸此鍵即可返回到字母鍵盤"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"輕觸並按住此鍵即可變更鍵盤設定,例如自動完成"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"試試看!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"開始"</string> <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_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <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> <string name="voice_warning_title" msgid="4419354150908395008">"語音輸入"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"語音輸入目前不支援您的語言,但是可以辨識英文。"</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"語音輸入這項實驗功能運用了 Google 的網路語音辨識系統。"</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"請前往鍵盤設定來關閉語音輸入。"</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"如要使用語音輸入,按下 [麥克風] 按鈕,或將手指滑過螢幕小鍵盤即可。"</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"語音輸入這項實驗功能運用了 Google 的網路語音辨識系統。"</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"請前往鍵盤設定來關閉語音輸入。"</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"如要使用語音輸入,按下 [麥克風] 按鈕,或將手指滑過螢幕小鍵盤即可。"</string> <string name="voice_listening" msgid="467518160751321844">"請說話"</string> <string name="voice_working" msgid="6666937792815731889">"辨識中"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +84,12 @@ <string name="cancel" msgid="6830980399865683324">"取消"</string> <string name="ok" msgid="7898366843681727667">"確定"</string> <string name="voice_input" msgid="2466640768843347841">"語音輸入"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"於主鍵盤"</item> - <item msgid="8529385602829095903">"於符號鍵盤"</item> - <item msgid="7283103513488381103">"關閉"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"主鍵盤上的麥克風"</item> - <item msgid="6907837061058876770">"符號鍵盤上的麥克風"</item> - <item msgid="3664304608587798036">"已停用語音輸入"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"說話後自動提交"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"搜尋或前往下一個欄位時自動按下輸入。"</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"開啟鍵盤"\n</b></font><font size="3">\n</font>"輕觸任何文字欄位。"</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"關閉鍵盤"\n</b></font><font size="3">\n</font>"按下 Back 鍵。"</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>\n"輕觸並按住按鍵開啟選項"</b></font><font size="3">\n</font>"輸入標點與輕重音。"</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"鍵盤設定"\n</b></font><font size="3">\n</font>"輕觸並按住 "<b>"?123"</b>" 鍵。"</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"於主鍵盤"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"於符號鍵盤"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"關閉"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"於主鍵盤顯示麥克風"</string> + <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="language_selection_title" msgid="1651299598555326750">"輸入語言"</string> <string name="language_selection_summary" msgid="187110938289512256">"以手指在空白鍵上滑動可變更語言"</string> @@ -133,8 +98,78 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"啟用使用者意見回饋"</string> <string name="prefs_description_log" msgid="5827825607258246003">"自動將使用統計資料和當機報告傳送給 Google,協助改善這個輸入法編輯器。"</string> <!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"輕觸即可重新修正字詞"</string> - <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"只要輕觸您所輸入的字詞,即可重新予以修正"</string> + <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"只要輕觸您所輸入的字詞,即可重新予以修正"</string> <string name="keyboard_layout" msgid="437433231038683666">"鍵盤主題"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"鍵盤"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"語音"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <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_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_es_US_keyboard (3702125193532262008) --> + <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_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_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_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_voice (7868802451720612888) --> + <skip /> + <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) --> + <skip /> + <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_voice (2300580846081472319) --> + <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_zh_CN_voice (6452442204238513331) --> + <skip /> + <!-- no translation found for subtype_mode_zh_TW_voice (3640444875378221940) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 995373e84..9759e0eb6 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -16,7 +16,7 @@ <resources> - <declare-styleable name="LatinKeyboardBaseView"> + <declare-styleable name="KeyboardView"> <!-- Default KeyboardView style. --> <attr name="keyboardViewStyle" format="reference" /> @@ -25,8 +25,8 @@ checkable+checked+pressed. --> <attr name="keyBackground" format="reference" /> - <!-- Size of the text for character keys. --> - <attr name="keyTextSize" format="dimension" /> + <!-- Size of the text for one letter character keys. --> + <attr name="keyLetterSize" format="dimension" /> <!-- Size of the text for custom keys with some text and no icon. --> <attr name="labelTextSize" format="dimension" /> @@ -34,6 +34,9 @@ <!-- Color to use for the label in a key. --> <attr name="keyTextColor" format="color" /> + <!-- Color to use for the label in a key when in disabled state. --> + <attr name="keyTextColorDisabled" format="color" /> + <!-- Layout resource for key press feedback.--> <attr name="keyPreviewLayout" format="reference" /> @@ -56,17 +59,131 @@ <attr name="shadowRadius" format="float" /> <attr name="backgroundDimAmount" format="float" /> - <attr name="keyTextStyle"> - <flag name="normal" value="0" /> - <flag name="bold" value="1" /> - <flag name="italic" value="2" /> + <attr name="keyLetterStyle"> + <!-- This should be aligned with Typeface.NORMAL etc. --> + <enum name="normal" value="0" /> + <enum name="bold" value="1" /> + <enum name="italic" value="2" /> + <enum name="boldItalic" value="3" /> </attr> - <attr name="symbolColorScheme"> - <flag name="white" value="0" /> - <flag name="black" value="1" /> + <attr name="colorScheme"> + <!-- This should be aligned with KeyboardView.COLOR_SCHEME_* --> + <enum name="white" value="0" /> + <enum name="black" value="1" /> </attr> </declare-styleable> + <declare-styleable name="Keyboard"> + <!-- Default keyboard height --> + <attr name="keyboardHeight" format="dimension" /> + <!-- Maximum keyboard height, in pixels or percentage of display height --> + <attr name="maxKeyboardHeight" format="dimension|fraction" /> + <!-- Default width of a key, in pixels or percentage of display width. --> + <attr name="keyWidth" format="dimension|fraction" /> + <!-- Default height of a row (key height + vertical gap), in pixels or percentage of + keyboard height. --> + <attr name="rowHeight" format="dimension|fraction" /> + <!-- Default horizontal gap between keys. --> + <attr name="horizontalGap" format="dimension|fraction" /> + <!-- Default vertical gap between rows of keys. --> + <attr name="verticalGap" format="dimension|fraction" /> + <!-- Popup keyboard layout template --> + <attr name="popupKeyboardTemplate" format="reference" /> + </declare-styleable> + + <declare-styleable name="Keyboard_Key"> + <!-- The unicode value that this key outputs. --> + <attr name="code" format="integer" /> + <!-- The characters to display in the popup keyboard. --> + <attr name="popupCharacters" format="string" /> + <!-- Maximum column of popup keyboard --> + <attr name="maxPopupKeyboardColumn" format="integer" /> + <!-- Key edge flags. --> + <attr name="keyEdgeFlags"> + <!-- 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 modifier key such as Alt or Shift. --> + <attr name="isModifier" format="boolean" /> + <!-- Whether this is a toggle key. --> + <attr name="isSticky" format="boolean" /> + <!-- Whether long-pressing on this key will make it repeat. --> + <attr name="isRepeatable" format="boolean" /> + <!-- The icon to show in the popup preview. --> + <attr name="iconPreview" format="reference" /> + <!-- The string of characters to output when this key is pressed. --> + <attr name="keyOutputText" format="string" /> + <!-- The label to display on the key. --> + <attr name="keyLabel" format="string" /> + <!-- The key label option --> + <attr name="keyLabelOption"> + <!-- This should be aligned with KeyboardView.KEY_LABEL_OPTION_* --> + <flag name="alignLeft" value="1" /> + <flag name="alignRight" value="2" /> + <flag name="alignBottom" value="8" /> + <flag name="fontNormal" value="16" /> + </attr> + <!-- The unicode that this key generates in manual temporary upper case mode. --> + <attr name="manualTemporaryUpperCaseCode" format="integer" /> + <!-- The icon to display on the key instead of the label. --> + <attr name="keyIcon" format="reference" /> + <!-- The hint icon to display on the key in conjunction with the label --> + <attr name="keyHintIcon" format="reference" /> + <!-- The hint icon to display on the key when keyboard is in manual temporary upper case + mode. --> + <attr name="manualTemporaryUpperCaseHintIcon" format="reference" /> + <!-- The key style to specify a set of key attributes defined by <key_style/> --> + <attr name="keyStyle" format="string" /> + <!-- Shift key icon for shifted state --> + <attr name="shiftedIcon" format="reference" /> + </declare-styleable> + + <declare-styleable name="Keyboard_Row"> + <!-- Row edge flags. --> + <attr name="rowEdgeFlags"> + <!-- 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> + + <declare-styleable name="Keyboard_Case"> + <!-- This should be aligned with KeyboardId.MODE_* --> + <attr name="mode"> + <enum name="text" value="0" /> + <enum name="url" value="1" /> + <enum name="email" value="2" /> + <enum name="im" value="3" /> + <enum name="web" value="4" /> + <enum name="phone" value="5" /> + </attr> + <attr name="hasSettingsKey" format="string" /> + <attr name="voiceKeyEnabled" format="string" /> + <attr name="hasVoiceKey" format="string" /> + <attr name="imeOptions"> + <!-- This should be aligned with EditorInfo.IME_ACTION_* --> + <flag name="actionUnspecified" value="0" /> + <flag name="actionNone" value="1" /> + <flag name="actionGo" value="2" /> + <flag name="actionSearch" value="3" /> + <flag name="actionSend" value="4" /> + <flag name="actionNext" value="5" /> + <flag name="actionDone" value="6" /> + <flag name="actionPrevious" value="7" /> + </attr> + </declare-styleable> + + <declare-styleable name="Keyboard_KeyStyle"> + <attr name="styleName" format="string" /> + <attr name="parentStyle" format="string" /> + </declare-styleable> </resources> diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml index 5a24e4c60..2a181e17d 100644 --- a/java/res/values/bools.xml +++ b/java/res/values/bools.xml @@ -18,16 +18,9 @@ */ --> <resources> - <!-- Whether or not auto-correction should be enabled by default --> - <bool name="enable_autocorrect">true</bool> <!-- Whether this input method should be used as the default for a locale. Override it for latin languages. --> <bool name="im_is_default">false</bool> <!-- Whether or not voice input is enabled by default. --> <bool name="voice_input_default">true</bool> - <bool name="config_swipeDisambiguation">true</bool> - <!-- Whether or not Popup on key press is enabled by default --> - <bool name="default_popup_preview">true</bool> - <bool name="default_recorrection_enabled">true</bool> - <bool name="config_long_press_comma_for_settings_enabled">true</bool> </resources> diff --git a/java/res/values/config.xml b/java/res/values/config.xml index edb6cd845..6a1b27a05 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -19,6 +19,31 @@ --> <resources> + <bool name="config_swipeDisambiguation">true</bool> + <bool name="default_recorrection_enabled">true</bool> + <bool name="config_long_press_comma_for_settings_enabled">true</bool> + <bool name="config_enable_show_settings_key_option">true</bool> + <bool name="config_enable_show_subtype_settings">true</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_candidate_highlight_font_color_enabled">true</bool> + <bool name="config_swipe_down_dismiss_keyboard_enabled">true</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> + <bool name="config_default_bigram_suggestions">true</bool> + <bool name="config_use_spacebar_language_switcher">true</bool> + <!-- The language is never displayed if == 0, always displayed if < 0 --> + <integer name="config_delay_before_fadeout_language_on_spacebar">-1</integer> + <integer name="config_duration_of_fadeout_language_on_spacebar">50</integer> + <integer name="config_final_fadeout_percentage_of_language_on_spacebar">15</integer> <integer name="config_delay_before_preview">0</integer> <integer name="config_delay_after_preview">10</integer> <integer name="config_preview_fadein_anim_time">0</integer> @@ -27,6 +52,26 @@ <integer name="config_mini_keyboard_fadeout_anim_time">100</integer> <integer name="config_delay_before_key_repeat_start">400</integer> <integer name="config_key_repeat_interval">50</integer> + <integer name="config_keyboard_grid_width">32</integer> + <integer name="config_keyboard_grid_height">16</integer> <integer name="config_long_press_key_timeout">400</integer> - <integer name="config_multi_tap_key_timeout">800</integer> + <integer name="config_long_press_shift_key_timeout">1200</integer> + <integer name="config_touch_noise_threshold_millis">40</integer> + <dimen name="config_touch_noise_threshold_distance">2.0mm</dimen> + <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. --> + <string name="config_default_keyboard_theme_id" translatable="false">4</string> + <string name="config_text_size_of_language_on_spacebar" translatable="false">small</string> + <integer name="config_max_popup_keyboard_column">9</integer> + <!-- Whether or not auto-correction should be enabled by default --> + <bool name="enable_autocorrect">true</bool> + <string-array name="auto_correction_threshold_values" translatable="false"> + <!-- Off, When auto correction setting is Off, this value is not used. --> + <item></item> + <!-- Modest : Suggestion whose normalized score is greater than this value + will be subject to auto-correction. --> + <item>0.22</item> + <!-- Aggressive : Suggestion whose normalized score is greater than this value + will be subject to auto-correction. --> + <item>0</item> + </string-array> </resources> diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 0c3b6ad2e..90bf1bfad 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -19,32 +19,46 @@ --> <resources> + <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 --> + <dimen name="keyboardHeight">1.265in</dimen> <!-- key_height + key_bottom_gap = popup_key_height --> - <dimen name="key_height">0.290in</dimen> + <!-- <dimen name="key_height">0.290in</dimen> --> <dimen name="key_bottom_gap">0.035in</dimen> + <dimen name="key_horizontal_gap">0.000in</dimen> <dimen name="popup_key_height">0.325in</dimen> + <dimen name="keyboard_top_padding">0.00in</dimen> <dimen name="keyboard_bottom_padding">0.06in</dimen> - <dimen name="bubble_pointer_offset">22dip</dimen> - <dimen name="candidate_strip_height">42dip</dimen> - <dimen name="candidate_strip_fading_edge_length">63dip</dimen> - <dimen name="spacebar_vertical_correction">4dip</dimen> - <!-- If the screen height in landscape is larger than the below value, then the keyboard - will not go into extract (fullscreen) mode. --> - <dimen name="max_height_for_fullscreen">2.5in</dimen> - <dimen name="key_text_size">0.13in</dimen> - <dimen name="key_label_text_size">0.083in</dimen> - <dimen name="key_preview_text_size_large">40sp</dimen> - <dimen name="key_preview_offset">0.000in</dimen> <!-- key_preview_text_size_large x 2 --> <dimen name="key_preview_height">80sp</dimen> + <dimen name="mini_keyboard_key_horizontal_padding">8dip</dimen> <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> - <!-- popup_key_height x 1.7 --> - <dimen name="mini_keyboard_slide_allowance">0.553in</dimen> - <!-- popup_key_height x 1.0 --> + <!-- popup_key_height x 1.2 --> + <dimen name="mini_keyboard_slide_allowance">0.390in</dimen> + <!-- popup_key_height x -1.0 --> <dimen name="mini_keyboard_vertical_correction">-0.325in</dimen> - <dimen name="key_hysteresis_distance">0.05in</dimen> + + <dimen name="key_letter_size">0.13in</dimen> + <dimen name="key_label_text_size">0.083in</dimen> + <dimen name="key_preview_text_size_large">40sp</dimen> + <!-- left or right padding of label alignment --> + <dimen name="key_label_horizontal_alignment_padding">0.13in</dimen> + <dimen name="key_preview_offset">0.000in</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="candidate_min_touchable_width">0.3in</dimen> + <dimen name="keyboard_bottom_row_vertical_correction">0.0mm</dimen> + + <dimen name="candidate_strip_height">42dip</dimen> + <dimen name="candidate_strip_fading_edge_length">63dip</dimen> + <dimen name="candidate_strip_padding">0dip</dimen> + <dimen name="candidate_min_width">0.3in</dimen> + <dimen name="candidate_padding">6dip</dimen> + <dimen name="candidate_text_size">18dip</dimen> + <dimen name="spacebar_vertical_correction">4dip</dimen> + <!-- If the screen height in landscape is larger than the below value, then the keyboard + will not go into extract (fullscreen) mode. --> + <dimen name="max_height_for_fullscreen">2.5in</dimen> + <dimen name="bubble_pointer_offset">22dip</dimen> + + <dimen name="key_hysteresis_distance">0.05in</dimen> </resources> diff --git a/java/res/values/donottranslate-altchars.xml b/java/res/values/donottranslate-altchars.xml index bba7282c9..85e06f23b 100644 --- a/java/res/values/donottranslate-altchars.xml +++ b/java/res/values/donottranslate-altchars.xml @@ -18,15 +18,15 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">èéêë</string> - <string name="alternates_for_i">ìíîï</string> - <string name="alternates_for_o">òóôõöœø</string> - <string name="alternates_for_u">ùúûü</string> - <string name="alternates_for_s">§ß</string> + <string name="alternates_for_a">à,á,â,ã,ä,å,æ</string> + <string name="alternates_for_e">3,è,é,ê,ë</string> + <string name="alternates_for_i">ì,í,î,ï,8</string> + <string name="alternates_for_o">ò,ó,ô,õ,ö,œ,ø,9</string> + <string name="alternates_for_u">ù,ú,û,ü,7</string> + <string name="alternates_for_s">§,ß</string> <string name="alternates_for_n">ñ</string> <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ</string> + <string name="alternates_for_y">ý,ÿ,6</string> <string name="alternates_for_q">1</string> <string name="alternates_for_w">2</string> <string name="alternates_for_d"></string> @@ -37,10 +37,19 @@ <string name="alternates_for_g"></string> <string name="alternates_for_p">0</string> <string name="alternates_for_v"></string> - <string name="alternates_for_ae"></string> - <string name="alternates_for_oe"></string> + <string name="keylabel_for_scandinavia_row2_10"></string> + <string name="keylabel_for_scandinavia_row2_11"></string> + <string name="alternates_for_scandinavia_row2_10"></string> + <string name="alternates_for_scandinavia_row2_11"></string> <string name="alternates_for_cyrillic_e"></string> <string name="alternates_for_cyrillic_soft_sign"></string> - <string name="alternates_for_a_umlaut"></string> - <string name="alternates_for_o_umlaut"></string> + <string name="alternates_for_mic">"\@drawable/sym_keyboard_settings|\@integer/key_settings,\@drawable/sym_keyboard_mic|\@integer/key_voice"</string> + <string name="alternates_for_smiley">":-)|:-) ,:-(|:-( ,;-)|;-) ,:-P|:-P ,=-O|=-O ,:-*|:-* ,:O|:O ,B-)|B-) ,:-$|:-$ ,:-!|:-! ,:-[|:-[ ,O:-)|O:-) ,:-\\\\\\\\|:-\\\\\\\\ ,:\'(|:\'( ,:-D|:-D "</string> + <string name="alternates_for_settings_slash">"\@drawable/sym_keyboard_settings|\@integer/key_settings,/"</string> + <string name="alternates_for_settings_at">"\@drawable/sym_keyboard_settings|\@integer/key_settings,\@"</string> + <string name="alternates_for_settings_comma">"\@drawable/sym_keyboard_settings|\@integer/key_settings,\\,"</string> + <string name="alternates_for_punctuation">":,/,&,(,),-,+,;,\@,\',\",\?,!,\\,"</string> + <string name="keylabel_for_popular_domain">".com"</string> + <!-- popular web domains for the locale - most popular, displayed on the keyboard --> + <string name="alternates_for_popular_domain">".net,.org,.gov,.edu"</string> </resources> diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml index 936609924..6a1069e99 100644 --- a/java/res/values/donottranslate.xml +++ b/java/res/values/donottranslate.xml @@ -23,13 +23,129 @@ <!-- Symbols that are sentence separators, for purposes of making it hug the last sentence. --> <string name="sentence_separators">.,!?)</string> <!-- Symbols that are suggested between words --> - <string name="suggested_punctuations">!?,\u0022\u0027:()-/@_</string> + <string name="suggested_punctuations">!?,\u0022\u0027:();-/@_</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 numeric" key. Must be short to fit on key! --> + <string name="label_to_numeric_key">123</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" translatable="false">0</string> + <string name="settings_key_mode_auto">0</string> <!-- Always show the settings key --> - <string name="settings_key_mode_always_show" translatable="false">1</string> + <string name="settings_key_mode_always_show">1</string> <!-- Always hide the settings key --> - <string name="settings_key_mode_always_hide" translatable="false">2</string> + <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 --> + <string name="prefs_suggestion_visibility_show_only_portrait_value">1</string> + <!-- Always hide the suggestion strip --> + <string name="prefs_suggestion_visibility_hide_value">2</string> + <!-- Default value of the visibility of the suggestion strip --> + <string name="prefs_suggestion_visibility_default_value">0</string> + <!-- Option to show/hide the suggestion strip --> + <string-array name="prefs_suggestion_visibility_values"> + <item>@string/prefs_suggestion_visibility_show_value</item> + <item>@string/prefs_suggestion_visibility_show_only_portrait_value</item> + <item>@string/prefs_suggestion_visibility_hide_value</item> + </string-array> + <string-array name="prefs_suggestion_visibilities"> + <item>@string/prefs_suggestion_visibility_show_name</item> + <item>@string/prefs_suggestion_visibility_show_only_portrait_name</item> + <item>@string/prefs_suggestion_visibility_hide_name</item> + </string-array> + + <string name="auto_correction_threshold_mode_index_off">0</string> + <string name="auto_correction_threshold_mode_index_modest">1</string> + <string name="auto_correction_threshold_mode_index_aggeressive">2</string> + <string-array name="auto_correction_threshold_mode_indexes"> + <item>@string/auto_correction_threshold_mode_index_off</item> + <item>@string/auto_correction_threshold_mode_index_modest</item> + <item>@string/auto_correction_threshold_mode_index_aggeressive</item> + </string-array> + <string-array name="auto_correction_threshold_modes"> + <item>@string/auto_correction_threshold_mode_off</item> + <item>@string/auto_correction_threshold_mode_modest</item> + <item>@string/auto_correction_threshold_mode_aggeressive</item> + </string-array> + + <string name="voice_mode_main">0</string> + <string name="voice_mode_symbols">1</string> + <string name="voice_mode_off">2</string> + <string-array name="voice_input_modes_values"> + <item>@string/voice_mode_main</item> + <item>@string/voice_mode_symbols</item> + <item>@string/voice_mode_off</item> + </string-array> + <!-- Array of Voice Input modes --> + <string-array name="voice_input_modes"> + <item>@string/voice_input_modes_main_keyboard</item> + <item>@string/voice_input_modes_symbols_keyboard</item> + <item>@string/voice_input_modes_off</item> + </string-array> + <!-- Array of Voice Input modes summary --> + <string-array name="voice_input_modes_summary"> + <item>@string/voice_input_modes_summary_main_keyboard</item> + <item>@string/voice_input_modes_summary_symbols_keyboard</item> + <item>@string/voice_input_modes_summary_off</item> + </string-array> + + <!-- Title for Latin keyboard debug settings activity / dialog --> + <string name="english_ime_debug_settings">Android keyboard Debug settings</string> + <string name="prefs_debug_mode">Debug Mode</string> + + <!-- Keyboard theme names --> + <string name="layout_basic">Basic</string> + <string name="layout_high_contrast">Basic (High Contrast)</string> + <string name="layout_stone_bold">Stone (bold)</string> + <string name="layout_stone_normal">Stone (normal)</string> + <string name="layout_gingerbread">Gingerbread</string> + <string name="layout_honeycomb">Honeycomb</string> + + <!-- For keyboard theme switcher dialog --> + <string-array name="keyboard_layout_modes"> + <item>@string/layout_basic</item> + <item>@string/layout_high_contrast</item> + <item>@string/layout_stone_normal</item> + <item>@string/layout_stone_bold</item> + <item>@string/layout_gingerbread</item> + <item>@string/layout_honeycomb</item> + </string-array> + <string-array name="keyboard_layout_modes_values"> + <item>0</item> + <item>1</item> + <item>2</item> + <item>3</item> + <item>4</item> + <item>5</item> + </string-array> + + <!-- Subtype locale name exceptions --> + <string-array name="subtype_locale_exception_keys"> + <item>en_US</item> + <item>en_GB</item> + </string-array> + <string-array name="subtype_locale_exception_values"> + <item>English (US)</item> + <item>English (UK)</item> + </string-array> </resources> diff --git a/java/res/values/keycodes.xml b/java/res/values/keycodes.xml index c5d5b3cd1..6c18cb42a 100644 --- a/java/res/values/keycodes.xml +++ b/java/res/values/keycodes.xml @@ -19,14 +19,13 @@ --> <resources> + <!-- These code should be aligned with Keyboard.CODE_*. --> <integer name="key_tab">9</integer> <integer name="key_return">10</integer> <integer name="key_space">32</integer> <integer name="key_shift">-1</integer> - <integer name="key_symbol">-2</integer> + <integer name="key_switch_alpha_symbol">-2</integer> <integer name="key_delete">-5</integer> - <!-- Keycode for F1 (function) key. This one switches between language switch & comma/.com --> <integer name="key_settings">-100</integer> <integer name="key_voice">-102</integer> - <integer name="key_f1">-103</integer> </resources> diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 6644d2224..f3805fdcf 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -22,7 +22,7 @@ <string name="english_ime_name">Android keyboard</string> <!-- Title for Latin keyboard settings activity / dialog --> <string name="english_ime_settings">Android keyboard settings</string> - <!-- Title for Latin keyboard input options dialog --> + <!-- Title for Latin keyboard input options dialog [CHAR LIMIT=25] --> <string name="english_ime_input_options">Input options</string> <!-- Option to provide vibrate/haptic feedback on keypress --> @@ -31,151 +31,60 @@ <!-- Option to play back sound on keypress in soft keyboard --> <string name="sound_on_keypress">Sound on keypress</string> - <!-- Option to pop up the character with a larger font above soft keyboard --> + <!-- Option to control whether or not to show a popup with a larger font on each key press. --> <string name="popup_on_keypress">Popup on keypress</string> - <!-- Option to enable using nearby keys when correcting/predicting --> - <string name="hit_correction">Correct typing errors</string> - - <!-- Description for hit_correction --> - <string name="hit_correction_summary">Enable input error correction</string> - - <!-- Option to enable using nearby keys when correcting/predicting in landscape--> - <string name="hit_correction_land">Landscape input errors</string> - - <!-- Description for hit_correction in landscape --> - <string name="hit_correction_land_summary">Enable input error correction</string> - - <!-- Option to automatically correct word on hitting space --> - <string name="auto_correction">Word suggestions</string> - - <!-- Description for auto_correction --> - <string name="auto_correction_summary">Automatically correct the previous word</string> - - <!-- Option to enable text prediction --> - <string name="prediction">Word suggestions</string> + <!-- Category title for general settings for Android keyboard --> + <string name="general_category">General</string> + <!-- Category title for text prediction --> - <string name="prediction_category">Word suggestion settings</string> - <!-- Description for text prediction --> - <string name="prediction_summary">Enable auto completion while typing</string> - - <!-- Dialog title for auto complete choices --> - <string name="auto_complete_dialog_title">Auto completion</string> - - <!-- Option to enable text prediction in landscape --> - <string name="prediction_landscape">Increase text field size</string> - <!-- Description for text prediction --> - <string name="prediction_landscape_summary">Hide word suggestions in landscape view</string> - + <string name="prediction_category">Text correction</string> + <!-- Option to enable auto capitalization of sentences --> - <string name="auto_cap">Auto-capitalization</string> - <!-- Description for auto cap --> - <string name="auto_cap_summary">Capitalize the start of a sentence</string> - <!-- Option to enable auto punctuate --> - <string name="auto_punctuate">Auto-punctuate</string> - <!-- Description for auto punctuate --> - <string name="auto_punctuate_summary"></string> - + <string name="auto_cap">Auto-capitalization</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="show_suggestions">Show suggestions</string> + <string name="prefs_show_suggestions">Show correction suggestions</string> <!-- Description for show suggestions --> - <string name="show_suggestions_summary">Display suggested words while typing</string> - - <!-- Option to enable auto completion --> - <string name="auto_complete">Auto-complete</string> - <!-- Description for auto completion --> - <string name="auto_complete_summary">Spacebar and punctuation automatically insert highlighted word</string> - + <string name="prefs_show_suggestions_summary">Display suggested words while typing</string> + <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 show/hide the settings key --> <string name="prefs_settings_key">Show settings key</string> - <!-- Array of the settings key mode values --> - <string-array name="settings_key_modes_values" translatable="false"> - <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> <!-- 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> - <!-- 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> - - <!-- Option to enable bigram completion --> + + <!-- Option to decide the auto correction threshold score --> + <!-- Option to enable auto correction [CHAR LIMIT=20]--> + <string name="auto_correction">Auto correction</string> + <!-- Description for auto correction [CHAR LIMIT=35] --> + <string name="auto_correction_summary">Spacebar and punctuation automatically insert highlighted word</string> + <!-- Option to disable auto correction. [CHAR LIMIT=20] --> + <string name="auto_correction_threshold_mode_off">Off</string> + <!-- Option to suggest auto correction candidates modestly. Auto-corrects only to a word which has small edit distance from typed word. [CHAR LIMIT=20] --> + <string name="auto_correction_threshold_mode_modest">Modest</string> + <!-- Option to suggest auto correction candidates aggressively. Auto-corrects to a word which has even large edit distance from typed word. [CHAR LIMIT=20] --> + <string name="auto_correction_threshold_mode_aggeressive">Aggressive</string> + + <!-- Option to enable bigram correction --> <string name="bigram_suggestion">Bigram Suggestions</string> - <!-- Description for auto completion --> + <!-- Description for auto correction --> <string name="bigram_suggestion_summary">Use previous word to improve suggestion</string> - <!-- Array of prediction modes --> - <string-array name="prediction_modes"> - <item>None</item> - <item>Basic</item> - <item>Advanced</item> - </string-array> - - <!-- Don't translate --> - <string name="prediction_none" translatable="false">0</string> - <!-- Don't translate --> - <string name="prediction_basic" translatable="false">1</string> - <!-- Don't translate --> - <string name="prediction_full" translatable="false">2</string> - - <string-array name="prediction_modes_values" translatable="false"> - <item>@string/prediction_none</item> - <item>@string/prediction_basic</item> - <item>@string/prediction_full</item> - </string-array> - <!-- Indicates that a word has been added to the dictionary --> <string name="added_word"><xliff:g id="word">%s</xliff:g> : Saved</string> - - <!-- Tip to long press on keys --> - <string name="tip_long_press">Hold a key down to see accents (ø, ö, etc.)</string> - <!-- Tip to dismiss keyboard --> - <string name="tip_dismiss">Press the back key \u21B6 to close the keyboard at any point</string> - <!-- Tip to press ?123 to access numbers and symbols --> - <string name="tip_access_symbols">Access numbers and symbols</string> - <!-- Tip to long press on typed word to add to dictionary --> - <string name="tip_add_to_dictionary">Press and hold the left-most word to add it to the dictionary - </string> - - <!-- Instruction to touch the bubble to continue --> - <string name="touch_to_continue">Touch this hint to continue »</string> - - <!-- Instruction to touch the bubble to start typing --> - <string name="touch_to_finish">Touch here to close this hint and start typing!</string> - - <!-- Tutorial tip 1 - The keyboard opens any time you touch a text field --> - <string name="tip_to_open_keyboard"><b>The keyboard opens any time you touch a text field</b></string> - - <!-- Tutorial tip 2 - Touch and hold a key to view accents (examples) --> - <string name="tip_to_view_accents"><b>Touch & hold a key to view accents\n(ø, ö, ô, ó, and so on)</b> - </string> - - <!-- Tutorial tip 3 - How to switch to number/symbol keyboard --> - <string name="tip_to_open_symbols"><b>Switch to numbers and symbols by touching this key</b></string> - - <!-- Tutorial tip 4 - How to switch back to alphabet keyboard --> - <string name="tip_to_close_symbols"><b>Go back to letters by touching this key again</b></string> - - <!-- Tutorial tip 5 - How to launch keyboard settings --> - <string name="tip_to_launch_settings"><b>Touch & hold this key to change keyboard settings, like auto complete</b></string> - - <!-- Tutorial tip 6 - Done with the tutorial --> - <string name="tip_to_start_typing"><b>Try it!</b></string> - - + <!-- Label for soft enter key when it performs GO action. Must be short to fit on key! --> <string name="label_go_key">Go</string> <!-- Label for soft enter key when it performs NEXT action. Must be short to fit on key! --> @@ -184,38 +93,38 @@ <string name="label_done_key">Done</string> <!-- Label for soft enter key when it performs SEND action. Must be short to fit on key! --> <string name="label_send_key">Send</string> - <!-- Label for "switch to symbols" key. Must be short to fit on key! --> - <string name="label_symbol_key">\?123</string> - <!-- Label for "switch to numeric" key. Must be short to fit on key! --> - <string name="label_phone_key">123</string> <!-- Label for "switch to alphabetic" key. Must be short to fit on key! --> - <string name="label_alpha_key">ABC</string> - <!-- Label for ALT modifier key. Must be short to fit on key! --> - <string name="label_alt_key">ALT</string> + <string name="label_to_alpha_key">ABC</string> + <!-- Label for Shift modifier key of symbol keyboard. Must be short to fit on key! --> + <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> + <!-- Label for "Wait" key of phone number keyboard. Must be short to fit on key! [CHAR LIMIT=5]--> + <string name="label_wait_key">Wait</string> <!-- Voice related labels --> <!-- Title of the warning dialog that shows when a user initiates voice input for the first time. --> <string name="voice_warning_title">Voice input</string> - + <!-- Message that gets put at the top of the warning dialog if the user is attempting to use voice input in a currently unsupported locale. Voice input will work for such a user, but it will only recognize them in English. --> <string name="voice_warning_locale_not_supported">Voice input is not currently supported for your language, but does work in English.</string> - + <!-- Message of the warning dialog that shows when a user initiates voice input for - the first time, or turns it on in settings. --> - <string name="voice_warning_may_not_understand">Voice input is an experimental feature using Google\'s networked speech recognition.</string> - + the first time, or turns it on in settings. [CHAR LIMIT=200] --> + <string name="voice_warning_may_not_understand">Voice input uses Google\'s speech recognition. <a href="http://m.google.com/privacy">The Mobile Privacy Policy</a> applies.</string> + <!-- An additional part of the warning dialog for voice input that only shows when the user - actually initiates voice input, rather than just turning it on in settings. --> - <string name="voice_warning_how_to_turn_off">To turn off voice input, go to keyboard settings.</string> - - <!-- Message to show when user clicks the swiping hint (which says - "Swipe across keyboard to speak"). Also shown when enabling settings. --> - <string name="voice_hint_dialog_message">To use voice input, press the microphone button or slide your finger across the on-screen keyboard.</string> - + actually initiates voice input, rather than just turning it on in settings. [CHAR LIMIT=200] --> + <string name="voice_warning_how_to_turn_off">To turn off voice input, go to input method settings.</string> + + <!-- Message to show when user enables the voice input settings (which says + "Press the microphone button"). [CHAR LIMIT=100] --> + <string name="voice_hint_dialog_message">To use voice input, press the microphone button.</string> + <!-- Short message to tell the user the system is ready for them to speak. --> <string name="voice_listening">Speak now</string> @@ -230,7 +139,7 @@ <!-- Short message shown for a network error. --> <string name="voice_network_error">Couldn\'t connect</string> - + <!-- Short message shown for a network error where the utterance was really long, in which case we should suggest that the user speak less. --> <string name="voice_too_much_speech">Error, too much speech.</string> @@ -247,8 +156,7 @@ <!-- Short message shown when the server couldn't parse any speech. --> <string name="voice_no_match">No matches found</string> - <!-- Short message shown when the user initiates voice and voice - search is not installed. --> + <!-- Short message shown when the user initiates voice and voice search is not installed. --> <string name="voice_not_installed">Voice search not installed</string> <!-- Short hint shown in candidate view to explain voice input. --> @@ -266,74 +174,32 @@ <!-- Preferences item for enabling speech input --> <string name="voice_input">Voice input</string> - <!-- Array of Voice Input modes --> - <string-array name="voice_input_modes"> - <item>On main keyboard</item> - <item>On symbols keyboard</item> - <item>Off</item> - </string-array> - - <!-- Don't translate --> - <string name="voice_mode_main" translatable="false">0</string> - <!-- Don't translate --> - <string name="voice_mode_symbols" translatable="false">1</string> - <!-- Don't translate --> - <string name="voice_mode_off" translatable="false">2</string> - - <string-array name="voice_input_modes_values" translatable="false"> - <item>@string/voice_mode_main</item> - <item>@string/voice_mode_symbols</item> - <item>@string/voice_mode_off</item> - </string-array> - - <!-- Array of Voice Input modes summary --> - <string-array name="voice_input_modes_summary"> - <item>Mic on main keyboard</item> - <item>Mic on symbols keyboard</item> - <item>Voice input is disabled</item> - </string-array> - - <!-- Press the "enter" key after the user speaks. Option on settings.--> - <string name="auto_submit">Auto submit after voice</string> - - <!-- Press the "enter" key after the user speaks. Summary of option in settings.--> - <string name="auto_submit_summary">Automatically press enter when searching or going to the next field.</string> - - <!-- IME Tutorial screen (ROMAN) --><skip /> - <!-- appears above image showing the user to click on a TextView to show the IME --> - <string name="open_the_keyboard"><font size="17"><b>Open the keyboard\n</b></font><font size="3">\n</font>Touch any text field.</string> - - <!-- appears above the image showing the back button used to close the keyboard --> - <string name="close_the_keyboard"><font size="17"><b>Close the keyboard\n</b></font><font size="3">\n</font>Press the Back key.</string> - - <!-- appears above image showing how to use touch and hold --> - <string name="touch_and_hold"><font size="17"><b>Touch \u0026 hold a key for options\n</b></font><font size="3">\n</font>Access punctuation and accents.</string> - - <!-- appears above image showing how to access keyboard settings --> - <string name="keyboard_settings"><font size="17"><b>Keyboard settings\n</b></font><font size="3">\n</font>Touch \u0026 hold the <b>\?123\</b> key.</string> - - <!-- popular web domains for the locale - most popular, displayed on the keyboard --> - <string name="popular_domain_0">".com"</string> - <!-- popular web domains for the locale - item 1, displayed in the popup --> - <string name="popular_domain_1">".net"</string> - <!-- popular web domains for the locale - item 2, displayed in the popup --> - <string name="popular_domain_2">".org"</string> - <!-- popular web domains for the locale - item 3, displayed in the popup --> - <string name="popular_domain_3">".gov"</string> - <!-- popular web domains for the locale - item 4, displayed in the popup --> - <string name="popular_domain_4">".edu"</string> - - <!-- Menu item for launching Input method picker --> + <!-- Voice Input modes --> + <!-- On settings screen, voice input pop-up menu option to show voice key on main keyboard [CHAR LIMIT=20] --> + <string name="voice_input_modes_main_keyboard">On main keyboard</string> + <!-- On settings screen, voice input pop-up menu option to show voice key on symbols keyboard [CHAR LIMIT=20] --> + <string name="voice_input_modes_symbols_keyboard">On symbols keyboard</string> + <!-- On settings screen, voice input pop-up menu option to never show voice key [CHAR LIMIT=20] --> + <string name="voice_input_modes_off">Off</string> + <!-- Voice Input modes summary --> + <!-- On settings screen, voice input pop-up menu summary text to show voice key on main keyboard [CHAR LIMIT=20] --> + <string name="voice_input_modes_summary_main_keyboard">Mic on main keyboard</string> + <!-- On settings screen, voice input pop-up menu summary text to show voice key on symbols keyboard [CHAR LIMIT=20] --> + <string name="voice_input_modes_summary_symbols_keyboard">Mic on symbols keyboard</string> + <!-- On settings screen, voice input pop-up menu summary text to never show voice key [CHAR LIMIT=20] --> + <string name="voice_input_modes_summary_off">Voice input is disabled</string> + + <!-- Title of the dialog for selecting input methods. [CHAR LIMIT=20] --> <string name="selectInputMethod">Select input method</string> <!-- Title for input language selection screen --> <string name="language_selection_title">Input languages</string> <!-- Title summary for input language selection screen --> <string name="language_selection_summary">Slide finger on spacebar to change language</string> - + <!-- Add to dictionary hint --> <string name="hint_add_to_dictionary">\u2190 Touch again to save</string> - + <!-- Inform the user that a particular language has an available dictionary --> <string name="has_dictionary">Dictionary available</string> @@ -341,39 +207,86 @@ <string name="prefs_enable_log">Enable user feedback</string> <!-- Description for enabling to send user statistics to Google --> <string name="prefs_description_log">Help improve this input method editor by automatically sending usage statistics and crash reports to Google.</string> - <!-- Preferences item for enabling to correct suggestions by touching words you have typed --> + <!-- Preferences item for enabling to correct suggestions by touching words you have typed [CHAR LIMIT= 35] --> <string name="prefs_enable_recorrection">Touch to correct words</string> - <!-- The summary for the preferences item for enabling to correct suggestions by touching words you have typed --> - <string name="prefs_enable_recorrection_summary">Touch entered words to correct them</string> + <!-- The summary for the preferences item for enabling to correct suggestions by touching words you have typed [CHAR LIMIT= 100] --> + <string name="prefs_enable_recorrection_summary">Touch entered words to correct them, only when suggestions are visible</string> - <!-- Description for keyboard theme switcher --> + <!-- Title of the item to change the keyboard theme [CHAR LIMIT=20]--> <string name="keyboard_layout">Keyboard Theme</string> - <string name="layout_basic" translatable="false">Basic</string> - <string name="layout_high_contrast" translatable="false">Basic (High Contrast)</string> - <string name="layout_stone_bold" translatable="false">Stone (bold)</string> - <string name="layout_stone_normal" translatable="false">Stone (normal)</string> - <string name="layout_gingerbread" translatable="false">Gingerbread</string> - - <string-array name="keyboard_layout_modes" translatable="false"> - <item>@string/layout_basic</item> - <item>@string/layout_high_contrast</item> - <item>@string/layout_stone_normal</item> - <item>@string/layout_stone_bold</item> - <item>@string/layout_gingerbread</item> - </string-array> - - <string-array name="keyboard_layout_modes_values" translatable="false"> - <item>0</item> - <item>1</item> - <item>2</item> - <item>3</item> - <item>4</item> - </string-array> - - <string name="subtype_mode_keyboard">keyboard</string> - <string name="subtype_mode_voice">voice</string> - - <!-- Title for Latin keyboard debug settings activity / dialog --> - <string name="english_ime_debug_settings" translatable="false">Android keyboard Debug settings</string> - <string name="prefs_debug_mode" translatable="false">Debug Mode</string> + + <!-- Description for Czech keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_cs_keyboard">Czech 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 English (United Kingdom) keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_en_GB_keyboard">English (UK) Keyboard</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 Spanish (United States) keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_es_US_keyboard">Spanish (US) 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 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 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 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 (Australia) voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_en_AU_voice">English (Australia) Voice</string> + <!-- Description for English (United Kingdom) voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_en_GB_voice">English (UK) Voice</string> + <!-- Description for English (India) voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_en_IN_voice">English (India) Voice</string> + <!-- Description for English (New Zealand) voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_en_NZ_voice">English (New Zealand) Voice</string> + <!-- Description for English (United States) voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_en_US_voice">English (US) 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 (China, Simplified) voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_zh_CN_voice">Chinese (China, Simplified) Voice</string> + <!-- Description for Chinese (Taiwan, Traditional) voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_zh_TW_voice">Chinese (Taiwan, Traditional) Voice</string> + + <!-- Title of an option for usability study mode --> + <string name="prefs_usability_study_mode">Usability Study Mode</string> </resources> diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index 0372b07cf..130714fd3 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -15,12 +15,14 @@ --> <resources> - <style name="LatinKeyboardBaseView"> + <style name="KeyboardView"> <item name="android:background">@drawable/keyboard_background</item> <item name="keyBackground">@drawable/btn_keyboard_key</item> - <item name="keyTextSize">@dimen/key_text_size</item> + <item name="keyLetterSize">@dimen/key_letter_size</item> + <item name="keyLetterStyle">normal</item> <item name="keyTextColor">#FFFFFFFF</item> + <item name="keyTextColorDisabled">#FFFFFFFF</item> <item name="keyPreviewLayout">@layout/key_preview</item> <item name="keyPreviewOffset">@dimen/key_preview_offset</item> <item name="keyPreviewHeight">@dimen/key_preview_height</item> @@ -31,7 +33,7 @@ <item name="shadowColor">#BB000000</item> <item name="shadowRadius">2.75</item> <item name="backgroundDimAmount">0.5</item> - <item name="symbolColorScheme">white</item> + <item name="colorScheme">white</item> </style> <style name="KeyPreviewAnimation"> <item name="android:windowEnterAnimation">@anim/key_preview_fadein</item> diff --git a/java/res/values-el/donottranslate-altchars.xml b/java/res/xml-da-xlarge/kbd_qwerty.xml index d3beafade..aa868e453 100644 --- a/java/res/values-el/donottranslate-altchars.xml +++ b/java/res/xml-da-xlarge/kbd_qwerty.xml @@ -17,14 +17,23 @@ ** limitations under the License. */ --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> -</resources> + +<!-- + Danish Keyboard Layout + + Just a copy of the Norwegian layout, with æ/ø switched. +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" /> +</Keyboard> diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index b7b1b1769..dfca1cdd2 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -25,512 +25,16 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="9.09%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" /> - <Key - android:keyLabel="å" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" /> - <Key - android:keyLabel="æ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_ae" /> - <Key - android:keyLabel="ø" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_oe" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="10%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_keyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" /> </Keyboard> diff --git a/java/res/xml-da/kbd_qwerty_black.xml b/java/res/xml-da/kbd_qwerty_black.xml deleted file mode 100644 index 3fb4acd1b..000000000 --- a/java/res/xml-da/kbd_qwerty_black.xml +++ /dev/null @@ -1,478 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<!-- - Danish Keyboard Layout - - Just a copy of the Norwegian layout, with æ/ø switched. ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" /> - <Key - android:keyLabel="å" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" /> - <Key - android:keyLabel="æ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_ae" /> - <Key - android:keyLabel="ø" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_oe" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="10%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/values-ja/donottranslate-altchars.xml b/java/res/xml-de-xlarge/kbd_qwerty.xml index d3beafade..a23e4fbf0 100644 --- a/java/res/values-ja/donottranslate-altchars.xml +++ b/java/res/xml-de-xlarge/kbd_qwerty.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** 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. @@ -17,14 +17,18 @@ ** limitations under the License. */ --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> -</resources> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_qwertz_rows" /> +</Keyboard> diff --git a/java/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml index 6f34b45f1..a23e4fbf0 100644 --- a/java/res/xml-de/kbd_qwerty.xml +++ b/java/res/xml-de/kbd_qwerty.xml @@ -19,497 +19,16 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_keyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> + <include + latin:keyboardLayout="@xml/kbd_qwertz_rows" /> </Keyboard> diff --git a/java/res/xml-de/kbd_qwerty_black.xml b/java/res/xml-de/kbd_qwerty_black.xml deleted file mode 100644 index 833537019..000000000 --- a/java/res/xml-de/kbd_qwerty_black.xml +++ /dev/null @@ -1,457 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="/" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="\@" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:keyLabel="/" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:keyLabel="\@" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/values-ko/donottranslate-altchars.xml b/java/res/xml-fr-rCA-xlarge/kbd_qwerty.xml index d3beafade..92d92f0e6 100644 --- a/java/res/values-ko/donottranslate-altchars.xml +++ b/java/res/xml-fr-rCA-xlarge/kbd_qwerty.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** 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. @@ -17,14 +17,18 @@ ** limitations under the License. */ --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> -</resources> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_qwerty_rows" /> +</Keyboard> diff --git a/java/res/xml-fr-rCA/kbd_qwerty.xml b/java/res/xml-fr-rCA/kbd_qwerty.xml new file mode 100644 index 000000000..92d92f0e6 --- /dev/null +++ b/java/res/xml-fr-rCA/kbd_qwerty.xml @@ -0,0 +1,34 @@ +<?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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_qwerty_rows" /> +</Keyboard> diff --git a/java/res/xml-fr-rCH-xlarge/kbd_qwerty.xml b/java/res/xml-fr-rCH-xlarge/kbd_qwerty.xml new file mode 100644 index 000000000..a23e4fbf0 --- /dev/null +++ b/java/res/xml-fr-rCH-xlarge/kbd_qwerty.xml @@ -0,0 +1,34 @@ +<?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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_qwertz_rows" /> +</Keyboard> diff --git a/java/res/xml-fr-rCH/kbd_qwerty.xml b/java/res/xml-fr-rCH/kbd_qwerty.xml new file mode 100644 index 000000000..a23e4fbf0 --- /dev/null +++ b/java/res/xml-fr-rCH/kbd_qwerty.xml @@ -0,0 +1,34 @@ +<?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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_qwertz_rows" /> +</Keyboard> diff --git a/java/res/xml-fr-xlarge/kbd_qwerty.xml b/java/res/xml-fr-xlarge/kbd_qwerty.xml new file mode 100644 index 000000000..2d0b42baf --- /dev/null +++ b/java/res/xml-fr-xlarge/kbd_qwerty.xml @@ -0,0 +1,34 @@ +<?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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_azerty_rows" /> +</Keyboard> diff --git a/java/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml index 9a2c75d8c..2d0b42baf 100644 --- a/java/res/xml-fr/kbd_qwerty.xml +++ b/java/res/xml-fr/kbd_qwerty.xml @@ -19,498 +19,16 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" /> - <Key - android:keyLabel="m" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_keyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="\'" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> + <include + latin:keyboardLayout="@xml/kbd_azerty_rows" /> </Keyboard> diff --git a/java/res/xml-fr/kbd_qwerty_black.xml b/java/res/xml-fr/kbd_qwerty_black.xml deleted file mode 100644 index f11c4a0ba..000000000 --- a/java/res/xml-fr/kbd_qwerty_black.xml +++ /dev/null @@ -1,458 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" /> - <Key - android:keyLabel="m" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="\'" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml index 5d8338ae8..98bfd7e0b 100644 --- a/java/res/xml-iw/kbd_qwerty.xml +++ b/java/res/xml-iw/kbd_qwerty.xml @@ -19,456 +19,94 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> <Row - android:rowEdgeFlags="top" + latin:rowEdgeFlags="top" > + <Spacer + latin:horizontalGap="5%p" /> <Key - android:keyLabel="ק" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> + latin:keyLabel="ק" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="ר" /> + latin:keyLabel="ר" /> <Key - android:keyLabel="א" /> + latin:keyLabel="א" /> <Key - android:keyLabel="ט" /> + latin:keyLabel="ט" /> <Key - android:keyLabel="ו" /> + latin:keyLabel="ו" /> <Key - android:keyLabel="ן" /> + latin:keyLabel="ן" /> <Key - android:keyLabel="ם" /> + latin:keyLabel="ם" /> <Key - android:keyLabel="פ" /> + latin:keyLabel="פ" /> + <Spacer + latin:horizontalGap="1.25%p" /> <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="13.75%p" - android:isModifier="true" - android:horizontalGap="1.25%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="13.75%p" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:keyLabel="ש" - android:keyEdgeFlags="left" /> + latin:keyLabel="ש" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="ד" /> + latin:keyLabel="ד" /> <Key - android:keyLabel="ג" /> + latin:keyLabel="ג" /> <Key - android:keyLabel="כ" /> + latin:keyLabel="כ" /> <Key - android:keyLabel="ע" /> + latin:keyLabel="ע" /> <Key - android:keyLabel="י" /> + latin:keyLabel="י" /> <Key - android:keyLabel="ח" /> + latin:keyLabel="ח" /> <Key - android:keyLabel="ל" /> + latin:keyLabel="ל" /> <Key - android:keyLabel="ך" /> + latin:keyLabel="ך" /> <Key - android:keyLabel="ף" - android:keyEdgeFlags="right" /> + latin:keyLabel="ף" + latin:keyEdgeFlags="right" /> </Row> <Row> + <Spacer + latin:horizontalGap="5%p" /> <Key - android:keyLabel="ז" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> + latin:keyLabel="ז" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="ס" /> + latin:keyLabel="ס" /> <Key - android:keyLabel="ב" /> + latin:keyLabel="ב" /> <Key - android:keyLabel="ה" /> + latin:keyLabel="ה" /> <Key - android:keyLabel="נ" /> + latin:keyLabel="נ" /> <Key - android:keyLabel="מ" /> + latin:keyLabel="מ" /> <Key - android:keyLabel="צ" /> + latin:keyLabel="צ" /> <Key - android:keyLabel="ת" /> + latin:keyLabel="ת" /> <Key - android:keyLabel="ץ" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyLabel="ץ" + latin:keyEdgeFlags="right" /> </Row> + <include latin:keyboardLayout="@xml/kbd_qwerty_row4" /> </Keyboard> diff --git a/java/res/xml-iw/kbd_qwerty_black.xml b/java/res/xml-iw/kbd_qwerty_black.xml deleted file mode 100644 index eee6dc158..000000000 --- a/java/res/xml-iw/kbd_qwerty_black.xml +++ /dev/null @@ -1,416 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="ק" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ר" /> - <Key - android:keyLabel="א" /> - <Key - android:keyLabel="ט" /> - <Key - android:keyLabel="ו" /> - <Key - android:keyLabel="ן" /> - <Key - android:keyLabel="ם" /> - <Key - android:keyLabel="פ" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="13.75%p" - android:horizontalGap="1.25%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="ש" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ד" /> - <Key - android:keyLabel="ג" /> - <Key - android:keyLabel="כ" /> - <Key - android:keyLabel="ע" /> - <Key - android:keyLabel="י" /> - <Key - android:keyLabel="ח" /> - <Key - android:keyLabel="ל" /> - <Key - android:keyLabel="ך" /> - <Key - android:keyLabel="ף" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="ז" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ס" /> - <Key - android:keyLabel="ב" /> - <Key - android:keyLabel="ה" /> - <Key - android:keyLabel="נ" /> - <Key - android:keyLabel="מ" /> - <Key - android:keyLabel="צ" /> - <Key - android:keyLabel="ת" /> - <Key - android:keyLabel="ץ" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/values-es-rUS/donottranslate-altchars.xml b/java/res/xml-nb-xlarge/kbd_qwerty.xml index d3beafade..5dfdc4f56 100644 --- a/java/res/values-es-rUS/donottranslate-altchars.xml +++ b/java/res/xml-nb-xlarge/kbd_qwerty.xml @@ -17,14 +17,23 @@ ** limitations under the License. */ --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> -</resources> + +<!-- + Norwegian Keyboard Layout + + Just a copy of the Swedish layout, with ä/æ and ö/ø switched. +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" /> +</Keyboard> diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml index 14071d770..06f1b947a 100644 --- a/java/res/xml-nb/kbd_qwerty.xml +++ b/java/res/xml-nb/kbd_qwerty.xml @@ -25,512 +25,16 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="9.09%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" /> - <Key - android:keyLabel="å" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" /> - <Key - android:keyLabel="ø" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_oe" /> - <Key - android:keyLabel="æ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_ae" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="10%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_keyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" /> </Keyboard> diff --git a/java/res/xml-nb/kbd_qwerty_black.xml b/java/res/xml-nb/kbd_qwerty_black.xml deleted file mode 100644 index d90313a0b..000000000 --- a/java/res/xml-nb/kbd_qwerty_black.xml +++ /dev/null @@ -1,478 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<!-- - Norwegian Keyboard Layout - - Just a copy of the Swedish layout, with ä/æ and ö/ø switched. ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" /> - <Key - android:keyLabel="å" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" /> - <Key - android:keyLabel="ø" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_oe" /> - <Key - android:keyLabel="æ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_ae" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="10%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml-ru-xlarge/kbd_qwerty.xml b/java/res/xml-ru-xlarge/kbd_qwerty.xml new file mode 100644 index 000000000..b86002a31 --- /dev/null +++ b/java/res/xml-ru-xlarge/kbd_qwerty.xml @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="9.091%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="7.520%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="й" + latin:popupCharacters="1" /> + <Key + latin:keyLabel="ц" + latin:popupCharacters="2" /> + <Key + latin:keyLabel="у" + latin:popupCharacters="3" /> + <Key + latin:keyLabel="к" + latin:popupCharacters="4" /> + <Key + latin:keyLabel="е" + latin:popupCharacters="@string/alternates_for_cyrillic_e" /> + <Key + latin:keyLabel="н" + latin:popupCharacters="6" /> + <Key + latin:keyLabel="г" + latin:popupCharacters="7" /> + <Key + latin:keyLabel="ш" + latin:popupCharacters="8" /> + <Key + latin:keyLabel="щ" + latin:popupCharacters="9" /> + <Key + latin:keyLabel="з" + latin:popupCharacters="0" /> + <Key + latin:keyLabel="х" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.520%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ф" /> + <Key + latin:keyLabel="ы" /> + <Key + latin:keyLabel="в" /> + <Key + latin:keyLabel="а" /> + <Key + latin:keyLabel="п" /> + <Key + latin:keyLabel="р" /> + <Key + latin:keyLabel="о" /> + <Key + latin:keyLabel="л" /> + <Key + latin:keyLabel="д" /> + <Key + latin:keyLabel="ж" /> + <Key + latin:keyLabel="э" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.042%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15.192%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="я" /> + <Key + latin:keyLabel="ч" /> + <Key + latin:keyLabel="с" /> + <Key + latin:keyLabel="м" /> + <Key + latin:keyLabel="и" /> + <Key + latin:keyLabel="т" /> + <Key + latin:keyLabel="ь" + latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" /> + <Key + latin:keyLabel="б" /> + <Key + latin:keyLabel="ю" /> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="12.530%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</Keyboard> diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml index c0b98bafa..08d7a4ac5 100644 --- a/java/res/xml-ru/kbd_qwerty.xml +++ b/java/res/xml-ru/kbd_qwerty.xml @@ -19,496 +19,127 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="9.091%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> <Row - android:rowEdgeFlags="top" + latin:rowEdgeFlags="top" > <Key - android:keyLabel="й" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="1" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> + latin:keyLabel="й" + latin:keyHintIcon="@drawable/keyboard_hint_1" + latin:popupCharacters="1" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="ц" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="2" /> + latin:keyLabel="ц" + latin:keyHintIcon="@drawable/keyboard_hint_2" + latin:popupCharacters="2" /> <Key - android:keyLabel="у" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="3" /> + latin:keyLabel="у" + latin:keyHintIcon="@drawable/keyboard_hint_3" + latin:popupCharacters="3" /> <Key - android:keyLabel="к" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="4" /> + latin:keyLabel="к" + latin:keyHintIcon="@drawable/keyboard_hint_4" + latin:popupCharacters="4" /> <Key - android:keyLabel="е" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_cyrillic_e" /> + latin:keyLabel="е" + latin:keyHintIcon="@drawable/keyboard_hint_5" + latin:popupCharacters="@string/alternates_for_cyrillic_e" /> <Key - android:keyLabel="н" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="6" /> + latin:keyLabel="н" + latin:keyHintIcon="@drawable/keyboard_hint_6" + latin:popupCharacters="6" /> <Key - android:keyLabel="г" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="7" /> + latin:keyLabel="г" + latin:keyHintIcon="@drawable/keyboard_hint_7" + latin:popupCharacters="7" /> <Key - android:keyLabel="ш" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="8" /> + latin:keyLabel="ш" + latin:keyHintIcon="@drawable/keyboard_hint_8" + latin:popupCharacters="8" /> <Key - android:keyLabel="щ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="9" /> + latin:keyLabel="щ" + latin:keyHintIcon="@drawable/keyboard_hint_9" + latin:popupCharacters="9" /> <Key - android:keyLabel="з" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="0" /> + latin:keyLabel="з" + latin:keyHintIcon="@drawable/keyboard_hint_0" + latin:popupCharacters="0" /> <Key - android:keyLabel="х" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> + latin:keyLabel="х" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:keyLabel="ф" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> + latin:keyLabel="ф" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="ы" /> + latin:keyLabel="ы" /> <Key - android:keyLabel="в" /> + latin:keyLabel="в" /> <Key - android:keyLabel="а" /> + latin:keyLabel="а" /> <Key - android:keyLabel="п" /> + latin:keyLabel="п" /> <Key - android:keyLabel="р" /> + latin:keyLabel="р" /> <Key - android:keyLabel="о" /> + latin:keyLabel="о" /> <Key - android:keyLabel="л" /> + latin:keyLabel="л" /> <Key - android:keyLabel="д" /> + latin:keyLabel="д" /> <Key - android:keyLabel="ж" /> + latin:keyLabel="ж" /> <Key - android:keyLabel="э" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> + latin:keyLabel="э" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> </Row> <Row - android:keyWidth="8.5%p" + latin:keyWidth="8.5%p" > <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_keyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="11.75%p" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="я" /> + latin:keyLabel="я" /> <Key - android:keyLabel="ч" /> + latin:keyLabel="ч" /> <Key - android:keyLabel="с" /> + latin:keyLabel="с" /> <Key - android:keyLabel="м" /> + latin:keyLabel="м" /> <Key - android:keyLabel="и" /> + latin:keyLabel="и" /> <Key - android:keyLabel="т" /> + latin:keyLabel="т" /> <Key - android:keyLabel="ь" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_cyrillic_soft_sign" /> + latin:keyLabel="ь" + latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" /> <Key - android:keyLabel="б" /> + latin:keyLabel="б" /> <Key - android:keyLabel="ю" /> + latin:keyLabel="ю" /> <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="11.75%p" + latin:keyEdgeFlags="right" /> </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> </Keyboard> diff --git a/java/res/xml-ru/kbd_qwerty_black.xml b/java/res/xml-ru/kbd_qwerty_black.xml deleted file mode 100644 index 94a450cfa..000000000 --- a/java/res/xml-ru/kbd_qwerty_black.xml +++ /dev/null @@ -1,456 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="й" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="1" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ц" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="2" /> - <Key - android:keyLabel="у" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="3" /> - <Key - android:keyLabel="к" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="4" /> - <Key - android:keyLabel="е" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_cyrillic_e" /> - <Key - android:keyLabel="н" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="6" /> - <Key - android:keyLabel="г" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="7" /> - <Key - android:keyLabel="ш" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="8" /> - <Key - android:keyLabel="щ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="9" /> - <Key - android:keyLabel="з" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="0" /> - <Key - android:keyLabel="х" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="ф" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ы" /> - <Key - android:keyLabel="в" /> - <Key - android:keyLabel="а" /> - <Key - android:keyLabel="п" /> - <Key - android:keyLabel="р" /> - <Key - android:keyLabel="о" /> - <Key - android:keyLabel="л" /> - <Key - android:keyLabel="д" /> - <Key - android:keyLabel="ж" /> - <Key - android:keyLabel="э" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="8.5%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="я" /> - <Key - android:keyLabel="ч" /> - <Key - android:keyLabel="с" /> - <Key - android:keyLabel="м" /> - <Key - android:keyLabel="и" /> - <Key - android:keyLabel="т" /> - <Key - android:keyLabel="ь" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_cyrillic_soft_sign" /> - <Key - android:keyLabel="б" /> - <Key - android:keyLabel="ю" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="11.75%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml-sr-xlarge/kbd_qwerty.xml b/java/res/xml-sr-xlarge/kbd_qwerty.xml new file mode 100644 index 000000000..48764e7c7 --- /dev/null +++ b/java/res/xml-sr-xlarge/kbd_qwerty.xml @@ -0,0 +1,158 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<!-- Serbian keyboard layout, based on the X11 layout for Serbian --> +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="9.09%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="7.520%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="љ" + latin:popupCharacters="1" /> + <Key + latin:keyLabel="њ" + latin:popupCharacters="2" /> + <Key + latin:keyLabel="е" + latin:popupCharacters="3" /> + <Key + latin:keyLabel="р" + latin:popupCharacters="4" /> + <Key + latin:keyLabel="т" + latin:popupCharacters="5" /> + <Key + latin:keyLabel="з" + latin:popupCharacters="6" /> + <Key + latin:keyLabel="у" + latin:popupCharacters="7" /> + <Key + latin:keyLabel="и" + latin:popupCharacters="8" /> + <Key + latin:keyLabel="о" + latin:popupCharacters="9" /> + <Key + latin:keyLabel="п" + latin:popupCharacters="0" /> + <Key + latin:keyLabel="ш" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.520%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="а" /> + <Key + latin:keyLabel="с" /> + <Key + latin:keyLabel="д" /> + <Key + latin:keyLabel="ф" /> + <Key + latin:keyLabel="г" /> + <Key + latin:keyLabel="х" /> + <Key + latin:keyLabel="ј" /> + <Key + latin:keyLabel="к" /> + <Key + latin:keyLabel="л" /> + <Key + latin:keyLabel="ч" /> + <Key + latin:keyLabel="ћ" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.520%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="12.400%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ђ" /> + <Key + latin:keyLabel="ж" /> + <Key + latin:keyLabel="џ" /> + <Key + latin:keyLabel="ц" /> + <Key + latin:keyLabel="в" /> + <Key + latin:keyLabel="б" /> + <Key + latin:keyLabel="н" /> + <Key + latin:keyLabel="м" /> + <Key + latin:keyLabel="," + latin:manualTemporaryUpperCaseCode="33" + latin:keyHintIcon="@drawable/key_hint_exclamation_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:manualTemporaryUpperCaseCode="63" + latin:keyHintIcon="@drawable/key_hint_question_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo" + latin:popupCharacters="\?" /> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="12.400%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</Keyboard> diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml index 464c74f40..0e5f5ff79 100644 --- a/java/res/xml-sr/kbd_qwerty.xml +++ b/java/res/xml-sr/kbd_qwerty.xml @@ -20,488 +20,122 @@ <!-- Serbian keyboard layout, based on the X11 layout for Serbian --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="9.09%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> <Row - android:rowEdgeFlags="top" + latin:rowEdgeFlags="top" > <Key - android:keyLabel="љ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="1" - android:keyEdgeFlags="left" /> + latin:keyLabel="љ" + latin:keyHintIcon="@drawable/keyboard_hint_1" + latin:popupCharacters="1" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="њ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="2" /> + latin:keyLabel="њ" + latin:keyHintIcon="@drawable/keyboard_hint_2" + latin:popupCharacters="2" /> <Key - android:keyLabel="е" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="3" /> + latin:keyLabel="е" + latin:keyHintIcon="@drawable/keyboard_hint_3" + latin:popupCharacters="3" /> <Key - android:keyLabel="р" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="4" /> + latin:keyLabel="р" + latin:keyHintIcon="@drawable/keyboard_hint_4" + latin:popupCharacters="4" /> <Key - android:keyLabel="т" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="5" /> + latin:keyLabel="т" + latin:keyHintIcon="@drawable/keyboard_hint_5" + latin:popupCharacters="5" /> <Key - android:keyLabel="з" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="6" /> + latin:keyLabel="з" + latin:keyHintIcon="@drawable/keyboard_hint_6" + latin:popupCharacters="6" /> <Key - android:keyLabel="у" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="7" /> + latin:keyLabel="у" + latin:keyHintIcon="@drawable/keyboard_hint_7" + latin:popupCharacters="7" /> <Key - android:keyLabel="и" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="8" /> + latin:keyLabel="и" + latin:keyHintIcon="@drawable/keyboard_hint_8" + latin:popupCharacters="8" /> <Key - android:keyLabel="о" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="9" /> + latin:keyLabel="о" + latin:keyHintIcon="@drawable/keyboard_hint_9" + latin:popupCharacters="9" /> <Key - android:keyLabel="п" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="0" /> + latin:keyLabel="п" + latin:keyHintIcon="@drawable/keyboard_hint_0" + latin:popupCharacters="0" /> <Key - android:keyLabel="ш" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="а" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="с" /> - <Key - android:keyLabel="д" /> - <Key - android:keyLabel="ф" /> - <Key - android:keyLabel="г" /> - <Key - android:keyLabel="х" /> - <Key - android:keyLabel="ј" /> - <Key - android:keyLabel="к" /> - <Key - android:keyLabel="л" /> - <Key - android:keyLabel="ч" /> - <Key - android:keyLabel="ћ" /> - <Key - android:keyLabel="ђ" - android:keyEdgeFlags="right" /> + latin:keyLabel="ш" + latin:keyEdgeFlags="right" /> </Row> <Row - android:keyWidth="8.5%p" + latin:keyWidth="8.333%p" > <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_keyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> + latin:keyLabel="а" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="ж" /> + latin:keyLabel="с" /> <Key - android:keyLabel="џ" /> + latin:keyLabel="д" /> <Key - android:keyLabel="ц" /> + latin:keyLabel="ф" /> <Key - android:keyLabel="в" /> + latin:keyLabel="г" /> <Key - android:keyLabel="б" /> + latin:keyLabel="х" /> <Key - android:keyLabel="н" /> + latin:keyLabel="ј" /> <Key - android:keyLabel="м" /> + latin:keyLabel="к" /> <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > + latin:keyLabel="л" /> <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > + latin:keyLabel="ч" /> <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > + latin:keyLabel="ћ" /> <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyLabel="ђ" + latin:keyEdgeFlags="right" /> </Row> <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" + latin:keyWidth="8.5%p" > <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="11.75%p" + latin:keyEdgeFlags="left" /> <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > + latin:keyLabel="ж" /> <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > + latin:keyLabel="џ" /> <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > + latin:keyLabel="ц" /> <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > + latin:keyLabel="в" /> <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > + latin:keyLabel="б" /> + <Key + latin:keyLabel="н" /> + <Key + latin:keyLabel="м" /> <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="11.75%p" + latin:keyEdgeFlags="right" /> </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> </Keyboard> diff --git a/java/res/xml-sr/kbd_qwerty_black.xml b/java/res/xml-sr/kbd_qwerty_black.xml deleted file mode 100644 index 2ffa240f5..000000000 --- a/java/res/xml-sr/kbd_qwerty_black.xml +++ /dev/null @@ -1,449 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<!-- Serbian keyboard layout, based on the X11 layout for Serbian --> -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="љ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="1" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="њ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="2" /> - <Key - android:keyLabel="е" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="3" /> - <Key - android:keyLabel="р" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="4" /> - <Key - android:keyLabel="т" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="5" /> - <Key - android:keyLabel="з" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="6" /> - <Key - android:keyLabel="у" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="7" /> - <Key - android:keyLabel="и" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="8" /> - <Key - android:keyLabel="о" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="9" /> - <Key - android:keyLabel="п" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="0" /> - <Key - android:keyLabel="ш" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="а" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="с" /> - <Key - android:keyLabel="д" /> - <Key - android:keyLabel="ф" /> - <Key - android:keyLabel="г" /> - <Key - android:keyLabel="х" /> - <Key - android:keyLabel="ј" /> - <Key - android:keyLabel="к" /> - <Key - android:keyLabel="л" /> - <Key - android:keyLabel="ч" /> - <Key - android:keyLabel="ћ" /> - <Key - android:keyLabel="ђ" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="8.5%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ж" /> - <Key - android:keyLabel="џ" /> - <Key - android:keyLabel="ц" /> - <Key - android:keyLabel="в" /> - <Key - android:keyLabel="б" /> - <Key - android:keyLabel="н" /> - <Key - android:keyLabel="м" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="11.75%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml-sv-xlarge/kbd_qwerty.xml b/java/res/xml-sv-xlarge/kbd_qwerty.xml new file mode 100644 index 000000000..bbb38585e --- /dev/null +++ b/java/res/xml-sv-xlarge/kbd_qwerty.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<!-- + Swedish Keyboard Layout + + Key positioning: Svensk standard SS 66 22 41 + Foreign letters: Svenska skrivregler (2:a uppl.) §302 + Local additions: €ß +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" /> +</Keyboard> diff --git a/java/res/xml-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml index 0fc80a341..60d3b45f9 100644 --- a/java/res/xml-sv/kbd_qwerty.xml +++ b/java/res/xml-sv/kbd_qwerty.xml @@ -27,511 +27,16 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="9.09%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" /> - <Key - android:keyLabel="å" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" /> - <Key - android:keyLabel="ö" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o_umlaut" /> - <Key - android:keyLabel="ä" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a_umlaut" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="10%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_keyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" /> </Keyboard> diff --git a/java/res/xml-sv/kbd_qwerty_black.xml b/java/res/xml-sv/kbd_qwerty_black.xml deleted file mode 100644 index d03fb773a..000000000 --- a/java/res/xml-sv/kbd_qwerty_black.xml +++ /dev/null @@ -1,480 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<!-- - Swedish Keyboard Layout - - Key positioning: Svensk standard SS 66 22 41 - Foreign letters: Svenska skrivregler (2:a uppl.) §302 - Local additions: €ß ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" /> - <Key - android:keyLabel="å" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" /> - <Key - android:keyLabel="ö" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o_umlaut" /> - <Key - android:keyLabel="ä" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a_umlaut" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="10%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/popup_at.xml b/java/res/xml-xlarge-land/kbd_popup_template.xml index 197eea445..3caae1a60 100644 --- a/java/res/xml/popup_at.xml +++ b/java/res/xml-xlarge-land/kbd_popup_template.xml @@ -18,22 +18,10 @@ */ --> -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top|bottom" +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="3.5%p" + latin:horizontalGap="0px" + latin:verticalGap="0px" + latin:rowHeight="@dimen/popup_key_height" > - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="\@" - android:keyEdgeFlags="right" /> - </Row> </Keyboard> diff --git a/java/res/xml-xlarge/kbd_azerty_rows.xml b/java/res/xml-xlarge/kbd_azerty_rows.xml new file mode 100644 index 000000000..616295065 --- /dev/null +++ b/java/res/xml-xlarge/kbd_azerty_rows.xml @@ -0,0 +1,168 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="8.272%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" /> + <Key + latin:keyLabel="z" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.157%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="10.167%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="m" + latin:keyEdgeFlags="right" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="8.593%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.042%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15.192%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="\'" + latin:manualTemporaryUpperCaseCode="58" + latin:keyHintIcon="@drawable/key_hint_colon_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo" + latin:popupCharacters=":" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + </case> + <default> + <Key + latin:keyLabel="," + latin:manualTemporaryUpperCaseCode="33" + latin:keyHintIcon="@drawable/key_hint_exclamation_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:manualTemporaryUpperCaseCode="63" + latin:keyHintIcon="@drawable/key_hint_question_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo" + latin:popupCharacters="\?" /> + </default> + </switch> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="12.530%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-xlarge/kbd_key_styles.xml b/java/res/xml-xlarge/kbd_key_styles.xml new file mode 100644 index 000000000..d211e5e61 --- /dev/null +++ b/java/res/xml-xlarge/kbd_key_styles.xml @@ -0,0 +1,168 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <!-- Functional key styles --> + <switch> + <case + latin:colorScheme="white" + > + <key-style + latin:styleName="functionalKeyStyle" + latin:isModifier="true" /> + <key-style + latin:styleName="shiftKeyStyle" + latin:code="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift_holo" + latin:shiftedIcon="@drawable/sym_keyboard_shift_locked_holo" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:parentStyle="functionalKeyStyle" + latin:isSticky="true" /> + <key-style + latin:styleName="deleteKeyStyle" + latin:code="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete_holo" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:parentStyle="functionalKeyStyle" + latin:isRepeatable="true" /> + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return_holo" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="spaceKeyStyle" + latin:code="@integer/key_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + <key-style + latin:styleName="nonSpecialBackgroundSpaceKeyStyle" + latin:code="@integer/key_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + <key-style + latin:styleName="smileyKeyStyle" + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:keyHintIcon="@drawable/hint_popup_holo" + latin:popupCharacters="@string/alternates_for_smiley" + latin:maxPopupKeyboardColumn="5" /> + <key-style + latin:styleName="settingsKeyStyle" + latin:code="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings_holo" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="micKeyStyle" + latin:code="@integer/key_voice" + latin:keyIcon="@drawable/sym_keyboard_voice_holo" + latin:iconPreview="@drawable/sym_keyboard_feedback_mic" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:colorScheme="black" + > + <key-style + latin:styleName="functionalKeyStyle" /> + <key-style + latin:styleName="shiftKeyStyle" + latin:code="@integer/key_shift" + latin:keyIcon="@drawable/sym_bkeyboard_shift" + latin:shiftedIcon="@drawable/sym_bkeyboard_shift_locked" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:parentStyle="functionalKeyStyle" + latin:isSticky="true" /> + <key-style + latin:styleName="deleteKeyStyle" + latin:code="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:parentStyle="functionalKeyStyle" + latin:isRepeatable="true" /> + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="spaceKeyStyle" + latin:code="@integer/key_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + <key-style + latin:styleName="nonSpecialBackgroundSpaceKeyStyle" + latin:code="@integer/key_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + <key-style + latin:styleName="smileyKeyStyle" + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:keyHintIcon="@drawable/hint_popup_holo" + latin:popupCharacters="@string/alternates_for_smiley" + latin:maxPopupKeyboardColumn="5" /> + <key-style + latin:styleName="settingsKeyStyle" + latin:code="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="micKeyStyle" + latin:code="@integer/key_voice" + latin:keyIcon="@drawable/sym_bkeyboard_mic" + latin:iconPreview="@drawable/sym_keyboard_feedback_mic" + latin:parentStyle="functionalKeyStyle" /> + </case> + </switch> + <key-style + latin:styleName="tabKeyStyle" + latin:code="@integer/key_tab" + latin:keyLabel="@string/label_tab_key" + latin:keyLabelOption="fontNormal" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="toSymbolKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyLabel="@string/label_to_symbol_key" + latin:keyLabelOption="fontNormal" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="toAlphaKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyLabel="@string/label_to_alpha_key" + latin:keyLabelOption="fontNormal" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="moreKeyStyle" + latin:code="@integer/key_shift" + latin:keyLabel="@string/label_more_key" + latin:keyLabelOption="fontNormal" + latin:parentStyle="functionalKeyStyle" + latin:isSticky="true" /> + <key-style + latin:styleName="comKeyStyle" + latin:keyLabel="@string/keylabel_for_popular_domain" + latin:keyLabelOption="fontNormal" + latin:keyOutputText="@string/keylabel_for_popular_domain" + latin:keyHintIcon="@drawable/hint_popup_holo" + latin:popupCharacters="@string/alternates_for_popular_domain" /> +</merge> diff --git a/java/res/xml-xlarge/kbd_number.xml b/java/res/xml-xlarge/kbd_number.xml new file mode 100644 index 000000000..875548ba7 --- /dev/null +++ b/java/res/xml-xlarge/kbd_number.xml @@ -0,0 +1,150 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="11.949%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row> + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyEdgeFlags="left" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyLabel="-" + latin:keyWidth="8.042%p" /> + <Key + latin:keyLabel="+" + latin:keyWidth="8.042%p" /> + <Key + latin:keyLabel="." + latin:keyWidth="8.042%p" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyLabel="1" /> + <Key + latin:keyLabel="2" /> + <Key + latin:keyLabel="3" /> + <Spacer + latin:horizontalGap="9.360%p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.804%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Spacer + latin:horizontalGap="16.406%p" /> + <Key + latin:keyLabel="*" + latin:keyWidth="8.042%p" /> + <Key + latin:keyLabel="/" + latin:keyWidth="8.042%p" /> + <Key + latin:keyLabel="," + latin:keyWidth="8.042%p" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyLabel="4" /> + <Key + latin:keyLabel="5" /> + <Key + latin:keyLabel="6" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="14.706%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <!-- There is an empty area bellow 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. --> + <Spacer + latin:horizontalGap="16.406%p" /> + <Key + latin:keyLabel="(" + latin:keyWidth="8.042%p" /> + <Key + latin:keyLabel=")" + latin:keyWidth="8.042%p" /> + <Key + latin:keyLabel="=" + latin:keyWidth="8.042%p" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyLabel="7" /> + <Key + latin:keyLabel="8" /> + <Key + latin:keyLabel="9" /> + <!-- There is an empty area bellow 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. --> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <!-- There is an empty area bellow the "More" key and left of the "space" key. To ignore + the touch event on the area, "space" is intentionally not marked as a left edge key. --> + <Spacer + latin:horizontalGap="8.362%p" /> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="8.042%p" /> + <Key + latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle" + latin:keyWidth="24.127%p" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyLabel="*" /> + <Key + latin:keyLabel="0" /> + <Key + latin:keyLabel="#" /> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="micKeyStyle" + latin:keyWidth="8.042%p" /> + </case> + </switch> + <!-- There is an empty area bellow 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. --> + </Row> +</Keyboard> diff --git a/java/res/xml-xlarge/kbd_numkey_styles.xml b/java/res/xml-xlarge/kbd_numkey_styles.xml new file mode 100644 index 000000000..e27db94c7 --- /dev/null +++ b/java/res/xml-xlarge/kbd_numkey_styles.xml @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <switch> + <case + latin:colorScheme="white" + > + <key-style + latin:styleName="num0KeyStyle" + latin:code="48" + latin:keyIcon="@drawable/sym_keyboard_num0_holo" /> + <key-style + latin:styleName="num1KeyStyle" + latin:code="49" + latin:keyIcon="@drawable/sym_keyboard_num1_holo" /> + <key-style + latin:styleName="num2KeyStyle" + latin:code="50" + latin:keyIcon="@drawable/sym_keyboard_num2_holo" /> + <key-style + latin:styleName="num3KeyStyle" + latin:code="51" + latin:keyIcon="@drawable/sym_keyboard_num3_holo" /> + <key-style + latin:styleName="num4KeyStyle" + latin:code="52" + latin:keyIcon="@drawable/sym_keyboard_num4_holo" /> + <key-style + latin:styleName="num5KeyStyle" + latin:code="53" + latin:keyIcon="@drawable/sym_keyboard_num5_holo" /> + <key-style + latin:styleName="num6KeyStyle" + latin:code="54" + latin:keyIcon="@drawable/sym_keyboard_num6_holo" /> + <key-style + latin:styleName="num7KeyStyle" + latin:code="55" + latin:keyIcon="@drawable/sym_keyboard_num7_holo" /> + <key-style + latin:styleName="num8KeyStyle" + latin:code="56" + latin:keyIcon="@drawable/sym_keyboard_num8_holo" /> + <key-style + latin:styleName="num9KeyStyle" + latin:code="57" + latin:keyIcon="@drawable/sym_keyboard_num9_holo" /> + <key-style + latin:styleName="numStarKeyStyle" + latin:code="42" + latin:keyIcon="@drawable/sym_keyboard_numbstar_holo" /> + <key-style + latin:styleName="numPoundKeyStyle" + latin:code="35" + latin:keyIcon="@drawable/sym_keyboard_numbpound_holo" /> + <key-style + latin:styleName="numAltKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyIcon="@drawable/sym_keyboard_numalt" + latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" /> + <key-style + latin:styleName="numSpaceKeyStyle" + latin:code="@integer/key_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + </case> + <case + latin:colorScheme="black" + > + <key-style + latin:styleName="num0KeyStyle" + latin:code="48" + latin:keyIcon="@drawable/sym_bkeyboard_num0" /> + <key-style + latin:styleName="num1KeyStyle" + latin:code="49" + latin:keyIcon="@drawable/sym_bkeyboard_num1" /> + <key-style + latin:styleName="num2KeyStyle" + latin:code="50" + latin:keyIcon="@drawable/sym_bkeyboard_num2" /> + <key-style + latin:styleName="num3KeyStyle" + latin:code="51" + latin:keyIcon="@drawable/sym_bkeyboard_num3" /> + <key-style + latin:styleName="num4KeyStyle" + latin:code="52" + latin:keyIcon="@drawable/sym_bkeyboard_num4" /> + <key-style + latin:styleName="num5KeyStyle" + latin:code="53" + latin:keyIcon="@drawable/sym_bkeyboard_num5" /> + <key-style + latin:styleName="num6KeyStyle" + latin:code="54" + latin:keyIcon="@drawable/sym_bkeyboard_num6" /> + <key-style + latin:styleName="num7KeyStyle" + latin:code="55" + latin:keyIcon="@drawable/sym_bkeyboard_num7" /> + <key-style + latin:styleName="num8KeyStyle" + latin:code="56" + latin:keyIcon="@drawable/sym_bkeyboard_num8" /> + <key-style + latin:styleName="num9KeyStyle" + latin:code="57" + latin:keyIcon="@drawable/sym_bkeyboard_num9" /> + <key-style + latin:styleName="numStarKeyStyle" + latin:code="42" + latin:keyIcon="@drawable/sym_bkeyboard_numstar" /> + <key-style + latin:styleName="numPoundKeyStyle" + latin:code="35" + latin:keyIcon="@drawable/sym_bkeyboard_numpound" /> + <key-style + latin:styleName="numAltKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyIcon="@drawable/sym_bkeyboard_numalt" + latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" /> + <key-style + latin:styleName="numSpaceKeyStyle" + latin:code="@integer/key_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + </case> + </switch> +</merge> diff --git a/java/res/xml-xlarge/kbd_phone.xml b/java/res/xml-xlarge/kbd_phone.xml new file mode 100644 index 000000000..b9444ad50 --- /dev/null +++ b/java/res/xml-xlarge/kbd_phone.xml @@ -0,0 +1,158 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="11.949%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + 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:keyEdgeFlags="left" /> + <!-- To match one character label size with "Tab", I placed spaces around the char '-' + and '+'. --> + <Spacer + latin:horizontalGap="8.470%p" /> + <Key + latin:code="45" + latin:keyLabel=" - " + latin:keyWidth="8.042%p" /> + <Key + latin:code="43" + latin:keyLabel=" + " + latin:keyWidth="8.042%p" /> + <Spacer + latin:horizontalGap="8.479%p" /> + <Key + latin:keyStyle="num1KeyStyle" /> + <Key + latin:keyStyle="num2KeyStyle" /> + <Key + latin:keyStyle="num3KeyStyle" /> + <Spacer + latin:horizontalGap="9.360%p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.804%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyStyle="moreKeyStyle" + latin:keyEdgeFlags="left" /> + <!-- To match one character label size with "More", I placed spaces around the char ',' + and '.'. --> + <Spacer + latin:horizontalGap="8.470%p" /> + <Key + latin:code="44" + latin:keyLabel=" , " + latin:keyWidth="8.042%p" /> + <Key + latin:code="46" + latin:keyLabel=" . " + latin:keyWidth="8.042%p" /> + <Spacer + latin:horizontalGap="8.479%p" /> + <Key + latin:keyStyle="num4KeyStyle" /> + <Key + latin:keyStyle="num5KeyStyle" /> + <Key + latin:keyStyle="num6KeyStyle" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="14.706%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <!-- To match one character label size with "More", I placed spaces around the char '(' + and ')'. --> + <!-- There is an empty area bellow 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. --> + <Spacer + latin:horizontalGap="20.427%p" /> + <Key + latin:code="40" + latin:keyLabel=" ( " + latin:keyWidth="8.042%p" /> + <Key + latin:code="41" + latin:keyLabel=" ) " + latin:keyWidth="8.042%p" /> + <Spacer + latin:horizontalGap="8.479%p" /> + <Key + latin:keyStyle="num7KeyStyle" /> + <Key + latin:keyStyle="num8KeyStyle" /> + <Key + latin:keyStyle="num9KeyStyle" /> + <!-- There is an empty area bellow 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. --> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <!-- There is an empty area bellow the "More" key and left of the "space" key. To ignore + the touch event on the area, "space" is intentionally not marked as a left edge key. --> + <Spacer + latin:horizontalGap="12.340%p" /> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="8.042%p" /> + <Key + latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle" + latin:keyWidth="16.084%p" /> + <Spacer + latin:horizontalGap="8.479%p" /> + <Key + latin:keyStyle="numStarKeyStyle" /> + <Key + latin:keyStyle="num0KeyStyle" /> + <Key + latin:keyStyle="numPoundKeyStyle" /> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="micKeyStyle" + latin:keyWidth="8.042%p" /> + </case> + </switch> + <!-- There is an empty area bellow 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. --> + </Row> +</Keyboard> diff --git a/java/res/xml-xlarge/kbd_phone_symbols.xml b/java/res/xml-xlarge/kbd_phone_symbols.xml new file mode 100644 index 000000000..690bcde0c --- /dev/null +++ b/java/res/xml-xlarge/kbd_phone_symbols.xml @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="11.949%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + 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:keyEdgeFlags="left" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:code="45" + latin:keyLabel=" - " + latin:keyWidth="8.042%p" /> + <Key + latin:code="43" + latin:keyLabel=" + " + latin:keyWidth="8.042%p" /> + <Key + latin:code="44" + latin:keyLabel="@string/label_pause_key" + latin:keyWidth="8.042%p" /> + <!-- To match one character label size with "Tab" and "Pause, I placed spaces around the + char '-' and '+'. --> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyStyle="num1KeyStyle" /> + <Key + latin:keyStyle="num2KeyStyle" /> + <Key + latin:keyStyle="num3KeyStyle" /> + <Spacer + latin:horizontalGap="9.360%p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.804%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyStyle="moreKeyStyle" + latin:keyEdgeFlags="left" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:code="44" + latin:keyLabel=" , " + latin:keyWidth="8.042%p" /> + <Key + latin:code="46" + latin:keyLabel=" . " + latin:keyWidth="8.042%p" /> + <Key + latin:code="59" + latin:keyLabel="@string/label_wait_key" + latin:keyWidth="8.042%p" /> + <!-- To match one character label size with "More" and "Wait", I placed spaces around the + char ',' and '.'. --> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyStyle="num4KeyStyle" /> + <Key + latin:keyStyle="num5KeyStyle" /> + <Key + latin:keyStyle="num6KeyStyle" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="14.706%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <!-- To match one character label size with "More" and etc., I placed spaces around the + char 'N', '(' and ')'. --> + <!-- There is an empty area bellow 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. --> + <Spacer + latin:horizontalGap="16.406%p" /> + <Key + latin:code="40" + latin:keyLabel=" ( " + latin:keyWidth="8.042%p" /> + <Key + latin:code="41" + latin:keyLabel=" ) " + latin:keyWidth="8.042%p" /> + <Key + latin:code="78" + latin:keyLabel=" N " + latin:keyWidth="8.042%p" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyStyle="num7KeyStyle" /> + <Key + latin:keyStyle="num8KeyStyle" /> + <Key + latin:keyStyle="num9KeyStyle" /> + <!-- There is an empty area bellow 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. --> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <!-- There is an empty area bellow the "More" key and left of the "space" key. To ignore + the touch event on the area, "space" is intentionally not marked as a left edge key. --> + <Spacer + latin:horizontalGap="8.362%p" /> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="8.042%p" /> + <Key + latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle" + latin:keyWidth="24.127%p" /> + <Spacer + latin:horizontalGap="4.458%p" /> + <Key + latin:keyStyle="numStarKeyStyle" /> + <Key + latin:keyStyle="num0KeyStyle" /> + <Key + latin:keyStyle="numPoundKeyStyle" /> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="micKeyStyle" + latin:keyWidth="8.042%p" /> + </case> + </switch> + <!-- There is an empty area bellow 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. --> + </Row> +</Keyboard> diff --git a/java/res/xml-xlarge/kbd_popup_template.xml b/java/res/xml-xlarge/kbd_popup_template.xml new file mode 100644 index 000000000..7d39d1a3a --- /dev/null +++ b/java/res/xml-xlarge/kbd_popup_template.xml @@ -0,0 +1,27 @@ +<?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. +*/ +--> + +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="5.0%p" + latin:horizontalGap="0px" + latin:verticalGap="0px" + latin:rowHeight="@dimen/popup_key_height" + > +</Keyboard> diff --git a/java/res/values-zh-rTW/donottranslate-altchars.xml b/java/res/xml-xlarge/kbd_qwerty.xml index c165b11c5..1c8d51ffe 100644 --- a/java/res/values-zh-rTW/donottranslate-altchars.xml +++ b/java/res/xml-xlarge/kbd_qwerty.xml @@ -17,14 +17,17 @@ ** limitations under the License. */ --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">èéêë</string> - <string name="alternates_for_i">ìíîï</string> - <string name="alternates_for_o">òóôõöœø</string> - <string name="alternates_for_u">ùúûü</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ</string> -</resources> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_qwerty_rows" /> +</Keyboard> diff --git a/java/res/xml-xlarge/kbd_qwerty_row1.xml b/java/res/xml-xlarge/kbd_qwerty_row1.xml new file mode 100644 index 000000000..f5135591c --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row1.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<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.272%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml-xlarge/kbd_qwerty_row2.xml b/java/res/xml-xlarge/kbd_qwerty_row2.xml new file mode 100644 index 000000000..1b4393ab2 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row2.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="8.157%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.167%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="15.750%p" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml-xlarge/kbd_qwerty_row3.xml b/java/res/xml-xlarge/kbd_qwerty_row3.xml new file mode 100644 index 000000000..b7e9bcff9 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row3.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="8.042%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15.192%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="z" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="m" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + </case> + <default> + <Key + latin:keyLabel="," + latin:manualTemporaryUpperCaseCode="33" + latin:keyHintIcon="@drawable/key_hint_exclamation_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:manualTemporaryUpperCaseCode="63" + latin:keyHintIcon="@drawable/key_hint_question_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo" + latin:popupCharacters="\?" /> + </default> + </switch> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="12.530%p" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml-xlarge/kbd_qwerty_row4.xml b/java/res/xml-xlarge/kbd_qwerty_row4.xml new file mode 100644 index 000000000..9d0fd81c7 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row4.xml @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<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.042%p" + > + <Spacer + latin:horizontalGap="8.362%p" /> + <Key + latin:keyStyle="settingsKeyStyle" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyStyle="comKeyStyle" /> + <Key + latin:keyLabel="\@" /> + </case> + <!-- TODO: implement logical OR for <case> attribute --> + <case + latin:mode="url" + > + <Key + latin:keyStyle="comKeyStyle" + latin:keyWidth="16.084%p" /> + </case> + <default> + <switch> + <case + latin:imeOptions="actionSearch" + > + <Key + latin:keyLabel=":" + latin:manualTemporaryUpperCaseCode="43" + latin:keyHintIcon="@drawable/key_hint_plus_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo" + latin:popupCharacters="+" /> + </case> + <default> + <Key + latin:keyStyle="smileyKeyStyle" /> + </default> + </switch> + <Key + latin:keyLabel="/" + latin:manualTemporaryUpperCaseCode="64" + latin:keyHintIcon="@drawable/key_hint_at_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_at_large_holo" + latin:popupCharacters="\@" /> + </default> + </switch> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="37.454%p" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="-" /> + </case> + <case + latin:mode="url" + > + <Key + latin:keyLabel="/" + latin:manualTemporaryUpperCaseCode="58" + latin:keyHintIcon="@drawable/key_hint_colon_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo" + latin:popupCharacters=":" /> + </case> + <default> + <Key + latin:keyLabel="\'" + latin:manualTemporaryUpperCaseCode="34" + latin:keyHintIcon="@drawable/key_hint_quote_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_quote_large_holo" + latin:popupCharacters=""" /> + </default> + </switch> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="_" /> + </case> + <default> + <Key + latin:keyLabel="-" + latin:manualTemporaryUpperCaseCode="95" + latin:keyHintIcon="@drawable/key_hint_underline_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo" + latin:popupCharacters="_" /> + </default> + </switch> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="micKeyStyle" /> + </case> + </switch> + </Row> +</merge> diff --git a/java/res/xml-xlarge/kbd_qwerty_rows.xml b/java/res/xml-xlarge/kbd_qwerty_rows.xml new file mode 100644 index 000000000..6237712f6 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_rows.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<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_qwerty_row1" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row2" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row3" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml b/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml new file mode 100644 index 000000000..8c583ba85 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="7.520%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyLabel="å" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.520%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="@string/keylabel_for_scandinavia_row2_10" + latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" /> + <Key + latin:keyLabel="@string/keylabel_for_scandinavia_row2_11" + latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row3" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-xlarge/kbd_qwertz_rows.xml b/java/res/xml-xlarge/kbd_qwertz_rows.xml new file mode 100644 index 000000000..3e99f0511 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwertz_rows.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="8.272%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="z" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row2" /> + <Row + latin:keyWidth="8.042%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15.192%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="m" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + </case> + <default> + <Key + latin:keyLabel="," + latin:manualTemporaryUpperCaseCode="33" + latin:keyHintIcon="@drawable/key_hint_exclamation_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:manualTemporaryUpperCaseCode="63" + latin:keyHintIcon="@drawable/key_hint_question_holo" + latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo" + latin:popupCharacters="\?" /> + </default> + </switch> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="12.530%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-xlarge/kbd_symbols.xml new file mode 100644 index 000000000..e56cc92d2 --- /dev/null +++ b/java/res/xml-xlarge/kbd_symbols.xml @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="8.272%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="1" + latin:popupCharacters="¹,½,⅓,¼,⅛" /> + <Key + latin:keyLabel="2" + latin:popupCharacters="²,⅔" /> + <Key + latin:keyLabel="3" + latin:popupCharacters="³,¾,⅜" /> + <Key + latin:keyLabel="4" + latin:popupCharacters="⁴" /> + <Key + latin:keyLabel="5" + latin:popupCharacters="⅝" /> + <Key + latin:keyLabel="6" /> + <Key + latin:keyLabel="7" + latin:popupCharacters="⅞" /> + <Key + latin:keyLabel="8" /> + <Key + latin:keyLabel="9" /> + <Key + latin:keyLabel="0" + latin:popupCharacters="ⁿ,∅" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.157%p" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.167%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="#" /> + <Key + latin:keyLabel="$" + latin:popupCharacters="¢,£,€,¥,₣,₤,₱" /> + <Key + latin:keyLabel="%" + latin:popupCharacters="‰" /> + <Key + latin:keyLabel="&" /> + <Key + latin:keyLabel="*" + latin:popupCharacters="†,‡,★" /> + <Key + latin:keyLabel="-" + latin:popupCharacters="_,–,—" /> + <Key + latin:keyLabel="+" + latin:popupCharacters="±" /> + <Key + latin:keyLabel="(" + latin:popupCharacters="[,{,<" /> + <Key + latin:keyLabel=")" + latin:popupCharacters="],},>" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="15.750%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.042%p" + > + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="15.192%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="<" + latin:popupCharacters="≤,«,‹" /> + <Key + latin:keyLabel=">" + latin:popupCharacters="≥,»,›" /> + <Key + latin:keyLabel="=" + latin:popupCharacters="≠,≈" /> + <Key + latin:keyLabel=":" /> + <Key + latin:keyLabel=";" /> + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + <Key + latin:keyLabel="!" + latin:popupCharacters="¡" /> + <Key + latin:keyLabel="\?" + latin:popupCharacters="¿" /> + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="12.530%p" + latin:keyEdgeFlags="right" /> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row + latin:keyWidth="8.042%p" + > + <Spacer + latin:horizontalGap="8.362%p" /> + <Key + latin:keyStyle="settingsKeyStyle" /> + <Key + latin:keyLabel="/" /> + <Key + latin:keyLabel="\@" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="37.454%p" /> + <Key + latin:keyLabel=""" + latin:popupCharacters="“,”,«,»,˝" /> + <Key + latin:keyLabel="_" /> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="micKeyStyle" /> + </case> + </switch> + </Row> +</Keyboard> diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml new file mode 100644 index 000000000..f7cf24a3f --- /dev/null +++ b/java/res/xml-xlarge/kbd_symbols_shift.xml @@ -0,0 +1,153 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="8.272%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.949%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="~" /> + <Key + latin:keyLabel="`" /> + <Key + latin:keyLabel="|" /> + <Key + latin:keyLabel="•" + latin:popupCharacters="♪,♥,♠,♦,♣" /> + <Key + latin:keyLabel="√" /> + <Key + latin:keyLabel="π" + latin:popupCharacters="Π" /> + <Key + latin:keyLabel="÷" /> + <Key + latin:keyLabel="×" /> + <Key + latin:keyLabel="§" + latin:popupCharacters="¶" /> + <Key + latin:keyLabel="Δ" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="9.331%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.157%p" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.167%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="£" /> + <Key + latin:keyLabel="¢" /> + <Key + latin:keyLabel="€" /> + <Key + latin:keyLabel="¥" /> + <Key + latin:keyLabel="^" + latin:popupCharacters="↑,↓,←,→" /> + <Key + latin:keyLabel="°" /> + <Key + latin:keyLabel="±" + latin:popupCharacters="∞" /> + <Key + latin:keyLabel="{" /> + <Key + latin:keyLabel="}" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="15.750%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.042%p" + > + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="15.192%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="\\" /> + <Key + latin:keyLabel="©" /> + <Key + latin:keyLabel="®" /> + <Key + latin:keyLabel="™" /> + <Key + latin:keyLabel="℅" /> + <Key + latin:keyLabel="[" /> + <Key + latin:keyLabel="]" /> + <Key + latin:keyLabel="¡" /> + <Key + latin:keyLabel="¿" /> + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="12.530%p" + latin:keyEdgeFlags="right" /> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row + latin:keyWidth="8.042%p" + > + <Spacer + latin:horizontalGap="24.446%p" /> + <Key + latin:keyStyle="settingsKeyStyle" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="37.454%p" /> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="micKeyStyle" /> + </case> + </switch> + </Row> +</Keyboard> diff --git a/java/res/xml/kbd_azerty_rows.xml b/java/res/xml/kbd_azerty_rows.xml new file mode 100644 index 000000000..71109ab67 --- /dev/null +++ b/java/res/xml/kbd_azerty_rows.xml @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<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" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="a" + latin:keyHintIcon="@drawable/keyboard_hint_1" + latin:popupCharacters="@string/alternates_for_a" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="z" + latin:keyHintIcon="@drawable/keyboard_hint_2" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="e" + latin:keyHintIcon="@drawable/keyboard_hint_3" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:keyHintIcon="@drawable/keyboard_hint_4" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:keyHintIcon="@drawable/keyboard_hint_5" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:keyHintIcon="@drawable/keyboard_hint_6" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:keyHintIcon="@drawable/keyboard_hint_7" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:keyHintIcon="@drawable/keyboard_hint_8" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:keyHintIcon="@drawable/keyboard_hint_9" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:keyHintIcon="@drawable/keyboard_hint_0" + latin:popupCharacters="@string/alternates_for_p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="m" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="\'" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml new file mode 100644 index 000000000..3b35f3560 --- /dev/null +++ b/java/res/xml/kbd_key_styles.xml @@ -0,0 +1,290 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <!-- Functional key styles --> + <switch> + <case + latin:colorScheme="white" + > + <key-style + latin:styleName="functionalKeyStyle" + latin:isModifier="true" /> + <key-style + latin:styleName="shiftKeyStyle" + latin:code="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:shiftedIcon="@drawable/sym_keyboard_shift_locked" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:parentStyle="functionalKeyStyle" + latin:isSticky="true" /> + <key-style + latin:styleName="deleteKeyStyle" + latin:code="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:parentStyle="functionalKeyStyle" + latin:isRepeatable="true" /> + <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. --> + <case + latin:voiceKeyEnabled="true" + latin:hasVoiceKey="false" + > + <key-style + latin:styleName="toSymbolKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyIcon="@drawable/sym_keyboard_123_mic" + latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic" + latin:parentStyle="functionalKeyStyle" /> + </case> + <default> + <key-style + latin:styleName="toSymbolKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyLabel="@string/label_to_symbol_key" + latin:parentStyle="functionalKeyStyle" /> + </default> + </switch> + <key-style + latin:styleName="settingsKeyStyle" + latin:code="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="spaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="tabKeyStyle" + latin:code="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="micKeyStyle" + latin:code="@integer/key_voice" + latin:keyIcon="@drawable/sym_keyboard_mic" + latin:iconPreview="@drawable/sym_keyboard_feedback_mic" + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_mic" + latin:parentStyle="functionalKeyStyle" /> + <!-- Note: This key style is not for functional tab key. This is used for the tab key + which is laid out as normal letter key. --> + <key-style + latin:styleName="nonSpecialBackgroundTabKeyStyle" + latin:code="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + </case> + <case + latin:colorScheme="black" + > + <key-style + latin:styleName="functionalKeyStyle" /> + <key-style + latin:styleName="shiftKeyStyle" + latin:code="@integer/key_shift" + latin:keyIcon="@drawable/sym_bkeyboard_shift" + latin:shiftedIcon="@drawable/sym_bkeyboard_shift_locked" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:parentStyle="functionalKeyStyle" + latin:isSticky="true" /> + <key-style + latin:styleName="deleteKeyStyle" + latin:code="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:parentStyle="functionalKeyStyle" + latin:isRepeatable="true" /> + <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. --> + <case + latin:voiceKeyEnabled="true" + latin:hasVoiceKey="false" + > + <key-style + latin:styleName="toSymbolKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyIcon="@drawable/sym_bkeyboard_123_mic" + latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic" + latin:parentStyle="functionalKeyStyle" /> + </case> + <default> + <key-style + latin:styleName="toSymbolKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyLabel="@string/label_to_symbol_key" + latin:parentStyle="functionalKeyStyle" /> + </default> + </switch> + <key-style + latin:styleName="settingsKeyStyle" + latin:code="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="spaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="tabKeyStyle" + latin:code="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="micKeyStyle" + latin:code="@integer/key_voice" + latin:keyIcon="@drawable/sym_bkeyboard_mic" + latin:iconPreview="@drawable/sym_keyboard_feedback_mic" + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_mic" + latin:parentStyle="functionalKeyStyle" /> + <!-- Note: This key style is not for functional tab key. This is used for the tab key + which is laid out as normal letter key. --> + <key-style + latin:styleName="nonSpecialBackgroundTabKeyStyle" + latin:code="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + </case> + </switch> + <!-- Return key style --> + <switch> + <case + latin:imeOptions="actionGo" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyLabel="@string/label_go_key" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:imeOptions="actionNext" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyLabel="@string/label_next_key" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:imeOptions="actionDone" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyLabel="@string/label_done_key" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:imeOptions="actionSend" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyLabel="@string/label_send_key" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:imeOptions="actionSearch" + > + <switch> + <case + latin:colorScheme="white" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_search" + latin:iconPreview="@drawable/sym_keyboard_feedback_search" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:colorScheme="black" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_search" + latin:iconPreview="@drawable/sym_keyboard_feedback_search" + latin:parentStyle="functionalKeyStyle" /> + </case> + </switch> + </case> + <default> + <switch> + <case + latin:colorScheme="white" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:colorScheme="black" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:parentStyle="functionalKeyStyle" /> + </case> + </switch> + </default> + </switch> + <key-style + latin:styleName="toAlphaKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyLabel="@string/label_to_alpha_key" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="altKeyStyle" + latin:code="@integer/key_shift" + latin:keyLabel="@string/label_alt_key" + latin:parentStyle="functionalKeyStyle" + latin:isSticky="true" /> + <key-style + latin:styleName="smileyKeyStyle" + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_smiley" + latin:maxPopupKeyboardColumn="5" + latin:parentStyle="functionalKeyStyle" /> +</merge>
\ No newline at end of file diff --git a/java/res/xml/kbd_number.xml b/java/res/xml/kbd_number.xml new file mode 100644 index 000000000..f4fe8401a --- /dev/null +++ b/java/res/xml/kbd_number.xml @@ -0,0 +1,112 @@ +<?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. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="26.67%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <switch> + <case + latin:colorScheme="white" + > + <key-style + latin:styleName="numSpaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + </case> + <case + latin:colorScheme="black" + > + <key-style + latin:styleName="numSpaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + </case> + </switch> + <Row + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="1" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="2" /> + <Key + latin:keyLabel="3" /> + <Key + latin:keyLabel="-" + latin:keyStyle="functionalKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyLabel="4" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="5" /> + <Key + latin:keyLabel="6" /> + <Key + latin:keyLabel="," + latin:keyStyle="functionalKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyLabel="7" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="8" /> + <Key + latin:keyLabel="9" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:rowEdgeFlags="bottom" + > + <Key + latin:keyStyle="numSpaceKeyStyle" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="0" /> + <Key + latin:keyLabel="." /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + </Row> +</Keyboard> diff --git a/java/res/xml/kbd_numkey_styles.xml b/java/res/xml/kbd_numkey_styles.xml new file mode 100644 index 000000000..2f9ae325a --- /dev/null +++ b/java/res/xml/kbd_numkey_styles.xml @@ -0,0 +1,150 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <switch> + <case + latin:colorScheme="white" + > + <key-style + latin:styleName="num0KeyStyle" + latin:code="48" + latin:keyIcon="@drawable/sym_keyboard_num0" /> + <key-style + latin:styleName="num1KeyStyle" + latin:code="49" + latin:keyIcon="@drawable/sym_keyboard_num1" /> + <key-style + latin:styleName="num2KeyStyle" + latin:code="50" + latin:keyIcon="@drawable/sym_keyboard_num2" /> + <key-style + latin:styleName="num3KeyStyle" + latin:code="51" + latin:keyIcon="@drawable/sym_keyboard_num3" /> + <key-style + latin:styleName="num4KeyStyle" + latin:code="52" + latin:keyIcon="@drawable/sym_keyboard_num4" /> + <key-style + latin:styleName="num5KeyStyle" + latin:code="53" + latin:keyIcon="@drawable/sym_keyboard_num5" /> + <key-style + latin:styleName="num6KeyStyle" + latin:code="54" + latin:keyIcon="@drawable/sym_keyboard_num6" /> + <key-style + latin:styleName="num7KeyStyle" + latin:code="55" + latin:keyIcon="@drawable/sym_keyboard_num7" /> + <key-style + latin:styleName="num8KeyStyle" + latin:code="56" + latin:keyIcon="@drawable/sym_keyboard_num8" /> + <key-style + latin:styleName="num9KeyStyle" + latin:code="57" + latin:keyIcon="@drawable/sym_keyboard_num9" /> + <key-style + latin:styleName="numStarKeyStyle" + latin:code="42" + latin:keyIcon="@drawable/sym_keyboard_numstar" /> + <key-style + latin:styleName="numPoundKeyStyle" + latin:code="35" + latin:keyIcon="@drawable/sym_keyboard_numpound" /> + <key-style + latin:styleName="numAltKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyIcon="@drawable/sym_keyboard_numalt" + latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" /> + <key-style + latin:styleName="numSpaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + </case> + <case + latin:colorScheme="black" + > + <key-style + latin:styleName="num0KeyStyle" + latin:code="48" + latin:keyIcon="@drawable/sym_bkeyboard_num0" /> + <key-style + latin:styleName="num1KeyStyle" + latin:code="49" + latin:keyIcon="@drawable/sym_bkeyboard_num1" /> + <key-style + latin:styleName="num2KeyStyle" + latin:code="50" + latin:keyIcon="@drawable/sym_bkeyboard_num2" /> + <key-style + latin:styleName="num3KeyStyle" + latin:code="51" + latin:keyIcon="@drawable/sym_bkeyboard_num3" /> + <key-style + latin:styleName="num4KeyStyle" + latin:code="52" + latin:keyIcon="@drawable/sym_bkeyboard_num4" /> + <key-style + latin:styleName="num5KeyStyle" + latin:code="53" + latin:keyIcon="@drawable/sym_bkeyboard_num5" /> + <key-style + latin:styleName="num6KeyStyle" + latin:code="54" + latin:keyIcon="@drawable/sym_bkeyboard_num6" /> + <key-style + latin:styleName="num7KeyStyle" + latin:code="55" + latin:keyIcon="@drawable/sym_bkeyboard_num7" /> + <key-style + latin:styleName="num8KeyStyle" + latin:code="56" + latin:keyIcon="@drawable/sym_bkeyboard_num8" /> + <key-style + latin:styleName="num9KeyStyle" + latin:code="57" + latin:keyIcon="@drawable/sym_bkeyboard_num9" /> + <key-style + latin:styleName="numStarKeyStyle" + latin:code="42" + latin:keyIcon="@drawable/sym_bkeyboard_numstar" /> + <key-style + latin:styleName="numPoundKeyStyle" + latin:code="35" + latin:keyIcon="@drawable/sym_bkeyboard_numpound" /> + <key-style + latin:styleName="numAltKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyIcon="@drawable/sym_bkeyboard_numalt" + latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" /> + <key-style + latin:styleName="numSpaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + </case> + </switch> +</merge> diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml index 10774c666..62fbdeeec 100644 --- a/java/res/xml/kbd_phone.xml +++ b/java/res/xml/kbd_phone.xml @@ -19,88 +19,76 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="26.67%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="26.67%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_numkey_styles" /> <Row - android:rowEdgeFlags="top" + latin:rowEdgeFlags="top" > <Key - android:codes="49" - android:keyIcon="@drawable/sym_keyboard_num1" - android:keyEdgeFlags="left" /> + latin:keyStyle="num1KeyStyle" + latin:keyEdgeFlags="left" /> <Key - android:codes="50" - android:keyIcon="@drawable/sym_keyboard_num2" /> + latin:keyStyle="num2KeyStyle" /> <Key - android:codes="51" - android:keyIcon="@drawable/sym_keyboard_num3" /> + latin:keyStyle="num3KeyStyle" /> <Key - android:keyLabel="-" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyLabel="-" + latin:keyStyle="functionalKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:codes="52" - android:keyIcon="@drawable/sym_keyboard_num4" - android:keyEdgeFlags="left" /> + latin:keyStyle="num4KeyStyle" + latin:keyEdgeFlags="left" /> <Key - android:codes="53" - android:keyIcon="@drawable/sym_keyboard_num5" /> + latin:keyStyle="num5KeyStyle" /> <Key - android:codes="54" - android:keyIcon="@drawable/sym_keyboard_num6" /> + latin:keyStyle="num6KeyStyle" /> <Key - android:keyLabel="." - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyLabel="." + latin:keyStyle="functionalKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:codes="55" - android:keyIcon="@drawable/sym_keyboard_num7" - android:keyEdgeFlags="left" /> + latin:keyStyle="num7KeyStyle" + latin:keyEdgeFlags="left" /> <Key - android:codes="56" - android:keyIcon="@drawable/sym_keyboard_num8" /> + latin:keyStyle="num8KeyStyle" /> <Key - android:codes="57" - android:keyIcon="@drawable/sym_keyboard_num9" /> + latin:keyStyle="num9KeyStyle" /> <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="20%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> </Row> <Row - android:rowEdgeFlags="bottom" + latin:rowEdgeFlags="bottom" > <Key - android:codes="@integer/key_symbol" - android:keyIcon="@drawable/sym_keyboard_numalt" - android:iconPreview="@drawable/sym_keyboard_feedback_numalt" - android:keyEdgeFlags="left" /> + latin:keyStyle="numAltKeyStyle" + latin:keyEdgeFlags="left" /> <Key - android:codes="48" - android:keyIcon="@drawable/sym_keyboard_num0" /> + latin:keyStyle="num0KeyStyle" /> <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" /> + latin:keyStyle="numSpaceKeyStyle" /> <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyStyle="returnKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> </Row> </Keyboard> diff --git a/java/res/xml/kbd_phone_black.xml b/java/res/xml/kbd_phone_black.xml deleted file mode 100644 index 5afa9a194..000000000 --- a/java/res/xml/kbd_phone_black.xml +++ /dev/null @@ -1,101 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="26.67%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:codes="49" - android:keyIcon="@drawable/sym_bkeyboard_num1" - android:keyEdgeFlags="left" /> - <Key - android:codes="50" - android:keyIcon="@drawable/sym_bkeyboard_num2" /> - <Key - android:codes="51" - android:keyIcon="@drawable/sym_bkeyboard_num3" /> - <Key - android:keyLabel="-" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="52" - android:keyIcon="@drawable/sym_bkeyboard_num4" - android:keyEdgeFlags="left" /> - <Key - android:codes="53" - android:keyIcon="@drawable/sym_bkeyboard_num5" /> - <Key - android:codes="54" - android:keyIcon="@drawable/sym_bkeyboard_num6" /> - <Key - android:keyLabel="." - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="55" - android:keyIcon="@drawable/sym_bkeyboard_num7" - android:keyEdgeFlags="left" /> - <Key - android:codes="56" - android:keyIcon="@drawable/sym_bkeyboard_num8" /> - <Key - android:codes="57" - android:keyIcon="@drawable/sym_bkeyboard_num9" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="20%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyIcon="@drawable/sym_bkeyboard_numalt" - android:iconPreview="@drawable/sym_keyboard_feedback_numalt" /> - <Key - android:codes="48" - android:keyIcon="@drawable/sym_bkeyboard_num0" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml index 4c928a8d8..67cd330e7 100644 --- a/java/res/xml/kbd_phone_symbols.xml +++ b/java/res/xml/kbd_phone_symbols.xml @@ -19,84 +19,82 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="26.67%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="26.67%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_numkey_styles" /> <Row - android:rowEdgeFlags="top" + latin:rowEdgeFlags="top" > <Key - android:keyLabel="(" - android:keyEdgeFlags="left" /> + latin:keyLabel="(" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="/" /> + latin:keyLabel="/" /> <Key - android:keyLabel=")" /> + latin:keyLabel=")" /> <Key - android:keyLabel="-" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyLabel="-" + latin:keyStyle="functionalKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:keyLabel="N" - android:keyEdgeFlags="left" /> + latin:keyLabel="N" + latin:keyEdgeFlags="left" /> <!-- Pause is a comma. Check PhoneNumberUtils.java to see if this has changed. --> <Key - android:codes="44" - android:keyLabel="Pause" /> + latin:code="44" + latin:keyLabel="Pause" /> <Key - android:keyLabel="," /> + latin:keyLabel="," /> <Key - android:keyLabel="." - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyLabel="." + latin:keyStyle="functionalKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:codes="42" - android:keyIcon="@drawable/sym_keyboard_numstar" - android:keyEdgeFlags="left" /> + latin:keyStyle="numStarKeyStyle" + latin:keyEdgeFlags="left" /> <!-- Wait is a semicolon. --> <Key - android:codes="59" - android:keyLabel="Wait" /> + latin:code="59" + latin:keyLabel="Wait" /> <Key - android:codes="35" - android:keyIcon="@drawable/sym_keyboard_numpound" /> + latin:keyStyle="numPoundKeyStyle" /> <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="20%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> </Row> <Row - android:rowEdgeFlags="bottom" + latin:rowEdgeFlags="bottom" > <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_phone_key" - android:keyEdgeFlags="left" /> + latin:code="@integer/key_switch_alpha_symbol" + latin:keyLabel="@string/label_to_numeric_key" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="+" /> + latin:keyLabel="+" /> <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" /> + latin:keyStyle="numSpaceKeyStyle" /> <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyStyle="returnKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> </Row> </Keyboard> diff --git a/java/res/xml/kbd_phone_symbols_black.xml b/java/res/xml/kbd_phone_symbols_black.xml deleted file mode 100644 index 4d686e145..000000000 --- a/java/res/xml/kbd_phone_symbols_black.xml +++ /dev/null @@ -1,98 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="26.67%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="(" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="/" /> - <Key - android:keyLabel=")" /> - <Key - android:keyLabel="-" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="N" - android:keyEdgeFlags="left" /> - <!-- Pause is a comma. Check PhoneNumberUtils.java to see if this - has changed. --> - <Key - android:codes="44" - android:keyLabel="Pause" /> - <Key - android:keyLabel="," /> - <Key - android:keyLabel="." - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="42" - android:keyIcon="@drawable/sym_bkeyboard_numstar" - android:keyEdgeFlags="left" /> - <!-- Wait is a semicolon. --> - <Key - android:codes="59" - android:keyLabel="Wait" /> - <Key - android:codes="35" - android:keyIcon="@drawable/sym_bkeyboard_numpound" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="20%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_phone_key" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="+" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/kbd_popup_narrow_template.xml b/java/res/xml/kbd_popup_narrow_template.xml index 23c686e8b..36caf1c15 100644 --- a/java/res/xml/kbd_popup_narrow_template.xml +++ b/java/res/xml/kbd_popup_narrow_template.xml @@ -18,10 +18,10 @@ */ --> -<Keyboard xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.45%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="9.45%p" + latin:horizontalGap="0px" + latin:verticalGap="0px" + latin:rowHeight="@dimen/popup_key_height" > </Keyboard> diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml index a287be1fd..9ee27493d 100644 --- a/java/res/xml/kbd_popup_template.xml +++ b/java/res/xml/kbd_popup_template.xml @@ -18,10 +18,10 @@ */ --> -<Keyboard xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="0px" + latin:rowHeight="@dimen/popup_key_height" > </Keyboard> diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml index a4ab0f8fe..92d92f0e6 100644 --- a/java/res/xml/kbd_qwerty.xml +++ b/java/res/xml/kbd_qwerty.xml @@ -19,487 +19,16 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_narrow_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_keyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_rows" /> </Keyboard> diff --git a/java/res/xml/kbd_qwerty_black.xml b/java/res/xml/kbd_qwerty_black.xml deleted file mode 100644 index 787e4ef7c..000000000 --- a/java/res/xml/kbd_qwerty_black.xml +++ /dev/null @@ -1,447 +0,0 @@ -<?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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_narrow_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/kbd_qwerty_black_symbol.xml b/java/res/xml/kbd_qwerty_black_symbol.xml new file mode 100644 index 000000000..6e45c12bf --- /dev/null +++ b/java/res/xml/kbd_qwerty_black_symbol.xml @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <switch> + <case + latin:hasSettingsKey="false" + > + <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. + --> + <case + latin:voiceKeyEnabled="true" + latin:hasVoiceKey="false" + > + <Key + latin:code="@integer/key_switch_alpha_symbol" + latin:keyIcon="@drawable/sym_bkeyboard_123_mic" + latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + </case> + <default> + <Key + latin:code="@integer/key_switch_alpha_symbol" + latin:keyLabel="@string/label_to_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + </default> + </switch> + </case> + <case + latin:hasSettingsKey="true" + > + <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. + --> + <case + latin:voiceKeyEnabled="true" + latin:hasVoiceKey="false" + > + <Key + latin:code="@integer/key_switch_alpha_symbol" + latin:keyIcon="@drawable/sym_bkeyboard_123_mic" + latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + </case> + <default> + <Key + latin:code="@integer/key_switch_alpha_symbol" + latin:keyLabel="@string/label_to_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + </default> + </switch> + </case> + </switch> +</merge> diff --git a/java/res/xml/kbd_qwerty_f1.xml b/java/res/xml/kbd_qwerty_f1.xml new file mode 100644 index 000000000..cbdb8c09a --- /dev/null +++ b/java/res/xml/kbd_qwerty_f1.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <switch> + <case + latin:mode="url" + > + <Key + latin:keyLabel="/" + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_settings_slash" + latin:isModifier="true" /> + </case> + <case + latin:mode="email" + > + <Key + latin:keyLabel="\@" + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_settings_at" + latin:isModifier="true" /> + </case> + <default> + <switch> + <case + latin:hasVoiceKey="true" + > + <Key + latin:keyStyle="micKeyStyle" /> + </case> + <case + latin:hasVoiceKey="false" + > + <Key + latin:keyLabel="," + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_settings_comma" + latin:isModifier="true" /> + </case> + </switch> + </default> + </switch> +</merge> diff --git a/java/res/xml/kbd_qwerty_row1.xml b/java/res/xml/kbd_qwerty_row1.xml new file mode 100644 index 000000000..d9249657e --- /dev/null +++ b/java/res/xml/kbd_qwerty_row1.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="10%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="q" + latin:keyHintIcon="@drawable/keyboard_hint_1" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:keyHintIcon="@drawable/keyboard_hint_2" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:keyHintIcon="@drawable/keyboard_hint_3" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:keyHintIcon="@drawable/keyboard_hint_4" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:keyHintIcon="@drawable/keyboard_hint_5" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:keyHintIcon="@drawable/keyboard_hint_6" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:keyHintIcon="@drawable/keyboard_hint_7" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:keyHintIcon="@drawable/keyboard_hint_8" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:keyHintIcon="@drawable/keyboard_hint_9" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:keyHintIcon="@drawable/keyboard_hint_0" + latin:popupCharacters="@string/alternates_for_p" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml/kbd_qwerty_row2.xml b/java/res/xml/kbd_qwerty_row2.xml new file mode 100644 index 000000000..dd0035d93 --- /dev/null +++ b/java/res/xml/kbd_qwerty_row2.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="10%p" + > + <Spacer + latin:horizontalGap="5%p" /> + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml/kbd_qwerty_row3.xml b/java/res/xml/kbd_qwerty_row3.xml new file mode 100644 index 000000000..26608fd71 --- /dev/null +++ b/java/res/xml/kbd_qwerty_row3.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="z" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="m" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml new file mode 100644 index 000000000..0db011672 --- /dev/null +++ b/java/res/xml/kbd_qwerty_row4.xml @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="10%p" + latin:rowEdgeFlags="bottom" + > + <switch> + <case + latin:hasSettingsKey="false" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f1" /> + <switch> + <case + latin:mode="web" + > + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="20%p" /> + <Key + latin:keyStyle="tabKeyStyle" + latin:keyWidth="20%p" /> + </case> + <default> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="40%p" /> + </default> + </switch> + <Key + latin:keyLabel="." + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_punctuation" + latin:maxPopupKeyboardColumn="7" + latin:keyStyle="functionalKeyStyle" /> + <switch> + <case + latin:mode="im" + > + <Key + latin:keyStyle="smileyKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + </case> + <default> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + </default> + </switch> + </case> + <case + latin:hasSettingsKey="true" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="settingsKeyStyle" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f1" /> + <switch> + <case + latin:mode="web" + > + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="30%p" /> + <Key + latin:keyStyle="tabKeyStyle" /> + </case> + <default> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="30%p" /> + </default> + </switch> + <Key + latin:keyLabel="." + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_punctuation" + latin:maxPopupKeyboardColumn="7" + latin:keyStyle="functionalKeyStyle" /> + <switch> + <case + latin:mode="im" + > + <Key + latin:keyStyle="smileyKeyStyle" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + </case> + <case + latin:mode="web" + > + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> + </case> + <default> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + </default> + </switch> + </case> + </switch> + </Row> +</merge> diff --git a/java/res/xml/kbd_qwerty_rows.xml b/java/res/xml/kbd_qwerty_rows.xml new file mode 100644 index 000000000..6237712f6 --- /dev/null +++ b/java/res/xml/kbd_qwerty_rows.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<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_qwerty_row1" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row2" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row3" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml/kbd_qwerty_rows_scandinavia.xml b/java/res/xml/kbd_qwerty_rows_scandinavia.xml new file mode 100644 index 000000000..490652663 --- /dev/null +++ b/java/res/xml/kbd_qwerty_rows_scandinavia.xml @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="9.09%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="q" + latin:keyHintIcon="@drawable/keyboard_hint_1" + latin:popupCharacters="@string/alternates_for_q" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:keyHintIcon="@drawable/keyboard_hint_2" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:keyHintIcon="@drawable/keyboard_hint_3" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:keyHintIcon="@drawable/keyboard_hint_4" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:keyHintIcon="@drawable/keyboard_hint_5" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:keyHintIcon="@drawable/keyboard_hint_6" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:keyHintIcon="@drawable/keyboard_hint_7" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:keyHintIcon="@drawable/keyboard_hint_8" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:keyHintIcon="@drawable/keyboard_hint_9" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:keyHintIcon="@drawable/keyboard_hint_0" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyLabel="å" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="9.09%p" + > + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="@string/keylabel_for_scandinavia_row2_10" + latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" /> + <Key + latin:keyLabel="@string/keylabel_for_scandinavia_row2_11" + latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row3" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml/kbd_qwertz_rows.xml b/java/res/xml/kbd_qwertz_rows.xml new file mode 100644 index 000000000..375f12335 --- /dev/null +++ b/java/res/xml/kbd_qwertz_rows.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<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" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="q" + latin:keyHintIcon="@drawable/keyboard_hint_1" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:keyHintIcon="@drawable/keyboard_hint_2" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:keyHintIcon="@drawable/keyboard_hint_3" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:keyHintIcon="@drawable/keyboard_hint_4" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:keyHintIcon="@drawable/keyboard_hint_5" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="z" + latin:keyHintIcon="@drawable/keyboard_hint_6" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="u" + latin:keyHintIcon="@drawable/keyboard_hint_7" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:keyHintIcon="@drawable/keyboard_hint_8" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:keyHintIcon="@drawable/keyboard_hint_9" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:keyHintIcon="@drawable/keyboard_hint_0" + latin:popupCharacters="@string/alternates_for_p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row2" /> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="m" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml index bcb6e8ae8..5d62deaa4 100644 --- a/java/res/xml/kbd_symbols.xml +++ b/java/res/xml/kbd_symbols.xml @@ -19,196 +19,109 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> <Row - android:rowEdgeFlags="top" + latin:rowEdgeFlags="top" > <Key - android:keyLabel="1" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¹½⅓¼⅛" - android:keyEdgeFlags="left" /> + latin:keyLabel="1" + latin:popupCharacters="¹,½,⅓,¼,⅛" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="2" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="²⅔" /> + latin:keyLabel="2" + latin:popupCharacters="²,⅔" /> <Key - android:keyLabel="3" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="³¾⅜" /> + latin:keyLabel="3" + latin:popupCharacters="³,¾,⅜" /> <Key - android:keyLabel="4" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="⁴" /> + latin:keyLabel="4" + latin:popupCharacters="⁴" /> <Key - android:keyLabel="5" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="⅝" /> + latin:keyLabel="5" + latin:popupCharacters="⅝" /> <Key - android:keyLabel="6" /> + latin:keyLabel="6" /> <Key - android:keyLabel="7" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="⅞" /> + latin:keyLabel="7" + latin:popupCharacters="⅞" /> <Key - android:keyLabel="8" /> + latin:keyLabel="8" /> <Key - android:keyLabel="9" /> + latin:keyLabel="9" /> <Key - android:keyLabel="0" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="ⁿ∅" - android:keyEdgeFlags="right" /> + latin:keyLabel="0" + latin:popupCharacters="ⁿ,∅" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:keyLabel="\@" - android:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="\#" /> + latin:keyLabel="\#" /> <Key - android:keyLabel="$" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¢£€¥₣₤₱" /> + latin:keyLabel="$" + latin:popupCharacters="¢,£,€,¥,₣,₤,₱" /> <Key - android:keyLabel="%" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="‰" /> + latin:keyLabel="%" + latin:popupCharacters="‰" /> <Key - android:keyLabel="&" /> + latin:keyLabel="&" /> <Key - android:keyLabel="*" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="†‡★" /> + latin:keyLabel="*" + latin:popupCharacters="†,‡,★" /> <Key - android:keyLabel="-" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="_–—" /> + latin:keyLabel="-" + latin:popupCharacters="_,–,—" /> <Key - android:keyLabel="+" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="±" /> + latin:keyLabel="+" + latin:popupCharacters="±" /> <Key - android:keyLabel="(" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="[{<" /> + latin:keyLabel="(" + latin:popupCharacters="[,{,<" /> <Key - android:keyLabel=")" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="]}>" - android:keyEdgeFlags="right" /> + latin:keyLabel=")" + latin:popupCharacters="],},>" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:codes="@integer/key_shift" - android:keyLabel="@string/label_alt_key" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> + latin:keyStyle="altKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="!" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¡" /> + latin:keyLabel="!" + latin:popupCharacters="¡" /> <Key - android:keyLabel=""" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="“”«»˝" /> + latin:keyLabel=""" + latin:popupCharacters="“,”,«,»,˝" /> <Key - android:keyLabel="\'" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="‘’" /> + latin:keyLabel="\'" + latin:popupCharacters="‘,’" /> <Key - android:keyLabel=":" /> + latin:keyLabel=":" /> <Key - android:keyLabel=";" /> + latin:keyLabel=";" /> <Key - android:keyLabel="/" /> + latin:keyLabel="/" /> <Key - android:keyLabel="\?" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¿" /> + latin:keyLabel="\?" + latin:popupCharacters="¿" /> <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_symbols" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_alpha_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_symbols_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_alpha_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> </Row> + <include latin:keyboardLayout="@xml/kbd_symbols_row4" /> </Keyboard> diff --git a/java/res/xml/kbd_symbols_black.xml b/java/res/xml/kbd_symbols_black.xml deleted file mode 100644 index add6c01c5..000000000 --- a/java/res/xml/kbd_symbols_black.xml +++ /dev/null @@ -1,202 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="1" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¹½⅓¼⅛" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="2" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="²⅔" /> - <Key - android:keyLabel="3" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="³¾⅜" /> - <Key - android:keyLabel="4" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="⁴" /> - <Key - android:keyLabel="5" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="⅝" /> - <Key - android:keyLabel="6" /> - <Key - android:keyLabel="7" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="⅞" /> - <Key - android:keyLabel="8" /> - <Key - android:keyLabel="9" /> - <Key - android:keyLabel="0" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="ⁿ∅" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="\@" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="\#" /> - <Key - android:keyLabel="$" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¢£€¥₣₤₱" /> - <Key - android:keyLabel="%" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="‰" /> - <Key - android:keyLabel="&" /> - <Key - android:keyLabel="*" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="†‡★" /> - <Key - android:keyLabel="-" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="_–—" /> - <Key - android:keyLabel="+" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="±" /> - <Key - android:keyLabel="(" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="[{<" /> - <Key - android:keyLabel=")" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="]}>" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_shift" - android:keyLabel="@string/label_alt_key" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="!" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¡" /> - <Key - android:keyLabel=""" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="“”«»˝" /> - <Key - android:keyLabel="\'" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="‘’" /> - <Key - android:keyLabel=":" /> - <Key - android:keyLabel=";" /> - <Key - android:keyLabel="/" /> - <Key - android:keyLabel="\?" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¿" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_symbols" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_alpha_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_symbols_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_alpha_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/kbd_symbols_f1.xml b/java/res/xml/kbd_symbols_f1.xml new file mode 100644 index 000000000..8487b6158 --- /dev/null +++ b/java/res/xml/kbd_symbols_f1.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <switch> + <case + latin:hasVoiceKey="true" + > + <Key + latin:keyStyle="micKeyStyle" /> + </case> + <case + latin:hasVoiceKey="false" + > + <Key + latin:keyLabel="," + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_settings_comma" + latin:keyStyle="functionalKeyStyle" /> + </case> + </switch> +</merge> diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml new file mode 100644 index 000000000..b330095af --- /dev/null +++ b/java/res/xml/kbd_symbols_row4.xml @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:rowEdgeFlags="bottom" + > + <switch> + <case + latin:hasSettingsKey="false" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + <include + latin:keyboardLayout="@xml/kbd_symbols_f1" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="40%p" /> + <Key + latin:keyLabel="." + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_punctuation" + latin:maxPopupKeyboardColumn="7" + latin:keyStyle="functionalKeyStyle" /> + <switch> + <case + latin:mode="im" + > + <Key + latin:keyStyle="smileyKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + </case> + <default> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + </default> + </switch> + </case> + <case + latin:hasSettingsKey="true" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="settingsKeyStyle" /> + <include + latin:keyboardLayout="@xml/kbd_symbols_f1" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="30%p" /> + <Key + latin:keyLabel="." + latin:keyHintIcon="@drawable/hint_popup" + latin:popupCharacters="@string/alternates_for_punctuation" + latin:maxPopupKeyboardColumn="7" + latin:keyStyle="functionalKeyStyle" /> + <switch> + <case + latin:mode="im" + > + <Key + latin:keyStyle="smileyKeyStyle" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + </case> + <default> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + </default> + </switch> + </case> + </switch> + </Row> +</merge> diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml index 9bee22069..368ee805b 100644 --- a/java/res/xml/kbd_symbols_shift.xml +++ b/java/res/xml/kbd_symbols_shift.xml @@ -19,171 +19,98 @@ --> <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardHeight="@dimen/keyboardHeight" + latin:maxKeyboardHeight="50%p" + latin:rowHeight="25%p" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="@dimen/key_bottom_gap" + latin:popupKeyboardTemplate="@xml/kbd_popup_template" + latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" > + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> <Row - android:rowEdgeFlags="top" + latin:rowEdgeFlags="top" > <Key - android:keyLabel="~" - android:keyEdgeFlags="left" /> + latin:keyLabel="~" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="`" /> + latin:keyLabel="`" /> <Key - android:keyLabel="|" /> + latin:keyLabel="|" /> <Key - android:keyLabel="•" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="♪♥♠♦♣" /> + latin:keyLabel="•" + latin:popupCharacters="♪,♥,♠,♦,♣" /> <Key - android:keyLabel="√" /> + latin:keyLabel="√" /> <Key - android:keyLabel="π" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="Π" /> + latin:keyLabel="π" + latin:popupCharacters="Π" /> <Key - android:keyLabel="÷" /> + latin:keyLabel="÷" /> <Key - android:keyLabel="×" /> + latin:keyLabel="×" /> <Key - android:keyLabel="{" /> + latin:keyLabel="{" /> <Key - android:keyLabel="}" - android:keyEdgeFlags="right" /> + latin:keyLabel="}" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:codes="@integer/key_tab" - android:keyLabel="\u21E5" - android:keyEdgeFlags="left" /> + latin:keyStyle="nonSpecialBackgroundTabKeyStyle" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="£" /> + latin:keyLabel="£" /> <Key - android:keyLabel="¢" /> + latin:keyLabel="¢" /> <Key - android:keyLabel="€" /> + latin:keyLabel="€" /> <Key - android:keyLabel="°" /> + latin:keyLabel="°" /> <Key - android:keyLabel="^" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="↑↓←→" /> + latin:keyLabel="^" + latin:popupCharacters="↑,↓,←,→" /> <Key - android:keyLabel="_" /> + latin:keyLabel="_" /> <Key - android:keyLabel="=" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="≠≈∞" /> + latin:keyLabel="=" + latin:popupCharacters="≠,≈,∞" /> <Key - android:keyLabel="[" /> + latin:keyLabel="[" /> <Key - android:keyLabel="]" - android:keyEdgeFlags="right" /> + latin:keyLabel="]" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:codes="@integer/key_shift" - android:keyLabel="@string/label_alt_key" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="™" /> + latin:keyLabel="™" /> <Key - android:keyLabel="®" /> + latin:keyLabel="®" /> <Key - android:keyLabel="©" /> + latin:keyLabel="©" /> <Key - android:keyLabel="¶" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="§" /> + latin:keyLabel="¶" + latin:popupCharacters="§" /> <Key - android:keyLabel="\\" /> + latin:keyLabel="\\" /> <Key - android:keyLabel="<" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="≤«‹" /> + latin:keyLabel="<" + latin:popupCharacters="≤,«,‹" /> <Key - android:keyLabel=">" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="≥»›" /> + latin:keyLabel=">" + latin:popupCharacters="≥,»,›" /> <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_symbols" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_alpha_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="„" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="…" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_symbols_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_alpha_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:keyLabel="„" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="…" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> </Row> + <include latin:keyboardLayout="@xml/kbd_symbols_shift_row4" /> </Keyboard> diff --git a/java/res/xml/kbd_symbols_shift_black.xml b/java/res/xml/kbd_symbols_shift_black.xml deleted file mode 100644 index 52b67c3de..000000000 --- a/java/res/xml/kbd_symbols_shift_black.xml +++ /dev/null @@ -1,177 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="~" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="`" /> - <Key - android:keyLabel="|" /> - <Key - android:keyLabel="•" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="♪♥♠♦♣" /> - <Key - android:keyLabel="√" /> - <Key - android:keyLabel="π" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="Π" /> - <Key - android:keyLabel="÷" /> - <Key - android:keyLabel="×" /> - <Key - android:keyLabel="{" /> - <Key - android:keyLabel="}" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_tab" - android:keyLabel="\u21E5" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="£" /> - <Key - android:keyLabel="¢" /> - <Key - android:keyLabel="€" /> - <Key - android:keyLabel="°" /> - <Key - android:keyLabel="^" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="↑↓←→" /> - <Key - android:keyLabel="_" /> - <Key - android:keyLabel="=" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="≠≈∞" /> - <Key - android:keyLabel="[" /> - <Key - android:keyLabel="]" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_shift" - android:keyLabel="@string/label_alt_key" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="™" /> - <Key - android:keyLabel="®" /> - <Key - android:keyLabel="©" /> - <Key - android:keyLabel="¶" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="§" /> - <Key - android:keyLabel="\\" /> - <Key - android:keyLabel="<" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="≤«‹" /> - <Key - android:keyLabel=">" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="≥»›" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_symbols" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_alpha_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="„" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="…" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_symbols_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_alpha_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:keyLabel="„" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="…" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/kbd_symbols_shift_row4.xml b/java/res/xml/kbd_symbols_shift_row4.xml new file mode 100644 index 000000000..9159bab24 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_row4.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:rowEdgeFlags="bottom" + > + <switch> + <case + latin:hasSettingsKey="false" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="„" + latin:keyStyle="functionalKeyStyle" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="40%p" /> + <Key + latin:keyLabel="…" + latin:keyStyle="functionalKeyStyle" /> + <switch> + <case + latin:mode="im" + > + <Key + latin:keyStyle="smileyKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + </case> + <default> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + </default> + </switch> + </case> + <case + latin:hasSettingsKey="true" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="settingsKeyStyle" /> + <Key + latin:keyLabel="„" + latin:keyStyle="functionalKeyStyle" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="30%p" /> + <Key + latin:keyLabel="…" + latin:keyStyle="functionalKeyStyle" /> + <switch> + <case + latin:mode="im" + > + <Key + latin:keyStyle="smileyKeyStyle" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + </case> + <default> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + </default> + </switch> + </case> + </switch> + </Row> +</merge> diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml index e5654e96d..fc21a1295 100644 --- a/java/res/xml/method.xml +++ b/java/res/xml/method.xml @@ -20,7 +20,207 @@ <!-- The attributes in this XML file provide configuration information --> <!-- for the Input Method Manager. --> +<!-- Keyboard: en_US, cs, da, de, en_GB, es, es_US, fr, fr_CA, fr_CH, it, nb, nl, sr, sv --> +<!-- Voice: cs, da, de, en_AU, en_GB, en_IN, en_NZ, en_US, es, fr, it, ko, nl, ja, pl, pt, ru, tr, zh_CN, zh_TW --> +<!-- TODO: use <lang>_keyboard icon instead of a common keyboard icon. --> +<!-- TODO: use <lang>_mic icon instead of a common mic icon. --> +<!-- 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.LatinIMESettings" - android:isDefault="@bool/im_is_default" -/> + android:settingsActivity="com.android.inputmethod.latin.Settings" + android:isDefault="@bool/im_is_default"> + <subtype android:icon="@drawable/ic_subtype_keyboard_en_gb" + android:label="@string/subtype_mode_en_US_keyboard" + android:imeSubtypeLocale="en_US" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_mic_en_us" + android:label="@string/subtype_mode_en_US_voice" + android:imeSubtypeLocale="en_US" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_cs" + android:label="@string/subtype_mode_cs_keyboard" + android:imeSubtypeLocale="cs" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_mic_cs" + android:label="@string/subtype_mode_cs_voice" + android:imeSubtypeLocale="cs" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_da" + android:label="@string/subtype_mode_da_keyboard" + android:imeSubtypeLocale="da" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_de" + android:label="@string/subtype_mode_de_keyboard" + android:imeSubtypeLocale="de" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_mic_de" + android:label="@string/subtype_mode_de_voice" + android:imeSubtypeLocale="de" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_en_gb" + android:label="@string/subtype_mode_en_GB_keyboard" + android:imeSubtypeLocale="en_GB" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_mic_en_gb" + android:label="@string/subtype_mode_en_GB_voice" + android:imeSubtypeLocale="en_GB" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_mic_en_au" + android:label="@string/subtype_mode_en_AU_voice" + android:imeSubtypeLocale="en_AU" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_mic_en_in" + android:label="@string/subtype_mode_en_IN_voice" + android:imeSubtypeLocale="en_IN" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_mic_en_nz" + android:label="@string/subtype_mode_en_NZ_voice" + android:imeSubtypeLocale="en_NZ" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_es" + android:label="@string/subtype_mode_es_keyboard" + android:imeSubtypeLocale="es" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_mic_es" + android:label="@string/subtype_mode_es_voice" + android:imeSubtypeLocale="es" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_es_us" + android:label="@string/subtype_mode_es_US_keyboard" + android:imeSubtypeLocale="es_US" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_fr" + android:label="@string/subtype_mode_fr_keyboard" + android:imeSubtypeLocale="fr" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_mic_fr" + android:label="@string/subtype_mode_fr_voice" + android:imeSubtypeLocale="fr" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_fr_ca" + android:label="@string/subtype_mode_fr_CA_keyboard" + android:imeSubtypeLocale="fr_CA" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_fr_ch" + android:label="@string/subtype_mode_fr_CH_keyboard" + android:imeSubtypeLocale="fr_CH" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_it" + android:label="@string/subtype_mode_it_keyboard" + android:imeSubtypeLocale="it" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_mic_it" + android:label="@string/subtype_mode_it_voice" + android:imeSubtypeLocale="it" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_nb" + android:label="@string/subtype_mode_nb_keyboard" + android:imeSubtypeLocale="nb" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_nl" + android:label="@string/subtype_mode_nl_keyboard" + android:imeSubtypeLocale="nl" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_mic_nl" + android:label="@string/subtype_mode_nl_voice" + android:imeSubtypeLocale="nl" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_ru" + android:label="@string/subtype_mode_ru_keyboard" + android:imeSubtypeLocale="ru" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_sr" + android:label="@string/subtype_mode_sr_keyboard" + android:imeSubtypeLocale="sr" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard_sv" + android:label="@string/subtype_mode_sv_keyboard" + android:imeSubtypeLocale="sv" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_mic_ko" + android:label="@string/subtype_mode_ko_voice" + android:imeSubtypeLocale="ko" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_mic_ja" + android:label="@string/subtype_mode_ja_voice" + android:imeSubtypeLocale="ja" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_mic_pl" + android:label="@string/subtype_mode_pl_voice" + android:imeSubtypeLocale="pl" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_mic_pt" + android:label="@string/subtype_mode_pt_voice" + android:imeSubtypeLocale="pt" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_mic_ru" + android:label="@string/subtype_mode_ru_voice" + android:imeSubtypeLocale="ru" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_mic_tr" + android:label="@string/subtype_mode_tr_voice" + android:imeSubtypeLocale="tr" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_mic_zh_cn" + android:label="@string/subtype_mode_zh_CN_voice" + android:imeSubtypeLocale="zh_CN" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> + <subtype android:icon="@drawable/ic_subtype_mic_zh_tw" + android:label="@string/subtype_mode_zh_TW_voice" + android:imeSubtypeLocale="zh_TW" + android:imeSubtypeMode="voice" + android:imeSubtypeExtraValue="excludeFromLastInputMethod" + /> +</input-method> diff --git a/java/res/xml/popup_domains.xml b/java/res/xml/popup_domains.xml deleted file mode 100644 index 4e9789ff7..000000000 --- a/java/res/xml/popup_domains.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="15%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top|bottom" - > - <Key - android:keyLabel="@string/popular_domain_1" - android:keyOutputText="@string/popular_domain_1" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="@string/popular_domain_2" - android:keyOutputText="@string/popular_domain_2" /> - <Key - android:keyLabel="@string/popular_domain_3" - android:keyOutputText="@string/popular_domain_3" /> - <Key - android:keyLabel="@string/popular_domain_4" - android:keyOutputText="@string/popular_domain_4" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/popup_mic.xml b/java/res/xml/popup_mic.xml deleted file mode 100644 index 5bbd7dfa5..000000000 --- a/java/res/xml/popup_mic.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top|bottom" - > - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_voice" - android:keyIcon="@drawable/sym_keyboard_mic" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/popup_punctuation.xml b/java/res/xml/popup_punctuation.xml deleted file mode 100644 index c429e38bc..000000000 --- a/java/res/xml/popup_punctuation.xml +++ /dev/null @@ -1,68 +0,0 @@ -<?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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel=":" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="/" /> - <Key - android:keyLabel="&" /> - <Key - android:keyLabel="(" /> - <Key - android:keyLabel=")" /> - <Key - android:keyLabel="-" /> - <Key - android:keyLabel="+" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:rowEdgeFlags="bottom" - > - <Key - android:keyLabel=";" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="\@" /> - <Key - android:keyLabel="\'" /> - <Key - android:keyLabel=""" /> - <Key - android:keyLabel="\?" /> - <Key - android:keyLabel="!" /> - <Key - android:keyLabel="," - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/popup_smileys.xml b/java/res/xml/popup_smileys.xml deleted file mode 100644 index 1a14e1df1..000000000 --- a/java/res/xml/popup_smileys.xml +++ /dev/null @@ -1,89 +0,0 @@ -<?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. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="15%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyEdgeFlags="left" /> - <Key - android:keyLabel=":-(" - android:keyOutputText=":-( " /> - <Key - android:keyLabel=";-)" - android:keyOutputText=";-) " /> - <Key - android:keyLabel=":-P" - android:keyOutputText=":-P " /> - <Key - android:keyLabel="=-O" - android:keyOutputText="=-O " - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel=":-*" - android:keyOutputText=":-* " - android:keyEdgeFlags="left" /> - <Key - android:keyLabel=":O" - android:keyOutputText=":O " /> - <Key - android:keyLabel="B-)" - android:keyOutputText="B-) " /> - <Key - android:keyLabel=":-$" - android:keyOutputText=":-$ " /> - <Key - android:keyLabel=":-!" - android:keyOutputText=":-! " - android:keyEdgeFlags="right" /> - </Row> - <Row - android:rowEdgeFlags="bottom" - > - <Key - android:keyLabel=":-[" - android:keyOutputText=":-[ " - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="O:-)" - android:keyOutputText="O:-) " /> - <Key - android:keyLabel=":-\\" - android:keyOutputText=":-\\ " /> - <Key - android:keyLabel=":'(" - android:keyOutputText=":'( " /> - <Key - android:keyLabel=":-D" - android:keyOutputText=":-D " - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 9348e954a..9ea801ef7 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -4,9 +4,9 @@ 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. @@ -18,65 +18,68 @@ android:title="@string/english_ime_settings" android:key="english_ime_settings"> - <CheckBoxPreference - android:key="vibrate_on" - android:title="@string/vibrate_on_keypress" - android:persistent="true" - /> - - <CheckBoxPreference - android:key="sound_on" - android:title="@string/sound_on_keypress" - android:persistent="true" - /> - - <CheckBoxPreference - android:key="popup_on" - android:title="@string/popup_on_keypress" - android:persistent="true" - android:defaultValue="@bool/default_popup_preview" - /> - - <CheckBoxPreference - android:key="recorrection_enabled" - android:title="@string/prefs_enable_recorrection" - android:summary="@string/prefs_enable_recorrection_summary" - android:persistent="true" - android:defaultValue="@bool/default_recorrection_enabled" - /> + <PreferenceCategory + android:title="@string/general_category" + android:key="general_settings"> - <CheckBoxPreference - android:key="auto_cap" - android:title="@string/auto_cap" - android:persistent="true" - android:defaultValue="true" - /> + <CheckBoxPreference + android:key="auto_cap" + android:title="@string/auto_cap" + android:persistent="true" + android:defaultValue="true" + /> - <ListPreference - android:key="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" - /> + <CheckBoxPreference + android:key="vibrate_on" + android:title="@string/vibrate_on_keypress" + android:persistent="true" + /> - <ListPreference - android:key="voice_mode" - android:title="@string/voice_input" - android:persistent="true" - android:entryValues="@array/voice_input_modes_values" - android:entries="@array/voice_input_modes" - android:defaultValue="@string/voice_mode_main" - /> + <CheckBoxPreference + android:key="sound_on" + android:title="@string/sound_on_keypress" + android:persistent="true" + /> + <CheckBoxPreference + android:key="popup_on" + android:title="@string/popup_on_keypress" + android:persistent="true" + android:defaultValue="@bool/config_default_popup_preview" + /> - <PreferenceScreen - android:title="@string/language_selection_title" - android:summary="@string/language_selection_summary"> - <intent - android:action="com.android.inputmethod.latin.INPUT_LANGUAGE_SELECTION"/> - </PreferenceScreen> + <CheckBoxPreference + android:key="recorrection_enabled" + android:title="@string/prefs_enable_recorrection" + android:summary="@string/prefs_enable_recorrection_summary" + android:persistent="true" + android:defaultValue="@bool/default_recorrection_enabled" + /> + + <ListPreference + android:key="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" + /> + + <ListPreference + android:key="voice_mode" + android:title="@string/voice_input" + android:persistent="true" + android:entryValues="@array/voice_input_modes_values" + android:entries="@array/voice_input_modes" + android:defaultValue="@string/voice_mode_main" + /> + + <PreferenceScreen + android:key="subtype_settings" + android:title="@string/language_selection_title" + android:summary="@string/language_selection_summary" /> + + </PreferenceCategory> <PreferenceCategory android:title="@string/prediction_category" @@ -90,22 +93,40 @@ android:defaultValue="true" /> + <ListPreference + android:key="auto_correction_threshold" + android:title="@string/auto_correction" + android:summary="@string/auto_correction_summary" + android:persistent="true" + android:entryValues="@array/auto_correction_threshold_mode_indexes" + android:entries="@array/auto_correction_threshold_modes" + android:defaultValue="@string/auto_correction_threshold_mode_index_modest" + /> + + <ListPreference + android:key="show_suggestions_setting" + android:summary="@string/prefs_show_suggestions_summary" + android:title="@string/prefs_show_suggestions" + android:persistent="true" + android:entryValues="@array/prefs_suggestion_visibility_values" + android:entries="@array/prefs_suggestion_visibilities" + android:defaultValue="@string/prefs_suggestion_visibility_default_value" + /> + <CheckBoxPreference - android:key="show_suggestions" - android:title="@string/show_suggestions" - android:summary="@string/show_suggestions_summary" + android:key="bigram_suggestion" + android:title="@string/bigram_suggestion" + android:summary="@string/bigram_suggestion_summary" android:persistent="true" android:defaultValue="true" /> + </PreferenceCategory> - <CheckBoxPreference - android:key="auto_complete" - android:title="@string/auto_complete" - android:summary="@string/auto_complete_summary" - android:persistent="true" - android:defaultValue="@bool/enable_autocorrect" - android:dependency="show_suggestions" + <CheckBoxPreference + android:key="usability_study_mode" + android:title="@string/prefs_usability_study_mode" + android:persistent="true" + android:defaultValue="false" /> - </PreferenceCategory> </PreferenceScreen> diff --git a/java/res/xml/prefs_for_debug.xml b/java/res/xml/prefs_for_debug.xml index 8177d3c6a..2dad17148 100644 --- a/java/res/xml/prefs_for_debug.xml +++ b/java/res/xml/prefs_for_debug.xml @@ -32,7 +32,7 @@ android:persistent="true" android:entryValues="@array/keyboard_layout_modes_values" android:entries="@array/keyboard_layout_modes" - android:defaultValue="4" + android:defaultValue="@string/config_default_keyboard_theme_id" /> <CheckBoxPreference diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java new file mode 100644 index 000000000..35bafea80 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -0,0 +1,419 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import com.android.inputmethod.keyboard.KeyStyles.KeyStyle; +import com.android.inputmethod.keyboard.KeyboardParser.ParseException; +import com.android.inputmethod.latin.R; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.Xml; + +import java.util.ArrayList; + +/** + * Class for describing the position and characteristics of a single key in the keyboard. + */ +public class Key { + /** + * The key code (unicode or custom code) that this key generates. + */ + public final int mCode; + /** The unicode that this key generates in manual temporary upper case mode. */ + public final int mManualTemporaryUpperCaseCode; + + /** Label to display */ + public final CharSequence mLabel; + /** Option of the label */ + public final int mLabelOption; + + /** Icon to display instead of a label. Icon takes precedence over a label */ + private Drawable mIcon; + /** Preview version of the icon, for the preview popup */ + private Drawable mPreviewIcon; + /** Hint icon to display on the key in conjunction with the label */ + public final Drawable mHintIcon; + /** + * The hint icon to display on the key when keyboard is in manual temporary upper case + * mode. + */ + public final Drawable mManualTemporaryUpperCaseHintIcon; + + /** Width of the key, not including the gap */ + public final int mWidth; + /** Height of the key, not including the gap */ + public final int mHeight; + /** The horizontal gap before this key */ + public final int mGap; + /** Whether this key is sticky, i.e., a toggle key */ + public final boolean mSticky; + /** X coordinate of the key in the keyboard layout */ + public final int mX; + /** Y coordinate of the key in the keyboard layout */ + public final int mY; + /** Text to output when pressed. This can be multiple characters, like ".com" */ + public final CharSequence mOutputText; + /** Popup characters */ + public final CharSequence[] mPopupCharacters; + /** Popup keyboard maximum column number */ + public final int mMaxPopupColumn; + + /** + * Flags that specify the anchoring to edges of the keyboard for detecting touch events + * that are just out of the boundary of the key. This is a bit mask of + * {@link Keyboard#EDGE_LEFT}, {@link Keyboard#EDGE_RIGHT}, + * {@link Keyboard#EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM}. + */ + public final int mEdgeFlags; + /** Whether this is a modifier key, such as Shift or Alt */ + public final boolean mModifier; + /** 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 */ + public boolean mPressed; + /** If this is a sticky key, is it on? */ + public boolean mOn; + + private final static int[] KEY_STATE_NORMAL_ON = { + android.R.attr.state_checkable, + android.R.attr.state_checked + }; + + private final static int[] KEY_STATE_PRESSED_ON = { + android.R.attr.state_pressed, + android.R.attr.state_checkable, + android.R.attr.state_checked + }; + + private final static int[] KEY_STATE_NORMAL_OFF = { + android.R.attr.state_checkable + }; + + private final static int[] KEY_STATE_PRESSED_OFF = { + android.R.attr.state_pressed, + android.R.attr.state_checkable + }; + + private final static int[] KEY_STATE_NORMAL = { + }; + + private final static int[] KEY_STATE_PRESSED = { + android.R.attr.state_pressed + }; + + // functional normal state (with properties) + private static final int[] KEY_STATE_FUNCTIONAL_NORMAL = { + android.R.attr.state_single + }; + + // functional pressed state (with properties) + private static final int[] KEY_STATE_FUNCTIONAL_PRESSED = { + android.R.attr.state_single, + android.R.attr.state_pressed + }; + + /** + * This constructor is being used only for key in mini popup keyboard. + */ + public Key(Resources res, Keyboard keyboard, CharSequence popupCharacter, int x, int y, + int width, int edgeFlags) { + mKeyboard = keyboard; + mHeight = keyboard.getRowHeight() - keyboard.getVerticalGap(); + mGap = keyboard.getHorizontalGap(); + mWidth = width - mGap; + mEdgeFlags = edgeFlags; + mHintIcon = null; + mManualTemporaryUpperCaseHintIcon = null; + mManualTemporaryUpperCaseCode = Keyboard.CODE_DUMMY; + mLabelOption = 0; + mModifier = false; + mSticky = false; + mRepeatable = false; + mPopupCharacters = null; + mMaxPopupColumn = 0; + final String popupSpecification = popupCharacter.toString(); + mLabel = PopupCharactersParser.getLabel(popupSpecification); + mOutputText = PopupCharactersParser.getOutputText(popupSpecification); + mCode = PopupCharactersParser.getCode(res, popupSpecification); + mIcon = PopupCharactersParser.getIcon(res, popupSpecification); + // Horizontal gap is divided equally to both sides of the key. + mX = x + mGap / 2; + mY = y; + } + + /** + * 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 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 + */ + public Key(Resources res, Row row, int x, int y, XmlResourceParser parser, + KeyStyles keyStyles) { + mKeyboard = row.getKeyboard(); + + final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard); + try { + mHeight = KeyboardParser.getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_rowHeight, + mKeyboard.getKeyboardHeight(), row.mDefaultHeight) - row.mVerticalGap; + mGap = KeyboardParser.getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_horizontalGap, + mKeyboard.getDisplayWidth(), row.mDefaultHorizontalGap); + mWidth = KeyboardParser.getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_keyWidth, + mKeyboard.getDisplayWidth(), row.mDefaultWidth) - mGap; + } finally { + keyboardAttr.recycle(); + } + + // Horizontal gap is divided equally to both sides of the key. + this.mX = x + mGap / 2; + this.mY = y; + + final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_Key); + try { + final KeyStyle style; + if (keyAttr.hasValue(R.styleable.Keyboard_Key_keyStyle)) { + String styleName = keyAttr.getString(R.styleable.Keyboard_Key_keyStyle); + style = keyStyles.getKeyStyle(styleName); + if (style == null) + throw new ParseException("Unknown key style: " + styleName, parser); + } else { + style = keyStyles.getEmptyKeyStyle(); + } + + final CharSequence[] popupCharacters = style.getTextArray(keyAttr, + R.styleable.Keyboard_Key_popupCharacters); + if (res.getBoolean(R.bool.config_digit_popup_characters_enabled)) { + mPopupCharacters = popupCharacters; + } else { + mPopupCharacters = filterOutDigitPopupCharacters(popupCharacters); + } + mMaxPopupColumn = style.getInt(keyboardAttr, + R.styleable.Keyboard_Key_maxPopupKeyboardColumn, + mKeyboard.getMaxPopupKeyboardColumn()); + + mRepeatable = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable, false); + mModifier = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isModifier, false); + mSticky = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky, false); + mEdgeFlags = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyEdgeFlags, 0) + | row.mRowEdgeFlags; + + mPreviewIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_iconPreview); + Keyboard.setDefaultBounds(mPreviewIcon); + mIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_keyIcon); + Keyboard.setDefaultBounds(mIcon); + mHintIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_keyHintIcon); + Keyboard.setDefaultBounds(mHintIcon); + mManualTemporaryUpperCaseHintIcon = style.getDrawable(keyAttr, + R.styleable.Keyboard_Key_manualTemporaryUpperCaseHintIcon); + Keyboard.setDefaultBounds(mManualTemporaryUpperCaseHintIcon); + + mLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyLabel); + mLabelOption = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption, 0); + mManualTemporaryUpperCaseCode = style.getInt(keyAttr, + R.styleable.Keyboard_Key_manualTemporaryUpperCaseCode, Keyboard.CODE_DUMMY); + mOutputText = style.getText(keyAttr, R.styleable.Keyboard_Key_keyOutputText); + // Choose the first letter of the label as primary code if not + // specified. + 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); + } else if (code != Keyboard.CODE_UNSPECIFIED) { + mCode = code; + } else { + mCode = Keyboard.CODE_DUMMY; + } + + final Drawable shiftedIcon = style.getDrawable(keyAttr, + R.styleable.Keyboard_Key_shiftedIcon); + if (shiftedIcon != null) + mKeyboard.getShiftedIcons().put(this, shiftedIcon); + } finally { + keyAttr.recycle(); + } + } + + private static boolean isDigitPopupCharacter(CharSequence label) { + return label.length() == 1 && Character.isDigit(label.charAt(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 Drawable getIcon() { + return mIcon; + } + + public Drawable getPreviewIcon() { + return mPreviewIcon; + } + + public void setIcon(Drawable icon) { + mIcon = icon; + } + + public void setPreviewIcon(Drawable icon) { + mPreviewIcon = icon; + } + + /** + * Informs the key that it has been pressed, in case it needs to change its appearance or + * state. + * @see #onReleased(boolean) + */ + public void onPressed() { + mPressed = !mPressed; + } + + /** + * Changes the pressed state of the key. If it is a sticky key, it will also change the + * toggled state of the key if the finger was release inside. + * @param inside whether the finger was released inside the key + * @see #onPressed() + */ + public void onReleased(boolean inside) { + mPressed = !mPressed; + if (mSticky && !mKeyboard.isShiftLockEnabled(this)) + mOn = !mOn; + } + + public boolean isInside(int x, int y) { + return mKeyboard.isInside(this, x, y); + } + + /** + * Detects if a point falls on this key. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return whether or not the point falls on the key. If the key is attached to an edge, it will + * 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 flags = mEdgeFlags; + 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 = this.mX; + final int right = left + this.mWidth; + final int top = this.mY; + final int bottom = top + this.mHeight; + return (x >= left || leftEdge) && (x < right || rightEdge) + && (y >= top || topEdge) && (y < bottom || bottomEdge); + } + + /** + * Returns the square of the distance to the nearest edge of the key and the given point. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return the square of the distance of the point from the nearest edge of the key + */ + public int squaredDistanceToEdge(int x, int y) { + final int left = this.mX; + final int right = left + this.mWidth; + final int top = this.mY; + final int bottom = top + this.mHeight; + final int edgeX = x < left ? left : (x > right ? right : x); + final int edgeY = y < top ? top : (y > bottom ? bottom : y); + final int dx = x - edgeX; + final int dy = y - edgeY; + return dx * dx + dy * dy; + } + + // sticky is used for shift key. If a key is not sticky and is modifier, + // the key will be treated as functional. + private boolean isFunctionalKey() { + return !mSticky && mModifier; + } + + /** + * Returns the drawable state for the key, based on the current state and type of the key. + * @return the drawable state of the key. + * @see android.graphics.drawable.StateListDrawable#setState(int[]) + */ + public int[] getCurrentDrawableState() { + if (isFunctionalKey()) { + if (mPressed) { + return KEY_STATE_FUNCTIONAL_PRESSED; + } else { + return KEY_STATE_FUNCTIONAL_NORMAL; + } + } + + int[] states = KEY_STATE_NORMAL; + + if (mOn) { + if (mPressed) { + states = KEY_STATE_PRESSED_ON; + } else { + states = KEY_STATE_NORMAL_ON; + } + } else { + if (mSticky) { + if (mPressed) { + states = KEY_STATE_PRESSED_OFF; + } else { + states = KEY_STATE_NORMAL_OFF; + } + } else { + if (mPressed) { + states = KEY_STATE_PRESSED; + } + } + } + return states; + } +} diff --git a/java/src/com/android/inputmethod/latin/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java index 76fe1200e..e7a9d8513 100644 --- a/java/src/com/android/inputmethod/latin/KeyDetector.java +++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java @@ -14,15 +14,14 @@ * the License. */ -package com.android.inputmethod.latin; - -import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; +package com.android.inputmethod.keyboard; import java.util.Arrays; import java.util.List; -abstract class KeyDetector { +public abstract class KeyDetector { + public static final int NOT_A_KEY = -1; + protected Keyboard mKeyboard; private Key[] mKeys; @@ -80,12 +79,11 @@ abstract class KeyDetector { * * @return Allocates and returns an array that can hold all key indices returned by * {@link #getKeyIndexAndNearbyCodes} method. All elements in the returned array are - * initialized by {@link com.android.inputmethod.latin.LatinKeyboardView.NOT_A_KEY} - * value. + * initialized by {@link #NOT_A_KEY} value. */ public int[] newCodeArray() { int[] codes = new int[getMaxNearbyKeys()]; - Arrays.fill(codes, LatinKeyboardBaseView.NOT_A_KEY); + Arrays.fill(codes, NOT_A_KEY); return codes; } diff --git a/java/src/com/android/inputmethod/keyboard/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/KeyStyles.java new file mode 100644 index 000000000..44ec53181 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyStyles.java @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import com.android.inputmethod.keyboard.KeyboardParser.ParseException; +import com.android.inputmethod.latin.R; + +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.graphics.drawable.Drawable; +import android.util.Log; + +import java.util.ArrayList; +import java.util.HashMap; + +public class KeyStyles { + private static final String TAG = "KeyStyles"; + private static final boolean DEBUG = false; + + private final HashMap<String, DeclaredKeyStyle> mStyles = + new HashMap<String, DeclaredKeyStyle>(); + private static final KeyStyle EMPTY_KEY_STYLE = new EmptyKeyStyle(); + + public interface KeyStyle { + public CharSequence[] getTextArray(TypedArray a, int index); + public Drawable getDrawable(TypedArray a, int index); + public CharSequence getText(TypedArray a, int index); + public int getInt(TypedArray a, int index, int defaultValue); + public int getFlag(TypedArray a, int index, int defaultValue); + public boolean getBoolean(TypedArray a, int index, boolean defaultValue); + } + + /* package */ static class EmptyKeyStyle implements KeyStyle { + private EmptyKeyStyle() { + // Nothing to do. + } + + @Override + public CharSequence[] getTextArray(TypedArray a, int index) { + return parseTextArray(a, index); + } + + @Override + public Drawable getDrawable(TypedArray a, int index) { + return a.getDrawable(index); + } + + @Override + public CharSequence getText(TypedArray a, int index) { + return a.getText(index); + } + + @Override + public int getInt(TypedArray a, int index, int defaultValue) { + return a.getInt(index, defaultValue); + } + + @Override + public int getFlag(TypedArray a, int index, int defaultValue) { + return a.getInt(index, defaultValue); + } + + @Override + public boolean getBoolean(TypedArray a, int index, boolean defaultValue) { + return a.getBoolean(index, defaultValue); + } + + protected static CharSequence[] parseTextArray(TypedArray a, int index) { + if (!a.hasValue(index)) + return null; + final CharSequence text = a.getText(index); + return parseCsvText(text); + } + + /* package */ static CharSequence[] parseCsvText(CharSequence text) { + final int size = text.length(); + if (size == 0) return null; + if (size == 1) return new CharSequence[] { text }; + final StringBuilder sb = new StringBuilder(); + ArrayList<CharSequence> list = null; + int start = 0; + for (int pos = 0; pos < size; pos++) { + final char c = text.charAt(pos); + if (c == ',') { + if (list == null) list = new ArrayList<CharSequence>(); + if (sb.length() == 0) { + list.add(text.subSequence(start, pos)); + } else { + list.add(sb.toString()); + sb.setLength(0); + } + start = pos + 1; + continue; + } else if (c == '\\') { + if (start == pos) { + // Skip escape character at the beginning of the value. + start++; + pos++; + } else { + if (start < pos && sb.length() == 0) + sb.append(text.subSequence(start, pos)); + pos++; + if (pos < size) + sb.append(text.charAt(pos)); + } + } else if (sb.length() > 0) { + sb.append(c); + } + } + if (list == null) { + return new CharSequence[] { sb.length() > 0 ? sb : text.subSequence(start, size) }; + } else { + list.add(sb.length() > 0 ? sb : text.subSequence(start, size)); + return list.toArray(new CharSequence[list.size()]); + } + } + } + + private static class DeclaredKeyStyle extends EmptyKeyStyle { + private final HashMap<Integer, Object> mAttributes = new HashMap<Integer, Object>(); + + @Override + public CharSequence[] getTextArray(TypedArray a, int index) { + return a.hasValue(index) + ? super.getTextArray(a, index) : (CharSequence[])mAttributes.get(index); + } + + @Override + public Drawable getDrawable(TypedArray a, int index) { + return a.hasValue(index) + ? super.getDrawable(a, index) : (Drawable)mAttributes.get(index); + } + + @Override + public CharSequence getText(TypedArray a, int index) { + return a.hasValue(index) + ? super.getText(a, index) : (CharSequence)mAttributes.get(index); + } + + @Override + public int getInt(TypedArray a, int index, int defaultValue) { + final Integer value = (Integer)mAttributes.get(index); + return super.getInt(a, index, (value != null) ? value : defaultValue); + } + + @Override + public int getFlag(TypedArray a, int index, int defaultValue) { + final Integer value = (Integer)mAttributes.get(index); + return super.getFlag(a, index, defaultValue) | (value != null ? value : 0); + } + + @Override + public boolean getBoolean(TypedArray a, int index, boolean defaultValue) { + final Boolean value = (Boolean)mAttributes.get(index); + return super.getBoolean(a, index, (value != null) ? value : defaultValue); + } + + private DeclaredKeyStyle() { + super(); + } + + private void parseKeyStyleAttributes(TypedArray keyAttr) { + // TODO: Currently not all Key attributes can be declared as style. + readInt(keyAttr, R.styleable.Keyboard_Key_code); + readText(keyAttr, R.styleable.Keyboard_Key_keyLabel); + readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption); + readTextArray(keyAttr, R.styleable.Keyboard_Key_popupCharacters); + readInt(keyAttr, R.styleable.Keyboard_Key_maxPopupKeyboardColumn); + readText(keyAttr, R.styleable.Keyboard_Key_keyOutputText); + readDrawable(keyAttr, R.styleable.Keyboard_Key_keyIcon); + readDrawable(keyAttr, R.styleable.Keyboard_Key_iconPreview); + readDrawable(keyAttr, R.styleable.Keyboard_Key_keyHintIcon); + readDrawable(keyAttr, R.styleable.Keyboard_Key_shiftedIcon); + readBoolean(keyAttr, R.styleable.Keyboard_Key_isModifier); + readBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky); + readBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable); + } + + private void readDrawable(TypedArray a, int index) { + if (a.hasValue(index)) + mAttributes.put(index, a.getDrawable(index)); + } + + private void readText(TypedArray a, int index) { + if (a.hasValue(index)) + mAttributes.put(index, a.getText(index)); + } + + private void readInt(TypedArray a, int index) { + if (a.hasValue(index)) + mAttributes.put(index, a.getInt(index, 0)); + } + + private void readFlag(TypedArray a, int index) { + final Integer value = (Integer)mAttributes.get(index); + if (a.hasValue(index)) + mAttributes.put(index, a.getInt(index, 0) | (value != null ? value : 0)); + } + + private void readBoolean(TypedArray a, int index) { + if (a.hasValue(index)) + mAttributes.put(index, a.getBoolean(index, false)); + } + + private void readTextArray(TypedArray a, int index) { + final CharSequence[] value = parseTextArray(a, index); + if (value != null) + mAttributes.put(index, value); + } + + private void addParent(DeclaredKeyStyle parentStyle) { + mAttributes.putAll(parentStyle.mAttributes); + } + } + + public void parseKeyStyleAttributes(TypedArray keyStyleAttr, TypedArray keyAttrs, + XmlResourceParser parser) { + String styleName = keyStyleAttr.getString(R.styleable.Keyboard_KeyStyle_styleName); + if (DEBUG) Log.d(TAG, String.format("<%s styleName=%s />", + KeyboardParser.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( + R.styleable.Keyboard_KeyStyle_parentStyle); + final DeclaredKeyStyle parent = mStyles.get(parentStyle); + if (parent == null) + throw new ParseException("Unknown parentStyle " + parent, parser); + style.addParent(parent); + } + style.parseKeyStyleAttributes(keyAttrs); + mStyles.put(styleName, style); + } + + public KeyStyle getKeyStyle(String styleName) { + return mStyles.get(styleName); + } + + public KeyStyle getEmptyKeyStyle() { + return EMPTY_KEY_STYLE; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java new file mode 100644 index 000000000..863421f18 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java @@ -0,0 +1,428 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import com.android.inputmethod.latin.R; + +import org.xmlpull.v1.XmlPullParserException; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.util.Log; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +/** + * Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard + * consists of rows of keys. + * <p>The layout file for a keyboard contains XML that looks like the following snippet:</p> + * <pre> + * <Keyboard + * latin:keyWidth="%10p" + * latin:keyHeight="50px" + * latin:horizontalGap="2px" + * latin:verticalGap="2px" > + * <Row latin:keyWidth="32px" > + * <Key latin:keyLabel="A" /> + * ... + * </Row> + * ... + * </Keyboard> + * </pre> + */ +public class Keyboard { + private static final String TAG = "Keyboard"; + + public static final int EDGE_LEFT = 0x01; + public static final int EDGE_RIGHT = 0x02; + public static final int EDGE_TOP = 0x04; + public static final int EDGE_BOTTOM = 0x08; + + /** Some common keys code. These should be aligned with values/keycodes.xml */ + public static final int CODE_ENTER = '\n'; + public static final int CODE_TAB = '\t'; + public static final int CODE_SPACE = ' '; + public static final int CODE_PERIOD = '.'; + + /** Special keys code. These should be aligned with values/keycodes.xml */ + public static final int CODE_DUMMY = 0; + public static final int CODE_SHIFT = -1; + public static final int CODE_SWITCH_ALPHA_SYMBOL = -2; + public static final int CODE_CANCEL = -3; + public static final int CODE_DONE = -4; + public static final int CODE_DELETE = -5; + public static final int CODE_ALT = -6; + // Code value representing the code is not specified. + public static final int CODE_UNSPECIFIED = -99; + public static final int CODE_SETTINGS = -100; + public static final int CODE_SETTINGS_LONGPRESS = -101; + // TODO: remove this once LatinIME stops referring to this. + public static final int CODE_VOICE = -102; + public static final int CODE_CAPSLOCK = -103; + public static final int CODE_NEXT_LANGUAGE = -104; + public static final int CODE_PREV_LANGUAGE = -105; + + /** 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(); + + /** Space key and its icons */ + protected Key mSpaceKey; + protected Drawable mSpaceIcon; + protected Drawable mSpacePreviewIcon; + + /** 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; + + /** List of keys in this keyboard */ + private final List<Key> mKeys = new ArrayList<Key>(); + + /** Width of the screen available to fit the keyboard */ + private final int mDisplayWidth; + + /** Height of the screen */ + private final int mDisplayHeight; + + /** Height of keyboard */ + private int mKeyboardHeight; + + public final KeyboardId mId; + + // Variables for pre-computing nearest keys. + + public final int GRID_WIDTH; + public final int GRID_HEIGHT; + private final int GRID_SIZE; + private int mCellWidth; + private int mCellHeight; + private int[][] mGridNeighbors; + private int mProximityThreshold; + private static int[] EMPTY_INT_ARRAY = new int[0]; + /** Number of key widths from current touch point to search for nearest keys. */ + private static float SEARCH_DISTANCE = 1.2f; + + /** + * 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 + */ + public Keyboard(Context context, int xmlLayoutResId, KeyboardId id) { + this(context, xmlLayoutResId, id, + context.getResources().getDisplayMetrics().widthPixels, + context.getResources().getDisplayMetrics().heightPixels); + } + + private Keyboard(Context context, int xmlLayoutResId, KeyboardId id, int width, + int height) { + Resources res = context.getResources(); + GRID_WIDTH = res.getInteger(R.integer.config_keyboard_grid_width); + GRID_HEIGHT = res.getInteger(R.integer.config_keyboard_grid_height); + GRID_SIZE = GRID_WIDTH * GRID_HEIGHT; + + mDisplayWidth = width; + mDisplayHeight = height; + + mDefaultHorizontalGap = 0; + setKeyWidth(mDisplayWidth / 10); + mDefaultVerticalGap = 0; + mDefaultHeight = mDefaultWidth; + mId = id; + loadKeyboard(context, xmlLayoutResId); + } + + 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; + final int threshold = (int) (width * SEARCH_DISTANCE); + mProximityThreshold = threshold * threshold; + } + + /** + * 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; + } + + public int getKeyboardHeight() { + return mKeyboardHeight; + } + + 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 setShiftLocked(boolean newShiftLockState) { + final Map<Key, Drawable> shiftedIcons = getShiftedIcons(); + for (final Key key : getShiftKeys()) { + key.mOn = newShiftLockState; + key.setIcon(newShiftLockState ? shiftedIcons.get(key) : mNormalShiftIcons.get(key)); + } + mShiftState.setShiftLocked(newShiftLockState); + return true; + } + + public boolean isShiftLocked() { + return mShiftState.isShiftLocked(); + } + + public boolean setShifted(boolean newShiftState) { + final Map<Key, Drawable> shiftedIcons = getShiftedIcons(); + for (final Key key : getShiftKeys()) { + if (!newShiftState && !mShiftState.isShiftLocked()) { + key.setIcon(mNormalShiftIcons.get(key)); + } else if (newShiftState && !mShiftState.isShiftedOrShiftLocked()) { + key.setIcon(shiftedIcons.get(key)); + } + } + return mShiftState.setShifted(newShiftState); + } + + public boolean isShiftedOrShiftLocked() { + return mShiftState.isShiftedOrShiftLocked(); + } + + public void setAutomaticTemporaryUpperCase() { + setShifted(true); + mShiftState.setAutomaticTemporaryUpperCase(); + } + + public boolean isAutomaticTemporaryUpperCase() { + return isAlphaKeyboard() && mShiftState.isAutomaticTemporaryUpperCase(); + } + + public boolean isManualTemporaryUpperCase() { + return isAlphaKeyboard() && mShiftState.isManualTemporaryUpperCase(); + } + + public boolean isManualTemporaryUpperCaseFromAuto() { + return isAlphaKeyboard() && mShiftState.isManualTemporaryUpperCaseFromAuto(); + } + + public KeyboardShiftState getKeyboardShiftState() { + return mShiftState; + } + + public boolean isAlphaKeyboard() { + return mId != null && mId.isAlphabetKeyboard(); + } + + public boolean isPhoneKeyboard() { + return mId != null && mId.isPhoneKeyboard(); + } + + public boolean isNumberKeyboard() { + return mId != null && mId.isNumberKeyboard(); + } + + public void setSpaceKey(Key space) { + mSpaceKey = space; + mSpaceIcon = space.getIcon(); + mSpacePreviewIcon = space.getPreviewIcon(); + } + + private void computeNearestNeighbors() { + // Round-up so we don't have any pixels outside the grid + mCellWidth = (getMinWidth() + GRID_WIDTH - 1) / GRID_WIDTH; + mCellHeight = (getHeight() + GRID_HEIGHT - 1) / GRID_HEIGHT; + mGridNeighbors = new int[GRID_SIZE][]; + final int[] indices = new int[mKeys.size()]; + final int gridWidth = GRID_WIDTH * mCellWidth; + final int gridHeight = GRID_HEIGHT * mCellHeight; + final int threshold = mProximityThreshold; + for (int x = 0; x < gridWidth; x += mCellWidth) { + for (int y = 0; y < gridHeight; y += mCellHeight) { + final int centerX = x + mCellWidth / 2; + final int centerY = y + mCellHeight / 2; + int count = 0; + for (int i = 0; i < mKeys.size(); i++) { + final Key key = mKeys.get(i); + if (key.squaredDistanceToEdge(centerX, centerY) < threshold) + indices[count++] = i; + } + final int[] cell = new int[count]; + System.arraycopy(indices, 0, cell, 0, count); + mGridNeighbors[(y / mCellHeight) * GRID_WIDTH + (x / mCellWidth)] = cell; + } + } + } + + public boolean isInside(Key key, int x, int y) { + return key.isOnKey(x, y); + } + + /** + * Returns the indices of the keys that are closest to the given point. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return the array of integer indices for the nearest keys to the given point. If the given + * point is out of range, then an array of size zero is returned. + */ + public int[] getNearestKeys(int x, int y) { + if (mGridNeighbors == null) computeNearestNeighbors(); + if (x >= 0 && x < getMinWidth() && y >= 0 && y < getHeight()) { + int index = (y / mCellHeight) * GRID_WIDTH + (x / mCellWidth); + if (index < GRID_SIZE) { + return mGridNeighbors[index]; + } + } + return EMPTY_INT_ARRAY; + } + + private void loadKeyboard(Context context, int xmlLayoutResId) { + try { + KeyboardParser parser = new KeyboardParser(this, context.getResources()); + 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); + } + } + + protected 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 new file mode 100644 index 000000000..734a55a79 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +public interface KeyboardActionListener { + + /** + * Called when the user presses a key. This is sent before the {@link #onCodeInput} is called. + * For keys that repeat, this is only called once. + * + * @param primaryCode the unicode of the key being pressed. If the touch is not on a valid key, + * the value will be zero. + */ + public void onPress(int primaryCode); + + /** + * Called when the user releases a key. This is sent after the {@link #onCodeInput} is called. + * For keys that repeat, this is only called once. + * + * @param primaryCode the code of the key that was released + */ + public void onRelease(int primaryCode); + + /** + * Send a key code to the listener. + * + * @param primaryCode this is the code of the key that was pressed + * @param keyCodes the codes for all the possible alternative keys with the primary code being + * the first. If the primary key code is a single character such as an alphabet or + * number or symbol, the alternatives will include other characters that may be on + * the same key or adjacent keys. These codes are useful to correct for accidental + * presses of a key adjacent to the intended key. + * @param x x-coordinate pixel of touched event. If {@link #onCodeInput} is not called by + * {@link PointerTracker#onTouchEvent} or so, the value should be + * {@link #NOT_A_TOUCH_COORDINATE}. + * @param y y-coordinate pixel of touched event. If {@link #onCodeInput} is not called by + * {@link PointerTracker#onTouchEvent} or so, the value should be + * {@link #NOT_A_TOUCH_COORDINATE}. + */ + public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y); + + public static final int NOT_A_TOUCH_COORDINATE = -1; + + /** + * Sends a sequence of characters to the listener. + * + * @param text the sequence of characters to be displayed. + */ + public void onTextInput(CharSequence text); + + /** + * Called when user released a finger outside any key. + */ + public void onCancelInput(); + + /** + * Called when the user quickly moves the finger from up to down. + */ + public void onSwipeDown(); +} diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java new file mode 100644 index 000000000..db86740c3 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import com.android.inputmethod.latin.R; + +import android.view.inputmethod.EditorInfo; + +import java.util.Arrays; +import java.util.Locale; + +/** + * Represents the parameters necessary to construct a new LatinKeyboard, + * which also serve as a unique identifier for each keyboard type. + */ +public class KeyboardId { + public static final int MODE_TEXT = 0; + public static final int MODE_URL = 1; + public static final int MODE_EMAIL = 2; + public static final int MODE_IM = 3; + public static final int MODE_WEB = 4; + public static final int MODE_PHONE = 5; + public static final int MODE_NUMBER = 6; + + public final Locale mLocale; + public final int mOrientation; + public final int mMode; + public final int mXmlId; + public final int mColorScheme; + public final boolean mHasSettingsKey; + public final boolean mVoiceKeyEnabled; + public final boolean mHasVoiceKey; + public final int mImeOptions; + public final boolean mEnableShiftLock; + public final String mXmlName; + + private final int mHashCode; + + public KeyboardId(String xmlName, int xmlId, Locale locale, int orientation, int mode, + int colorScheme, boolean hasSettingsKey, boolean voiceKeyEnabled, boolean hasVoiceKey, + int imeOptions, boolean enableShiftLock) { + this.mLocale = locale; + this.mOrientation = orientation; + this.mMode = mode; + this.mXmlId = xmlId; + this.mColorScheme = colorScheme; + this.mHasSettingsKey = hasSettingsKey; + this.mVoiceKeyEnabled = voiceKeyEnabled; + this.mHasVoiceKey = hasVoiceKey; + // We are interested only in IME_MASK_ACTION enum value and IME_FLAG_NO_ENTER_ACTION. + this.mImeOptions = imeOptions + & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION); + this.mEnableShiftLock = enableShiftLock; + this.mXmlName = xmlName; + + this.mHashCode = Arrays.hashCode(new Object[] { + locale, + orientation, + mode, + xmlId, + colorScheme, + hasSettingsKey, + voiceKeyEnabled, + hasVoiceKey, + imeOptions, + enableShiftLock, + }); + } + + public int getXmlId() { + return mXmlId; + } + + public boolean isAlphabetKeyboard() { + return mXmlId == R.xml.kbd_qwerty; + } + + public boolean isSymbolsKeyboard() { + return mXmlId == R.xml.kbd_symbols; + } + + public boolean isPhoneKeyboard() { + return mMode == MODE_PHONE; + } + + public boolean isNumberKeyboard() { + return mMode == MODE_NUMBER; + } + + @Override + public boolean equals(Object other) { + return other instanceof KeyboardId && equals((KeyboardId) other); + } + + boolean equals(KeyboardId other) { + return other.mLocale.equals(this.mLocale) + && other.mOrientation == this.mOrientation + && other.mMode == this.mMode + && other.mXmlId == this.mXmlId + && other.mColorScheme == this.mColorScheme + && other.mHasSettingsKey == this.mHasSettingsKey + && other.mVoiceKeyEnabled == this.mVoiceKeyEnabled + && other.mHasVoiceKey == this.mHasVoiceKey + && other.mImeOptions == this.mImeOptions + && other.mEnableShiftLock == this.mEnableShiftLock; + } + + @Override + public int hashCode() { + return mHashCode; + } + + @Override + public String toString() { + return String.format("[%s.xml %s %s %s imeOptions=%s %s%s%s%s%s]", + mXmlName, + mLocale, + (mOrientation == 1 ? "port" : "land"), + modeName(mMode), + imeOptionsName(mImeOptions), + colorSchemeName(mColorScheme), + (mHasSettingsKey ? " hasSettingsKey" : ""), + (mVoiceKeyEnabled ? " voiceKeyEnabled" : ""), + (mHasVoiceKey ? " hasVoiceKey" : ""), + (mEnableShiftLock ? " enableShiftLock" : "")); + } + + public static String modeName(int mode) { + switch (mode) { + case MODE_TEXT: return "text"; + case MODE_URL: return "url"; + case MODE_EMAIL: return "email"; + case MODE_IM: return "im"; + case MODE_WEB: return "web"; + case MODE_PHONE: return "phone"; + case MODE_NUMBER: return "number"; + } + return null; + } + + public static String colorSchemeName(int colorScheme) { + switch (colorScheme) { + case KeyboardView.COLOR_SCHEME_WHITE: return "white"; + case KeyboardView.COLOR_SCHEME_BLACK: return "black"; + } + return null; + } + + public static String imeOptionsName(int imeOptions) { + if (imeOptions == -1) return null; + final int actionNo = imeOptions & EditorInfo.IME_MASK_ACTION; + final String action; + switch (actionNo) { + case EditorInfo.IME_ACTION_UNSPECIFIED: action = "actionUnspecified"; break; + case EditorInfo.IME_ACTION_NONE: action = "actionNone"; break; + case EditorInfo.IME_ACTION_GO: action = "actionGo"; break; + case EditorInfo.IME_ACTION_SEARCH: action = "actionSearch"; break; + case EditorInfo.IME_ACTION_SEND: action = "actionSend"; break; + case EditorInfo.IME_ACTION_DONE: action = "actionDone"; break; + case EditorInfo.IME_ACTION_PREVIOUS: action = "actionPrevious"; break; + default: action = "actionUnknown(" + actionNo + ")"; break; + } + if ((imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) { + return "flagNoEnterAction|" + action; + } else { + return action; + } + } +} + diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java new file mode 100644 index 000000000..c41d57075 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java @@ -0,0 +1,580 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import com.android.inputmethod.latin.R; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.util.Log; +import android.util.TypedValue; +import android.util.Xml; +import android.view.InflateException; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * Parser for BaseKeyboard. + * + * This class parses Keyboard XML file and fill out keys in Keyboard. + * The Keyboard XML file looks like: + * <pre> + * >!-- xml/keyboard.xml --< + * >Keyboard keyboard_attributes*< + * >!-- Keyboard Content --< + * >Row row_attributes*< + * >!-- Row Content --< + * >Key key_attributes* /< + * >Spacer horizontalGap="0.2in" /< + * >include keyboardLayout="@xml/other_keys"< + * ... + * >/Row< + * >include keyboardLayout="@xml/other_rows"< + * ... + * >/Keyboard< + * </pre> + * The XML file which is included in other file must have >merge< as root element, such as: + * <pre> + * >!-- xml/other_keys.xml --< + * >merge< + * >Key key_attributes* /< + * ... + * >/merge< + * </pre> + * and + * <pre> + * >!-- xml/other_rows.xml --< + * >merge< + * >Row row_attributes*< + * >Key key_attributes* /< + * >/Row< + * ... + * >/merge< + * </pre> + * You can also use switch-case-default tags to select Rows and Keys. + * <pre> + * >switch< + * >case case_attribute*< + * >!-- Any valid tags at switch position --< + * >/case< + * ... + * >default< + * >!-- Any valid tags at switch position --< + * >/default< + * >/switch< + * </pre> + * You can declare Key style and specify styles within Key tags. + * <pre> + * >switch< + * >case colorScheme="white"< + * >key-style styleName="shift-key" parentStyle="modifier-key" + * keyIcon="@drawable/sym_keyboard_shift" + * /< + * >/case< + * >case colorScheme="black"< + * >key-style styleName="shift-key" parentStyle="modifier-key" + * keyIcon="@drawable/sym_bkeyboard_shift" + * /< + * >/case< + * >/switch< + * ... + * >Key keyStyle="shift-key" ... /< + * </pre> + */ + +public class KeyboardParser { + private static final String TAG = "KeyboardParser"; + private static final boolean DEBUG = false; + + // Keyboard XML Tags + private static final String TAG_KEYBOARD = "Keyboard"; + private static final String TAG_ROW = "Row"; + private static final String TAG_KEY = "Key"; + private static final String TAG_SPACER = "Spacer"; + private static final String TAG_INCLUDE = "include"; + private static final String TAG_MERGE = "merge"; + private static final String TAG_SWITCH = "switch"; + private static final String TAG_CASE = "case"; + private static final String TAG_DEFAULT = "default"; + public static final String TAG_KEY_STYLE = "key-style"; + + private final Keyboard mKeyboard; + private final Resources mResources; + + private int mCurrentX = 0; + private int mCurrentY = 0; + private int mMaxRowWidth = 0; + private int mTotalHeight = 0; + private Row mCurrentRow = null; + private final KeyStyles mKeyStyles = new KeyStyles(); + + public KeyboardParser(Keyboard keyboard, Resources res) { + mKeyboard = keyboard; + mResources = res; + } + + public int getMaxRowWidth() { + return mMaxRowWidth; + } + + public int getTotalHeight() { + return mTotalHeight; + } + + public void parseKeyboard(int resId) throws XmlPullParserException, IOException { + if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_KEYBOARD, mKeyboard.mId)); + final XmlResourceParser parser = mResources.getXml(resId); + int event; + while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (event == XmlPullParser.START_TAG) { + final String tag = parser.getName(); + if (TAG_KEYBOARD.equals(tag)) { + parseKeyboardAttributes(parser); + parseKeyboardContent(parser, mKeyboard.getKeys()); + break; + } else { + throw new IllegalStartTag(parser, TAG_KEYBOARD); + } + } + } + } + + private void parseKeyboardAttributes(XmlResourceParser parser) { + final Keyboard keyboard = mKeyboard; + final TypedArray keyboardAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard); + final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_Key); + try { + final int displayHeight = keyboard.getDisplayHeight(); + final int keyboardHeight = (int)keyboardAttr.getDimension( + R.styleable.Keyboard_keyboardHeight, displayHeight / 2); + final int maxKeyboardHeight = getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_maxKeyboardHeight, displayHeight, displayHeight / 2); + // Keyboard height will not exceed maxKeyboardHeight. + final int height = Math.min(keyboardHeight, maxKeyboardHeight); + final int width = keyboard.getDisplayWidth(); + + keyboard.setKeyboardHeight(height); + keyboard.setKeyWidth(getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_keyWidth, width, width / 10)); + keyboard.setRowHeight(getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_rowHeight, height, 50)); + keyboard.setHorizontalGap(getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_horizontalGap, width, 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)); + } finally { + keyAttr.recycle(); + keyboardAttr.recycle(); + } + } + + private void parseKeyboardContent(XmlResourceParser parser, List<Key> keys) + 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); + if (DEBUG) Log.d(TAG, String.format("<%s>", TAG_ROW)); + if (keys != null) + startRow(row); + parseRowContent(parser, row, keys); + } else if (TAG_INCLUDE.equals(tag)) { + parseIncludeKeyboardContent(parser, keys); + } else if (TAG_SWITCH.equals(tag)) { + parseSwitchKeyboardContent(parser, keys); + } else if (TAG_KEY_STYLE.equals(tag)) { + parseKeyStyle(parser, keys); + } 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()); + break; + } else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag) + || TAG_MERGE.equals(tag)) { + if (DEBUG) Log.d(TAG, String.format("</%s>", tag)); + break; + } else if (TAG_KEY_STYLE.equals(tag)) { + continue; + } else { + throw new IllegalEndTag(parser, TAG_ROW); + } + } + } + } + + private void parseRowContent(XmlResourceParser parser, Row row, List<Key> keys) + 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); + } else if (TAG_SPACER.equals(tag)) { + parseSpacer(parser, keys); + } else if (TAG_INCLUDE.equals(tag)) { + parseIncludeRowContent(parser, row, keys); + } else if (TAG_SWITCH.equals(tag)) { + parseSwitchRowContent(parser, row, keys); + } else if (TAG_KEY_STYLE.equals(tag)) { + parseKeyStyle(parser, keys); + } else { + throw new IllegalStartTag(parser, TAG_KEY); + } + } else if (event == XmlPullParser.END_TAG) { + final String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + if (DEBUG) Log.d(TAG, String.format("</%s>", TAG_ROW)); + if (keys != null) + endRow(); + break; + } else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag) + || TAG_MERGE.equals(tag)) { + if (DEBUG) Log.d(TAG, String.format("</%s>", tag)); + break; + } else if (TAG_KEY_STYLE.equals(tag)) { + continue; + } else { + throw new IllegalEndTag(parser, TAG_KEY); + } + } + } + } + + private void parseKey(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + if (keys == null) { + checkEndTag(TAG_KEY, parser); + } else { + Key key = new Key(mResources, row, mCurrentX, mCurrentY, parser, mKeyStyles); + if (DEBUG) Log.d(TAG, String.format("<%s keyLabel=%s code=%d popupCharacters=%s />", + TAG_KEY, 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); + if (key.mCode == Keyboard.CODE_SPACE) + mKeyboard.setSpaceKey(key); + endKey(key); + } + } + + private void parseSpacer(XmlResourceParser parser, List<Key> keys) + throws XmlPullParserException, IOException { + if (keys == null) { + checkEndTag(TAG_SPACER, parser); + } else { + if (DEBUG) Log.d(TAG, String.format("<%s />", TAG_SPACER)); + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard); + final int gap = getDimensionOrFraction(a, R.styleable.Keyboard_horizontalGap, + mKeyboard.getDisplayWidth(), 0); + a.recycle(); + checkEndTag(TAG_SPACER, parser); + setSpacer(gap); + } + } + + private void parseIncludeKeyboardContent(XmlResourceParser parser, List<Key> keys) + throws XmlPullParserException, IOException { + parseIncludeInternal(parser, null, keys); + } + + private void parseIncludeRowContent(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + parseIncludeInternal(parser, row, keys); + } + + private void parseIncludeInternal(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + if (keys == null) { + checkEndTag(TAG_INCLUDE, parser); + } else { + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_Include); + final int keyboardLayout = a.getResourceId( + R.styleable.Keyboard_Include_keyboardLayout, 0); + a.recycle(); + + checkEndTag(TAG_INCLUDE, parser); + if (keyboardLayout == 0) + 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); + } + } + + private void parseMerge(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + int event; + while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (event == XmlPullParser.START_TAG) { + final String tag = parser.getName(); + if (TAG_MERGE.equals(tag)) { + if (row == null) { + parseKeyboardContent(parser, keys); + } else { + parseRowContent(parser, row, keys); + } + break; + } else { + throw new ParseException( + "Included keyboard layout must have <merge> root element", parser); + } + } + } + } + + private void parseSwitchKeyboardContent(XmlResourceParser parser, List<Key> keys) + throws XmlPullParserException, IOException { + parseSwitchInternal(parser, null, keys); + } + + private void parseSwitchRowContent(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + parseSwitchInternal(parser, row, keys); + } + + private void parseSwitchInternal(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_SWITCH, mKeyboard.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); + } else if (TAG_DEFAULT.equals(tag)) { + selected |= parseDefault(parser, row, selected ? null : keys); + } else { + throw new IllegalStartTag(parser, TAG_KEY); + } + } else if (event == XmlPullParser.END_TAG) { + final String tag = parser.getName(); + if (TAG_SWITCH.equals(tag)) { + if (DEBUG) Log.d(TAG, String.format("</%s>", TAG_SWITCH)); + break; + } else { + throw new IllegalEndTag(parser, TAG_KEY); + } + } + } + } + + private boolean parseCase(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + final boolean selected = parseCaseCondition(parser); + if (row == null) { + // Processing Rows. + parseKeyboardContent(parser, selected ? keys : null); + } else { + // Processing Keys. + parseRowContent(parser, row, selected ? keys : null); + } + return selected; + } + + private boolean parseCaseCondition(XmlResourceParser parser) { + final KeyboardId id = mKeyboard.mId; + if (id == null) + return true; + + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_Case); + final TypedArray viewAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.KeyboardView); + try { + final boolean modeMatched = matchInteger(a, + R.styleable.Keyboard_Case_mode, id.mMode); + final boolean settingsKeyMatched = matchBoolean(a, + R.styleable.Keyboard_Case_hasSettingsKey, id.mHasSettingsKey); + 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 colorSchemeMatched = matchInteger(viewAttr, + R.styleable.KeyboardView_colorScheme, id.mColorScheme); + // As noted at KeyboardSwitcher.KeyboardId class, we are interested only in + // enum value masked by IME_MASK_ACTION and IME_FLAG_NO_ENTER_ACTION. So matching + // this attribute with id.mImeOptions as integer value is enough for our purpose. + final boolean imeOptionsMatched = matchInteger(a, + R.styleable.Keyboard_Case_imeOptions, id.mImeOptions); + final boolean selected = modeMatched && settingsKeyMatched && voiceEnabledMatched + && voiceKeyMatched && colorSchemeMatched && imeOptionsMatched; + + if (DEBUG) Log.d(TAG, String.format("<%s%s%s%s%s%s%s> %s", TAG_CASE, + textAttr(KeyboardId.modeName( + a.getInt(R.styleable.Keyboard_Case_mode, -1)), "mode"), + textAttr(KeyboardId.colorSchemeName( + a.getInt(R.styleable.KeyboardView_colorScheme, -1)), "colorSchemeName"), + booleanAttr(a, R.styleable.Keyboard_Case_hasSettingsKey, "hasSettingsKey"), + booleanAttr(a, R.styleable.Keyboard_Case_voiceKeyEnabled, "voiceKeyEnabled"), + booleanAttr(a, R.styleable.Keyboard_Case_hasVoiceKey, "hasVoiceKey"), + textAttr(KeyboardId.imeOptionsName( + a.getInt(R.styleable.Keyboard_Case_imeOptions, -1)), "imeOptions"), + Boolean.toString(selected))); + + return selected; + } finally { + a.recycle(); + viewAttr.recycle(); + } + } + + private static boolean matchInteger(TypedArray a, int index, int value) { + // If <case> does not have "index" attribute, that means this <case> is wild-card for the + // attribute. + return !a.hasValue(index) || a.getInt(index, 0) == value; + } + + private static boolean matchBoolean(TypedArray a, int index, boolean value) { + // If <case> does not have "index" attribute, that means this <case> is wild-card for the + // attribute. + return !a.hasValue(index) || a.getBoolean(index, false) == value; + } + + private boolean parseDefault(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + if (DEBUG) Log.d(TAG, String.format("<%s>", TAG_DEFAULT)); + if (row == null) { + parseKeyboardContent(parser, keys); + } else { + parseRowContent(parser, row, keys); + } + return true; + } + + private void parseKeyStyle(XmlResourceParser parser, List<Key> keys) { + TypedArray keyStyleAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_KeyStyle); + TypedArray keyAttrs = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_Key); + try { + if (!keyStyleAttr.hasValue(R.styleable.Keyboard_KeyStyle_styleName)) + throw new ParseException("<" + TAG_KEY_STYLE + + "/> needs styleName attribute", parser); + if (keys != null) + mKeyStyles.parseKeyStyleAttributes(keyStyleAttr, keyAttrs, parser); + } finally { + keyStyleAttr.recycle(); + keyAttrs.recycle(); + } + } + + private static void checkEndTag(String tag, XmlResourceParser parser) + throws XmlPullParserException, IOException { + if (parser.next() == XmlPullParser.END_TAG && tag.equals(parser.getName())) + return; + throw new NonEmptyTag(tag, parser); + } + + private void startRow(Row row) { + mCurrentX = 0; + mCurrentRow = row; + } + + private void endRow() { + if (mCurrentRow == null) + throw new InflateException("orphant end row tag"); + mCurrentY += mCurrentRow.mDefaultHeight; + mCurrentRow = null; + } + + private void endKey(Key key) { + mCurrentX += key.mGap + key.mWidth; + if (mCurrentX > mMaxRowWidth) + mMaxRowWidth = mCurrentX; + } + + private void endKeyboard(int defaultVerticalGap) { + mTotalHeight = mCurrentY - defaultVerticalGap; + } + + private void setSpacer(int gap) { + mCurrentX += gap; + } + + public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) { + final TypedValue value = a.peekValue(index); + if (value == null) + return defValue; + if (value.type == TypedValue.TYPE_DIMENSION) { + return a.getDimensionPixelOffset(index, defValue); + } else if (value.type == TypedValue.TYPE_FRACTION) { + // Round it to avoid values like 47.9999 from getting truncated + return Math.round(a.getFraction(index, base, base, defValue)); + } + return defValue; + } + + @SuppressWarnings("serial") + public static class ParseException extends InflateException { + public ParseException(String msg, XmlResourceParser parser) { + super(msg + " at line " + parser.getLineNumber()); + } + } + + @SuppressWarnings("serial") + private static class IllegalStartTag extends ParseException { + public IllegalStartTag(XmlResourceParser parser, String parent) { + super("Illegal start tag " + parser.getName() + " in " + parent, parser); + } + } + + @SuppressWarnings("serial") + private static class IllegalEndTag extends ParseException { + public IllegalEndTag(XmlResourceParser parser, String parent) { + super("Illegal end tag " + parser.getName() + " in " + parent, parser); + } + } + + @SuppressWarnings("serial") + private static class NonEmptyTag extends ParseException { + public NonEmptyTag(String tag, XmlResourceParser parser) { + super(tag + " must be empty tag", parser); + } + } + + private static String textAttr(String value, String name) { + return value != null ? String.format(" %s=%s", name, value) : ""; + } + + private static String booleanAttr(TypedArray a, int index, String name) { + return a.hasValue(index) ? String.format(" %s=%s", name, a.getBoolean(index, false)) : ""; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java b/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java new file mode 100644 index 000000000..d5412791d --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import android.util.Log; + +public class KeyboardShiftState { + private static final String TAG = "KeyboardShiftState"; + private static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE; + + private static final int NORMAL = 0; + private static final int MANUAL_SHIFTED = 1; + private static final int MANUAL_SHIFTED_FROM_AUTO = 2; + private static final int AUTO_SHIFTED = 3; + private static final int SHIFT_LOCKED = 4; + private static final int SHIFT_LOCK_SHIFTED = 5; + + private int mState = NORMAL; + + public boolean setShifted(boolean newShiftState) { + final int oldState = mState; + if (newShiftState) { + switch (oldState) { + case NORMAL: + mState = MANUAL_SHIFTED; + break; + case AUTO_SHIFTED: + mState = MANUAL_SHIFTED_FROM_AUTO; + break; + case SHIFT_LOCKED: + mState = SHIFT_LOCK_SHIFTED; + break; + } + } else { + switch (oldState) { + case MANUAL_SHIFTED: + case MANUAL_SHIFTED_FROM_AUTO: + case AUTO_SHIFTED: + mState = NORMAL; + break; + case SHIFT_LOCK_SHIFTED: + mState = SHIFT_LOCKED; + break; + } + } + if (DEBUG) + Log.d(TAG, "setShifted(" + newShiftState + "): " + toString(oldState) + " > " + this); + return mState != oldState; + } + + public void setShiftLocked(boolean newShiftLockState) { + final int oldState = mState; + if (newShiftLockState) { + switch (oldState) { + case NORMAL: + case MANUAL_SHIFTED: + case MANUAL_SHIFTED_FROM_AUTO: + case AUTO_SHIFTED: + mState = SHIFT_LOCKED; + break; + } + } else { + switch (oldState) { + case SHIFT_LOCKED: + case SHIFT_LOCK_SHIFTED: + mState = NORMAL; + break; + } + } + if (DEBUG) + Log.d(TAG, "setShiftLocked(" + newShiftLockState + "): " + toString(oldState) + + " > " + this); + } + + public void setAutomaticTemporaryUpperCase() { + final int oldState = mState; + mState = AUTO_SHIFTED; + if (DEBUG) + Log.d(TAG, "setAutomaticTemporaryUpperCase: " + toString(oldState) + " > " + this); + } + + public boolean isShiftedOrShiftLocked() { + return mState != NORMAL; + } + + public boolean isShiftLocked() { + return mState == SHIFT_LOCKED || mState == SHIFT_LOCK_SHIFTED; + } + + public boolean isAutomaticTemporaryUpperCase() { + return mState == AUTO_SHIFTED; + } + + public boolean isManualTemporaryUpperCase() { + return mState == MANUAL_SHIFTED || mState == MANUAL_SHIFTED_FROM_AUTO + || mState == SHIFT_LOCK_SHIFTED; + } + + public boolean isManualTemporaryUpperCaseFromAuto() { + return mState == MANUAL_SHIFTED_FROM_AUTO; + } + + @Override + public String toString() { + return toString(mState); + } + + private static String toString(int state) { + switch (state) { + case NORMAL: return "NORMAL"; + case MANUAL_SHIFTED: return "MANUAL_SHIFTED"; + case MANUAL_SHIFTED_FROM_AUTO: return "MANUAL_SHIFTED_FROM_AUTO"; + case AUTO_SHIFTED: return "AUTO_SHIFTED"; + case SHIFT_LOCKED: return "SHIFT_LOCKED"; + case SHIFT_LOCK_SHIFTED: return "SHIFT_LOCK_SHIFTED"; + default: return "UKNOWN"; + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java new file mode 100644 index 000000000..558de66a4 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -0,0 +1,737 @@ +/* + * 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 + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +import com.android.inputmethod.latin.LatinIME; +import com.android.inputmethod.latin.Settings; +import com.android.inputmethod.latin.Utils; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SubtypeSwitcher; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.util.Log; +import android.view.InflateException; +import android.view.inputmethod.InputMethodManager; + +import java.lang.ref.SoftReference; +import java.util.HashMap; +import java.util.Locale; + +public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener { + private static final String TAG = "KeyboardSwitcher"; + private static final boolean DEBUG = false; + public static final boolean DEBUG_STATE = false; + + private static String sConfigDefaultKeyboardThemeId; + public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20100902"; + private static final int[] KEYBOARD_THEMES = { + R.layout.input_basic, + R.layout.input_basic_highcontrast, + R.layout.input_stone_normal, + R.layout.input_stone_bold, + R.layout.input_gingerbread, + R.layout.input_honeycomb, + }; + + private SubtypeSwitcher mSubtypeSwitcher; + private SharedPreferences mPrefs; + + private LatinKeyboardView mInputView; + private LatinIME mInputMethodService; + + private ShiftKeyState mShiftKeyState = new ShiftKeyState("Shift"); + private ModifierKeyState mSymbolKeyState = new ModifierKeyState("Symbol"); + + private KeyboardId mSymbolsId; + private KeyboardId mSymbolsShiftedId; + + private KeyboardId mCurrentId; + private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboardCache = + new HashMap<KeyboardId, SoftReference<LatinKeyboard>>(); + + private int mMode = KeyboardId.MODE_TEXT; /* default value */ + private int mImeOptions; + 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; + + private static final int AUTO_MODE_SWITCH_STATE_ALPHA = 0; + private static final int AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN = 1; + private static final int AUTO_MODE_SWITCH_STATE_SYMBOL = 2; + // The following states are used only on the distinct multi-touch panel devices. + private static final int AUTO_MODE_SWITCH_STATE_MOMENTARY = 3; + private static final int AUTO_MODE_SWITCH_STATE_CHORDING = 4; + private int mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; + + // Indicates whether or not we have the settings key + private boolean mHasSettingsKey; + 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 mLayoutId; + + private static final KeyboardSwitcher sInstance = new KeyboardSwitcher(); + + public static KeyboardSwitcher getInstance() { + return sInstance; + } + + private KeyboardSwitcher() { + // Intentional empty constructor for singleton. + } + + public static void init(LatinIME ims, SharedPreferences prefs) { + sInstance.mInputMethodService = ims; + sInstance.mPrefs = prefs; + sInstance.mSubtypeSwitcher = SubtypeSwitcher.getInstance(); + + try { + sConfigDefaultKeyboardThemeId = ims.getString( + R.string.config_default_keyboard_theme_id); + sInstance.mLayoutId = Integer.valueOf( + prefs.getString(PREF_KEYBOARD_LAYOUT, sConfigDefaultKeyboardThemeId)); + } catch (NumberFormatException e) { + sConfigDefaultKeyboardThemeId = "0"; + sInstance.mLayoutId = 0; + } + prefs.registerOnSharedPreferenceChangeListener(sInstance); + } + + private void makeSymbolsKeyboardIds() { + final Locale locale = mSubtypeSwitcher.getInputLocale(); + final Resources res = mInputMethodService.getResources(); + final int orientation = res.getConfiguration().orientation; + final int mode = mMode; + final int colorScheme = getColorScheme(); + final boolean hasSettingsKey = mHasSettingsKey; + final boolean voiceKeyEnabled = mVoiceKeyEnabled; + final boolean hasVoiceKey = voiceKeyEnabled && !mVoiceButtonOnPrimary; + final int imeOptions = mImeOptions; + // 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. + int xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone : R.xml.kbd_symbols; + mSymbolsId = new KeyboardId( + res.getResourceEntryName(xmlId), xmlId, locale, orientation, mode, colorScheme, + hasSettingsKey, voiceKeyEnabled, hasVoiceKey, imeOptions, true); + xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone_symbols : R.xml.kbd_symbols_shift; + mSymbolsShiftedId = new KeyboardId( + res.getResourceEntryName(xmlId), xmlId, locale, orientation, mode, colorScheme, + hasSettingsKey, voiceKeyEnabled, hasVoiceKey, imeOptions, true); + } + + private boolean hasVoiceKey(boolean isSymbols) { + return mVoiceKeyEnabled && (isSymbols != mVoiceButtonOnPrimary); + } + + public void loadKeyboard(int mode, int imeOptions, boolean voiceKeyEnabled, + boolean voiceButtonOnPrimary) { + mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; + try { + if (mInputView == null) return; + final Keyboard oldKeyboard = mInputView.getKeyboard(); + loadKeyboardInternal(mode, imeOptions, voiceKeyEnabled, voiceButtonOnPrimary, false); + final Keyboard newKeyboard = mInputView.getKeyboard(); + if (newKeyboard.isAlphaKeyboard()) { + final boolean localeChanged = (oldKeyboard == null) + || !newKeyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale); + mInputMethodService.mHandler.startDisplayLanguageOnSpacebar(localeChanged); + } + } catch (RuntimeException e) { + Log.w(TAG, e); + LatinImeLogger.logOnException(mode + "," + imeOptions, e); + } + } + + private void loadKeyboardInternal(int mode, int imeOptions, boolean voiceButtonEnabled, + boolean voiceButtonOnPrimary, boolean isSymbols) { + if (mInputView == null) return; + + mMode = mode; + mImeOptions = imeOptions; + mVoiceKeyEnabled = voiceButtonEnabled; + mVoiceButtonOnPrimary = voiceButtonOnPrimary; + mIsSymbols = isSymbols; + // Update the settings key state because number of enabled IMEs could have been changed + mHasSettingsKey = getSettingsKeyMode(mPrefs, mInputMethodService); + final KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols); + + final Keyboard oldKeyboard = mInputView.getKeyboard(); + if (oldKeyboard != null && oldKeyboard.mId.equals(id)) + return; + + makeSymbolsKeyboardIds(); + mCurrentId = id; + mInputView.setPreviewEnabled(mInputMethodService.getPopupOn()); + mInputView.setKeyboard(getKeyboard(id)); + } + + private LatinKeyboard getKeyboard(KeyboardId id) { + final SoftReference<LatinKeyboard> ref = mKeyboardCache.get(id); + LatinKeyboard keyboard = (ref == null) ? null : ref.get(); + if (keyboard == null) { + final Locale savedLocale = mSubtypeSwitcher.changeSystemLocale( + mSubtypeSwitcher.getInputLocale()); + + keyboard = new LatinKeyboard(mInputMethodService, id); + + if (id.mEnableShiftLock) { + keyboard.enableShiftLock(); + } + + mKeyboardCache.put(id, new SoftReference<LatinKeyboard>(keyboard)); + if (DEBUG) + Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": " + + ((ref == null) ? "LOAD" : "GCed") + " id=" + id); + + mSubtypeSwitcher.changeSystemLocale(savedLocale); + } else if (DEBUG) { + Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": HIT id=" + id); + } + + keyboard.onAutoCorrectionStateChanged(mIsAutoCorrectionActive); + 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. + keyboard.setSpacebarTextFadeFactor(0.0f, null); + return keyboard; + } + + private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) { + final boolean hasVoiceKey = hasVoiceKey(isSymbols); + final int charColorId = getColorScheme(); + 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; + } else { + xmlId = R.xml.kbd_qwerty; + enableShiftLock = true; + } + } + final Resources res = mInputMethodService.getResources(); + final int orientation = res.getConfiguration().orientation; + final Locale locale = mSubtypeSwitcher.getInputLocale(); + return new KeyboardId( + res.getResourceEntryName(xmlId), xmlId, locale, orientation, mode, charColorId, + mHasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, imeOptions, enableShiftLock); + } + + public int getKeyboardMode() { + return mMode; + } + + public boolean isAlphabetMode() { + return mCurrentId != null && mCurrentId.isAlphabetKeyboard(); + } + + public boolean isInputViewShown() { + return mInputView != null && mInputView.isShown(); + } + + public boolean isKeyboardAvailable() { + if (mInputView != null) + return mInputView.getLatinKeyboard() != null; + return false; + } + + private LatinKeyboard getLatinKeyboard() { + if (mInputView != null) + return mInputView.getLatinKeyboard(); + return null; + } + + public void setPreferredLetters(int[] frequencies) { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + latinKeyboard.setPreferredLetters(frequencies); + } + + public void keyReleased() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + latinKeyboard.keyReleased(); + } + + public boolean isShiftedOrShiftLocked() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + return latinKeyboard.isShiftedOrShiftLocked(); + return false; + } + + public boolean isShiftLocked() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + return latinKeyboard.isShiftLocked(); + return false; + } + + public boolean isAutomaticTemporaryUpperCase() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + return latinKeyboard.isAutomaticTemporaryUpperCase(); + return false; + } + + public boolean isManualTemporaryUpperCase() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + return latinKeyboard.isManualTemporaryUpperCase(); + return false; + } + + private boolean isManualTemporaryUpperCaseFromAuto() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + return latinKeyboard.isManualTemporaryUpperCaseFromAuto(); + return false; + } + + private void setManualTemporaryUpperCase(boolean shifted) { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) { + // On non-distinct multi touch panel device, we should also turn off the shift locked + // state when shift key is pressed to go to normal mode. + // On the other hand, on distinct multi touch panel device, turning off the shift locked + // state with shift key pressing is handled by onReleaseShift(). + if (!hasDistinctMultitouch() && !shifted && latinKeyboard.isShiftLocked()) { + latinKeyboard.setShiftLocked(false); + } + if (latinKeyboard.setShifted(shifted)) { + mInputView.invalidateAllKeys(); + } + } + } + + private void setShiftLocked(boolean shiftLocked) { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null && latinKeyboard.setShiftLocked(shiftLocked)) { + mInputView.invalidateAllKeys(); + } + } + + /** + * Toggle keyboard shift state triggered by user touch event. + */ + public void toggleShift() { + mInputMethodService.mHandler.cancelUpdateShiftState(); + if (DEBUG_STATE) + Log.d(TAG, "toggleShift:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + mShiftKeyState); + if (isAlphabetMode()) { + setManualTemporaryUpperCase(!isShiftedOrShiftLocked()); + } else { + toggleShiftInSymbol(); + } + } + + public void toggleCapsLock() { + mInputMethodService.mHandler.cancelUpdateShiftState(); + if (DEBUG_STATE) + Log.d(TAG, "toggleCapsLock:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + mShiftKeyState); + if (isAlphabetMode()) { + if (isShiftLocked()) { + // Shift key is long pressed while caps lock state, we will toggle back to normal + // state. And mark as if shift key is released. + setShiftLocked(false); + mShiftKeyState.onRelease(); + } else { + setShiftLocked(true); + } + } + } + + private void setAutomaticTemporaryUpperCase() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) { + latinKeyboard.setAutomaticTemporaryUpperCase(); + mInputView.invalidateAllKeys(); + } + } + + /** + * Update keyboard shift state triggered by connected EditText status change. + */ + public void updateShiftState() { + final ShiftKeyState shiftKeyState = mShiftKeyState; + if (DEBUG_STATE) + Log.d(TAG, "updateShiftState:" + + " autoCaps=" + mInputMethodService.getCurrentAutoCapsState() + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + shiftKeyState); + if (isAlphabetMode()) { + if (!isShiftLocked() && !shiftKeyState.isIgnoring()) { + if (shiftKeyState.isReleasing() && mInputMethodService.getCurrentAutoCapsState()) { + // Only when shift key is releasing, automatic temporary upper case will be set. + setAutomaticTemporaryUpperCase(); + } else { + setManualTemporaryUpperCase(shiftKeyState.isMomentary()); + } + } + } else { + // In symbol keyboard mode, we should clear shift key state because only alphabet + // keyboard has shift key. + shiftKeyState.onRelease(); + } + } + + public void changeKeyboardMode() { + if (DEBUG_STATE) + Log.d(TAG, "changeKeyboardMode:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + mShiftKeyState); + toggleKeyboardMode(); + if (isShiftLocked() && isAlphabetMode()) + setShiftLocked(true); + updateShiftState(); + } + + public void onPressShift() { + if (!isKeyboardAvailable()) + return; + ShiftKeyState shiftKeyState = mShiftKeyState; + if (DEBUG_STATE) + Log.d(TAG, "onPressShift:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + shiftKeyState); + if (isAlphabetMode()) { + if (isShiftLocked()) { + // Shift key is pressed while caps lock state, we will treat this state as shifted + // caps lock state and mark as if shift key pressed while normal state. + shiftKeyState.onPress(); + setManualTemporaryUpperCase(true); + } else if (isAutomaticTemporaryUpperCase()) { + // Shift key is pressed while automatic temporary upper case, we have to move to + // manual temporary upper case. + shiftKeyState.onPress(); + setManualTemporaryUpperCase(true); + } else if (isShiftedOrShiftLocked()) { + // In manual upper case state, we just record shift key has been pressing while + // shifted state. + shiftKeyState.onPressOnShifted(); + } else { + // In base layout, chording or manual temporary upper case mode is started. + shiftKeyState.onPress(); + toggleShift(); + } + } else { + // In symbol mode, just toggle symbol and symbol more keyboard. + shiftKeyState.onPress(); + toggleShift(); + } + } + + public void onReleaseShift() { + if (!isKeyboardAvailable()) + return; + ShiftKeyState shiftKeyState = mShiftKeyState; + if (DEBUG_STATE) + Log.d(TAG, "onReleaseShift:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + shiftKeyState); + if (isAlphabetMode()) { + if (shiftKeyState.isMomentary()) { + // After chording input while normal state. + toggleShift(); + } else if (isShiftLocked() && !shiftKeyState.isIgnoring()) { + // Shift has been pressed without chording while caps lock state. + toggleCapsLock(); + } else if (isShiftedOrShiftLocked() && shiftKeyState.isPressingOnShifted()) { + // Shift has been pressed without chording while shifted state. + toggleShift(); + } else if (isManualTemporaryUpperCaseFromAuto() && shiftKeyState.isPressing()) { + // Shift has been pressed without chording while manual temporary upper case + // transited from automatic temporary upper case. + toggleShift(); + } + } + shiftKeyState.onRelease(); + } + + public void onPressSymbol() { + if (DEBUG_STATE) + Log.d(TAG, "onPressSymbol:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " symbolKeyState=" + mSymbolKeyState); + changeKeyboardMode(); + mSymbolKeyState.onPress(); + mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_MOMENTARY; + } + + public void onReleaseSymbol() { + if (DEBUG_STATE) + Log.d(TAG, "onReleaseSymbol:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " symbolKeyState=" + mSymbolKeyState); + // Snap back to the previous keyboard mode if the user chords the mode change key and + // other key, then released the mode change key. + if (mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_CHORDING) + changeKeyboardMode(); + mSymbolKeyState.onRelease(); + } + + public void onOtherKeyPressed() { + if (DEBUG_STATE) + Log.d(TAG, "onOtherKeyPressed:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + mShiftKeyState + + " symbolKeyState=" + mSymbolKeyState); + mShiftKeyState.onOtherKeyPressed(); + mSymbolKeyState.onOtherKeyPressed(); + } + + public void onCancelInput() { + // Snap back to the previous keyboard mode if the user cancels sliding input. + if (mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY && getPointerCount() == 1) + changeKeyboardMode(); + } + + private void toggleShiftInSymbol() { + if (isAlphabetMode()) + return; + final LatinKeyboard keyboard; + if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) { + mCurrentId = mSymbolsShiftedId; + keyboard = getKeyboard(mCurrentId); + // Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To + // enable the indicator, we need to call enableShiftLock() and setShiftLocked(true). + // Thus we can keep the ALT key's Key.on value true while LatinKey.onRelease() is + // called. + keyboard.setShiftLocked(true); + } else { + mCurrentId = mSymbolsId; + keyboard = getKeyboard(mCurrentId); + // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the + // indicator, we need to call enableShiftLock() and setShiftLocked(false). + keyboard.setShifted(false); + } + mInputView.setKeyboard(keyboard); + } + + public boolean isInMomentaryAutoModeSwitchState() { + return mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY; + } + + public boolean isVibrateAndSoundFeedbackRequired() { + return mInputView == null || !mInputView.isInSlidingKeyInput(); + } + + private int getPointerCount() { + return mInputView == null ? 0 : mInputView.getPointerCount(); + } + + private void toggleKeyboardMode() { + loadKeyboardInternal(mMode, mImeOptions, mVoiceKeyEnabled, mVoiceButtonOnPrimary, + !mIsSymbols); + if (mIsSymbols) { + mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN; + } else { + mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; + } + } + + public boolean hasDistinctMultitouch() { + return mInputView != null && mInputView.hasDistinctMultitouch(); + } + + /** + * Updates state machine to figure out when to automatically snap back to the previous mode. + */ + public void onKey(int key) { + if (DEBUG_STATE) + Log.d(TAG, "onKey: code=" + key + " autoModeSwitchState=" + mAutoModeSwitchState + + " pointers=" + getPointerCount()); + switch (mAutoModeSwitchState) { + case AUTO_MODE_SWITCH_STATE_MOMENTARY: + // Only distinct multi touch devices can be in this state. + // On non-distinct multi touch devices, mode change key is handled by + // {@link LatinIME#onCodeInput}, not by {@link LatinIME#onPress} and + // {@link LatinIME#onRelease}. So, on such devices, {@link #mAutoModeSwitchState} starts + // from {@link #AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN}, or + // {@link #AUTO_MODE_SWITCH_STATE_ALPHA}, not from + // {@link #AUTO_MODE_SWITCH_STATE_MOMENTARY}. + if (key == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { + // Detected only the mode change key has been pressed, and then released. + if (mIsSymbols) { + mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN; + } else { + mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; + } + } else if (getPointerCount() == 1) { + // Snap back to the previous keyboard mode if the user pressed the mode change key + // and slid to other key, then released the finger. + // If the user cancels the sliding input, snapping back to the previous keyboard + // mode is handled by {@link #onCancelInput}. + changeKeyboardMode(); + } else { + // Chording input is being started. The keyboard mode will be snapped back to the + // previous mode in {@link onReleaseSymbol} when the mode change key is released. + mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_CHORDING; + } + break; + case AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN: + if (key != Keyboard.CODE_SPACE && key != Keyboard.CODE_ENTER && key >= 0) { + mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL; + } + break; + case AUTO_MODE_SWITCH_STATE_SYMBOL: + // Snap back to alpha keyboard mode if user types one or more non-space/enter + // characters followed by a space/enter. + if (key == Keyboard.CODE_ENTER || key == Keyboard.CODE_SPACE) { + changeKeyboardMode(); + } + break; + } + } + + public LatinKeyboardView getInputView() { + return mInputView; + } + + public LatinKeyboardView onCreateInputView() { + createInputViewInternal(mLayoutId, true); + return mInputView; + } + + private void createInputViewInternal(int newLayout, boolean forceReset) { + int layoutId = newLayout; + if (mLayoutId != layoutId || mInputView == null || forceReset) { + if (mInputView != null) { + mInputView.closing(); + } + if (KEYBOARD_THEMES.length <= layoutId) { + layoutId = Integer.valueOf(sConfigDefaultKeyboardThemeId); + } + + Utils.GCUtils.getInstance().reset(); + boolean tryGC = true; + for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { + try { + mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater( + ).inflate(KEYBOARD_THEMES[layoutId], null); + tryGC = false; + } catch (OutOfMemoryError e) { + Log.w(TAG, "load keyboard failed: " + e); + tryGC = Utils.GCUtils.getInstance().tryGCOrWait( + mLayoutId + "," + layoutId, e); + } catch (InflateException e) { + Log.w(TAG, "load keyboard failed: " + e); + tryGC = Utils.GCUtils.getInstance().tryGCOrWait( + mLayoutId + "," + layoutId, e); + } + } + mInputView.setOnKeyboardActionListener(mInputMethodService); + mLayoutId = layoutId; + } + } + + private void postSetInputView() { + mInputMethodService.mHandler.post(new Runnable() { + @Override + public void run() { + if (mInputView != null) { + mInputMethodService.setInputView(mInputView); + } + mInputMethodService.updateInputViewShown(); + } + }); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (PREF_KEYBOARD_LAYOUT.equals(key)) { + final int layoutId = Integer.valueOf( + sharedPreferences.getString(key, sConfigDefaultKeyboardThemeId)); + createInputViewInternal(layoutId, false); + postSetInputView(); + } else if (Settings.PREF_SETTINGS_KEY.equals(key)) { + mHasSettingsKey = getSettingsKeyMode(sharedPreferences, mInputMethodService); + createInputViewInternal(mLayoutId, true); + postSetInputView(); + } + } + + private int getColorScheme() { + return (mInputView != null) + ? mInputView.getColorScheme() : KeyboardView.COLOR_SCHEME_WHITE; + } + + public void onAutoCorrectionStateChanged(boolean isAutoCorrection) { + if (isAutoCorrection != mIsAutoCorrectionActive) { + LatinKeyboardView keyboardView = getInputView(); + mIsAutoCorrectionActive = isAutoCorrection; + keyboardView.invalidateKey(((LatinKeyboard) keyboardView.getKeyboard()) + .onAutoCorrectionStateChanged(isAutoCorrection)); + } + } + + private static boolean getSettingsKeyMode(SharedPreferences prefs, Context context) { + Resources resources = context.getResources(); + final boolean showSettingsKeyOption = resources.getBoolean( + R.bool.config_enable_show_settings_key_option); + if (showSettingsKeyOption) { + final String settingsKeyMode = prefs.getString(Settings.PREF_SETTINGS_KEY, + resources.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(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW)) + || (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_AUTO)) + && Utils.hasMultipleEnabledIMEsOrSubtypes( + ((InputMethodManager) context.getSystemService( + Context.INPUT_METHOD_SERVICE))))) { + return true; + } + } + return false; + } +} diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index 008d37202..766fdf0e6 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -14,7 +14,11 @@ * limitations under the License. */ -package com.android.inputmethod.latin; +package com.android.inputmethod.keyboard; + +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SubtypeSwitcher; import android.content.Context; import android.content.pm.PackageManager; @@ -29,8 +33,6 @@ import android.graphics.Rect; import android.graphics.Region.Op; import android.graphics.Typeface; import android.graphics.drawable.Drawable; -import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; import android.os.Handler; import android.os.Message; import android.os.SystemClock; @@ -43,132 +45,54 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup.LayoutParams; +import android.view.WindowManager; import android.widget.PopupWindow; import android.widget.TextView; import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.WeakHashMap; /** - * A view that renders a virtual {@link LatinKeyboard}. It handles rendering of keys and - * detecting key presses and touch movements. - * - * TODO: References to LatinKeyboard in this class should be replaced with ones to its base class. + * A view that renders a virtual {@link Keyboard}. It handles rendering of keys and detecting key + * presses and touch movements. * - * @attr ref R.styleable#LatinKeyboardBaseView_keyBackground - * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewLayout - * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewOffset - * @attr ref R.styleable#LatinKeyboardBaseView_labelTextSize - * @attr ref R.styleable#LatinKeyboardBaseView_keyTextSize - * @attr ref R.styleable#LatinKeyboardBaseView_keyTextColor - * @attr ref R.styleable#LatinKeyboardBaseView_verticalCorrection - * @attr ref R.styleable#LatinKeyboardBaseView_popupLayout + * @attr ref R.styleable#KeyboardView_keyBackground + * @attr ref R.styleable#KeyboardView_keyPreviewLayout + * @attr ref R.styleable#KeyboardView_keyPreviewOffset + * @attr ref R.styleable#KeyboardView_labelTextSize + * @attr ref R.styleable#KeyboardView_keyTextSize + * @attr ref R.styleable#KeyboardView_keyTextColor + * @attr ref R.styleable#KeyboardView_verticalCorrection + * @attr ref R.styleable#KeyboardView_popupLayout */ -public class LatinKeyboardBaseView extends View implements PointerTracker.UIProxy { - private static final String TAG = "LatinKeyboardBaseView"; +public class KeyboardView extends View implements PointerTracker.UIProxy { + private static final String TAG = "KeyboardView"; private static final boolean DEBUG = false; + private static final boolean DEBUG_SHOW_ALIGN = false; + private static final boolean DEBUG_KEYBOARD_GRID = false; - public static final int NOT_A_TOUCH_COORDINATE = -1; - - public interface OnKeyboardActionListener { - - /** - * Called when the user presses a key. This is sent before the - * {@link #onKey} is called. For keys that repeat, this is only - * called once. - * - * @param primaryCode - * the unicode of the key being pressed. If the touch is - * not on a valid key, the value will be zero. - */ - void onPress(int primaryCode); - - /** - * Called when the user releases a key. This is sent after the - * {@link #onKey} is called. For keys that repeat, this is only - * called once. - * - * @param primaryCode - * the code of the key that was released - */ - void onRelease(int primaryCode); - - /** - * Send a key press to the listener. - * - * @param primaryCode - * this is the key that was pressed - * @param keyCodes - * the codes for all the possible alternative keys with - * the primary code being the first. If the primary key - * code is a single character such as an alphabet or - * number or symbol, the alternatives will include other - * characters that may be on the same key or adjacent - * keys. These codes are useful to correct for - * accidental presses of a key adjacent to the intended - * key. - * @param x - * x-coordinate pixel of touched event. If onKey is not called by onTouchEvent, - * the value should be NOT_A_TOUCH_COORDINATE. - * @param y - * y-coordinate pixel of touched event. If onKey is not called by onTouchEvent, - * the value should be NOT_A_TOUCH_COORDINATE. - */ - void onKey(int primaryCode, int[] keyCodes, int x, int y); - - /** - * Sends a sequence of characters to the listener. - * - * @param text - * the sequence of characters to be displayed. - */ - void onText(CharSequence text); - - /** - * Called when user released a finger outside any key. - */ - void onCancel(); - - /** - * Called when the user quickly moves the finger from right to - * left. - */ - void swipeLeft(); - - /** - * Called when the user quickly moves the finger from left to - * right. - */ - void swipeRight(); - - /** - * Called when the user quickly moves the finger from up to down. - */ - void swipeDown(); - - /** - * Called when the user quickly moves the finger from down to up. - */ - void swipeUp(); - } + private static final boolean ENABLE_CAPSLOCK_BY_LONGPRESS = false; + private static final boolean ENABLE_CAPSLOCK_BY_DOUBLETAP = true; + + public static final int COLOR_SCHEME_WHITE = 0; + public static final int COLOR_SCHEME_BLACK = 1; // Timing constants private final int mKeyRepeatInterval; // Miscellaneous constants - /* package */ static final int NOT_A_KEY = -1; private static final int[] LONG_PRESSABLE_STATE_SET = { android.R.attr.state_long_pressable }; - private static final int NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL = -1; + private static final int HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL = -1; // XML attribute - private int mKeyTextSize; + private int mKeyLetterSize; private int mKeyTextColor; - private Typeface mKeyTextStyle = Typeface.DEFAULT; + private int mKeyTextColorDisabled; + private Typeface mKeyLetterStyle = Typeface.DEFAULT; private int mLabelTextSize; - private int mSymbolColorScheme = 0; + private int mColorScheme = COLOR_SCHEME_WHITE; private int mShadowColor; private float mShadowRadius; private Drawable mKeyBackground; @@ -182,15 +106,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Main keyboard private Keyboard mKeyboard; private Key[] mKeys; - // TODO this attribute should be gotten from Keyboard. - private int mKeyboardVerticalGap; // Key preview popup + private boolean mInForeground; private TextView mPreviewText; private PopupWindow mPreviewPopup; private int mPreviewTextSizeLarge; private int[] mOffsetInWindow; - private int mOldPreviewKeyIndex = NOT_A_KEY; + private int mOldPreviewKeyIndex = KeyDetector.NOT_A_KEY; private boolean mShowPreview = true; private boolean mShowTouchPoints = true; private int mPopupPreviewOffsetX; @@ -202,7 +125,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Popup mini keyboard private PopupWindow mMiniKeyboardPopup; - private LatinKeyboardBaseView mMiniKeyboard; + private KeyboardView mMiniKeyboard; private View mMiniKeyboardParent; private final WeakHashMap<Key, View> mMiniKeyboardCache = new WeakHashMap<Key, View>(); private int mMiniKeyboardOriginX; @@ -212,13 +135,13 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private final float mMiniKeyboardSlideAllowance; private int mMiniKeyboardTrackerId; - /** Listener for {@link OnKeyboardActionListener}. */ - private OnKeyboardActionListener mKeyboardActionListener; + /** Listener for {@link KeyboardActionListener}. */ + private KeyboardActionListener mKeyboardActionListener; private final ArrayList<PointerTracker> mPointerTrackers = new ArrayList<PointerTracker>(); // TODO: Let the PointerTracker class manage this pointer queue - private final PointerQueue mPointerQueue = new PointerQueue(); + private final PointerTrackerQueue mPointerQueue = new PointerTrackerQueue(); private final boolean mHasDistinctMultitouch; private int mOldPointerCount = 1; @@ -248,9 +171,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private final Rect mClipRegion = new Rect(0, 0, 0, 0); // This map caches key label text height in pixel as value and key label text size as map key. private final HashMap<Integer, Integer> mTextHeightCache = new HashMap<Integer, Integer>(); - // Distance from horizontal center of the key, proportional to key label text height. - private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR = 0.55f; - private final String KEY_LABEL_HEIGHT_REFERENCE_CHAR = "H"; + // Distance from horizontal center of the key, proportional to key label text height and width. + private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER = 0.45f; + private final float KEY_LABEL_VERTICAL_PADDING_FACTOR = 1.60f; + private final String KEY_LABEL_REFERENCE_CHAR = "H"; + private final int KEY_LABEL_OPTION_ALIGN_LEFT = 1; + private final int KEY_LABEL_OPTION_ALIGN_RIGHT = 2; + private final int KEY_LABEL_OPTION_ALIGN_BOTTOM = 8; + private final int KEY_LABEL_OPTION_FONT_NORMAL = 16; + private final int mKeyLabelHorizontalPadding; private final UIHandler mHandler = new UIHandler(); @@ -259,6 +188,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private static final int MSG_DISMISS_PREVIEW = 2; private static final int MSG_REPEAT_KEY = 3; private static final int MSG_LONGPRESS_KEY = 4; + private static final int MSG_LONGPRESS_SHIFT_KEY = 5; private boolean mInKeyRepeat; @@ -282,6 +212,11 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx openPopupIfRequired(msg.arg1, tracker); break; } + case MSG_LONGPRESS_SHIFT_KEY: { + final PointerTracker tracker = (PointerTracker)msg.obj; + onLongPressShiftKey(tracker); + break; + } } } @@ -325,17 +260,26 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } public void startLongPressTimer(long delay, int keyIndex, PointerTracker tracker) { - removeMessages(MSG_LONGPRESS_KEY); + cancelLongPressTimers(); sendMessageDelayed(obtainMessage(MSG_LONGPRESS_KEY, keyIndex, 0, tracker), delay); } - public void cancelLongPressTimer() { + public void startLongPressShiftTimer(long delay, int keyIndex, PointerTracker tracker) { + cancelLongPressTimers(); + if (ENABLE_CAPSLOCK_BY_LONGPRESS) { + sendMessageDelayed( + obtainMessage(MSG_LONGPRESS_SHIFT_KEY, keyIndex, 0, tracker), delay); + } + } + + public void cancelLongPressTimers() { removeMessages(MSG_LONGPRESS_KEY); + removeMessages(MSG_LONGPRESS_SHIFT_KEY); } public void cancelKeyTimers() { cancelKeyRepeatTimer(); - cancelLongPressTimer(); + cancelLongPressTimers(); } public void cancelAllMessages() { @@ -345,73 +289,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } } - static class PointerQueue { - private LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>(); - - public void add(PointerTracker tracker) { - mQueue.add(tracker); - } - - public int lastIndexOf(PointerTracker tracker) { - LinkedList<PointerTracker> queue = mQueue; - for (int index = queue.size() - 1; index >= 0; index--) { - PointerTracker t = queue.get(index); - if (t == tracker) - return index; - } - return -1; - } - - public void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) { - LinkedList<PointerTracker> queue = mQueue; - int oldestPos = 0; - for (PointerTracker t = queue.get(oldestPos); t != tracker; t = queue.get(oldestPos)) { - if (t.isModifier()) { - oldestPos++; - } else { - t.onUpEvent(t.getLastX(), t.getLastY(), eventTime); - t.setAlreadyProcessed(); - queue.remove(oldestPos); - } - } - } - - public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) { - for (PointerTracker t : mQueue) { - if (t == tracker) - continue; - t.onUpEvent(t.getLastX(), t.getLastY(), eventTime); - t.setAlreadyProcessed(); - } - mQueue.clear(); - if (tracker != null) - mQueue.add(tracker); - } - - public void remove(PointerTracker tracker) { - mQueue.remove(tracker); - } - - public boolean isInSlidingKeyInput() { - for (final PointerTracker tracker : mQueue) { - if (tracker.isInSlidingKeyInput()) - return true; - } - return false; - } - } - - public LatinKeyboardBaseView(Context context, AttributeSet attrs) { + public KeyboardView(Context context, AttributeSet attrs) { this(context, attrs, R.attr.keyboardViewStyle); } - public LatinKeyboardBaseView(Context context, AttributeSet attrs, int defStyle) { + public KeyboardView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes( - attrs, R.styleable.LatinKeyboardBaseView, defStyle, R.style.LatinKeyboardBaseView); - LayoutInflater inflate = - (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + attrs, R.styleable.KeyboardView, defStyle, R.style.KeyboardView); int previewLayout = 0; int keyTextSize = 0; @@ -421,63 +307,54 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx int attr = a.getIndex(i); switch (attr) { - case R.styleable.LatinKeyboardBaseView_keyBackground: + case R.styleable.KeyboardView_keyBackground: mKeyBackground = a.getDrawable(attr); break; - case R.styleable.LatinKeyboardBaseView_keyHysteresisDistance: + case R.styleable.KeyboardView_keyHysteresisDistance: mKeyHysteresisDistance = a.getDimensionPixelOffset(attr, 0); break; - case R.styleable.LatinKeyboardBaseView_verticalCorrection: + case R.styleable.KeyboardView_verticalCorrection: mVerticalCorrection = a.getDimensionPixelOffset(attr, 0); break; - case R.styleable.LatinKeyboardBaseView_keyPreviewLayout: + case R.styleable.KeyboardView_keyPreviewLayout: previewLayout = a.getResourceId(attr, 0); break; - case R.styleable.LatinKeyboardBaseView_keyPreviewOffset: + case R.styleable.KeyboardView_keyPreviewOffset: mPreviewOffset = a.getDimensionPixelOffset(attr, 0); break; - case R.styleable.LatinKeyboardBaseView_keyPreviewHeight: + case R.styleable.KeyboardView_keyPreviewHeight: mPreviewHeight = a.getDimensionPixelSize(attr, 80); break; - case R.styleable.LatinKeyboardBaseView_keyTextSize: - mKeyTextSize = a.getDimensionPixelSize(attr, 18); + case R.styleable.KeyboardView_keyLetterSize: + mKeyLetterSize = a.getDimensionPixelSize(attr, 18); break; - case R.styleable.LatinKeyboardBaseView_keyTextColor: + case R.styleable.KeyboardView_keyTextColor: mKeyTextColor = a.getColor(attr, 0xFF000000); break; - case R.styleable.LatinKeyboardBaseView_labelTextSize: + case R.styleable.KeyboardView_keyTextColorDisabled: + mKeyTextColorDisabled = a.getColor(attr, 0xFF000000); + break; + case R.styleable.KeyboardView_labelTextSize: mLabelTextSize = a.getDimensionPixelSize(attr, 14); break; - case R.styleable.LatinKeyboardBaseView_popupLayout: + case R.styleable.KeyboardView_popupLayout: mPopupLayout = a.getResourceId(attr, 0); break; - case R.styleable.LatinKeyboardBaseView_shadowColor: + case R.styleable.KeyboardView_shadowColor: mShadowColor = a.getColor(attr, 0); break; - case R.styleable.LatinKeyboardBaseView_shadowRadius: + case R.styleable.KeyboardView_shadowRadius: mShadowRadius = a.getFloat(attr, 0f); break; // TODO: Use Theme (android.R.styleable.Theme_backgroundDimAmount) - case R.styleable.LatinKeyboardBaseView_backgroundDimAmount: + case R.styleable.KeyboardView_backgroundDimAmount: mBackgroundDimAmount = a.getFloat(attr, 0.5f); break; - //case android.R.styleable. - case R.styleable.LatinKeyboardBaseView_keyTextStyle: - int textStyle = a.getInt(attr, 0); - switch (textStyle) { - case 0: - mKeyTextStyle = Typeface.DEFAULT; - break; - case 1: - mKeyTextStyle = Typeface.DEFAULT_BOLD; - break; - default: - mKeyTextStyle = Typeface.defaultFromStyle(textStyle); - break; - } + case R.styleable.KeyboardView_keyLetterStyle: + mKeyLetterStyle = Typeface.defaultFromStyle(a.getInt(attr, Typeface.NORMAL)); break; - case R.styleable.LatinKeyboardBaseView_symbolColorScheme: - mSymbolColorScheme = a.getInt(attr, 0); + case R.styleable.KeyboardView_colorScheme: + mColorScheme = a.getInt(attr, COLOR_SCHEME_WHITE); break; } } @@ -486,7 +363,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mPreviewPopup = new PopupWindow(context); if (previewLayout != 0) { - mPreviewText = (TextView) inflate.inflate(previewLayout, null); + mPreviewText = (TextView) LayoutInflater.from(context).inflate(previewLayout, null); mPreviewTextSizeLarge = (int) res.getDimension(R.dimen.key_preview_text_size_large); mPreviewPopup.setContentView(mPreviewText); mPreviewPopup.setBackgroundDrawable(null); @@ -497,6 +374,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mPreviewPopup.setAnimationStyle(R.style.KeyPreviewAnimation); mDelayBeforePreview = res.getInteger(R.integer.config_delay_before_preview); mDelayAfterPreview = res.getInteger(R.integer.config_delay_after_preview); + mKeyLabelHorizontalPadding = (int)res.getDimension( + R.dimen.key_label_horizontal_alignment_padding); mMiniKeyboardParent = this; mMiniKeyboardPopup = new PopupWindow(context); @@ -519,41 +398,47 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx GestureDetector.SimpleOnGestureListener listener = new GestureDetector.SimpleOnGestureListener() { + private boolean mProcessingDoubleTapEvent = false; + @Override public boolean onFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) { final float absX = Math.abs(velocityX); final float absY = Math.abs(velocityY); - float deltaX = me2.getX() - me1.getX(); float deltaY = me2.getY() - me1.getY(); - int travelX = getWidth() / 2; // Half the keyboard width int travelY = getHeight() / 2; // Half the keyboard height mSwipeTracker.computeCurrentVelocity(1000); - final float endingVelocityX = mSwipeTracker.getXVelocity(); final float endingVelocityY = mSwipeTracker.getYVelocity(); - if (velocityX > mSwipeThreshold && absY < absX && deltaX > travelX) { - if (mDisambiguateSwipe && endingVelocityX >= velocityX / 4) { - swipeRight(); - return true; - } - } else if (velocityX < -mSwipeThreshold && absY < absX && deltaX < -travelX) { - if (mDisambiguateSwipe && endingVelocityX <= velocityX / 4) { - swipeLeft(); - return true; - } - } else if (velocityY < -mSwipeThreshold && absX < absY && deltaY < -travelY) { - if (mDisambiguateSwipe && endingVelocityY <= velocityY / 4) { - swipeUp(); + if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) { + if (mDisambiguateSwipe && endingVelocityY >= velocityY / 4) { + onSwipeDown(); return true; } - } else if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) { - if (mDisambiguateSwipe && endingVelocityY >= velocityY / 4) { - swipeDown(); + } + return false; + } + + @Override + public boolean onDoubleTap(MotionEvent e) { + if (ENABLE_CAPSLOCK_BY_DOUBLETAP && mKeyboard instanceof LatinKeyboard + && ((LatinKeyboard) mKeyboard).isAlphaKeyboard()) { + final int pointerIndex = e.getActionIndex(); + final int id = e.getPointerId(pointerIndex); + final PointerTracker tracker = getPointerTracker(id); + if (tracker.isOnShiftKey((int)e.getX(), (int)e.getY())) { + onDoubleTapShiftKey(tracker); + mProcessingDoubleTapEvent = true; return true; } } + mProcessingDoubleTapEvent = false; return false; } + + @Override + public boolean onDoubleTapEvent(MotionEvent e) { + return mProcessingDoubleTapEvent; + } }; final boolean ignoreMultitouch = true; @@ -565,7 +450,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); } - public void setOnKeyboardActionListener(OnKeyboardActionListener listener) { + public void setOnKeyboardActionListener(KeyboardActionListener listener) { mKeyboardActionListener = listener; for (PointerTracker tracker : mPointerTrackers) { tracker.setOnKeyboardActionListener(listener); @@ -573,10 +458,10 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } /** - * Returns the {@link OnKeyboardActionListener} object. + * Returns the {@link KeyboardActionListener} object. * @return the listener attached to this keyboard */ - protected OnKeyboardActionListener getOnKeyboardActionListener() { + protected KeyboardActionListener getOnKeyboardActionListener() { return mKeyboardActionListener; } @@ -598,15 +483,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx LatinImeLogger.onSetKeyboard(keyboard); mKeys = mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(), -getPaddingTop() + mVerticalCorrection); - mKeyboardVerticalGap = (int)getResources().getDimension(R.dimen.key_bottom_gap); for (PointerTracker tracker : mPointerTrackers) { - tracker.setKeyboard(mKeys, mKeyHysteresisDistance); + tracker.setKeyboard(keyboard, mKeys, mKeyHysteresisDistance); } requestLayout(); // Hint to reallocate the buffer if the size changed mKeyboardChanged = true; invalidateAllKeys(); - computeProximityThreshold(keyboard); + computeProximityThreshold(keyboard, mKeys); mMiniKeyboardCache.clear(); } @@ -623,39 +507,12 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx * Return whether the device has distinct multi-touch panel. * @return true if the device has distinct multi-touch panel. */ + @Override public boolean hasDistinctMultitouch() { return mHasDistinctMultitouch; } /** - * Sets the state of the shift key of the keyboard, if any. - * @param shifted whether or not to enable the state of the shift key - * @return true if the shift key state changed, false if there was no change - */ - public boolean setShifted(boolean shifted) { - if (mKeyboard != null) { - if (mKeyboard.setShifted(shifted)) { - // The whole keyboard probably needs to be redrawn - invalidateAllKeys(); - return true; - } - } - return false; - } - - /** - * Returns the state of the shift key of the keyboard, if any. - * @return true if the shift is in a pressed state, false otherwise. If there is - * no shift key on the keyboard or there is no keyboard attached, it returns false. - */ - public boolean isShifted() { - if (mKeyboard != null) { - return mKeyboard.isShifted(); - } - return false; - } - - /** * Enables or disables the key feedback popup. This is a popup that shows a magnified * version of the depressed key. By default the preview is enabled. * @param previewEnabled whether or not to enable the key feedback popup @@ -674,8 +531,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return mShowPreview; } - public int getSymbolColorScheme() { - return mSymbolColorScheme; + public int getColorScheme() { + return mColorScheme; } public void setPopupParent(View v) { @@ -689,7 +546,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } /** - * When enabled, calls to {@link OnKeyboardActionListener#onKey} will include key + * When enabled, calls to {@link KeyboardActionListener#onCodeInput} will include key * codes for adjacent keys. When disabled, only the primary key code will be * reported. * @param enabled whether or not the proximity correction is enabled @@ -706,9 +563,9 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } protected CharSequence adjustCase(CharSequence label) { - if (mKeyboard.isShifted() && label != null && label.length() < 3 + if (mKeyboard.isShiftedOrShiftLocked() && label != null && label.length() < 3 && Character.isLowerCase(label.charAt(0))) { - label = label.toString().toUpperCase(); + return label.toString().toUpperCase(); } return label; } @@ -730,23 +587,27 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } /** - * Compute the average distance between adjacent keys (horizontally and vertically) - * and square it to get the proximity threshold. We use a square here and in computing - * the touch distance from a key's center to avoid taking a square root. + * Compute the most common key width and use it as proximity key detection threshold. * @param keyboard + * @param keys */ - private void computeProximityThreshold(Keyboard keyboard) { - if (keyboard == null) return; - final Key[] keys = mKeys; - if (keys == null) return; - int length = keys.length; - int dimensionSum = 0; - for (int i = 0; i < length; i++) { - Key key = keys[i]; - dimensionSum += Math.min(key.width, key.height + mKeyboardVerticalGap) + key.gap; + private void computeProximityThreshold(Keyboard keyboard, Key[] keys) { + if (keyboard == null || keys == null || keys.length == 0) return; + final HashMap<Integer, Integer> histogram = new HashMap<Integer, Integer>(); + int maxCount = 0; + int mostCommonWidth = 0; + for (Key key : keys) { + 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; + } } - if (dimensionSum < 0 || length == 0) return; - mKeyDetector.setProximityThreshold((int) (dimensionSum * 1.4f / length)); + mKeyDetector.setProximityThreshold(mostCommonWidth); } @Override @@ -765,6 +626,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx canvas.drawBitmap(mBuffer, 0, 0, null); } + @SuppressWarnings("unused") private void onBufferDraw() { if (mBuffer == null || mKeyboardChanged) { if (mBuffer == null || mKeyboardChanged && @@ -791,16 +653,16 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx final int kbdPaddingTop = getPaddingTop(); final Key[] keys = mKeys; final Key invalidKey = mInvalidatedKey; + final boolean isManualTemporaryUpperCase = mKeyboard.isManualTemporaryUpperCase(); - paint.setColor(mKeyTextColor); boolean drawSingleKey = false; if (invalidKey != null && canvas.getClipBounds(clipRegion)) { // TODO we should use Rect.inset and Rect.contains here. // Is clipRegion completely contained within the invalidated key? - if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left && - invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top && - invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right && - invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) { + if (invalidKey.mX + kbdPaddingLeft - 1 <= clipRegion.left && + invalidKey.mY + kbdPaddingTop - 1 <= clipRegion.top && + invalidKey.mX + invalidKey.mWidth + kbdPaddingLeft + 1 >= clipRegion.right && + invalidKey.mY + invalidKey.mHeight + kbdPaddingTop + 1 >= clipRegion.bottom) { drawSingleKey = true; } } @@ -815,77 +677,125 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx keyBackground.setState(drawableState); // Switch the character to uppercase if shift is pressed - String label = key.label == null? null : adjustCase(key.label).toString(); + String label = key.mLabel == null? null : adjustCase(key.mLabel).toString(); final Rect bounds = keyBackground.getBounds(); - if (key.width != bounds.right || key.height != bounds.bottom) { - keyBackground.setBounds(0, 0, key.width, key.height); + if (key.mWidth != bounds.right || key.mHeight != bounds.bottom) { + keyBackground.setBounds(0, 0, key.mWidth, key.mHeight); } - canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop); + canvas.translate(key.mX + kbdPaddingLeft, key.mY + kbdPaddingTop); keyBackground.draw(canvas); - boolean shouldDrawIcon = true; + final int rowHeight = padding.top + key.mHeight; + // Draw key label if (label != null) { // For characters, use large font. For labels like "Done", use small font. - final int labelSize; - if (label.length() > 1 && key.codes.length < 2) { - labelSize = mLabelTextSize; - paint.setTypeface(Typeface.DEFAULT_BOLD); + final int labelSize = getLabelSizeAndSetPaint(label, key.mLabelOption, paint); + final int labelCharHeight = getLabelCharHeight(labelSize, paint); + + // Vertical label text alignment. + final float baseline; + if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_BOTTOM) != 0) { + baseline = key.mHeight - + + labelCharHeight * KEY_LABEL_VERTICAL_PADDING_FACTOR; + if (DEBUG_SHOW_ALIGN) + drawHorizontalLine(canvas, (int)baseline, key.mWidth, 0xc0008000, + new Paint()); + } else { // Align center + final float centerY = (key.mHeight + padding.top - padding.bottom) / 2; + baseline = centerY + + labelCharHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER; + if (DEBUG_SHOW_ALIGN) + drawHorizontalLine(canvas, (int)baseline, key.mWidth, 0xc0008000, + new Paint()); + } + // Horizontal label text alignment + final int positionX; + if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_LEFT) != 0) { + positionX = mKeyLabelHorizontalPadding + padding.left; + paint.setTextAlign(Align.LEFT); + if (DEBUG_SHOW_ALIGN) + drawVerticalLine(canvas, positionX, rowHeight, 0xc0800080, new Paint()); + } else if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_RIGHT) != 0) { + positionX = key.mWidth - mKeyLabelHorizontalPadding - padding.right; + paint.setTextAlign(Align.RIGHT); + if (DEBUG_SHOW_ALIGN) + drawVerticalLine(canvas, positionX, rowHeight, 0xc0808000, new Paint()); } else { - labelSize = mKeyTextSize; - paint.setTypeface(mKeyTextStyle); + positionX = (key.mWidth + padding.left - padding.right) / 2; + paint.setTextAlign(Align.CENTER); + if (DEBUG_SHOW_ALIGN && label.length() > 1) + drawVerticalLine(canvas, positionX, rowHeight, 0xc0008080, new Paint()); } - paint.setTextSize(labelSize); - - Integer labelHeightValue = mTextHeightCache.get(labelSize); - final int labelHeight; - if (labelHeightValue != null) { - labelHeight = labelHeightValue; + if (key.mManualTemporaryUpperCaseHintIcon != null && isManualTemporaryUpperCase) { + paint.setColor(mKeyTextColorDisabled); } else { - Rect textBounds = new Rect(); - paint.getTextBounds(KEY_LABEL_HEIGHT_REFERENCE_CHAR, 0, 1, textBounds); - labelHeight = textBounds.height(); - mTextHeightCache.put(labelSize, labelHeight); + paint.setColor(mKeyTextColor); } - - // Draw a drop shadow for the text + // Set a drop shadow for the text paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor); - final int centerX = (key.width + padding.left - padding.right) / 2; - final int centerY = (key.height + padding.top - padding.bottom) / 2; - final float baseline = centerY - + labelHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR; - canvas.drawText(label, centerX, baseline, paint); + canvas.drawText(label, positionX, baseline, paint); // Turn off drop shadow paint.setShadowLayer(0, 0, 0, 0); - - // Usually don't draw icon if label is not null, but we draw icon for the number - // hint and popup hint. - shouldDrawIcon = shouldDrawLabelAndIcon(key); } - if (key.icon != null && shouldDrawIcon) { - // Special handing for the upper-right number hint icons - final int drawableWidth; - final int drawableHeight; + // Draw key icon + final Drawable icon = key.getIcon(); + if (key.mLabel == null && icon != null) { + final int drawableWidth = icon.getIntrinsicWidth(); + final int drawableHeight = icon.getIntrinsicHeight(); final int drawableX; - final int drawableY; - if (shouldDrawIconFully(key)) { - drawableWidth = key.width; - drawableHeight = key.height; - drawableX = 0; - drawableY = NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL; - } else { - drawableWidth = key.icon.getIntrinsicWidth(); - drawableHeight = key.icon.getIntrinsicHeight(); - drawableX = (key.width + padding.left - padding.right - drawableWidth) / 2; - drawableY = (key.height + padding.top - padding.bottom - drawableHeight) / 2; + final int drawableY = ( + key.mHeight + padding.top - padding.bottom - drawableHeight) / 2; + if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_LEFT) != 0) { + drawableX = padding.left + mKeyLabelHorizontalPadding; + if (DEBUG_SHOW_ALIGN) + drawVerticalLine(canvas, drawableX, rowHeight, 0xc0800080, new Paint()); + } else if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_RIGHT) != 0) { + drawableX = key.mWidth - padding.right - mKeyLabelHorizontalPadding + - drawableWidth; + if (DEBUG_SHOW_ALIGN) + drawVerticalLine(canvas, drawableX + drawableWidth, rowHeight, + 0xc0808000, new Paint()); + } else { // Align center + drawableX = (key.mWidth + padding.left - padding.right - drawableWidth) / 2; + if (DEBUG_SHOW_ALIGN) + drawVerticalLine(canvas, drawableX + drawableWidth / 2, rowHeight, + 0xc0008080, new Paint()); } - canvas.translate(drawableX, drawableY); - key.icon.setBounds(0, 0, drawableWidth, drawableHeight); - key.icon.draw(canvas); - canvas.translate(-drawableX, -drawableY); + drawIcon(canvas, icon, drawableX, drawableY, drawableWidth, drawableHeight); + if (DEBUG_SHOW_ALIGN) + drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight, + 0x80c00000, new Paint()); + } + if (key.mHintIcon != null) { + final int drawableWidth = key.mWidth; + final int drawableHeight = key.mHeight; + final int drawableX = 0; + final int drawableY = HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL; + Drawable hintIcon = (isManualTemporaryUpperCase + && key.mManualTemporaryUpperCaseHintIcon != null) + ? key.mManualTemporaryUpperCaseHintIcon : key.mHintIcon; + drawIcon(canvas, hintIcon, drawableX, drawableY, drawableWidth, drawableHeight); + if (DEBUG_SHOW_ALIGN) + drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight, + 0x80c0c000, new Paint()); } - canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop); + canvas.translate(-key.mX - kbdPaddingLeft, -key.mY - kbdPaddingTop); } + + 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); + } + mInvalidatedKey = null; // Overlay a dark rectangle to dim the keyboard if (mMiniKeyboard != null) { @@ -916,28 +826,97 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mDirtyRect.setEmpty(); } + public int getLabelSizeAndSetPaint(CharSequence label, int keyLabelOption, Paint paint) { + // For characters, use large font. For labels like "Done", use small font. + final int labelSize; + final Typeface labelStyle; + if (label.length() > 1) { + labelSize = mLabelTextSize; + if ((keyLabelOption & KEY_LABEL_OPTION_FONT_NORMAL) != 0) { + labelStyle = Typeface.DEFAULT; + } else { + labelStyle = Typeface.DEFAULT_BOLD; + } + } else { + labelSize = mKeyLetterSize; + labelStyle = mKeyLetterStyle; + } + paint.setTextSize(labelSize); + paint.setTypeface(labelStyle); + return labelSize; + } + + private int getLabelCharHeight(int labelSize, Paint paint) { + Integer labelHeightValue = mTextHeightCache.get(labelSize); + final int labelCharHeight; + if (labelHeightValue != null) { + labelCharHeight = labelHeightValue; + } else { + Rect textBounds = new Rect(); + paint.getTextBounds(KEY_LABEL_REFERENCE_CHAR, 0, 1, textBounds); + labelCharHeight = textBounds.height(); + mTextHeightCache.put(labelSize, labelCharHeight); + } + return labelCharHeight; + } + + private static void drawIcon(Canvas canvas, Drawable icon, int x, int y, int width, + int height) { + canvas.translate(x, y); + icon.setBounds(0, 0, width, height); + icon.draw(canvas); + canvas.translate(-x, -y); + } + + private static void drawHorizontalLine(Canvas canvas, int y, int w, int color, Paint paint) { + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(1.0f); + paint.setColor(color); + canvas.drawLine(0, y, w, y, paint); + } + + private static void drawVerticalLine(Canvas canvas, int x, int h, int color, Paint paint) { + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(1.0f); + paint.setColor(color); + canvas.drawLine(x, 0, x, h, paint); + } + + private static void drawRectangle(Canvas canvas, int x, int y, int w, int h, int color, + Paint paint) { + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(1.0f); + paint.setColor(color); + canvas.translate(x, y); + canvas.drawRect(0, 0, w, h, paint); + canvas.translate(-x, -y); + } + + public void setForeground(boolean foreground) { + mInForeground = foreground; + } + // TODO: clean up this method. private void dismissKeyPreview() { for (PointerTracker tracker : mPointerTrackers) - tracker.updateKey(NOT_A_KEY); - showPreview(NOT_A_KEY, null); + tracker.releaseKey(); + showPreview(KeyDetector.NOT_A_KEY, null); } + @Override public void showPreview(int keyIndex, PointerTracker tracker) { int oldKeyIndex = mOldPreviewKeyIndex; mOldPreviewKeyIndex = keyIndex; - final boolean isLanguageSwitchEnabled = (mKeyboard instanceof LatinKeyboard) - && ((LatinKeyboard)mKeyboard).isLanguageSwitchEnabled(); // We should re-draw popup preview when 1) we need to hide the preview, 2) we will show // the space key preview and 3) pointer moves off the space key to other letter key, we // should hide the preview of the previous key. final boolean hidePreviewOrShowSpaceKeyPreview = (tracker == null) - || tracker.isSpaceKey(keyIndex) || tracker.isSpaceKey(oldKeyIndex); + || (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher() + && SubtypeSwitcher.getInstance().needsToDisplayLanguage() + && (tracker.isSpaceKey(keyIndex) || tracker.isSpaceKey(oldKeyIndex))); // If key changed and preview is on or the key is space (language switch is enabled) - if (oldKeyIndex != keyIndex - && (mShowPreview - || (hidePreviewOrShowSpaceKeyPreview && isLanguageSwitchEnabled))) { - if (keyIndex == NOT_A_KEY) { + if (oldKeyIndex != keyIndex && (mShowPreview || (hidePreviewOrShowSpaceKeyPreview))) { + if (keyIndex == KeyDetector.NOT_A_KEY) { mHandler.cancelPopupPreview(); mHandler.dismissPreview(mDelayAfterPreview); } else if (tracker != null) { @@ -946,29 +925,35 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } } + // TODO Must fix popup preview on xlarge layout private void showKey(final int keyIndex, PointerTracker tracker) { Key key = tracker.getKey(keyIndex); - if (key == null) + // If keyIndex is invalid or IME is already closed, we must not show key preview. + // Trying to show preview PopupWindow while root window is closed causes + // WindowManager.BadTokenException. + if (key == null || !mInForeground) return; - // Should not draw hint icon in key preview - if (key.icon != null && !shouldDrawLabelAndIcon(key)) { - mPreviewText.setCompoundDrawables(null, null, null, - key.iconPreview != null ? key.iconPreview : key.icon); - mPreviewText.setText(null); - } else { + // What we show as preview should match what we show on key top in onBufferDraw(). + if (key.mLabel != null) { + // TODO Should take care of temporaryShiftLabel here. mPreviewText.setCompoundDrawables(null, null, null, null); mPreviewText.setText(adjustCase(tracker.getPreviewText(key))); - if (key.label.length() > 1 && key.codes.length < 2) { - mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyTextSize); + if (key.mLabel.length() > 1) { + mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyLetterSize); mPreviewText.setTypeface(Typeface.DEFAULT_BOLD); } else { mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge); - mPreviewText.setTypeface(mKeyTextStyle); + mPreviewText.setTypeface(mKeyLetterStyle); } + } else { + final Drawable previewIcon = key.getPreviewIcon(); + mPreviewText.setCompoundDrawables(null, null, null, + previewIcon != null ? previewIcon : key.getIcon()); + mPreviewText.setText(null); } mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); - int popupWidth = Math.max(mPreviewText.getMeasuredWidth(), key.width + int popupWidth = Math.max(mPreviewText.getMeasuredWidth(), key.mWidth + mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight()); final int popupHeight = mPreviewHeight; LayoutParams lp = mPreviewText.getLayoutParams(); @@ -977,8 +962,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx lp.height = popupHeight; } - int popupPreviewX = key.x - (popupWidth - key.width) / 2; - int popupPreviewY = key.y - popupHeight + mPreviewOffset; + int popupPreviewX = key.mX - (popupWidth - key.mWidth) / 2; + int popupPreviewY = key.mY - popupHeight + mPreviewOffset; mHandler.cancelDismissPreview(); if (mOffsetInWindow == null) { @@ -992,7 +977,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } // Set the preview background state mPreviewText.getBackground().setState( - key.popupResId != 0 ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET); + key.mPopupCharacters != null ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET); popupPreviewX += mOffsetInWindow[0]; popupPreviewY += mOffsetInWindow[1]; @@ -1000,21 +985,26 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx if (popupPreviewY + mWindowY < 0) { // If the key you're pressing is on the left side of the keyboard, show the popup on // the right, offset by enough to see at least one key to the left/right. - if (key.x + key.width <= getWidth() / 2) { - popupPreviewX += (int) (key.width * 2.5); + if (key.mX + key.mWidth <= getWidth() / 2) { + popupPreviewX += (int) (key.mWidth * 2.5); } else { - popupPreviewX -= (int) (key.width * 2.5); + popupPreviewX -= (int) (key.mWidth * 2.5); } popupPreviewY += popupHeight; } - if (mPreviewPopup.isShowing()) { - mPreviewPopup.update(popupPreviewX, popupPreviewY, popupWidth, popupHeight); - } else { - mPreviewPopup.setWidth(popupWidth); - mPreviewPopup.setHeight(popupHeight); - mPreviewPopup.showAtLocation(mMiniKeyboardParent, Gravity.NO_GRAVITY, - popupPreviewX, popupPreviewY); + try { + if (mPreviewPopup.isShowing()) { + mPreviewPopup.update(popupPreviewX, popupPreviewY, popupWidth, popupHeight); + } else { + mPreviewPopup.setWidth(popupWidth); + mPreviewPopup.setHeight(popupHeight); + mPreviewPopup.showAtLocation(mMiniKeyboardParent, Gravity.NO_GRAVITY, + popupPreviewX, popupPreviewY); + } + } catch (WindowManager.BadTokenException e) { + // Swallow the exception which will be happened when IME is already closed. + Log.w(TAG, "LatinIME is already closed when tried showing key preview."); } // Record popup preview position to display mini-keyboard later at the same positon mPopupPreviewDisplayedY = popupPreviewY; @@ -1040,16 +1030,17 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx * @param key key in the attached {@link Keyboard}. * @see #invalidateAllKeys */ + @Override public void invalidateKey(Key key) { if (key == null) return; mInvalidatedKey = key; // TODO we should clean up this and record key's region to use in onBufferDraw. - mDirtyRect.union(key.x + getPaddingLeft(), key.y + getPaddingTop(), - key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop()); + mDirtyRect.union(key.mX + getPaddingLeft(), key.mY + getPaddingTop(), + key.mX + key.mWidth + getPaddingLeft(), key.mY + key.mHeight + getPaddingTop()); onBufferDraw(); - invalidate(key.x + getPaddingLeft(), key.y + getPaddingTop(), - key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop()); + invalidate(key.mX + getPaddingLeft(), key.mY + getPaddingTop(), + key.mX + key.mWidth + getPaddingLeft(), key.mY + key.mHeight + getPaddingTop()); } private boolean openPopupIfRequired(int keyIndex, PointerTracker tracker) { @@ -1072,43 +1063,55 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return result; } + private void onLongPressShiftKey(PointerTracker tracker) { + tracker.setAlreadyProcessed(); + mPointerQueue.remove(tracker); + mKeyboardActionListener.onCodeInput(Keyboard.CODE_CAPSLOCK, null, 0, 0); + } + + private void onDoubleTapShiftKey(@SuppressWarnings("unused") PointerTracker tracker) { + // When shift key is double tapped, the first tap is correctly processed as usual tap. And + // the second tap is treated as this double tap event, so that we need not mark tracker + // calling setAlreadyProcessed() nor remove the tracker from mPointerQueueueue. + mKeyboardActionListener.onCodeInput(Keyboard.CODE_CAPSLOCK, null, 0, 0); + } + private View inflateMiniKeyboardContainer(Key popupKey) { - int popupKeyboardId = popupKey.popupResId; - LayoutInflater inflater = (LayoutInflater)getContext().getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - View container = inflater.inflate(mPopupLayout, null); + int popupKeyboardResId = mKeyboard.getPopupKeyboardResId(); + View container = LayoutInflater.from(getContext()).inflate(mPopupLayout, null); if (container == null) throw new NullPointerException(); - LatinKeyboardBaseView miniKeyboard = - (LatinKeyboardBaseView)container.findViewById(R.id.LatinKeyboardBaseView); - miniKeyboard.setOnKeyboardActionListener(new OnKeyboardActionListener() { - public void onKey(int primaryCode, int[] keyCodes, int x, int y) { - mKeyboardActionListener.onKey(primaryCode, keyCodes, x, y); + KeyboardView miniKeyboard = + (KeyboardView)container.findViewById(R.id.KeyboardView); + miniKeyboard.setOnKeyboardActionListener(new KeyboardActionListener() { + @Override + public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) { + mKeyboardActionListener.onCodeInput(primaryCode, keyCodes, x, y); dismissPopupKeyboard(); } - public void onText(CharSequence text) { - mKeyboardActionListener.onText(text); + @Override + public void onTextInput(CharSequence text) { + mKeyboardActionListener.onTextInput(text); dismissPopupKeyboard(); } - public void onCancel() { - mKeyboardActionListener.onCancel(); + @Override + public void onCancelInput() { + mKeyboardActionListener.onCancelInput(); dismissPopupKeyboard(); } - public void swipeLeft() { - } - public void swipeRight() { - } - public void swipeUp() { - } - public void swipeDown() { + @Override + public void onSwipeDown() { + // Nothing to do. } + @Override public void onPress(int primaryCode) { mKeyboardActionListener.onPress(primaryCode); } + @Override public void onRelease(int primaryCode) { mKeyboardActionListener.onRelease(primaryCode); } @@ -1118,13 +1121,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Remove gesture detector on mini-keyboard miniKeyboard.mGestureDetector = null; - Keyboard keyboard; - if (popupKey.popupCharacters != null) { - keyboard = new Keyboard(getContext(), popupKeyboardId, popupKey.popupCharacters, - -1, getPaddingLeft() + getPaddingRight()); - } else { - keyboard = new Keyboard(getContext(), popupKeyboardId); - } + Keyboard keyboard = new MiniKeyboardBuilder(this, popupKeyboardResId, popupKey) + .build(); miniKeyboard.setKeyboard(keyboard); miniKeyboard.setPopupParent(this); @@ -1136,14 +1134,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private static boolean isOneRowKeys(List<Key> keys) { if (keys.size() == 0) return false; - final int edgeFlags = keys.get(0).edgeFlags; + final int edgeFlags = keys.get(0).mEdgeFlags; // HACK: The first key of mini keyboard which was inflated from xml and has multiple rows, // does not have both top and bottom edge flags on at the same time. On the other hand, // the first key of mini keyboard that was created with popupCharacters must have both top // and bottom edge flags on. // When you want to use one row mini-keyboard from xml file, make sure that the row has // both top and bottom edge flags set. - return (edgeFlags & Keyboard.EDGE_TOP) != 0 && (edgeFlags & Keyboard.EDGE_BOTTOM) != 0; + return (edgeFlags & Keyboard.EDGE_TOP) != 0 + && (edgeFlags & Keyboard.EDGE_BOTTOM) != 0; } /** @@ -1154,10 +1153,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx * method on the base class if the subclass doesn't wish to handle the call. */ protected boolean onLongPress(Key popupKey) { - // TODO if popupKey.popupCharacters has only one letter, send it as key without opening - // mini keyboard. - - if (popupKey.popupResId == 0) + if (popupKey.mPopupCharacters == null) return false; View container = mMiniKeyboardCache.get(popupKey); @@ -1165,7 +1161,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx container = inflateMiniKeyboardContainer(popupKey); mMiniKeyboardCache.put(popupKey, container); } - mMiniKeyboard = (LatinKeyboardBaseView)container.findViewById(R.id.LatinKeyboardBaseView); + mMiniKeyboard = (KeyboardView)container.findViewById(R.id.KeyboardView); if (mWindowOffset == null) { mWindowOffset = new int[2]; getLocationInWindow(mWindowOffset); @@ -1179,22 +1175,22 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // b) When we have the rightmost key in popup keyboard directly above the pressed key // Left edges of both keys should be aligned for consistent default selection final List<Key> miniKeys = mMiniKeyboard.getKeyboard().getKeys(); - final int miniKeyWidth = miniKeys.size() > 0 ? miniKeys.get(0).width : 0; + final int miniKeyWidth = miniKeys.size() > 0 ? miniKeys.get(0).mWidth : 0; // HACK: Have the leftmost number in the popup characters right above the key boolean isNumberAtLeftmost = hasMultiplePopupChars(popupKey) && isNumberAtLeftmostPopupChar(popupKey); - int popupX = popupKey.x + mWindowOffset[0]; + int popupX = popupKey.mX + mWindowOffset[0]; popupX += getPaddingLeft(); if (isNumberAtLeftmost) { - popupX += popupKey.width - miniKeyWidth; // adjustment for a) described above + popupX += popupKey.mWidth - miniKeyWidth; // adjustment for a) described above popupX -= container.getPaddingLeft(); } else { popupX += miniKeyWidth; // adjustment for b) described above popupX -= container.getMeasuredWidth(); popupX += container.getPaddingRight(); } - int popupY = popupKey.y + mWindowOffset[1]; + int popupY = popupKey.mY + mWindowOffset[1]; popupY += getPaddingTop(); popupY -= container.getMeasuredHeight(); popupY += container.getPaddingBottom(); @@ -1210,7 +1206,11 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mMiniKeyboardOriginX = adjustedX + container.getPaddingLeft() - mWindowOffset[0]; mMiniKeyboardOriginY = y + container.getPaddingTop() - mWindowOffset[1]; mMiniKeyboard.setPopupOffset(adjustedX, y); - mMiniKeyboard.setShifted(isShifted()); + Keyboard baseMiniKeyboard = mMiniKeyboard.getKeyboard(); + if (baseMiniKeyboard != null && baseMiniKeyboard.setShifted(mKeyboard == null + ? false : mKeyboard.isShiftedOrShiftLocked())) { + mMiniKeyboard.invalidateAllKeys(); + } // Mini keyboard needs no pop-up key preview displayed. mMiniKeyboard.setPreviewEnabled(false); mMiniKeyboardPopup.setContentView(container); @@ -1221,8 +1221,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Inject down event on the key to mini keyboard. long eventTime = SystemClock.uptimeMillis(); mMiniKeyboardPopupTime = eventTime; - MotionEvent downEvent = generateMiniKeyboardMotionEvent(MotionEvent.ACTION_DOWN, popupKey.x - + popupKey.width / 2, popupKey.y + popupKey.height / 2, eventTime); + MotionEvent downEvent = generateMiniKeyboardMotionEvent(MotionEvent.ACTION_DOWN, popupKey.mX + + popupKey.mWidth / 2, popupKey.mY + popupKey.mHeight / 2, eventTime); mMiniKeyboard.onTouchEvent(downEvent); downEvent.recycle(); @@ -1231,45 +1231,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } private static boolean hasMultiplePopupChars(Key key) { - if (key.popupCharacters != null && key.popupCharacters.length() > 1) { + if (key.mPopupCharacters != null && key.mPopupCharacters.length > 1) { return true; } return false; } - private boolean shouldDrawIconFully(Key key) { - return isNumberAtEdgeOfPopupChars(key) || isLatinF1Key(key) - || LatinKeyboard.hasPuncOrSmileysPopup(key); - } - - private boolean shouldDrawLabelAndIcon(Key key) { - return isNumberAtEdgeOfPopupChars(key) || isNonMicLatinF1Key(key) - || LatinKeyboard.hasPuncOrSmileysPopup(key); - } - - private boolean isLatinF1Key(Key key) { - return (mKeyboard instanceof LatinKeyboard) && ((LatinKeyboard)mKeyboard).isF1Key(key); - } - - private boolean isNonMicLatinF1Key(Key key) { - return isLatinF1Key(key) && key.label != null; - } - - private static boolean isNumberAtEdgeOfPopupChars(Key key) { - return isNumberAtLeftmostPopupChar(key) || isNumberAtRightmostPopupChar(key); - } - - /* package */ static boolean isNumberAtLeftmostPopupChar(Key key) { - if (key.popupCharacters != null && key.popupCharacters.length() > 0 - && isAsciiDigit(key.popupCharacters.charAt(0))) { - return true; - } - return false; - } - - /* package */ static boolean isNumberAtRightmostPopupChar(Key key) { - if (key.popupCharacters != null && key.popupCharacters.length() > 0 - && isAsciiDigit(key.popupCharacters.charAt(key.popupCharacters.length() - 1))) { + private static boolean isNumberAtLeftmostPopupChar(Key key) { + if (key.mPopupCharacters != null && isAsciiDigit(key.mPopupCharacters[0].charAt(0))) { return true; } return false; @@ -1287,14 +1256,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private PointerTracker getPointerTracker(final int id) { final ArrayList<PointerTracker> pointers = mPointerTrackers; final Key[] keys = mKeys; - final OnKeyboardActionListener listener = mKeyboardActionListener; + final KeyboardActionListener listener = mKeyboardActionListener; // Create pointer trackers until we can get 'id+1'-th tracker, if needed. for (int i = pointers.size(); i <= id; i++) { final PointerTracker tracker = new PointerTracker(i, mHandler, mKeyDetector, this, getResources()); if (keys != null) - tracker.setKeyboard(keys, mKeyHysteresisDistance); + tracker.setKeyboard(mKeyboard, keys, mKeyHysteresisDistance); if (listener != null) tracker.setOnKeyboardActionListener(listener); pointers.add(tracker); @@ -1384,13 +1353,13 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx if (pointerCount == 1 && oldPointerCount == 2) { // Multi-touch to single touch transition. // Send a down event for the latest pointer. - tracker.onDownEvent(x, y, eventTime); + tracker.onDownEvent(x, y, eventTime, null); } else if (pointerCount == 2 && oldPointerCount == 1) { // Single-touch to multi-touch transition. // Send an up event for the last pointer. - tracker.onUpEvent(tracker.getLastX(), tracker.getLastY(), eventTime); + tracker.onUpEvent(tracker.getLastX(), tracker.getLastY(), eventTime, null); } else if (pointerCount == 1 && oldPointerCount == 1) { - tracker.onTouchEvent(action, x, y, eventTime); + tracker.onTouchEvent(action, x, y, eventTime, null); } else { Log.w(TAG, "Unknown touch panel behavior: pointer count is " + pointerCount + " (old " + oldPointerCount + ")"); @@ -1398,24 +1367,25 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return true; } + final PointerTrackerQueue queue = mPointerQueue; if (action == MotionEvent.ACTION_MOVE) { for (int i = 0; i < pointerCount; i++) { - PointerTracker tracker = getPointerTracker(me.getPointerId(i)); - tracker.onMoveEvent((int)me.getX(i), (int)me.getY(i), eventTime); + final PointerTracker tracker = getPointerTracker(me.getPointerId(i)); + tracker.onMoveEvent((int)me.getX(i), (int)me.getY(i), eventTime, queue); } } else { - PointerTracker tracker = getPointerTracker(id); + final PointerTracker tracker = getPointerTracker(id); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: - onDownEvent(tracker, x, y, eventTime); + tracker.onDownEvent(x, y, eventTime, queue); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: - onUpEvent(tracker, x, y, eventTime); + tracker.onUpEvent(x, y, eventTime, queue); break; case MotionEvent.ACTION_CANCEL: - onCancelEvent(tracker, x, y, eventTime); + tracker.onCancelEvent(x, y, eventTime, queue); break; } } @@ -1423,53 +1393,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return true; } - private void onDownEvent(PointerTracker tracker, int x, int y, long eventTime) { - if (tracker.isOnModifierKey(x, y)) { - // Before processing a down event of modifier key, all pointers already being tracked - // should be released. - mPointerQueue.releaseAllPointersExcept(null, eventTime); - } - tracker.onDownEvent(x, y, eventTime); - mPointerQueue.add(tracker); - } - - private void onUpEvent(PointerTracker tracker, int x, int y, long eventTime) { - if (tracker.isModifier()) { - // Before processing an up event of modifier key, all pointers already being tracked - // should be released. - mPointerQueue.releaseAllPointersExcept(tracker, eventTime); - } else { - int index = mPointerQueue.lastIndexOf(tracker); - if (index >= 0) { - mPointerQueue.releaseAllPointersOlderThan(tracker, eventTime); - } else { - Log.w(TAG, "onUpEvent: corresponding down event not found for pointer " - + tracker.mPointerId); - } - } - tracker.onUpEvent(x, y, eventTime); - mPointerQueue.remove(tracker); - } - - private void onCancelEvent(PointerTracker tracker, int x, int y, long eventTime) { - tracker.onCancelEvent(x, y, eventTime); - mPointerQueue.remove(tracker); - } - - protected void swipeRight() { - mKeyboardActionListener.swipeRight(); - } - - protected void swipeLeft() { - mKeyboardActionListener.swipeLeft(); - } - - protected void swipeUp() { - mKeyboardActionListener.swipeUp(); - } - - protected void swipeDown() { - mKeyboardActionListener.swipeDown(); + protected void onSwipeDown() { + mKeyboardActionListener.onSwipeDown(); } public void closing() { @@ -1480,6 +1405,12 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mBuffer = null; mCanvas = null; mMiniKeyboardCache.clear(); + requestLayout(); + } + + public void purgeKeyboardAndClosing() { + mKeyboard = null; + closing(); } @Override diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java new file mode 100644 index 000000000..888375b93 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java @@ -0,0 +1,464 @@ +/* + * 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 + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SubtypeSwitcher; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Paint.Align; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.util.Log; + +import java.util.List; +import java.util.Locale; + +// TODO: We should remove this class +public class LatinKeyboard extends Keyboard { + + private static final boolean DEBUG_PREFERRED_LETTER = false; + private static final String TAG = "LatinKeyboard"; + + public static final int OPACITY_FULLY_OPAQUE = 255; + private static final int SPACE_LED_LENGTH_PERCENT = 80; + + private final Drawable mSpaceAutoCorrectionIndicator; + private final Drawable mButtonArrowLeftIcon; + private final Drawable mButtonArrowRightIcon; + private final int mSpacebarTextColor; + private final int mSpacebarTextShadowColor; + private float mSpacebarTextFadeFactor = 0.0f; + private final int[] mSpaceKeyIndexArray; + private int mSpaceDragStartX; + private int mSpaceDragLastDiff; + private final Context mContext; + private boolean mCurrentlyInSpace; + private SlidingLocaleDrawable mSlidingLocaleIcon; + private int[] mPrefLetterFrequencies; + private int mPrefLetter; + private int mPrefLetterX; + private int mPrefLetterY; + private int mPrefDistance; + + private static final float SPACEBAR_DRAG_THRESHOLD = 0.8f; + private static final float OVERLAP_PERCENTAGE_LOW_PROB = 0.70f; + private static final float OVERLAP_PERCENTAGE_HIGH_PROB = 0.85f; + // Minimum width of space key preview (proportional to keyboard width) + private static final float SPACEBAR_POPUP_MIN_RATIO = 0.4f; + // 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, + // its short language name will be used instead. + private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f; + + private static int sSpacebarVerticalCorrection; + + 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) { + super(context, id.getXmlId(), id); + final Resources res = context.getResources(); + mContext = context; + mSpacebarTextColor = res.getColor(R.color.latinkeyboard_bar_language_text); + if (id.mColorScheme == KeyboardView.COLOR_SCHEME_BLACK) { + mSpacebarTextShadowColor = res.getColor( + R.color.latinkeyboard_bar_language_shadow_black); + } else { // default color scheme is KeyboardView.COLOR_SCHEME_WHITE + mSpacebarTextShadowColor = res.getColor( + R.color.latinkeyboard_bar_language_shadow_white); + } + mSpaceAutoCorrectionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led); + mButtonArrowLeftIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_left); + mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right); + sSpacebarVerticalCorrection = res.getDimensionPixelOffset( + R.dimen.spacebar_vertical_correction); + // The index of space key is available only after Keyboard constructor has finished. + mSpaceKeyIndexArray = new int[] { indexOf(CODE_SPACE) }; + } + + public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboardView view) { + mSpacebarTextFadeFactor = fadeFactor; + updateSpacebarForLocale(false); + if (view != null) + view.invalidateKey(mSpaceKey); + } + + private static int getSpacebarTextColor(int color, float fadeFactor) { + final int newColor = Color.argb((int)(Color.alpha(color) * fadeFactor), + Color.red(color), Color.green(color), Color.blue(color)); + return newColor; + } + + /** + * @return a key which should be invalidated. + */ + public Key onAutoCorrectionStateChanged(boolean isAutoCorrection) { + updateSpacebarForLocale(isAutoCorrection); + return mSpaceKey; + } + + private void updateSpacebarForLocale(boolean isAutoCorrection) { + final Resources res = mContext.getResources(); + // If application locales are explicitly selected. + if (SubtypeSwitcher.getInstance().needsToDisplayLanguage()) { + mSpaceKey.setIcon(new BitmapDrawable(res, + drawSpacebar(OPACITY_FULLY_OPAQUE, isAutoCorrection))); + } else { + // sym_keyboard_space_led can be shared with Black and White symbol themes. + if (isAutoCorrection) { + mSpaceKey.setIcon(new BitmapDrawable(res, + drawSpacebar(OPACITY_FULLY_OPAQUE, isAutoCorrection))); + } else { + mSpaceKey.setIcon(mSpaceIcon); + } + } + } + + // Compute width of text with specified text size using paint. + private static int getTextWidth(Paint paint, String text, float textSize, Rect bounds) { + paint.setTextSize(textSize); + paint.getTextBounds(text, 0, text.length(), bounds); + return bounds.width(); + } + + // Layout local language name and left and right arrow on spacebar. + private static String layoutSpacebar(Paint paint, Locale locale, Drawable lArrow, + Drawable rArrow, int width, int height, float origTextSize, + boolean allowVariableTextSize) { + final float arrowWidth = lArrow.getIntrinsicWidth(); + final float arrowHeight = lArrow.getIntrinsicHeight(); + final float maxTextWidth = width - (arrowWidth + arrowWidth); + final Rect bounds = new Rect(); + + // Estimate appropriate language name text size to fit in maxTextWidth. + 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(maxTextWidth / textWidth, 1.0f); + + final boolean useShortName; + if (allowVariableTextSize) { + textWidth = getTextWidth(paint, language, textSize, bounds); + // If text size goes too small or text does not fit, use short name + useShortName = textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME + || textWidth > maxTextWidth; + } else { + useShortName = textWidth > maxTextWidth; + textSize = origTextSize; + } + if (useShortName) { + language = SubtypeSwitcher.getShortDisplayLanguage(locale); + textWidth = getTextWidth(paint, language, origTextSize, bounds); + textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f); + } + paint.setTextSize(textSize); + + // Place left and right arrow just before and after language text. + final float baseline = height * SPACEBAR_LANGUAGE_BASELINE; + final int top = (int)(baseline - arrowHeight); + final float remains = (width - textWidth) / 2; + lArrow.setBounds((int)(remains - arrowWidth), top, (int)remains, (int)baseline); + rArrow.setBounds((int)(remains + textWidth), top, (int)(remains + textWidth + arrowWidth), + (int)baseline); + + return language; + } + + private Bitmap drawSpacebar(int opacity, boolean isAutoCorrection) { + final int width = mSpaceKey.mWidth; + final int height = mSpaceIcon != null ? mSpaceIcon.getIntrinsicHeight() : mSpaceKey.mHeight; + final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(buffer); + final Resources res = mContext.getResources(); + canvas.drawColor(res.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); + + SubtypeSwitcher subtypeSwitcher = SubtypeSwitcher.getInstance(); + // If application locales are explicitly selected. + if (subtypeSwitcher.needsToDisplayLanguage()) { + final Paint paint = new Paint(); + paint.setAlpha(opacity); + paint.setAntiAlias(true); + paint.setTextAlign(Align.CENTER); + + final String textSizeOfLanguageOnSpacebar = res.getString( + R.string.config_text_size_of_language_on_spacebar, + SMALL_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR); + final int textStyle; + final int defaultTextSize; + if (MEDIUM_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR.equals(textSizeOfLanguageOnSpacebar)) { + textStyle = android.R.style.TextAppearance_Medium; + defaultTextSize = 18; + } else { + textStyle = android.R.style.TextAppearance_Small; + defaultTextSize = 14; + } + + final boolean allowVariableTextSize = true; + final String language = layoutSpacebar(paint, subtypeSwitcher.getInputLocale(), + mButtonArrowLeftIcon, mButtonArrowRightIcon, width, height, + getTextSizeFromTheme(textStyle, defaultTextSize), + allowVariableTextSize); + + // Draw language text with shadow + // In case there is no space icon, we will place the language text at the center of + // spacebar. + final float descent = paint.descent(); + final float textHeight = -paint.ascent() + descent; + final float baseline = (mSpaceIcon != null) ? height * SPACEBAR_LANGUAGE_BASELINE + : height / 2 + textHeight / 2; + paint.setColor(getSpacebarTextColor(mSpacebarTextShadowColor, mSpacebarTextFadeFactor)); + canvas.drawText(language, width / 2, baseline - descent - 1, paint); + paint.setColor(getSpacebarTextColor(mSpacebarTextColor, mSpacebarTextFadeFactor)); + canvas.drawText(language, width / 2, baseline - descent, paint); + + // Put arrows that are already layed out on either side of the text + if (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher() + && subtypeSwitcher.getEnabledKeyboardLocaleCount() > 1) { + mButtonArrowLeftIcon.draw(canvas); + mButtonArrowRightIcon.draw(canvas); + } + } + + // Draw the spacebar icon at the bottom + if (isAutoCorrection) { + final int iconWidth = width * SPACE_LED_LENGTH_PERCENT / 100; + final int iconHeight = mSpaceAutoCorrectionIndicator.getIntrinsicHeight(); + int x = (width - iconWidth) / 2; + int y = height - iconHeight; + mSpaceAutoCorrectionIndicator.setBounds(x, y, x + iconWidth, y + iconHeight); + mSpaceAutoCorrectionIndicator.draw(canvas); + } else if (mSpaceIcon != null) { + final int iconWidth = mSpaceIcon.getIntrinsicWidth(); + final int iconHeight = mSpaceIcon.getIntrinsicHeight(); + int x = (width - iconWidth) / 2; + int y = height - iconHeight; + mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight); + mSpaceIcon.draw(canvas); + } + return buffer; + } + + private void updateLocaleDrag(int diff) { + if (mSlidingLocaleIcon == null) { + final int width = Math.max(mSpaceKey.mWidth, + (int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO)); + final int height = mSpacePreviewIcon.getIntrinsicHeight(); + mSlidingLocaleIcon = + new SlidingLocaleDrawable(mContext, mSpacePreviewIcon, width, height); + mSlidingLocaleIcon.setBounds(0, 0, width, height); + mSpaceKey.setPreviewIcon(mSlidingLocaleIcon); + } + mSlidingLocaleIcon.setDiff(diff); + if (Math.abs(diff) == Integer.MAX_VALUE) { + mSpaceKey.setPreviewIcon(mSpacePreviewIcon); + } else { + mSpaceKey.setPreviewIcon(mSlidingLocaleIcon); + } + mSpaceKey.getPreviewIcon().invalidateSelf(); + } + + public int getLanguageChangeDirection() { + if (mSpaceKey == null || SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() <= 1 + || Math.abs(mSpaceDragLastDiff) < mSpaceKey.mWidth * SPACEBAR_DRAG_THRESHOLD) { + return 0; // No change + } + return mSpaceDragLastDiff > 0 ? 1 : -1; + } + + public void setPreferredLetters(int[] frequencies) { + mPrefLetterFrequencies = frequencies; + mPrefLetter = 0; + } + + public void keyReleased() { + mCurrentlyInSpace = false; + mSpaceDragLastDiff = 0; + mPrefLetter = 0; + mPrefLetterX = 0; + mPrefLetterY = 0; + mPrefDistance = Integer.MAX_VALUE; + if (mSpaceKey != null) { + updateLocaleDrag(Integer.MAX_VALUE); + } + } + + /** + * Does the magic of locking the touch gesture into the spacebar when + * switching input languages. + */ + @Override + public boolean isInside(Key key, int pointX, int pointY) { + int x = pointX; + int y = pointY; + final int code = key.mCode; + if (code == CODE_SHIFT || code == CODE_DELETE) { + y -= key.mHeight / 10; + if (code == CODE_SHIFT) x += key.mWidth / 6; + if (code == CODE_DELETE) x -= key.mWidth / 6; + } else if (code == CODE_SPACE) { + y += LatinKeyboard.sSpacebarVerticalCorrection; + if (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher() + && SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() > 1) { + if (mCurrentlyInSpace) { + int diff = x - mSpaceDragStartX; + if (Math.abs(diff - mSpaceDragLastDiff) > 0) { + updateLocaleDrag(diff); + } + mSpaceDragLastDiff = diff; + return true; + } else { + boolean isOnSpace = key.isOnKey(x, y); + if (isOnSpace) { + mCurrentlyInSpace = true; + mSpaceDragStartX = x; + updateLocaleDrag(0); + } + return isOnSpace; + } + } + } else if (mPrefLetterFrequencies != null) { + // New coordinate? Reset + if (mPrefLetterX != x || mPrefLetterY != y) { + mPrefLetter = 0; + mPrefDistance = Integer.MAX_VALUE; + } + // Handle preferred next letter + final int[] pref = mPrefLetterFrequencies; + if (mPrefLetter > 0) { + if (DEBUG_PREFERRED_LETTER) { + if (mPrefLetter == code && !key.isOnKey(x, y)) { + Log.d(TAG, "CORRECTED !!!!!!"); + } + } + return mPrefLetter == code; + } else { + final boolean isOnKey = key.isOnKey(x, y); + int[] nearby = getNearestKeys(x, y); + List<Key> nearbyKeys = getKeys(); + if (isOnKey) { + // If it's a preferred letter + if (inPrefList(code, pref)) { + // Check if its frequency is much lower than a nearby key + mPrefLetter = code; + mPrefLetterX = x; + mPrefLetterY = y; + for (int i = 0; i < nearby.length; i++) { + Key k = nearbyKeys.get(nearby[i]); + if (k != key && inPrefList(k.mCode, pref)) { + final int dist = distanceFrom(k, x, y); + if (dist < (int) (k.mWidth * OVERLAP_PERCENTAGE_LOW_PROB) && + (pref[k.mCode] > pref[mPrefLetter] * 3)) { + mPrefLetter = k.mCode; + mPrefDistance = dist; + if (DEBUG_PREFERRED_LETTER) { + Log.d(TAG, "CORRECTED ALTHOUGH PREFERRED !!!!!!"); + } + break; + } + } + } + + return mPrefLetter == code; + } + } + + // Get the surrounding keys and intersect with the preferred list + // For all in the intersection + // if distance from touch point is within a reasonable distance + // make this the pref letter + // If no pref letter + // return inside; + // else return thiskey == prefletter; + + for (int i = 0; i < nearby.length; i++) { + Key k = nearbyKeys.get(nearby[i]); + if (inPrefList(k.mCode, pref)) { + final int dist = distanceFrom(k, x, y); + if (dist < (int) (k.mWidth * OVERLAP_PERCENTAGE_HIGH_PROB) + && dist < mPrefDistance) { + mPrefLetter = k.mCode; + mPrefLetterX = x; + mPrefLetterY = y; + mPrefDistance = dist; + } + } + } + // Didn't find any + if (mPrefLetter == 0) { + return isOnKey; + } else { + return mPrefLetter == code; + } + } + } + + // Lock into the spacebar + if (mCurrentlyInSpace) return false; + + return key.isOnKey(x, y); + } + + private boolean inPrefList(int code, int[] pref) { + if (code < pref.length && code >= 0) return pref[code] > 0; + return false; + } + + private int distanceFrom(Key k, int x, int y) { + if (y > k.mY && y < k.mY + k.mHeight) { + return Math.abs(k.mX + k.mWidth / 2 - x); + } else { + return Integer.MAX_VALUE; + } + } + + @Override + public int[] getNearestKeys(int x, int y) { + if (mCurrentlyInSpace) { + return mSpaceKeyIndexArray; + } else { + // 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))); + } + } + + private int indexOf(int code) { + List<Key> keys = getKeys(); + int count = keys.size(); + for (int i = 0; i < count; i++) { + if (keys.get(i).mCode == code) return i; + } + return -1; + } + + private int getTextSizeFromTheme(int style, int defValue) { + TypedArray array = mContext.getTheme().obtainStyledAttributes( + style, new int[] { android.R.attr.textSize }); + int textSize = array.getDimensionPixelSize(array.getResourceId(0, 0), defValue); + return textSize; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java new file mode 100644 index 000000000..e9d5580e8 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java @@ -0,0 +1,253 @@ +/* + * 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 + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +import com.android.inputmethod.latin.Utils; +import com.android.inputmethod.voice.VoiceIMEConnector; + +import android.content.Context; +import android.graphics.Canvas; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.MotionEvent; + +// TODO: We should remove this class +public class LatinKeyboardView extends KeyboardView { + + /** Whether we've started dropping move events because we found a big jump */ + private boolean mDroppingEvents; + /** + * Whether multi-touch disambiguation needs to be disabled if a real multi-touch event has + * occured + */ + 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; + + public LatinKeyboardView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public void setPreviewEnabled(boolean previewEnabled) { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null + && (latinKeyboard.isPhoneKeyboard() || latinKeyboard.isNumberKeyboard())) { + // Phone and number keyboard never shows popup preview (except language switch). + super.setPreviewEnabled(false); + } else { + super.setPreviewEnabled(previewEnabled); + } + } + + public void setLatinKeyboard(LatinKeyboard newKeyboard) { + final LatinKeyboard oldKeyboard = getLatinKeyboard(); + if (oldKeyboard != null) { + // Reset old keyboard state before switching to new keyboard. + oldKeyboard.keyReleased(); + } + 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; + } + + public LatinKeyboard getLatinKeyboard() { + Keyboard keyboard = getKeyboard(); + if (keyboard instanceof LatinKeyboard) { + return (LatinKeyboard)keyboard; + } else { + return null; + } + } + + public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboard oldKeyboard) { + final LatinKeyboard currentKeyboard = getLatinKeyboard(); + // 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); + } + + @Override + protected boolean onLongPress(Key key) { + int primaryCode = key.mCode; + if (primaryCode == Keyboard.CODE_SETTINGS) { + return invokeOnKey(Keyboard.CODE_SETTINGS_LONGPRESS); + } else if (primaryCode == '0' && getLatinKeyboard().isPhoneKeyboard()) { + // Long pressing on 0 in phone number keypad gives you a '+'. + return invokeOnKey('+'); + } else { + return super.onLongPress(key); + } + } + + private boolean invokeOnKey(int primaryCode) { + getOnKeyboardActionListener().onCodeInput(primaryCode, null, + KeyboardActionListener.NOT_A_TOUCH_COORDINATE, + KeyboardActionListener.NOT_A_TOUCH_COORDINATE); + return true; + } + + @Override + protected CharSequence adjustCase(CharSequence label) { + LatinKeyboard keyboard = getLatinKeyboard(); + if (keyboard.isAlphaKeyboard() + && keyboard.isShiftedOrShiftLocked() + && !TextUtils.isEmpty(label) && label.length() < 3 + && Character.isLowerCase(label.charAt(0))) { + return label.toString().toUpperCase(); + } + return label; + } + + /** + * This function checks to see if we need to handle any sudden jumps in the pointer location + * that could be due to a multi-touch being treated as a move by the firmware or hardware. + * Once a sudden jump is detected, all subsequent move events are discarded + * until an UP is received.<P> + * When a sudden jump is detected, an UP event is simulated at the last position and when + * 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. + */ + private boolean handleSuddenJump(MotionEvent me) { + final int action = me.getAction(); + final int x = (int) me.getX(); + final int y = (int) me.getY(); + boolean result = false; + + // Real multi-touch event? Stop looking for sudden jumps + if (me.getPointerCount() > 1) { + mDisableDisambiguation = true; + } + if (mDisableDisambiguation) { + // If UP, reset the multi-touch flag + if (action == MotionEvent.ACTION_UP) mDisableDisambiguation = false; + return false; + } + + switch (action) { + case MotionEvent.ACTION_DOWN: + // Reset the "session" + mDroppingEvents = false; + mDisableDisambiguation = false; + break; + 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)) { + // If we're not yet dropping events, start dropping and send an UP event + if (!mDroppingEvents) { + mDroppingEvents = true; + // Send an up event + MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(), + MotionEvent.ACTION_UP, + mLastX, mLastY, me.getMetaState()); + super.onTouchEvent(translated); + translated.recycle(); + } + result = true; + } else if (mDroppingEvents) { + // If moves are small and we're already dropping events, continue dropping + result = true; + } + break; + case MotionEvent.ACTION_UP: + if (mDroppingEvents) { + // Send a down event first, as we dropped a bunch of sudden jumps and assume that + // the user is releasing the touch on the second key. + MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(), + MotionEvent.ACTION_DOWN, + x, y, me.getMetaState()); + super.onTouchEvent(translated); + translated.recycle(); + mDroppingEvents = false; + // Let the up event get processed as well, result = false + } + break; + } + // Track the previous coordinate + mLastX = x; + mLastY = y; + return result; + } + + @Override + public boolean onTouchEvent(MotionEvent me) { + LatinKeyboard keyboard = getLatinKeyboard(); + if (keyboard == null) return true; + + // If there was a sudden jump, return without processing the actual motion event. + if (handleSuddenJump(me)) return true; + + // Reset any bounding box controls in the keyboard + if (me.getAction() == MotionEvent.ACTION_DOWN) { + keyboard.keyReleased(); + } + + if (me.getAction() == MotionEvent.ACTION_UP) { + int languageDirection = keyboard.getLanguageChangeDirection(); + if (languageDirection != 0) { + getOnKeyboardActionListener().onCodeInput( + languageDirection == 1 + ? Keyboard.CODE_NEXT_LANGUAGE : Keyboard.CODE_PREV_LANGUAGE, + null, mLastX, mLastY); + me.setAction(MotionEvent.ACTION_CANCEL); + keyboard.keyReleased(); + return super.onTouchEvent(me); + } + } + + return super.onTouchEvent(me); + } + + @Override + public void draw(Canvas c) { + Utils.GCUtils.getInstance().reset(); + boolean tryGC = true; + for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { + try { + super.draw(c); + tryGC = false; + } catch (OutOfMemoryError e) { + tryGC = Utils.GCUtils.getInstance().tryGCOrWait("LatinKeyboardView", e); + } + } + } + + @Override + protected void onAttachedToWindow() { + // Token is available from here. + VoiceIMEConnector.getInstance().onAttachedToWindow(); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java new file mode 100644 index 000000000..c150baadb --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import com.android.inputmethod.latin.R; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Paint; +import android.graphics.Rect; + +import java.util.List; + +public class MiniKeyboardBuilder { + private final Resources mRes; + private final Keyboard mKeyboard; + private final CharSequence[] mPopupCharacters; + private final int mMiniKeyboardKeyHorizontalPadding; + private final int mKeyWidth; + private final int mMaxColumns; + private final int mNumRows; + private int mColPos; + private int mRowPos; + private int mX; + private int mY; + + public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key popupKey) { + final Context context = view.getContext(); + mRes = context.getResources(); + final Keyboard keyboard = new Keyboard(context, layoutTemplateResId, null); + mKeyboard = keyboard; + mPopupCharacters = popupKey.mPopupCharacters; + mMiniKeyboardKeyHorizontalPadding = (int)mRes.getDimension( + R.dimen.mini_keyboard_key_horizontal_padding); + mKeyWidth = getMaxKeyWidth(view, mPopupCharacters, mKeyboard.getKeyWidth()); + final int maxColumns = popupKey.mMaxPopupColumn; + mMaxColumns = maxColumns; + final int numKeys = mPopupCharacters.length; + int numRows = numKeys / maxColumns; + if (numKeys % maxColumns != 0) numRows++; + mNumRows = numRows; + keyboard.setHeight((keyboard.getRowHeight() + keyboard.getVerticalGap()) * numRows + - keyboard.getVerticalGap()); + if (numRows > 1) { + mColPos = numKeys % maxColumns; + if (mColPos > 0) mColPos = maxColumns - mColPos; + // Centering top-row keys. + mX = mColPos * (mKeyWidth + keyboard.getHorizontalGap()) / 2; + } + mKeyboard.setMinWidth(0); + } + + private int getMaxKeyWidth(KeyboardView view, CharSequence[] popupCharacters, int minKeyWidth) { + Paint paint = null; + Rect bounds = null; + int maxWidth = 0; + for (CharSequence popupSpec : popupCharacters) { + final CharSequence label = PopupCharactersParser.getLabel(popupSpec.toString()); + // If the label is single letter, minKeyWidth is enough to hold the label. + if (label != null && label.length() > 1) { + if (paint == null) { + paint = new Paint(); + paint.setAntiAlias(true); + } + final int labelSize = view.getLabelSizeAndSetPaint(label, 0, paint); + paint.setTextSize(labelSize); + if (bounds == null) bounds = new Rect(); + paint.getTextBounds(label.toString(), 0, label.length(), bounds); + if (maxWidth < bounds.width()) + maxWidth = bounds.width(); + } + } + return Math.max(minKeyWidth, maxWidth + mMiniKeyboardKeyHorizontalPadding); + } + + public Keyboard build() { + final Keyboard keyboard = mKeyboard; + final List<Key> keys = keyboard.getKeys(); + for (CharSequence label : mPopupCharacters) { + refresh(); + final Key key = new Key(mRes, keyboard, label, mX, mY, mKeyWidth, getRowFlags()); + keys.add(key); + advance(); + } + return keyboard; + } + + private int getRowFlags() { + final int rowPos = mRowPos; + int rowFlags = 0; + if (rowPos == 0) rowFlags |= Keyboard.EDGE_TOP; + if (rowPos == mNumRows - 1) rowFlags |= Keyboard.EDGE_BOTTOM; + return rowFlags; + } + + private void refresh() { + if (mColPos >= mMaxColumns) { + final Keyboard keyboard = mKeyboard; + // TODO: Allocate key position depending the precedence of popup characters. + mX = 0; + mY += keyboard.getRowHeight() + keyboard.getVerticalGap(); + mColPos = 0; + mRowPos++; + } + } + + private void advance() { + final Keyboard keyboard = mKeyboard; + // TODO: Allocate key position depending the precedence of popup characters. + mX += mKeyWidth + keyboard.getHorizontalGap(); + if (mX > keyboard.getMinWidth()) + keyboard.setMinWidth(mX); + mColPos++; + } +} diff --git a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java index 356e62d48..f04991eb7 100644 --- a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java +++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java @@ -14,11 +14,9 @@ * the License. */ -package com.android.inputmethod.latin; +package com.android.inputmethod.keyboard; -import android.inputmethodservice.Keyboard.Key; - -class MiniKeyboardKeyDetector extends KeyDetector { +public class MiniKeyboardKeyDetector extends KeyDetector { private static final int MAX_NEARBY_KEYS = 1; private final int mSlideAllowanceSquare; @@ -41,19 +39,20 @@ class MiniKeyboardKeyDetector extends KeyDetector { final Key[] keys = getKeys(); final int touchX = getTouchX(x); final int touchY = getTouchY(y); - int closestKeyIndex = LatinKeyboardBaseView.NOT_A_KEY; + + int closestKeyIndex = NOT_A_KEY; int closestKeyDist = (y < 0) ? mSlideAllowanceSquareTop : mSlideAllowanceSquare; final int keyCount = keys.length; - for (int i = 0; i < keyCount; i++) { - final Key key = keys[i]; - int dist = key.squaredDistanceFrom(touchX, touchY); + for (int index = 0; index < keyCount; index++) { + final int dist = keys[index].squaredDistanceToEdge(touchX, touchY); if (dist < closestKeyDist) { - closestKeyIndex = i; + closestKeyIndex = index; closestKeyDist = dist; } } - if (allKeys != null && closestKeyIndex != LatinKeyboardBaseView.NOT_A_KEY) - allKeys[0] = keys[closestKeyIndex].codes[0]; + + if (allKeys != null && closestKeyIndex != NOT_A_KEY) + allKeys[0] = keys[closestKeyIndex].mCode; return closestKeyIndex; } } diff --git a/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java b/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java new file mode 100644 index 000000000..f215db876 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import android.util.Log; + +public class ModifierKeyState { + protected static final String TAG = "ModifierKeyState"; + protected static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE; + + protected static final int RELEASING = 0; + protected static final int PRESSING = 1; + protected static final int MOMENTARY = 2; + + protected final String mName; + protected int mState = RELEASING; + + public ModifierKeyState(String name) { + mName = name; + } + + public void onPress() { + final int oldState = mState; + mState = PRESSING; + if (DEBUG) + Log.d(TAG, mName + ".onPress: " + toString(oldState) + " > " + this); + } + + public void onRelease() { + final int oldState = mState; + mState = RELEASING; + if (DEBUG) + Log.d(TAG, mName + ".onRelease: " + toString(oldState) + " > " + this); + } + + public void onOtherKeyPressed() { + final int oldState = mState; + if (oldState == PRESSING) + mState = MOMENTARY; + if (DEBUG) + Log.d(TAG, mName + ".onOtherKeyPressed: " + toString(oldState) + " > " + this); + } + + public boolean isPressing() { + return mState == PRESSING; + } + + public boolean isReleasing() { + return mState == RELEASING; + } + + public boolean isMomentary() { + return mState == MOMENTARY; + } + + @Override + public String toString() { + return toString(mState); + } + + protected String toString(int state) { + switch (state) { + case RELEASING: return "RELEASING"; + case PRESSING: return "PRESSING"; + case MOMENTARY: return "MOMENTARY"; + default: return "UNKNOWN"; + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java new file mode 100644 index 000000000..49f29f923 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -0,0 +1,589 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import com.android.inputmethod.keyboard.KeyboardView.UIHandler; +import com.android.inputmethod.latin.R; + +import android.content.res.Resources; +import android.util.Log; +import android.view.MotionEvent; + +import java.util.Arrays; + +public class PointerTracker { + private static final String TAG = PointerTracker.class.getSimpleName(); + private static final boolean ENABLE_ASSERTION = false; + private static final boolean DEBUG_EVENT = false; + private static final boolean DEBUG_MOVE_EVENT = false; + private static final boolean DEBUG_LISTENER = false; + + public interface UIProxy { + public void invalidateKey(Key key); + public void showPreview(int keyIndex, PointerTracker tracker); + public boolean hasDistinctMultitouch(); + } + + public final int mPointerId; + + // Timing constants + private final int mDelayBeforeKeyRepeatStart; + private final int mLongPressKeyTimeout; + private final int mLongPressShiftKeyTimeout; + + // Miscellaneous constants + private static final int NOT_A_KEY = KeyDetector.NOT_A_KEY; + + private final UIProxy mProxy; + private final UIHandler mHandler; + private final KeyDetector mKeyDetector; + private KeyboardActionListener mListener = EMPTY_LISTENER; + private final KeyboardSwitcher mKeyboardSwitcher; + private final boolean mHasDistinctMultitouch; + private final boolean mConfigSlidingKeyInputEnabled; + + private final int mTouchNoiseThresholdMillis; + private final int mTouchNoiseThresholdDistanceSquared; + + private Keyboard mKeyboard; + private Key[] mKeys; + private int mKeyHysteresisDistanceSquared = -1; + + private final PointerTrackerKeyState mKeyState; + + // 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) + private boolean mKeyAlreadyProcessed; + + // true if this pointer is repeatable key + private boolean mIsRepeatableKey; + + // true if this pointer is in sliding key input + private boolean mIsInSlidingKeyInput; + + // true if sliding key is allowed. + private boolean mIsAllowedSlidingKeyInput; + + // pressed key + private int mPreviousKey = NOT_A_KEY; + + // Empty {@link KeyboardActionListener} + private static final KeyboardActionListener EMPTY_LISTENER = new KeyboardActionListener() { + @Override + public void onPress(int primaryCode) {} + @Override + public void onRelease(int primaryCode) {} + @Override + public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) {} + @Override + public void onTextInput(CharSequence text) {} + @Override + public void onCancelInput() {} + @Override + public void onSwipeDown() {} + }; + + public PointerTracker(int id, UIHandler handler, KeyDetector keyDetector, UIProxy proxy, + Resources res) { + if (proxy == null || handler == null || keyDetector == null) + throw new NullPointerException(); + mPointerId = id; + mProxy = proxy; + mHandler = handler; + mKeyDetector = keyDetector; + mKeyboardSwitcher = KeyboardSwitcher.getInstance(); + mKeyState = new PointerTrackerKeyState(keyDetector); + mHasDistinctMultitouch = proxy.hasDistinctMultitouch(); + mConfigSlidingKeyInputEnabled = res.getBoolean(R.bool.config_sliding_key_input_enabled); + mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start); + mLongPressKeyTimeout = res.getInteger(R.integer.config_long_press_key_timeout); + mLongPressShiftKeyTimeout = res.getInteger(R.integer.config_long_press_shift_key_timeout); + mTouchNoiseThresholdMillis = res.getInteger(R.integer.config_touch_noise_threshold_millis); + final float touchNoiseThresholdDistance = res.getDimension( + R.dimen.config_touch_noise_threshold_distance); + mTouchNoiseThresholdDistanceSquared = (int)( + touchNoiseThresholdDistance * touchNoiseThresholdDistance); + } + + public void setOnKeyboardActionListener(KeyboardActionListener listener) { + mListener = listener; + } + + // Returns true if keyboard has been changed by this callback. + private boolean callListenerOnPressAndCheckKeyboardLayoutChange(int primaryCode) { + if (DEBUG_LISTENER) + Log.d(TAG, "onPress : " + keyCodePrintable(primaryCode)); + mListener.onPress(primaryCode); + final boolean keyboardLayoutHasBeenChanged = mKeyboardLayoutHasBeenChanged; + mKeyboardLayoutHasBeenChanged = false; + return keyboardLayoutHasBeenChanged; + } + + private void callListenerOnCodeInput(int primaryCode, int[] keyCodes, int x, int y) { + if (DEBUG_LISTENER) + Log.d(TAG, "onCodeInput: " + keyCodePrintable(primaryCode) + + " codes="+ Arrays.toString(keyCodes) + " x=" + x + " y=" + y); + mListener.onCodeInput(primaryCode, keyCodes, x, y); + } + + private void callListenerOnTextInput(CharSequence text) { + if (DEBUG_LISTENER) + Log.d(TAG, "onTextInput: text=" + text); + mListener.onTextInput(text); + } + + private void callListenerOnRelease(int primaryCode) { + if (DEBUG_LISTENER) + Log.d(TAG, "onRelease : " + keyCodePrintable(primaryCode)); + mListener.onRelease(primaryCode); + } + + private void callListenerOnCancelInput() { + if (DEBUG_LISTENER) + Log.d(TAG, "onCancelInput"); + mListener.onCancelInput(); + } + + public void setKeyboard(Keyboard keyboard, Key[] keys, float keyHysteresisDistance) { + if (keyboard == null || keys == null || keyHysteresisDistance < 0) + throw new IllegalArgumentException(); + mKeyboard = keyboard; + mKeys = keys; + mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance); + // Mark that keyboard layout has been changed. + mKeyboardLayoutHasBeenChanged = true; + } + + public boolean isInSlidingKeyInput() { + return mIsInSlidingKeyInput; + } + + private boolean isValidKeyIndex(int keyIndex) { + return keyIndex >= 0 && keyIndex < mKeys.length; + } + + public Key getKey(int keyIndex) { + return isValidKeyIndex(keyIndex) ? mKeys[keyIndex] : null; + } + + private static boolean isModifierCode(int primaryCode) { + return primaryCode == Keyboard.CODE_SHIFT + || primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL; + } + + private boolean isModifierInternal(int keyIndex) { + final Key key = getKey(keyIndex); + return key == null ? false : isModifierCode(key.mCode); + } + + public boolean isModifier() { + return isModifierInternal(mKeyState.getKeyIndex()); + } + + private boolean isOnModifierKey(int x, int y) { + return isModifierInternal(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null)); + } + + public boolean isOnShiftKey(int x, int y) { + final Key key = getKey(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null)); + return key != null && key.mCode == Keyboard.CODE_SHIFT; + } + + public boolean isSpaceKey(int keyIndex) { + Key key = getKey(keyIndex); + return key != null && key.mCode == Keyboard.CODE_SPACE; + } + + public void releaseKey() { + updateKeyGraphics(NOT_A_KEY); + } + + private void updateKeyGraphics(int keyIndex) { + int oldKeyIndex = mPreviousKey; + mPreviousKey = keyIndex; + if (keyIndex != oldKeyIndex) { + if (isValidKeyIndex(oldKeyIndex)) { + // if new key index is not a key, old key was just released inside of the key. + final boolean inside = (keyIndex == NOT_A_KEY); + mKeys[oldKeyIndex].onReleased(inside); + mProxy.invalidateKey(mKeys[oldKeyIndex]); + } + if (isValidKeyIndex(keyIndex)) { + mKeys[keyIndex].onPressed(); + mProxy.invalidateKey(mKeys[keyIndex]); + } + } + } + + public void setAlreadyProcessed() { + mKeyAlreadyProcessed = true; + } + + private void checkAssertion(PointerTrackerQueue queue) { + if (mHasDistinctMultitouch && queue == null) + throw new RuntimeException( + "PointerTrackerQueue must be passed on distinct multi touch device"); + if (!mHasDistinctMultitouch && queue != null) + throw new RuntimeException( + "PointerTrackerQueue must be null on non-distinct multi touch device"); + } + + public void onTouchEvent(int action, int x, int y, long eventTime, PointerTrackerQueue queue) { + switch (action) { + case MotionEvent.ACTION_MOVE: + onMoveEvent(x, y, eventTime, queue); + break; + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + onDownEvent(x, y, eventTime, queue); + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + onUpEvent(x, y, eventTime, queue); + break; + case MotionEvent.ACTION_CANCEL: + onCancelEvent(x, y, eventTime, queue); + break; + } + } + + public void onDownEvent(int x, int y, long eventTime, PointerTrackerQueue queue) { + if (ENABLE_ASSERTION) checkAssertion(queue); + if (DEBUG_EVENT) + printTouchEvent("onDownEvent:", x, y, eventTime); + + // TODO: up-to-down filter, if (down-up) is less than threshold, removeMessage(UP, this) in + // Handler, and just ignore this down event. + // TODO: down-to-up filter, just record down time. do not enqueue pointer now. + + // Naive up-to-down noise filter. + final long deltaT = eventTime - mKeyState.getUpTime(); + if (deltaT < mTouchNoiseThresholdMillis) { + final int dx = x - mKeyState.getLastX(); + final int dy = y - mKeyState.getLastY(); + final int distanceSquared = (dx * dx + dy * dy); + if (distanceSquared < mTouchNoiseThresholdDistanceSquared) { + Log.w(TAG, "onDownEvent: ignore potential noise: time=" + deltaT + + " distance=" + distanceSquared); + setAlreadyProcessed(); + return; + } + } + + if (queue != null) { + if (isOnModifierKey(x, y)) { + // Before processing a down event of modifier key, all pointers already being + // tracked should be released. + queue.releaseAllPointers(eventTime); + } + queue.add(this); + } + onDownEventInternal(x, y, eventTime); + } + + private void onDownEventInternal(int x, int y, long eventTime) { + int keyIndex = mKeyState.onDownKey(x, y, eventTime); + // Sliding key is allowed when 1) enabled by configuration, 2) this pointer starts sliding + // from modifier key, or 3) this pointer is on mini-keyboard. + mIsAllowedSlidingKeyInput = mConfigSlidingKeyInputEnabled || isModifierInternal(keyIndex) + || mKeyDetector instanceof MiniKeyboardKeyDetector; + mKeyboardLayoutHasBeenChanged = false; + mKeyAlreadyProcessed = false; + mIsRepeatableKey = false; + mIsInSlidingKeyInput = false; + if (isValidKeyIndex(keyIndex)) { + // This onPress call may have changed keyboard layout. Those cases are detected at + // {@link #setKeyboard}. In those cases, we should update keyIndex according to the new + // keyboard layout. + if (callListenerOnPressAndCheckKeyboardLayoutChange(mKeys[keyIndex].mCode)) + keyIndex = mKeyState.onDownKey(x, y, eventTime); + } + if (isValidKeyIndex(keyIndex)) { + if (mKeys[keyIndex].mRepeatable) { + repeatKey(keyIndex); + mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this); + mIsRepeatableKey = true; + } + startLongPressTimer(keyIndex); + } + showKeyPreviewAndUpdateKeyGraphics(keyIndex); + } + + public void onMoveEvent(int x, int y, long eventTime, PointerTrackerQueue queue) { + if (ENABLE_ASSERTION) checkAssertion(queue); + if (DEBUG_MOVE_EVENT) + printTouchEvent("onMoveEvent:", x, y, eventTime); + if (mKeyAlreadyProcessed) + return; + final PointerTrackerKeyState keyState = mKeyState; + + // TODO: down-to-up filter, if (eventTime-downTime) is less than threshold, just ignore + // this move event. Otherwise fire {@link onDownEventInternal} and continue. + + int keyIndex = keyState.onMoveKey(x, y); + final Key oldKey = getKey(keyState.getKeyIndex()); + if (isValidKeyIndex(keyIndex)) { + if (oldKey == null) { + // The pointer has been slid in to the new key, but the finger was not on any keys. + // In this case, we must call onPress() to notify that the new key is being pressed. + // This onPress call may have changed keyboard layout. Those cases are detected at + // {@link #setKeyboard}. In those cases, we should update keyIndex according to the + // new keyboard layout. + if (callListenerOnPressAndCheckKeyboardLayoutChange(getKey(keyIndex).mCode)) + keyIndex = keyState.onMoveKey(x, y); + keyState.onMoveToNewKey(keyIndex, x, y); + startLongPressTimer(keyIndex); + } else if (!isMinorMoveBounce(x, y, keyIndex)) { + // The pointer has been slid in to the new key from the previous key, we must call + // onRelease() first to notify that the previous key has been released, then call + // onPress() to notify that the new key is being pressed. + mIsInSlidingKeyInput = true; + callListenerOnRelease(oldKey.mCode); + mHandler.cancelLongPressTimers(); + if (mIsAllowedSlidingKeyInput) { + // This onPress call may have changed keyboard layout. Those cases are detected + // at {@link #setKeyboard}. In those cases, we should update keyIndex according + // to the new keyboard layout. + if (callListenerOnPressAndCheckKeyboardLayoutChange(getKey(keyIndex).mCode)) + keyIndex = keyState.onMoveKey(x, y); + keyState.onMoveToNewKey(keyIndex, x, y); + startLongPressTimer(keyIndex); + } else { + setAlreadyProcessed(); + showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY); + return; + } + } + } else { + if (oldKey != null && !isMinorMoveBounce(x, y, keyIndex)) { + // The pointer has been slid out from the previous key, we must call onRelease() to + // notify that the previous key has been released. + mIsInSlidingKeyInput = true; + callListenerOnRelease(oldKey.mCode); + mHandler.cancelLongPressTimers(); + if (mIsAllowedSlidingKeyInput) { + keyState.onMoveToNewKey(keyIndex, x ,y); + } else { + setAlreadyProcessed(); + showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY); + return; + } + } + } + showKeyPreviewAndUpdateKeyGraphics(mKeyState.getKeyIndex()); + } + + // TODO: up-to-down filter, if delayed UP message is fired, invoke {@link onUpEventInternal}. + + public void onUpEvent(int x, int y, long eventTime, PointerTrackerQueue queue) { + if (ENABLE_ASSERTION) checkAssertion(queue); + if (DEBUG_EVENT) + printTouchEvent("onUpEvent :", x, y, eventTime); + + // TODO: up-to-down filter, just sendDelayedMessage(UP, this) to Handler. + // TODO: down-to-up filter, if (eventTime-downTime) is less than threshold, just ignore + // this up event. Otherwise fire {@link onDownEventInternal} and {@link onUpEventInternal}. + + if (queue != null) { + if (isModifier()) { + // Before processing an up event of modifier key, all pointers already being + // tracked should be released. + queue.releaseAllPointersExcept(this, eventTime); + } else { + queue.releaseAllPointersOlderThan(this, eventTime); + } + queue.remove(this); + } + onUpEventInternal(x, y, eventTime); + } + + public void onUpEventForRelease(int x, int y, long eventTime) { + onUpEventInternal(x, y, eventTime); + } + + private void onUpEventInternal(int pointX, int pointY, long eventTime) { + int x = pointX; + int y = pointY; + mHandler.cancelKeyTimers(); + mHandler.cancelPopupPreview(); + showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY); + mIsInSlidingKeyInput = false; + if (mKeyAlreadyProcessed) + return; + final PointerTrackerKeyState keyState = mKeyState; + int keyIndex = keyState.onUpKey(x, y, eventTime); + if (isMinorMoveBounce(x, y, keyIndex)) { + // Use previous fixed key index and coordinates. + keyIndex = keyState.getKeyIndex(); + x = keyState.getKeyX(); + y = keyState.getKeyY(); + } + if (!mIsRepeatableKey) { + detectAndSendKey(keyIndex, x, y); + } + + if (isValidKeyIndex(keyIndex)) + mProxy.invalidateKey(mKeys[keyIndex]); + } + + public void onCancelEvent(int x, int y, long eventTime, PointerTrackerQueue queue) { + if (ENABLE_ASSERTION) checkAssertion(queue); + if (DEBUG_EVENT) + printTouchEvent("onCancelEvt:", x, y, eventTime); + + if (queue != null) + queue.remove(this); + onCancelEventInternal(); + } + + private void onCancelEventInternal() { + mHandler.cancelKeyTimers(); + mHandler.cancelPopupPreview(); + showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY); + mIsInSlidingKeyInput = false; + int keyIndex = mKeyState.getKeyIndex(); + if (isValidKeyIndex(keyIndex)) + mProxy.invalidateKey(mKeys[keyIndex]); + } + + public void repeatKey(int keyIndex) { + Key key = getKey(keyIndex); + if (key != null) { + detectAndSendKey(keyIndex, key.mX, key.mY); + } + } + + public int getLastX() { + return mKeyState.getLastX(); + } + + public int getLastY() { + return mKeyState.getLastY(); + } + + public long getDownTime() { + return mKeyState.getDownTime(); + } + + // These package scope methods are only for debugging purpose. + /* package */ int getStartX() { + return mKeyState.getStartX(); + } + + /* package */ int getStartY() { + return mKeyState.getStartY(); + } + + private boolean isMinorMoveBounce(int x, int y, int newKey) { + if (mKeys == null || mKeyHysteresisDistanceSquared < 0) + throw new IllegalStateException("keyboard and/or hysteresis not set"); + int curKey = mKeyState.getKeyIndex(); + if (newKey == curKey) { + return true; + } else if (isValidKeyIndex(curKey)) { + return mKeys[curKey].squaredDistanceToEdge(x, y) < mKeyHysteresisDistanceSquared; + } else { + return false; + } + } + + private void showKeyPreviewAndUpdateKeyGraphics(int keyIndex) { + updateKeyGraphics(keyIndex); + // The modifier key, such as shift key, should not be shown as preview when multi-touch is + // supported. On the other hand, if multi-touch is not supported, the modifier key should + // be shown as preview. + if (mHasDistinctMultitouch && isModifier()) { + mProxy.showPreview(NOT_A_KEY, this); + } else { + mProxy.showPreview(keyIndex, this); + } + } + + private void startLongPressTimer(int keyIndex) { + Key key = getKey(keyIndex); + if (key.mCode == Keyboard.CODE_SHIFT) { + mHandler.startLongPressShiftTimer(mLongPressShiftKeyTimeout, keyIndex, this); + } else if (key.mManualTemporaryUpperCaseCode != Keyboard.CODE_DUMMY + && mKeyboard.isManualTemporaryUpperCase()) { + // We need not start long press timer on the key which has manual temporary upper case + // code defined and the keyboard is in manual temporary upper case mode. + return; + } else if (mKeyboardSwitcher.isInMomentaryAutoModeSwitchState()) { + // We use longer timeout for sliding finger input started from the symbols mode key. + mHandler.startLongPressTimer(mLongPressKeyTimeout * 3, keyIndex, this); + } else { + mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); + } + } + + private void detectAndSendKey(int index, int x, int y) { + final Key key = getKey(index); + if (key == null) { + callListenerOnCancelInput(); + return; + } + if (key.mOutputText != null) { + callListenerOnTextInput(key.mOutputText); + callListenerOnRelease(key.mCode); + } else { + int code = key.mCode; + final int[] codes = mKeyDetector.newCodeArray(); + mKeyDetector.getKeyIndexAndNearbyCodes(x, y, codes); + + // If keyboard is in manual temporary upper case state and key has manual temporary + // shift code, alternate character code should be sent. + if (mKeyboard.isManualTemporaryUpperCase() + && key.mManualTemporaryUpperCaseCode != Keyboard.CODE_DUMMY) { + code = key.mManualTemporaryUpperCaseCode; + codes[0] = code; + } + + // Swap the first and second values in the codes array if the primary code is not the + // first value but the second value in the array. This happens when key debouncing is + // in effect. + if (codes.length >= 2 && codes[0] != code && codes[1] == code) { + codes[1] = codes[0]; + codes[0] = code; + } + callListenerOnCodeInput(code, codes, x, y); + callListenerOnRelease(code); + } + } + + public CharSequence getPreviewText(Key key) { + return key.mLabel; + } + + private long mPreviousEventTime; + + private void printTouchEvent(String title, int x, int y, long eventTime) { + final int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); + final Key key = getKey(keyIndex); + final String code = (key == null) ? "----" : keyCodePrintable(key.mCode); + final long delta = eventTime - mPreviousEventTime; + Log.d(TAG, String.format("%s%s[%d] %4d %4d %5d %3d(%s)", title, + (mKeyAlreadyProcessed ? "-" : " "), mPointerId, x, y, delta, keyIndex, code)); + mPreviousEventTime = eventTime; + } + + private static String keyCodePrintable(int primaryCode) { + final String modifier = isModifierCode(primaryCode) ? " modifier" : ""; + return String.format((primaryCode < 0) ? "%4d" : "0x%02x", primaryCode) + modifier; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java b/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java new file mode 100644 index 000000000..250bb95eb --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +/** + * This class keeps track of a key index and a position where {@link PointerTracker} is. + */ +/* package */ class PointerTrackerKeyState { + private final KeyDetector mKeyDetector; + + // The position and time at which first down event occurred. + private int mStartX; + private int mStartY; + private long mDownTime; + private long mUpTime; + + // The current key index where this pointer is. + private int mKeyIndex = KeyDetector.NOT_A_KEY; + // The position where mKeyIndex was recognized for the first time. + private int mKeyX; + private int mKeyY; + + // Last pointer position. + private int mLastX; + private int mLastY; + + public PointerTrackerKeyState(KeyDetector keyDetecor) { + mKeyDetector = keyDetecor; + } + + public int getKeyIndex() { + return mKeyIndex; + } + + public int getKeyX() { + return mKeyX; + } + + public int getKeyY() { + return mKeyY; + } + + public int getStartX() { + return mStartX; + } + + public int getStartY() { + return mStartY; + } + + public long getDownTime() { + return mDownTime; + } + + public long getUpTime() { + return mUpTime; + } + + public int getLastX() { + return mLastX; + } + + public int getLastY() { + return mLastY; + } + + public int onDownKey(int x, int y, long eventTime) { + mStartX = x; + mStartY = y; + mDownTime = eventTime; + return onMoveToNewKey(onMoveKeyInternal(x, y), x, y); + } + + private int onMoveKeyInternal(int x, int y) { + mLastX = x; + mLastY = y; + return mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); + } + + public int onMoveKey(int x, int y) { + return onMoveKeyInternal(x, y); + } + + public int onMoveToNewKey(int keyIndex, int x, int y) { + mKeyIndex = keyIndex; + mKeyX = x; + mKeyY = y; + return keyIndex; + } + + public int onUpKey(int x, int y, long eventTime) { + mUpTime = eventTime; + return onMoveKeyInternal(x, y); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java new file mode 100644 index 000000000..928f3cdc1 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import java.util.LinkedList; + +public class PointerTrackerQueue { + private LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>(); + + public void add(PointerTracker tracker) { + mQueue.add(tracker); + } + + public void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) { + if (mQueue.lastIndexOf(tracker) < 0) { + return; + } + LinkedList<PointerTracker> queue = mQueue; + int oldestPos = 0; + for (PointerTracker t = queue.get(oldestPos); t != tracker; t = queue.get(oldestPos)) { + if (t.isModifier()) { + oldestPos++; + } else { + t.onUpEventForRelease(t.getLastX(), t.getLastY(), eventTime); + t.setAlreadyProcessed(); + queue.remove(oldestPos); + } + } + } + + public void releaseAllPointers(long eventTime) { + releaseAllPointersExcept(null, eventTime); + } + + public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) { + for (PointerTracker t : mQueue) { + if (t == tracker) + continue; + t.onUpEventForRelease(t.getLastX(), t.getLastY(), eventTime); + t.setAlreadyProcessed(); + } + mQueue.clear(); + if (tracker != null) + mQueue.add(tracker); + } + + public void remove(PointerTracker tracker) { + mQueue.remove(tracker); + } + + public boolean isInSlidingKeyInput() { + for (final PointerTracker tracker : mQueue) { + if (tracker.isInSlidingKeyInput()) + return true; + } + return false; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("["); + for (PointerTracker tracker : mQueue) { + if (sb.length() > 1) + sb.append(" "); + sb.append(String.format("%d", tracker.mPointerId)); + } + sb.append("]"); + return sb.toString(); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java b/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java new file mode 100644 index 000000000..32c25801d --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import com.android.inputmethod.latin.R; + +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; + +/** + * String parser of popupCharacters attribute of Key. + * The string is comma separated texts each of which represents one popup key. + * Each popup key text is one of the following: + * - A single letter (Letter) + * - Label optionally followed by keyOutputText or code (keyLabel|keyOutputText). + * - Icon followed by keyOutputText or code (@drawable/icon|@integer/key_code) + * Special character, comma ',' backslash '\', and bar '|' can be escaped by '\' + * character. + * Note that the character '@' and '\' are also parsed by XML parser and CSV parser as well. + */ +public class PopupCharactersParser { + private static final char ESCAPE = '\\'; + private static final String LABEL_END = "|"; + private static final String PREFIX_AT = "@"; + private static final String PREFIX_ICON = PREFIX_AT + "drawable/"; + private static final String PREFIX_CODE = PREFIX_AT + "integer/"; + + private PopupCharactersParser() { + // Intentional empty constructor for utility class. + } + + private static boolean hasIcon(String popupSpec) { + if (popupSpec.startsWith(PREFIX_ICON)) { + final int end = indexOfLabelEnd(popupSpec, 0); + if (end > 0) + return true; + throw new PopupCharactersParserError("outputText or code not specified: " + popupSpec); + } + return false; + } + + private static boolean hasCode(String popupSpec) { + final int end = indexOfLabelEnd(popupSpec, 0); + if (end > 0 && end + 1 < popupSpec.length() + && popupSpec.substring(end + 1).startsWith(PREFIX_CODE)) { + return true; + } + return false; + } + + private static String parseEscape(String text) { + if (text.indexOf(ESCAPE) < 0) + return text; + final int length = text.length(); + final StringBuilder sb = new StringBuilder(); + for (int pos = 0; pos < length; pos++) { + final char c = text.charAt(pos); + if (c == ESCAPE && pos + 1 < length) { + sb.append(text.charAt(++pos)); + } else { + sb.append(c); + } + } + return sb.toString(); + } + + private static int indexOfLabelEnd(String popupSpec, int start) { + if (popupSpec.indexOf(ESCAPE, start) < 0) { + final int end = popupSpec.indexOf(LABEL_END, start); + if (end == 0) + throw new PopupCharactersParserError(LABEL_END + " at " + start + ": " + popupSpec); + return end; + } + final int length = popupSpec.length(); + for (int pos = start; pos < length; pos++) { + final char c = popupSpec.charAt(pos); + if (c == ESCAPE && pos + 1 < length) { + pos++; + } else if (popupSpec.startsWith(LABEL_END, pos)) { + return pos; + } + } + return -1; + } + + public static String getLabel(String popupSpec) { + if (hasIcon(popupSpec)) + return null; + final int end = indexOfLabelEnd(popupSpec, 0); + final String label = (end > 0) ? parseEscape(popupSpec.substring(0, end)) + : parseEscape(popupSpec); + if (TextUtils.isEmpty(label)) + throw new PopupCharactersParserError("Empty label: " + popupSpec); + return label; + } + + public static String getOutputText(String popupSpec) { + if (hasCode(popupSpec)) + return null; + final int end = indexOfLabelEnd(popupSpec, 0); + if (end > 0) { + if (indexOfLabelEnd(popupSpec, end + 1) >= 0) + throw new PopupCharactersParserError("Multiple " + LABEL_END + ": " + + popupSpec); + final String outputText = parseEscape(popupSpec.substring(end + LABEL_END.length())); + if (!TextUtils.isEmpty(outputText)) + return outputText; + throw new PopupCharactersParserError("Empty outputText: " + popupSpec); + } + final String label = getLabel(popupSpec); + if (label == null) + throw new PopupCharactersParserError("Empty label: " + popupSpec); + // Code is automatically generated for one letter label. See {@link getCode()}. + if (label.length() == 1) + return null; + return label; + } + + public static int getCode(Resources res, String popupSpec) { + if (hasCode(popupSpec)) { + final int end = indexOfLabelEnd(popupSpec, 0); + if (indexOfLabelEnd(popupSpec, end + 1) >= 0) + throw new PopupCharactersParserError("Multiple " + LABEL_END + ": " + popupSpec); + final int resId = getResourceId(res, + popupSpec.substring(end + LABEL_END.length() + PREFIX_AT.length())); + final int code = res.getInteger(resId); + return code; + } + if (indexOfLabelEnd(popupSpec, 0) > 0) + return Keyboard.CODE_DUMMY; + final String label = getLabel(popupSpec); + // Code is automatically generated for one letter label. + if (label != null && label.length() == 1) + return label.charAt(0); + return Keyboard.CODE_DUMMY; + } + + public static Drawable getIcon(Resources res, String popupSpec) { + if (hasIcon(popupSpec)) { + int end = popupSpec.indexOf(LABEL_END, PREFIX_ICON.length() + 1); + int resId = getResourceId(res, popupSpec.substring(PREFIX_AT.length(), end)); + return res.getDrawable(resId); + } + return null; + } + + private static int getResourceId(Resources res, String name) { + String packageName = res.getResourcePackageName(R.string.english_ime_name); + int resId = res.getIdentifier(name, null, packageName); + if (resId == 0) + throw new PopupCharactersParserError("Unknown resource: " + name); + return resId; + } + + @SuppressWarnings("serial") + public static class PopupCharactersParserError extends RuntimeException { + public PopupCharactersParserError(String message) { + super(message); + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java b/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java new file mode 100644 index 000000000..0920da2cb --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import java.util.Arrays; + +public class ProximityKeyDetector extends KeyDetector { + private static final int MAX_NEARBY_KEYS = 12; + + // working area + private int[] mDistances = new int[MAX_NEARBY_KEYS]; + + @Override + protected int getMaxNearbyKeys() { + return MAX_NEARBY_KEYS; + } + + @Override + public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) { + final Key[] keys = getKeys(); + final int touchX = getTouchX(x); + final int touchY = getTouchY(y); + + int primaryIndex = NOT_A_KEY; + final int[] distances = mDistances; + Arrays.fill(distances, Integer.MAX_VALUE); + for (final int index : mKeyboard.getNearestKeys(touchX, touchY)) { + final Key key = keys[index]; + final boolean isInside = key.isInside(touchX, touchY); + if (isInside) + primaryIndex = index; + final int dist = key.squaredDistanceToEdge(touchX, touchY); + if (isInside || (mProximityCorrectOn && dist < mProximityThresholdSquare)) { + if (allKeys == null) continue; + // Find insertion point + for (int j = 0; j < distances.length; j++) { + if (distances[j] > dist) { + final int nextPos = j + 1; + System.arraycopy(distances, j, distances, nextPos, + distances.length - nextPos); + System.arraycopy(allKeys, j, allKeys, nextPos, + allKeys.length - nextPos); + distances[j] = dist; + allKeys[j] = key.mCode; + break; + } + } + } + } + + return primaryIndex; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/Row.java b/java/src/com/android/inputmethod/keyboard/Row.java new file mode 100644 index 000000000..3618c0448 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/Row.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import com.android.inputmethod.latin.R; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.util.Xml; + +/** + * Container for keys in the keyboard. All keys in a row are at the same Y-coordinate. + * Some of the key size defaults can be overridden per row from what the {@link Keyboard} + * defines. + */ +public class Row { + /** Default width of a key in this row. */ + public final int mDefaultWidth; + /** 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; + + 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(); + 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); + a.recycle(); + } + + public Keyboard getKeyboard() { + return mKeyboard; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java b/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java new file mode 100644 index 000000000..9229208a9 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import android.util.Log; + +public class ShiftKeyState extends ModifierKeyState { + private static final int PRESSING_ON_SHIFTED = 3; // both temporary shifted & shift locked + private static final int IGNORING = 4; + + public ShiftKeyState(String name) { + super(name); + } + + @Override + public void onOtherKeyPressed() { + int oldState = mState; + if (oldState == PRESSING) { + mState = MOMENTARY; + } else if (oldState == PRESSING_ON_SHIFTED) { + mState = IGNORING; + } + if (DEBUG) + Log.d(TAG, mName + ".onOtherKeyPressed: " + toString(oldState) + " > " + this); + } + + public void onPressOnShifted() { + int oldState = mState; + mState = PRESSING_ON_SHIFTED; + if (DEBUG) + Log.d(TAG, mName + ".onPressOnShifted: " + toString(oldState) + " > " + this); + } + + public boolean isPressingOnShifted() { + return mState == PRESSING_ON_SHIFTED; + } + + public boolean isIgnoring() { + return mState == IGNORING; + } + + @Override + public String toString() { + return toString(mState); + } + + @Override + protected String toString(int state) { + switch (state) { + case PRESSING_ON_SHIFTED: return "PRESSING_ON_SHIFTED"; + case IGNORING: return "IGNORING"; + default: return super.toString(state); + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java b/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java new file mode 100644 index 000000000..41f8c2a7c --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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; + +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SubtypeSwitcher; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.Paint.Align; +import android.graphics.drawable.Drawable; +import android.text.TextPaint; +import android.view.ViewConfiguration; + +/** + * 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 final Context mContext; + private final Resources mRes; + private final int mWidth; + private final int mHeight; + private final Drawable mBackground; + private final TextPaint mTextPaint; + private final int mMiddleX; + private final Drawable mLeftDrawable; + private final Drawable mRightDrawable; + 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) { + mContext = context; + mRes = context.getResources(); + mBackground = background; + Keyboard.setDefaultBounds(mBackground); + mWidth = width; + mHeight = height; + final TextPaint textPaint = new TextPaint(); + textPaint.setTextSize(getTextSizeFromTheme(android.R.style.TextAppearance_Medium, 18)); + textPaint.setColor(R.color.latinkeyboard_transparent); + textPaint.setTextAlign(Align.CENTER); + textPaint.setAlpha(LatinKeyboard.OPACITY_FULLY_OPAQUE); + textPaint.setAntiAlias(true); + mTextPaint = textPaint; + mMiddleX = (mWidth - mBackground.getIntrinsicWidth()) / 2; + final Resources res = mRes; + mLeftDrawable = res.getDrawable( + R.drawable.sym_keyboard_feedback_language_arrows_left); + mRightDrawable = res.getDrawable( + R.drawable.sym_keyboard_feedback_language_arrows_right); + mThreshold = ViewConfiguration.get(mContext).getScaledTouchSlop(); + } + + private int getTextSizeFromTheme(int style, int defValue) { + TypedArray array = mContext.getTheme().obtainStyledAttributes( + style, new int[] { android.R.attr.textSize }); + int textSize = array.getDimensionPixelSize(array.getResourceId(0, 0), defValue); + return textSize; + } + + void setDiff(int diff) { + if (diff == Integer.MAX_VALUE) { + mHitThreshold = false; + mCurrentLanguage = null; + return; + } + mDiff = diff; + 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; + final Drawable lArrow = mLeftDrawable; + final Drawable rArrow = mRightDrawable; + 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 with shadow + final float baseline = mHeight * LatinKeyboard.SPACEBAR_LANGUAGE_BASELINE + - paint.descent(); + paint.setColor(mRes.getColor(R.color.latinkeyboard_feedback_language_text)); + 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); + + Keyboard.setDefaultBounds(lArrow); + rArrow.setBounds(width - rArrow.getIntrinsicWidth(), 0, width, + rArrow.getIntrinsicHeight()); + lArrow.draw(canvas); + rArrow.draw(canvas); + } + 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/SwipeTracker.java b/java/src/com/android/inputmethod/keyboard/SwipeTracker.java index 970e91965..730cdc390 100644 --- a/java/src/com/android/inputmethod/latin/SwipeTracker.java +++ b/java/src/com/android/inputmethod/keyboard/SwipeTracker.java @@ -14,11 +14,11 @@ * the License. */ -package com.android.inputmethod.latin; +package com.android.inputmethod.keyboard; import android.view.MotionEvent; -class SwipeTracker { +public class SwipeTracker { private static final int NUM_PAST = 4; private static final int LONGEST_PAST_TIME = 200; @@ -91,7 +91,7 @@ class SwipeTracker { return mYVelocity; } - static class EventRingBuffer { + public static class EventRingBuffer { private final int bufSize; private final float xBuf[]; private final float yBuf[]; @@ -154,4 +154,4 @@ class SwipeTracker { end = advance(end); } } -}
\ No newline at end of file +} diff --git a/java/src/com/android/inputmethod/latin/AutoDictionary.java b/java/src/com/android/inputmethod/latin/AutoDictionary.java index 4fbb5b012..307b81d43 100644 --- a/java/src/com/android/inputmethod/latin/AutoDictionary.java +++ b/java/src/com/android/inputmethod/latin/AutoDictionary.java @@ -16,10 +16,6 @@ package com.android.inputmethod.latin; -import java.util.HashMap; -import java.util.Set; -import java.util.Map.Entry; - import android.content.ContentValues; import android.content.Context; import android.database.Cursor; @@ -30,6 +26,10 @@ import android.os.AsyncTask; import android.provider.BaseColumns; import android.util.Log; +import java.util.HashMap; +import java.util.Map.Entry; +import java.util.Set; + /** * Stores new words temporarily until they are promoted to the user dictionary * for longevity. Words in the auto dictionary are used to determine if it's ok @@ -98,7 +98,7 @@ public class AutoDictionary extends ExpandableDictionary { } @Override - public boolean isValidWord(CharSequence word) { + public synchronized boolean isValidWord(CharSequence word) { final int frequency = getWordFrequency(word); return frequency >= VALIDITY_THRESHOLD; } @@ -138,7 +138,8 @@ public class AutoDictionary extends ExpandableDictionary { } @Override - public void addWord(String word, int addFrequency) { + public void addWord(String newWord, int addFrequency) { + String word = newWord; final int length = word.length(); // Don't add very short or very long words. if (length < 2 || length > getMaxWordLength()) return; @@ -224,7 +225,7 @@ public class AutoDictionary extends ExpandableDictionary { private final DatabaseHelper mDbHelper; private final String mLocale; - public UpdateDbTask(Context context, DatabaseHelper openHelper, + public UpdateDbTask(@SuppressWarnings("unused") Context context, DatabaseHelper openHelper, HashMap<String, Integer> pendingWrites, String locale) { mMap = pendingWrites; mLocale = locale; diff --git a/java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java b/java/src/com/android/inputmethod/latin/BackupAgent.java index a14a4751f..ee070af75 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java +++ b/java/src/com/android/inputmethod/latin/BackupAgent.java @@ -22,7 +22,7 @@ import android.app.backup.SharedPreferencesBackupHelper; /** * Backs up the Latin IME shared preferences. */ -public class LatinIMEBackupAgent extends BackupAgentHelper { +public class BackupAgent extends BackupAgentHelper { @Override public void onCreate() { diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index d0e143dd0..813f7d32f 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.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,16 +16,12 @@ package com.android.inputmethod.latin; -import java.io.InputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.channels.Channels; -import java.util.Arrays; - import android.content.Context; +import android.content.res.AssetFileDescriptor; import android.util.Log; +import java.util.Arrays; + /** * Implements a static, compacted, binary dictionary of standard words. */ @@ -45,115 +41,79 @@ public class BinaryDictionary extends Dictionary { private static final int MAX_BIGRAMS = 60; private static final int TYPED_LETTER_MULTIPLIER = 2; - private static final boolean ENABLE_MISSED_CHARACTERS = true; + private static final BinaryDictionary sInstance = new BinaryDictionary(); private int mDicTypeId; private int mNativeDict; - private int mDictLength; - private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES]; - private char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS]; - private char[] mOutputChars_bigrams = new char[MAX_WORD_LENGTH * MAX_BIGRAMS]; - private int[] mFrequencies = new int[MAX_WORDS]; - private int[] mFrequencies_bigrams = new int[MAX_BIGRAMS]; - // Keep a reference to the native dict direct buffer in Java to avoid - // unexpected deallocation of the direct buffer. - private ByteBuffer mNativeDictDirectBuffer; + private long mDictLength; + private final int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES]; + private final char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS]; + private final char[] mOutputChars_bigrams = new char[MAX_WORD_LENGTH * MAX_BIGRAMS]; + private final int[] mFrequencies = new int[MAX_WORDS]; + private final int[] mFrequencies_bigrams = new int[MAX_BIGRAMS]; static { try { System.loadLibrary("jni_latinime"); } catch (UnsatisfiedLinkError ule) { - Log.e("BinaryDictionary", "Could not load native library jni_latinime"); + Log.e(TAG, "Could not load native library jni_latinime"); } } - /** - * Create a dictionary from a raw resource file - * @param context application context for reading resources - * @param resId the resource containing the raw binary dictionary - */ - public BinaryDictionary(Context context, int[] resId, int dicTypeId) { - if (resId != null && resId.length > 0 && resId[0] != 0) { - loadDictionary(context, resId); - } - mDicTypeId = dicTypeId; + private BinaryDictionary() { } /** - * Create a dictionary from a byte buffer. This is used for testing. + * Initialize a dictionary from a raw resource file * @param context application context for reading resources - * @param byteBuffer a ByteBuffer containing the binary dictionary + * @param resId the resource containing the raw binary dictionary + * @return initialized instance of BinaryDictionary */ - public BinaryDictionary(Context context, ByteBuffer byteBuffer, int dicTypeId) { - if (byteBuffer != null) { - if (byteBuffer.isDirect()) { - mNativeDictDirectBuffer = byteBuffer; - } else { - mNativeDictDirectBuffer = ByteBuffer.allocateDirect(byteBuffer.capacity()); - byteBuffer.rewind(); - mNativeDictDirectBuffer.put(byteBuffer); + public static BinaryDictionary initDictionary(Context context, int resId, int dicTypeId) { + synchronized (sInstance) { + sInstance.closeInternal(); + if (resId != 0) { + sInstance.loadDictionary(context, resId); + sInstance.mDicTypeId = dicTypeId; } - mDictLength = byteBuffer.capacity(); - mNativeDict = openNative(mNativeDictDirectBuffer, - TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); } - mDicTypeId = dicTypeId; + return sInstance; } - private native int openNative(ByteBuffer bb, int typedLetterMultiplier, - int fullWordMultiplier); + private native int openNative(String sourceDir, long dictOffset, long dictSize, + int typedLetterMultiplier, int fullWordMultiplier, int maxWordLength, + int maxWords, int maxAlternatives); private native void closeNative(int dict); private native boolean isValidWordNative(int nativeData, char[] word, int wordLength); - private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize, - char[] outputChars, int[] frequencies, int maxWordLength, int maxWords, - int maxAlternatives, int skipPos, int[] nextLettersFrequencies, int nextLettersSize); + private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize, + char[] outputChars, int[] frequencies, + int[] nextLettersFrequencies, int nextLettersSize); private native int getBigramsNative(int dict, char[] prevWord, int prevWordLength, int[] inputCodes, int inputCodesLength, char[] outputChars, int[] frequencies, int maxWordLength, int maxBigrams, int maxAlternatives); - private final void loadDictionary(Context context, int[] resId) { - InputStream[] is = null; + private final void loadDictionary(Context context, int resId) { try { - // merging separated dictionary into one if dictionary is separated - int total = 0; - is = new InputStream[resId.length]; - for (int i = 0; i < resId.length; i++) { - is[i] = context.getResources().openRawResource(resId[i]); - total += is[i].available(); - } - - mNativeDictDirectBuffer = - ByteBuffer.allocateDirect(total).order(ByteOrder.nativeOrder()); - int got = 0; - for (int i = 0; i < resId.length; i++) { - got += Channels.newChannel(is[i]).read(mNativeDictDirectBuffer); - } - if (got != total) { - Log.e(TAG, "Read " + got + " bytes, expected " + total); - } else { - mNativeDict = openNative(mNativeDictDirectBuffer, - TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); - mDictLength = total; - } - } catch (IOException e) { - Log.w(TAG, "No available memory for binary dictionary"); - } finally { - try { - if (is != null) { - for (int i = 0; i < is.length; i++) { - is[i].close(); - } - } - } catch (IOException e) { - Log.w(TAG, "Failed to close input stream"); + final AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId); + if (afd == null) { + Log.e(TAG, "Found the resource but it is compressed. resId=" + resId); + return; } + mNativeDict = openNative(context.getApplicationInfo().sourceDir, + afd.getStartOffset(), afd.getLength(), + TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER, + MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES); + mDictLength = afd.getLength(); + } catch (android.content.res.Resources.NotFoundException e) { + Log.e(TAG, "Could not find the resource. resId=" + resId); + return; } } - @Override public void getBigrams(final WordComposer codes, final CharSequence previousWord, final WordCallback callback, int[] nextLettersFrequencies) { + if (mNativeDict == 0) return; char[] chars = previousWord.toString().toCharArray(); Arrays.fill(mOutputChars_bigrams, (char) 0); @@ -169,12 +129,12 @@ public class BinaryDictionary extends Dictionary { mOutputChars_bigrams, mFrequencies_bigrams, MAX_WORD_LENGTH, MAX_BIGRAMS, MAX_ALTERNATIVES); - for (int j = 0; j < count; j++) { + for (int j = 0; j < count; ++j) { if (mFrequencies_bigrams[j] < 1) break; - int start = j * MAX_WORD_LENGTH; + final int start = j * MAX_WORD_LENGTH; int len = 0; - while (mOutputChars_bigrams[start + len] != 0) { - len++; + while (len < MAX_WORD_LENGTH && mOutputChars_bigrams[start + len] != 0) { + ++len; } if (len > 0) { callback.addWord(mOutputChars_bigrams, start, len, mFrequencies_bigrams[j], @@ -186,10 +146,12 @@ public class BinaryDictionary extends Dictionary { @Override public void getWords(final WordComposer codes, final WordCallback callback, int[] nextLettersFrequencies) { + if (mNativeDict == 0) return; + final int codesSize = codes.size(); // Won't deal with really long words. if (codesSize > MAX_WORD_LENGTH - 1) return; - + Arrays.fill(mInputCodes, -1); for (int i = 0; i < codesSize; i++) { int[] alternatives = codes.getCodesAt(i); @@ -199,33 +161,16 @@ public class BinaryDictionary extends Dictionary { Arrays.fill(mOutputChars, (char) 0); Arrays.fill(mFrequencies, 0); - int count = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, - mOutputChars, mFrequencies, - MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES, -1, - nextLettersFrequencies, + int count = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, mOutputChars, + mFrequencies, nextLettersFrequencies, nextLettersFrequencies != null ? nextLettersFrequencies.length : 0); - // If there aren't sufficient suggestions, search for words by allowing wild cards at - // the different character positions. This feature is not ready for prime-time as we need - // to figure out the best ranking for such words compared to proximity corrections and - // completions. - if (ENABLE_MISSED_CHARACTERS && count < 5) { - for (int skip = 0; skip < codesSize; skip++) { - int tempCount = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, - mOutputChars, mFrequencies, - MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES, skip, - null, 0); - count = Math.max(count, tempCount); - if (tempCount > 0) break; - } - } - - for (int j = 0; j < count; j++) { + for (int j = 0; j < count; ++j) { if (mFrequencies[j] < 1) break; - int start = j * MAX_WORD_LENGTH; + final int start = j * MAX_WORD_LENGTH; int len = 0; - while (mOutputChars[start + len] != 0) { - len++; + while (len < MAX_WORD_LENGTH && mOutputChars[start + len] != 0) { + ++len; } if (len > 0) { callback.addWord(mOutputChars, start, len, mFrequencies[j], mDicTypeId, @@ -241,21 +186,29 @@ public class BinaryDictionary extends Dictionary { return isValidWordNative(mNativeDict, chars, chars.length); } - public int getSize() { - return mDictLength; // This value is initialized on the call to openNative() + public long getSize() { + return mDictLength; // This value is initialized in loadDictionary() } @Override public synchronized void close() { + closeInternal(); + } + + private void closeInternal() { if (mNativeDict != 0) { closeNative(mNativeDict); mNativeDict = 0; + mDictLength = 0; } } @Override protected void finalize() throws Throwable { - close(); - super.finalize(); + try { + closeInternal(); + } finally { + super.finalize(); + } } } diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index 68f288925..fc45c7c75 100755..100644 --- a/java/src/com/android/inputmethod/latin/CandidateView.java +++ b/java/src/com/android/inputmethod/latin/CandidateView.java @@ -1,12 +1,12 @@ /* - * Copyright (C) 2008 The Android Open Source Project - * + * 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 @@ -16,77 +16,106 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; + import android.content.Context; import android.content.res.Resources; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Paint.Align; -import android.graphics.Rect; +import android.graphics.Color; import android.graphics.Typeface; -import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Message; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.BackgroundColorSpan; +import android.text.style.CharacterStyle; +import android.text.style.ForegroundColorSpan; +import android.text.style.StyleSpan; +import android.text.style.UnderlineSpan; import android.util.AttributeSet; -import android.view.GestureDetector; import android.view.Gravity; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup.LayoutParams; +import android.view.View.OnClickListener; +import android.view.View.OnLongClickListener; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.TextView; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -public class CandidateView extends View { +public class CandidateView extends LinearLayout implements OnClickListener, OnLongClickListener { - private static final int OUT_OF_BOUNDS_WORD_INDEX = -1; - private static final int OUT_OF_BOUNDS_X_COORD = -1; + private static final CharacterStyle BOLD_SPAN = new StyleSpan(Typeface.BOLD); + private static final CharacterStyle UNDERLINE_SPAN = new UnderlineSpan(); + private static final int MAX_SUGGESTIONS = 16; - private LatinIME mService; - private final ArrayList<CharSequence> mSuggestions = new ArrayList<CharSequence>(); - private boolean mShowingCompletions; - private CharSequence mSelectedString; - private int mSelectedIndex; - private int mTouchX = OUT_OF_BOUNDS_X_COORD; - private final Drawable mSelectionHighlight; - private boolean mTypedWordValid; - - private boolean mHaveMinimalSuggestion; - - private Rect mBgPadding; + private static boolean DBG = LatinImeLogger.sDBG; - private final TextView mPreviewText; - private final PopupWindow mPreviewPopup; - private int mCurrentWordIndex; - private Drawable mDivider; - - private static final int MAX_SUGGESTIONS = 32; - private static final int SCROLL_PIXELS = 20; - - private final int[] mWordWidth = new int[MAX_SUGGESTIONS]; - private final int[] mWordX = new int[MAX_SUGGESTIONS]; - private int mPopupPreviewX; - private int mPopupPreviewY; - - private static final int X_GAP = 10; - + private final ArrayList<View> mWords = new ArrayList<View>(); + private final boolean mConfigCandidateHighlightFontColorEnabled; + private final CharacterStyle mInvertedForegroundColorSpan; + private final CharacterStyle mInvertedBackgroundColorSpan; private final int mColorNormal; private final int mColorRecommended; private final int mColorOther; - private final Paint mPaint; - private final int mDescent; - private boolean mScrolled; + private final PopupWindow mPreviewPopup; + private final TextView mPreviewText; + + private LatinIME mService; + private SuggestedWords mSuggestions = SuggestedWords.EMPTY; + private boolean mShowingAutoCorrectionInverted; private boolean mShowingAddToDictionary; - private CharSequence mAddToDictionaryHint; - private int mTargetScrollX; + private final UiHandler mHandler = new UiHandler(); + + private class UiHandler extends Handler { + private static final int MSG_HIDE_PREVIEW = 0; + private static final int MSG_UPDATE_SUGGESTION = 1; + + private static final long DELAY_HIDE_PREVIEW = 1000; + private static final long DELAY_UPDATE_SUGGESTION = 300; + + @Override + public void dispatchMessage(Message msg) { + switch (msg.what) { + case MSG_HIDE_PREVIEW: + hidePreview(); + break; + case MSG_UPDATE_SUGGESTION: + updateSuggestions(); + break; + } + } + + public void postHidePreview() { + cancelHidePreview(); + sendMessageDelayed(obtainMessage(MSG_HIDE_PREVIEW), DELAY_HIDE_PREVIEW); + } + + public void cancelHidePreview() { + removeMessages(MSG_HIDE_PREVIEW); + } + + public void postUpdateSuggestions() { + cancelUpdateSuggestions(); + sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTION), + DELAY_UPDATE_SUGGESTION); + } - private final int mMinTouchableWidth; + public void cancelUpdateSuggestions() { + removeMessages(MSG_UPDATE_SUGGESTION); + } - private int mTotalWidth; - - private final GestureDetector mGestureDetector; + public void cancelAllMessages() { + cancelHidePreview(); + cancelUpdateSuggestions(); + } + } /** * Construct a CandidateView for showing suggested words for completion. @@ -95,95 +124,38 @@ public class CandidateView extends View { */ public CandidateView(Context context, AttributeSet attrs) { super(context, attrs); - mSelectionHighlight = context.getResources().getDrawable( - R.drawable.list_selector_background_pressed); - LayoutInflater inflate = - (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); Resources res = context.getResources(); mPreviewPopup = new PopupWindow(context); - mPreviewText = (TextView) inflate.inflate(R.layout.candidate_preview, null); - mPreviewPopup.setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + LayoutInflater inflater = LayoutInflater.from(context); + mPreviewText = (TextView) inflater.inflate(R.layout.candidate_preview, null); + mPreviewPopup.setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); mPreviewPopup.setContentView(mPreviewText); mPreviewPopup.setBackgroundDrawable(null); mPreviewPopup.setAnimationStyle(R.style.KeyPreviewAnimation); + mConfigCandidateHighlightFontColorEnabled = + res.getBoolean(R.bool.config_candidate_highlight_font_color_enabled); mColorNormal = res.getColor(R.color.candidate_normal); mColorRecommended = res.getColor(R.color.candidate_recommended); mColorOther = res.getColor(R.color.candidate_other); - mDivider = res.getDrawable(R.drawable.keyboard_suggest_strip_divider); - mAddToDictionaryHint = res.getString(R.string.hint_add_to_dictionary); - - mPaint = new Paint(); - mPaint.setColor(mColorNormal); - mPaint.setAntiAlias(true); - mPaint.setTextSize(mPreviewText.getTextSize()); - mPaint.setStrokeWidth(0); - mPaint.setTextAlign(Align.CENTER); - mDescent = (int) mPaint.descent(); - mMinTouchableWidth = (int)res.getDimension(R.dimen.candidate_min_touchable_width); - - mGestureDetector = new GestureDetector( - new CandidateStripGestureListener(mMinTouchableWidth)); - setWillNotDraw(false); - setHorizontalScrollBarEnabled(false); - setVerticalScrollBarEnabled(false); - scrollTo(0, getScrollY()); - } - - private class CandidateStripGestureListener extends GestureDetector.SimpleOnGestureListener { - private final int mTouchSlopSquare; - - public CandidateStripGestureListener(int touchSlop) { - // Slightly reluctant to scroll to be able to easily choose the suggestion - mTouchSlopSquare = touchSlop * touchSlop; + mInvertedForegroundColorSpan = new ForegroundColorSpan(mColorNormal ^ 0x00ffffff); + mInvertedBackgroundColorSpan = new BackgroundColorSpan(mColorNormal); + + for (int i = 0; i < MAX_SUGGESTIONS; i++) { + View v = inflater.inflate(R.layout.candidate, null); + TextView tv = (TextView)v.findViewById(R.id.candidate_word); + tv.setTag(i); + tv.setOnClickListener(this); + if (i == 0) + tv.setOnLongClickListener(this); + ImageView divider = (ImageView)v.findViewById(R.id.candidate_divider); + // Do not display divider of first candidate. + divider.setVisibility(i == 0 ? GONE : VISIBLE); + mWords.add(v); } - @Override - public void onLongPress(MotionEvent me) { - if (mSuggestions.size() > 0) { - if (me.getX() + getScrollX() < mWordWidth[0] && getScrollX() < 10) { - longPressFirstWord(); - } - } - } - - @Override - public boolean onDown(MotionEvent e) { - mScrolled = false; - return false; - } - - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, - float distanceX, float distanceY) { - if (!mScrolled) { - // This is applied only when we recognize that scrolling is starting. - final int deltaX = (int) (e2.getX() - e1.getX()); - final int deltaY = (int) (e2.getY() - e1.getY()); - final int distance = (deltaX * deltaX) + (deltaY * deltaY); - if (distance < mTouchSlopSquare) { - return true; - } - mScrolled = true; - } - - final int width = getWidth(); - mScrolled = true; - int scrollX = getScrollX(); - scrollX += (int) distanceX; - if (scrollX < 0) { - scrollX = 0; - } - if (distanceX > 0 && scrollX + width > mTotalWidth) { - scrollX -= (int) distanceX; - } - mTargetScrollX = scrollX; - scrollTo(scrollX, getScrollY()); - hidePreview(); - invalidate(); - return true; - } + scrollTo(0, getScrollY()); } /** @@ -193,158 +165,113 @@ public class CandidateView extends View { public void setService(LatinIME listener) { mService = listener; } - - @Override - public int computeHorizontalScrollRange() { - return mTotalWidth; - } - /** - * If the canvas is null, then only touch calculations are performed to pick the target - * candidate. - */ - @Override - protected void onDraw(Canvas canvas) { - if (canvas != null) { - super.onDraw(canvas); - } - mTotalWidth = 0; - - final int height = getHeight(); - if (mBgPadding == null) { - mBgPadding = new Rect(0, 0, 0, 0); - if (getBackground() != null) { - getBackground().getPadding(mBgPadding); - } - mDivider.setBounds(0, 0, mDivider.getIntrinsicWidth(), - mDivider.getIntrinsicHeight()); + public void setSuggestions(SuggestedWords suggestions) { + if (suggestions == null) + return; + mSuggestions = suggestions; + if (mShowingAutoCorrectionInverted) { + mHandler.postUpdateSuggestions(); + } else { + updateSuggestions(); } + } - final int count = mSuggestions.size(); - final Rect bgPadding = mBgPadding; - final Paint paint = mPaint; - final int touchX = mTouchX; - final int scrollX = getScrollX(); - final boolean scrolled = mScrolled; - final boolean typedWordValid = mTypedWordValid; - final int y = (int) (height + mPaint.getTextSize() - mDescent) / 2; - - boolean existsAutoCompletion = false; - - int x = 0; + private void updateSuggestions() { + final SuggestedWords suggestions = mSuggestions; + clear(); + final int count = suggestions.size(); for (int i = 0; i < count; i++) { - CharSequence suggestion = mSuggestions.get(i); - if (suggestion == null) continue; - final int wordLength = suggestion.length(); - - paint.setColor(mColorNormal); - if (mHaveMinimalSuggestion - && ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid))) { - paint.setTypeface(Typeface.DEFAULT_BOLD); - paint.setColor(mColorRecommended); - existsAutoCompletion = true; + CharSequence word = suggestions.getWord(i); + if (word == null) continue; + final int wordLength = word.length(); + final List<SuggestedWordInfo> suggestedWordInfoList = + suggestions.mSuggestedWordInfoList; + + final View v = mWords.get(i); + final TextView tv = (TextView)v.findViewById(R.id.candidate_word); + final TextView dv = (TextView)v.findViewById(R.id.candidate_debug_info); + tv.setTextColor(mColorNormal); + // TODO: Needs safety net? + if (suggestions.mHasMinimalSuggestion + && ((i == 1 && !suggestions.mTypedWordValid) + || (i == 0 && suggestions.mTypedWordValid))) { + final CharacterStyle style; + if (mConfigCandidateHighlightFontColorEnabled) { + style = BOLD_SPAN; + tv.setTextColor(mColorRecommended); + } else { + style = UNDERLINE_SPAN; + } + final Spannable spannedWord = new SpannableString(word); + spannedWord.setSpan(style, 0, wordLength, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + word = spannedWord; } else if (i != 0 || (wordLength == 1 && count > 1)) { - // 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. - paint.setColor(mColorOther); - } - int wordWidth; - if ((wordWidth = mWordWidth[i]) == 0) { - float textWidth = paint.measureText(suggestion, 0, wordLength); - wordWidth = Math.max(mMinTouchableWidth, (int) textWidth + X_GAP * 2); - mWordWidth[i] = wordWidth; + // 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. + if (mConfigCandidateHighlightFontColorEnabled) + tv.setTextColor(mColorOther); } - - mWordX[i] = x; - - if (touchX != OUT_OF_BOUNDS_X_COORD && !scrolled - && touchX + scrollX >= x && touchX + scrollX < x + wordWidth) { - if (canvas != null && !mShowingAddToDictionary) { - canvas.translate(x, 0); - mSelectionHighlight.setBounds(0, bgPadding.top, wordWidth, height); - mSelectionHighlight.draw(canvas); - canvas.translate(-x, 0); + tv.setText(word); + tv.setClickable(true); + + if (suggestedWordInfoList != null && suggestedWordInfoList.get(i) != null) { + final SuggestedWordInfo info = suggestedWordInfoList.get(i); + if (info.isPreviousSuggestedWord()) { + int color = tv.getCurrentTextColor(); + tv.setTextColor(Color.argb((int)(Color.alpha(color) * 0.5f), Color.red(color), + Color.green(color), Color.blue(color))); } - mSelectedString = suggestion; - mSelectedIndex = i; - } - - if (canvas != null) { - canvas.drawText(suggestion, 0, wordLength, x + wordWidth / 2, y, paint); - paint.setColor(mColorOther); - canvas.translate(x + wordWidth, 0); - // Draw a divider unless it's after the hint - if (!(mShowingAddToDictionary && i == 1)) { - mDivider.draw(canvas); + final String debugString = info.getDebugString(); + if (DBG) { + if (!TextUtils.isEmpty(debugString)) { + dv.setText(debugString); + dv.setVisibility(VISIBLE); + } } - canvas.translate(-x - wordWidth, 0); - } - paint.setTypeface(Typeface.DEFAULT); - x += wordWidth; - } - mService.onAutoCompletionStateChanged(existsAutoCompletion); - mTotalWidth = x; - if (mTargetScrollX != scrollX) { - scrollToTarget(); - } - } - - private void scrollToTarget() { - int scrollX = getScrollX(); - if (mTargetScrollX > scrollX) { - scrollX += SCROLL_PIXELS; - if (scrollX >= mTargetScrollX) { - scrollX = mTargetScrollX; - scrollTo(scrollX, getScrollY()); - requestLayout(); - } else { - scrollTo(scrollX, getScrollY()); - } - } else { - scrollX -= SCROLL_PIXELS; - if (scrollX <= mTargetScrollX) { - scrollX = mTargetScrollX; - scrollTo(scrollX, getScrollY()); - requestLayout(); } else { - scrollTo(scrollX, getScrollY()); + dv.setVisibility(GONE); } + addView(v); } - invalidate(); - } - - public void setSuggestions(List<CharSequence> suggestions, boolean completions, - boolean typedWordValid, boolean haveMinimalSuggestion) { - clear(); - if (suggestions != null) { - int insertCount = Math.min(suggestions.size(), MAX_SUGGESTIONS); - for (CharSequence suggestion : suggestions) { - mSuggestions.add(suggestion); - if (--insertCount == 0) - break; - } - } - mShowingCompletions = completions; - mTypedWordValid = typedWordValid; + scrollTo(0, getScrollY()); - mTargetScrollX = 0; - mHaveMinimalSuggestion = haveMinimalSuggestion; - // Compute the total width - onDraw(null); - invalidate(); requestLayout(); } + public void onAutoCorrectionInverted(CharSequence autoCorrectedWord) { + // Displaying auto corrected word as inverted is enabled only when highlighting candidate + // with color is disabled. + if (mConfigCandidateHighlightFontColorEnabled) + return; + final TextView tv = (TextView)mWords.get(1).findViewById(R.id.candidate_word); + 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); + mShowingAutoCorrectionInverted = true; + } + + public boolean isConfigCandidateHighlightFontColorEnabled() { + return mConfigCandidateHighlightFontColorEnabled; + } + public boolean isShowingAddToDictionaryHint() { return mShowingAddToDictionary; } public void showAddToDictionaryHint(CharSequence word) { - ArrayList<CharSequence> suggestions = new ArrayList<CharSequence>(); - suggestions.add(word); - suggestions.add(mAddToDictionaryHint); - setSuggestions(suggestions, false, false, false); + SuggestedWords.Builder builder = new SuggestedWords.Builder() + .addWord(word) + .addWord(getContext().getText(R.string.hint_add_to_dictionary)); + setSuggestions(builder.build()); mShowingAddToDictionary = true; + // Disable R.string.hint_add_to_dictionary button + TextView tv = (TextView)getChildAt(1).findViewById(R.id.candidate_word); + tv.setClickable(false); } public boolean dismissAddToDictionaryHint() { @@ -353,135 +280,78 @@ public class CandidateView extends View { return true; } - /* package */ List<CharSequence> getSuggestions() { + public SuggestedWords getSuggestions() { return mSuggestions; } public void clear() { - // Don't call mSuggestions.clear() because it's being used for logging - // in LatinIME.pickSuggestionManually(). - mSuggestions.clear(); - mTouchX = OUT_OF_BOUNDS_X_COORD; - mSelectedString = null; - mSelectedIndex = -1; mShowingAddToDictionary = false; - invalidate(); - Arrays.fill(mWordWidth, 0); - Arrays.fill(mWordX, 0); + mShowingAutoCorrectionInverted = false; + removeAllViews(); } - - @Override - public boolean onTouchEvent(MotionEvent me) { - if (mGestureDetector.onTouchEvent(me)) { - return true; + private void hidePreview() { + mPreviewPopup.dismiss(); + } + + private void showPreview(int index, CharSequence word) { + if (TextUtils.isEmpty(word)) + return; + + final TextView previewText = mPreviewText; + previewText.setTextColor(mColorNormal); + previewText.setText(word); + previewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + View v = getChildAt(index); + final int[] offsetInWindow = new int[2]; + v.getLocationInWindow(offsetInWindow); + final int posX = offsetInWindow[0]; + final int posY = offsetInWindow[1] - previewText.getMeasuredHeight(); + final PopupWindow previewPopup = mPreviewPopup; + if (previewPopup.isShowing()) { + previewPopup.update(posX, posY, previewPopup.getWidth(), previewPopup.getHeight()); + } else { + previewPopup.showAtLocation(this, Gravity.NO_GRAVITY, posX, posY); } + previewText.setVisibility(VISIBLE); + mHandler.postHidePreview(); + } - int action = me.getAction(); - int x = (int) me.getX(); - int y = (int) me.getY(); - mTouchX = x; - - switch (action) { - case MotionEvent.ACTION_DOWN: - invalidate(); - break; - case MotionEvent.ACTION_MOVE: - if (y <= 0) { - // Fling up!? - if (mSelectedString != null) { - // If there are completions from the application, we don't change the state to - // STATE_PICKED_SUGGESTION - if (!mShowingCompletions) { - // This "acceptedSuggestion" will not be counted as a word because - // it will be counted in pickSuggestion instead. - TextEntryState.acceptedSuggestion(mSuggestions.get(0), - mSelectedString); - } - mService.pickSuggestionManually(mSelectedIndex, mSelectedString); - mSelectedString = null; - mSelectedIndex = -1; - } - } - break; - case MotionEvent.ACTION_UP: - if (!mScrolled) { - if (mSelectedString != null) { - if (mShowingAddToDictionary) { - longPressFirstWord(); - clear(); - } else { - if (!mShowingCompletions) { - TextEntryState.acceptedSuggestion(mSuggestions.get(0), - mSelectedString); - } - mService.pickSuggestionManually(mSelectedIndex, mSelectedString); - } - } - } - mSelectedString = null; - mSelectedIndex = -1; - requestLayout(); - hidePreview(); - invalidate(); - break; + private void addToDictionary(CharSequence word) { + if (mService.addWordToDictionary(word.toString())) { + showPreview(0, getContext().getString(R.string.added_word, word)); } - return true; } - private void hidePreview() { - mTouchX = OUT_OF_BOUNDS_X_COORD; - mCurrentWordIndex = OUT_OF_BOUNDS_WORD_INDEX; - mPreviewPopup.dismiss(); + @Override + public boolean onLongClick(View view) { + int index = (Integer) view.getTag(); + CharSequence word = mSuggestions.getWord(index); + if (word.length() < 2) + return false; + addToDictionary(word); + return true; } - - private void showPreview(int wordIndex, String altText) { - int oldWordIndex = mCurrentWordIndex; - mCurrentWordIndex = wordIndex; - // If index changed or changing text - if (oldWordIndex != mCurrentWordIndex || altText != null) { - if (wordIndex == OUT_OF_BOUNDS_WORD_INDEX) { - hidePreview(); - } else { - CharSequence word = altText != null? altText : mSuggestions.get(wordIndex); - mPreviewText.setText(word); - mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); - int wordWidth = (int) (mPaint.measureText(word, 0, word.length()) + X_GAP * 2); - final int popupWidth = wordWidth - + mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight(); - final int popupHeight = mPreviewText.getMeasuredHeight(); - //mPreviewText.setVisibility(INVISIBLE); - mPopupPreviewX = mWordX[wordIndex] - mPreviewText.getPaddingLeft() - getScrollX() - + (mWordWidth[wordIndex] - wordWidth) / 2; - mPopupPreviewY = - popupHeight; - int [] offsetInWindow = new int[2]; - getLocationInWindow(offsetInWindow); - if (mPreviewPopup.isShowing()) { - mPreviewPopup.update(mPopupPreviewX, mPopupPreviewY + offsetInWindow[1], - popupWidth, popupHeight); - } else { - mPreviewPopup.setWidth(popupWidth); - mPreviewPopup.setHeight(popupHeight); - mPreviewPopup.showAtLocation(this, Gravity.NO_GRAVITY, mPopupPreviewX, - mPopupPreviewY + offsetInWindow[1]); - } - mPreviewText.setVisibility(VISIBLE); + + @Override + public void onClick(View view) { + int index = (Integer) view.getTag(); + CharSequence word = mSuggestions.getWord(index); + if (mShowingAddToDictionary && index == 0) { + addToDictionary(word); + } else { + if (!mSuggestions.mIsApplicationSpecifiedCompletions) { + TextEntryState.acceptedSuggestion(mSuggestions.getWord(0), word); } + mService.pickSuggestionManually(index, word); } } - private void longPressFirstWord() { - CharSequence word = mSuggestions.get(0); - if (word.length() < 2) return; - if (mService.addWordToDictionary(word.toString())) { - showPreview(0, getContext().getResources().getString(R.string.added_word, word)); - } - } - @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); + mHandler.cancelAllMessages(); hidePreview(); } } diff --git a/java/src/com/android/inputmethod/latin/ClipTouchEventWindowCallback.java b/java/src/com/android/inputmethod/latin/ClipTouchEventWindowCallback.java new file mode 100644 index 000000000..d12c70075 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/ClipTouchEventWindowCallback.java @@ -0,0 +1,75 @@ +/* + * 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.view.MotionEvent; +import android.view.View; +import android.view.Window; + +public class ClipTouchEventWindowCallback extends WindowCallbackAdapter { + private final View mDecorView; + private final int mKeyboardBottomRowVerticalCorrection; + + public ClipTouchEventWindowCallback(Window window, int keyboardBottomRowVerticalCorrection) { + super(window.getCallback()); + mDecorView = window.getDecorView(); + mKeyboardBottomRowVerticalCorrection = keyboardBottomRowVerticalCorrection; + } + + @Override + public boolean dispatchTouchEvent(MotionEvent me) { + final int height = mDecorView.getHeight(); + final MotionEvent event = clipMotionEvent(me, height, + height + mKeyboardBottomRowVerticalCorrection); + return super.dispatchTouchEvent(event); + } + + private static MotionEvent clipMotionEvent(MotionEvent me, int minHeight, int maxHeight) { + final int pointerCount = me.getPointerCount(); + boolean shouldClip = false; + for (int pointerIndex = 0; pointerIndex < pointerCount; pointerIndex++) { + final float y = me.getY(pointerIndex); + if (y >= minHeight && y < maxHeight) { + shouldClip = true; + break; + } + } + if (!shouldClip) + return me; + + if (pointerCount == 1) { + me.setLocation(me.getX(), minHeight - 1); + return me; + } + + final int[] pointerIds = new int[pointerCount]; + final MotionEvent.PointerCoords[] pointerCoords = + new MotionEvent.PointerCoords[pointerCount]; + for (int pointerIndex = 0; pointerIndex < pointerCount; pointerIndex++) { + pointerIds[pointerIndex] = me.getPointerId(pointerIndex); + final MotionEvent.PointerCoords coords = new MotionEvent.PointerCoords(); + me.getPointerCoords(pointerIndex, coords); + pointerCoords[pointerIndex] = coords; + if (coords.y >= minHeight && coords.y < maxHeight) + coords.y = minHeight - 1; + } + return MotionEvent.obtain( + me.getDownTime(), me.getEventTime(), me.getAction(), pointerCount, pointerIds, + pointerCoords, me.getMetaState(), me.getXPrecision(), me.getYPrecision(), + me.getDeviceId(), me.getEdgeFlags(), me.getSource(), me.getFlags()); + } +} diff --git a/java/src/com/android/inputmethod/latin/ContactsDictionary.java b/java/src/com/android/inputmethod/latin/ContactsDictionary.java index 95a3b5c7d..048f72dc5 100644 --- a/java/src/com/android/inputmethod/latin/ContactsDictionary.java +++ b/java/src/com/android/inputmethod/latin/ContactsDictionary.java @@ -21,6 +21,7 @@ import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.os.SystemClock; +import android.provider.BaseColumns; import android.provider.ContactsContract.Contacts; import android.text.TextUtils; import android.util.Log; @@ -28,7 +29,7 @@ import android.util.Log; public class ContactsDictionary extends ExpandableDictionary { private static final String[] PROJECTION = { - Contacts._ID, + BaseColumns._ID, Contacts.DISPLAY_NAME, }; diff --git a/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java b/java/src/com/android/inputmethod/latin/DebugSettings.java index cba1a0af9..03211f36b 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java +++ b/java/src/com/android/inputmethod/latin/DebugSettings.java @@ -24,10 +24,10 @@ import android.preference.CheckBoxPreference; import android.preference.PreferenceActivity; import android.util.Log; -public class LatinIMEDebugSettings extends PreferenceActivity +public class DebugSettings extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { - private static final String TAG = "LatinIMEDebugSettings"; + private static final String TAG = "DebugSettings"; private static final String DEBUG_MODE_KEY = "debug_mode"; private CheckBoxPreference mDebugMode; @@ -43,6 +43,7 @@ public class LatinIMEDebugSettings extends PreferenceActivity updateDebugMode(); } + @Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { if (key.equals(DEBUG_MODE_KEY)) { if (mDebugMode != null) { diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java index d04bf57a7..74933595c 100644 --- a/java/src/com/android/inputmethod/latin/Dictionary.java +++ b/java/src/com/android/inputmethod/latin/Dictionary.java @@ -20,7 +20,7 @@ package com.android.inputmethod.latin; * Abstract base class for a dictionary that can do a fuzzy search for words based on a set of key * strokes. */ -abstract public class Dictionary { +public abstract class Dictionary { /** * Whether or not to replicate the typed word in the suggested list, even if it's valid. */ @@ -42,11 +42,11 @@ abstract public class Dictionary { public interface WordCallback { /** * Adds a word to a list of suggestions. The word is expected to be ordered based on - * the provided frequency. + * the provided frequency. * @param word the character array containing the word * @param wordOffset starting offset of the word in the character array * @param wordLength length of valid characters in the character array - * @param frequency the frequency of occurence. This is normalized between 1 and 255, but + * @param frequency the frequency of occurrence. This is normalized between 1 and 255, but * can exceed those limits * @param dicTypeId of the dictionary where word was from * @param dataType tells type of this data @@ -74,6 +74,7 @@ abstract public class Dictionary { * Searches for pairs in the bigram dictionary that matches the previous word and all the * possible words following are added through the callback object. * @param composer the key sequence to match + * @param previousWord the word before * @param callback the callback object to send possible word following previous word * @param nextLettersFrequencies array of frequencies of next letters that could follow the * word so far. For instance, "bracke" can be followed by "t", so array['t'] will have @@ -116,5 +117,6 @@ abstract public class Dictionary { * Override to clean up any resources. */ public void close() { + // empty base implementation } } diff --git a/java/src/com/android/inputmethod/latin/EditingUtil.java b/java/src/com/android/inputmethod/latin/EditingUtils.java index 781d7fd4a..0ca06ddfc 100644 --- a/java/src/com/android/inputmethod/latin/EditingUtil.java +++ b/java/src/com/android/inputmethod/latin/EditingUtils.java @@ -28,7 +28,7 @@ import java.util.regex.Pattern; /** * Utility methods to deal with editing text through an InputConnection. */ -public class EditingUtil { +public class EditingUtils { /** * Number of characters we want to look back in order to identify the previous word */ @@ -39,7 +39,9 @@ public class EditingUtil { private static Method sMethodGetSelectedText; private static Method sMethodSetComposingRegion; - private EditingUtil() {}; + private EditingUtils() { + // Unintentional empty constructor for singleton. + } /** * Append newText to the text field represented by connection. @@ -54,14 +56,15 @@ public class EditingUtil { connection.finishComposingText(); // Add a space if the field already has text. + String text = newText; CharSequence charBeforeCursor = connection.getTextBeforeCursor(1, 0); if (charBeforeCursor != null && !charBeforeCursor.equals(" ") && (charBeforeCursor.length() > 0)) { - newText = " " + newText; + text = " " + text; } - connection.setComposingText(newText, 1); + connection.setComposingText(text, 1); } private static int getCursorPosition(InputConnection connection) { @@ -76,33 +79,29 @@ public class EditingUtil { /** * @param connection connection to the current text field. * @param sep characters which may separate words - * @param range the range object to store the result into * @return the word that surrounds the cursor, including up to one trailing * separator. For example, if the field contains "he|llo world", where | * represents the cursor, then "hello " will be returned. */ - public static String getWordAtCursor( - InputConnection connection, String separators, Range range) { - Range r = getWordRangeAtCursor(connection, separators, range); - return (r == null) ? null : r.word; + public static String getWordAtCursor(InputConnection connection, String separators) { + Range r = getWordRangeAtCursor(connection, separators); + return (r == null) ? null : r.mWord; } /** * Removes the word surrounding the cursor. Parameters are identical to * getWordAtCursor. */ - public static void deleteWordAtCursor( - InputConnection connection, String separators) { - - Range range = getWordRangeAtCursor(connection, separators, null); + public static void deleteWordAtCursor(InputConnection connection, String separators) { + Range range = getWordRangeAtCursor(connection, separators); if (range == null) return; connection.finishComposingText(); // Move cursor to beginning of word, to avoid crash when cursor is outside // of valid range after deleting text. - int newCursor = getCursorPosition(connection) - range.charsBefore; + int newCursor = getCursorPosition(connection) - range.mCharsBefore; connection.setSelection(newCursor, newCursor); - connection.deleteSurroundingText(0, range.charsBefore + range.charsAfter); + connection.deleteSurroundingText(0, range.mCharsBefore + range.mCharsAfter); } /** @@ -110,31 +109,28 @@ public class EditingUtil { */ public static class Range { /** Characters before selection start */ - public int charsBefore; + public final int mCharsBefore; /** * Characters after selection start, including one trailing word * separator. */ - public int charsAfter; + public final int mCharsAfter; /** The actual characters that make up a word */ - public String word; - - public Range() {} + public final String mWord; public Range(int charsBefore, int charsAfter, String word) { if (charsBefore < 0 || charsAfter < 0) { throw new IndexOutOfBoundsException(); } - this.charsBefore = charsBefore; - this.charsAfter = charsAfter; - this.word = word; + this.mCharsBefore = charsBefore; + this.mCharsAfter = charsAfter; + this.mWord = word; } } - private static Range getWordRangeAtCursor( - InputConnection connection, String sep, Range range) { + private static Range getWordRangeAtCursor(InputConnection connection, String sep) { if (connection == null || sep == null) { return null; } @@ -150,18 +146,15 @@ public class EditingUtil { // Find last word separator after the cursor int end = -1; - while (++end < after.length() && !isWhitespace(after.charAt(end), sep)); + while (++end < after.length() && !isWhitespace(after.charAt(end), sep)) { + // Nothing to do here. + } int cursor = getCursorPosition(connection); if (start >= 0 && cursor + end <= after.length() + before.length()) { String word = before.toString().substring(start, before.length()) + after.toString().substring(0, end); - - Range returnRange = range != null? range : new Range(); - returnRange.charsBefore = before.length() - start; - returnRange.charsAfter = end; - returnRange.word = word; - return returnRange; + return new Range(before.length() - start, end, word); } return null; @@ -193,9 +186,15 @@ public class EditingUtil { } public static class SelectedWord { - public int start; - public int end; - public CharSequence word; + public final int mStart; + public final int mEnd; + public final CharSequence mWord; + + public SelectedWord(int start, int end, CharSequence word) { + mStart = start; + mEnd = end; + mWord = word; + } } /** @@ -223,14 +222,10 @@ public class EditingUtil { int selStart, int selEnd, String wordSeparators) { if (selStart == selEnd) { // There is just a cursor, so get the word at the cursor - EditingUtil.Range range = new EditingUtil.Range(); - CharSequence touching = getWordAtCursor(ic, wordSeparators, range); - if (!TextUtils.isEmpty(touching)) { - SelectedWord selWord = new SelectedWord(); - selWord.word = touching; - selWord.start = selStart - range.charsBefore; - selWord.end = selEnd + range.charsAfter; - return selWord; + 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 { // Is the previous character empty or a word separator? If not, return null. @@ -256,11 +251,7 @@ public class EditingUtil { } } // Prepare the selected word - SelectedWord selWord = new SelectedWord(); - selWord.start = selStart; - selWord.end = selEnd; - selWord.word = touching; - return selWord; + return new SelectedWord(selStart, selEnd, touching); } return null; } @@ -324,7 +315,7 @@ public class EditingUtil { } if (sMethodSetComposingRegion != null) { try { - sMethodSetComposingRegion.invoke(ic, word.start, word.end); + sMethodSetComposingRegion.invoke(ic, word.mStart, word.mEnd); } catch (InvocationTargetException exc) { // Ignore } catch (IllegalArgumentException e) { diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java index e954c0818..0fc86c335 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java @@ -16,11 +16,11 @@ package com.android.inputmethod.latin; -import java.util.LinkedList; - import android.content.Context; import android.os.AsyncTask; +import java.util.LinkedList; + /** * Base class for an in-memory dictionary that can grow dynamically and can * be searched for suggestions and valid words. @@ -49,53 +49,65 @@ public class ExpandableDictionary extends Dictionary { // Use this lock before touching mUpdatingDictionary & mRequiresDownload private Object mUpdatingLock = new Object(); - static class Node { - char code; - int frequency; - boolean terminal; - Node parent; - NodeArray children; - LinkedList<NextWord> ngrams; // Supports ngram + private static class Node { + char mCode; + int mFrequency; + boolean mTerminal; + Node mParent; + NodeArray mChildren; + LinkedList<NextWord> mNGrams; // Supports ngram } - static class NodeArray { - Node[] data; - int length = 0; + private static class NodeArray { + Node[] mData; + int mLength = 0; private static final int INCREMENT = 2; NodeArray() { - data = new Node[INCREMENT]; + mData = new Node[INCREMENT]; } void add(Node n) { - if (length + 1 > data.length) { - Node[] tempData = new Node[length + INCREMENT]; - if (length > 0) { - System.arraycopy(data, 0, tempData, 0, length); + if (mLength + 1 > mData.length) { + Node[] tempData = new Node[mLength + INCREMENT]; + if (mLength > 0) { + System.arraycopy(mData, 0, tempData, 0, mLength); } - data = tempData; + mData = tempData; } - data[length++] = n; + mData[mLength++] = n; } } - static class NextWord { - Node word; - NextWord nextWord; - int frequency; + private static class NextWord { + public final Node mWord; + private int mFrequency; - NextWord(Node word, int frequency) { - this.word = word; - this.frequency = frequency; + public NextWord(Node word, int frequency) { + mWord = word; + mFrequency = frequency; + } + + public int getFrequency() { + return mFrequency; + } + + public int setFrequency(int freq) { + mFrequency = freq; + return mFrequency; } - } + public int addFrequency(int add) { + mFrequency += add; + return mFrequency; + } + } private NodeArray mRoots; private int[][] mCodes; - ExpandableDictionary(Context context, int dicTypeId) { + public ExpandableDictionary(Context context, int dicTypeId) { mContext = context; clearDictionary(); mCodes = new int[MAX_WORD_LENGTH][]; @@ -128,13 +140,14 @@ public class ExpandableDictionary extends Dictionary { /** Override to load your dictionary here, on a background thread. */ public void loadDictionaryAsync() { + // empty base implementation } - Context getContext() { + public Context getContext() { return mContext; } - - int getMaxWordLength() { + + public int getMaxWordLength() { return MAX_WORD_LENGTH; } @@ -145,35 +158,36 @@ public class ExpandableDictionary extends Dictionary { private void addWordRec(NodeArray children, final String word, final int depth, final int frequency, Node parentNode) { final int wordLength = word.length(); + if (wordLength <= depth) return; final char c = word.charAt(depth); // Does children have the current character? - final int childrenLength = children.length; + final int childrenLength = children.mLength; Node childNode = null; boolean found = false; for (int i = 0; i < childrenLength; i++) { - childNode = children.data[i]; - if (childNode.code == c) { + childNode = children.mData[i]; + if (childNode.mCode == c) { found = true; break; } } if (!found) { childNode = new Node(); - childNode.code = c; - childNode.parent = parentNode; + childNode.mCode = c; + childNode.mParent = parentNode; children.add(childNode); } if (wordLength == depth + 1) { // Terminate this word - childNode.terminal = true; - childNode.frequency = Math.max(frequency, childNode.frequency); - if (childNode.frequency > 255) childNode.frequency = 255; + childNode.mTerminal = true; + childNode.mFrequency = Math.max(frequency, childNode.mFrequency); + if (childNode.mFrequency > 255) childNode.mFrequency = 255; return; } - if (childNode.children == null) { - childNode.children = new NodeArray(); + if (childNode.mChildren == null) { + childNode.mChildren = new NodeArray(); } - addWordRec(childNode.children, word, depth + 1, frequency, childNode); + addWordRec(childNode.mChildren, word, depth + 1, frequency, childNode); } @Override @@ -216,7 +230,7 @@ public class ExpandableDictionary extends Dictionary { */ public int getWordFrequency(CharSequence word) { Node node = searchNode(mRoots, word, 0, word.length()); - return (node == null) ? -1 : node.frequency; + return (node == null) ? -1 : node.mFrequency; } /** @@ -241,7 +255,7 @@ public class ExpandableDictionary extends Dictionary { protected void getWordsRec(NodeArray roots, final WordComposer codes, final char[] word, final int depth, boolean completion, int snr, int inputIndex, int skipPos, WordCallback callback) { - final int count = roots.length; + final int count = roots.mLength; final int codeSize = mInputLength; // Optimization: Prune out words that are too long compared to how much was typed. if (depth > mMaxDepth) { @@ -255,12 +269,12 @@ public class ExpandableDictionary extends Dictionary { } for (int i = 0; i < count; i++) { - final Node node = roots.data[i]; - final char c = node.code; + final Node node = roots.mData[i]; + final char c = node.mCode; final char lowerC = toLowerCase(c); - final boolean terminal = node.terminal; - final NodeArray children = node.children; - final int freq = node.frequency; + final boolean terminal = node.mTerminal; + final NodeArray children = node.mChildren; + final int freq = node.mFrequency; if (completion) { word[depth] = c; if (terminal) { @@ -340,24 +354,22 @@ public class ExpandableDictionary extends Dictionary { private int addOrSetBigram(String word1, String word2, int frequency, boolean addFrequency) { Node firstWord = searchWord(mRoots, word1, 0, null); Node secondWord = searchWord(mRoots, word2, 0, null); - LinkedList<NextWord> bigram = firstWord.ngrams; + LinkedList<NextWord> bigram = firstWord.mNGrams; if (bigram == null || bigram.size() == 0) { - firstWord.ngrams = new LinkedList<NextWord>(); - bigram = firstWord.ngrams; + firstWord.mNGrams = new LinkedList<NextWord>(); + bigram = firstWord.mNGrams; } else { for (NextWord nw : bigram) { - if (nw.word == secondWord) { + if (nw.mWord == secondWord) { if (addFrequency) { - nw.frequency += frequency; + return nw.addFrequency(frequency); } else { - nw.frequency = frequency; + return nw.setFrequency(frequency); } - return nw.frequency; } } } - NextWord nw = new NextWord(secondWord, frequency); - firstWord.ngrams.add(nw); + firstWord.mNGrams.add(new NextWord(secondWord, frequency)); return frequency; } @@ -369,31 +381,31 @@ public class ExpandableDictionary extends Dictionary { final int wordLength = word.length(); final char c = word.charAt(depth); // Does children have the current character? - final int childrenLength = children.length; + final int childrenLength = children.mLength; Node childNode = null; boolean found = false; for (int i = 0; i < childrenLength; i++) { - childNode = children.data[i]; - if (childNode.code == c) { + childNode = children.mData[i]; + if (childNode.mCode == c) { found = true; break; } } if (!found) { childNode = new Node(); - childNode.code = c; - childNode.parent = parentNode; + childNode.mCode = c; + childNode.mParent = parentNode; children.add(childNode); } if (wordLength == depth + 1) { // Terminate this word - childNode.terminal = true; + childNode.mTerminal = true; return childNode; } - if (childNode.children == null) { - childNode.children = new NodeArray(); + if (childNode.mChildren == null) { + childNode.mChildren = new NodeArray(); } - return searchWord(childNode.children, word, depth + 1, childNode); + return searchWord(childNode.mChildren, word, depth + 1, childNode); } // @VisibleForTesting @@ -408,8 +420,8 @@ public class ExpandableDictionary extends Dictionary { private void runReverseLookUp(final CharSequence previousWord, final WordCallback callback) { Node prevWord = searchNode(mRoots, previousWord, 0, previousWord.length()); - if (prevWord != null && prevWord.ngrams != null) { - reverseLookUp(prevWord.ngrams, callback); + if (prevWord != null && prevWord.mNGrams != null) { + reverseLookUp(prevWord.mNGrams, callback); } } @@ -430,6 +442,7 @@ public class ExpandableDictionary extends Dictionary { try { Thread.sleep(100); } catch (InterruptedException e) { + // } } } @@ -444,14 +457,14 @@ public class ExpandableDictionary extends Dictionary { Node node; int freq; for (NextWord nextWord : terminalNodes) { - node = nextWord.word; - freq = nextWord.frequency; + node = nextWord.mWord; + freq = nextWord.getFrequency(); // TODO Not the best way to limit suggestion threshold if (freq >= UserBigramDictionary.SUGGEST_THRESHOLD) { sb.setLength(0); do { - sb.insert(0, node.code); - node = node.parent; + sb.insert(0, node.mCode); + node = node.mParent; } while(node != null); // TODO better way to feed char array? @@ -468,18 +481,18 @@ public class ExpandableDictionary extends Dictionary { private Node searchNode(final NodeArray children, final CharSequence word, final int offset, final int length) { // TODO Consider combining with addWordRec - final int count = children.length; + final int count = children.mLength; char currentChar = word.charAt(offset); for (int j = 0; j < count; j++) { - final Node node = children.data[j]; - if (node.code == currentChar) { + final Node node = children.mData[j]; + if (node.mCode == currentChar) { if (offset == length - 1) { - if (node.terminal) { + if (node.mTerminal) { return node; } } else { - if (node.children != null) { - Node returnNode = searchNode(node.children, word, offset + 1, length); + if (node.mChildren != null) { + Node returnNode = searchNode(node.mChildren, word, offset + 1, length); if (returnNode != null) return returnNode; } } @@ -504,15 +517,16 @@ public class ExpandableDictionary extends Dictionary { } static char toLowerCase(char c) { + char baseChar = c; if (c < BASE_CHARS.length) { - c = BASE_CHARS[c]; + baseChar = BASE_CHARS[c]; } - if (c >= 'A' && c <= 'Z') { - c = (char) (c | 32); - } else if (c > 127) { - c = Character.toLowerCase(c); + if (baseChar >= 'A' && baseChar <= 'Z') { + return (char)(baseChar | 32); + } else if (baseChar > 127) { + return Character.toLowerCase(baseChar); } - return c; + return baseChar; } /** diff --git a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java index e811a2cdd..a9f2c2c22 100644 --- a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java +++ b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java @@ -16,11 +16,6 @@ package com.android.inputmethod.latin; -import java.text.Collator; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Locale; - import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.res.Configuration; @@ -32,32 +27,43 @@ import android.preference.PreferenceGroup; import android.preference.PreferenceManager; import android.text.TextUtils; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Locale; + public class InputLanguageSelection extends PreferenceActivity { + private SharedPreferences mPrefs; private String mSelectedLanguages; private ArrayList<Loc> mAvailableLanguages = new ArrayList<Loc>(); private static final String[] BLACKLIST_LANGUAGES = { - "ko", "ja", "zh", "el" + "ko", "ja", "zh", "el", "zz" }; private static class Loc implements Comparable<Object> { - static Collator sCollator = Collator.getInstance(); + private static Collator sCollator = Collator.getInstance(); - String label; - Locale locale; + private String mLabel; + public final Locale mLocale; public Loc(String label, Locale locale) { - this.label = label; - this.locale = locale; + this.mLabel = label; + this.mLocale = locale; + } + + public void setLabel(String label) { + this.mLabel = label; } @Override public String toString() { - return this.label; + return this.mLabel; } + @Override public int compareTo(Object o) { - return sCollator.compare(this.label, ((Loc) o).label); + return sCollator.compare(this.mLabel, ((Loc) o).mLabel); } } @@ -66,15 +72,15 @@ public class InputLanguageSelection extends PreferenceActivity { super.onCreate(icicle); addPreferencesFromResource(R.xml.language_prefs); // Get the settings preferences - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - mSelectedLanguages = sp.getString(LatinIME.PREF_SELECTED_LANGUAGES, ""); + mPrefs = PreferenceManager.getDefaultSharedPreferences(this); + mSelectedLanguages = mPrefs.getString(Settings.PREF_SELECTED_LANGUAGES, ""); String[] languageList = mSelectedLanguages.split(","); mAvailableLanguages = getUniqueLocales(); PreferenceGroup parent = getPreferenceScreen(); for (int i = 0; i < mAvailableLanguages.size(); i++) { CheckBoxPreference pref = new CheckBoxPreference(this); - Locale locale = mAvailableLanguages.get(i).locale; - pref.setTitle(LanguageSwitcher.toTitleCase(locale.getDisplayName(locale))); + Locale locale = mAvailableLanguages.get(i).mLocale; + pref.setTitle(SubtypeSwitcher.getFullDisplayName(locale, true)); boolean checked = isLocaleIn(locale, languageList); pref.setChecked(checked); if (hasDictionary(locale)) { @@ -93,15 +99,15 @@ public class InputLanguageSelection extends PreferenceActivity { } private boolean hasDictionary(Locale locale) { - Resources res = getResources(); - Configuration conf = res.getConfiguration(); - Locale saveLocale = conf.locale; + final Resources res = getResources(); + final Configuration conf = res.getConfiguration(); + final Locale saveLocale = conf.locale; boolean haveDictionary = false; conf.locale = locale; res.updateConfiguration(conf, res.getDisplayMetrics()); - int[] dictionaries = LatinIME.getDictionary(res); - BinaryDictionary bd = new BinaryDictionary(this, dictionaries, Suggest.DIC_MAIN); + int mainDicResId = LatinIME.getMainDictionaryResourceId(res); + BinaryDictionary bd = BinaryDictionary.initDictionary(this, mainDicResId, Suggest.DIC_MAIN); // Is the dictionary larger than a placeholder? Arbitrarily chose a lower limit of // 4000-5000 words, whereas the LARGE_DICTIONARY is about 20000+ words. @@ -135,18 +141,17 @@ public class InputLanguageSelection extends PreferenceActivity { for (int i = 0; i < count; i++) { CheckBoxPreference pref = (CheckBoxPreference) parent.getPreference(i); if (pref.isChecked()) { - Locale locale = mAvailableLanguages.get(i).locale; + Locale locale = mAvailableLanguages.get(i).mLocale; checkedLanguages += get5Code(locale) + ","; } } if (checkedLanguages.length() < 1) checkedLanguages = null; // Save null - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - Editor editor = sp.edit(); - editor.putString(LatinIME.PREF_SELECTED_LANGUAGES, checkedLanguages); + Editor editor = mPrefs.edit(); + editor.putString(Settings.PREF_SELECTED_LANGUAGES, checkedLanguages); SharedPreferencesCompat.apply(editor); } - ArrayList<Loc> getUniqueLocales() { + public ArrayList<Loc> getUniqueLocales() { String[] locales = getAssets().getLocales(); Arrays.sort(locales); ArrayList<Loc> uniqueLocales = new ArrayList<Loc>(); @@ -167,23 +172,24 @@ public class InputLanguageSelection extends PreferenceActivity { if (finalSize == 0) { preprocess[finalSize++] = - new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(l)), l); + new Loc(SubtypeSwitcher.getFullDisplayName(l, true), l); } else { // check previous entry: // same lang and a country -> upgrade to full name and // insert ours with full name // diff lang -> insert ours with lang-only name - if (preprocess[finalSize-1].locale.getLanguage().equals( + if (preprocess[finalSize-1].mLocale.getLanguage().equals( language)) { - preprocess[finalSize-1].label = LanguageSwitcher.toTitleCase( - preprocess[finalSize-1].locale.getDisplayName()); + preprocess[finalSize-1].setLabel(SubtypeSwitcher.getFullDisplayName( + preprocess[finalSize-1].mLocale, false)); preprocess[finalSize++] = - new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName()), l); + new Loc(SubtypeSwitcher.getFullDisplayName(l, false), l); } else { String displayName; if (s.equals("zz_ZZ")) { + // ignore this locale } else { - displayName = LanguageSwitcher.toTitleCase(l.getDisplayName(l)); + displayName = SubtypeSwitcher.getFullDisplayName(l, true); preprocess[finalSize++] = new Loc(displayName, l); } } diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java deleted file mode 100644 index 0db204ed8..000000000 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ /dev/null @@ -1,606 +0,0 @@ -/* - * 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 - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import android.content.SharedPreferences; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.preference.PreferenceManager; -import android.view.InflateException; - -import java.lang.ref.SoftReference; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Locale; - -public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener { - - public static final int MODE_NONE = 0; - public static final int MODE_TEXT = 1; - public static final int MODE_SYMBOLS = 2; - public static final int MODE_PHONE = 3; - public static final int MODE_URL = 4; - public static final int MODE_EMAIL = 5; - public static final int MODE_IM = 6; - public static final int MODE_WEB = 7; - - // Main keyboard layouts without the settings key - public static final int KEYBOARDMODE_NORMAL = R.id.mode_normal; - public static final int KEYBOARDMODE_URL = R.id.mode_url; - public static final int KEYBOARDMODE_EMAIL = R.id.mode_email; - public static final int KEYBOARDMODE_IM = R.id.mode_im; - public static final int KEYBOARDMODE_WEB = R.id.mode_webentry; - // Main keyboard layouts with the settings key - public static final int KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY = - R.id.mode_normal_with_settings_key; - public static final int KEYBOARDMODE_URL_WITH_SETTINGS_KEY = - R.id.mode_url_with_settings_key; - public static final int KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY = - R.id.mode_email_with_settings_key; - public static final int KEYBOARDMODE_IM_WITH_SETTINGS_KEY = - R.id.mode_im_with_settings_key; - public static final int KEYBOARDMODE_WEB_WITH_SETTINGS_KEY = - R.id.mode_webentry_with_settings_key; - - // Symbols keyboard layout without the settings key - public static final int KEYBOARDMODE_SYMBOLS = R.id.mode_symbols; - // Symbols keyboard layout with the settings key - public static final int KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY = - R.id.mode_symbols_with_settings_key; - - public static final String DEFAULT_LAYOUT_ID = "4"; - public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20100902"; - private static final int[] THEMES = new int [] { - R.layout.input_basic, R.layout.input_basic_highcontrast, R.layout.input_stone_normal, - R.layout.input_stone_bold, R.layout.input_gingerbread}; - - // Ids for each characters' color in the keyboard - private static final int CHAR_THEME_COLOR_WHITE = 0; - private static final int CHAR_THEME_COLOR_BLACK = 1; - - // Tables which contains resource ids for each character theme color - private static final int[] KBD_PHONE = new int[] {R.xml.kbd_phone, R.xml.kbd_phone_black}; - private static final int[] KBD_PHONE_SYMBOLS = new int[] { - R.xml.kbd_phone_symbols, R.xml.kbd_phone_symbols_black}; - private static final int[] KBD_SYMBOLS = new int[] { - R.xml.kbd_symbols, R.xml.kbd_symbols_black}; - private static final int[] KBD_SYMBOLS_SHIFT = new int[] { - R.xml.kbd_symbols_shift, R.xml.kbd_symbols_shift_black}; - private static final int[] KBD_QWERTY = new int[] {R.xml.kbd_qwerty, R.xml.kbd_qwerty_black}; - - private LatinKeyboardView mInputView; - private static final int[] ALPHABET_MODES = { - KEYBOARDMODE_NORMAL, - KEYBOARDMODE_URL, - KEYBOARDMODE_EMAIL, - KEYBOARDMODE_IM, - KEYBOARDMODE_WEB, - KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY, - KEYBOARDMODE_URL_WITH_SETTINGS_KEY, - KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY, - KEYBOARDMODE_IM_WITH_SETTINGS_KEY, - KEYBOARDMODE_WEB_WITH_SETTINGS_KEY }; - - private LatinIME mInputMethodService; - - private KeyboardId mSymbolsId; - private KeyboardId mSymbolsShiftedId; - - private KeyboardId mCurrentId; - private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboards = - new HashMap<KeyboardId, SoftReference<LatinKeyboard>>(); - - private int mMode = MODE_NONE; /** One of the MODE_XXX values */ - private int mImeOptions; - private boolean mIsSymbols; - /** mIsAutoCompletionActive indicates that auto completed word will be input instead of - * what user actually typed. */ - private boolean mIsAutoCompletionActive; - private boolean mHasVoice; - private boolean mVoiceOnPrimary; - private boolean mPreferSymbols; - - private static final int AUTO_MODE_SWITCH_STATE_ALPHA = 0; - private static final int AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN = 1; - private static final int AUTO_MODE_SWITCH_STATE_SYMBOL = 2; - // The following states are used only on the distinct multi-touch panel devices. - private static final int AUTO_MODE_SWITCH_STATE_MOMENTARY = 3; - private static final int AUTO_MODE_SWITCH_STATE_CHORDING = 4; - private int mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; - - // Indicates whether or not we have the settings key - private boolean mHasSettingsKey; - 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 mLastDisplayWidth; - private LanguageSwitcher mLanguageSwitcher; - private Locale mInputLocale; - - private int mLayoutId; - - private static final KeyboardSwitcher sInstance = new KeyboardSwitcher(); - - public static KeyboardSwitcher getInstance() { - return sInstance; - } - - private KeyboardSwitcher() { - // Intentional empty constructor for singleton. - } - - public static void init(LatinIME ims) { - sInstance.mInputMethodService = ims; - - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ims); - sInstance.mLayoutId = Integer.valueOf( - prefs.getString(PREF_KEYBOARD_LAYOUT, DEFAULT_LAYOUT_ID)); - sInstance.updateSettingsKeyState(prefs); - prefs.registerOnSharedPreferenceChangeListener(sInstance); - - sInstance.mSymbolsId = sInstance.makeSymbolsId(false); - sInstance.mSymbolsShiftedId = sInstance.makeSymbolsShiftedId(false); - } - - /** - * Sets the input locale, when there are multiple locales for input. - * If no locale switching is required, then the locale should be set to null. - * @param locale the current input locale, or null for default locale with no locale - * button. - */ - public void setLanguageSwitcher(LanguageSwitcher languageSwitcher) { - mLanguageSwitcher = languageSwitcher; - mInputLocale = mLanguageSwitcher.getInputLocale(); - } - - private KeyboardId makeSymbolsId(boolean hasVoice) { - return new KeyboardId(KBD_SYMBOLS[getCharColorId()], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - } - - private KeyboardId makeSymbolsShiftedId(boolean hasVoice) { - return new KeyboardId(KBD_SYMBOLS_SHIFT[getCharColorId()], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - } - - public void makeKeyboards(boolean forceCreate) { - mSymbolsId = makeSymbolsId(mHasVoice && !mVoiceOnPrimary); - mSymbolsShiftedId = makeSymbolsShiftedId(mHasVoice && !mVoiceOnPrimary); - - if (forceCreate) mKeyboards.clear(); - // Configuration change is coming after the keyboard gets recreated. So don't rely on that. - // If keyboards have already been made, check if we have a screen width change and - // create the keyboard layouts again at the correct orientation - int displayWidth = mInputMethodService.getMaxWidth(); - if (displayWidth == mLastDisplayWidth) return; - mLastDisplayWidth = displayWidth; - if (!forceCreate) mKeyboards.clear(); - } - - /** - * Represents the parameters necessary to construct a new LatinKeyboard, - * which also serve as a unique identifier for each keyboard type. - */ - private static class KeyboardId { - // TODO: should have locale and portrait/landscape orientation? - public final int mXml; - public final int mKeyboardMode; /** A KEYBOARDMODE_XXX value */ - public final boolean mEnableShiftLock; - public final boolean mHasVoice; - - private final int mHashCode; - - public KeyboardId(int xml, int mode, boolean enableShiftLock, boolean hasVoice) { - this.mXml = xml; - this.mKeyboardMode = mode; - this.mEnableShiftLock = enableShiftLock; - this.mHasVoice = hasVoice; - - this.mHashCode = Arrays.hashCode(new Object[] { - xml, mode, enableShiftLock, hasVoice - }); - } - - public KeyboardId(int xml, boolean hasVoice) { - this(xml, 0, false, hasVoice); - } - - @Override - public boolean equals(Object other) { - return other instanceof KeyboardId && equals((KeyboardId) other); - } - - private boolean equals(KeyboardId other) { - return other.mXml == this.mXml - && other.mKeyboardMode == this.mKeyboardMode - && other.mEnableShiftLock == this.mEnableShiftLock - && other.mHasVoice == this.mHasVoice; - } - - @Override - public int hashCode() { - return mHashCode; - } - } - - public void setVoiceMode(boolean enableVoice, boolean voiceOnPrimary) { - if (enableVoice != mHasVoice || voiceOnPrimary != mVoiceOnPrimary) { - mKeyboards.clear(); - } - mHasVoice = enableVoice; - mVoiceOnPrimary = voiceOnPrimary; - setKeyboardMode(mMode, mImeOptions, mHasVoice, mIsSymbols); - } - - private boolean hasVoiceButton(boolean isSymbols) { - return mHasVoice && (isSymbols != mVoiceOnPrimary); - } - - public void setKeyboardMode(int mode, int imeOptions, boolean enableVoice) { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; - mPreferSymbols = mode == MODE_SYMBOLS; - if (mode == MODE_SYMBOLS) { - mode = MODE_TEXT; - } - try { - setKeyboardMode(mode, imeOptions, enableVoice, mPreferSymbols); - } catch (RuntimeException e) { - LatinImeLogger.logOnException(mode + "," + imeOptions + "," + mPreferSymbols, e); - } - } - - private void setKeyboardMode(int mode, int imeOptions, boolean enableVoice, boolean isSymbols) { - if (mInputView == null) return; - mMode = mode; - mImeOptions = imeOptions; - if (enableVoice != mHasVoice) { - // TODO clean up this unnecessary recursive call. - setVoiceMode(enableVoice, mVoiceOnPrimary); - } - mIsSymbols = isSymbols; - - mInputView.setPreviewEnabled(mInputMethodService.getPopupOn()); - KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols); - LatinKeyboard keyboard = null; - keyboard = getKeyboard(id); - - if (mode == MODE_PHONE) { - mInputView.setPhoneKeyboard(keyboard); - } - - mCurrentId = id; - mInputView.setKeyboard(keyboard); - keyboard.setShifted(false); - keyboard.setShiftLocked(keyboard.isShiftLocked()); - keyboard.setImeOptions(mInputMethodService.getResources(), mMode, imeOptions); - keyboard.setColorOfSymbolIcons(mIsAutoCompletionActive, isBlackSym()); - // Update the settings key state because number of enabled IMEs could have been changed - updateSettingsKeyState(PreferenceManager.getDefaultSharedPreferences(mInputMethodService)); - } - - private LatinKeyboard getKeyboard(KeyboardId id) { - SoftReference<LatinKeyboard> ref = mKeyboards.get(id); - LatinKeyboard keyboard = (ref == null) ? null : ref.get(); - if (keyboard == null) { - Resources orig = mInputMethodService.getResources(); - Configuration conf = orig.getConfiguration(); - Locale saveLocale = conf.locale; - conf.locale = mInputLocale; - orig.updateConfiguration(conf, null); - keyboard = new LatinKeyboard(mInputMethodService, id.mXml, id.mKeyboardMode); - keyboard.setVoiceMode(hasVoiceButton(id.mXml == R.xml.kbd_symbols - || id.mXml == R.xml.kbd_symbols_black), mHasVoice); - keyboard.setLanguageSwitcher(mLanguageSwitcher, mIsAutoCompletionActive, isBlackSym()); - - if (id.mEnableShiftLock) { - keyboard.enableShiftLock(); - } - mKeyboards.put(id, new SoftReference<LatinKeyboard>(keyboard)); - - conf.locale = saveLocale; - orig.updateConfiguration(conf, null); - } - return keyboard; - } - - private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) { - boolean hasVoice = hasVoiceButton(isSymbols); - int charColorId = getCharColorId(); - // TODO: generalize for any KeyboardId - int keyboardRowsResId = KBD_QWERTY[charColorId]; - if (isSymbols) { - if (mode == MODE_PHONE) { - return new KeyboardId(KBD_PHONE_SYMBOLS[charColorId], hasVoice); - } else { - return new KeyboardId(KBD_SYMBOLS[charColorId], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - } - } - switch (mode) { - case MODE_NONE: - LatinImeLogger.logOnWarning( - "getKeyboardId:" + mode + "," + imeOptions + "," + isSymbols); - /* fall through */ - case MODE_TEXT: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY : KEYBOARDMODE_NORMAL, - true, hasVoice); - case MODE_SYMBOLS: - return new KeyboardId(KBD_SYMBOLS[charColorId], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - case MODE_PHONE: - return new KeyboardId(KBD_PHONE[charColorId], hasVoice); - case MODE_URL: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_URL_WITH_SETTINGS_KEY : KEYBOARDMODE_URL, true, hasVoice); - case MODE_EMAIL: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY : KEYBOARDMODE_EMAIL, true, hasVoice); - case MODE_IM: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_IM_WITH_SETTINGS_KEY : KEYBOARDMODE_IM, true, hasVoice); - case MODE_WEB: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_WEB_WITH_SETTINGS_KEY : KEYBOARDMODE_WEB, true, hasVoice); - } - return null; - } - - public int getKeyboardMode() { - return mMode; - } - - public boolean isAlphabetMode() { - if (mCurrentId == null) { - return false; - } - int currentMode = mCurrentId.mKeyboardMode; - for (Integer mode : ALPHABET_MODES) { - if (currentMode == mode) { - return true; - } - } - return false; - } - - public void setShifted(boolean shifted) { - if (mInputView != null) { - mInputView.setShifted(shifted); - } - } - - public void setShiftLocked(boolean shiftLocked) { - if (mInputView != null) { - mInputView.setShiftLocked(shiftLocked); - } - } - - public void toggleShift() { - if (isAlphabetMode()) - return; - if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) { - LatinKeyboard symbolsShiftedKeyboard = getKeyboard(mSymbolsShiftedId); - mCurrentId = mSymbolsShiftedId; - mInputView.setKeyboard(symbolsShiftedKeyboard); - // Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To - // enable the indicator, we need to call enableShiftLock() and setShiftLocked(true). - // Thus we can keep the ALT key's Key.on value true while LatinKey.onRelease() is - // called. - symbolsShiftedKeyboard.enableShiftLock(); - symbolsShiftedKeyboard.setShiftLocked(true); - symbolsShiftedKeyboard.setImeOptions(mInputMethodService.getResources(), - mMode, mImeOptions); - } else { - LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId); - mCurrentId = mSymbolsId; - mInputView.setKeyboard(symbolsKeyboard); - // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the - // indicator, we need to call enableShiftLock() and setShiftLocked(false). - symbolsKeyboard.enableShiftLock(); - symbolsKeyboard.setShifted(false); - symbolsKeyboard.setImeOptions(mInputMethodService.getResources(), mMode, mImeOptions); - } - } - - public void onCancelInput() { - // Snap back to the previous keyboard mode if the user cancels sliding input. - if (mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY && getPointerCount() == 1) - mInputMethodService.changeKeyboardMode(); - } - - public void toggleSymbols() { - setKeyboardMode(mMode, mImeOptions, mHasVoice, !mIsSymbols); - if (mIsSymbols && !mPreferSymbols) { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN; - } else { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; - } - } - - public boolean hasDistinctMultitouch() { - return mInputView != null && mInputView.hasDistinctMultitouch(); - } - - public void setAutoModeSwitchStateMomentary() { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_MOMENTARY; - } - - public boolean isInMomentaryAutoModeSwitchState() { - return mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY; - } - - public boolean isInChordingAutoModeSwitchState() { - return mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_CHORDING; - } - - public boolean isVibrateAndSoundFeedbackRequired() { - return mInputView != null && !mInputView.isInSlidingKeyInput(); - } - - private int getPointerCount() { - return mInputView == null ? 0 : mInputView.getPointerCount(); - } - - /** - * Updates state machine to figure out when to automatically snap back to the previous mode. - */ - public void onKey(int key) { - // Switch back to alpha mode if user types one or more non-space/enter characters - // followed by a space/enter - switch (mAutoModeSwitchState) { - case AUTO_MODE_SWITCH_STATE_MOMENTARY: - // Only distinct multi touch devices can be in this state. - // On non-distinct multi touch devices, mode change key is handled by {@link onKey}, - // not by {@link onPress} and {@link onRelease}. So, on such devices, - // {@link mAutoModeSwitchState} starts from {@link AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN}, - // or {@link AUTO_MODE_SWITCH_STATE_ALPHA}, not from - // {@link AUTO_MODE_SWITCH_STATE_MOMENTARY}. - if (key == LatinKeyboard.KEYCODE_MODE_CHANGE) { - // Detected only the mode change key has been pressed, and then released. - if (mIsSymbols) { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN; - } else { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; - } - } else if (getPointerCount() == 1) { - // Snap back to the previous keyboard mode if the user pressed the mode change key - // and slid to other key, then released the finger. - // If the user cancels the sliding input, snapping back to the previous keyboard - // mode is handled by {@link #onCancelInput}. - mInputMethodService.changeKeyboardMode(); - } else { - // Chording input is being started. The keyboard mode will be snapped back to the - // previous mode in {@link onReleaseSymbol} when the mode change key is released. - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_CHORDING; - } - break; - case AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN: - if (key != LatinIME.KEYCODE_SPACE && key != LatinIME.KEYCODE_ENTER && key >= 0) { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL; - } - break; - case AUTO_MODE_SWITCH_STATE_SYMBOL: - // Snap back to alpha keyboard mode if user types one or more non-space/enter - // characters followed by a space/enter. - if (key == LatinIME.KEYCODE_ENTER || key == LatinIME.KEYCODE_SPACE) { - mInputMethodService.changeKeyboardMode(); - } - break; - } - } - - public LatinKeyboardView getInputView() { - return mInputView; - } - - public void recreateInputView() { - changeLatinKeyboardView(mLayoutId, true); - } - - private void changeLatinKeyboardView(int newLayout, boolean forceReset) { - if (mLayoutId != newLayout || mInputView == null || forceReset) { - if (mInputView != null) { - mInputView.closing(); - } - if (THEMES.length <= newLayout) { - newLayout = Integer.valueOf(DEFAULT_LAYOUT_ID); - } - - LatinIMEUtil.GCUtils.getInstance().reset(); - boolean tryGC = true; - for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { - try { - mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater( - ).inflate(THEMES[newLayout], null); - tryGC = false; - } catch (OutOfMemoryError e) { - tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait( - mLayoutId + "," + newLayout, e); - } catch (InflateException e) { - tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait( - mLayoutId + "," + newLayout, e); - } - } - mInputView.setOnKeyboardActionListener(mInputMethodService); - mLayoutId = newLayout; - } - mInputMethodService.mHandler.post(new Runnable() { - public void run() { - if (mInputView != null) { - mInputMethodService.setInputView(mInputView); - } - mInputMethodService.updateInputViewShown(); - }}); - } - - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (PREF_KEYBOARD_LAYOUT.equals(key)) { - changeLatinKeyboardView( - Integer.valueOf(sharedPreferences.getString(key, DEFAULT_LAYOUT_ID)), false); - } else if (LatinIMESettings.PREF_SETTINGS_KEY.equals(key)) { - updateSettingsKeyState(sharedPreferences); - recreateInputView(); - } - } - - public boolean isBlackSym () { - if (mInputView != null && mInputView.getSymbolColorScheme() == 1) { - return true; - } - return false; - } - - private int getCharColorId () { - if (isBlackSym()) { - return CHAR_THEME_COLOR_BLACK; - } else { - return CHAR_THEME_COLOR_WHITE; - } - } - - public void onAutoCompletionStateChanged(boolean isAutoCompletion) { - if (isAutoCompletion != mIsAutoCompletionActive) { - LatinKeyboardView keyboardView = getInputView(); - mIsAutoCompletionActive = isAutoCompletion; - keyboardView.invalidateKey(((LatinKeyboard) keyboardView.getKeyboard()) - .onAutoCompletionStateChanged(isAutoCompletion)); - } - } - - private void updateSettingsKeyState(SharedPreferences prefs) { - Resources resources = mInputMethodService.getResources(); - final String settingsKeyMode = prefs.getString(LatinIMESettings.PREF_SETTINGS_KEY, - resources.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(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW)) - || (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_AUTO)) - && LatinIMEUtil.hasMultipleEnabledIMEs(mInputMethodService))) { - mHasSettingsKey = true; - } else { - mHasSettingsKey = false; - } - } -} diff --git a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java index 7b5c30491..6faf7f95e 100644 --- a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java +++ b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java @@ -16,21 +16,21 @@ package com.android.inputmethod.latin; -import java.util.Locale; - import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; -import android.preference.PreferenceManager; import android.text.TextUtils; +import java.util.ArrayList; +import java.util.Locale; + /** * Keeps track of list of selected input languages and the current * input language that the user has selected. */ public class LanguageSwitcher { - private Locale[] mLocales; - private LatinIME mIme; + private final ArrayList<Locale> mLocales = new ArrayList<Locale>(); + private final LatinIME mIme; private String[] mSelectedLanguageArray; private String mSelectedLanguages; private int mCurrentIndex = 0; @@ -40,15 +40,10 @@ public class LanguageSwitcher { public LanguageSwitcher(LatinIME ime) { mIme = ime; - mLocales = new Locale[0]; - } - - public Locale[] getLocales() { - return mLocales; } public int getLocaleCount() { - return mLocales.length; + return mLocales.size(); } /** @@ -57,14 +52,14 @@ public class LanguageSwitcher { * @return whether there was any change */ public boolean loadLocales(SharedPreferences sp) { - String selectedLanguages = sp.getString(LatinIME.PREF_SELECTED_LANGUAGES, null); - String currentLanguage = sp.getString(LatinIME.PREF_INPUT_LANGUAGE, null); + String selectedLanguages = sp.getString(Settings.PREF_SELECTED_LANGUAGES, null); + String currentLanguage = sp.getString(Settings.PREF_INPUT_LANGUAGE, null); if (selectedLanguages == null || selectedLanguages.length() < 1) { loadDefaults(); - if (mLocales.length == 0) { + if (mLocales.size() == 0) { return false; } - mLocales = new Locale[0]; + mLocales.clear(); return true; } if (selectedLanguages.equals(mSelectedLanguages)) { @@ -77,7 +72,7 @@ public class LanguageSwitcher { if (currentLanguage != null) { // Find the index mCurrentIndex = 0; - for (int i = 0; i < mLocales.length; i++) { + for (int i = 0; i < mLocales.size(); i++) { if (mSelectedLanguageArray[i].equals(currentLanguage)) { mCurrentIndex = i; break; @@ -96,11 +91,11 @@ public class LanguageSwitcher { } private void constructLocales() { - mLocales = new Locale[mSelectedLanguageArray.length]; - for (int i = 0; i < mLocales.length; i++) { - final String lang = mSelectedLanguageArray[i]; - mLocales[i] = new Locale(lang.substring(0, 2), + mLocales.clear(); + for (final String lang : mSelectedLanguageArray) { + final Locale locale = new Locale(lang.substring(0, 2), lang.length() > 4 ? lang.substring(3, 5) : ""); + mLocales.add(locale); } } @@ -129,7 +124,17 @@ public class LanguageSwitcher { public Locale getInputLocale() { if (getLocaleCount() == 0) return mDefaultInputLocale; - return mLocales[mCurrentIndex]; + return mLocales.get(mCurrentIndex); + } + + private int nextLocaleIndex() { + final int size = mLocales.size(); + return (mCurrentIndex + 1) % size; + } + + private int prevLocaleIndex() { + final int size = mLocales.size(); + return (mCurrentIndex - 1 + size) % size; } /** @@ -139,8 +144,7 @@ public class LanguageSwitcher { */ public Locale getNextInputLocale() { if (getLocaleCount() == 0) return mDefaultInputLocale; - - return mLocales[(mCurrentIndex + 1) % mLocales.length]; + return mLocales.get(nextLocaleIndex()); } /** @@ -166,8 +170,7 @@ public class LanguageSwitcher { */ public Locale getPrevInputLocale() { if (getLocaleCount() == 0) return mDefaultInputLocale; - - return mLocales[(mCurrentIndex - 1 + mLocales.length) % mLocales.length]; + return mLocales.get(prevLocaleIndex()); } public void reset() { @@ -175,27 +178,16 @@ public class LanguageSwitcher { } public void next() { - mCurrentIndex++; - if (mCurrentIndex >= mLocales.length) mCurrentIndex = 0; // Wrap around + mCurrentIndex = nextLocaleIndex(); } public void prev() { - mCurrentIndex--; - if (mCurrentIndex < 0) mCurrentIndex = mLocales.length - 1; // Wrap around + mCurrentIndex = prevLocaleIndex(); } - public void persist() { - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mIme); - Editor editor = sp.edit(); - editor.putString(LatinIME.PREF_INPUT_LANGUAGE, getInputLanguage()); + public void persist(SharedPreferences prefs) { + Editor editor = prefs.edit(); + editor.putString(Settings.PREF_INPUT_LANGUAGE, getInputLanguage()); SharedPreferencesCompat.apply(editor); } - - static String toTitleCase(String s) { - if (s.length() == 0) { - return s; - } - - return Character.toUpperCase(s.charAt(0)) + s.substring(1); - } } diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index b1689f886..198d34f4a 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -16,12 +16,15 @@ package com.android.inputmethod.latin; -import com.android.inputmethod.latin.LatinIMEUtil.RingCharBuffer; -import com.android.inputmethod.voice.FieldContext; -import com.android.inputmethod.voice.SettingsUtil; -import com.android.inputmethod.voice.VoiceInput; - -import org.xmlpull.v1.XmlPullParserException; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardActionListener; +import com.android.inputmethod.keyboard.KeyboardId; +import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.keyboard.KeyboardView; +import com.android.inputmethod.keyboard.LatinKeyboard; +import com.android.inputmethod.keyboard.LatinKeyboardView; +import com.android.inputmethod.latin.Utils.RingCharBuffer; +import com.android.inputmethod.voice.VoiceIMEConnector; import android.app.AlertDialog; import android.content.BroadcastReceiver; @@ -32,23 +35,22 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; -import android.content.res.XmlResourceParser; import android.inputmethodservice.InputMethodService; -import android.inputmethodservice.Keyboard; import android.media.AudioManager; import android.os.Debug; import android.os.Handler; import android.os.Message; import android.os.SystemClock; +import android.os.Vibrator; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; -import android.speech.SpeechRecognizer; -import android.text.ClipboardManager; +import android.text.InputType; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; import android.util.PrintWriterPrinter; import android.util.Printer; +import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -58,206 +60,140 @@ import android.view.ViewParent; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.CompletionInfo; +import android.view.inputmethod.CorrectionInfo; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputMethodManager; +import android.view.inputmethod.InputMethodSubtype; +import android.widget.FrameLayout; +import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import java.io.FileDescriptor; -import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; +import java.util.Arrays; import java.util.Locale; -import java.util.Map; /** * Input method implementation for Qwerty'ish keyboard. */ -public class LatinIME extends InputMethodService - implements LatinKeyboardBaseView.OnKeyboardActionListener, - VoiceInput.UiListener, +public class LatinIME extends InputMethodService implements KeyboardActionListener, SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIME"; private static final boolean PERF_DEBUG = false; - static final boolean DEBUG = false; - static final boolean TRACE = false; - static final boolean VOICE_INSTALLED = true; - static final boolean ENABLE_VOICE_BUTTON = true; - - private static final String PREF_VIBRATE_ON = "vibrate_on"; - private static final String PREF_SOUND_ON = "sound_on"; - private static final String PREF_POPUP_ON = "popup_on"; - private static final String PREF_AUTO_CAP = "auto_cap"; - private static final String PREF_QUICK_FIXES = "quick_fixes"; - private static final String PREF_SHOW_SUGGESTIONS = "show_suggestions"; - private static final String PREF_AUTO_COMPLETE = "auto_complete"; - //private static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion"; - 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 - // first-run warning dialog or not). - private static final String PREF_HAS_USED_VOICE_INPUT = "has_used_voice_input"; - - // Whether or not the user has used voice input from an unsupported locale UI before. - // For example, the user has a Chinese UI but activates voice input. - private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE = - "has_used_voice_input_unsupported_locale"; - - // A list of locales which are supported by default for voice input, unless we get a - // different list from Gservices. - public static final String DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES = - "en " + - "en_US " + - "en_GB " + - "en_AU " + - "en_CA " + - "en_IE " + - "en_IN " + - "en_NZ " + - "en_SG " + - "en_ZA "; - - // The private IME option used to indicate that no microphone should be shown for a - // given text field. For instance this is specified by the search dialog when the - // dialog is already showing a voice search button. - private static final String IME_OPTION_NO_MICROPHONE = "nm"; - - public static final String PREF_SELECTED_LANGUAGES = "selected_languages"; - public static final String PREF_INPUT_LANGUAGE = "input_language"; - private static final String PREF_RECORRECTION_ENABLED = "recorrection_enabled"; - - private static final int MSG_UPDATE_SUGGESTIONS = 0; - private static final int MSG_START_TUTORIAL = 1; - private static final int MSG_UPDATE_SHIFT_STATE = 2; - private static final int MSG_VOICE_RESULTS = 3; - private static final int MSG_UPDATE_OLD_SUGGESTIONS = 4; + private static final boolean TRACE = false; + private static boolean DEBUG = LatinImeLogger.sDBG; + + private static final int DELAY_UPDATE_SUGGESTIONS = 180; + private static final int DELAY_UPDATE_OLD_SUGGESTIONS = 300; + private static final int DELAY_UPDATE_SHIFT_STATE = 300; + private static final int EXTENDED_TOUCHABLE_REGION_HEIGHT = 100; // How many continuous deletes at which to start deleting at a higher speed. private static final int DELETE_ACCELERATE_AT = 20; // Key events coming any faster than this are long-presses. private static final int QUICK_PRESS = 200; - static final int KEYCODE_ENTER = '\n'; - static final int KEYCODE_SPACE = ' '; - static final int KEYCODE_PERIOD = '.'; - // Contextual menu positions private static final int POS_METHOD = 0; private static final int POS_SETTINGS = 1; - //private LatinKeyboardView mInputView; - private LinearLayout mCandidateViewContainer; + private int mSuggestionVisibility; + private static final int SUGGESTION_VISIBILILTY_SHOW_VALUE + = R.string.prefs_suggestion_visibility_show_value; + private static final int SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE + = R.string.prefs_suggestion_visibility_show_only_portrait_value; + private static final int SUGGESTION_VISIBILILTY_HIDE_VALUE + = R.string.prefs_suggestion_visibility_hide_value; + + private static final int[] SUGGESTION_VISIBILITY_VALUE_ARRAY = new int[] { + SUGGESTION_VISIBILILTY_SHOW_VALUE, + SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE, + SUGGESTION_VISIBILILTY_HIDE_VALUE + }; + + private View mCandidateViewContainer; private CandidateView mCandidateView; private Suggest mSuggest; - private CompletionInfo[] mCompletions; + private CompletionInfo[] mApplicationSpecifiedCompletions; private AlertDialog mOptionsDialog; - private AlertDialog mVoiceWarningDialog; - /* package */ KeyboardSwitcher mKeyboardSwitcher; + private InputMethodManager mImm; + private Resources mResources; + private SharedPreferences mPrefs; + private String mInputMethodId; + private KeyboardSwitcher mKeyboardSwitcher; + private SubtypeSwitcher mSubtypeSwitcher; + private VoiceIMEConnector mVoiceConnector; private UserDictionary mUserDictionary; private UserBigramDictionary mUserBigramDictionary; private ContactsDictionary mContactsDictionary; private AutoDictionary mAutoDictionary; - private Hints mHints; - - private Resources mResources; - - private String mInputLocale; - private String mSystemLocale; - private LanguageSwitcher mLanguageSwitcher; + // These variables are initialized according to the {@link EditorInfo#inputType}. + private boolean mAutoSpace; + private boolean mInputTypeNoAutoCorrect; + private boolean mIsSettingsSuggestionStripOn; + private boolean mApplicationSpecifiedCompletionOn; - private StringBuilder mComposing = new StringBuilder(); + private final StringBuilder mComposing = new StringBuilder(); private WordComposer mWord = new WordComposer(); - private int mCommittedLength; - private boolean mPredicting; - private boolean mRecognizing; - private boolean mAfterVoiceInput; - private boolean mImmediatelyAfterVoiceInput; - private boolean mShowingVoiceSuggestions; - private boolean mVoiceInputHighlighted; - private boolean mEnableVoiceButton; private CharSequence mBestWord; - private boolean mPredictionOn; - private boolean mCompletionOn; + private boolean mHasValidSuggestions; private boolean mHasDictionary; - private boolean mAutoSpace; private boolean mJustAddedAutoSpace; private boolean mAutoCorrectEnabled; private boolean mReCorrectionEnabled; - // Bigram Suggestion is disabled in this version. - private final boolean mBigramSuggestionEnabled = false; + private boolean mBigramSuggestionEnabled; private boolean mAutoCorrectOn; - // TODO move this state variable outside LatinIME - private boolean mCapsLock; - private boolean mPasswordText; private boolean mVibrateOn; private boolean mSoundOn; private boolean mPopupOn; private boolean mAutoCap; private boolean mQuickFixes; - private boolean mHasUsedVoiceInput; - private boolean mHasUsedVoiceInputUnsupportedLocale; - private boolean mLocaleSupportedForVoiceInput; - private boolean mShowSuggestions; - private boolean mIsShowingHint; - private int mCorrectionMode; - private boolean mEnableVoice = true; - private boolean mVoiceOnPrimary; - private int mOrientation; - private List<CharSequence> mSuggestPuncList; + private boolean mConfigEnableShowSubtypeSettings; + private boolean mConfigSwipeDownDismissKeyboardEnabled; + private int mConfigDelayBeforeFadeoutLanguageOnSpacebar; + private int mConfigDurationOfFadeoutLanguageOnSpacebar; + private float mConfigFinalFadeoutFactorOfLanguageOnSpacebar; + // For example, to deal with status bar on tablet. + private int mKeyboardBottomRowVerticalCorrection; + + 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; - - // Input type is such that we should not auto-correct - private boolean mInputTypeNoAutoCorrect; + private int mLastSelectionStart; + private int mLastSelectionEnd; + private SuggestedWords mSuggestPuncList; // Indicates whether the suggestion strip is to be on in landscape private boolean mJustAccepted; - private CharSequence mJustRevertedSeparator; + private boolean mJustReverted; private int mDeleteCount; private long mLastKeyTime; - // Modifier keys state - private ModifierKeyState mShiftKeyState = new ModifierKeyState(); - private ModifierKeyState mSymbolKeyState = new ModifierKeyState(); - - private Tutorial mTutorial; - private AudioManager mAudioManager; // Align sound effect volume on music volume - private final float FX_VOLUME = -1.0f; + private static final float FX_VOLUME = -1.0f; private boolean mSilentMode; /* package */ String mWordSeparators; private String mSentenceSeparators; private String mSuggestPuncs; - private VoiceInput mVoiceInput; - private VoiceResults mVoiceResults = new VoiceResults(); + // TODO: Move this flag to VoiceIMEConnector private boolean mConfigurationChanging; // Keeps track of most recently inserted text (multi-character key) for reverting private CharSequence mEnteredText; private boolean mRefreshKeyboardRequired; - // For each word, a list of potential replacements, usually from voice. - private Map<String, List<CharSequence>> mWordToSuggestions = - new HashMap<String, List<CharSequence>>(); - - private ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>(); - - private class VoiceResults { - List<String> candidates; - Map<String, List<CharSequence>> alternatives; - } + private final ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>(); public abstract static class WordAlternatives { protected CharSequence mChosenWord; @@ -281,7 +217,7 @@ public class LatinIME extends InputMethodService return mChosenWord; } - public abstract List<CharSequence> getAlternatives(); + public abstract SuggestedWords.Builder getAlternatives(); } public class TypedWordAlternatives extends WordAlternatives { @@ -302,192 +238,224 @@ public class LatinIME extends InputMethodService } @Override - public List<CharSequence> getAlternatives() { + public SuggestedWords.Builder getAlternatives() { return getTypedSuggestions(word); } } - /* package */ Handler mHandler = new Handler() { + public final UIHandler mHandler = new UIHandler(); + + public class UIHandler extends Handler { + private static final int MSG_UPDATE_SUGGESTIONS = 0; + private static final int MSG_UPDATE_OLD_SUGGESTIONS = 1; + private static final int MSG_UPDATE_SHIFT_STATE = 2; + private static final int MSG_VOICE_RESULTS = 3; + private static final int MSG_FADEOUT_LANGUAGE_ON_SPACEBAR = 4; + private static final int MSG_DISMISS_LANGUAGE_ON_SPACEBAR = 5; + @Override public void handleMessage(Message msg) { + final KeyboardSwitcher switcher = mKeyboardSwitcher; + final LatinKeyboardView inputView = switcher.getInputView(); switch (msg.what) { - case MSG_UPDATE_SUGGESTIONS: - updateSuggestions(); - break; - case MSG_UPDATE_OLD_SUGGESTIONS: - setOldSuggestions(); - break; - case MSG_START_TUTORIAL: - if (mTutorial == null) { - if (mKeyboardSwitcher.getInputView().isShown()) { - mTutorial = new Tutorial( - LatinIME.this, mKeyboardSwitcher.getInputView()); - mTutorial.start(); - } else { - // Try again soon if the view is not yet showing - sendMessageDelayed(obtainMessage(MSG_START_TUTORIAL), 100); - } - } - break; - case MSG_UPDATE_SHIFT_STATE: - updateShiftKeyState(getCurrentInputEditorInfo()); - break; - case MSG_VOICE_RESULTS: - handleVoiceResults(); - break; + case MSG_UPDATE_SUGGESTIONS: + updateSuggestions(); + break; + case MSG_UPDATE_OLD_SUGGESTIONS: + setOldSuggestions(); + break; + case MSG_UPDATE_SHIFT_STATE: + switcher.updateShiftState(); + break; + case MSG_VOICE_RESULTS: + mVoiceConnector.handleVoiceResults(preferCapitalization() + || (switcher.isAlphabetMode() && switcher.isShiftedOrShiftLocked())); + break; + case MSG_FADEOUT_LANGUAGE_ON_SPACEBAR: + if (inputView != null) + inputView.setSpacebarTextFadeFactor( + (1.0f + mConfigFinalFadeoutFactorOfLanguageOnSpacebar) / 2, + (LatinKeyboard)msg.obj); + sendMessageDelayed(obtainMessage(MSG_DISMISS_LANGUAGE_ON_SPACEBAR, msg.obj), + mConfigDurationOfFadeoutLanguageOnSpacebar); + break; + case MSG_DISMISS_LANGUAGE_ON_SPACEBAR: + if (inputView != null) + inputView.setSpacebarTextFadeFactor( + mConfigFinalFadeoutFactorOfLanguageOnSpacebar, (LatinKeyboard)msg.obj); + break; } } - }; + + public void postUpdateSuggestions() { + removeMessages(MSG_UPDATE_SUGGESTIONS); + sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTIONS), DELAY_UPDATE_SUGGESTIONS); + } + + public void cancelUpdateSuggestions() { + removeMessages(MSG_UPDATE_SUGGESTIONS); + } + + public boolean hasPendingUpdateSuggestions() { + return hasMessages(MSG_UPDATE_SUGGESTIONS); + } + + public void postUpdateOldSuggestions() { + removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); + sendMessageDelayed(obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS), + DELAY_UPDATE_OLD_SUGGESTIONS); + } + + public void cancelUpdateOldSuggestions() { + removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); + } + + public void postUpdateShiftKeyState() { + removeMessages(MSG_UPDATE_SHIFT_STATE); + sendMessageDelayed(obtainMessage(MSG_UPDATE_SHIFT_STATE), DELAY_UPDATE_SHIFT_STATE); + } + + public void cancelUpdateShiftState() { + removeMessages(MSG_UPDATE_SHIFT_STATE); + } + + public void updateVoiceResults() { + sendMessage(obtainMessage(MSG_VOICE_RESULTS)); + } + + public void startDisplayLanguageOnSpacebar(boolean localeChanged) { + removeMessages(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR); + removeMessages(MSG_DISMISS_LANGUAGE_ON_SPACEBAR); + final LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView != null) { + final LatinKeyboard keyboard = inputView.getLatinKeyboard(); + // The language is never displayed when the delay is zero. + if (mConfigDelayBeforeFadeoutLanguageOnSpacebar != 0) + inputView.setSpacebarTextFadeFactor(localeChanged ? 1.0f + : mConfigFinalFadeoutFactorOfLanguageOnSpacebar, keyboard); + // The language is always displayed when the delay is negative. + if (localeChanged && mConfigDelayBeforeFadeoutLanguageOnSpacebar > 0) { + sendMessageDelayed(obtainMessage(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR, keyboard), + mConfigDelayBeforeFadeoutLanguageOnSpacebar); + } + } + } + } @Override public void onCreate() { - LatinImeLogger.init(this); - KeyboardSwitcher.init(this); - super.onCreate(); - //setStatusIcon(R.drawable.ime_qwerty); - mResources = getResources(); - final Configuration conf = mResources.getConfiguration(); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - mLanguageSwitcher = new LanguageSwitcher(this); - mLanguageSwitcher.loadLocales(prefs); + mPrefs = prefs; + LatinImeLogger.init(this, prefs); + SubtypeSwitcher.init(this, prefs); + KeyboardSwitcher.init(this, prefs); + + super.onCreate(); + + mImm = ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)); + mInputMethodId = Utils.getInputMethodId(mImm, getApplicationInfo().packageName); + mSubtypeSwitcher = SubtypeSwitcher.getInstance(); mKeyboardSwitcher = KeyboardSwitcher.getInstance(); - mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher); - mSystemLocale = conf.locale.toString(); - mLanguageSwitcher.setSystemLocale(conf.locale); - String inputLanguage = mLanguageSwitcher.getInputLanguage(); - if (inputLanguage == null) { - inputLanguage = conf.locale.toString(); - } - mReCorrectionEnabled = prefs.getBoolean(PREF_RECORRECTION_ENABLED, - getResources().getBoolean(R.bool.default_recorrection_enabled)); - LatinIMEUtil.GCUtils.getInstance().reset(); + final Resources res = getResources(); + mResources = res; + + // If the option should not be shown, do not read the recorrection preference + // but always use the default setting defined in the resources. + if (res.getBoolean(R.bool.config_enable_show_recorrection_option)) { + mReCorrectionEnabled = prefs.getBoolean(Settings.PREF_RECORRECTION_ENABLED, + res.getBoolean(R.bool.default_recorrection_enabled)); + } else { + mReCorrectionEnabled = res.getBoolean(R.bool.default_recorrection_enabled); + } + + mConfigEnableShowSubtypeSettings = res.getBoolean( + R.bool.config_enable_show_subtype_settings); + mConfigSwipeDownDismissKeyboardEnabled = res.getBoolean( + R.bool.config_swipe_down_dismiss_keyboard_enabled); + mConfigDelayBeforeFadeoutLanguageOnSpacebar = res.getInteger( + R.integer.config_delay_before_fadeout_language_on_spacebar); + mConfigDurationOfFadeoutLanguageOnSpacebar = res.getInteger( + R.integer.config_duration_of_fadeout_language_on_spacebar); + mConfigFinalFadeoutFactorOfLanguageOnSpacebar = res.getInteger( + R.integer.config_final_fadeout_percentage_of_language_on_spacebar) / 100.0f; + mKeyboardBottomRowVerticalCorrection = (int)res.getDimension( + R.dimen.keyboard_bottom_row_vertical_correction); + + Utils.GCUtils.getInstance().reset(); boolean tryGC = true; - for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { + for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { try { - initSuggest(inputLanguage); + initSuggest(); tryGC = false; } catch (OutOfMemoryError e) { - tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait(inputLanguage, e); + tryGC = Utils.GCUtils.getInstance().tryGCOrWait("InitSuggest", e); } } - mOrientation = conf.orientation; + mOrientation = res.getConfiguration().orientation; initSuggestPuncList(); // register to receive ringer mode changes for silent mode IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); registerReceiver(mReceiver, filter); - if (VOICE_INSTALLED) { - mVoiceInput = new VoiceInput(this, this); - mHints = new Hints(this, new Hints.Display() { - public void showHint(int viewResource) { - LayoutInflater inflater = (LayoutInflater) getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - View view = inflater.inflate(viewResource, null); - setCandidatesView(view); - setCandidatesViewShown(true); - mIsShowingHint = true; - } - }); - } + mVoiceConnector = VoiceIMEConnector.init(this, prefs, mHandler); prefs.registerOnSharedPreferenceChangeListener(this); } /** - * Loads a dictionary or multiple separated dictionary - * @return returns array of dictionary resource ids + * Returns a main dictionary resource id + * @return main dictionary resource id */ - /* package */ static int[] getDictionary(Resources res) { + public static int getMainDictionaryResourceId(Resources res) { + final String MAIN_DIC_NAME = "main"; String packageName = LatinIME.class.getPackage().getName(); - XmlResourceParser xrp = res.getXml(R.xml.dictionary); - ArrayList<Integer> dictionaries = new ArrayList<Integer>(); - - try { - int current = xrp.getEventType(); - while (current != XmlResourceParser.END_DOCUMENT) { - if (current == XmlResourceParser.START_TAG) { - String tag = xrp.getName(); - if (tag != null) { - if (tag.equals("part")) { - String dictFileName = xrp.getAttributeValue(null, "name"); - dictionaries.add(res.getIdentifier(dictFileName, "raw", packageName)); - } - } - } - xrp.next(); - current = xrp.getEventType(); - } - } catch (XmlPullParserException e) { - Log.e(TAG, "Dictionary XML parsing failure"); - } catch (IOException e) { - Log.e(TAG, "Dictionary XML IOException"); - } - - int count = dictionaries.size(); - int[] dict = new int[count]; - for (int i = 0; i < count; i++) { - dict[i] = dictionaries.get(i); - } - - return dict; + return res.getIdentifier(MAIN_DIC_NAME, "raw", packageName); } - private void initSuggest(String locale) { - mInputLocale = locale; + private void initSuggest() { + updateAutoTextEnabled(); + String locale = mSubtypeSwitcher.getInputLocaleStr(); - Resources orig = getResources(); - Configuration conf = orig.getConfiguration(); - Locale saveLocale = conf.locale; - conf.locale = new Locale(locale); - orig.updateConfiguration(conf, orig.getDisplayMetrics()); + Locale savedLocale = mSubtypeSwitcher.changeSystemLocale(new Locale(locale)); if (mSuggest != null) { mSuggest.close(); } - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true); + final SharedPreferences prefs = mPrefs; + mQuickFixes = isQuickFixesEnabled(prefs); - int[] dictionaries = getDictionary(orig); - mSuggest = new Suggest(this, dictionaries); - updateAutoTextEnabled(saveLocale); - if (mUserDictionary != null) mUserDictionary.close(); - mUserDictionary = new UserDictionary(this, mInputLocale); - if (mContactsDictionary == null) { - mContactsDictionary = new ContactsDictionary(this, Suggest.DIC_CONTACTS); - } - if (mAutoDictionary != null) { - mAutoDictionary.close(); - } - mAutoDictionary = new AutoDictionary(this, this, mInputLocale, Suggest.DIC_AUTO); - if (mUserBigramDictionary != null) { - mUserBigramDictionary.close(); - } - mUserBigramDictionary = new UserBigramDictionary(this, this, mInputLocale, - Suggest.DIC_USER); - mSuggest.setUserBigramDictionary(mUserBigramDictionary); + final Resources res = mResources; + int mainDicResId = getMainDictionaryResourceId(res); + mSuggest = new Suggest(this, mainDicResId); + loadAndSetAutoCorrectionThreshold(prefs); + + mUserDictionary = new UserDictionary(this, locale); mSuggest.setUserDictionary(mUserDictionary); + + mContactsDictionary = new ContactsDictionary(this, Suggest.DIC_CONTACTS); mSuggest.setContactsDictionary(mContactsDictionary); + + mAutoDictionary = new AutoDictionary(this, this, locale, Suggest.DIC_AUTO); mSuggest.setAutoDictionary(mAutoDictionary); + + mUserBigramDictionary = new UserBigramDictionary(this, this, locale, Suggest.DIC_USER); + mSuggest.setUserBigramDictionary(mUserBigramDictionary); + updateCorrectionMode(); - mWordSeparators = mResources.getString(R.string.word_separators); - mSentenceSeparators = mResources.getString(R.string.sentence_separators); + mWordSeparators = res.getString(R.string.word_separators); + mSentenceSeparators = res.getString(R.string.sentence_separators); - conf.locale = saveLocale; - orig.updateConfiguration(conf, orig.getDisplayMetrics()); + mSubtypeSwitcher.changeSystemLocale(savedLocale); } @Override public void onDestroy() { - if (mUserDictionary != null) { - mUserDictionary.close(); - } - if (mContactsDictionary != null) { - mContactsDictionary.close(); + if (mSuggest != null) { + mSuggest.close(); + mSuggest = null; } unregisterReceiver(mReceiver); - if (VOICE_INSTALLED && mVoiceInput != null) { - mVoiceInput.destroy(); - } + mVoiceConnector.destroy(); LatinImeLogger.commit(); LatinImeLogger.onDestroy(); super.onDestroy(); @@ -495,203 +463,213 @@ public class LatinIME extends InputMethodService @Override public void onConfigurationChanged(Configuration conf) { - // If the system locale changes and is different from the saved - // locale (mSystemLocale), then reload the input locale list from the - // latin ime settings (shared prefs) and reset the input locale - // to the first one. - final String systemLocale = conf.locale.toString(); - if (!TextUtils.equals(systemLocale, mSystemLocale)) { - mSystemLocale = systemLocale; - if (mLanguageSwitcher != null) { - mLanguageSwitcher.loadLocales( - PreferenceManager.getDefaultSharedPreferences(this)); - mLanguageSwitcher.setSystemLocale(conf.locale); - toggleLanguage(true, true); - } else { - reloadKeyboards(); - } - } + mSubtypeSwitcher.onConfigurationChanged(conf); // If orientation changed while predicting, commit the change if (conf.orientation != mOrientation) { InputConnection ic = getCurrentInputConnection(); commitTyped(ic); if (ic != null) ic.finishComposingText(); // For voice input mOrientation = conf.orientation; - reloadKeyboards(); + if (isShowingOptionDialog()) + mOptionsDialog.dismiss(); } + mConfigurationChanging = true; super.onConfigurationChanged(conf); - if (mRecognizing) { - switchToRecognitionStatusView(); - } + mVoiceConnector.onConfigurationChanged(conf); mConfigurationChanging = false; } @Override public View onCreateInputView() { - mKeyboardSwitcher.recreateInputView(); - mKeyboardSwitcher.makeKeyboards(true); - mKeyboardSwitcher.setKeyboardMode( - KeyboardSwitcher.MODE_TEXT, 0, - shouldShowVoiceButton(makeFieldContext(), getCurrentInputEditorInfo())); - return mKeyboardSwitcher.getInputView(); + return mKeyboardSwitcher.onCreateInputView(); } @Override public View onCreateCandidatesView() { - mKeyboardSwitcher.makeKeyboards(true); - mCandidateViewContainer = (LinearLayout) getLayoutInflater().inflate( - R.layout.candidates, null); - mCandidateView = (CandidateView) mCandidateViewContainer.findViewById(R.id.candidates); + LayoutInflater inflater = getLayoutInflater(); + LinearLayout container = (LinearLayout)inflater.inflate(R.layout.candidates, null); + mCandidateViewContainer = container; + if (container.getPaddingRight() != 0) { + HorizontalScrollView scrollView = + (HorizontalScrollView) container.findViewById(R.id.candidates_scroll_view); + scrollView.setOverScrollMode(View.OVER_SCROLL_NEVER); + container.setGravity(Gravity.CENTER_HORIZONTAL); + } + mCandidateView = (CandidateView) container.findViewById(R.id.candidates); mCandidateView.setService(this); setCandidatesViewShown(true); - return mCandidateViewContainer; + return container; + } + + private static boolean isPasswordVariation(int variation) { + return variation == InputType.TYPE_TEXT_VARIATION_PASSWORD + || variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + || variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD; + } + + private static boolean isEmailVariation(int variation) { + return variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS + || variation == InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS; } @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { - LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + final KeyboardSwitcher switcher = mKeyboardSwitcher; + LatinKeyboardView inputView = switcher.getInputView(); + + if(DEBUG) { + Log.d(TAG, "onStartInputView: " + inputView); + } // In landscape mode, this method gets called without the input view being created. if (inputView == null) { return; } + mSubtypeSwitcher.updateParametersOnStartInputView(); + if (mRefreshKeyboardRequired) { mRefreshKeyboardRequired = false; - toggleLanguage(true, true); + onRefreshKeyboard(); } - mKeyboardSwitcher.makeKeyboards(false); - TextEntryState.newSession(this); - // Most such things we decide below in the switch statement, but we need to know - // now whether this is a password text field, because we need to know now (before - // the switch statement) whether we want to enable the voice button. - mPasswordText = false; - int variation = attribute.inputType & EditorInfo.TYPE_MASK_VARIATION; - if (variation == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD || - variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) { - mPasswordText = true; - } + // Most such things we decide below in initializeInputAttributesAndGetMode, but we need to + // know now whether this is a password text field, because we need to know now whether we + // want to enable the voice button. + mVoiceConnector.resetVoiceStates(isPasswordVariation( + attribute.inputType & InputType.TYPE_MASK_VARIATION)); - mEnableVoiceButton = shouldShowVoiceButton(makeFieldContext(), attribute); - final boolean enableVoiceButton = mEnableVoiceButton && mEnableVoice; + final int mode = initializeInputAttributesAndGetMode(attribute.inputType); - mAfterVoiceInput = false; - mImmediatelyAfterVoiceInput = false; - mShowingVoiceSuggestions = false; - mVoiceInputHighlighted = false; - mInputTypeNoAutoCorrect = false; - mPredictionOn = false; - mCompletionOn = false; - mCompletions = null; - mCapsLock = false; + inputView.closing(); mEnteredText = null; + mComposing.setLength(0); + mHasValidSuggestions = false; + mDeleteCount = 0; + mJustAddedAutoSpace = false; + + loadSettings(attribute); + if (mSubtypeSwitcher.isKeyboardMode()) { + switcher.loadKeyboard(mode, attribute.imeOptions, + mVoiceConnector.isVoiceButtonEnabled(), + mVoiceConnector.isVoiceButtonOnPrimary()); + switcher.updateShiftState(); + } - switch (attribute.inputType & EditorInfo.TYPE_MASK_CLASS) { - case EditorInfo.TYPE_CLASS_NUMBER: - case EditorInfo.TYPE_CLASS_DATETIME: - // fall through - // NOTE: For now, we use the phone keyboard for NUMBER and DATETIME until we get - // a dedicated number entry keypad. - // TODO: Use a dedicated number entry keypad here when we get one. - case EditorInfo.TYPE_CLASS_PHONE: - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_PHONE, - attribute.imeOptions, enableVoiceButton); + setCandidatesViewShownInternal(isCandidateStripVisible(), + false /* needsInputViewShown */ ); + // Delay updating suggestions because keyboard input view may not be shown at this point. + mHandler.postUpdateSuggestions(); + + updateCorrectionMode(); + + inputView.setPreviewEnabled(mPopupOn); + inputView.setProximityCorrectionEnabled(true); + // If we just entered a text field, maybe it has some old text that requires correction + checkReCorrectionOnStart(); + inputView.setForeground(true); + + mVoiceConnector.onStartInputView(inputView.getWindowToken()); + + if (mKeyboardBottomRowVerticalCorrection > 0) { + final Window window = getWindow().getWindow(); + if (!(window.getCallback() instanceof ClipTouchEventWindowCallback)) { + window.setCallback(new ClipTouchEventWindowCallback( + window, mKeyboardBottomRowVerticalCorrection)); + } + } + + if (TRACE) Debug.startMethodTracing("/data/trace/latinime"); + } + + private int initializeInputAttributesAndGetMode(int inputType) { + final int variation = inputType & InputType.TYPE_MASK_VARIATION; + mAutoSpace = false; + mInputTypeNoAutoCorrect = false; + mIsSettingsSuggestionStripOn = false; + mApplicationSpecifiedCompletionOn = false; + mApplicationSpecifiedCompletions = null; + + final int mode; + switch (inputType & InputType.TYPE_MASK_CLASS) { + case InputType.TYPE_CLASS_NUMBER: + case InputType.TYPE_CLASS_DATETIME: + mode = KeyboardId.MODE_NUMBER; + break; + case InputType.TYPE_CLASS_PHONE: + mode = KeyboardId.MODE_PHONE; break; - case EditorInfo.TYPE_CLASS_TEXT: - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, - attribute.imeOptions, enableVoiceButton); - //startPrediction(); - mPredictionOn = true; + case InputType.TYPE_CLASS_TEXT: + mIsSettingsSuggestionStripOn = true; // Make sure that passwords are not displayed in candidate view - if (variation == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD || - variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ) { - mPredictionOn = false; + if (isPasswordVariation(variation)) { + mIsSettingsSuggestionStripOn = false; } - if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS - || variation == EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME) { + if (isEmailVariation(variation) + || variation == InputType.TYPE_TEXT_VARIATION_PERSON_NAME) { mAutoSpace = false; } else { mAutoSpace = true; } - if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS) { - mPredictionOn = false; - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_EMAIL, - attribute.imeOptions, enableVoiceButton); - } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_URI) { - mPredictionOn = false; - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_URL, - attribute.imeOptions, enableVoiceButton); - } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_SHORT_MESSAGE) { - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_IM, - attribute.imeOptions, enableVoiceButton); - } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_FILTER) { - mPredictionOn = false; - } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) { - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_WEB, - attribute.imeOptions, enableVoiceButton); + if (isEmailVariation(variation)) { + mIsSettingsSuggestionStripOn = false; + mode = KeyboardId.MODE_EMAIL; + } else if (variation == InputType.TYPE_TEXT_VARIATION_URI) { + mIsSettingsSuggestionStripOn = false; + mode = KeyboardId.MODE_URL; + } else if (variation == InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE) { + mode = KeyboardId.MODE_IM; + } else if (variation == InputType.TYPE_TEXT_VARIATION_FILTER) { + mIsSettingsSuggestionStripOn = false; + mode = KeyboardId.MODE_TEXT; + } else if (variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) { + mode = KeyboardId.MODE_WEB; // If it's a browser edit field and auto correct is not ON explicitly, then // disable auto correction, but keep suggestions on. - if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) { + if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) { mInputTypeNoAutoCorrect = true; } + } else { + mode = KeyboardId.MODE_TEXT; } // If NO_SUGGESTIONS is set, don't do prediction. - if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0) { - mPredictionOn = false; + if ((inputType & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0) { + mIsSettingsSuggestionStripOn = false; mInputTypeNoAutoCorrect = true; } // If it's not multiline and the autoCorrect flag is not set, then don't correct - if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0 && - (attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) == 0) { + if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0 && + (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE) == 0) { mInputTypeNoAutoCorrect = true; } - if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) { - mPredictionOn = false; - mCompletionOn = isFullscreenMode(); + if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) { + mIsSettingsSuggestionStripOn = false; + mApplicationSpecifiedCompletionOn = isFullscreenMode(); } break; default: - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, - attribute.imeOptions, enableVoiceButton); + mode = KeyboardId.MODE_TEXT; + break; } - inputView.closing(); - mComposing.setLength(0); - mPredicting = false; - mDeleteCount = 0; - mJustAddedAutoSpace = false; - loadSettings(); - updateShiftKeyState(attribute); - - setCandidatesViewShownInternal(isCandidateStripVisible() || mCompletionOn, - false /* needsInputViewShown */ ); - updateSuggestions(); - - // If the dictionary is not big enough, don't auto correct - mHasDictionary = mSuggest.hasMainDictionary(); - - updateCorrectionMode(); - - inputView.setPreviewEnabled(mPopupOn); - inputView.setProximityCorrectionEnabled(true); - mPredictionOn = mPredictionOn && (mCorrectionMode > 0 || mShowSuggestions); - // If we just entered a text field, maybe it has some old text that requires correction - checkReCorrectionOnStart(); - checkTutorial(attribute.privateImeOptions); - if (TRACE) Debug.startMethodTracing("/data/trace/latinime"); + return mode; } private void checkReCorrectionOnStart() { - if (mReCorrectionEnabled && isPredictionOn()) { + if (!mReCorrectionEnabled) return; + + final InputConnection ic = getCurrentInputConnection(); + if (ic == null) return; + // There could be a pending composing span. Clean it up first. + ic.finishComposingText(); + + if (isShowingSuggestionsStrip() && isSuggestionsRequested()) { // First get the cursor position. This is required by setOldSuggestions(), so that // it can pass the correct range to setComposingRegion(). At this point, we don't - // have valid values for mLastSelectionStart/Stop because onUpdateSelection() has + // have valid values for mLastSelectionStart/End because onUpdateSelection() has // not been called yet. - InputConnection ic = getCurrentInputConnection(); - if (ic == null) return; ExtractedTextRequest etr = new ExtractedTextRequest(); etr.token = 0; // anything is fine here ExtractedText et = ic.getExtractedText(etr, 0); @@ -702,7 +680,7 @@ public class LatinIME extends InputMethodService // Then look for possible corrections in a delayed fashion if (!TextUtils.isEmpty(et.text) && isCursorTouchingWord()) { - postUpdateOldSuggestions(); + mHandler.postUpdateOldSuggestions(); } } } @@ -712,19 +690,12 @@ public class LatinIME extends InputMethodService super.onFinishInput(); LatinImeLogger.commit(); - onAutoCompletionStateChanged(false); + mKeyboardSwitcher.onAutoCorrectionStateChanged(false); - if (VOICE_INSTALLED && !mConfigurationChanging) { - if (mAfterVoiceInput) { - mVoiceInput.flushAllTextModificationCounters(); - mVoiceInput.logInputEnded(); - } - mVoiceInput.flushLogs(); - mVoiceInput.cancel(); - } - if (mKeyboardSwitcher.getInputView() != null) { - mKeyboardSwitcher.getInputView().closing(); - } + mVoiceConnector.flushVoiceInputLogs(mConfigurationChanging); + + KeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView != null) inputView.closing(); if (mAutoDictionary != null) mAutoDictionary.flushPendingWrites(); if (mUserBigramDictionary != null) mUserBigramDictionary.flushPendingWrites(); } @@ -732,21 +703,17 @@ public class LatinIME extends InputMethodService @Override public void onFinishInputView(boolean finishingInput) { super.onFinishInputView(finishingInput); - // Remove penging messages related to update suggestions - mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS); - mHandler.removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); + KeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView != null) inputView.setForeground(false); + // Remove pending messages related to update suggestions + mHandler.cancelUpdateSuggestions(); + mHandler.cancelUpdateOldSuggestions(); } @Override public void onUpdateExtractedText(int token, ExtractedText text) { super.onUpdateExtractedText(token, text); - InputConnection ic = getCurrentInputConnection(); - if (!mImmediatelyAfterVoiceInput && mAfterVoiceInput && ic != null) { - if (mHints.showPunctuationHintIfNecessary(ic)) { - mVoiceInput.logPunctuationHintDisplayed(); - } - } - mImmediatelyAfterVoiceInput = false; + mVoiceConnector.showPunctuationHintIfNecessary(); } @Override @@ -765,64 +732,58 @@ public class LatinIME extends InputMethodService + ", ce=" + candidatesEnd); } - if (mAfterVoiceInput) { - mVoiceInput.setCursorPos(newSelEnd); - mVoiceInput.setSelectionSpan(newSelEnd - newSelStart); - } + mVoiceConnector.setCursorAndSelection(newSelEnd, newSelStart); // If the current selection in the text view changes, we should // clear whatever candidate text we have. - if ((((mComposing.length() > 0 && mPredicting) || mVoiceInputHighlighted) - && (newSelStart != candidatesEnd - || newSelEnd != candidatesEnd) - && mLastSelectionStart != newSelStart)) { + if ((((mComposing.length() > 0 && mHasValidSuggestions) + || mVoiceConnector.isVoiceInputHighlighted()) && (newSelStart != candidatesEnd + || newSelEnd != candidatesEnd) && mLastSelectionStart != newSelStart)) { mComposing.setLength(0); - mPredicting = false; - postUpdateSuggestions(); + mHasValidSuggestions = false; + mHandler.postUpdateSuggestions(); TextEntryState.reset(); InputConnection ic = getCurrentInputConnection(); if (ic != null) { ic.finishComposingText(); } - mVoiceInputHighlighted = false; - } else if (!mPredicting && !mJustAccepted) { + mVoiceConnector.setVoiceInputHighlighted(false); + } else if (!mHasValidSuggestions && !mJustAccepted) { switch (TextEntryState.getState()) { - case ACCEPTED_DEFAULT: - TextEntryState.reset(); - // fall through - case SPACE_AFTER_PICKED: - mJustAddedAutoSpace = false; // The user moved the cursor. - break; + case ACCEPTED_DEFAULT: + TextEntryState.reset(); + // $FALL-THROUGH$ + case SPACE_AFTER_PICKED: + mJustAddedAutoSpace = false; // The user moved the cursor. + break; + default: + break; } } mJustAccepted = false; - postUpdateShiftKeyState(); + mHandler.postUpdateShiftKeyState(); // Make a note of the cursor position mLastSelectionStart = newSelStart; mLastSelectionEnd = newSelEnd; - if (mReCorrectionEnabled) { + if (mReCorrectionEnabled && isShowingSuggestionsStrip()) { // Don't look for corrections if the keyboard is not visible - if (mKeyboardSwitcher != null && mKeyboardSwitcher.getInputView() != null - && mKeyboardSwitcher.getInputView().isShown()) { + if (mKeyboardSwitcher.isInputViewShown()) { // Check if we should go in or out of correction mode. - if (isPredictionOn() - && mJustRevertedSeparator == null + if (isSuggestionsRequested() && !mJustReverted && (candidatesStart == candidatesEnd || newSelStart != oldSelStart || TextEntryState.isCorrecting()) - && (newSelStart < newSelEnd - 1 || (!mPredicting)) - && !mVoiceInputHighlighted) { + && (newSelStart < newSelEnd - 1 || !mHasValidSuggestions)) { if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) { - postUpdateOldSuggestions(); + mHandler.postUpdateOldSuggestions(); } else { abortCorrection(false); // Show the punctuation suggestions list if the current one is not // and if not showing "Touch again to save". - if (mCandidateView != null - && !mSuggestPuncList.equals(mCandidateView.getSuggestions()) - && !mCandidateView.isShowingAddToDictionaryHint()) { - setNextSuggestions(); + if (mCandidateView != null && !isShowingPunctuationList() + && !mCandidateView.isShowingAddToDictionaryHint()) { + setPunctuationSuggestions(); } } } @@ -840,7 +801,7 @@ public class LatinIME extends InputMethodService */ @Override public void onExtractedTextClicked() { - if (mReCorrectionEnabled && isPredictionOn()) return; + if (mReCorrectionEnabled && isSuggestionsRequested()) return; super.onExtractedTextClicked(); } @@ -856,7 +817,7 @@ public class LatinIME extends InputMethodService */ @Override public void onExtractedCursorMovement(int dx, int dy) { - if (mReCorrectionEnabled && isPredictionOn()) return; + if (mReCorrectionEnabled && isSuggestionsRequested()) return; super.onExtractedCursorMovement(dx, dy); } @@ -864,52 +825,42 @@ public class LatinIME extends InputMethodService @Override public void hideWindow() { LatinImeLogger.commit(); - onAutoCompletionStateChanged(false); + mKeyboardSwitcher.onAutoCorrectionStateChanged(false); if (TRACE) Debug.stopMethodTracing(); if (mOptionsDialog != null && mOptionsDialog.isShowing()) { mOptionsDialog.dismiss(); mOptionsDialog = null; } - if (!mConfigurationChanging) { - if (mAfterVoiceInput) mVoiceInput.logInputEnded(); - if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) { - mVoiceInput.logKeyboardWarningDialogDismissed(); - mVoiceWarningDialog.dismiss(); - mVoiceWarningDialog = null; - } - if (VOICE_INSTALLED & mRecognizing) { - mVoiceInput.cancel(); - } - } - mWordToSuggestions.clear(); + mVoiceConnector.hideVoiceWindow(mConfigurationChanging); mWordHistory.clear(); super.hideWindow(); TextEntryState.endSession(); } @Override - public void onDisplayCompletions(CompletionInfo[] completions) { + public void onDisplayCompletions(CompletionInfo[] applicationSpecifiedCompletions) { if (DEBUG) { - Log.i("foo", "Received completions:"); - for (int i=0; i<(completions != null ? completions.length : 0); i++) { - Log.i("foo", " #" + i + ": " + completions[i]); + Log.i(TAG, "Received completions:"); + final int count = (applicationSpecifiedCompletions != null) + ? applicationSpecifiedCompletions.length : 0; + for (int i = 0; i < count; i++) { + Log.i(TAG, " #" + i + ": " + applicationSpecifiedCompletions[i]); } } - if (mCompletionOn) { - mCompletions = completions; - if (completions == null) { + if (mApplicationSpecifiedCompletionOn) { + mApplicationSpecifiedCompletions = applicationSpecifiedCompletions; + if (applicationSpecifiedCompletions == null) { clearSuggestions(); return; } - List<CharSequence> stringList = new ArrayList<CharSequence>(); - for (int i=0; i<(completions != null ? completions.length : 0); i++) { - CompletionInfo ci = completions[i]; - if (ci != null) stringList.add(ci.getText()); - } + SuggestedWords.Builder builder = new SuggestedWords.Builder() + .setApplicationSpecifiedCompletions(applicationSpecifiedCompletions) + .setTypedWordValid(true) + .setHasMinimalSuggestion(true); // When in fullscreen mode, show completions generated by the application - setSuggestions(stringList, true, true, true); + setSuggestions(builder.build()); mBestWord = null; setCandidatesViewShown(true); } @@ -918,8 +869,8 @@ public class LatinIME extends InputMethodService private void setCandidatesViewShownInternal(boolean shown, boolean needsInputViewShown) { // TODO: Remove this if we support candidates with hard keyboard if (onEvaluateInputViewShown()) { - super.setCandidatesViewShown(shown && mKeyboardSwitcher.getInputView() != null - && (needsInputViewShown ? mKeyboardSwitcher.getInputView().isShown() : true)); + super.setCandidatesViewShown(shown + && (needsInputViewShown ? mKeyboardSwitcher.isInputViewShown() : true)); } } @@ -934,14 +885,41 @@ public class LatinIME extends InputMethodService if (!isFullscreenMode()) { outInsets.contentTopInsets = outInsets.visibleTopInsets; } + KeyboardView inputView = mKeyboardSwitcher.getInputView(); + // Need to set touchable region only if input view is being shown + if (inputView != null && mKeyboardSwitcher.isInputViewShown()) { + final int x = 0; + int y = 0; + final int width = inputView.getWidth(); + int height = inputView.getHeight() + EXTENDED_TOUCHABLE_REGION_HEIGHT; + if (mCandidateViewContainer != null) { + ViewParent candidateParent = mCandidateViewContainer.getParent(); + if (candidateParent instanceof FrameLayout) { + final FrameLayout fl = (FrameLayout) candidateParent; + // Check frame layout's visibility + if (fl.getVisibility() == View.INVISIBLE) { + y = fl.getHeight(); + height += y; + } else if (fl.getVisibility() == View.VISIBLE) { + height += fl.getHeight(); + } + } + } + if (DEBUG) { + Log.d(TAG, "Touchable region " + x + ", " + y + ", " + width + ", " + height); + } + outInsets.touchableInsets = InputMethodService.Insets.TOUCHABLE_INSETS_REGION; + outInsets.touchableRegion.set(x, y, width, height); + } } @Override public boolean onEvaluateFullscreenMode() { - DisplayMetrics dm = getResources().getDisplayMetrics(); + final Resources res = mResources; + DisplayMetrics dm = res.getDisplayMetrics(); float displayHeight = dm.heightPixels; // If the display is more than X inches high, don't go to fullscreen mode - float dimen = getResources().getDimension(R.dimen.max_height_for_fullscreen); + float dimen = res.getDimension(R.dimen.max_height_for_fullscreen); if (displayHeight > dimen) { return false; } else { @@ -952,25 +930,13 @@ public class LatinIME extends InputMethodService @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { - case KeyEvent.KEYCODE_BACK: - if (event.getRepeatCount() == 0 && mKeyboardSwitcher.getInputView() != null) { - if (mKeyboardSwitcher.getInputView().handleBack()) { - return true; - } else if (mTutorial != null) { - mTutorial.close(); - mTutorial = null; - } - } - break; - case KeyEvent.KEYCODE_DPAD_DOWN: - case KeyEvent.KEYCODE_DPAD_UP: - case KeyEvent.KEYCODE_DPAD_LEFT: - case KeyEvent.KEYCODE_DPAD_RIGHT: - // If tutorial is visible, don't allow dpad to work - if (mTutorial != null) { + case KeyEvent.KEYCODE_BACK: + if (event.getRepeatCount() == 0 && mKeyboardSwitcher.getInputView() != null) { + if (mKeyboardSwitcher.getInputView().handleBack()) { return true; } - break; + } + break; } return super.onKeyDown(keyCode, event); } @@ -978,57 +944,30 @@ public class LatinIME extends InputMethodService @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { - case KeyEvent.KEYCODE_DPAD_DOWN: - case KeyEvent.KEYCODE_DPAD_UP: - case KeyEvent.KEYCODE_DPAD_LEFT: - case KeyEvent.KEYCODE_DPAD_RIGHT: - // If tutorial is visible, don't allow dpad to work - if (mTutorial != null) { - return true; - } - LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); - // Enable shift key and DPAD to do selections - if (inputView != null && inputView.isShown() - && inputView.isShifted()) { - event = new KeyEvent(event.getDownTime(), event.getEventTime(), - event.getAction(), event.getKeyCode(), event.getRepeatCount(), - event.getDeviceId(), event.getScanCode(), - KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON); - InputConnection ic = getCurrentInputConnection(); - if (ic != null) ic.sendKeyEvent(event); - return true; - } - break; + case KeyEvent.KEYCODE_DPAD_DOWN: + case KeyEvent.KEYCODE_DPAD_UP: + case KeyEvent.KEYCODE_DPAD_LEFT: + case KeyEvent.KEYCODE_DPAD_RIGHT: + // Enable shift key and DPAD to do selections + if (mKeyboardSwitcher.isInputViewShown() + && mKeyboardSwitcher.isShiftedOrShiftLocked()) { + KeyEvent newEvent = new KeyEvent(event.getDownTime(), event.getEventTime(), + event.getAction(), event.getKeyCode(), event.getRepeatCount(), + event.getDeviceId(), event.getScanCode(), + KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON); + InputConnection ic = getCurrentInputConnection(); + if (ic != null) + ic.sendKeyEvent(newEvent); + return true; + } + break; } return super.onKeyUp(keyCode, event); } - private void revertVoiceInput() { - InputConnection ic = getCurrentInputConnection(); - if (ic != null) ic.commitText("", 1); - updateSuggestions(); - mVoiceInputHighlighted = false; - } - - private void commitVoiceInput() { - InputConnection ic = getCurrentInputConnection(); - if (ic != null) ic.finishComposingText(); - updateSuggestions(); - mVoiceInputHighlighted = false; - } - - private void reloadKeyboards() { - mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher); - if (mKeyboardSwitcher.getInputView() != null - && mKeyboardSwitcher.getKeyboardMode() != KeyboardSwitcher.MODE_NONE) { - mKeyboardSwitcher.setVoiceMode(mEnableVoice && mEnableVoiceButton, mVoiceOnPrimary); - } - mKeyboardSwitcher.makeKeyboards(true); - } - - private void commitTyped(InputConnection inputConnection) { - if (mPredicting) { - mPredicting = false; + public void commitTyped(InputConnection inputConnection) { + if (mHasValidSuggestions) { + mHasValidSuggestions = false; if (mComposing.length() > 0) { if (inputConnection != null) { inputConnection.commitText(mComposing, 1); @@ -1041,27 +980,13 @@ public class LatinIME extends InputMethodService } } - private void postUpdateShiftKeyState() { - mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE); - // TODO: Should remove this 300ms delay? - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SHIFT_STATE), 300); - } - - public void updateShiftKeyState(EditorInfo attr) { + public boolean getCurrentAutoCapsState() { InputConnection ic = getCurrentInputConnection(); - if (ic != null && attr != null && mKeyboardSwitcher.isAlphabetMode()) { - mKeyboardSwitcher.setShifted(mShiftKeyState.isMomentary() || mCapsLock - || getCursorCapsMode(ic, attr) != 0); - } - } - - private int getCursorCapsMode(InputConnection ic, EditorInfo attr) { - int caps = 0; EditorInfo ei = getCurrentInputEditorInfo(); - if (mAutoCap && ei != null && ei.inputType != EditorInfo.TYPE_NULL) { - caps = ic.getCursorCapsMode(attr.inputType); + if (mAutoCap && ic != null && ei != null && ei.inputType != InputType.TYPE_NULL) { + return ic.getCursorCapsMode(ei.inputType) != 0; } - return caps; + return false; } private void swapPunctuationAndSpace() { @@ -1069,12 +994,13 @@ public class LatinIME extends InputMethodService if (ic == null) return; CharSequence lastTwo = ic.getTextBeforeCursor(2, 0); if (lastTwo != null && lastTwo.length() == 2 - && lastTwo.charAt(0) == KEYCODE_SPACE && isSentenceSeparator(lastTwo.charAt(1))) { + && lastTwo.charAt(0) == Keyboard.CODE_SPACE + && isSentenceSeparator(lastTwo.charAt(1))) { ic.beginBatchEdit(); ic.deleteSurroundingText(2, 0); ic.commitText(lastTwo.charAt(1) + " ", 1); ic.endBatchEdit(); - updateShiftKeyState(getCurrentInputEditorInfo()); + mKeyboardSwitcher.updateShiftState(); mJustAddedAutoSpace = true; } } @@ -1084,14 +1010,14 @@ public class LatinIME extends InputMethodService if (ic == null) return; CharSequence lastThree = ic.getTextBeforeCursor(3, 0); if (lastThree != null && lastThree.length() == 3 - && lastThree.charAt(0) == KEYCODE_PERIOD - && lastThree.charAt(1) == KEYCODE_SPACE - && lastThree.charAt(2) == KEYCODE_PERIOD) { + && lastThree.charAt(0) == Keyboard.CODE_PERIOD + && lastThree.charAt(1) == Keyboard.CODE_SPACE + && lastThree.charAt(2) == Keyboard.CODE_PERIOD) { ic.beginBatchEdit(); ic.deleteSurroundingText(3, 0); ic.commitText(" ..", 1); ic.endBatchEdit(); - updateShiftKeyState(getCurrentInputEditorInfo()); + mKeyboardSwitcher.updateShiftState(); } } @@ -1103,12 +1029,13 @@ public class LatinIME extends InputMethodService CharSequence lastThree = ic.getTextBeforeCursor(3, 0); if (lastThree != null && lastThree.length() == 3 && Character.isLetterOrDigit(lastThree.charAt(0)) - && lastThree.charAt(1) == KEYCODE_SPACE && lastThree.charAt(2) == KEYCODE_SPACE) { + && lastThree.charAt(1) == Keyboard.CODE_SPACE + && lastThree.charAt(2) == Keyboard.CODE_SPACE) { ic.beginBatchEdit(); ic.deleteSurroundingText(2, 0); ic.commitText(". ", 1); ic.endBatchEdit(); - updateShiftKeyState(getCurrentInputEditorInfo()); + mKeyboardSwitcher.updateShiftState(); mJustAddedAutoSpace = true; } } @@ -1121,8 +1048,8 @@ public class LatinIME extends InputMethodService // if there is one. CharSequence lastOne = ic.getTextBeforeCursor(1, 0); if (lastOne != null && lastOne.length() == 1 - && lastOne.charAt(0) == KEYCODE_PERIOD - && text.charAt(0) == KEYCODE_PERIOD) { + && lastOne.charAt(0) == Keyboard.CODE_PERIOD + && text.charAt(0) == Keyboard.CODE_PERIOD) { ic.deleteSurroundingText(1, 0); } } @@ -1133,7 +1060,7 @@ public class LatinIME extends InputMethodService CharSequence lastOne = ic.getTextBeforeCursor(1, 0); if (lastOne != null && lastOne.length() == 1 - && lastOne.charAt(0) == KEYCODE_SPACE) { + && lastOne.charAt(0) == Keyboard.CODE_SPACE) { ic.deleteSurroundingText(1, 0); } } @@ -1142,7 +1069,7 @@ public class LatinIME extends InputMethodService mUserDictionary.addWord(word, 128); // Suggestion strip should be updated after the operation of adding word to the // user dictionary - postUpdateSuggestions(); + mHandler.postUpdateSuggestions(); return true; } @@ -1154,14 +1081,11 @@ public class LatinIME extends InputMethodService } } - private void showInputMethodPicker() { - ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) - .showInputMethodPicker(); - } - - private void onOptionKeyPressed() { + private void onSettingsKeyPressed() { if (!isShowingOptionDialog()) { - if (LatinIMEUtil.hasMultipleEnabledIMEs(this)) { + if (!mConfigEnableShowSubtypeSettings) { + showSubtypeSelectorAndSettings(); + } else if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) { showOptionsMenu(); } else { launchSettings(); @@ -1169,10 +1093,10 @@ public class LatinIME extends InputMethodService } } - private void onOptionKeyLongPressed() { + private void onSettingsKeyLongPressed() { if (!isShowingOptionDialog()) { - if (LatinIMEUtil.hasMultipleEnabledIMEs(this)) { - showInputMethodPicker(); + if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) { + mImm.showInputMethodPicker(); } else { launchSettings(); } @@ -1183,150 +1107,137 @@ public class LatinIME extends InputMethodService return mOptionsDialog != null && mOptionsDialog.isShowing(); } - // Implementation of KeyboardViewListener - - public void onKey(int primaryCode, int[] keyCodes, int x, int y) { + // Implementation of {@link KeyboardActionListener}. + @Override + public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) { long when = SystemClock.uptimeMillis(); - if (primaryCode != Keyboard.KEYCODE_DELETE || - when > mLastKeyTime + QUICK_PRESS) { + if (primaryCode != Keyboard.CODE_DELETE || when > mLastKeyTime + QUICK_PRESS) { mDeleteCount = 0; } mLastKeyTime = when; - final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); + KeyboardSwitcher switcher = mKeyboardSwitcher; + final boolean distinctMultiTouch = switcher.hasDistinctMultitouch(); switch (primaryCode) { - case Keyboard.KEYCODE_DELETE: - handleBackspace(); - mDeleteCount++; - LatinImeLogger.logOnDelete(); - break; - case Keyboard.KEYCODE_SHIFT: - // Shift key is handled in onPress() when device has distinct multi-touch panel. - if (!distinctMultiTouch) - handleShift(); - break; - case Keyboard.KEYCODE_MODE_CHANGE: - // Symbol key is handled in onPress() when device has distinct multi-touch panel. - if (!distinctMultiTouch) - changeKeyboardMode(); - break; - case Keyboard.KEYCODE_CANCEL: - if (!isShowingOptionDialog()) { - handleClose(); - } - break; - case LatinKeyboardView.KEYCODE_OPTIONS: - onOptionKeyPressed(); - break; - case LatinKeyboardView.KEYCODE_OPTIONS_LONGPRESS: - onOptionKeyLongPressed(); - break; - case LatinKeyboardView.KEYCODE_NEXT_LANGUAGE: - toggleLanguage(false, true); - break; - case LatinKeyboardView.KEYCODE_PREV_LANGUAGE: - toggleLanguage(false, false); - break; - case LatinKeyboardView.KEYCODE_VOICE: - if (VOICE_INSTALLED) { - startListening(false /* was a button press, was not a swipe */); - } - break; - case 9 /*Tab*/: - sendDownUpKeyEvents(KeyEvent.KEYCODE_TAB); - break; - default: - if (primaryCode != KEYCODE_ENTER) { - mJustAddedAutoSpace = false; - } - RingCharBuffer.getInstance().push((char)primaryCode, x, y); - LatinImeLogger.logOnInputChar(); - if (isWordSeparator(primaryCode)) { - handleSeparator(primaryCode); - } else { - handleCharacter(primaryCode, keyCodes); - } - // Cancel the just reverted state - mJustRevertedSeparator = null; + case Keyboard.CODE_DELETE: + handleBackspace(); + mDeleteCount++; + LatinImeLogger.logOnDelete(); + break; + case Keyboard.CODE_SHIFT: + // Shift key is handled in onPress() when device has distinct multi-touch panel. + if (!distinctMultiTouch) + switcher.toggleShift(); + break; + case Keyboard.CODE_SWITCH_ALPHA_SYMBOL: + // Symbol key is handled in onPress() when device has distinct multi-touch panel. + if (!distinctMultiTouch) + switcher.changeKeyboardMode(); + break; + case Keyboard.CODE_CANCEL: + if (!isShowingOptionDialog()) { + handleClose(); + } + break; + case Keyboard.CODE_SETTINGS: + onSettingsKeyPressed(); + break; + case Keyboard.CODE_SETTINGS_LONGPRESS: + onSettingsKeyLongPressed(); + break; + case Keyboard.CODE_NEXT_LANGUAGE: + toggleLanguage(false, true); + break; + case Keyboard.CODE_PREV_LANGUAGE: + toggleLanguage(false, false); + break; + case Keyboard.CODE_CAPSLOCK: + switcher.toggleCapsLock(); + break; + case Keyboard.CODE_VOICE: + mSubtypeSwitcher.switchToShortcutIME(); + break; + case Keyboard.CODE_TAB: + handleTab(); + break; + default: + if (primaryCode != Keyboard.CODE_ENTER) { + mJustAddedAutoSpace = false; + } + RingCharBuffer.getInstance().push((char)primaryCode, x, y); + LatinImeLogger.logOnInputChar(); + if (isWordSeparator(primaryCode)) { + handleSeparator(primaryCode); + } else { + handleCharacter(primaryCode, keyCodes); + } + // Cancel the just reverted state + mJustReverted = false; } - mKeyboardSwitcher.onKey(primaryCode); + switcher.onKey(primaryCode); // Reset after any single keystroke mEnteredText = null; } - public void onText(CharSequence text) { - if (VOICE_INSTALLED && mVoiceInputHighlighted) { - commitVoiceInput(); - } + @Override + public void onTextInput(CharSequence text) { + mVoiceConnector.commitVoiceInput(); InputConnection ic = getCurrentInputConnection(); if (ic == null) return; abortCorrection(false); ic.beginBatchEdit(); - if (mPredicting) { - commitTyped(ic); - } + commitTyped(ic); maybeRemovePreviousPeriod(text); ic.commitText(text, 1); ic.endBatchEdit(); - updateShiftKeyState(getCurrentInputEditorInfo()); - mKeyboardSwitcher.onKey(0); // dummy key code. - mJustRevertedSeparator = null; + mKeyboardSwitcher.updateShiftState(); + mKeyboardSwitcher.onKey(Keyboard.CODE_DUMMY); + mJustReverted = false; mJustAddedAutoSpace = false; mEnteredText = text; } - public void onCancel() { + @Override + public void onCancelInput() { // User released a finger outside any key mKeyboardSwitcher.onCancelInput(); } private void handleBackspace() { - if (VOICE_INSTALLED && mVoiceInputHighlighted) { - mVoiceInput.incrementTextModificationDeleteCount( - mVoiceResults.candidates.get(0).toString().length()); - revertVoiceInput(); - return; - } - boolean deleteChar = false; - InputConnection ic = getCurrentInputConnection(); - if (ic == null) return; + if (mVoiceConnector.logAndRevertVoiceInput()) return; + final InputConnection ic = getCurrentInputConnection(); + if (ic == null) return; ic.beginBatchEdit(); - if (mAfterVoiceInput) { - // Don't log delete if the user is pressing delete at - // the beginning of the text box (hence not deleting anything) - if (mVoiceInput.getCursorPos() > 0) { - // If anything was selected before the delete was pressed, increment the - // delete count by the length of the selection - int deleteLen = mVoiceInput.getSelectionSpan() > 0 ? - mVoiceInput.getSelectionSpan() : 1; - mVoiceInput.incrementTextModificationDeleteCount(deleteLen); - } - } + mVoiceConnector.handleBackspace(); - if (mPredicting) { + boolean deleteChar = false; + if (mHasValidSuggestions) { final int length = mComposing.length(); if (length > 0) { mComposing.delete(length - 1, length); mWord.deleteLast(); ic.setComposingText(mComposing, 1); if (mComposing.length() == 0) { - mPredicting = false; + mHasValidSuggestions = false; } - postUpdateSuggestions(); + mHandler.postUpdateSuggestions(); } else { ic.deleteSurroundingText(1, 0); } } else { deleteChar = true; } - postUpdateShiftKeyState(); + mHandler.postUpdateShiftKeyState(); + TextEntryState.backspace(); if (TextEntryState.getState() == TextEntryState.State.UNDO_COMMIT) { revertLastWord(deleteChar); ic.endBatchEdit(); return; - } else if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) { + } + + if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) { ic.deleteSurroundingText(mEnteredText.length(), 0); } else if (deleteChar) { if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) { @@ -1345,153 +1256,134 @@ public class LatinIME extends InputMethodService } } } - mJustRevertedSeparator = null; + mJustReverted = false; ic.endBatchEdit(); } - private void resetShift() { - handleShiftInternal(true); - } + private void handleTab() { + final int imeOptions = getCurrentInputEditorInfo().imeOptions; + final int navigationFlags = + EditorInfo.IME_FLAG_NAVIGATE_NEXT | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS; + if ((imeOptions & navigationFlags) == 0) { + sendDownUpKeyEvents(KeyEvent.KEYCODE_TAB); + return; + } - private void handleShift() { - handleShiftInternal(false); - } + final InputConnection ic = getCurrentInputConnection(); + if (ic == null) + return; - private void handleShiftInternal(boolean forceNormal) { - mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE); - KeyboardSwitcher switcher = mKeyboardSwitcher; - LatinKeyboardView inputView = switcher.getInputView(); - if (switcher.isAlphabetMode()) { - if (mCapsLock || forceNormal) { - mCapsLock = false; - switcher.setShifted(false); - } else if (inputView != null) { - if (inputView.isShifted()) { - mCapsLock = true; - switcher.setShiftLocked(true); - } else { - switcher.setShifted(true); - } - } - } else { - switcher.toggleShift(); + // True if keyboard is in either chording shift or manual temporary upper case mode. + final boolean isManualTemporaryUpperCase = mKeyboardSwitcher.isManualTemporaryUpperCase(); + if ((imeOptions & EditorInfo.IME_FLAG_NAVIGATE_NEXT) != 0 + && !isManualTemporaryUpperCase) { + ic.performEditorAction(EditorInfo.IME_ACTION_NEXT); + } else if ((imeOptions & EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS) != 0 + && isManualTemporaryUpperCase) { + ic.performEditorAction(EditorInfo.IME_ACTION_PREVIOUS); } } private void abortCorrection(boolean force) { if (force || TextEntryState.isCorrecting()) { + TextEntryState.onAbortCorrection(); + setCandidatesViewShown(isCandidateStripVisible()); getCurrentInputConnection().finishComposingText(); clearSuggestions(); } } private void handleCharacter(int primaryCode, int[] keyCodes) { - if (VOICE_INSTALLED && mVoiceInputHighlighted) { - commitVoiceInput(); - } + mVoiceConnector.handleCharacter(); - if (mAfterVoiceInput) { - // Assume input length is 1. This assumption fails for smiley face insertions. - mVoiceInput.incrementTextModificationInsertCount(1); - } if (mLastSelectionStart == mLastSelectionEnd && TextEntryState.isCorrecting()) { abortCorrection(false); } - if (isAlphabet(primaryCode) && isPredictionOn() && !isCursorTouchingWord()) { - if (!mPredicting) { - mPredicting = true; + int code = primaryCode; + if (isAlphabet(code) && isSuggestionsRequested() && !isCursorTouchingWord()) { + if (!mHasValidSuggestions) { + mHasValidSuggestions = true; mComposing.setLength(0); saveWordInHistory(mBestWord); mWord.reset(); } } - if (mKeyboardSwitcher.getInputView().isShifted()) { + KeyboardSwitcher switcher = mKeyboardSwitcher; + if (switcher.isShiftedOrShiftLocked()) { if (keyCodes == null || keyCodes[0] < Character.MIN_CODE_POINT || keyCodes[0] > Character.MAX_CODE_POINT) { return; } - primaryCode = keyCodes[0]; - if (mKeyboardSwitcher.isAlphabetMode() && Character.isLowerCase(primaryCode)) { - int upperCaseCode = Character.toUpperCase(primaryCode); - if (upperCaseCode != primaryCode) { - primaryCode = upperCaseCode; + code = keyCodes[0]; + if (switcher.isAlphabetMode() && Character.isLowerCase(code)) { + int upperCaseCode = Character.toUpperCase(code); + if (upperCaseCode != code) { + code = upperCaseCode; } else { // Some keys, such as [eszett], have upper case as multi-characters. - String upperCase = new String(new int[] {primaryCode}, 0, 1).toUpperCase(); - onText(upperCase); + String upperCase = new String(new int[] {code}, 0, 1).toUpperCase(); + onTextInput(upperCase); return; } } } - if (mPredicting) { - if (mKeyboardSwitcher.getInputView().isShifted() - && mKeyboardSwitcher.isAlphabetMode() - && mComposing.length() == 0) { + if (mHasValidSuggestions) { + if (mComposing.length() == 0 && switcher.isAlphabetMode() + && switcher.isShiftedOrShiftLocked()) { mWord.setFirstCharCapitalized(true); } - mComposing.append((char) primaryCode); - mWord.add(primaryCode, keyCodes); + mComposing.append((char) code); + mWord.add(code, keyCodes); InputConnection ic = getCurrentInputConnection(); if (ic != null) { // If it's the first letter, make note of auto-caps state if (mWord.size() == 1) { - mWord.setAutoCapitalized( - getCursorCapsMode(ic, getCurrentInputEditorInfo()) != 0); + mWord.setAutoCapitalized(getCurrentAutoCapsState()); } ic.setComposingText(mComposing, 1); } - postUpdateSuggestions(); + mHandler.postUpdateSuggestions(); } else { - sendKeyChar((char)primaryCode); + sendKeyChar((char)code); } - updateShiftKeyState(getCurrentInputEditorInfo()); + switcher.updateShiftState(); if (LatinIME.PERF_DEBUG) measureCps(); - TextEntryState.typedCharacter((char) primaryCode, isWordSeparator(primaryCode)); + TextEntryState.typedCharacter((char) code, isWordSeparator(code)); } private void handleSeparator(int primaryCode) { - if (VOICE_INSTALLED && mVoiceInputHighlighted) { - commitVoiceInput(); - } - - if (mAfterVoiceInput){ - // Assume input length is 1. This assumption fails for smiley face insertions. - mVoiceInput.incrementTextModificationInsertPunctuationCount(1); - } + mVoiceConnector.handleSeparator(); // Should dismiss the "Touch again to save" message when handling separator if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) { - postUpdateSuggestions(); + mHandler.postUpdateSuggestions(); } boolean pickedDefault = false; // Handle separator - InputConnection ic = getCurrentInputConnection(); + final InputConnection ic = getCurrentInputConnection(); if (ic != null) { ic.beginBatchEdit(); abortCorrection(false); } - if (mPredicting) { + if (mHasValidSuggestions) { // In certain languages where single quote is a separator, it's better // 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. - if (mAutoCorrectOn && primaryCode != '\'' && - (mJustRevertedSeparator == null - || mJustRevertedSeparator.length() == 0 - || mJustRevertedSeparator.charAt(0) != primaryCode)) { + if (mAutoCorrectOn && primaryCode != '\'' && !mJustReverted) { pickedDefault = pickDefaultSuggestion(); // Picked the suggestion by the space key. We consider this // as "added an auto space". - if (primaryCode == KEYCODE_SPACE) { + if (primaryCode == Keyboard.CODE_SPACE) { mJustAddedAutoSpace = true; } } else { commitTyped(ic); } } - if (mJustAddedAutoSpace && primaryCode == KEYCODE_ENTER) { + if (mJustAddedAutoSpace && primaryCode == Keyboard.CODE_ENTER) { removeTrailingSpace(); mJustAddedAutoSpace = false; } @@ -1500,21 +1392,32 @@ public class LatinIME extends InputMethodService // Handle the case of ". ." -> " .." with auto-space if necessary // before changing the TextEntryState. if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED - && primaryCode == KEYCODE_PERIOD) { + && primaryCode == Keyboard.CODE_PERIOD) { reswapPeriodAndSpace(); } TextEntryState.typedCharacter((char) primaryCode, true); if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED - && primaryCode != KEYCODE_ENTER) { + && primaryCode != Keyboard.CODE_ENTER) { swapPunctuationAndSpace(); - } else if (isPredictionOn() && primaryCode == KEYCODE_SPACE) { + } else if (isSuggestionsRequested() && primaryCode == Keyboard.CODE_SPACE) { doubleSpace(); } if (pickedDefault) { - TextEntryState.backToAcceptedDefault(mWord.getTypedWord()); + CharSequence typedWord = mWord.getTypedWord(); + TextEntryState.backToAcceptedDefault(typedWord); + if (!TextUtils.isEmpty(typedWord) && !typedWord.equals(mBestWord)) { + if (ic != null) { + CorrectionInfo correctionInfo = new CorrectionInfo( + mLastSelectionEnd - typedWord.length(), typedWord, mBestWord); + ic.commitCorrection(correctionInfo); + } + if (mCandidateView != null) + mCandidateView.onAutoCorrectionInverted(mBestWord); + } + setPunctuationSuggestions(); } - updateShiftKeyState(getCurrentInputEditorInfo()); + mKeyboardSwitcher.updateShiftState(); if (ic != null) { ic.endBatchEdit(); } @@ -1522,16 +1425,11 @@ public class LatinIME extends InputMethodService private void handleClose() { commitTyped(getCurrentInputConnection()); - if (VOICE_INSTALLED & mRecognizing) { - mVoiceInput.cancel(); - } + mVoiceConnector.handleClose(); requestHideSelf(0); - if (mKeyboardSwitcher != null) { - LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); - if (inputView != null) { - inputView.closing(); - } - } + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView != null) + inputView.closing(); TextEntryState.endSession(); } @@ -1552,272 +1450,114 @@ public class LatinIME extends InputMethodService mWordHistory.add(entry); } - private void postUpdateSuggestions() { - mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS); - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SUGGESTIONS), 100); + private boolean isSuggestionsRequested() { + return mIsSettingsSuggestionStripOn + && (mCorrectionMode > 0 || isShowingSuggestionsStrip()); } - private void postUpdateOldSuggestions() { - mHandler.removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS), 300); + private boolean isShowingPunctuationList() { + return mSuggestPuncList == mCandidateView.getSuggestions(); } - private boolean isPredictionOn() { - return mPredictionOn; + private boolean isShowingSuggestionsStrip() { + return (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_VALUE) + || (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE + && mOrientation == Configuration.ORIENTATION_PORTRAIT); } private boolean isCandidateStripVisible() { - return isPredictionOn() && mShowSuggestions; - } - - public void onCancelVoice() { - if (mRecognizing) { - switchToKeyboardView(); - } - } - - private void switchToKeyboardView() { - mHandler.post(new Runnable() { - public void run() { - mRecognizing = false; - if (mKeyboardSwitcher.getInputView() != null) { - setInputView(mKeyboardSwitcher.getInputView()); - } - setCandidatesViewShown(true); - updateInputViewShown(); - postUpdateSuggestions(); - }}); + if (mCandidateView.isShowingAddToDictionaryHint() || TextEntryState.isCorrecting()) + return true; + if (!isShowingSuggestionsStrip()) + return false; + if (mApplicationSpecifiedCompletionOn) + return true; + return isSuggestionsRequested(); } - private void switchToRecognitionStatusView() { - final boolean configChanged = mConfigurationChanging; + public void switchToKeyboardView() { mHandler.post(new Runnable() { + @Override public void run() { - setCandidatesViewShown(false); - mRecognizing = true; - View v = mVoiceInput.getView(); - ViewParent p = v.getParent(); - if (p != null && p instanceof ViewGroup) { - ((ViewGroup)v.getParent()).removeView(v); + if (DEBUG) { + Log.d(TAG, "Switch to keyboard view."); } - setInputView(v); - updateInputViewShown(); - if (configChanged) { - mVoiceInput.onConfigurationChanged(); + View v = mKeyboardSwitcher.getInputView(); + if (v != null) { + // Confirms that the keyboard view doesn't have parent view. + ViewParent p = v.getParent(); + if (p != null && p instanceof ViewGroup) { + ((ViewGroup) p).removeView(v); + } + setInputView(v); } - }}); - } - - private void startListening(boolean swipe) { - if (!mHasUsedVoiceInput || - (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale)) { - // Calls reallyStartListening if user clicks OK, does nothing if user clicks Cancel. - showVoiceWarningDialog(swipe); - } else { - reallyStartListening(swipe); - } - } - - private void reallyStartListening(boolean swipe) { - if (!mHasUsedVoiceInput) { - // The user has started a voice input, so remember that in the - // future (so we don't show the warning dialog after the first run). - SharedPreferences.Editor editor = - PreferenceManager.getDefaultSharedPreferences(this).edit(); - editor.putBoolean(PREF_HAS_USED_VOICE_INPUT, true); - SharedPreferencesCompat.apply(editor); - mHasUsedVoiceInput = true; - } - - if (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale) { - // The user has started a voice input from an unsupported locale, so remember that - // in the future (so we don't show the warning dialog the next time they do this). - SharedPreferences.Editor editor = - PreferenceManager.getDefaultSharedPreferences(this).edit(); - editor.putBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, true); - SharedPreferencesCompat.apply(editor); - mHasUsedVoiceInputUnsupportedLocale = true; - } - - // Clear N-best suggestions - clearSuggestions(); - - FieldContext context = new FieldContext( - getCurrentInputConnection(), - getCurrentInputEditorInfo(), - mLanguageSwitcher.getInputLanguage(), - mLanguageSwitcher.getEnabledLanguages()); - mVoiceInput.startListening(context, swipe); - switchToRecognitionStatusView(); - } - - private void showVoiceWarningDialog(final boolean swipe) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setCancelable(true); - builder.setIcon(R.drawable.ic_mic_dialog); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - mVoiceInput.logKeyboardWarningDialogOk(); - reallyStartListening(swipe); - } - }); - builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - mVoiceInput.logKeyboardWarningDialogCancel(); + setCandidatesViewShown(isCandidateStripVisible()); + updateInputViewShown(); + mHandler.postUpdateSuggestions(); } }); - - if (mLocaleSupportedForVoiceInput) { - String message = getString(R.string.voice_warning_may_not_understand) + "\n\n" + - getString(R.string.voice_warning_how_to_turn_off); - builder.setMessage(message); - } else { - String message = getString(R.string.voice_warning_locale_not_supported) + "\n\n" + - getString(R.string.voice_warning_may_not_understand) + "\n\n" + - getString(R.string.voice_warning_how_to_turn_off); - builder.setMessage(message); - } - - builder.setTitle(R.string.voice_warning_title); - mVoiceWarningDialog = builder.create(); - - Window window = mVoiceWarningDialog.getWindow(); - WindowManager.LayoutParams lp = window.getAttributes(); - lp.token = mKeyboardSwitcher.getInputView().getWindowToken(); - lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; - window.setAttributes(lp); - window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); - mVoiceInput.logKeyboardWarningDialogShown(); - mVoiceWarningDialog.show(); } - public void onVoiceResults(List<String> candidates, - Map<String, List<CharSequence>> alternatives) { - if (!mRecognizing) { - return; - } - mVoiceResults.candidates = candidates; - mVoiceResults.alternatives = alternatives; - mHandler.sendMessage(mHandler.obtainMessage(MSG_VOICE_RESULTS)); + public void clearSuggestions() { + setSuggestions(SuggestedWords.EMPTY); } - private void handleVoiceResults() { - mAfterVoiceInput = true; - mImmediatelyAfterVoiceInput = true; - - InputConnection ic = getCurrentInputConnection(); - if (!isFullscreenMode()) { - // Start listening for updates to the text from typing, etc. - if (ic != null) { - ExtractedTextRequest req = new ExtractedTextRequest(); - ic.getExtractedText(req, InputConnection.GET_EXTRACTED_TEXT_MONITOR); - } - } - - vibrate(); - switchToKeyboardView(); - - final List<CharSequence> nBest = new ArrayList<CharSequence>(); - boolean capitalizeFirstWord = preferCapitalization() - || (mKeyboardSwitcher.isAlphabetMode() - && mKeyboardSwitcher.getInputView().isShifted()); - for (String c : mVoiceResults.candidates) { - if (capitalizeFirstWord) { - c = Character.toUpperCase(c.charAt(0)) + c.substring(1, c.length()); - } - nBest.add(c); - } - - if (nBest.size() == 0) { - return; - } - - String bestResult = nBest.get(0).toString(); - - mVoiceInput.logVoiceInputDelivered(bestResult.length()); - - mHints.registerVoiceResult(bestResult); - - if (ic != null) ic.beginBatchEdit(); // To avoid extra updates on committing older text - - commitTyped(ic); - EditingUtil.appendText(ic, bestResult); - - if (ic != null) ic.endBatchEdit(); - - mVoiceInputHighlighted = true; - mWordToSuggestions.putAll(mVoiceResults.alternatives); - } - - private void clearSuggestions() { - setSuggestions(null, false, false, false); - } - - private void setSuggestions( - List<CharSequence> suggestions, - boolean completions, - boolean typedWordValid, - boolean haveMinimalSuggestion) { - - if (mIsShowingHint) { + public void setSuggestions(SuggestedWords words) { + if (mVoiceConnector.getAndResetIsShowingHint()) { setCandidatesView(mCandidateViewContainer); - mIsShowingHint = false; } if (mCandidateView != null) { - mCandidateView.setSuggestions( - suggestions, completions, typedWordValid, haveMinimalSuggestion); + mCandidateView.setSuggestions(words); + if (mCandidateView.isConfigCandidateHighlightFontColorEnabled()) { + mKeyboardSwitcher.onAutoCorrectionStateChanged( + words.hasWordAboveAutoCorrectionScoreThreshold()); + } } } - private void updateSuggestions() { - LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); - ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null); + public void updateSuggestions() { + mKeyboardSwitcher.setPreferredLetters(null); // Check if we have a suggestion engine attached. - if ((mSuggest == null || !isPredictionOn()) && !mVoiceInputHighlighted) { + if ((mSuggest == null || !isSuggestionsRequested()) + && !mVoiceConnector.isVoiceInputHighlighted()) { return; } - if (!mPredicting) { - setNextSuggestions(); + if (!mHasValidSuggestions) { + setPunctuationSuggestions(); return; } showSuggestions(mWord); } - private List<CharSequence> getTypedSuggestions(WordComposer word) { - List<CharSequence> stringList = mSuggest.getSuggestions( - mKeyboardSwitcher.getInputView(), word, false, null); - return stringList; + private SuggestedWords.Builder getTypedSuggestions(WordComposer word) { + return mSuggest.getSuggestedWordBuilder(mKeyboardSwitcher.getInputView(), word, null); } private void showCorrections(WordAlternatives alternatives) { - List<CharSequence> stringList = alternatives.getAlternatives(); - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters(null); - showSuggestions(stringList, alternatives.getOriginalWord(), false, false); + mKeyboardSwitcher.setPreferredLetters(null); + SuggestedWords.Builder builder = alternatives.getAlternatives(); + builder.setTypedWordValid(false).setHasMinimalSuggestion(false); + showSuggestions(builder.build(), alternatives.getOriginalWord()); } private void showSuggestions(WordComposer word) { - // long startTime = System.currentTimeMillis(); // TIME MEASUREMENT! // TODO Maybe need better way of retrieving previous word - CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection(), + CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(), mWordSeparators); - List<CharSequence> stringList = mSuggest.getSuggestions( - mKeyboardSwitcher.getInputView(), word, false, prevWord); - // long stopTime = System.currentTimeMillis(); // TIME MEASUREMENT! - // Log.d("LatinIME","Suggest Total Time - " + (stopTime - startTime)); + SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder( + mKeyboardSwitcher.getInputView(), word, prevWord); int[] nextLettersFrequencies = mSuggest.getNextLettersFrequencies(); + mKeyboardSwitcher.setPreferredLetters(nextLettersFrequencies); - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters( - nextLettersFrequencies); - - boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasMinimalCorrection(); - //|| mCorrectionMode == mSuggest.CORRECTION_FULL; - CharSequence typedWord = word.getTypedWord(); + boolean correctionAvailable = !mInputTypeNoAutoCorrect && !mJustReverted + && mSuggest.hasAutoCorrection(); + final CharSequence typedWord = word.getTypedWord(); // If we're in basic correct - boolean typedWordValid = mSuggest.isValidWord(typedWord) || + final boolean typedWordValid = mSuggest.isValidWord(typedWord) || (preferCapitalization() && mSuggest.isValidWord(typedWord.toString().toLowerCase())); if (mCorrectionMode == Suggest.CORRECTION_FULL @@ -1828,34 +1568,50 @@ public class LatinIME extends InputMethodService correctionAvailable &= !word.isMostlyCaps(); correctionAvailable &= !TextEntryState.isCorrecting(); - showSuggestions(stringList, typedWord, typedWordValid, correctionAvailable); + // Basically, we update the suggestion strip only when suggestion count > 1. However, + // there is an exception: We update the suggestion strip whenever typed word's length + // is 1 or typed word is found in dictionary, regardless of suggestion count. Actually, + // in most cases, suggestion count is 1 when typed word's length is 1, but we do always + // need to clear the previous state when the user starts typing a word (i.e. typed word's + // length == 1). + if (builder.size() > 1 || typedWord.length() == 1 || typedWordValid + || mCandidateView.isShowingAddToDictionaryHint()) { + builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion(correctionAvailable); + } else { + final SuggestedWords previousSuggestions = mCandidateView.getSuggestions(); + if (previousSuggestions == mSuggestPuncList) + return; + builder.addTypedWordAndPreviousSuggestions(typedWord, previousSuggestions); + } + showSuggestions(builder.build(), typedWord); } - private void showSuggestions(List<CharSequence> stringList, CharSequence typedWord, - boolean typedWordValid, boolean correctionAvailable) { - setSuggestions(stringList, false, typedWordValid, correctionAvailable); - if (stringList.size() > 0) { - if (correctionAvailable && !typedWordValid && stringList.size() > 1) { - mBestWord = stringList.get(1); + private void showSuggestions(SuggestedWords suggestedWords, CharSequence typedWord) { + setSuggestions(suggestedWords); + if (suggestedWords.size() > 0) { + if (Utils.shouldBlockedBySafetyNetForAutoCorrection(suggestedWords)) { + mBestWord = typedWord; + } else if (suggestedWords.hasAutoCorrectionWord()) { + mBestWord = suggestedWords.getWord(1); } else { mBestWord = typedWord; } } else { mBestWord = null; } - setCandidatesViewShown(isCandidateStripVisible() || mCompletionOn); + setCandidatesViewShown(isCandidateStripVisible()); } private boolean pickDefaultSuggestion() { // Complete any pending candidate query first - if (mHandler.hasMessages(MSG_UPDATE_SUGGESTIONS)) { - mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS); + if (mHandler.hasPendingUpdateSuggestions()) { + mHandler.cancelUpdateSuggestions(); updateSuggestions(); } if (mBestWord != null && mBestWord.length() > 0) { TextEntryState.acceptedDefault(mWord.getTypedWord(), mBestWord); mJustAccepted = true; - pickSuggestion(mBestWord, false); + pickSuggestion(mBestWord); // Add the word to the auto dictionary if it's not a known word addToDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED); return true; @@ -1865,24 +1621,17 @@ public class LatinIME extends InputMethodService } public void pickSuggestionManually(int index, CharSequence suggestion) { - List<CharSequence> suggestions = mCandidateView.getSuggestions(); - - if (mAfterVoiceInput && mShowingVoiceSuggestions) { - mVoiceInput.flushAllTextModificationCounters(); - // send this intent AFTER logging any prior aggregated edits. - mVoiceInput.logTextModifiedByChooseSuggestion(suggestion.toString(), index, - mWordSeparators, - getCurrentInputConnection()); - } + SuggestedWords suggestions = mCandidateView.getSuggestions(); + mVoiceConnector.flushAndLogAllTextModificationCounters(index, suggestion, mWordSeparators); final boolean correcting = TextEntryState.isCorrecting(); InputConnection ic = getCurrentInputConnection(); if (ic != null) { ic.beginBatchEdit(); } - if (mCompletionOn && mCompletions != null && index >= 0 - && index < mCompletions.length) { - CompletionInfo ci = mCompletions[index]; + if (mApplicationSpecifiedCompletionOn && mApplicationSpecifiedCompletions != null + && index >= 0 && index < mApplicationSpecifiedCompletions.length) { + CompletionInfo ci = mApplicationSpecifiedCompletions[index]; if (ic != null) { ic.commitCompletion(ci); } @@ -1890,7 +1639,7 @@ public class LatinIME extends InputMethodService if (mCandidateView != null) { mCandidateView.clear(); } - updateShiftKeyState(getCurrentInputEditorInfo()); + mKeyboardSwitcher.updateShiftState(); if (ic != null) { ic.endBatchEdit(); } @@ -1903,17 +1652,18 @@ public class LatinIME extends InputMethodService // Word separators are suggested before the user inputs something. // So, LatinImeLogger logs "" as a user's input. LatinImeLogger.logOnManualSuggestion( - "", suggestion.toString(), index, suggestions); + "", suggestion.toString(), index, suggestions.mWords); final char primaryCode = suggestion.charAt(0); - onKey(primaryCode, new int[]{primaryCode}, LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE, - LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE); + onCodeInput(primaryCode, new int[] { primaryCode }, + KeyboardActionListener.NOT_A_TOUCH_COORDINATE, + KeyboardActionListener.NOT_A_TOUCH_COORDINATE); if (ic != null) { ic.endBatchEdit(); } return; } mJustAccepted = true; - pickSuggestion(suggestion, correcting); + pickSuggestion(suggestion); // Add the word to the auto dictionary if it's not a known word if (index == 0) { addToDictionaries(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED); @@ -1921,7 +1671,7 @@ public class LatinIME extends InputMethodService addToBigramDictionary(suggestion, 1); } LatinImeLogger.logOnManualSuggestion(mComposing.toString(), suggestion.toString(), - index, suggestions); + index, suggestions.mWords); TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion); // Follow it with a space if (mAutoSpace && !correcting) { @@ -1937,13 +1687,13 @@ public class LatinIME extends InputMethodService // Fool the state watcher so that a subsequent backspace will not do a revert, unless // we just did a correction, in which case we need to stay in // TextEntryState.State.PICKED_SUGGESTION state. - TextEntryState.typedCharacter((char) KEYCODE_SPACE, true); - setNextSuggestions(); + TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true); + setPunctuationSuggestions(); } else if (!showingAddToDictionaryHint) { // If we're not showing the "Touch again to save", then show corrections again. // In case the cursor position doesn't change, make sure we show the suggestions again. clearSuggestions(); - postUpdateOldSuggestions(); + mHandler.postUpdateOldSuggestions(); } if (showingAddToDictionaryHint) { mCandidateView.showAddToDictionaryHint(suggestion); @@ -1953,91 +1703,25 @@ public class LatinIME extends InputMethodService } } - private void rememberReplacedWord(CharSequence suggestion) { - if (mShowingVoiceSuggestions) { - // Retain the replaced word in the alternatives array. - EditingUtil.Range range = new EditingUtil.Range(); - String wordToBeReplaced = EditingUtil.getWordAtCursor(getCurrentInputConnection(), - mWordSeparators, range); - if (!mWordToSuggestions.containsKey(wordToBeReplaced)) { - wordToBeReplaced = wordToBeReplaced.toLowerCase(); - } - if (mWordToSuggestions.containsKey(wordToBeReplaced)) { - List<CharSequence> suggestions = mWordToSuggestions.get(wordToBeReplaced); - if (suggestions.contains(suggestion)) { - suggestions.remove(suggestion); - } - suggestions.add(wordToBeReplaced); - mWordToSuggestions.remove(wordToBeReplaced); - mWordToSuggestions.put(suggestion.toString(), suggestions); - } - } - } - /** * Commits the chosen word to the text field and saves it for later * retrieval. * @param suggestion the suggestion picked by the user to be committed to * the text field - * @param correcting whether this is due to a correction of an existing - * word. */ - private void pickSuggestion(CharSequence suggestion, boolean correcting) { - LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); - if (mCapsLock) { - suggestion = suggestion.toString().toUpperCase(); - } else if (preferCapitalization() - || (mKeyboardSwitcher.isAlphabetMode() - && inputView.isShifted())) { - suggestion = suggestion.toString().toUpperCase().charAt(0) - + suggestion.subSequence(1, suggestion.length()).toString(); - } + private void pickSuggestion(CharSequence suggestion) { + KeyboardSwitcher switcher = mKeyboardSwitcher; + if (!switcher.isKeyboardAvailable()) + return; InputConnection ic = getCurrentInputConnection(); if (ic != null) { - rememberReplacedWord(suggestion); + mVoiceConnector.rememberReplacedWord(suggestion, mWordSeparators); ic.commitText(suggestion, 1); } saveWordInHistory(suggestion); - mPredicting = false; + mHasValidSuggestions = false; mCommittedLength = suggestion.length(); - ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null); - // If we just corrected a word, then don't show punctuations - if (!correcting) { - setNextSuggestions(); - } - updateShiftKeyState(getCurrentInputEditorInfo()); - } - - /** - * Tries to apply any voice alternatives for the word if this was a spoken word and - * there are voice alternatives. - * @param touching The word that the cursor is touching, with position information - * @return true if an alternative was found, false otherwise. - */ - private boolean applyVoiceAlternatives(EditingUtil.SelectedWord touching) { - // Search for result in spoken word alternatives - String selectedWord = touching.word.toString().trim(); - if (!mWordToSuggestions.containsKey(selectedWord)) { - selectedWord = selectedWord.toLowerCase(); - } - if (mWordToSuggestions.containsKey(selectedWord)) { - mShowingVoiceSuggestions = true; - List<CharSequence> suggestions = mWordToSuggestions.get(selectedWord); - // If the first letter of touching is capitalized, make all the suggestions - // start with a capital letter. - if (Character.isUpperCase(touching.word.charAt(0))) { - for (int i = 0; i < suggestions.size(); i++) { - String origSugg = (String) suggestions.get(i); - String capsSugg = origSugg.toUpperCase().charAt(0) - + origSugg.subSequence(1, origSugg.length()).toString(); - suggestions.set(i, capsSugg); - } - } - setSuggestions(suggestions, false, true, true); - setCandidatesViewShown(true); - return true; - } - return false; + switcher.setPreferredLetters(null); } /** @@ -2046,12 +1730,12 @@ public class LatinIME extends InputMethodService * @param touching The word that the cursor is touching, with position information * @return true if an alternative was found, false otherwise. */ - private boolean applyTypedAlternatives(EditingUtil.SelectedWord touching) { + private boolean applyTypedAlternatives(EditingUtils.SelectedWord touching) { // If we didn't find a match, search for result in typed word history WordComposer foundWord = null; WordAlternatives alternatives = null; for (WordAlternatives entry : mWordHistory) { - if (TextUtils.equals(entry.getChosenWord(), touching.word)) { + if (TextUtils.equals(entry.getChosenWord(), touching.mWord)) { if (entry instanceof TypedWordAlternatives) { foundWord = ((TypedWordAlternatives) entry).word; } @@ -2059,22 +1743,22 @@ public class LatinIME extends InputMethodService break; } } - // If we didn't find a match, at least suggest completions + // If we didn't find a match, at least suggest corrections. if (foundWord == null - && (mSuggest.isValidWord(touching.word) - || mSuggest.isValidWord(touching.word.toString().toLowerCase()))) { + && (mSuggest.isValidWord(touching.mWord) + || mSuggest.isValidWord(touching.mWord.toString().toLowerCase()))) { foundWord = new WordComposer(); - for (int i = 0; i < touching.word.length(); i++) { - foundWord.add(touching.word.charAt(i), new int[] { - touching.word.charAt(i) + for (int i = 0; i < touching.mWord.length(); i++) { + foundWord.add(touching.mWord.charAt(i), new int[] { + touching.mWord.charAt(i) }); } - foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.word.charAt(0))); + foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.mWord.charAt(0))); } // Found a match, show suggestions if (foundWord != null || alternatives != null) { if (alternatives == null) { - alternatives = new TypedWordAlternatives(touching.word, foundWord); + alternatives = new TypedWordAlternatives(touching.mWord, foundWord); } showCorrections(alternatives); if (foundWord != null) { @@ -2088,39 +1772,41 @@ public class LatinIME extends InputMethodService } private void setOldSuggestions() { - mShowingVoiceSuggestions = false; + mVoiceConnector.setShowingVoiceSuggestions(false); if (mCandidateView != null && mCandidateView.isShowingAddToDictionaryHint()) { return; } InputConnection ic = getCurrentInputConnection(); if (ic == null) return; - if (!mPredicting) { + if (!mHasValidSuggestions) { // Extract the selected or touching text - EditingUtil.SelectedWord touching = EditingUtil.getWordAtCursorOrSelection(ic, + EditingUtils.SelectedWord touching = EditingUtils.getWordAtCursorOrSelection(ic, mLastSelectionStart, mLastSelectionEnd, mWordSeparators); - if (touching != null && touching.word.length() > 1) { + if (touching != null && touching.mWord.length() > 1) { ic.beginBatchEdit(); - if (!applyVoiceAlternatives(touching) && !applyTypedAlternatives(touching)) { + if (!mVoiceConnector.applyVoiceAlternatives(touching) + && !applyTypedAlternatives(touching)) { abortCorrection(true); } else { TextEntryState.selectedForCorrection(); - EditingUtil.underlineWord(ic, touching); + EditingUtils.underlineWord(ic, touching); } ic.endBatchEdit(); } else { abortCorrection(true); - setNextSuggestions(); // Show the punctuation suggestions list + setPunctuationSuggestions(); // Show the punctuation suggestions list } } else { abortCorrection(true); } } - private void setNextSuggestions() { - setSuggestions(mSuggestPuncList, false, false, false); + private void setPunctuationSuggestions() { + setSuggestions(mSuggestPuncList); + setCandidatesViewShown(isCandidateStripVisible()); } private void addToDictionaries(CharSequence suggestion, int frequencyDelta) { @@ -2145,19 +1831,17 @@ public class LatinIME extends InputMethodService || mCorrectionMode == Suggest.CORRECTION_FULL_BIGRAM)) { return; } - if (suggestion != null) { - if (!addToBigramDictionary && mAutoDictionary.isValidWord(suggestion) - || (!mSuggest.isValidWord(suggestion.toString()) - && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) { - mAutoDictionary.addWord(suggestion.toString(), frequencyDelta); - } + if (!addToBigramDictionary && mAutoDictionary.isValidWord(suggestion) + || (!mSuggest.isValidWord(suggestion.toString()) + && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) { + mAutoDictionary.addWord(suggestion.toString(), frequencyDelta); + } - if (mUserBigramDictionary != null) { - CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection(), - mSentenceSeparators); - if (!TextUtils.isEmpty(prevWord)) { - mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString()); - } + if (mUserBigramDictionary != null) { + CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(), + mSentenceSeparators); + if (!TextUtils.isEmpty(prevWord)) { + mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString()); } } } @@ -2187,24 +1871,37 @@ public class LatinIME extends InputMethodService public void revertLastWord(boolean deleteChar) { final int length = mComposing.length(); - if (!mPredicting && length > 0) { + if (!mHasValidSuggestions && length > 0) { final InputConnection ic = getCurrentInputConnection(); - mPredicting = true; - mJustRevertedSeparator = ic.getTextBeforeCursor(1, 0); + mJustReverted = true; + final CharSequence punctuation = ic.getTextBeforeCursor(1, 0); if (deleteChar) ic.deleteSurroundingText(1, 0); int toDelete = mCommittedLength; - CharSequence toTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0); - if (toTheLeft != null && toTheLeft.length() > 0 - && isWordSeparator(toTheLeft.charAt(0))) { + final CharSequence toTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0); + if (!TextUtils.isEmpty(toTheLeft) && isWordSeparator(toTheLeft.charAt(0))) { toDelete--; } ic.deleteSurroundingText(toDelete, 0); - ic.setComposingText(mComposing, 1); - TextEntryState.backspace(); - postUpdateSuggestions(); + // 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) && isWordSeparator(punctuation.charAt(0)) + && !TextUtils.equals(mComposing, toTheLeft)) { + ic.commitText(mComposing, 1); + TextEntryState.acceptedTyped(mComposing); + ic.commitText(punctuation, 1); + TextEntryState.typedCharacter(punctuation.charAt(0), true); + // Clear composing text + mComposing.setLength(0); + } else { + mHasValidSuggestions = true; + ic.setComposingText(mComposing, 1); + TextEntryState.backspace(); + } + mHandler.postUpdateSuggestions(); } else { sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL); - mJustRevertedSeparator = null; + mJustReverted = false; } } @@ -2222,124 +1919,86 @@ public class LatinIME extends InputMethodService } private void sendSpace() { - sendKeyChar((char)KEYCODE_SPACE); - updateShiftKeyState(getCurrentInputEditorInfo()); - //onKey(KEY_SPACE[0], KEY_SPACE); + sendKeyChar((char)Keyboard.CODE_SPACE); + mKeyboardSwitcher.updateShiftState(); } public boolean preferCapitalization() { return mWord.isFirstCharCapitalized(); } + // Notify that language or mode have been changed and toggleLanguage will update KeyboaredID + // according to new language or mode. + public void onRefreshKeyboard() { + toggleLanguage(true, true); + } + + // "reset" and "next" are used only for USE_SPACEBAR_LANGUAGE_SWITCHER. private void toggleLanguage(boolean reset, boolean next) { - if (reset) { - mLanguageSwitcher.reset(); - } else { - if (next) { - mLanguageSwitcher.next(); - } else { - mLanguageSwitcher.prev(); - } + if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()) { + mSubtypeSwitcher.toggleLanguage(reset, next); } - int currentKeyboardMode = mKeyboardSwitcher.getKeyboardMode(); - reloadKeyboards(); - mKeyboardSwitcher.makeKeyboards(true); - mKeyboardSwitcher.setKeyboardMode(currentKeyboardMode, 0, - mEnableVoiceButton && mEnableVoice); - initSuggest(mLanguageSwitcher.getInputLanguage()); - mLanguageSwitcher.persist(); - updateShiftKeyState(getCurrentInputEditorInfo()); + // Reload keyboard because the current language has been changed. + KeyboardSwitcher switcher = mKeyboardSwitcher; + final EditorInfo attribute = getCurrentInputEditorInfo(); + final int mode = initializeInputAttributesAndGetMode((attribute != null) + ? attribute.inputType : 0); + final int imeOptions = (attribute != null) ? attribute.imeOptions : 0; + switcher.loadKeyboard(mode, imeOptions, mVoiceConnector.isVoiceButtonEnabled(), + mVoiceConnector.isVoiceButtonOnPrimary()); + initSuggest(); + switcher.updateShiftState(); } + @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (PREF_SELECTED_LANGUAGES.equals(key)) { - mLanguageSwitcher.loadLocales(sharedPreferences); + mSubtypeSwitcher.onSharedPreferenceChanged(sharedPreferences, key); + if (Settings.PREF_SELECTED_LANGUAGES.equals(key)) { mRefreshKeyboardRequired = true; - } else if (PREF_RECORRECTION_ENABLED.equals(key)) { - mReCorrectionEnabled = sharedPreferences.getBoolean(PREF_RECORRECTION_ENABLED, - getResources().getBoolean(R.bool.default_recorrection_enabled)); - } - } - - public void swipeRight() { - if (LatinKeyboardView.DEBUG_AUTO_PLAY) { - ClipboardManager cm = ((ClipboardManager)getSystemService(CLIPBOARD_SERVICE)); - CharSequence text = cm.getText(); - if (!TextUtils.isEmpty(text)) { - mKeyboardSwitcher.getInputView().startPlaying(text.toString()); - } + } else if (Settings.PREF_RECORRECTION_ENABLED.equals(key)) { + mReCorrectionEnabled = sharedPreferences.getBoolean( + Settings.PREF_RECORRECTION_ENABLED, + mResources.getBoolean(R.bool.default_recorrection_enabled)); } } - public void swipeLeft() { - } - - public void swipeDown() { - handleClose(); - } - - public void swipeUp() { - //launchSettings(); + @Override + public void onSwipeDown() { + if (mConfigSwipeDownDismissKeyboardEnabled) + handleClose(); } + @Override public void onPress(int primaryCode) { if (mKeyboardSwitcher.isVibrateAndSoundFeedbackRequired()) { vibrate(); playKeyClick(primaryCode); } - final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); - if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_SHIFT) { - mShiftKeyState.onPress(); - handleShift(); - } else if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_MODE_CHANGE) { - changeKeyboardMode(); - mSymbolKeyState.onPress(); - mKeyboardSwitcher.setAutoModeSwitchStateMomentary(); + KeyboardSwitcher switcher = mKeyboardSwitcher; + final boolean distinctMultiTouch = switcher.hasDistinctMultitouch(); + if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) { + switcher.onPressShift(); + } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { + switcher.onPressSymbol(); } else { - mShiftKeyState.onOtherKeyPressed(); - mSymbolKeyState.onOtherKeyPressed(); + switcher.onOtherKeyPressed(); } } + @Override public void onRelease(int primaryCode) { + KeyboardSwitcher switcher = mKeyboardSwitcher; // Reset any drag flags in the keyboard - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).keyReleased(); - //vibrate(); - final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); - if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_SHIFT) { - if (mShiftKeyState.isMomentary()) - resetShift(); - mShiftKeyState.onRelease(); - } else if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_MODE_CHANGE) { - // Snap back to the previous keyboard mode if the user chords the mode change key and - // other key, then released the mode change key. - if (mKeyboardSwitcher.isInChordingAutoModeSwitchState()) - changeKeyboardMode(); - mSymbolKeyState.onRelease(); + switcher.keyReleased(); + final boolean distinctMultiTouch = switcher.hasDistinctMultitouch(); + if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) { + switcher.onReleaseShift(); + } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { + switcher.onReleaseSymbol(); } } - private FieldContext makeFieldContext() { - return new FieldContext( - getCurrentInputConnection(), - getCurrentInputEditorInfo(), - mLanguageSwitcher.getInputLanguage(), - mLanguageSwitcher.getEnabledLanguages()); - } - - private boolean fieldCanDoVoice(FieldContext fieldContext) { - return !mPasswordText - && mVoiceInput != null - && !mVoiceInput.isBlacklistedField(fieldContext); - } - - private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) { - return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext) - && !(attribute != null - && IME_OPTION_NO_MICROPHONE.equals(attribute.privateImeOptions)) - && SpeechRecognizer.isRecognitionAvailable(this); - } // receive ringer mode changes to detect silent mode private BroadcastReceiver mReceiver = new BroadcastReceiver() { @@ -2372,13 +2031,13 @@ public class LatinIME extends InputMethodService // FIXME: These should be triggered after auto-repeat logic int sound = AudioManager.FX_KEYPRESS_STANDARD; switch (primaryCode) { - case Keyboard.KEYCODE_DELETE: + case Keyboard.CODE_DELETE: sound = AudioManager.FX_KEYPRESS_DELETE; break; - case KEYCODE_ENTER: + case Keyboard.CODE_ENTER: sound = AudioManager.FX_KEYPRESS_RETURN; break; - case KEYCODE_SPACE: + case Keyboard.CODE_SPACE: sound = AudioManager.FX_KEYPRESS_SPACEBAR; break; } @@ -2386,48 +2045,28 @@ public class LatinIME extends InputMethodService } } - private void vibrate() { + public void vibrate() { if (!mVibrateOn) { return; } - if (mKeyboardSwitcher.getInputView() != null) { - mKeyboardSwitcher.getInputView().performHapticFeedback( + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView != null) { + inputView.performHapticFeedback( HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); } } - private void checkTutorial(String privateImeOptions) { - if (privateImeOptions == null) return; - if (privateImeOptions.equals("com.android.setupwizard:ShowTutorial")) { - if (mTutorial == null) startTutorial(); - } else if (privateImeOptions.equals("com.android.setupwizard:HideTutorial")) { - if (mTutorial != null) { - if (mTutorial.close()) { - mTutorial = null; - } - } - } - } - - private void startTutorial() { - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_TUTORIAL), 500); - } - - /* package */ void tutorialDone() { - mTutorial = null; - } - - /* package */ void promoteToUserDictionary(String word, int frequency) { + public void promoteToUserDictionary(String word, int frequency) { if (mUserDictionary.isValidWord(word)) return; mUserDictionary.addWord(word, frequency); } - /* package */ WordComposer getCurrentWord() { + public WordComposer getCurrentWord() { return mWord; } - /* package */ boolean getPopupOn() { + public boolean getPopupOn() { return mPopupOn; } @@ -2445,22 +2084,34 @@ public class LatinIME extends InputMethodService } } - private void updateAutoTextEnabled(Locale systemLocale) { + private void updateAutoTextEnabled() { if (mSuggest == null) return; - boolean different = - !systemLocale.getLanguage().equalsIgnoreCase(mInputLocale.substring(0, 2)); - mSuggest.setAutoTextEnabled(!different && mQuickFixes); + mSuggest.setAutoTextEnabled(mQuickFixes + && SubtypeSwitcher.getInstance().isSystemLanguageSameAsInputLanguage()); + } + + private void updateSuggestionVisibility(SharedPreferences prefs) { + final Resources res = mResources; + final String suggestionVisiblityStr = prefs.getString( + Settings.PREF_SHOW_SUGGESTIONS_SETTING, + res.getString(R.string.prefs_suggestion_visibility_default_value)); + for (int visibility : SUGGESTION_VISIBILITY_VALUE_ARRAY) { + if (suggestionVisiblityStr.equals(res.getString(visibility))) { + mSuggestionVisibility = visibility; + break; + } + } } protected void launchSettings() { - launchSettings(LatinIMESettings.class); + launchSettings(Settings.class); } public void launchDebugSettings() { - launchSettings(LatinIMEDebugSettings.class); + launchSettings(DebugSettings.class); } - protected void launchSettings (Class<? extends PreferenceActivity> settingsClass) { + protected void launchSettings(Class<? extends PreferenceActivity> settingsClass) { handleClose(); Intent intent = new Intent(); intent.setClass(LatinIME.this, settingsClass); @@ -2468,72 +2119,154 @@ public class LatinIME extends InputMethodService startActivity(intent); } - private void loadSettings() { + private void loadSettings(EditorInfo attribute) { // Get the settings preferences - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - mVibrateOn = sp.getBoolean(PREF_VIBRATE_ON, false); - mSoundOn = sp.getBoolean(PREF_SOUND_ON, false); - mPopupOn = sp.getBoolean(PREF_POPUP_ON, - mResources.getBoolean(R.bool.default_popup_preview)); - mAutoCap = sp.getBoolean(PREF_AUTO_CAP, true); - mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true); - mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false); - mHasUsedVoiceInputUnsupportedLocale = - sp.getBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, false); - - // Get the current list of supported locales and check the current locale against that - // list. We cache this value so as not to check it every time the user starts a voice - // input. Because this method is called by onStartInputView, this should mean that as - // long as the locale doesn't change while the user is keeping the IME open, the - // value should never be stale. - String supportedLocalesString = SettingsUtil.getSettingsString( - getContentResolver(), - SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES, - DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES); - ArrayList<String> voiceInputSupportedLocales = - newArrayList(supportedLocalesString.split("\\s+")); - - mLocaleSupportedForVoiceInput = voiceInputSupportedLocales.contains(mInputLocale); - - mShowSuggestions = sp.getBoolean(PREF_SHOW_SUGGESTIONS, true); - - if (VOICE_INSTALLED) { - final String voiceMode = sp.getString(PREF_VOICE_MODE, - getString(R.string.voice_mode_main)); - boolean enableVoice = !voiceMode.equals(getString(R.string.voice_mode_off)) - && mEnableVoiceButton; - boolean voiceOnPrimary = voiceMode.equals(getString(R.string.voice_mode_main)); - if (mKeyboardSwitcher != null && - (enableVoice != mEnableVoice || voiceOnPrimary != mVoiceOnPrimary)) { - mKeyboardSwitcher.setVoiceMode(enableVoice, voiceOnPrimary); + final SharedPreferences prefs = mPrefs; + Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); + mVibrateOn = vibrator != null && vibrator.hasVibrator() + && prefs.getBoolean(Settings.PREF_VIBRATE_ON, false); + mSoundOn = prefs.getBoolean(Settings.PREF_SOUND_ON, false); + mPopupOn = prefs.getBoolean(Settings.PREF_POPUP_ON, + mResources.getBoolean(R.bool.config_default_popup_preview)); + mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, true); + mQuickFixes = isQuickFixesEnabled(prefs); + + mAutoCorrectEnabled = isAutoCorrectEnabled(prefs); + mBigramSuggestionEnabled = mAutoCorrectEnabled && isBigramSuggestionEnabled(prefs); + loadAndSetAutoCorrectionThreshold(prefs); + + mVoiceConnector.loadSettings(attribute, prefs); + + updateCorrectionMode(); + updateAutoTextEnabled(); + updateSuggestionVisibility(prefs); + SubtypeSwitcher.getInstance().loadSettings(); + } + + /** + * Load Auto correction threshold from SharedPreferences, and modify mSuggest's threshold. + */ + private void loadAndSetAutoCorrectionThreshold(SharedPreferences sp) { + // When mSuggest is not initialized, cannnot modify mSuggest's threshold. + if (mSuggest == null) return; + // When auto correction setting is turned off, the threshold is ignored. + if (!isAutoCorrectEnabled(sp)) return; + + final String currentAutoCorrectionSetting = sp.getString( + Settings.PREF_AUTO_CORRECTION_THRESHOLD, + mResources.getString(R.string.auto_correction_threshold_mode_index_modest)); + final String[] autoCorrectionThresholdValues = mResources.getStringArray( + R.array.auto_correction_threshold_values); + // When autoCrrectionThreshold is greater than 1.0, auto correction is virtually turned off. + double autoCorrectionThreshold = Double.MAX_VALUE; + try { + final int arrayIndex = Integer.valueOf(currentAutoCorrectionSetting); + if (arrayIndex >= 0 && arrayIndex < autoCorrectionThresholdValues.length) { + autoCorrectionThreshold = Double.parseDouble( + autoCorrectionThresholdValues[arrayIndex]); } - mEnableVoice = enableVoice; - mVoiceOnPrimary = voiceOnPrimary; + } catch (NumberFormatException e) { + // Whenever the threshold settings are correct, never come here. + autoCorrectionThreshold = Double.MAX_VALUE; + Log.w(TAG, "Cannot load auto correction threshold setting." + + " currentAutoCorrectionSetting: " + currentAutoCorrectionSetting + + ", autoCorrectionThresholdValues: " + + Arrays.toString(autoCorrectionThresholdValues)); } - mAutoCorrectEnabled = sp.getBoolean(PREF_AUTO_COMPLETE, - mResources.getBoolean(R.bool.enable_autocorrect)) & mShowSuggestions; - //mBigramSuggestionEnabled = sp.getBoolean( - // PREF_BIGRAM_SUGGESTIONS, true) & mShowSuggestions; - updateCorrectionMode(); - updateAutoTextEnabled(mResources.getConfiguration().locale); - mLanguageSwitcher.loadLocales(sp); + // TODO: This should be refactored : + // setAutoCorrectionThreshold should be called outside of this method. + mSuggest.setAutoCorrectionThreshold(autoCorrectionThreshold); + } + + private boolean isQuickFixesEnabled(SharedPreferences sp) { + final boolean showQuickFixesOption = mResources.getBoolean( + R.bool.config_enable_quick_fixes_option); + if (!showQuickFixesOption) { + return isAutoCorrectEnabled(sp); + } + return sp.getBoolean(Settings.PREF_QUICK_FIXES, mResources.getBoolean( + R.bool.config_default_quick_fixes)); + } + + private boolean isAutoCorrectEnabled(SharedPreferences sp) { + final String currentAutoCorrectionSetting = sp.getString( + Settings.PREF_AUTO_CORRECTION_THRESHOLD, + mResources.getString(R.string.auto_correction_threshold_mode_index_modest)); + final String autoCorrectionOff = mResources.getString( + R.string.auto_correction_threshold_mode_index_off); + return !currentAutoCorrectionSetting.equals(autoCorrectionOff); + } + + private boolean isBigramSuggestionEnabled(SharedPreferences sp) { + final boolean showBigramSuggestionsOption = mResources.getBoolean( + R.bool.config_enable_bigram_suggestions_option); + if (!showBigramSuggestionsOption) { + return isAutoCorrectEnabled(sp); + } + return sp.getBoolean(Settings.PREF_BIGRAM_SUGGESTIONS, mResources.getBoolean( + R.bool.config_default_bigram_suggestions)); } private void initSuggestPuncList() { - mSuggestPuncList = new ArrayList<CharSequence>(); - mSuggestPuncs = mResources.getString(R.string.suggested_punctuations); - if (mSuggestPuncs != null) { - for (int i = 0; i < mSuggestPuncs.length(); i++) { - mSuggestPuncList.add(mSuggestPuncs.subSequence(i, i + 1)); + if (mSuggestPuncs != null || mSuggestPuncList != null) + return; + SuggestedWords.Builder builder = new SuggestedWords.Builder(); + String puncs = mResources.getString(R.string.suggested_punctuations); + if (puncs != null) { + for (int i = 0; i < puncs.length(); i++) { + builder.addWord(puncs.subSequence(i, i + 1)); } } + mSuggestPuncList = builder.build(); + mSuggestPuncs = puncs; } private boolean isSuggestedPunctuation(int code) { return mSuggestPuncs.contains(String.valueOf((char)code)); } + private void showSubtypeSelectorAndSettings() { + showOptionsMenuInternal(new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface di, int position) { + di.dismiss(); + switch (position) { + case POS_SETTINGS: + launchSettings(); + break; + case POS_METHOD: + Intent intent = new Intent( + android.provider.Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED + | Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.putExtra(android.provider.Settings.EXTRA_INPUT_METHOD_ID, + mInputMethodId); + startActivity(intent); + break; + } + } + }); + } + private void showOptionsMenu() { + showOptionsMenuInternal(new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface di, int position) { + di.dismiss(); + switch (position) { + case POS_SETTINGS: + launchSettings(); + break; + case POS_METHOD: + mImm.showInputMethodPicker(); + break; + } + } + }); + } + + private void showOptionsMenuInternal(DialogInterface.OnClickListener listener) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setCancelable(true); builder.setIcon(R.drawable.ic_dialog_keyboard); @@ -2541,24 +2274,10 @@ public class LatinIME extends InputMethodService CharSequence itemSettings = getString(R.string.english_ime_settings); CharSequence itemInputMethod = getString(R.string.selectInputMethod); builder.setItems(new CharSequence[] { - itemInputMethod, itemSettings}, - new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface di, int position) { - di.dismiss(); - switch (position) { - case POS_SETTINGS: - launchSettings(); - break; - case POS_METHOD: - ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) - .showInputMethodPicker(); - break; - } - } - }); + itemInputMethod, itemSettings}, listener); builder.setTitle(mResources.getString(R.string.english_ime_input_options)); mOptionsDialog = builder.create(); + mOptionsDialog.setCanceledOnTouchOutside(true); Window window = mOptionsDialog.getWindow(); WindowManager.LayoutParams lp = window.getAttributes(); lp.token = mKeyboardSwitcher.getInputView().getWindowToken(); @@ -2568,22 +2287,6 @@ public class LatinIME extends InputMethodService mOptionsDialog.show(); } - public void changeKeyboardMode() { - mKeyboardSwitcher.toggleSymbols(); - if (mCapsLock && mKeyboardSwitcher.isAlphabetMode()) { - mKeyboardSwitcher.setShiftLocked(mCapsLock); - } - - updateShiftKeyState(getCurrentInputEditorInfo()); - } - - public static <E> ArrayList<E> newArrayList(E... elements) { - int capacity = (elements.length * 110) / 100 + 5; - ArrayList<E> list = new ArrayList<E>(capacity); - Collections.addAll(list, elements); - return list; - } - @Override protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { super.dump(fd, fout, args); @@ -2591,14 +2294,13 @@ public class LatinIME extends InputMethodService final Printer p = new PrintWriterPrinter(fout); p.println("LatinIME state :"); p.println(" Keyboard mode = " + mKeyboardSwitcher.getKeyboardMode()); - p.println(" mCapsLock=" + mCapsLock); p.println(" mComposing=" + mComposing.toString()); - p.println(" mPredictionOn=" + mPredictionOn); + p.println(" mIsSuggestionsRequested=" + mIsSettingsSuggestionStripOn); p.println(" mCorrectionMode=" + mCorrectionMode); - p.println(" mPredicting=" + mPredicting); + p.println(" mHasValidSuggestions=" + mHasValidSuggestions); p.println(" mAutoCorrectOn=" + mAutoCorrectOn); p.println(" mAutoSpace=" + mAutoSpace); - p.println(" mCompletionOn=" + mCompletionOn); + p.println(" mApplicationSpecifiedCompletionOn=" + mApplicationSpecifiedCompletionOn); p.println(" TextEntryState.state=" + TextEntryState.getState()); p.println(" mSoundOn=" + mSoundOn); p.println(" mVibrateOn=" + mVibrateOn); @@ -2623,7 +2325,8 @@ public class LatinIME extends InputMethodService System.out.println("CPS = " + ((CPS_BUFFER_SIZE * 1000f) / total)); } - public void onAutoCompletionStateChanged(boolean isAutoCompletion) { - mKeyboardSwitcher.onAutoCompletionStateChanged(isAutoCompletion); + @Override + public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) { + SubtypeSwitcher.getInstance().updateSubtype(subtype); } } diff --git a/java/src/com/android/inputmethod/latin/LatinIMESettings.java b/java/src/com/android/inputmethod/latin/LatinIMESettings.java deleted file mode 100644 index ffff33da2..000000000 --- a/java/src/com/android/inputmethod/latin/LatinIMESettings.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * 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 - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import java.util.ArrayList; -import java.util.Locale; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.backup.BackupManager; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.ListPreference; -import android.preference.PreferenceActivity; -import android.preference.PreferenceGroup; -import android.speech.SpeechRecognizer; -import android.text.AutoText; -import android.util.Log; - -import com.android.inputmethod.voice.SettingsUtil; -import com.android.inputmethod.voice.VoiceInputLogger; - -public class LatinIMESettings extends PreferenceActivity - implements SharedPreferences.OnSharedPreferenceChangeListener, - DialogInterface.OnDismissListener { - - private static final String QUICK_FIXES_KEY = "quick_fixes"; - private static final String PREDICTION_SETTINGS_KEY = "prediction_settings"; - private static final String VOICE_SETTINGS_KEY = "voice_mode"; - /* package */ static final String PREF_SETTINGS_KEY = "settings_key"; - - private static final String TAG = "LatinIMESettings"; - - // Dialog ids - private static final int VOICE_INPUT_CONFIRM_DIALOG = 0; - - private CheckBoxPreference mQuickFixes; - private ListPreference mVoicePreference; - private ListPreference mSettingsKeyPreference; - private boolean mVoiceOn; - - private VoiceInputLogger mLogger; - - private boolean mOkClicked = false; - private String mVoiceModeOff; - - @Override - protected void onCreate(Bundle icicle) { - super.onCreate(icicle); - addPreferencesFromResource(R.xml.prefs); - mQuickFixes = (CheckBoxPreference) findPreference(QUICK_FIXES_KEY); - mVoicePreference = (ListPreference) findPreference(VOICE_SETTINGS_KEY); - mSettingsKeyPreference = (ListPreference) findPreference(PREF_SETTINGS_KEY); - SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); - prefs.registerOnSharedPreferenceChangeListener(this); - - mVoiceModeOff = getString(R.string.voice_mode_off); - mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); - mLogger = VoiceInputLogger.getLogger(this); - } - - @Override - protected void onResume() { - super.onResume(); - int autoTextSize = AutoText.getSize(getListView()); - if (autoTextSize < 1) { - ((PreferenceGroup) findPreference(PREDICTION_SETTINGS_KEY)) - .removePreference(mQuickFixes); - } - if (!LatinIME.VOICE_INSTALLED - || !SpeechRecognizer.isRecognitionAvailable(this)) { - getPreferenceScreen().removePreference(mVoicePreference); - } else { - updateVoiceModeSummary(); - } - updateSettingsKeySummary(); - } - - @Override - protected void onDestroy() { - getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( - this); - super.onDestroy(); - } - - public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { - (new BackupManager(this)).dataChanged(); - // If turning on voice input, show dialog - if (key.equals(VOICE_SETTINGS_KEY) && !mVoiceOn) { - if (!prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff) - .equals(mVoiceModeOff)) { - showVoiceConfirmation(); - } - } - mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); - updateVoiceModeSummary(); - updateSettingsKeySummary(); - } - - private void updateSettingsKeySummary() { - mSettingsKeyPreference.setSummary( - getResources().getStringArray(R.array.settings_key_modes) - [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]); - } - - private void showVoiceConfirmation() { - mOkClicked = false; - showDialog(VOICE_INPUT_CONFIRM_DIALOG); - } - - private void updateVoiceModeSummary() { - mVoicePreference.setSummary( - getResources().getStringArray(R.array.voice_input_modes_summary) - [mVoicePreference.findIndexOfValue(mVoicePreference.getValue())]); - } - - @Override - protected Dialog onCreateDialog(int id) { - switch (id) { - case VOICE_INPUT_CONFIRM_DIALOG: - DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - if (whichButton == DialogInterface.BUTTON_NEGATIVE) { - mVoicePreference.setValue(mVoiceModeOff); - mLogger.settingsWarningDialogCancel(); - } else if (whichButton == DialogInterface.BUTTON_POSITIVE) { - mOkClicked = true; - mLogger.settingsWarningDialogOk(); - } - updateVoicePreference(); - } - }; - AlertDialog.Builder builder = new AlertDialog.Builder(this) - .setTitle(R.string.voice_warning_title) - .setPositiveButton(android.R.string.ok, listener) - .setNegativeButton(android.R.string.cancel, listener); - - // Get the current list of supported locales and check the current locale against - // that list, to decide whether to put a warning that voice input will not work in - // the current language as part of the pop-up confirmation dialog. - String supportedLocalesString = SettingsUtil.getSettingsString( - getContentResolver(), - SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES, - LatinIME.DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES); - ArrayList<String> voiceInputSupportedLocales = - LatinIME.newArrayList(supportedLocalesString.split("\\s+")); - boolean localeSupported = voiceInputSupportedLocales.contains( - Locale.getDefault().toString()); - - if (localeSupported) { - String message = getString(R.string.voice_warning_may_not_understand) + "\n\n" + - getString(R.string.voice_hint_dialog_message); - builder.setMessage(message); - } else { - String message = getString(R.string.voice_warning_locale_not_supported) + - "\n\n" + getString(R.string.voice_warning_may_not_understand) + "\n\n" + - getString(R.string.voice_hint_dialog_message); - builder.setMessage(message); - } - - AlertDialog dialog = builder.create(); - dialog.setOnDismissListener(this); - mLogger.settingsWarningDialogShown(); - return dialog; - default: - Log.e(TAG, "unknown dialog " + id); - return null; - } - } - - public void onDismiss(DialogInterface dialog) { - mLogger.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); - if (isChecked) { - mLogger.voiceInputSettingEnabled(); - } else { - mLogger.voiceInputSettingDisabled(); - } - } -} diff --git a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java deleted file mode 100644 index 85ecaee50..000000000 --- a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java +++ /dev/null @@ -1,171 +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.latin; - -import android.view.inputmethod.InputMethodManager; - -import android.content.Context; -import android.os.AsyncTask; -import android.text.format.DateUtils; -import android.util.Log; - -public class LatinIMEUtil { - - /** - * Cancel an {@link AsyncTask}. - * - * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this - * task should be interrupted; otherwise, in-progress tasks are allowed - * to complete. - */ - public static void cancelTask(AsyncTask<?, ?, ?> task, boolean mayInterruptIfRunning) { - if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) { - task.cancel(mayInterruptIfRunning); - } - } - - public static class GCUtils { - private static final String TAG = "GCUtils"; - public static final int GC_TRY_COUNT = 2; - // GC_TRY_LOOP_MAX is used for the hard limit of GC wait, - // GC_TRY_LOOP_MAX should be greater than GC_TRY_COUNT. - public static final int GC_TRY_LOOP_MAX = 5; - private static final long GC_INTERVAL = DateUtils.SECOND_IN_MILLIS; - private static GCUtils sInstance = new GCUtils(); - private int mGCTryCount = 0; - - public static GCUtils getInstance() { - return sInstance; - } - - public void reset() { - mGCTryCount = 0; - } - - public boolean tryGCOrWait(String metaData, Throwable t) { - if (mGCTryCount == 0) { - System.gc(); - } - if (++mGCTryCount > GC_TRY_COUNT) { - LatinImeLogger.logOnException(metaData, t); - return false; - } else { - try { - Thread.sleep(GC_INTERVAL); - return true; - } catch (InterruptedException e) { - Log.e(TAG, "Sleep was interrupted."); - LatinImeLogger.logOnException(metaData, t); - return false; - } - } - } - } - - public static boolean hasMultipleEnabledIMEs(Context context) { - return ((InputMethodManager) context.getSystemService( - Context.INPUT_METHOD_SERVICE)).getEnabledInputMethodList().size() > 1; - } - - /* package */ static class RingCharBuffer { - private static RingCharBuffer sRingCharBuffer = new RingCharBuffer(); - private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC'; - private static final int INVALID_COORDINATE = -2; - /* package */ static final int BUFSIZE = 20; - private Context mContext; - private boolean mEnabled = false; - private int mEnd = 0; - /* package */ int mLength = 0; - private char[] mCharBuf = new char[BUFSIZE]; - private int[] mXBuf = new int[BUFSIZE]; - private int[] mYBuf = new int[BUFSIZE]; - - private RingCharBuffer() { - } - public static RingCharBuffer getInstance() { - return sRingCharBuffer; - } - public static RingCharBuffer init(Context context, boolean enabled) { - sRingCharBuffer.mContext = context; - sRingCharBuffer.mEnabled = enabled; - return sRingCharBuffer; - } - private int normalize(int in) { - int ret = in % BUFSIZE; - return ret < 0 ? ret + BUFSIZE : ret; - } - public void push(char c, int x, int y) { - if (!mEnabled) return; - mCharBuf[mEnd] = c; - mXBuf[mEnd] = x; - mYBuf[mEnd] = y; - mEnd = normalize(mEnd + 1); - if (mLength < BUFSIZE) { - ++mLength; - } - } - public char pop() { - if (mLength < 1) { - return PLACEHOLDER_DELIMITER_CHAR; - } else { - mEnd = normalize(mEnd - 1); - --mLength; - return mCharBuf[mEnd]; - } - } - public char getLastChar() { - if (mLength < 1) { - return PLACEHOLDER_DELIMITER_CHAR; - } else { - return mCharBuf[normalize(mEnd - 1)]; - } - } - public int getPreviousX(char c, int back) { - int index = normalize(mEnd - 2 - back); - if (mLength <= back - || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) { - return INVALID_COORDINATE; - } else { - return mXBuf[index]; - } - } - public int getPreviousY(char c, int back) { - int index = normalize(mEnd - 2 - back); - if (mLength <= back - || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) { - return INVALID_COORDINATE; - } else { - return mYBuf[index]; - } - } - public String getLastString() { - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < mLength; ++i) { - char c = mCharBuf[normalize(mEnd - 1 - i)]; - if (!((LatinIME)mContext).isWordSeparator(c)) { - sb.append(c); - } else { - break; - } - } - return sb.reverse().toString(); - } - public void reset() { - mLength = 0; - } - } -} diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index a8ab9cc98..aaecfffdd 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -16,19 +16,23 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.latin.Dictionary.DataType; import android.content.Context; import android.content.SharedPreferences; -import android.inputmethodservice.Keyboard; + import java.util.List; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { + public static boolean sDBG = false; + + @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { } - public static void init(Context context) { + public static void init(Context context, SharedPreferences prefs) { } public static void commit() { @@ -68,4 +72,6 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void onSetKeyboard(Keyboard kb) { } + public static void onPrintAllUsabilityStudyLogs() { + } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java deleted file mode 100644 index fbba55bad..000000000 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ /dev/null @@ -1,1023 +0,0 @@ -/* - * 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 - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.content.res.XmlResourceParser; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.ColorFilter; -import android.graphics.Paint; -import android.graphics.Paint.Align; -import android.graphics.PixelFormat; -import android.graphics.PorterDuff; -import android.graphics.Rect; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.inputmethodservice.Keyboard; -import android.text.TextPaint; -import android.util.Log; -import android.view.ViewConfiguration; -import android.view.inputmethod.EditorInfo; - -import java.util.List; -import java.util.Locale; - -public class LatinKeyboard extends Keyboard { - - private static final boolean DEBUG_PREFERRED_LETTER = false; - private static final String TAG = "LatinKeyboard"; - private static final int OPACITY_FULLY_OPAQUE = 255; - private static final int SPACE_LED_LENGTH_PERCENT = 80; - - private Drawable mShiftLockIcon; - private Drawable mShiftLockPreviewIcon; - private Drawable mOldShiftIcon; - private Drawable mSpaceIcon; - private Drawable mSpaceAutoCompletionIndicator; - private Drawable mSpacePreviewIcon; - private Drawable mMicIcon; - private Drawable mMicPreviewIcon; - private Drawable m123MicIcon; - private Drawable m123MicPreviewIcon; - private final Drawable mButtonArrowLeftIcon; - private final Drawable mButtonArrowRightIcon; - private Key mShiftKey; - private Key mEnterKey; - private Key mF1Key; - private final Drawable mHintIcon; - private Key mSpaceKey; - private Key m123Key; - private final int NUMBER_HINT_COUNT = 10; - private Key[] mNumberHintKeys; - private Drawable[] mNumberHintIcons = new Drawable[NUMBER_HINT_COUNT]; - private final int[] mSpaceKeyIndexArray; - private int mSpaceDragStartX; - private int mSpaceDragLastDiff; - private Locale mLocale; - private LanguageSwitcher mLanguageSwitcher; - private final Resources mRes; - private final Context mContext; - private int mMode; - // Whether this keyboard has voice icon on it - private boolean mHasVoiceButton; - // Whether voice icon is enabled at all - private boolean mVoiceEnabled; - private final boolean mIsAlphaKeyboard; - private CharSequence m123Label; - private boolean mCurrentlyInSpace; - private SlidingLocaleDrawable mSlidingLocaleIcon; - private int[] mPrefLetterFrequencies; - private int mPrefLetter; - private int mPrefLetterX; - private int mPrefLetterY; - private int mPrefDistance; - - // TODO: generalize for any keyboardId - private boolean mIsBlackSym; - - // TODO: remove this attribute when either Keyboard.mDefaultVerticalGap or Key.parent becomes - // non-private. - private final int mVerticalGap; - - private static final int SHIFT_OFF = 0; - private static final int SHIFT_ON = 1; - private static final int SHIFT_LOCKED = 2; - - private int mShiftState = SHIFT_OFF; - - private static final float SPACEBAR_DRAG_THRESHOLD = 0.8f; - private static final float OVERLAP_PERCENTAGE_LOW_PROB = 0.70f; - private static final float OVERLAP_PERCENTAGE_HIGH_PROB = 0.85f; - // Minimum width of space key preview (proportional to keyboard width) - private static final float SPACEBAR_POPUP_MIN_RATIO = 0.4f; - // Height in space key the language name will be drawn. (proportional to space key height) - private 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, - // its short language name will be used instead. - private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f; - - private static int sSpacebarVerticalCorrection; - - public LatinKeyboard(Context context, int xmlLayoutResId) { - this(context, xmlLayoutResId, 0); - } - - public LatinKeyboard(Context context, int xmlLayoutResId, int mode) { - super(context, xmlLayoutResId, mode); - final Resources res = context.getResources(); - mContext = context; - mMode = mode; - mRes = res; - mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); - mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); - setDefaultBounds(mShiftLockPreviewIcon); - mSpaceIcon = res.getDrawable(R.drawable.sym_keyboard_space); - mSpaceAutoCompletionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led); - mSpacePreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_space); - mMicIcon = res.getDrawable(R.drawable.sym_keyboard_mic); - mMicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_mic); - setDefaultBounds(mMicPreviewIcon); - mButtonArrowLeftIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_left); - mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right); - m123MicIcon = res.getDrawable(R.drawable.sym_keyboard_123_mic); - m123MicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_123_mic); - mHintIcon = res.getDrawable(R.drawable.hint_popup); - setDefaultBounds(m123MicPreviewIcon); - sSpacebarVerticalCorrection = res.getDimensionPixelOffset( - R.dimen.spacebar_vertical_correction); - mIsAlphaKeyboard = xmlLayoutResId == R.xml.kbd_qwerty - || xmlLayoutResId == R.xml.kbd_qwerty_black; - // The index of space key is available only after Keyboard constructor has finished. - mSpaceKeyIndexArray = new int[] { indexOf(LatinIME.KEYCODE_SPACE) }; - initializeNumberHintResources(context); - // TODO remove this initialization after cleanup - mVerticalGap = super.getVerticalGap(); - } - - private void initializeNumberHintResources(Context context) { - final Resources res = context.getResources(); - mNumberHintIcons[0] = res.getDrawable(R.drawable.keyboard_hint_0); - mNumberHintIcons[1] = res.getDrawable(R.drawable.keyboard_hint_1); - mNumberHintIcons[2] = res.getDrawable(R.drawable.keyboard_hint_2); - mNumberHintIcons[3] = res.getDrawable(R.drawable.keyboard_hint_3); - mNumberHintIcons[4] = res.getDrawable(R.drawable.keyboard_hint_4); - mNumberHintIcons[5] = res.getDrawable(R.drawable.keyboard_hint_5); - mNumberHintIcons[6] = res.getDrawable(R.drawable.keyboard_hint_6); - mNumberHintIcons[7] = res.getDrawable(R.drawable.keyboard_hint_7); - mNumberHintIcons[8] = res.getDrawable(R.drawable.keyboard_hint_8); - mNumberHintIcons[9] = res.getDrawable(R.drawable.keyboard_hint_9); - } - - @Override - protected Key createKeyFromXml(Resources res, Row parent, int x, int y, - XmlResourceParser parser) { - Key key = new LatinKey(res, parent, x, y, parser); - switch (key.codes[0]) { - case LatinIME.KEYCODE_ENTER: - mEnterKey = key; - break; - case LatinKeyboardView.KEYCODE_F1: - mF1Key = key; - break; - case LatinIME.KEYCODE_SPACE: - mSpaceKey = key; - break; - case KEYCODE_MODE_CHANGE: - m123Key = key; - m123Label = key.label; - break; - } - - // For number hints on the upper-right corner of key - if (mNumberHintKeys == null) { - // NOTE: This protected method is being called from the base class constructor before - // mNumberHintKeys gets initialized. - mNumberHintKeys = new Key[NUMBER_HINT_COUNT]; - } - int hintNumber = -1; - if (LatinKeyboardBaseView.isNumberAtLeftmostPopupChar(key)) { - hintNumber = key.popupCharacters.charAt(0) - '0'; - } else if (LatinKeyboardBaseView.isNumberAtRightmostPopupChar(key)) { - hintNumber = key.popupCharacters.charAt(key.popupCharacters.length() - 1) - '0'; - } - if (hintNumber >= 0 && hintNumber <= 9) { - mNumberHintKeys[hintNumber] = key; - } - - return key; - } - - void setImeOptions(Resources res, int mode, int options) { - mMode = mode; - // TODO should clean up this method - if (mEnterKey != null) { - // Reset some of the rarely used attributes. - mEnterKey.popupCharacters = null; - mEnterKey.popupResId = 0; - mEnterKey.text = null; - switch (options&(EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) { - case EditorInfo.IME_ACTION_GO: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_go_key); - break; - case EditorInfo.IME_ACTION_NEXT: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_next_key); - break; - case EditorInfo.IME_ACTION_DONE: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_done_key); - break; - case EditorInfo.IME_ACTION_SEARCH: - mEnterKey.iconPreview = res.getDrawable( - R.drawable.sym_keyboard_feedback_search); - mEnterKey.icon = res.getDrawable(mIsBlackSym ? - R.drawable.sym_bkeyboard_search : R.drawable.sym_keyboard_search); - mEnterKey.label = null; - break; - case EditorInfo.IME_ACTION_SEND: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_send_key); - break; - default: - if (mode == KeyboardSwitcher.MODE_IM) { - mEnterKey.icon = mHintIcon; - mEnterKey.iconPreview = null; - mEnterKey.label = ":-)"; - mEnterKey.text = ":-) "; - mEnterKey.popupResId = R.xml.popup_smileys; - } else { - mEnterKey.iconPreview = res.getDrawable( - R.drawable.sym_keyboard_feedback_return); - mEnterKey.icon = res.getDrawable(mIsBlackSym ? - R.drawable.sym_bkeyboard_return : R.drawable.sym_keyboard_return); - mEnterKey.label = null; - } - break; - } - // Set the initial size of the preview icon - if (mEnterKey.iconPreview != null) { - setDefaultBounds(mEnterKey.iconPreview); - } - } - } - - void enableShiftLock() { - int index = getShiftKeyIndex(); - if (index >= 0) { - mShiftKey = getKeys().get(index); - if (mShiftKey instanceof LatinKey) { - ((LatinKey)mShiftKey).enableShiftLock(); - } - mOldShiftIcon = mShiftKey.icon; - } - } - - void setShiftLocked(boolean shiftLocked) { - if (mShiftKey != null) { - if (shiftLocked) { - mShiftKey.on = true; - mShiftKey.icon = mShiftLockIcon; - mShiftState = SHIFT_LOCKED; - } else { - mShiftKey.on = false; - mShiftKey.icon = mShiftLockIcon; - mShiftState = SHIFT_ON; - } - } - } - - boolean isShiftLocked() { - return mShiftState == SHIFT_LOCKED; - } - - @Override - public boolean setShifted(boolean shiftState) { - boolean shiftChanged = false; - if (mShiftKey != null) { - if (shiftState == false) { - shiftChanged = mShiftState != SHIFT_OFF; - mShiftState = SHIFT_OFF; - mShiftKey.on = false; - mShiftKey.icon = mOldShiftIcon; - } else { - if (mShiftState == SHIFT_OFF) { - shiftChanged = mShiftState == SHIFT_OFF; - mShiftState = SHIFT_ON; - mShiftKey.icon = mShiftLockIcon; - } - } - } else { - return super.setShifted(shiftState); - } - return shiftChanged; - } - - @Override - public boolean isShifted() { - if (mShiftKey != null) { - return mShiftState != SHIFT_OFF; - } else { - return super.isShifted(); - } - } - - /* package */ boolean isAlphaKeyboard() { - return mIsAlphaKeyboard; - } - - public void setColorOfSymbolIcons(boolean isAutoCompletion, boolean isBlack) { - mIsBlackSym = isBlack; - if (isBlack) { - mShiftLockIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_shift_locked); - mSpaceIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_space); - mMicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic); - m123MicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_123_mic); - } else { - mShiftLockIcon = mRes.getDrawable(R.drawable.sym_keyboard_shift_locked); - mSpaceIcon = mRes.getDrawable(R.drawable.sym_keyboard_space); - mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic); - m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic); - } - updateDynamicKeys(); - if (mSpaceKey != null) { - updateSpaceBarForLocale(isAutoCompletion, isBlack); - } - updateNumberHintKeys(); - } - - private void setDefaultBounds(Drawable drawable) { - drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); - } - - public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) { - mHasVoiceButton = hasVoiceButton; - mVoiceEnabled = hasVoice; - updateDynamicKeys(); - } - - private void updateDynamicKeys() { - update123Key(); - updateF1Key(); - } - - private void update123Key() { - // Update KEYCODE_MODE_CHANGE key only on alphabet mode, not on symbol mode. - if (m123Key != null && mIsAlphaKeyboard) { - if (mVoiceEnabled && !mHasVoiceButton) { - m123Key.icon = m123MicIcon; - m123Key.iconPreview = m123MicPreviewIcon; - m123Key.label = null; - } else { - m123Key.icon = null; - m123Key.iconPreview = null; - m123Key.label = m123Label; - } - } - } - - private void updateF1Key() { - // Update KEYCODE_F1 key. Please note that some keyboard layouts have no F1 key. - if (mF1Key == null) - return; - - if (mIsAlphaKeyboard) { - if (mMode == KeyboardSwitcher.MODE_URL) { - setNonMicF1Key(mF1Key, "/", R.xml.popup_slash); - } else if (mMode == KeyboardSwitcher.MODE_EMAIL) { - setNonMicF1Key(mF1Key, "@", R.xml.popup_at); - } else { - if (mVoiceEnabled && mHasVoiceButton) { - setMicF1Key(mF1Key); - } else { - setNonMicF1Key(mF1Key, ",", R.xml.popup_comma); - } - } - } else { // Symbols keyboard - if (mVoiceEnabled && mHasVoiceButton) { - setMicF1Key(mF1Key); - } else { - setNonMicF1Key(mF1Key, ",", R.xml.popup_comma); - } - } - } - - private void setMicF1Key(Key key) { - // HACK: draw mMicIcon and mHintIcon at the same time - final Drawable micWithSettingsHintDrawable = new BitmapDrawable(mRes, - drawSynthesizedSettingsHintImage(key.width, key.height, mMicIcon, mHintIcon)); - - key.label = null; - key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; - key.popupResId = R.xml.popup_mic; - key.icon = micWithSettingsHintDrawable; - key.iconPreview = mMicPreviewIcon; - } - - private void setNonMicF1Key(Key key, String label, int popupResId) { - key.label = label; - key.codes = new int[] { label.charAt(0) }; - key.popupResId = popupResId; - key.icon = mHintIcon; - key.iconPreview = null; - } - - public boolean isF1Key(Key key) { - return key == mF1Key; - } - - public static boolean hasPuncOrSmileysPopup(Key key) { - return key.popupResId == R.xml.popup_punctuation || key.popupResId == R.xml.popup_smileys; - } - - /** - * @return a key which should be invalidated. - */ - public Key onAutoCompletionStateChanged(boolean isAutoCompletion) { - updateSpaceBarForLocale(isAutoCompletion, mIsBlackSym); - return mSpaceKey; - } - - private void updateNumberHintKeys() { - for (int i = 0; i < mNumberHintKeys.length; ++i) { - if (mNumberHintKeys[i] != null) { - mNumberHintKeys[i].icon = mNumberHintIcons[i]; - } - } - } - - public boolean isLanguageSwitchEnabled() { - return mLocale != null; - } - - private void updateSpaceBarForLocale(boolean isAutoCompletion, boolean isBlack) { - // If application locales are explicitly selected. - if (mLocale != null) { - mSpaceKey.icon = new BitmapDrawable(mRes, - drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack)); - } else { - // sym_keyboard_space_led can be shared with Black and White symbol themes. - if (isAutoCompletion) { - mSpaceKey.icon = new BitmapDrawable(mRes, - drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack)); - } else { - mSpaceKey.icon = isBlack ? mRes.getDrawable(R.drawable.sym_bkeyboard_space) - : mRes.getDrawable(R.drawable.sym_keyboard_space); - } - } - } - - // Compute width of text with specified text size using paint. - private static int getTextWidth(Paint paint, String text, float textSize, Rect bounds) { - paint.setTextSize(textSize); - paint.getTextBounds(text, 0, text.length(), bounds); - return bounds.width(); - } - - // Overlay two images: mainIcon and hintIcon. - private Bitmap drawSynthesizedSettingsHintImage( - int width, int height, Drawable mainIcon, Drawable hintIcon) { - if (mainIcon == null || hintIcon == null) - return null; - Rect hintIconPadding = new Rect(0, 0, 0, 0); - hintIcon.getPadding(hintIconPadding); - final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - final Canvas canvas = new Canvas(buffer); - canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); - - // Draw main icon at the center of the key visual - // Assuming the hintIcon shares the same padding with the key's background drawable - final int drawableX = (width + hintIconPadding.left - hintIconPadding.right - - mainIcon.getIntrinsicWidth()) / 2; - final int drawableY = (height + hintIconPadding.top - hintIconPadding.bottom - - mainIcon.getIntrinsicHeight()) / 2; - setDefaultBounds(mainIcon); - canvas.translate(drawableX, drawableY); - mainIcon.draw(canvas); - canvas.translate(-drawableX, -drawableY); - - // Draw hint icon fully in the key - hintIcon.setBounds(0, 0, width, height); - hintIcon.draw(canvas); - return buffer; - } - - // Layout local language name and left and right arrow on space bar. - private static String layoutSpaceBar(Paint paint, Locale locale, Drawable lArrow, - Drawable rArrow, int width, int height, float origTextSize, - boolean allowVariableTextSize) { - final float arrowWidth = lArrow.getIntrinsicWidth(); - final float arrowHeight = lArrow.getIntrinsicHeight(); - final float maxTextWidth = width - (arrowWidth + arrowWidth); - final Rect bounds = new Rect(); - - // Estimate appropriate language name text size to fit in maxTextWidth. - String language = LanguageSwitcher.toTitleCase(locale.getDisplayLanguage(locale)); - int textWidth = getTextWidth(paint, language, origTextSize, bounds); - // Assuming text width and text size are proportional to each other. - float textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f); - - final boolean useShortName; - if (allowVariableTextSize) { - textWidth = getTextWidth(paint, language, textSize, bounds); - // If text size goes too small or text does not fit, use short name - useShortName = textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME - || textWidth > maxTextWidth; - } else { - useShortName = textWidth > maxTextWidth; - textSize = origTextSize; - } - if (useShortName) { - language = LanguageSwitcher.toTitleCase(locale.getLanguage()); - textWidth = getTextWidth(paint, language, origTextSize, bounds); - textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f); - } - paint.setTextSize(textSize); - - // Place left and right arrow just before and after language text. - final float baseline = height * SPACEBAR_LANGUAGE_BASELINE; - final int top = (int)(baseline - arrowHeight); - final float remains = (width - textWidth) / 2; - lArrow.setBounds((int)(remains - arrowWidth), top, (int)remains, (int)baseline); - rArrow.setBounds((int)(remains + textWidth), top, (int)(remains + textWidth + arrowWidth), - (int)baseline); - - return language; - } - - private Bitmap drawSpaceBar(int opacity, boolean isAutoCompletion, boolean isBlack) { - final int width = mSpaceKey.width; - final int height = mSpaceIcon.getIntrinsicHeight(); - final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - final Canvas canvas = new Canvas(buffer); - canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); - - // If application locales are explicitly selected. - if (mLocale != null) { - final Paint paint = new Paint(); - paint.setAlpha(opacity); - paint.setAntiAlias(true); - paint.setTextAlign(Align.CENTER); - - final boolean allowVariableTextSize = true; - final String language = layoutSpaceBar(paint, mLanguageSwitcher.getInputLocale(), - mButtonArrowLeftIcon, mButtonArrowRightIcon, width, height, - getTextSizeFromTheme(android.R.style.TextAppearance_Small, 14), - allowVariableTextSize); - - // Draw language text with shadow - final int shadowColor = mRes.getColor(isBlack - ? R.color.latinkeyboard_bar_language_shadow_black - : R.color.latinkeyboard_bar_language_shadow_white); - final float baseline = height * SPACEBAR_LANGUAGE_BASELINE; - final float descent = paint.descent(); - paint.setColor(shadowColor); - canvas.drawText(language, width / 2, baseline - descent - 1, paint); - paint.setColor(mRes.getColor(R.color.latinkeyboard_bar_language_text)); - canvas.drawText(language, width / 2, baseline - descent, paint); - - // Put arrows that are already layed out on either side of the text - if (mLanguageSwitcher.getLocaleCount() > 1) { - mButtonArrowLeftIcon.draw(canvas); - mButtonArrowRightIcon.draw(canvas); - } - } - - // Draw the spacebar icon at the bottom - if (isAutoCompletion) { - final int iconWidth = width * SPACE_LED_LENGTH_PERCENT / 100; - final int iconHeight = mSpaceAutoCompletionIndicator.getIntrinsicHeight(); - int x = (width - iconWidth) / 2; - int y = height - iconHeight; - mSpaceAutoCompletionIndicator.setBounds(x, y, x + iconWidth, y + iconHeight); - mSpaceAutoCompletionIndicator.draw(canvas); - } else { - final int iconWidth = mSpaceIcon.getIntrinsicWidth(); - final int iconHeight = mSpaceIcon.getIntrinsicHeight(); - int x = (width - iconWidth) / 2; - int y = height - iconHeight; - mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight); - mSpaceIcon.draw(canvas); - } - return buffer; - } - - private void updateLocaleDrag(int diff) { - if (mSlidingLocaleIcon == null) { - final int width = Math.max(mSpaceKey.width, - (int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO)); - final int height = mSpacePreviewIcon.getIntrinsicHeight(); - mSlidingLocaleIcon = new SlidingLocaleDrawable(mSpacePreviewIcon, width, height); - mSlidingLocaleIcon.setBounds(0, 0, width, height); - mSpaceKey.iconPreview = mSlidingLocaleIcon; - } - mSlidingLocaleIcon.setDiff(diff); - if (Math.abs(diff) == Integer.MAX_VALUE) { - mSpaceKey.iconPreview = mSpacePreviewIcon; - } else { - mSpaceKey.iconPreview = mSlidingLocaleIcon; - } - mSpaceKey.iconPreview.invalidateSelf(); - } - - public int getLanguageChangeDirection() { - if (mSpaceKey == null || mLanguageSwitcher.getLocaleCount() < 2 - || Math.abs(mSpaceDragLastDiff) < mSpaceKey.width * SPACEBAR_DRAG_THRESHOLD ) { - return 0; // No change - } - return mSpaceDragLastDiff > 0 ? 1 : -1; - } - - public void setLanguageSwitcher(LanguageSwitcher switcher, boolean isAutoCompletion, - boolean isBlackSym) { - mLanguageSwitcher = switcher; - Locale locale = mLanguageSwitcher.getLocaleCount() > 0 - ? mLanguageSwitcher.getInputLocale() - : null; - // If the language count is 1 and is the same as the system language, don't show it. - if (locale != null - && mLanguageSwitcher.getLocaleCount() == 1 - && mLanguageSwitcher.getSystemLocale().getLanguage() - .equalsIgnoreCase(locale.getLanguage())) { - locale = null; - } - mLocale = locale; - setColorOfSymbolIcons(isAutoCompletion, isBlackSym); - } - - boolean isCurrentlyInSpace() { - return mCurrentlyInSpace; - } - - void setPreferredLetters(int[] frequencies) { - mPrefLetterFrequencies = frequencies; - mPrefLetter = 0; - } - - void keyReleased() { - mCurrentlyInSpace = false; - mSpaceDragLastDiff = 0; - mPrefLetter = 0; - mPrefLetterX = 0; - mPrefLetterY = 0; - mPrefDistance = Integer.MAX_VALUE; - if (mSpaceKey != null) { - updateLocaleDrag(Integer.MAX_VALUE); - } - } - - /** - * Does the magic of locking the touch gesture into the spacebar when - * switching input languages. - */ - boolean isInside(LatinKey key, int x, int y) { - final int code = key.codes[0]; - if (code == KEYCODE_SHIFT || - code == KEYCODE_DELETE) { - y -= key.height / 10; - if (code == KEYCODE_SHIFT) x += key.width / 6; - if (code == KEYCODE_DELETE) x -= key.width / 6; - } else if (code == LatinIME.KEYCODE_SPACE) { - y += LatinKeyboard.sSpacebarVerticalCorrection; - if (mLanguageSwitcher.getLocaleCount() > 1) { - if (mCurrentlyInSpace) { - int diff = x - mSpaceDragStartX; - if (Math.abs(diff - mSpaceDragLastDiff) > 0) { - updateLocaleDrag(diff); - } - mSpaceDragLastDiff = diff; - return true; - } else { - boolean insideSpace = key.isInsideSuper(x, y); - if (insideSpace) { - mCurrentlyInSpace = true; - mSpaceDragStartX = x; - updateLocaleDrag(0); - } - return insideSpace; - } - } - } else if (mPrefLetterFrequencies != null) { - // New coordinate? Reset - if (mPrefLetterX != x || mPrefLetterY != y) { - mPrefLetter = 0; - mPrefDistance = Integer.MAX_VALUE; - } - // Handle preferred next letter - final int[] pref = mPrefLetterFrequencies; - if (mPrefLetter > 0) { - if (DEBUG_PREFERRED_LETTER) { - if (mPrefLetter == code && !key.isInsideSuper(x, y)) { - Log.d(TAG, "CORRECTED !!!!!!"); - } - } - return mPrefLetter == code; - } else { - final boolean inside = key.isInsideSuper(x, y); - int[] nearby = getNearestKeys(x, y); - List<Key> nearbyKeys = getKeys(); - if (inside) { - // If it's a preferred letter - if (inPrefList(code, pref)) { - // Check if its frequency is much lower than a nearby key - mPrefLetter = code; - mPrefLetterX = x; - mPrefLetterY = y; - for (int i = 0; i < nearby.length; i++) { - Key k = nearbyKeys.get(nearby[i]); - if (k != key && inPrefList(k.codes[0], pref)) { - final int dist = distanceFrom(k, x, y); - if (dist < (int) (k.width * OVERLAP_PERCENTAGE_LOW_PROB) && - (pref[k.codes[0]] > pref[mPrefLetter] * 3)) { - mPrefLetter = k.codes[0]; - mPrefDistance = dist; - if (DEBUG_PREFERRED_LETTER) { - Log.d(TAG, "CORRECTED ALTHOUGH PREFERRED !!!!!!"); - } - break; - } - } - } - - return mPrefLetter == code; - } - } - - // Get the surrounding keys and intersect with the preferred list - // For all in the intersection - // if distance from touch point is within a reasonable distance - // make this the pref letter - // If no pref letter - // return inside; - // else return thiskey == prefletter; - - for (int i = 0; i < nearby.length; i++) { - Key k = nearbyKeys.get(nearby[i]); - if (inPrefList(k.codes[0], pref)) { - final int dist = distanceFrom(k, x, y); - if (dist < (int) (k.width * OVERLAP_PERCENTAGE_HIGH_PROB) - && dist < mPrefDistance) { - mPrefLetter = k.codes[0]; - mPrefLetterX = x; - mPrefLetterY = y; - mPrefDistance = dist; - } - } - } - // Didn't find any - if (mPrefLetter == 0) { - return inside; - } else { - return mPrefLetter == code; - } - } - } - - // Lock into the spacebar - if (mCurrentlyInSpace) return false; - - return key.isInsideSuper(x, y); - } - - private boolean inPrefList(int code, int[] pref) { - if (code < pref.length && code >= 0) return pref[code] > 0; - return false; - } - - private int distanceFrom(Key k, int x, int y) { - if (y > k.y && y < k.y + k.height) { - return Math.abs(k.x + k.width / 2 - x); - } else { - return Integer.MAX_VALUE; - } - } - - @Override - public int[] getNearestKeys(int x, int y) { - if (mCurrentlyInSpace) { - return mSpaceKeyIndexArray; - } else { - // 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))); - } - } - - private int indexOf(int code) { - List<Key> keys = getKeys(); - int count = keys.size(); - for (int i = 0; i < count; i++) { - if (keys.get(i).codes[0] == code) return i; - } - return -1; - } - - private int getTextSizeFromTheme(int style, int defValue) { - TypedArray array = mContext.getTheme().obtainStyledAttributes( - style, new int[] { android.R.attr.textSize }); - int textSize = array.getDimensionPixelSize(array.getResourceId(0, 0), defValue); - return textSize; - } - - // TODO LatinKey could be static class - class LatinKey extends Keyboard.Key { - - // functional normal state (with properties) - private final int[] KEY_STATE_FUNCTIONAL_NORMAL = { - android.R.attr.state_single - }; - - // functional pressed state (with properties) - private final int[] KEY_STATE_FUNCTIONAL_PRESSED = { - android.R.attr.state_single, - android.R.attr.state_pressed - }; - - private boolean mShiftLockEnabled; - - public LatinKey(Resources res, Keyboard.Row parent, int x, int y, - XmlResourceParser parser) { - super(res, parent, x, y, parser); - if (popupCharacters != null && popupCharacters.length() == 0) { - // If there is a keyboard with no keys specified in popupCharacters - popupResId = 0; - } - } - - private void enableShiftLock() { - mShiftLockEnabled = true; - } - - // sticky is used for shift key. If a key is not sticky and is modifier, - // the key will be treated as functional. - private boolean isFunctionalKey() { - return !sticky && modifier; - } - - @Override - public void onReleased(boolean inside) { - if (!mShiftLockEnabled) { - super.onReleased(inside); - } else { - pressed = !pressed; - } - } - - /** - * Overriding this method so that we can reduce the target area for certain keys. - */ - @Override - public boolean isInside(int x, int y) { - // TODO This should be done by parent.isInside(this, x, y) - // if Key.parent were protected. - boolean result = LatinKeyboard.this.isInside(this, x, y); - return result; - } - - boolean isInsideSuper(int x, int y) { - return super.isInside(x, y); - } - - @Override - public int[] getCurrentDrawableState() { - if (isFunctionalKey()) { - if (pressed) { - return KEY_STATE_FUNCTIONAL_PRESSED; - } else { - return KEY_STATE_FUNCTIONAL_NORMAL; - } - } - return super.getCurrentDrawableState(); - } - - @Override - public int squaredDistanceFrom(int x, int y) { - // We should count vertical gap between rows to calculate the center of this Key. - final int verticalGap = LatinKeyboard.this.mVerticalGap; - final int xDist = this.x + width / 2 - x; - final int yDist = this.y + (height + verticalGap) / 2 - y; - return xDist * xDist + yDist * yDist; - } - } - - /** - * 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. - */ - class SlidingLocaleDrawable extends Drawable { - - private final int mWidth; - private final int mHeight; - private final Drawable mBackground; - private final TextPaint mTextPaint; - private final int mMiddleX; - private final Drawable mLeftDrawable; - private final Drawable mRightDrawable; - private final int mThreshold; - private int mDiff; - private boolean mHitThreshold; - private String mCurrentLanguage; - private String mNextLanguage; - private String mPrevLanguage; - - public SlidingLocaleDrawable(Drawable background, int width, int height) { - mBackground = background; - setDefaultBounds(mBackground); - mWidth = width; - mHeight = height; - mTextPaint = new TextPaint(); - mTextPaint.setTextSize(getTextSizeFromTheme(android.R.style.TextAppearance_Medium, 18)); - mTextPaint.setColor(R.color.latinkeyboard_transparent); - mTextPaint.setTextAlign(Align.CENTER); - mTextPaint.setAlpha(OPACITY_FULLY_OPAQUE); - mTextPaint.setAntiAlias(true); - mMiddleX = (mWidth - mBackground.getIntrinsicWidth()) / 2; - mLeftDrawable = - mRes.getDrawable(R.drawable.sym_keyboard_feedback_language_arrows_left); - mRightDrawable = - mRes.getDrawable(R.drawable.sym_keyboard_feedback_language_arrows_right); - mThreshold = ViewConfiguration.get(mContext).getScaledTouchSlop(); - } - - private void setDiff(int diff) { - if (diff == Integer.MAX_VALUE) { - mHitThreshold = false; - mCurrentLanguage = null; - return; - } - mDiff = diff; - if (mDiff > mWidth) mDiff = mWidth; - if (mDiff < -mWidth) mDiff = -mWidth; - if (Math.abs(mDiff) > mThreshold) mHitThreshold = true; - invalidateSelf(); - } - - private String getLanguageName(Locale locale) { - return LanguageSwitcher.toTitleCase(locale.getDisplayLanguage(locale)); - } - - @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; - final Drawable lArrow = mLeftDrawable; - final Drawable rArrow = mRightDrawable; - canvas.clipRect(0, 0, width, height); - if (mCurrentLanguage == null) { - final LanguageSwitcher languageSwitcher = mLanguageSwitcher; - mCurrentLanguage = getLanguageName(languageSwitcher.getInputLocale()); - mNextLanguage = getLanguageName(languageSwitcher.getNextInputLocale()); - mPrevLanguage = getLanguageName(languageSwitcher.getPrevInputLocale()); - } - // Draw language text with shadow - final float baseline = mHeight * SPACEBAR_LANGUAGE_BASELINE - paint.descent(); - paint.setColor(mRes.getColor(R.color.latinkeyboard_feedback_language_text)); - 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); - - setDefaultBounds(lArrow); - rArrow.setBounds(width - rArrow.getIntrinsicWidth(), 0, width, - rArrow.getIntrinsicHeight()); - lArrow.draw(canvas); - rArrow.draw(canvas); - } - 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/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java deleted file mode 100644 index a5476e457..000000000 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ /dev/null @@ -1,380 +0,0 @@ -/* - * 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 - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; -import android.os.Handler; -import android.os.Message; -import android.os.SystemClock; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.MotionEvent; - -import java.util.List; - -public class LatinKeyboardView extends LatinKeyboardBaseView { - - static final int KEYCODE_OPTIONS = -100; - static final int KEYCODE_OPTIONS_LONGPRESS = -101; - static final int KEYCODE_VOICE = -102; - static final int KEYCODE_F1 = -103; - static final int KEYCODE_NEXT_LANGUAGE = -104; - static final int KEYCODE_PREV_LANGUAGE = -105; - - private Keyboard mPhoneKeyboard; - - /** Whether we've started dropping move events because we found a big jump */ - private boolean mDroppingEvents; - /** - * Whether multi-touch disambiguation needs to be disabled if a real multi-touch event has - * occured - */ - 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; - - public LatinKeyboardView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - public void setPhoneKeyboard(Keyboard phoneKeyboard) { - mPhoneKeyboard = phoneKeyboard; - } - - @Override - public void setPreviewEnabled(boolean previewEnabled) { - if (getKeyboard() == mPhoneKeyboard) { - // Phone keyboard never shows popup preview (except language switch). - super.setPreviewEnabled(false); - } else { - super.setPreviewEnabled(previewEnabled); - } - } - - @Override - public void setKeyboard(Keyboard newKeyboard) { - final Keyboard oldKeyboard = getKeyboard(); - if (oldKeyboard instanceof LatinKeyboard) { - // Reset old keyboard state before switching to new keyboard. - ((LatinKeyboard)oldKeyboard).keyReleased(); - } - 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; - setKeyboardLocal(newKeyboard); - } - - @Override - protected boolean onLongPress(Key key) { - int primaryCode = key.codes[0]; - if (primaryCode == KEYCODE_OPTIONS) { - return invokeOnKey(KEYCODE_OPTIONS_LONGPRESS); - } else if (primaryCode == '0' && getKeyboard() == mPhoneKeyboard) { - // Long pressing on 0 in phone number keypad gives you a '+'. - return invokeOnKey('+'); - } else { - return super.onLongPress(key); - } - } - - private boolean invokeOnKey(int primaryCode) { - getOnKeyboardActionListener().onKey(primaryCode, null, - LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE, - LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE); - return true; - } - - @Override - protected CharSequence adjustCase(CharSequence label) { - Keyboard keyboard = getKeyboard(); - if (keyboard.isShifted() - && keyboard instanceof LatinKeyboard - && ((LatinKeyboard) keyboard).isAlphaKeyboard() - && !TextUtils.isEmpty(label) && label.length() < 3 - && Character.isLowerCase(label.charAt(0))) { - label = label.toString().toUpperCase(); - } - return label; - } - - public boolean setShiftLocked(boolean shiftLocked) { - Keyboard keyboard = getKeyboard(); - if (keyboard instanceof LatinKeyboard) { - ((LatinKeyboard)keyboard).setShiftLocked(shiftLocked); - invalidateAllKeys(); - return true; - } - return false; - } - - /** - * This function checks to see if we need to handle any sudden jumps in the pointer location - * that could be due to a multi-touch being treated as a move by the firmware or hardware. - * Once a sudden jump is detected, all subsequent move events are discarded - * until an UP is received.<P> - * When a sudden jump is detected, an UP event is simulated at the last position and when - * 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. - */ - private boolean handleSuddenJump(MotionEvent me) { - final int action = me.getAction(); - final int x = (int) me.getX(); - final int y = (int) me.getY(); - boolean result = false; - - // Real multi-touch event? Stop looking for sudden jumps - if (me.getPointerCount() > 1) { - mDisableDisambiguation = true; - } - if (mDisableDisambiguation) { - // If UP, reset the multi-touch flag - if (action == MotionEvent.ACTION_UP) mDisableDisambiguation = false; - return false; - } - - switch (action) { - case MotionEvent.ACTION_DOWN: - // Reset the "session" - mDroppingEvents = false; - mDisableDisambiguation = false; - break; - 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)) { - // If we're not yet dropping events, start dropping and send an UP event - if (!mDroppingEvents) { - mDroppingEvents = true; - // Send an up event - MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(), - MotionEvent.ACTION_UP, - mLastX, mLastY, me.getMetaState()); - super.onTouchEvent(translated); - translated.recycle(); - } - result = true; - } else if (mDroppingEvents) { - // If moves are small and we're already dropping events, continue dropping - result = true; - } - break; - case MotionEvent.ACTION_UP: - if (mDroppingEvents) { - // Send a down event first, as we dropped a bunch of sudden jumps and assume that - // the user is releasing the touch on the second key. - MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(), - MotionEvent.ACTION_DOWN, - x, y, me.getMetaState()); - super.onTouchEvent(translated); - translated.recycle(); - mDroppingEvents = false; - // Let the up event get processed as well, result = false - } - break; - } - // Track the previous coordinate - mLastX = x; - mLastY = y; - return result; - } - - @Override - public boolean onTouchEvent(MotionEvent me) { - LatinKeyboard keyboard = (LatinKeyboard) getKeyboard(); - if (DEBUG_LINE) { - mLastX = (int) me.getX(); - mLastY = (int) me.getY(); - invalidate(); - } - - // If there was a sudden jump, return without processing the actual motion event. - if (handleSuddenJump(me)) - return true; - - // Reset any bounding box controls in the keyboard - if (me.getAction() == MotionEvent.ACTION_DOWN) { - keyboard.keyReleased(); - } - - if (me.getAction() == MotionEvent.ACTION_UP) { - int languageDirection = keyboard.getLanguageChangeDirection(); - if (languageDirection != 0) { - getOnKeyboardActionListener().onKey( - languageDirection == 1 ? KEYCODE_NEXT_LANGUAGE : KEYCODE_PREV_LANGUAGE, - null, mLastX, mLastY); - me.setAction(MotionEvent.ACTION_CANCEL); - keyboard.keyReleased(); - return super.onTouchEvent(me); - } - } - - return super.onTouchEvent(me); - } - - /**************************** INSTRUMENTATION *******************************/ - - static final boolean DEBUG_AUTO_PLAY = false; - static final boolean DEBUG_LINE = false; - private static final int MSG_TOUCH_DOWN = 1; - private static final int MSG_TOUCH_UP = 2; - - Handler mHandler2; - - private String mStringToPlay; - private int mStringIndex; - private boolean mDownDelivered; - private Key[] mAsciiKeys = new Key[256]; - private boolean mPlaying; - private int mLastX; - private int mLastY; - private Paint mPaint; - - private void setKeyboardLocal(Keyboard k) { - if (DEBUG_AUTO_PLAY) { - findKeys(); - if (mHandler2 == null) { - mHandler2 = new Handler() { - @Override - public void handleMessage(Message msg) { - removeMessages(MSG_TOUCH_DOWN); - removeMessages(MSG_TOUCH_UP); - if (mPlaying == false) return; - - switch (msg.what) { - case MSG_TOUCH_DOWN: - if (mStringIndex >= mStringToPlay.length()) { - mPlaying = false; - return; - } - char c = mStringToPlay.charAt(mStringIndex); - while (c > 255 || mAsciiKeys[c] == null) { - mStringIndex++; - if (mStringIndex >= mStringToPlay.length()) { - mPlaying = false; - return; - } - c = mStringToPlay.charAt(mStringIndex); - } - int x = mAsciiKeys[c].x + 10; - int y = mAsciiKeys[c].y + 26; - MotionEvent me = MotionEvent.obtain(SystemClock.uptimeMillis(), - SystemClock.uptimeMillis(), - MotionEvent.ACTION_DOWN, x, y, 0); - LatinKeyboardView.this.dispatchTouchEvent(me); - me.recycle(); - sendEmptyMessageDelayed(MSG_TOUCH_UP, 500); // Deliver up in 500ms if nothing else - // happens - mDownDelivered = true; - break; - case MSG_TOUCH_UP: - char cUp = mStringToPlay.charAt(mStringIndex); - int x2 = mAsciiKeys[cUp].x + 10; - int y2 = mAsciiKeys[cUp].y + 26; - mStringIndex++; - - MotionEvent me2 = MotionEvent.obtain(SystemClock.uptimeMillis(), - SystemClock.uptimeMillis(), - MotionEvent.ACTION_UP, x2, y2, 0); - LatinKeyboardView.this.dispatchTouchEvent(me2); - me2.recycle(); - sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 500); // Deliver up in 500ms if nothing else - // happens - mDownDelivered = false; - break; - } - } - }; - - } - } - } - - private void findKeys() { - List<Key> keys = getKeyboard().getKeys(); - // Get the keys on this keyboard - for (int i = 0; i < keys.size(); i++) { - int code = keys.get(i).codes[0]; - if (code >= 0 && code <= 255) { - mAsciiKeys[code] = keys.get(i); - } - } - } - - public void startPlaying(String s) { - if (DEBUG_AUTO_PLAY) { - if (s == null) return; - mStringToPlay = s.toLowerCase(); - mPlaying = true; - mDownDelivered = false; - mStringIndex = 0; - mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 10); - } - } - - @Override - public void draw(Canvas c) { - LatinIMEUtil.GCUtils.getInstance().reset(); - boolean tryGC = true; - for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { - try { - super.draw(c); - tryGC = false; - } catch (OutOfMemoryError e) { - tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait("LatinKeyboardView", e); - } - } - if (DEBUG_AUTO_PLAY) { - if (mPlaying) { - mHandler2.removeMessages(MSG_TOUCH_DOWN); - mHandler2.removeMessages(MSG_TOUCH_UP); - if (mDownDelivered) { - mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_UP, 20); - } else { - mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 20); - } - } - } - if (DEBUG_LINE) { - if (mPaint == null) { - mPaint = new Paint(); - mPaint.setColor(0x80FFFFFF); - mPaint.setAntiAlias(false); - } - c.drawLine(mLastX, 0, mLastX, getHeight(), mPaint); - c.drawLine(0, mLastY, getWidth(), mLastY, mPaint); - } - } -} diff --git a/java/src/com/android/inputmethod/latin/ModifierKeyState.java b/java/src/com/android/inputmethod/latin/ModifierKeyState.java deleted file mode 100644 index 097e87abe..000000000 --- a/java/src/com/android/inputmethod/latin/ModifierKeyState.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. - * - * 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; - -class ModifierKeyState { - private static final int RELEASING = 0; - private static final int PRESSING = 1; - private static final int MOMENTARY = 2; - - private int mState = RELEASING; - - public void onPress() { - mState = PRESSING; - } - - public void onRelease() { - mState = RELEASING; - } - - public void onOtherKeyPressed() { - if (mState == PRESSING) - mState = MOMENTARY; - } - - public boolean isMomentary() { - return mState == MOMENTARY; - } -} diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java deleted file mode 100644 index b23b4d7b8..000000000 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. - * - * 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 com.android.inputmethod.latin.LatinKeyboardBaseView.OnKeyboardActionListener; -import com.android.inputmethod.latin.LatinKeyboardBaseView.UIHandler; - -import android.content.res.Resources; -import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; -import android.util.Log; -import android.view.MotionEvent; - -public class PointerTracker { - private static final String TAG = "PointerTracker"; - private static final boolean DEBUG = false; - private static final boolean DEBUG_MOVE = false; - - public interface UIProxy { - public void invalidateKey(Key key); - public void showPreview(int keyIndex, PointerTracker tracker); - public boolean hasDistinctMultitouch(); - } - - public final int mPointerId; - - // Timing constants - private final int mDelayBeforeKeyRepeatStart; - private final int mLongPressKeyTimeout; - private final int mMultiTapKeyTimeout; - - // Miscellaneous constants - private static final int NOT_A_KEY = LatinKeyboardBaseView.NOT_A_KEY; - private static final int[] KEY_DELETE = { Keyboard.KEYCODE_DELETE }; - - private final UIProxy mProxy; - private final UIHandler mHandler; - private final KeyDetector mKeyDetector; - private OnKeyboardActionListener mListener; - private final KeyboardSwitcher mKeyboardSwitcher; - private final boolean mHasDistinctMultitouch; - - private Key[] mKeys; - private int mKeyHysteresisDistanceSquared = -1; - - private final KeyState mKeyState; - - // 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) - private boolean mKeyAlreadyProcessed; - - // true if this pointer is repeatable key - private boolean mIsRepeatableKey; - - // true if this pointer is in sliding key input - private boolean mIsInSlidingKeyInput; - - // For multi-tap - private int mLastSentIndex; - private int mTapCount; - private long mLastTapTime; - private boolean mInMultiTap; - private final StringBuilder mPreviewLabel = new StringBuilder(1); - - // pressed key - private int mPreviousKey = NOT_A_KEY; - - // This class keeps track of a key index and a position where this pointer is. - private static class KeyState { - private final KeyDetector mKeyDetector; - - // The position and time at which first down event occurred. - private int mStartX; - private int mStartY; - private long mDownTime; - - // The current key index where this pointer is. - private int mKeyIndex = NOT_A_KEY; - // The position where mKeyIndex was recognized for the first time. - private int mKeyX; - private int mKeyY; - - // Last pointer position. - private int mLastX; - private int mLastY; - - public KeyState(KeyDetector keyDetecor) { - mKeyDetector = keyDetecor; - } - - public int getKeyIndex() { - return mKeyIndex; - } - - public int getKeyX() { - return mKeyX; - } - - public int getKeyY() { - return mKeyY; - } - - public int getStartX() { - return mStartX; - } - - public int getStartY() { - return mStartY; - } - - public long getDownTime() { - return mDownTime; - } - - public int getLastX() { - return mLastX; - } - - public int getLastY() { - return mLastY; - } - - public int onDownKey(int x, int y, long eventTime) { - mStartX = x; - mStartY = y; - mDownTime = eventTime; - - return onMoveToNewKey(onMoveKeyInternal(x, y), x, y); - } - - private int onMoveKeyInternal(int x, int y) { - mLastX = x; - mLastY = y; - return mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); - } - - public int onMoveKey(int x, int y) { - return onMoveKeyInternal(x, y); - } - - public int onMoveToNewKey(int keyIndex, int x, int y) { - mKeyIndex = keyIndex; - mKeyX = x; - mKeyY = y; - return keyIndex; - } - - public int onUpKey(int x, int y) { - return onMoveKeyInternal(x, y); - } - } - - public PointerTracker(int id, UIHandler handler, KeyDetector keyDetector, UIProxy proxy, - Resources res) { - if (proxy == null || handler == null || keyDetector == null) - throw new NullPointerException(); - mPointerId = id; - mProxy = proxy; - mHandler = handler; - mKeyDetector = keyDetector; - mKeyboardSwitcher = KeyboardSwitcher.getInstance(); - mKeyState = new KeyState(keyDetector); - mHasDistinctMultitouch = proxy.hasDistinctMultitouch(); - mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start); - mLongPressKeyTimeout = res.getInteger(R.integer.config_long_press_key_timeout); - mMultiTapKeyTimeout = res.getInteger(R.integer.config_multi_tap_key_timeout); - resetMultiTap(); - } - - public void setOnKeyboardActionListener(OnKeyboardActionListener listener) { - mListener = listener; - } - - public void setKeyboard(Key[] keys, float keyHysteresisDistance) { - if (keys == null || keyHysteresisDistance < 0) - throw new IllegalArgumentException(); - mKeys = keys; - mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance); - // Mark that keyboard layout has been changed. - mKeyboardLayoutHasBeenChanged = true; - } - - public boolean isInSlidingKeyInput() { - return mIsInSlidingKeyInput; - } - - private boolean isValidKeyIndex(int keyIndex) { - return keyIndex >= 0 && keyIndex < mKeys.length; - } - - public Key getKey(int keyIndex) { - return isValidKeyIndex(keyIndex) ? mKeys[keyIndex] : null; - } - - private boolean isModifierInternal(int keyIndex) { - Key key = getKey(keyIndex); - if (key == null) - return false; - int primaryCode = key.codes[0]; - return primaryCode == Keyboard.KEYCODE_SHIFT - || primaryCode == Keyboard.KEYCODE_MODE_CHANGE; - } - - public boolean isModifier() { - return isModifierInternal(mKeyState.getKeyIndex()); - } - - public boolean isOnModifierKey(int x, int y) { - return isModifierInternal(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null)); - } - - public boolean isSpaceKey(int keyIndex) { - Key key = getKey(keyIndex); - return key != null && key.codes[0] == LatinIME.KEYCODE_SPACE; - } - - public void updateKey(int keyIndex) { - if (mKeyAlreadyProcessed) - return; - int oldKeyIndex = mPreviousKey; - mPreviousKey = keyIndex; - if (keyIndex != oldKeyIndex) { - if (isValidKeyIndex(oldKeyIndex)) { - // if new key index is not a key, old key was just released inside of the key. - final boolean inside = (keyIndex == NOT_A_KEY); - mKeys[oldKeyIndex].onReleased(inside); - mProxy.invalidateKey(mKeys[oldKeyIndex]); - } - if (isValidKeyIndex(keyIndex)) { - mKeys[keyIndex].onPressed(); - mProxy.invalidateKey(mKeys[keyIndex]); - } - } - } - - public void setAlreadyProcessed() { - mKeyAlreadyProcessed = true; - } - - public void onTouchEvent(int action, int x, int y, long eventTime) { - switch (action) { - case MotionEvent.ACTION_MOVE: - onMoveEvent(x, y, eventTime); - break; - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_POINTER_DOWN: - onDownEvent(x, y, eventTime); - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_POINTER_UP: - onUpEvent(x, y, eventTime); - break; - case MotionEvent.ACTION_CANCEL: - onCancelEvent(x, y, eventTime); - break; - } - } - - public void onDownEvent(int x, int y, long eventTime) { - if (DEBUG) - debugLog("onDownEvent:", x, y); - int keyIndex = mKeyState.onDownKey(x, y, eventTime); - mKeyboardLayoutHasBeenChanged = false; - mKeyAlreadyProcessed = false; - mIsRepeatableKey = false; - mIsInSlidingKeyInput = false; - checkMultiTap(eventTime, keyIndex); - if (mListener != null) { - if (isValidKeyIndex(keyIndex)) { - mListener.onPress(mKeys[keyIndex].codes[0]); - // This onPress call may have changed keyboard layout. Those cases are detected at - // {@link #setKeyboard}. In those cases, we should update keyIndex according to the - // new keyboard layout. - if (mKeyboardLayoutHasBeenChanged) { - mKeyboardLayoutHasBeenChanged = false; - keyIndex = mKeyState.onDownKey(x, y, eventTime); - } - } - } - if (isValidKeyIndex(keyIndex)) { - if (mKeys[keyIndex].repeatable) { - repeatKey(keyIndex); - mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this); - mIsRepeatableKey = true; - } - startLongPressTimer(keyIndex); - } - showKeyPreviewAndUpdateKey(keyIndex); - } - - public void onMoveEvent(int x, int y, long eventTime) { - if (DEBUG_MOVE) - debugLog("onMoveEvent:", x, y); - if (mKeyAlreadyProcessed) - return; - final KeyState keyState = mKeyState; - int keyIndex = keyState.onMoveKey(x, y); - final Key oldKey = getKey(keyState.getKeyIndex()); - if (isValidKeyIndex(keyIndex)) { - if (oldKey == null) { - // The pointer has been slid in to the new key, but the finger was not on any keys. - // In this case, we must call onPress() to notify that the new key is being pressed. - if (mListener != null) { - mListener.onPress(getKey(keyIndex).codes[0]); - // This onPress call may have changed keyboard layout. Those cases are detected - // at {@link #setKeyboard}. In those cases, we should update keyIndex according - // to the new keyboard layout. - if (mKeyboardLayoutHasBeenChanged) { - mKeyboardLayoutHasBeenChanged = false; - keyIndex = keyState.onMoveKey(x, y); - } - } - keyState.onMoveToNewKey(keyIndex, x, y); - startLongPressTimer(keyIndex); - } else if (!isMinorMoveBounce(x, y, keyIndex)) { - // The pointer has been slid in to the new key from the previous key, we must call - // onRelease() first to notify that the previous key has been released, then call - // onPress() to notify that the new key is being pressed. - mIsInSlidingKeyInput = true; - if (mListener != null) - mListener.onRelease(oldKey.codes[0]); - resetMultiTap(); - if (mListener != null) { - mListener.onPress(getKey(keyIndex).codes[0]); - // This onPress call may have changed keyboard layout. Those cases are detected - // at {@link #setKeyboard}. In those cases, we should update keyIndex according - // to the new keyboard layout. - if (mKeyboardLayoutHasBeenChanged) { - mKeyboardLayoutHasBeenChanged = false; - keyIndex = keyState.onMoveKey(x, y); - } - } - keyState.onMoveToNewKey(keyIndex, x, y); - startLongPressTimer(keyIndex); - } - } else { - if (oldKey != null && !isMinorMoveBounce(x, y, keyIndex)) { - // The pointer has been slid out from the previous key, we must call onRelease() to - // notify that the previous key has been released. - mIsInSlidingKeyInput = true; - if (mListener != null) - mListener.onRelease(oldKey.codes[0]); - resetMultiTap(); - keyState.onMoveToNewKey(keyIndex, x ,y); - mHandler.cancelLongPressTimer(); - } - } - showKeyPreviewAndUpdateKey(keyState.getKeyIndex()); - } - - public void onUpEvent(int x, int y, long eventTime) { - if (DEBUG) - debugLog("onUpEvent :", x, y); - mHandler.cancelKeyTimers(); - mHandler.cancelPopupPreview(); - showKeyPreviewAndUpdateKey(NOT_A_KEY); - mIsInSlidingKeyInput = false; - if (mKeyAlreadyProcessed) - return; - int keyIndex = mKeyState.onUpKey(x, y); - if (isMinorMoveBounce(x, y, keyIndex)) { - // Use previous fixed key index and coordinates. - keyIndex = mKeyState.getKeyIndex(); - x = mKeyState.getKeyX(); - y = mKeyState.getKeyY(); - } - if (!mIsRepeatableKey) { - detectAndSendKey(keyIndex, x, y, eventTime); - } - - if (isValidKeyIndex(keyIndex)) - mProxy.invalidateKey(mKeys[keyIndex]); - } - - public void onCancelEvent(int x, int y, long eventTime) { - if (DEBUG) - debugLog("onCancelEvt:", x, y); - mHandler.cancelKeyTimers(); - mHandler.cancelPopupPreview(); - showKeyPreviewAndUpdateKey(NOT_A_KEY); - mIsInSlidingKeyInput = false; - int keyIndex = mKeyState.getKeyIndex(); - if (isValidKeyIndex(keyIndex)) - mProxy.invalidateKey(mKeys[keyIndex]); - } - - public void repeatKey(int keyIndex) { - Key key = getKey(keyIndex); - if (key != null) { - // While key is repeating, because there is no need to handle multi-tap key, we can - // pass -1 as eventTime argument. - detectAndSendKey(keyIndex, key.x, key.y, -1); - } - } - - public int getLastX() { - return mKeyState.getLastX(); - } - - public int getLastY() { - return mKeyState.getLastY(); - } - - public long getDownTime() { - return mKeyState.getDownTime(); - } - - // These package scope methods are only for debugging purpose. - /* package */ int getStartX() { - return mKeyState.getStartX(); - } - - /* package */ int getStartY() { - return mKeyState.getStartY(); - } - - private boolean isMinorMoveBounce(int x, int y, int newKey) { - if (mKeys == null || mKeyHysteresisDistanceSquared < 0) - throw new IllegalStateException("keyboard and/or hysteresis not set"); - int curKey = mKeyState.getKeyIndex(); - if (newKey == curKey) { - return true; - } else if (isValidKeyIndex(curKey)) { - return getSquareDistanceToKeyEdge(x, y, mKeys[curKey]) < mKeyHysteresisDistanceSquared; - } else { - return false; - } - } - - private static int getSquareDistanceToKeyEdge(int x, int y, Key key) { - final int left = key.x; - final int right = key.x + key.width; - final int top = key.y; - final int bottom = key.y + key.height; - final int edgeX = x < left ? left : (x > right ? right : x); - final int edgeY = y < top ? top : (y > bottom ? bottom : y); - final int dx = x - edgeX; - final int dy = y - edgeY; - return dx * dx + dy * dy; - } - - private void showKeyPreviewAndUpdateKey(int keyIndex) { - updateKey(keyIndex); - // The modifier key, such as shift key, should not be shown as preview when multi-touch is - // supported. On the other hand, if multi-touch is not supported, the modifier key should - // be shown as preview. - if (mHasDistinctMultitouch && isModifier()) { - mProxy.showPreview(NOT_A_KEY, this); - } else { - mProxy.showPreview(keyIndex, this); - } - } - - private void startLongPressTimer(int keyIndex) { - if (mKeyboardSwitcher.isInMomentaryAutoModeSwitchState()) { - // We use longer timeout for sliding finger input started from the symbols mode key. - mHandler.startLongPressTimer(mLongPressKeyTimeout * 3, keyIndex, this); - } else { - mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); - } - } - - private void detectAndSendKey(int index, int x, int y, long eventTime) { - final OnKeyboardActionListener listener = mListener; - final Key key = getKey(index); - - if (key == null) { - if (listener != null) - listener.onCancel(); - } else { - if (key.text != null) { - if (listener != null) { - listener.onText(key.text); - listener.onRelease(0); // dummy key code - } - } else { - int code = key.codes[0]; - int[] codes = mKeyDetector.newCodeArray(); - mKeyDetector.getKeyIndexAndNearbyCodes(x, y, codes); - // Multi-tap - if (mInMultiTap) { - if (mTapCount != -1) { - mListener.onKey(Keyboard.KEYCODE_DELETE, KEY_DELETE, x, y); - } else { - mTapCount = 0; - } - code = key.codes[mTapCount]; - } - /* - * Swap the first and second values in the codes array if the primary code is not - * the first value but the second value in the array. This happens when key - * debouncing is in effect. - */ - if (codes.length >= 2 && codes[0] != code && codes[1] == code) { - codes[1] = codes[0]; - codes[0] = code; - } - if (listener != null) { - listener.onKey(code, codes, x, y); - listener.onRelease(code); - } - } - mLastSentIndex = index; - mLastTapTime = eventTime; - } - } - - /** - * Handle multi-tap keys by producing the key label for the current multi-tap state. - */ - public CharSequence getPreviewText(Key key) { - if (mInMultiTap) { - // Multi-tap - mPreviewLabel.setLength(0); - mPreviewLabel.append((char) key.codes[mTapCount < 0 ? 0 : mTapCount]); - return mPreviewLabel; - } else { - return key.label; - } - } - - private void resetMultiTap() { - mLastSentIndex = NOT_A_KEY; - mTapCount = 0; - mLastTapTime = -1; - mInMultiTap = false; - } - - private void checkMultiTap(long eventTime, int keyIndex) { - Key key = getKey(keyIndex); - if (key == null) - return; - - final boolean isMultiTap = - (eventTime < mLastTapTime + mMultiTapKeyTimeout && keyIndex == mLastSentIndex); - if (key.codes.length > 1) { - mInMultiTap = true; - if (isMultiTap) { - mTapCount = (mTapCount + 1) % key.codes.length; - return; - } else { - mTapCount = -1; - return; - } - } - if (!isMultiTap) { - resetMultiTap(); - } - } - - private void debugLog(String title, int x, int y) { - int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); - Key key = getKey(keyIndex); - final String code; - if (key == null) { - code = "----"; - } else { - int primaryCode = key.codes[0]; - code = String.format((primaryCode < 0) ? "%4d" : "0x%02x", primaryCode); - } - Log.d(TAG, String.format("%s%s[%d] %3d,%3d %3d(%s) %s", title, - (mKeyAlreadyProcessed ? "-" : " "), mPointerId, x, y, keyIndex, code, - (isModifier() ? "modifier" : ""))); - } -} diff --git a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java deleted file mode 100644 index 325ce674c..000000000 --- a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. - * - * 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.inputmethodservice.Keyboard.Key; - -import java.util.Arrays; - -class ProximityKeyDetector extends KeyDetector { - private static final int MAX_NEARBY_KEYS = 12; - - // working area - private int[] mDistances = new int[MAX_NEARBY_KEYS]; - - @Override - protected int getMaxNearbyKeys() { - return MAX_NEARBY_KEYS; - } - - @Override - public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) { - final Key[] keys = getKeys(); - final int touchX = getTouchX(x); - final int touchY = getTouchY(y); - int primaryIndex = LatinKeyboardBaseView.NOT_A_KEY; - int closestKey = LatinKeyboardBaseView.NOT_A_KEY; - int closestKeyDist = mProximityThresholdSquare + 1; - int[] distances = mDistances; - Arrays.fill(distances, Integer.MAX_VALUE); - int [] nearestKeyIndices = mKeyboard.getNearestKeys(touchX, touchY); - final int keyCount = nearestKeyIndices.length; - for (int i = 0; i < keyCount; i++) { - final Key key = keys[nearestKeyIndices[i]]; - int dist = 0; - boolean isInside = key.isInside(touchX, touchY); - if (isInside) { - primaryIndex = nearestKeyIndices[i]; - } - - if (((mProximityCorrectOn - && (dist = key.squaredDistanceFrom(touchX, touchY)) < mProximityThresholdSquare) - || isInside) - && key.codes[0] > 32) { - // Find insertion point - final int nCodes = key.codes.length; - if (dist < closestKeyDist) { - closestKeyDist = dist; - closestKey = nearestKeyIndices[i]; - } - - if (allKeys == null) continue; - - for (int j = 0; j < distances.length; j++) { - if (distances[j] > dist) { - // Make space for nCodes codes - System.arraycopy(distances, j, distances, j + nCodes, - distances.length - j - nCodes); - System.arraycopy(allKeys, j, allKeys, j + nCodes, - allKeys.length - j - nCodes); - System.arraycopy(key.codes, 0, allKeys, j, nCodes); - Arrays.fill(distances, j, j + nCodes, dist); - break; - } - } - } - } - if (primaryIndex == LatinKeyboardBaseView.NOT_A_KEY) { - primaryIndex = closestKey; - } - return primaryIndex; - } -} diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java new file mode 100644 index 000000000..653dbeaba --- /dev/null +++ b/java/src/com/android/inputmethod/latin/Settings.java @@ -0,0 +1,326 @@ +/* + * 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 + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import com.android.inputmethod.voice.VoiceIMEConnector; +import com.android.inputmethod.voice.VoiceInputLogger; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.backup.BackupManager; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Vibrator; +import android.preference.CheckBoxPreference; +import android.preference.ListPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceActivity; +import android.preference.PreferenceGroup; +import android.preference.PreferenceScreen; +import android.speech.SpeechRecognizer; +import android.text.AutoText; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.util.Log; +import android.widget.TextView; + +import java.util.Locale; + +public class Settings extends PreferenceActivity + implements SharedPreferences.OnSharedPreferenceChangeListener, + DialogInterface.OnDismissListener, OnPreferenceClickListener { + private static final String TAG = "Settings"; + + public static final String PREF_GENERAL_SETTINGS_KEY = "general_settings"; + public static final String PREF_VIBRATE_ON = "vibrate_on"; + public static final String PREF_SOUND_ON = "sound_on"; + public static final String PREF_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_VOICE_SETTINGS_KEY = "voice_mode"; + public static final String PREF_INPUT_LANGUAGE = "input_language"; + public static final String PREF_SELECTED_LANGUAGES = "selected_languages"; + public static final String PREF_SUBTYPES = "subtype_settings"; + + public static final String PREF_PREDICTION_SETTINGS_KEY = "prediction_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_BIGRAM_SUGGESTIONS = "bigram_suggestion"; + + public static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode"; + + // Dialog ids + private static final int VOICE_INPUT_CONFIRM_DIALOG = 0; + + private PreferenceScreen mInputLanguageSelection; + private CheckBoxPreference mQuickFixes; + private ListPreference mVoicePreference; + private ListPreference mSettingsKeyPreference; + private ListPreference mAutoCorrectionThreshold; + private CheckBoxPreference mBigramSuggestion; + private boolean mVoiceOn; + + private AlertDialog mDialog; + + private VoiceInputLogger mLogger; + + 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(); + mBigramSuggestion.setEnabled(!currentSetting.equals(autoCorrectionOff)); + } + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + addPreferencesFromResource(R.xml.prefs); + mInputLanguageSelection = (PreferenceScreen) findPreference(PREF_SUBTYPES); + mInputLanguageSelection.setOnPreferenceClickListener(this); + mQuickFixes = (CheckBoxPreference) findPreference(PREF_QUICK_FIXES); + mVoicePreference = (ListPreference) findPreference(PREF_VOICE_SETTINGS_KEY); + mSettingsKeyPreference = (ListPreference) findPreference(PREF_SETTINGS_KEY); + SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); + prefs.registerOnSharedPreferenceChangeListener(this); + + mVoiceModeOff = getString(R.string.voice_mode_off); + mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff) + .equals(mVoiceModeOff)); + mLogger = VoiceInputLogger.getLogger(this); + + mAutoCorrectionThreshold = (ListPreference) findPreference(PREF_AUTO_CORRECTION_THRESHOLD); + mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTIONS); + ensureConsistencyOfAutoCorrectionSettings(); + + final PreferenceGroup generalSettings = + (PreferenceGroup) findPreference(PREF_GENERAL_SETTINGS_KEY); + final PreferenceGroup textCorrectionGroup = + (PreferenceGroup) findPreference(PREF_PREDICTION_SETTINGS_KEY); + + final boolean showSettingsKeyOption = getResources().getBoolean( + R.bool.config_enable_show_settings_key_option); + if (!showSettingsKeyOption) { + generalSettings.removePreference(mSettingsKeyPreference); + } + + final boolean showVoiceKeyOption = getResources().getBoolean( + R.bool.config_enable_show_voice_key_option); + if (!showVoiceKeyOption) { + generalSettings.removePreference(mVoicePreference); + } + + Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); + if (vibrator == null || !vibrator.hasVibrator()) { + generalSettings.removePreference(findPreference(PREF_VIBRATE_ON)); + } + + final boolean showSubtypeSettings = getResources().getBoolean( + R.bool.config_enable_show_subtype_settings); + if (!showSubtypeSettings) { + generalSettings.removePreference(findPreference(PREF_SUBTYPES)); + } + + final boolean showPopupOption = getResources().getBoolean( + R.bool.config_enable_show_popup_on_keypress_option); + if (!showPopupOption) { + generalSettings.removePreference(findPreference(PREF_POPUP_ON)); + } + + final boolean showRecorrectionOption = getResources().getBoolean( + R.bool.config_enable_show_recorrection_option); + if (!showRecorrectionOption) { + generalSettings.removePreference(findPreference(PREF_RECORRECTION_ENABLED)); + } + + final boolean showQuickFixesOption = getResources().getBoolean( + R.bool.config_enable_quick_fixes_option); + if (!showQuickFixesOption) { + textCorrectionGroup.removePreference(findPreference(PREF_QUICK_FIXES)); + } + + final boolean showBigramSuggestionsOption = getResources().getBoolean( + R.bool.config_enable_bigram_suggestions_option); + if (!showBigramSuggestionsOption) { + textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_SUGGESTIONS)); + } + + final boolean showUsabilityModeStudyOption = getResources().getBoolean( + R.bool.config_enable_usability_study_mode_option); + if (!showUsabilityModeStudyOption) { + getPreferenceScreen().removePreference(findPreference(PREF_USABILITY_STUDY_MODE)); + } + } + + @Override + protected void onResume() { + super.onResume(); + int autoTextSize = AutoText.getSize(getListView()); + if (autoTextSize < 1) { + ((PreferenceGroup) findPreference(PREF_PREDICTION_SETTINGS_KEY)) + .removePreference(mQuickFixes); + } + if (!VoiceIMEConnector.VOICE_INSTALLED + || !SpeechRecognizer.isRecognitionAvailable(this)) { + getPreferenceScreen().removePreference(mVoicePreference); + } else { + updateVoiceModeSummary(); + } + updateSettingsKeySummary(); + } + + @Override + protected void onDestroy() { + getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( + this); + super.onDestroy(); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + (new BackupManager(this)).dataChanged(); + // If turning on voice input, show dialog + if (key.equals(PREF_VOICE_SETTINGS_KEY) && !mVoiceOn) { + if (!prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff) + .equals(mVoiceModeOff)) { + showVoiceConfirmation(); + } + } + ensureConsistencyOfAutoCorrectionSettings(); + mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff) + .equals(mVoiceModeOff)); + updateVoiceModeSummary(); + updateSettingsKeySummary(); + } + + @Override + public boolean onPreferenceClick(Preference pref) { + if (pref == mInputLanguageSelection) { + final String action; + if (android.os.Build.VERSION.SDK_INT + >= /* android.os.Build.VERSION_CODES.HONEYCOMB */ 11) { + action = "android.settings.INPUT_METHOD_AND_SUBTYPE_ENABLER"; + } else { + action = "com.android.inputmethod.latin.INPUT_LANGUAGE_SELECTION"; + } + startActivity(new Intent(action)); + return true; + } + return false; + } + + private void updateSettingsKeySummary() { + mSettingsKeyPreference.setSummary( + getResources().getStringArray(R.array.settings_key_modes) + [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]); + } + + private void showVoiceConfirmation() { + mOkClicked = false; + showDialog(VOICE_INPUT_CONFIRM_DIALOG); + // Make URL in the dialog message clickable + if (mDialog != null) { + TextView textView = (TextView) mDialog.findViewById(android.R.id.message); + if (textView != null) { + textView.setMovementMethod(LinkMovementMethod.getInstance()); + } + } + } + + private void updateVoiceModeSummary() { + mVoicePreference.setSummary( + getResources().getStringArray(R.array.voice_input_modes_summary) + [mVoicePreference.findIndexOfValue(mVoicePreference.getValue())]); + } + + @Override + protected Dialog onCreateDialog(int id) { + switch (id) { + case VOICE_INPUT_CONFIRM_DIALOG: + DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int whichButton) { + if (whichButton == DialogInterface.BUTTON_NEGATIVE) { + mVoicePreference.setValue(mVoiceModeOff); + mLogger.settingsWarningDialogCancel(); + } else if (whichButton == DialogInterface.BUTTON_POSITIVE) { + mOkClicked = true; + mLogger.settingsWarningDialogOk(); + } + updateVoicePreference(); + } + }; + AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setTitle(R.string.voice_warning_title) + .setPositiveButton(android.R.string.ok, listener) + .setNegativeButton(android.R.string.cancel, listener); + + // Get the current list of supported locales and check the current locale against + // that list, to decide whether to put a warning that voice input will not work in + // the current language as part of the pop-up confirmation dialog. + boolean localeSupported = SubtypeSwitcher.getInstance().isVoiceSupported( + Locale.getDefault().toString()); + + final CharSequence message; + if (localeSupported) { + message = TextUtils.concat( + getText(R.string.voice_warning_may_not_understand), "\n\n", + getText(R.string.voice_hint_dialog_message)); + } else { + message = TextUtils.concat( + getText(R.string.voice_warning_locale_not_supported), "\n\n", + getText(R.string.voice_warning_may_not_understand), "\n\n", + getText(R.string.voice_hint_dialog_message)); + } + builder.setMessage(message); + AlertDialog dialog = builder.create(); + mDialog = dialog; + dialog.setOnDismissListener(this); + mLogger.settingsWarningDialogShown(); + return dialog; + default: + Log.e(TAG, "unknown dialog " + id); + return null; + } + } + + @Override + public void onDismiss(DialogInterface dialog) { + mLogger.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); + if (isChecked) { + mLogger.voiceInputSettingEnabled(); + } else { + mLogger.voiceInputSettingDisabled(); + } + } +} diff --git a/java/src/com/android/inputmethod/latin/SubtypeLocale.java b/java/src/com/android/inputmethod/latin/SubtypeLocale.java new file mode 100644 index 000000000..917521c40 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/SubtypeLocale.java @@ -0,0 +1,46 @@ +/* + * 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 android.content.res.Resources; + +import java.util.Locale; + +public class SubtypeLocale { + private static String[] sExceptionKeys; + private static String[] sExceptionValues; + + private SubtypeLocale() { + // Intentional empty constructor for utility class. + } + + public static void init(Context context) { + final Resources res = context.getResources(); + sExceptionKeys = res.getStringArray(R.array.subtype_locale_exception_keys); + sExceptionValues = res.getStringArray(R.array.subtype_locale_exception_values); + } + + public static String getFullDisplayName(Locale locale) { + String localeCode = locale.toString(); + for (int index = 0; index < sExceptionKeys.length; index++) { + if (sExceptionKeys[index].equals(localeCode)) + return sExceptionValues[index]; + } + return locale.getDisplayName(locale); + } +} diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java new file mode 100644 index 000000000..7a1ac2e27 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java @@ -0,0 +1,580 @@ +/* + * 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.latin; + +import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.voice.SettingsUtil; +import com.android.inputmethod.voice.VoiceIMEConnector; +import com.android.inputmethod.voice.VoiceInput; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.IBinder; +import android.text.TextUtils; +import android.util.Log; +import android.view.inputmethod.InputMethodInfo; +import android.view.inputmethod.InputMethodManager; +import android.view.inputmethod.InputMethodSubtype; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public class SubtypeSwitcher { + private static boolean DBG = LatinImeLogger.sDBG; + private static final String TAG = "SubtypeSwitcher"; + + private static final char LOCALE_SEPARATER = '_'; + private static final String KEYBOARD_MODE = "keyboard"; + private static final String VOICE_MODE = "voice"; + private final TextUtils.SimpleStringSplitter mLocaleSplitter = + new TextUtils.SimpleStringSplitter(LOCALE_SEPARATER); + + private static final SubtypeSwitcher sInstance = new SubtypeSwitcher(); + private /* final */ LatinIME mService; + private /* final */ SharedPreferences mPrefs; + private /* final */ InputMethodManager mImm; + private /* final */ Resources mResources; + private final ArrayList<InputMethodSubtype> mEnabledKeyboardSubtypesOfCurrentInputMethod = + new ArrayList<InputMethodSubtype>(); + private final ArrayList<String> mEnabledLanguagesOfCurrentInputMethod = new ArrayList<String>(); + + private boolean mConfigUseSpacebarLanguageSwitcher; + + /*-----------------------------------------------------------*/ + // Variants which should be changed only by reload functions. + private boolean mNeedsToDisplayLanguage; + private boolean mIsSystemLanguageSameAsInputLanguage; + private InputMethodInfo mShortcutInfo; + private InputMethodSubtype mShortcutSubtype; + private List<InputMethodSubtype> mAllEnabledSubtypesOfCurrentInputMethod; + private Locale mSystemLocale; + private Locale mInputLocale; + private String mInputLocaleStr; + private String mMode; + private VoiceInput mVoiceInput; + /*-----------------------------------------------------------*/ + + public static SubtypeSwitcher getInstance() { + return sInstance; + } + + public static void init(LatinIME service, SharedPreferences prefs) { + sInstance.mPrefs = prefs; + sInstance.resetParams(service); + sInstance.updateAllParameters(); + + SubtypeLocale.init(service); + } + + private SubtypeSwitcher() { + // Intentional empty constructor for singleton. + } + + private void resetParams(LatinIME service) { + mService = service; + mResources = service.getResources(); + mImm = (InputMethodManager) service.getSystemService(Context.INPUT_METHOD_SERVICE); + mEnabledKeyboardSubtypesOfCurrentInputMethod.clear(); + mEnabledLanguagesOfCurrentInputMethod.clear(); + mSystemLocale = null; + mInputLocale = null; + mInputLocaleStr = null; + // Mode is initialized to KEYBOARD_MODE, in case that LatinIME can't obtain currentSubtype + mMode = KEYBOARD_MODE; + mAllEnabledSubtypesOfCurrentInputMethod = null; + // TODO: Voice input should be created here + mVoiceInput = null; + mConfigUseSpacebarLanguageSwitcher = mResources.getBoolean( + R.bool.config_use_spacebar_language_switcher); + if (mConfigUseSpacebarLanguageSwitcher) + initLanguageSwitcher(service); + } + + // Update all parameters stored in SubtypeSwitcher. + // Only configuration changed event is allowed to call this because this is heavy. + private void updateAllParameters() { + mSystemLocale = mResources.getConfiguration().locale; + updateSubtype(mImm.getCurrentInputMethodSubtype()); + updateParametersOnStartInputView(); + } + + // Update parameters which are changed outside LatinIME. This parameters affect UI so they + // should be updated every time onStartInputview. + public void updateParametersOnStartInputView() { + if (mConfigUseSpacebarLanguageSwitcher) { + updateForSpacebarLanguageSwitch(); + } else { + updateEnabledSubtypes(); + } + updateShortcutIME(); + } + + // Reload enabledSubtypes from the framework. + private void updateEnabledSubtypes() { + boolean foundCurrentSubtypeBecameDisabled = true; + mAllEnabledSubtypesOfCurrentInputMethod = mImm.getEnabledInputMethodSubtypeList( + null, true); + mEnabledLanguagesOfCurrentInputMethod.clear(); + mEnabledKeyboardSubtypesOfCurrentInputMethod.clear(); + for (InputMethodSubtype ims: mAllEnabledSubtypesOfCurrentInputMethod) { + final String locale = ims.getLocale(); + final String mode = ims.getMode(); + mLocaleSplitter.setString(locale); + if (mLocaleSplitter.hasNext()) { + mEnabledLanguagesOfCurrentInputMethod.add(mLocaleSplitter.next()); + } + if (locale.equals(mInputLocaleStr) && mode.equals(mMode)) { + foundCurrentSubtypeBecameDisabled = false; + } + if (KEYBOARD_MODE.equals(ims.getMode())) { + mEnabledKeyboardSubtypesOfCurrentInputMethod.add(ims); + } + } + mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1 + && mIsSystemLanguageSameAsInputLanguage); + if (foundCurrentSubtypeBecameDisabled) { + if (DBG) { + Log.w(TAG, "Current subtype: " + mInputLocaleStr + ", " + mMode); + Log.w(TAG, "Last subtype was disabled. Update to the current one."); + } + updateSubtype(mImm.getCurrentInputMethodSubtype()); + } + } + + private void updateShortcutIME() { + if (DBG) { + Log.d(TAG, "Update shortcut IME from : " + + (mShortcutInfo == null ? "<null>" : mShortcutInfo.getId()) + ", " + + (mShortcutSubtype == null ? "<null>" : (mShortcutSubtype.getLocale() + + ", " + mShortcutSubtype.getMode()))); + } + // TODO: Update an icon for shortcut IME + Map<InputMethodInfo, List<InputMethodSubtype>> shortcuts = + mImm.getShortcutInputMethodsAndSubtypes(); + for (InputMethodInfo imi: shortcuts.keySet()) { + List<InputMethodSubtype> subtypes = shortcuts.get(imi); + // TODO: Returns the first found IMI for now. Should handle all shortcuts as + // appropriate. + mShortcutInfo = imi; + // TODO: Pick up the first found subtype for now. Should handle all subtypes + // as appropriate. + mShortcutSubtype = subtypes.size() > 0 ? subtypes.get(0) : null; + break; + } + if (DBG) { + Log.d(TAG, "Update shortcut IME to : " + + (mShortcutInfo == null ? "<null>" : mShortcutInfo.getId()) + ", " + + (mShortcutSubtype == null ? "<null>" : (mShortcutSubtype.getLocale() + + ", " + mShortcutSubtype.getMode()))); + } + } + + // Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function. + public void updateSubtype(InputMethodSubtype newSubtype) { + final String newLocale; + final String newMode; + if (newSubtype == null) { + // Normally, newSubtype shouldn't be null. But just in case newSubtype was null, + // fallback to the default locale and mode. + Log.w(TAG, "Couldn't get the current subtype."); + newLocale = "en_US"; + newMode = KEYBOARD_MODE; + } else { + newLocale = newSubtype.getLocale(); + newMode = newSubtype.getMode(); + } + if (DBG) { + Log.w(TAG, "Update subtype to:" + newLocale + "," + newMode + + ", from: " + mInputLocaleStr + ", " + mMode); + } + boolean languageChanged = false; + if (!newLocale.equals(mInputLocaleStr)) { + if (mInputLocaleStr != null) { + languageChanged = true; + } + updateInputLocale(newLocale); + } + boolean modeChanged = false; + String oldMode = mMode; + if (!newMode.equals(mMode)) { + if (mMode != null) { + modeChanged = true; + } + mMode = newMode; + } + + // If the old mode is voice input, we need to reset or cancel its status. + // We cancel its status when we change mode, while we reset otherwise. + if (isKeyboardMode()) { + if (modeChanged) { + if (VOICE_MODE.equals(oldMode) && mVoiceInput != null) { + mVoiceInput.cancel(); + } + } + if (modeChanged || languageChanged) { + updateShortcutIME(); + mService.onRefreshKeyboard(); + } + } else if (isVoiceMode() && mVoiceInput != null) { + if (VOICE_MODE.equals(oldMode)) { + mVoiceInput.reset(); + } + // If needsToShowWarningDialog is true, voice input need to show warning before + // show recognition view. + if (languageChanged || modeChanged + || VoiceIMEConnector.getInstance().needsToShowWarningDialog()) { + triggerVoiceIME(); + } + } else { + Log.w(TAG, "Unknown subtype mode: " + mMode); + if (VOICE_MODE.equals(oldMode) && mVoiceInput != null) { + // We need to reset the voice input to release the resources and to reset its status + // as it is not the current input mode. + mVoiceInput.reset(); + } + } + } + + // Update the current input locale from Locale string. + private void updateInputLocale(String inputLocaleStr) { + // example: inputLocaleStr = "en_US" "en" "" + // "en_US" --> language: en & country: US + // "en" --> language: en + // "" --> the system locale + mLocaleSplitter.setString(inputLocaleStr); + if (mLocaleSplitter.hasNext()) { + String language = mLocaleSplitter.next(); + if (mLocaleSplitter.hasNext()) { + mInputLocale = new Locale(language, mLocaleSplitter.next()); + } else { + mInputLocale = new Locale(language); + } + mInputLocaleStr = inputLocaleStr; + } else { + mInputLocale = mSystemLocale; + String country = mSystemLocale.getCountry(); + mInputLocaleStr = mSystemLocale.getLanguage() + + (TextUtils.isEmpty(country) ? "" : "_" + mSystemLocale.getLanguage()); + } + mIsSystemLanguageSameAsInputLanguage = getSystemLocale().getLanguage().equalsIgnoreCase( + getInputLocale().getLanguage()); + mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1 + && mIsSystemLanguageSameAsInputLanguage); + } + + //////////////////////////// + // Shortcut IME functions // + //////////////////////////// + + public void switchToShortcutIME() { + IBinder token = mService.getWindow().getWindow().getAttributes().token; + if (token == null || mShortcutInfo == null) { + return; + } + mImm.setInputMethodAndSubtype(token, mShortcutInfo.getId(), mShortcutSubtype); + } + + public Drawable getShortcutIcon() { + return getSubtypeIcon(mShortcutInfo, mShortcutSubtype); + } + + private Drawable getSubtypeIcon(InputMethodInfo imi, InputMethodSubtype subtype) { + final PackageManager pm = mService.getPackageManager(); + if (imi != null) { + final String imiPackageName = imi.getPackageName(); + if (DBG) { + Log.d(TAG, "Update icons of IME: " + imiPackageName + "," + + subtype.getLocale() + "," + subtype.getMode()); + } + if (subtype != null) { + return pm.getDrawable(imiPackageName, subtype.getIconResId(), + imi.getServiceInfo().applicationInfo); + } else if (imi.getSubtypeCount() > 0 && imi.getSubtypeAt(0) != null) { + return pm.getDrawable(imiPackageName, + imi.getSubtypeAt(0).getIconResId(), + imi.getServiceInfo().applicationInfo); + } else { + try { + return pm.getApplicationInfo(imiPackageName, 0).loadIcon(pm); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "IME can't be found: " + imiPackageName); + } + } + } + return null; + } + + ////////////////////////////////// + // Language Switching functions // + ////////////////////////////////// + + public int getEnabledKeyboardLocaleCount() { + if (mConfigUseSpacebarLanguageSwitcher) { + return mLanguageSwitcher.getLocaleCount(); + } else { + return mEnabledKeyboardSubtypesOfCurrentInputMethod.size(); + } + } + + public boolean useSpacebarLanguageSwitcher() { + return mConfigUseSpacebarLanguageSwitcher; + } + + public boolean needsToDisplayLanguage() { + return mNeedsToDisplayLanguage; + } + + public Locale getInputLocale() { + if (mConfigUseSpacebarLanguageSwitcher) { + return mLanguageSwitcher.getInputLocale(); + } else { + return mInputLocale; + } + } + + public String getInputLocaleStr() { + if (mConfigUseSpacebarLanguageSwitcher) { + String inputLanguage = null; + inputLanguage = mLanguageSwitcher.getInputLanguage(); + // Should return system locale if there is no Language available. + if (inputLanguage == null) { + inputLanguage = getSystemLocale().getLanguage(); + } + return inputLanguage; + } else { + return mInputLocaleStr; + } + } + + public String[] getEnabledLanguages() { + if (mConfigUseSpacebarLanguageSwitcher) { + return mLanguageSwitcher.getEnabledLanguages(); + } else { + return mEnabledLanguagesOfCurrentInputMethod.toArray( + new String[mEnabledLanguagesOfCurrentInputMethod.size()]); + } + } + + public Locale getSystemLocale() { + if (mConfigUseSpacebarLanguageSwitcher) { + return mLanguageSwitcher.getSystemLocale(); + } else { + return mSystemLocale; + } + } + + public boolean isSystemLanguageSameAsInputLanguage() { + if (mConfigUseSpacebarLanguageSwitcher) { + return getSystemLocale().getLanguage().equalsIgnoreCase( + getInputLocaleStr().substring(0, 2)); + } else { + return mIsSystemLanguageSameAsInputLanguage; + } + } + + public void onConfigurationChanged(Configuration conf) { + final Locale systemLocale = conf.locale; + // If system configuration was changed, update all parameters. + if (!TextUtils.equals(systemLocale.toString(), mSystemLocale.toString())) { + if (mConfigUseSpacebarLanguageSwitcher) { + // If the system locale changes and is different from the saved + // locale (mSystemLocale), then reload the input locale list from the + // latin ime settings (shared prefs) and reset the input locale + // to the first one. + mLanguageSwitcher.loadLocales(mPrefs); + mLanguageSwitcher.setSystemLocale(systemLocale); + } else { + updateAllParameters(); + } + } + } + + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (mConfigUseSpacebarLanguageSwitcher) { + if (Settings.PREF_SELECTED_LANGUAGES.equals(key)) { + mLanguageSwitcher.loadLocales(sharedPreferences); + } + } + } + + /** + * Change system locale for this application + * @param newLocale + * @return oldLocale + */ + public Locale changeSystemLocale(Locale newLocale) { + Configuration conf = mResources.getConfiguration(); + Locale oldLocale = conf.locale; + conf.locale = newLocale; + mResources.updateConfiguration(conf, mResources.getDisplayMetrics()); + return oldLocale; + } + + public boolean isKeyboardMode() { + return KEYBOARD_MODE.equals(mMode); + } + + + /////////////////////////// + // Voice Input functions // + /////////////////////////// + + public boolean setVoiceInput(VoiceInput vi) { + if (mVoiceInput == null && vi != null) { + mVoiceInput = vi; + if (isVoiceMode()) { + if (DBG) { + Log.d(TAG, "Set and call voice input.: " + getInputLocaleStr()); + } + triggerVoiceIME(); + return true; + } + } + return false; + } + + public boolean isVoiceMode() { + return VOICE_MODE.equals(mMode); + } + + private void triggerVoiceIME() { + if (!mService.isInputViewShown()) return; + VoiceIMEConnector.getInstance().startListening(false, + KeyboardSwitcher.getInstance().getInputView().getWindowToken()); + } + + ////////////////////////////////////// + // Spacebar Language Switch support // + ////////////////////////////////////// + + private LanguageSwitcher mLanguageSwitcher; + + public static String getFullDisplayName(Locale locale, boolean returnsNameInThisLocale) { + if (returnsNameInThisLocale) { + return toTitleCase(SubtypeLocale.getFullDisplayName(locale)); + } else { + return toTitleCase(locale.getDisplayName()); + } + } + + public static String getDisplayLanguage(Locale locale) { + return toTitleCase(locale.getDisplayLanguage(locale)); + } + + public static String getShortDisplayLanguage(Locale locale) { + return toTitleCase(locale.getLanguage()); + } + + private static String toTitleCase(String s) { + if (s.length() == 0) { + return s; + } + return Character.toUpperCase(s.charAt(0)) + s.substring(1); + } + + private void updateForSpacebarLanguageSwitch() { + // We need to update mNeedsToDisplayLanguage in onStartInputView because + // getEnabledKeyboardLocaleCount could have been changed. + mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1 + && getSystemLocale().getLanguage().equalsIgnoreCase( + getInputLocale().getLanguage())); + } + + public String getInputLanguageName() { + return getDisplayLanguage(getInputLocale()); + } + + public String getNextInputLanguageName() { + if (mConfigUseSpacebarLanguageSwitcher) { + return getDisplayLanguage(mLanguageSwitcher.getNextInputLocale()); + } else { + return ""; + } + } + + public String getPreviousInputLanguageName() { + if (mConfigUseSpacebarLanguageSwitcher) { + return getDisplayLanguage(mLanguageSwitcher.getPrevInputLocale()); + } else { + return ""; + } + } + + // A list of locales which are supported by default for voice input, unless we get a + // different list from Gservices. + private static final String DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES = + "en " + + "en_US " + + "en_GB " + + "en_AU " + + "en_CA " + + "en_IE " + + "en_IN " + + "en_NZ " + + "en_SG " + + "en_ZA "; + + public boolean isVoiceSupported(String locale) { + // Get the current list of supported locales and check the current locale against that + // list. We cache this value so as not to check it every time the user starts a voice + // input. Because this method is called by onStartInputView, this should mean that as + // long as the locale doesn't change while the user is keeping the IME open, the + // value should never be stale. + String supportedLocalesString = SettingsUtil.getSettingsString( + mService.getContentResolver(), + SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES, + DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES); + List<String> voiceInputSupportedLocales = Arrays.asList( + supportedLocalesString.split("\\s+")); + return voiceInputSupportedLocales.contains(locale); + } + + public void loadSettings() { + if (mConfigUseSpacebarLanguageSwitcher) { + mLanguageSwitcher.loadLocales(mPrefs); + } + } + + public void toggleLanguage(boolean reset, boolean next) { + if (mConfigUseSpacebarLanguageSwitcher) { + if (reset) { + mLanguageSwitcher.reset(); + } else { + if (next) { + mLanguageSwitcher.next(); + } else { + mLanguageSwitcher.prev(); + } + } + mLanguageSwitcher.persist(mPrefs); + } + } + + private void initLanguageSwitcher(LatinIME service) { + final Configuration conf = service.getResources().getConfiguration(); + mLanguageSwitcher = new LanguageSwitcher(service); + mLanguageSwitcher.loadLocales(mPrefs); + mLanguageSwitcher.setSystemLocale(conf.locale); + } +} diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 3b898941f..1772b2669 100755..100644 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.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,24 +16,23 @@ package com.android.inputmethod.latin; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import android.content.Context; import android.text.AutoText; import android.text.TextUtils; import android.util.Log; import android.view.View; +import java.util.ArrayList; +import java.util.Arrays; + /** - * This class loads a dictionary and provides a list of suggestions for a given sequence of + * This class loads a dictionary and provides a list of suggestions for a given sequence of * characters. This includes corrections and completions. - * @hide pending API Council Approval */ public class Suggest implements Dictionary.WordCallback { + public static final String TAG = Suggest.class.getSimpleName(); + public static final int APPROX_MAX_WORD_LENGTH = 32; public static final int CORRECTION_NONE = 0; @@ -65,6 +64,8 @@ public class Suggest implements Dictionary.WordCallback { static final int LARGE_DICTIONARY_THRESHOLD = 200 * 1000; + private static boolean DBG = LatinImeLogger.sDBG; + private BinaryDictionary mMainDict; private Dictionary mUserDictionary; @@ -81,6 +82,7 @@ public class Suggest implements Dictionary.WordCallback { private boolean mAutoTextEnabled; + private double mAutoCorrectionThreshold; private int[] mPriorities = new int[mPrefMaxSuggestions]; private int[] mBigramPriorities = new int[PREF_MAX_BIGRAMS]; @@ -93,8 +95,7 @@ public class Suggest implements Dictionary.WordCallback { private ArrayList<CharSequence> mSuggestions = new ArrayList<CharSequence>(); ArrayList<CharSequence> mBigramSuggestions = new ArrayList<CharSequence>(); private ArrayList<CharSequence> mStringPool = new ArrayList<CharSequence>(); - private boolean mHaveCorrection; - private CharSequence mOriginalWord; + private boolean mHasAutoCorrection; private String mLowerOriginalWord; // TODO: Remove these member variables by passing more context to addWord() callback method @@ -103,13 +104,8 @@ public class Suggest implements Dictionary.WordCallback { private int mCorrectionMode = CORRECTION_BASIC; - public Suggest(Context context, int[] dictionaryResId) { - mMainDict = new BinaryDictionary(context, dictionaryResId, DIC_MAIN); - initPool(); - } - - public Suggest(Context context, ByteBuffer byteBuffer) { - mMainDict = new BinaryDictionary(context, byteBuffer, DIC_MAIN); + public Suggest(Context context, int dictionaryResId) { + mMainDict = BinaryDictionary.initDictionary(context, dictionaryResId, DIC_MAIN); initPool(); } @@ -133,7 +129,7 @@ public class Suggest implements Dictionary.WordCallback { } public boolean hasMainDictionary() { - return mMainDict.getSize() > LARGE_DICTIONARY_THRESHOLD; + return mMainDict != null && mMainDict.getSize() > LARGE_DICTIONARY_THRESHOLD; } public int getApproxMaxWordLength() { @@ -154,7 +150,7 @@ public class Suggest implements Dictionary.WordCallback { public void setContactsDictionary(Dictionary userDictionary) { mContactsDictionary = userDictionary; } - + public void setAutoDictionary(Dictionary autoDictionary) { mAutoDictionary = autoDictionary; } @@ -163,6 +159,10 @@ public class Suggest implements Dictionary.WordCallback { mUserBigramDictionary = userBigramDictionary; } + public void setAutoCorrectionThreshold(double threshold) { + mAutoCorrectionThreshold = threshold; + } + /** * Number of suggestions to generate from the input key sequence. This has * to be a number between 1 and 100 (inclusive). @@ -183,45 +183,24 @@ public class Suggest implements Dictionary.WordCallback { } } - private boolean haveSufficientCommonality(String original, CharSequence suggestion) { - final int originalLength = original.length(); - final int suggestionLength = suggestion.length(); - final int minLength = Math.min(originalLength, suggestionLength); - if (minLength <= 2) return true; - int matching = 0; - int lessMatching = 0; // Count matches if we skip one character - int i; - for (i = 0; i < minLength; i++) { - final char origChar = ExpandableDictionary.toLowerCase(original.charAt(i)); - if (origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i))) { - matching++; - lessMatching++; - } else if (i + 1 < suggestionLength - && origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i + 1))) { - lessMatching++; - } - } - matching = Math.max(matching, lessMatching); - - if (minLength <= 4) { - return matching >= 2; - } else { - return matching > minLength / 2; - } - } - /** - * Returns a list of words that match the list of character codes passed in. - * This list will be overwritten the next time this function is called. + * Returns a object which represents suggested words that match the list of character codes + * passed in. This object contents will be overwritten the next time this function is called. * @param view a view for retrieving the context for AutoText * @param wordComposer contains what is currently being typed * @param prevWordForBigram previous word (used only for bigram) - * @return list of suggestions. + * @return suggested words object. */ - public List<CharSequence> getSuggestions(View view, WordComposer wordComposer, - boolean includeTypedWordIfValid, CharSequence prevWordForBigram) { + public SuggestedWords getSuggestions(View view, WordComposer wordComposer, + CharSequence prevWordForBigram) { + return getSuggestedWordBuilder(view, wordComposer, prevWordForBigram).build(); + } + + // TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder + public SuggestedWords.Builder getSuggestedWordBuilder(View view, WordComposer wordComposer, + CharSequence prevWordForBigram) { LatinImeLogger.onStartSuggestion(prevWordForBigram); - mHaveCorrection = false; + mHasAutoCorrection = false; mIsFirstCharCapitalized = wordComposer.isFirstCharCapitalized(); mIsAllUpperCase = wordComposer.isAllUpperCase(); collectGarbage(mSuggestions, mPrefMaxSuggestions); @@ -229,13 +208,13 @@ public class Suggest implements Dictionary.WordCallback { Arrays.fill(mNextLettersFrequencies, 0); // Save a lowercase version of the original word - mOriginalWord = wordComposer.getTypedWord(); - if (mOriginalWord != null) { - final String mOriginalWordString = mOriginalWord.toString(); - mOriginalWord = mOriginalWordString; - mLowerOriginalWord = mOriginalWordString.toLowerCase(); + CharSequence typedWord = wordComposer.getTypedWord(); + if (typedWord != null) { + final String typedWordString = typedWord.toString(); + typedWord = typedWordString; + mLowerOriginalWord = typedWordString.toLowerCase(); // Treating USER_TYPED as UNIGRAM suggestion for logging now. - LatinImeLogger.onAddSuggestedWord(mOriginalWordString, Suggest.DIC_USER_TYPED, + LatinImeLogger.onAddSuggestedWord(typedWordString, Suggest.DIC_USER_TYPED, Dictionary.DataType.UNIGRAM); } else { mLowerOriginalWord = ""; @@ -249,7 +228,7 @@ public class Suggest implements Dictionary.WordCallback { if (!TextUtils.isEmpty(prevWordForBigram)) { CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase(); - if (mMainDict.isValidWord(lowerPrevWord)) { + if (mMainDict != null && mMainDict.isValidWord(lowerPrevWord)) { prevWordForBigram = lowerPrevWord; } if (mUserBigramDictionary != null) { @@ -293,29 +272,37 @@ public class Suggest implements Dictionary.WordCallback { mContactsDictionary.getWords(wordComposer, this, mNextLettersFrequencies); } - if (mSuggestions.size() > 0 && isValidWord(mOriginalWord) + if (mSuggestions.size() > 0 && isValidWord(typedWord) && (mCorrectionMode == CORRECTION_FULL || mCorrectionMode == CORRECTION_FULL_BIGRAM)) { - mHaveCorrection = true; + if (DBG) { + Log.d(TAG, "Auto corrected by CORRECTION_FULL."); + } + mHasAutoCorrection = true; } } - mMainDict.getWords(wordComposer, this, mNextLettersFrequencies); + if (mMainDict != null) mMainDict.getWords(wordComposer, this, mNextLettersFrequencies); if ((mCorrectionMode == CORRECTION_FULL || mCorrectionMode == CORRECTION_FULL_BIGRAM) - && mSuggestions.size() > 0) { - mHaveCorrection = true; + && mSuggestions.size() > 0 && mPriorities.length > 0) { + // TODO: when the normalized score of the first suggestion is nearly equals to + // the normalized score of the second suggestion, behave less aggressive. + final double normalizedScore = Utils.calcNormalizedScore( + typedWord, mSuggestions.get(0), mPriorities[0]); + if (LatinImeLogger.sDBG) { + Log.d(TAG, "Normalized " + typedWord + "," + mSuggestions.get(0) + "," + + mPriorities[0] + normalizedScore + + "(" + mAutoCorrectionThreshold + ")"); + } + if (normalizedScore >= mAutoCorrectionThreshold) { + if (DBG) { + Log.d(TAG, "Auto corrected by S-threthhold."); + } + mHasAutoCorrection = true; + } } } - if (mOriginalWord != null) { - mSuggestions.add(0, mOriginalWord.toString()); - } - - // Check if the first suggestion has a minimum number of characters in common - if (wordComposer.size() > 1 && mSuggestions.size() > 1 - && (mCorrectionMode == CORRECTION_FULL - || mCorrectionMode == CORRECTION_FULL_BIGRAM)) { - if (!haveSufficientCommonality(mLowerOriginalWord, mSuggestions.get(1))) { - mHaveCorrection = false; - } + if (typedWord != null) { + mSuggestions.add(0, typedWord.toString()); } if (mAutoTextEnabled) { int i = 0; @@ -326,8 +313,25 @@ public class Suggest implements Dictionary.WordCallback { String suggestedWord = mSuggestions.get(i).toString().toLowerCase(); CharSequence autoText = AutoText.get(suggestedWord, 0, suggestedWord.length(), view); - // Is there an AutoText correction? + // Is there an AutoText (also known as Quick Fixes) correction? boolean canAdd = autoText != null; + // Capitalize as needed + final int autoTextLength = autoText != null ? autoText.length() : 0; + if (autoTextLength > 0 && (mIsAllUpperCase || mIsFirstCharCapitalized)) { + int poolSize = mStringPool.size(); + StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove( + poolSize - 1) : new StringBuilder(getApproxMaxWordLength()); + sb.setLength(0); + if (mIsAllUpperCase) { + sb.append(autoText.toString().toUpperCase()); + } else if (mIsFirstCharCapitalized) { + sb.append(Character.toUpperCase(autoText.charAt(0))); + if (autoTextLength > 1) { + sb.append(autoText.subSequence(1, autoTextLength)); + } + } + autoText = sb.toString(); + } // Is that correction already the current prediction (or original word)? canAdd &= !TextUtils.equals(autoText, mSuggestions.get(i)); // Is that correction already the next predicted word? @@ -335,7 +339,10 @@ public class Suggest implements Dictionary.WordCallback { canAdd &= !TextUtils.equals(autoText, mSuggestions.get(i + 1)); } if (canAdd) { - mHaveCorrection = true; + if (DBG) { + Log.d(TAG, "Auto corrected by AUTOTEXT."); + } + mHasAutoCorrection = true; mSuggestions.add(i + 1, autoText); i++; } @@ -343,7 +350,7 @@ public class Suggest implements Dictionary.WordCallback { } } removeDupes(); - return mSuggestions; + return new SuggestedWords.Builder().addWords(mSuggestions, null); } public int[] getNextLettersFrequencies() { @@ -377,11 +384,11 @@ public class Suggest implements Dictionary.WordCallback { } } - public boolean hasMinimalCorrection() { - return mHaveCorrection; + public boolean hasAutoCorrection() { + return mHasAutoCorrection; } - private boolean compareCaseInsensitive(final String mLowerOriginalWord, + private boolean compareCaseInsensitive(final String mLowerOriginalWord, final char[] word, final int offset, final int length) { final int originalLength = mLowerOriginalWord.length(); if (originalLength == length && Character.isUpperCase(word[offset])) { @@ -395,6 +402,7 @@ public class Suggest implements Dictionary.WordCallback { return false; } + @Override public boolean addWord(final char[] word, final int offset, final int length, int freq, final int dicTypeId, final Dictionary.DataType dataType) { Dictionary.DataType dataTypeForLog = dataType; @@ -450,11 +458,10 @@ public class Suggest implements Dictionary.WordCallback { return true; } - System.arraycopy(priorities, pos, priorities, pos + 1, - prefMaxSuggestions - pos - 1); + System.arraycopy(priorities, pos, priorities, pos + 1, prefMaxSuggestions - pos - 1); priorities[pos] = freq; int poolSize = mStringPool.size(); - StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) + StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) : new StringBuilder(getApproxMaxWordLength()); sb.setLength(0); if (mIsAllUpperCase) { @@ -500,7 +507,7 @@ public class Suggest implements Dictionary.WordCallback { } public boolean isValidWord(final CharSequence word) { - if (word == null || word.length() == 0) { + if (word == null || word.length() == 0 || mMainDict == null) { return false; } return mMainDict.isValidWord(word) @@ -508,7 +515,7 @@ public class Suggest implements Dictionary.WordCallback { || (mAutoDictionary != null && mAutoDictionary.isValidWord(word)) || (mContactsDictionary != null && mContactsDictionary.isValidWord(word)); } - + private void collectGarbage(ArrayList<CharSequence> suggestions, int prefMaxSuggestions) { int poolSize = mStringPool.size(); int garbageSize = suggestions.size(); @@ -529,6 +536,23 @@ public class Suggest implements Dictionary.WordCallback { public void close() { if (mMainDict != null) { mMainDict.close(); + mMainDict = null; + } + if (mUserDictionary != null) { + mUserDictionary.close(); + mUserDictionary = null; + } + if (mUserBigramDictionary != null) { + mUserBigramDictionary.close(); + mUserBigramDictionary = null; + } + if (mContactsDictionary != null) { + mContactsDictionary.close(); + mContactsDictionary = null; + } + if (mAutoDictionary != null) { + mAutoDictionary.close(); + mAutoDictionary = null; } } } diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java new file mode 100644 index 000000000..f774ce3a5 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java @@ -0,0 +1,190 @@ +/* + * 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.latin; + +import android.view.inputmethod.CompletionInfo; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; + +public class SuggestedWords { + public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, null); + + public final List<CharSequence> mWords; + public final boolean mIsApplicationSpecifiedCompletions; + public final boolean mTypedWordValid; + public final boolean mHasMinimalSuggestion; + public final List<SuggestedWordInfo> mSuggestedWordInfoList; + + private SuggestedWords(List<CharSequence> words, boolean isApplicationSpecifiedCompletions, + boolean typedWordValid, boolean hasMinamlSuggestion, + List<SuggestedWordInfo> suggestedWordInfoList) { + if (words != null) { + mWords = words; + } else { + mWords = Collections.emptyList(); + } + mIsApplicationSpecifiedCompletions = isApplicationSpecifiedCompletions; + mTypedWordValid = typedWordValid; + mHasMinimalSuggestion = hasMinamlSuggestion; + mSuggestedWordInfoList = suggestedWordInfoList; + } + + public int size() { + return mWords.size(); + } + + public CharSequence getWord(int pos) { + return mWords.get(pos); + } + + public boolean hasAutoCorrectionWord() { + return mHasMinimalSuggestion && size() > 1 && !mTypedWordValid; + } + + public boolean hasWordAboveAutoCorrectionScoreThreshold() { + return mHasMinimalSuggestion && ((size() > 1 && !mTypedWordValid) || mTypedWordValid); + } + + public static class Builder { + private List<CharSequence> mWords = new ArrayList<CharSequence>(); + private boolean mIsCompletions; + private boolean mTypedWordValid; + private boolean mHasMinimalSuggestion; + private List<SuggestedWordInfo> mSuggestedWordInfoList = + new ArrayList<SuggestedWordInfo>(); + + public Builder() { + // Nothing to do here. + } + + public Builder addWords(List<CharSequence> words, + List<SuggestedWordInfo> suggestedWordInfoList) { + final int N = words.size(); + for (int i = 0; i < N; ++i) { + SuggestedWordInfo suggestedWordInfo = null; + if (suggestedWordInfoList != null) { + suggestedWordInfo = suggestedWordInfoList.get(i); + } + if (suggestedWordInfo == null) { + suggestedWordInfo = new SuggestedWordInfo(); + } + addWord(words.get(i), suggestedWordInfo); + } + return this; + } + + public Builder addWord(CharSequence word) { + return addWord(word, null, false); + } + + public Builder addWord(CharSequence word, CharSequence debugString, + boolean isPreviousSuggestedWord) { + SuggestedWordInfo info = new SuggestedWordInfo(debugString, isPreviousSuggestedWord); + return addWord(word, info); + } + + private Builder addWord(CharSequence word, SuggestedWordInfo suggestedWordInfo) { + mWords.add(word); + mSuggestedWordInfoList.add(suggestedWordInfo); + return this; + } + + public Builder setApplicationSpecifiedCompletions(CompletionInfo[] infos) { + for (CompletionInfo info : infos) + addWord(info.getText()); + mIsCompletions = true; + return this; + } + + public Builder setTypedWordValid(boolean typedWordValid) { + mTypedWordValid = typedWordValid; + return this; + } + + public Builder setHasMinimalSuggestion(boolean hasMinamlSuggestion) { + mHasMinimalSuggestion = hasMinamlSuggestion; + return this; + } + + // Should get rid of the first one (what the user typed previously) from suggestions + // and replace it with what the user currently typed. + public Builder addTypedWordAndPreviousSuggestions(CharSequence typedWord, + SuggestedWords previousSuggestions) { + mWords.clear(); + mSuggestedWordInfoList.clear(); + final HashSet<String> alreadySeen = new HashSet<String>(); + addWord(typedWord, null, false); + alreadySeen.add(typedWord.toString()); + final int previousSize = previousSuggestions.size(); + for (int pos = 1; pos < previousSize; pos++) { + final String prevWord = previousSuggestions.getWord(pos).toString(); + // Filter out duplicate suggestion. + if (!alreadySeen.contains(prevWord)) { + addWord(prevWord, null, true); + alreadySeen.add(prevWord); + } + } + mIsCompletions = false; + mTypedWordValid = false; + mHasMinimalSuggestion = false; + return this; + } + + public SuggestedWords build() { + return new SuggestedWords(mWords, mIsCompletions, mTypedWordValid, + mHasMinimalSuggestion, mSuggestedWordInfoList); + } + + public int size() { + return mWords.size(); + } + + public CharSequence getWord(int pos) { + return mWords.get(pos); + } + } + + public static class SuggestedWordInfo { + private final CharSequence mDebugString; + private final boolean mPreviousSuggestedWord; + + public SuggestedWordInfo() { + mDebugString = ""; + mPreviousSuggestedWord = false; + } + + public SuggestedWordInfo(CharSequence debugString, boolean previousSuggestedWord) { + mDebugString = debugString; + mPreviousSuggestedWord = previousSuggestedWord; + } + + public String getDebugString() { + if (mDebugString == null) { + return ""; + } else { + return mDebugString.toString(); + } + } + + public boolean isPreviousSuggestedWord () { + return mPreviousSuggestedWord; + } + } +} diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java index 9011191f1..f571f26d5 100644 --- a/java/src/com/android/inputmethod/latin/TextEntryState.java +++ b/java/src/com/android/inputmethod/latin/TextEntryState.java @@ -16,8 +16,9 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.keyboard.Key; + import android.content.Context; -import android.inputmethodservice.Keyboard.Key; import android.text.format.DateFormat; import android.util.Log; @@ -61,7 +62,7 @@ public class TextEntryState { SPACE_AFTER_PICKED, UNDO_COMMIT, CORRECTING, - PICKED_CORRECTION; + PICKED_CORRECTION, } private static State sState = State.UNKNOWN; @@ -96,7 +97,7 @@ public class TextEntryState { } try { sKeyLocationFile.close(); - // Write to log file + // Write to log file // Write timestamp, settings, String out = DateFormat.format("MM:dd hh:mm:ss", Calendar.getInstance().getTime()) .toString() @@ -112,7 +113,7 @@ public class TextEntryState { sKeyLocationFile = null; sUserActionFile = null; } catch (IOException ioe) { - + // ignore } } @@ -134,16 +135,18 @@ public class TextEntryState { public static void backToAcceptedDefault(CharSequence typedWord) { if (typedWord == null) return; switch (sState) { - case SPACE_AFTER_ACCEPTED: - case PUNCTUATION_AFTER_ACCEPTED: - case IN_WORD: - sState = State.ACCEPTED_DEFAULT; - break; + case SPACE_AFTER_ACCEPTED: + case PUNCTUATION_AFTER_ACCEPTED: + case IN_WORD: + sState = State.ACCEPTED_DEFAULT; + break; + default: + break; } displayState(); } - public static void acceptedTyped(CharSequence typedWord) { + public static void acceptedTyped(@SuppressWarnings("unused") CharSequence typedWord) { sWordNotInDictionaryCount++; sState = State.PICKED_SUGGESTION; displayState(); @@ -168,6 +171,13 @@ public class TextEntryState { displayState(); } + public static void onAbortCorrection() { + if (isCorrecting()) { + sState = State.START; + } + displayState(); + } + public static void typedCharacter(char c, boolean isSeparator) { boolean isSpace = c == ' '; switch (sState) { @@ -253,13 +263,13 @@ public class TextEntryState { } public static void keyPressedAt(Key key, int x, int y) { - if (LOGGING && sKeyLocationFile != null && key.codes[0] >= 32) { - String out = - "KEY: " + (char) key.codes[0] - + " X: " + x + if (LOGGING && sKeyLocationFile != null && key.mCode >= 32) { + String out = + "KEY: " + (char) key.mCode + + " X: " + x + " Y: " + y - + " MX: " + (key.x + key.width / 2) - + " MY: " + (key.y + key.height / 2) + + " MX: " + (key.mX + key.mWidth / 2) + + " MY: " + (key.mY + key.mHeight / 2) + "\n"; try { sKeyLocationFile.write(out.getBytes()); diff --git a/java/src/com/android/inputmethod/latin/Tutorial.java b/java/src/com/android/inputmethod/latin/Tutorial.java deleted file mode 100644 index d3eaf30c6..000000000 --- a/java/src/com/android/inputmethod/latin/Tutorial.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * 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 - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.os.Message; -import android.text.Layout; -import android.text.SpannableStringBuilder; -import android.text.StaticLayout; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnTouchListener; -import android.widget.PopupWindow; -import android.widget.TextView; - -import java.util.ArrayList; -import java.util.List; - -public class Tutorial implements OnTouchListener { - - private List<Bubble> mBubbles = new ArrayList<Bubble>(); - private View mInputView; - private LatinIME mIme; - private int[] mLocation = new int[2]; - - private static final int MSG_SHOW_BUBBLE = 0; - - private int mBubbleIndex; - - Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_SHOW_BUBBLE: - Bubble bubba = (Bubble) msg.obj; - bubba.show(mLocation[0], mLocation[1]); - break; - } - } - }; - - class Bubble { - Drawable bubbleBackground; - int x; - int y; - int width; - int gravity; - CharSequence text; - boolean dismissOnTouch; - boolean dismissOnClose; - PopupWindow window; - TextView textView; - View inputView; - - Bubble(Context context, View inputView, - int backgroundResource, int bx, int by, int textResource1, int textResource2) { - bubbleBackground = context.getResources().getDrawable(backgroundResource); - x = bx; - y = by; - width = (int) (inputView.getWidth() * 0.9); - this.gravity = Gravity.TOP | Gravity.LEFT; - text = new SpannableStringBuilder() - .append(context.getResources().getText(textResource1)) - .append("\n") - .append(context.getResources().getText(textResource2)); - this.dismissOnTouch = true; - this.dismissOnClose = false; - this.inputView = inputView; - window = new PopupWindow(context); - window.setBackgroundDrawable(null); - LayoutInflater inflate = - (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - textView = (TextView) inflate.inflate(R.layout.bubble_text, null); - textView.setBackgroundDrawable(bubbleBackground); - textView.setText(text); - //textView.setText(textResource1); - window.setContentView(textView); - window.setFocusable(false); - window.setTouchable(true); - window.setOutsideTouchable(false); - } - - private int chooseSize(PopupWindow pop, View parentView, CharSequence text, TextView tv) { - int wid = tv.getPaddingLeft() + tv.getPaddingRight(); - int ht = tv.getPaddingTop() + tv.getPaddingBottom(); - - /* - * Figure out how big the text would be if we laid it out to the - * full width of this view minus the border. - */ - int cap = width - wid; - - Layout l = new StaticLayout(text, tv.getPaint(), cap, - Layout.Alignment.ALIGN_NORMAL, 1, 0, true); - float max = 0; - for (int i = 0; i < l.getLineCount(); i++) { - max = Math.max(max, l.getLineWidth(i)); - } - - /* - * Now set the popup size to be big enough for the text plus the border. - */ - pop.setWidth(width); - pop.setHeight(ht + l.getHeight()); - return l.getHeight(); - } - - void show(int offx, int offy) { - int textHeight = chooseSize(window, inputView, text, textView); - offy -= textView.getPaddingTop() + textHeight; - if (inputView.getVisibility() == View.VISIBLE - && inputView.getWindowVisibility() == View.VISIBLE) { - try { - if ((gravity & Gravity.BOTTOM) == Gravity.BOTTOM) offy -= window.getHeight(); - if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) offx -= window.getWidth(); - textView.setOnTouchListener(new View.OnTouchListener() { - public boolean onTouch(View view, MotionEvent me) { - Tutorial.this.next(); - return true; - } - }); - window.showAtLocation(inputView, Gravity.NO_GRAVITY, x + offx, y + offy); - } catch (Exception e) { - // Input view is not valid - } - } - } - - void hide() { - if (window.isShowing()) { - textView.setOnTouchListener(null); - window.dismiss(); - } - } - - boolean isShowing() { - return window.isShowing(); - } - } - - public Tutorial(LatinIME ime, LatinKeyboardView inputView) { - Context context = inputView.getContext(); - mIme = ime; - int inputWidth = inputView.getWidth(); - final int x = inputWidth / 20; // Half of 1/10th - Bubble bWelcome = new Bubble(context, inputView, - R.drawable.dialog_bubble_step02, x, 0, - R.string.tip_to_open_keyboard, R.string.touch_to_continue); - mBubbles.add(bWelcome); - Bubble bAccents = new Bubble(context, inputView, - R.drawable.dialog_bubble_step02, x, 0, - R.string.tip_to_view_accents, R.string.touch_to_continue); - mBubbles.add(bAccents); - Bubble b123 = new Bubble(context, inputView, - R.drawable.dialog_bubble_step07, x, 0, - R.string.tip_to_open_symbols, R.string.touch_to_continue); - mBubbles.add(b123); - Bubble bABC = new Bubble(context, inputView, - R.drawable.dialog_bubble_step07, x, 0, - R.string.tip_to_close_symbols, R.string.touch_to_continue); - mBubbles.add(bABC); - Bubble bSettings = new Bubble(context, inputView, - R.drawable.dialog_bubble_step07, x, 0, - R.string.tip_to_launch_settings, R.string.touch_to_continue); - mBubbles.add(bSettings); - Bubble bDone = new Bubble(context, inputView, - R.drawable.dialog_bubble_step02, x, 0, - R.string.tip_to_start_typing, R.string.touch_to_finish); - mBubbles.add(bDone); - mInputView = inputView; - } - - void start() { - mInputView.getLocationInWindow(mLocation); - mBubbleIndex = -1; - mInputView.setOnTouchListener(this); - next(); - } - - boolean next() { - if (mBubbleIndex >= 0) { - // If the bubble is not yet showing, don't move to the next. - if (!mBubbles.get(mBubbleIndex).isShowing()) { - return true; - } - // Hide all previous bubbles as well, as they may have had a delayed show - for (int i = 0; i <= mBubbleIndex; i++) { - mBubbles.get(i).hide(); - } - } - mBubbleIndex++; - if (mBubbleIndex >= mBubbles.size()) { - mInputView.setOnTouchListener(null); - mIme.sendDownUpKeyEvents(-1); // Inform the setupwizard that tutorial is in last bubble - mIme.tutorialDone(); - return false; - } - if (mBubbleIndex == 3 || mBubbleIndex == 4) { - mIme.mKeyboardSwitcher.toggleSymbols(); - } - mHandler.sendMessageDelayed( - mHandler.obtainMessage(MSG_SHOW_BUBBLE, mBubbles.get(mBubbleIndex)), 500); - return true; - } - - void hide() { - for (int i = 0; i < mBubbles.size(); i++) { - mBubbles.get(i).hide(); - } - mInputView.setOnTouchListener(null); - } - - boolean close() { - mHandler.removeMessages(MSG_SHOW_BUBBLE); - hide(); - return true; - } - - public boolean onTouch(View v, MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { - next(); - } - return true; - } -} diff --git a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java index 67d9c0bcf..4750fb991 100644 --- a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java +++ b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java @@ -16,10 +16,6 @@ package com.android.inputmethod.latin; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; - import android.content.ContentValues; import android.content.Context; import android.database.Cursor; @@ -30,6 +26,10 @@ import android.os.AsyncTask; import android.provider.BaseColumns; import android.util.Log; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; + /** * Stores all the pairs user types in databases. Prune the database if the size * gets too big. Unlike AutoDictionary, it even stores the pairs that are already @@ -108,25 +108,25 @@ public class UserBigramDictionary extends ExpandableDictionary { private static DatabaseHelper sOpenHelper = null; private static class Bigram { - String word1; - String word2; - int frequency; + public final String mWord1; + public final String mWord2; + public final int frequency; Bigram(String word1, String word2, int frequency) { - this.word1 = word1; - this.word2 = word2; + this.mWord1 = word1; + this.mWord2 = word2; this.frequency = frequency; } @Override public boolean equals(Object bigram) { Bigram bigram2 = (Bigram) bigram; - return (word1.equals(bigram2.word1) && word2.equals(bigram2.word2)); + return (mWord1.equals(bigram2.mWord1) && mWord2.equals(bigram2.mWord2)); } @Override public int hashCode() { - return (word1 + " " + word2).hashCode(); + return (mWord1 + " " + mWord2).hashCode(); } } @@ -357,7 +357,7 @@ public class UserBigramDictionary extends ExpandableDictionary { Cursor c = db.query(MAIN_TABLE_NAME, new String[] { MAIN_COLUMN_ID }, MAIN_COLUMN_WORD1 + "=? AND " + MAIN_COLUMN_WORD2 + "=? AND " + MAIN_COLUMN_LOCALE + "=?", - new String[] { bi.word1, bi.word2, mLocale }, null, null, null); + new String[] { bi.mWord1, bi.mWord2, mLocale }, null, null, null); int pairId; if (c.moveToFirst()) { @@ -368,7 +368,7 @@ public class UserBigramDictionary extends ExpandableDictionary { } else { // new pair Long pairIdLong = db.insert(MAIN_TABLE_NAME, null, - getContentValues(bi.word1, bi.word2, mLocale)); + getContentValues(bi.mWord1, bi.mWord2, mLocale)); pairId = pairIdLong.intValue(); } c.close(); diff --git a/java/src/com/android/inputmethod/latin/UserDictionary.java b/java/src/com/android/inputmethod/latin/UserDictionary.java index 49b95e9aa..56ee5b9e7 100644 --- a/java/src/com/android/inputmethod/latin/UserDictionary.java +++ b/java/src/com/android/inputmethod/latin/UserDictionary.java @@ -21,18 +21,21 @@ import android.content.ContentValues; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; +import android.net.Uri; import android.provider.UserDictionary.Words; public class UserDictionary extends ExpandableDictionary { - private static final String[] PROJECTION = { - Words._ID, + private static final String[] PROJECTION_QUERY = { Words.WORD, - Words.FREQUENCY + Words.FREQUENCY, }; - private static final int INDEX_WORD = 1; - private static final int INDEX_FREQUENCY = 2; + private static final String[] PROJECTION_ADD = { + Words._ID, + Words.FREQUENCY, + Words.LOCALE, + }; private ContentObserver mObserver; private String mLocale; @@ -66,7 +69,7 @@ public class UserDictionary extends ExpandableDictionary { @Override public void loadDictionaryAsync() { Cursor cursor = getContext().getContentResolver() - .query(Words.CONTENT_URI, PROJECTION, "(locale IS NULL) or (locale=?)", + .query(Words.CONTENT_URI, PROJECTION_QUERY, "(locale IS NULL) or (locale=?)", new String[] { mLocale }, null); addWords(cursor); } @@ -80,7 +83,7 @@ public class UserDictionary extends ExpandableDictionary { * @TODO use a higher or float range for frequency */ @Override - public synchronized void addWord(String word, int frequency) { + public synchronized void addWord(final String word, final int frequency) { // Force load the dictionary here synchronously if (getRequiresReload()) loadDictionaryAsync(); // Safeguard against adding long words. Can cause stack overflow. @@ -97,8 +100,24 @@ public class UserDictionary extends ExpandableDictionary { final ContentResolver contentResolver = getContext().getContentResolver(); new Thread("addWord") { + @Override public void run() { - contentResolver.insert(Words.CONTENT_URI, values); + Cursor cursor = contentResolver.query(Words.CONTENT_URI, PROJECTION_ADD, + "word=? and ((locale IS NULL) or (locale=?))", + new String[] { word, mLocale }, null); + if (cursor != null && cursor.moveToFirst()) { + String locale = cursor.getString(cursor.getColumnIndex(Words.LOCALE)); + // If locale is null, we will not override the entry. + if (locale != null && locale.equals(mLocale.toString())) { + long id = cursor.getLong(cursor.getColumnIndex(Words._ID)); + Uri uri = Uri.withAppendedPath(Words.CONTENT_URI, Long.toString(id)); + // Update the entry with new frequency value. + contentResolver.update(uri, values, null, null); + } + } else { + // Insert new entry. + contentResolver.insert(Words.CONTENT_URI, values); + } } }.start(); @@ -122,9 +141,11 @@ public class UserDictionary extends ExpandableDictionary { final int maxWordLength = getMaxWordLength(); if (cursor.moveToFirst()) { + final int indexWord = cursor.getColumnIndex(Words.WORD); + final int indexFrequency = cursor.getColumnIndex(Words.FREQUENCY); while (!cursor.isAfterLast()) { - String word = cursor.getString(INDEX_WORD); - int frequency = cursor.getInt(INDEX_FREQUENCY); + String word = cursor.getString(indexWord); + int frequency = cursor.getInt(indexFrequency); // Safeguard against adding really long words. Stack may overflow due // to recursion if (word.length() < maxWordLength) { diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java new file mode 100644 index 000000000..5059860d7 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/Utils.java @@ -0,0 +1,428 @@ +/* + * 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.latin; + +import android.inputmethodservice.InputMethodService; +import android.os.AsyncTask; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Process; +import android.text.format.DateUtils; +import android.util.Log; +import android.view.inputmethod.InputMethodInfo; +import android.view.inputmethod.InputMethodManager; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Utils { + private static final String TAG = Utils.class.getSimpleName(); + private static boolean DBG = LatinImeLogger.sDBG; + + /** + * Cancel an {@link AsyncTask}. + * + * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this + * task should be interrupted; otherwise, in-progress tasks are allowed + * to complete. + */ + public static void cancelTask(AsyncTask<?, ?, ?> task, boolean mayInterruptIfRunning) { + if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) { + task.cancel(mayInterruptIfRunning); + } + } + + public static class GCUtils { + private static final String TAG = "GCUtils"; + public static final int GC_TRY_COUNT = 2; + // GC_TRY_LOOP_MAX is used for the hard limit of GC wait, + // GC_TRY_LOOP_MAX should be greater than GC_TRY_COUNT. + public static final int GC_TRY_LOOP_MAX = 5; + private static final long GC_INTERVAL = DateUtils.SECOND_IN_MILLIS; + private static GCUtils sInstance = new GCUtils(); + private int mGCTryCount = 0; + + public static GCUtils getInstance() { + return sInstance; + } + + public void reset() { + mGCTryCount = 0; + } + + public boolean tryGCOrWait(String metaData, Throwable t) { + if (mGCTryCount == 0) { + System.gc(); + } + if (++mGCTryCount > GC_TRY_COUNT) { + LatinImeLogger.logOnException(metaData, t); + return false; + } else { + try { + Thread.sleep(GC_INTERVAL); + return true; + } catch (InterruptedException e) { + Log.e(TAG, "Sleep was interrupted."); + LatinImeLogger.logOnException(metaData, t); + return false; + } + } + } + } + + public static boolean hasMultipleEnabledIMEsOrSubtypes(InputMethodManager imm) { + return imm.getEnabledInputMethodList().size() > 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; + } + + public static String getInputMethodId(InputMethodManager imm, String packageName) { + for (final InputMethodInfo imi : imm.getEnabledInputMethodList()) { + if (imi.getPackageName().equals(packageName)) + return imi.getId(); + } + throw new RuntimeException("Can not find input method id for " + packageName); + } + + public static boolean shouldBlockedBySafetyNetForAutoCorrection(SuggestedWords suggestions) { + // Safety net for auto correction. + // Actually if we hit this safety net, it's actually a bug. + if (suggestions.size() <= 1 || suggestions.mTypedWordValid) return false; + CharSequence typedWord = suggestions.getWord(0); + CharSequence candidateWord = suggestions.getWord(1); + final int typedWordLength = typedWord.length(); + final int maxEditDistanceOfNativeDictionary = typedWordLength < 5 ? 2 : typedWordLength / 2; + final int distance = Utils.editDistance(typedWord, candidateWord); + if (DBG) { + Log.d(TAG, "Autocorrected edit distance = " + distance + + ", " + maxEditDistanceOfNativeDictionary); + } + if (distance > maxEditDistanceOfNativeDictionary) { + Log.w(TAG, "(Error) The edit distance of this correction exceeds limit. " + + "Turning off auto-correction."); + return true; + } else { + return false; + } + } + + /* package */ static class RingCharBuffer { + private static RingCharBuffer sRingCharBuffer = new RingCharBuffer(); + private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC'; + private static final int INVALID_COORDINATE = -2; + /* package */ static final int BUFSIZE = 20; + private InputMethodService mContext; + private boolean mEnabled = false; + private boolean mUsabilityStudy = false; + private int mEnd = 0; + /* package */ int mLength = 0; + private char[] mCharBuf = new char[BUFSIZE]; + private int[] mXBuf = new int[BUFSIZE]; + private int[] mYBuf = new int[BUFSIZE]; + + private RingCharBuffer() { + // Intentional empty constructor for singleton. + } + public static RingCharBuffer getInstance() { + return sRingCharBuffer; + } + public static RingCharBuffer init(InputMethodService context, boolean enabled, + boolean usabilityStudy) { + sRingCharBuffer.mContext = context; + sRingCharBuffer.mEnabled = enabled || usabilityStudy; + sRingCharBuffer.mUsabilityStudy = usabilityStudy; + UsabilityStudyLogUtils.getInstance().init(context); + return sRingCharBuffer; + } + private int normalize(int in) { + int ret = in % BUFSIZE; + return ret < 0 ? ret + BUFSIZE : ret; + } + public void push(char c, int x, int y) { + if (!mEnabled) return; + if (mUsabilityStudy) { + UsabilityStudyLogUtils.getInstance().writeChar(c, x, y); + } + mCharBuf[mEnd] = c; + mXBuf[mEnd] = x; + mYBuf[mEnd] = y; + mEnd = normalize(mEnd + 1); + if (mLength < BUFSIZE) { + ++mLength; + } + } + public char pop() { + if (mLength < 1) { + return PLACEHOLDER_DELIMITER_CHAR; + } else { + mEnd = normalize(mEnd - 1); + --mLength; + return mCharBuf[mEnd]; + } + } + public char getLastChar() { + if (mLength < 1) { + return PLACEHOLDER_DELIMITER_CHAR; + } else { + return mCharBuf[normalize(mEnd - 1)]; + } + } + public int getPreviousX(char c, int back) { + int index = normalize(mEnd - 2 - back); + if (mLength <= back + || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) { + return INVALID_COORDINATE; + } else { + return mXBuf[index]; + } + } + public int getPreviousY(char c, int back) { + int index = normalize(mEnd - 2 - back); + if (mLength <= back + || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) { + return INVALID_COORDINATE; + } else { + return mYBuf[index]; + } + } + public String getLastString() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < mLength; ++i) { + char c = mCharBuf[normalize(mEnd - 1 - i)]; + if (!((LatinIME)mContext).isWordSeparator(c)) { + sb.append(c); + } else { + break; + } + } + return sb.reverse().toString(); + } + public void reset() { + mLength = 0; + } + } + + public static int editDistance(CharSequence s, CharSequence t) { + if (s == null || t == null) { + throw new IllegalArgumentException("editDistance: Arguments should not be null."); + } + final int sl = s.length(); + final int tl = t.length(); + int[][] dp = new int [sl + 1][tl + 1]; + for (int i = 0; i <= sl; i++) { + dp[i][0] = i; + } + for (int j = 0; j <= tl; j++) { + dp[0][j] = j; + } + for (int i = 0; i < sl; ++i) { + for (int j = 0; j < tl; ++j) { + if (Character.toLowerCase(s.charAt(i)) == Character.toLowerCase(t.charAt(j))) { + dp[i + 1][j + 1] = dp[i][j]; + } else { + dp[i + 1][j + 1] = 1 + Math.min(dp[i][j], + Math.min(dp[i + 1][j], dp[i][j + 1])); + } + } + } + return dp[sl][tl]; + } + + // In dictionary.cpp, getSuggestion() method, + // suggestion scores are computed using the below formula. + // original score (called 'frequency') + // := pow(mTypedLetterMultiplier (this is defined 2), + // (the number of matched characters between typed word and suggested word)) + // * (individual word's score which defined in the unigram dictionary, + // and this score is defined in range [0, 255].) + // * (when before.length() == after.length(), + // mFullWordMultiplier (this is defined 2)) + // So, maximum original score is pow(2, before.length()) * 255 * 2 + // So, we can normalize original score by dividing this value. + private static final int MAX_INITIAL_SCORE = 255; + private static final int TYPED_LETTER_MULTIPLIER = 2; + private static final int FULL_WORD_MULTIPLYER = 2; + public static double calcNormalizedScore(CharSequence before, CharSequence after, int score) { + final int beforeLength = before.length(); + final int afterLength = after.length(); + final int distance = editDistance(before, after); + final double maximumScore = MAX_INITIAL_SCORE + * Math.pow(TYPED_LETTER_MULTIPLIER, beforeLength) + * FULL_WORD_MULTIPLYER; + // add a weight based on edit distance. + // distance <= max(afterLength, beforeLength) == afterLength, + // so, 0 <= distance / afterLength <= 1 + final double weight = 1.0 - (double) distance / afterLength; + return (score / maximumScore) * weight; + } + + public static class UsabilityStudyLogUtils { + private static final String TAG = "UsabilityStudyLogUtils"; + private static final String FILENAME = "log.txt"; + private static final UsabilityStudyLogUtils sInstance = + new UsabilityStudyLogUtils(); + private final Handler mLoggingHandler; + private File mFile; + private File mDirectory; + private InputMethodService mIms; + private PrintWriter mWriter; + private final Date mDate; + private final SimpleDateFormat mDateFormat; + + private UsabilityStudyLogUtils() { + mDate = new Date(); + mDateFormat = new SimpleDateFormat("dd MMM HH:mm:ss.SSS"); + + HandlerThread handlerThread = new HandlerThread("UsabilityStudyLogUtils logging task", + Process.THREAD_PRIORITY_BACKGROUND); + handlerThread.start(); + mLoggingHandler = new Handler(handlerThread.getLooper()); + } + + public static UsabilityStudyLogUtils getInstance() { + return sInstance; + } + + public void init(InputMethodService ims) { + mIms = ims; + mDirectory = ims.getFilesDir(); + } + + private void createLogFileIfNotExist() { + if ((mFile == null || !mFile.exists()) + && (mDirectory != null && mDirectory.exists())) { + try { + mWriter = getPrintWriter(mDirectory, FILENAME, false); + } catch (IOException e) { + Log.e(TAG, "Can't create log file."); + } + } + } + + public void writeBackSpace() { + UsabilityStudyLogUtils.getInstance().write("<backspace>\t0\t0"); + } + + public void writeChar(char c, int x, int y) { + String inputChar = String.valueOf(c); + switch (c) { + case '\n': + inputChar = "<enter>"; + break; + case '\t': + inputChar = "<tab>"; + break; + case ' ': + inputChar = "<space>"; + break; + } + UsabilityStudyLogUtils.getInstance().write(inputChar + "\t" + x + "\t" + y); + LatinImeLogger.onPrintAllUsabilityStudyLogs(); + } + + public void write(final String log) { + mLoggingHandler.post(new Runnable() { + @Override + public void run() { + createLogFileIfNotExist(); + final long currentTime = System.currentTimeMillis(); + mDate.setTime(currentTime); + + final String printString = String.format("%s\t%d\t%s\n", + mDateFormat.format(mDate), currentTime, log); + if (LatinImeLogger.sDBG) { + Log.d(TAG, "Write: " + log); + } + mWriter.print(printString); + } + }); + } + + public void printAll() { + mLoggingHandler.post(new Runnable() { + @Override + public void run() { + mWriter.flush(); + StringBuilder sb = new StringBuilder(); + BufferedReader br = getBufferedReader(); + String line; + try { + while ((line = br.readLine()) != null) { + sb.append('\n'); + sb.append(line); + } + } catch (IOException e) { + Log.e(TAG, "Can't read log file."); + } finally { + if (LatinImeLogger.sDBG) { + Log.d(TAG, "output all logs\n" + sb.toString()); + } + mIms.getCurrentInputConnection().commitText(sb.toString(), 0); + try { + br.close(); + } catch (IOException e) { + // ignore. + } + } + } + }); + } + + public void clearAll() { + mLoggingHandler.post(new Runnable() { + @Override + public void run() { + if (mFile != null && mFile.exists()) { + if (LatinImeLogger.sDBG) { + Log.d(TAG, "Delete log file."); + } + mFile.delete(); + mWriter.close(); + } + } + }); + } + + private BufferedReader getBufferedReader() { + createLogFileIfNotExist(); + try { + return new BufferedReader(new FileReader(mFile)); + } catch (FileNotFoundException e) { + return null; + } + } + + private PrintWriter getPrintWriter( + File dir, String filename, boolean renew) throws IOException { + mFile = new File(dir, filename); + if (mFile.exists()) { + if (renew) { + mFile.delete(); + } + } + return new PrintWriter(new FileOutputStream(mFile), true /* autoFlush */); + } + } +} diff --git a/java/src/com/android/inputmethod/latin/WindowCallbackAdapter.java b/java/src/com/android/inputmethod/latin/WindowCallbackAdapter.java new file mode 100644 index 000000000..be9bb2bd8 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/WindowCallbackAdapter.java @@ -0,0 +1,168 @@ +/* + * 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.view.ActionMode; +import android.view.ActionMode.Callback; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager.LayoutParams; +import android.view.accessibility.AccessibilityEvent; + +public class WindowCallbackAdapter implements Window.Callback { + private final Window.Callback mPreviousCallback; + + public WindowCallbackAdapter(Window.Callback previousCallback) { + mPreviousCallback = previousCallback; + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (mPreviousCallback != null) + return mPreviousCallback.dispatchKeyEvent(event); + return false; + } + + @Override + public boolean dispatchKeyShortcutEvent(KeyEvent event) { + if (mPreviousCallback != null) + return mPreviousCallback.dispatchKeyShortcutEvent(event); + return false; + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + if (mPreviousCallback != null) + return mPreviousCallback.dispatchPopulateAccessibilityEvent(event); + return false; + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + if (mPreviousCallback != null) + return mPreviousCallback.dispatchTouchEvent(event); + return false; + } + + @Override + public boolean dispatchTrackballEvent(MotionEvent event) { + if (mPreviousCallback != null) + return mPreviousCallback.dispatchTrackballEvent(event); + return false; + } + + @Override + public void onActionModeFinished(ActionMode mode) { + if (mPreviousCallback != null) + mPreviousCallback.onActionModeFinished(mode); + } + + @Override + public void onActionModeStarted(ActionMode mode) { + if (mPreviousCallback != null) + mPreviousCallback.onActionModeStarted(mode); + } + + @Override + public void onAttachedToWindow() { + if (mPreviousCallback != null) + mPreviousCallback.onAttachedToWindow(); + } + + @Override + public void onContentChanged() { + if (mPreviousCallback != null) + mPreviousCallback.onContentChanged(); + } + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + if (mPreviousCallback != null) + return mPreviousCallback.onCreatePanelMenu(featureId, menu); + return false; + } + + @Override + public View onCreatePanelView(int featureId) { + if (mPreviousCallback != null) + return mPreviousCallback.onCreatePanelView(featureId); + return null; + } + + @Override + public void onDetachedFromWindow() { + if (mPreviousCallback != null) + mPreviousCallback.onDetachedFromWindow(); + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + if (mPreviousCallback != null) + return mPreviousCallback.onMenuItemSelected(featureId, item); + return false; + } + + @Override + public boolean onMenuOpened(int featureId, Menu menu) { + if (mPreviousCallback != null) + return mPreviousCallback.onMenuOpened(featureId, menu); + return false; + } + + @Override + public void onPanelClosed(int featureId, Menu menu) { + if (mPreviousCallback != null) + mPreviousCallback.onPanelClosed(featureId, menu); + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + if (mPreviousCallback != null) + return mPreviousCallback.onPreparePanel(featureId, view, menu); + return false; + } + + @Override + public boolean onSearchRequested() { + if (mPreviousCallback != null) + return mPreviousCallback.onSearchRequested(); + return false; + } + + @Override + public void onWindowAttributesChanged(LayoutParams attrs) { + if (mPreviousCallback != null) + mPreviousCallback.onWindowAttributesChanged(attrs); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + if (mPreviousCallback != null) + mPreviousCallback.onWindowFocusChanged(hasFocus); + } + + @Override + public ActionMode onWindowStartingActionMode(Callback callback) { + if (mPreviousCallback != null) + return mPreviousCallback.onWindowStartingActionMode(callback); + return null; + } +} diff --git a/java/src/com/android/inputmethod/voice/FieldContext.java b/java/src/com/android/inputmethod/voice/FieldContext.java index 5fbacfb6c..dfdfbaa9f 100644 --- a/java/src/com/android/inputmethod/voice/FieldContext.java +++ b/java/src/com/android/inputmethod/voice/FieldContext.java @@ -73,6 +73,7 @@ public class FieldContext { bundle.putInt(IME_OPTIONS, info.imeOptions); } + @SuppressWarnings("static-access") private static void addInputConnectionToBundle( InputConnection conn, Bundle bundle) { if (conn == null) { @@ -96,6 +97,7 @@ public class FieldContext { return mFieldInfo; } + @Override public String toString() { return mFieldInfo.toString(); } diff --git a/java/src/com/android/inputmethod/latin/Hints.java b/java/src/com/android/inputmethod/voice/Hints.java index c467365e7..d11d3b042 100644 --- a/java/src/com/android/inputmethod/latin/Hints.java +++ b/java/src/com/android/inputmethod/voice/Hints.java @@ -14,14 +14,14 @@ * the License. */ -package com.android.inputmethod.latin; +package com.android.inputmethod.voice; -import com.android.inputmethod.voice.SettingsUtil; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SharedPreferencesCompat; import android.content.ContentResolver; import android.content.Context; import android.content.SharedPreferences; -import android.preference.PreferenceManager; import android.view.inputmethod.InputConnection; import java.util.Calendar; @@ -47,8 +47,9 @@ public class Hints { private static final int DEFAULT_SWIPE_HINT_MAX_DAYS_TO_SHOW = 7; private static final int DEFAULT_PUNCTUATION_HINT_MAX_DISPLAYS = 7; - private Context mContext; - private Display mDisplay; + private final Context mContext; + private final SharedPreferences mPrefs; + private final Display mDisplay; private boolean mVoiceResultContainedPunctuation; private int mSwipeHintMaxDaysToShow; private int mPunctuationHintMaxDisplays; @@ -62,8 +63,9 @@ public class Hints { SPEAKABLE_PUNCTUATION.put("?", "question mark"); } - public Hints(Context context, Display display) { + public Hints(Context context, SharedPreferences prefs, Display display) { mContext = context; + mPrefs = prefs; mDisplay = display; ContentResolver cr = mContext.getContentResolver(); @@ -103,8 +105,7 @@ public class Hints { public void registerVoiceResult(String text) { // Update the current time as the last time voice input was used. - SharedPreferences.Editor editor = - PreferenceManager.getDefaultSharedPreferences(mContext).edit(); + SharedPreferences.Editor editor = mPrefs.edit(); editor.putLong(PREF_VOICE_INPUT_LAST_TIME_USED, System.currentTimeMillis()); SharedPreferencesCompat.apply(editor); @@ -118,14 +119,14 @@ public class Hints { } private boolean shouldShowSwipeHint() { - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext); + final SharedPreferences prefs = mPrefs; - int numUniqueDaysShown = sp.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0); + int numUniqueDaysShown = prefs.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0); // If we've already shown the hint for enough days, we'll return false. if (numUniqueDaysShown < mSwipeHintMaxDaysToShow) { - long lastTimeVoiceWasUsed = sp.getLong(PREF_VOICE_INPUT_LAST_TIME_USED, 0); + long lastTimeVoiceWasUsed = prefs.getLong(PREF_VOICE_INPUT_LAST_TIME_USED, 0); // If the user has used voice today, we'll return false. (We don't show the hint on // any day that the user has already used voice.) @@ -156,16 +157,16 @@ public class Hints { } private void showHint(int hintViewResource) { - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext); + final SharedPreferences prefs = mPrefs; - int numUniqueDaysShown = sp.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0); - long lastTimeHintWasShown = sp.getLong(PREF_VOICE_HINT_LAST_TIME_SHOWN, 0); + int numUniqueDaysShown = prefs.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0); + long lastTimeHintWasShown = prefs.getLong(PREF_VOICE_HINT_LAST_TIME_SHOWN, 0); // If this is the first time the hint is being shown today, increase the saved values // to represent that. We don't need to increase the last time the hint was shown unless // it is a different day from the current value. if (!isFromToday(lastTimeHintWasShown)) { - SharedPreferences.Editor editor = sp.edit(); + SharedPreferences.Editor editor = prefs.edit(); editor.putInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, numUniqueDaysShown + 1); editor.putLong(PREF_VOICE_HINT_LAST_TIME_SHOWN, System.currentTimeMillis()); SharedPreferencesCompat.apply(editor); @@ -177,9 +178,9 @@ public class Hints { } private int getAndIncrementPref(String pref) { - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext); - int value = sp.getInt(pref, 0); - SharedPreferences.Editor editor = sp.edit(); + final SharedPreferences prefs = mPrefs; + int value = prefs.getInt(pref, 0); + SharedPreferences.Editor editor = prefs.edit(); editor.putInt(pref, value + 1); SharedPreferencesCompat.apply(editor); return value; diff --git a/java/src/com/android/inputmethod/voice/RecognitionView.java b/java/src/com/android/inputmethod/voice/RecognitionView.java index 7cec0b04a..95a79f463 100644 --- a/java/src/com/android/inputmethod/voice/RecognitionView.java +++ b/java/src/com/android/inputmethod/voice/RecognitionView.java @@ -16,14 +16,9 @@ package com.android.inputmethod.voice; -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.ShortBuffer; -import java.util.ArrayList; -import java.util.List; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SubtypeSwitcher; -import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; @@ -34,16 +29,20 @@ import android.graphics.Path; import android.graphics.PathEffect; import android.graphics.drawable.Drawable; import android.os.Handler; -import android.util.TypedValue; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; -import android.view.ViewGroup.MarginLayoutParams; +import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; -import com.android.inputmethod.latin.R; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.ShortBuffer; +import java.util.Locale; /** * The user interface for the "Speak now" and "working" states. @@ -51,86 +50,64 @@ import com.android.inputmethod.latin.R; * plays beeps, shows errors, etc. */ public class RecognitionView { + @SuppressWarnings("unused") private static final String TAG = "RecognitionView"; private Handler mUiHandler; // Reference to UI thread private View mView; private Context mContext; - private ImageView mImage; private TextView mText; - private View mButton; - private TextView mButtonText; + private ImageView mImage; private View mProgress; + private SoundIndicator mSoundIndicator; + private TextView mLanguage; + private Button mButton; private Drawable mInitializing; private Drawable mError; - private List<Drawable> mSpeakNow; - - private float mVolume = 0.0f; - private int mLevel = 0; - - private enum State {LISTENING, WORKING, READY} - private State mState = State.READY; - - private float mMinMicrophoneLevel; - private float mMaxMicrophoneLevel; - /** Updates the microphone icon to show user their volume.*/ - private Runnable mUpdateVolumeRunnable = new Runnable() { - public void run() { - if (mState != State.LISTENING) { - return; - } - - final float min = mMinMicrophoneLevel; - final float max = mMaxMicrophoneLevel; - final int maxLevel = mSpeakNow.size() - 1; + private static final int INIT = 0; + private static final int LISTENING = 1; + private static final int WORKING = 2; + private static final int READY = 3; + + private int mState = INIT; - int index = (int) ((mVolume - min) / (max - min) * maxLevel); - final int level = Math.min(Math.max(0, index), maxLevel); + private final View mPopupLayout; - if (level != mLevel) { - mImage.setImageDrawable(mSpeakNow.get(level)); - mLevel = level; - } - mUiHandler.postDelayed(mUpdateVolumeRunnable, 50); - } - }; + private final Drawable mListeningBorder; + private final Drawable mWorkingBorder; + private final Drawable mErrorBorder; public RecognitionView(Context context, OnClickListener clickListener) { mUiHandler = new Handler(); LayoutInflater inflater = (LayoutInflater) context.getSystemService( - Context.LAYOUT_INFLATER_SERVICE); + Context.LAYOUT_INFLATER_SERVICE); + mView = inflater.inflate(R.layout.recognition_status, null); - ContentResolver cr = context.getContentResolver(); - mMinMicrophoneLevel = SettingsUtil.getSettingsFloat( - cr, SettingsUtil.LATIN_IME_MIN_MICROPHONE_LEVEL, 15.f); - mMaxMicrophoneLevel = SettingsUtil.getSettingsFloat( - cr, SettingsUtil.LATIN_IME_MAX_MICROPHONE_LEVEL, 30.f); + + mPopupLayout= mView.findViewById(R.id.popup_layout); // Pre-load volume level images Resources r = context.getResources(); - mSpeakNow = new ArrayList<Drawable>(); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level0)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level1)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level2)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level3)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level4)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level5)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level6)); + mListeningBorder = r.getDrawable(R.drawable.vs_dialog_red); + mWorkingBorder = r.getDrawable(R.drawable.vs_dialog_blue); + mErrorBorder = r.getDrawable(R.drawable.vs_dialog_yellow); mInitializing = r.getDrawable(R.drawable.mic_slash); mError = r.getDrawable(R.drawable.caution); mImage = (ImageView) mView.findViewById(R.id.image); - mButton = mView.findViewById(R.id.button); + mProgress = mView.findViewById(R.id.progress); + mSoundIndicator = (SoundIndicator) mView.findViewById(R.id.sound_indicator); + + mButton = (Button) mView.findViewById(R.id.button); mButton.setOnClickListener(clickListener); mText = (TextView) mView.findViewById(R.id.text); - mButtonText = (TextView) mView.findViewById(R.id.button_text); - mProgress = mView.findViewById(R.id.progress); + mLanguage = (TextView) mView.findViewById(R.id.language); mContext = context; } @@ -141,11 +118,12 @@ public class RecognitionView { public void restoreState() { mUiHandler.post(new Runnable() { + @Override public void run() { // Restart the spinner - if (mState == State.WORKING) { - ((ProgressBar)mProgress).setIndeterminate(false); - ((ProgressBar)mProgress).setIndeterminate(true); + if (mState == WORKING) { + ((ProgressBar) mProgress).setIndeterminate(false); + ((ProgressBar) mProgress).setIndeterminate(true); } } }); @@ -153,46 +131,50 @@ public class RecognitionView { public void showInitializing() { mUiHandler.post(new Runnable() { + @Override public void run() { - prepareDialog(false, mContext.getText(R.string.voice_initializing), mInitializing, - mContext.getText(R.string.cancel)); + mState = INIT; + prepareDialog(mContext.getText(R.string.voice_initializing), mInitializing, + mContext.getText(R.string.cancel)); } }); } public void showListening() { + Log.d(TAG, "#showListening"); mUiHandler.post(new Runnable() { + @Override public void run() { - mState = State.LISTENING; - prepareDialog(false, mContext.getText(R.string.voice_listening), mSpeakNow.get(0), + mState = LISTENING; + prepareDialog(mContext.getText(R.string.voice_listening), null, mContext.getText(R.string.cancel)); } }); - mUiHandler.postDelayed(mUpdateVolumeRunnable, 50); } - public void updateVoiceMeter(final float rmsdB) { - mVolume = rmsdB; + public void updateVoiceMeter(float rmsdB) { + mSoundIndicator.setRmsdB(rmsdB); } public void showError(final String message) { mUiHandler.post(new Runnable() { + @Override public void run() { - mState = State.READY; - prepareDialog(false, message, mError, mContext.getText(R.string.ok)); + mState = READY; + prepareDialog(message, mError, mContext.getText(R.string.ok)); } - }); + }); } public void showWorking( final ByteArrayOutputStream waveBuffer, final int speechStartPosition, final int speechEndPosition) { - mUiHandler.post(new Runnable() { + @Override public void run() { - mState = State.WORKING; - prepareDialog(true, mContext.getText(R.string.voice_working), null, mContext + mState = WORKING; + prepareDialog(mContext.getText(R.string.voice_working), null, mContext .getText(R.string.cancel)); final ShortBuffer buf = ByteBuffer.wrap(waveBuffer.toByteArray()).order( ByteOrder.nativeOrder()).asShortBuffer(); @@ -200,21 +182,87 @@ public class RecognitionView { waveBuffer.reset(); showWave(buf, speechStartPosition / 2, speechEndPosition / 2); } - }); + }); } - private void prepareDialog(boolean spinVisible, CharSequence text, Drawable image, + private void prepareDialog(CharSequence text, Drawable image, CharSequence btnTxt) { - if (spinVisible) { - mProgress.setVisibility(View.VISIBLE); - mImage.setVisibility(View.GONE); - } else { - mProgress.setVisibility(View.GONE); - mImage.setImageDrawable(image); - mImage.setVisibility(View.VISIBLE); + + /* + * The mic of INIT and of LISTENING has to be displayed in the same position. To accomplish + * that, some text visibility are not set as GONE but as INVISIBLE. + */ + switch (mState) { + case INIT: + mText.setVisibility(View.INVISIBLE); + + mProgress.setVisibility(View.GONE); + + mImage.setVisibility(View.VISIBLE); + mImage.setImageResource(R.drawable.mic_slash); + + mSoundIndicator.setVisibility(View.GONE); + mSoundIndicator.stop(); + + mLanguage.setVisibility(View.INVISIBLE); + + mPopupLayout.setBackgroundDrawable(mListeningBorder); + break; + case LISTENING: + mText.setVisibility(View.VISIBLE); + mText.setText(text); + + mProgress.setVisibility(View.GONE); + + mImage.setVisibility(View.GONE); + + mSoundIndicator.setVisibility(View.VISIBLE); + mSoundIndicator.start(); + + Locale locale = SubtypeSwitcher.getInstance().getInputLocale(); + + mLanguage.setVisibility(View.VISIBLE); + mLanguage.setText(SubtypeSwitcher.getFullDisplayName(locale, true)); + + mPopupLayout.setBackgroundDrawable(mListeningBorder); + break; + case WORKING: + + mText.setVisibility(View.VISIBLE); + mText.setText(text); + + mProgress.setVisibility(View.VISIBLE); + + mImage.setVisibility(View.VISIBLE); + + mSoundIndicator.setVisibility(View.GONE); + mSoundIndicator.stop(); + + mLanguage.setVisibility(View.GONE); + + mPopupLayout.setBackgroundDrawable(mWorkingBorder); + break; + case READY: + mText.setVisibility(View.VISIBLE); + mText.setText(text); + + mProgress.setVisibility(View.GONE); + + mImage.setVisibility(View.VISIBLE); + mImage.setImageResource(R.drawable.caution); + + mSoundIndicator.setVisibility(View.GONE); + mSoundIndicator.stop(); + + mLanguage.setVisibility(View.GONE); + + mPopupLayout.setBackgroundDrawable(mErrorBorder); + break; + default: + Log.w(TAG, "Unknown state " + mState); } - mText.setText(text); - mButtonText.setText(btnTxt); + mPopupLayout.requestLayout(); + mButton.setText(btnTxt); } /** @@ -241,7 +289,7 @@ public class RecognitionView { */ private void showWave(ShortBuffer waveBuffer, int startPosition, int endPosition) { final int w = ((View) mImage.getParent()).getWidth(); - final int h = mImage.getHeight(); + final int h = ((View) mImage.getParent()).getHeight(); if (w <= 0 || h <= 0) { // view is not visible this time. Skip drawing. return; @@ -252,7 +300,7 @@ public class RecognitionView { paint.setColor(0xFFFFFFFF); // 0xAARRGGBB paint.setAntiAlias(true); paint.setStyle(Paint.Style.STROKE); - paint.setAlpha(0x90); + paint.setAlpha(80); final PathEffect effect = new CornerPathEffect(3); paint.setPathEffect(effect); @@ -274,7 +322,7 @@ public class RecognitionView { final int count = (endIndex - startIndex) / numSamplePerWave; final float deltaX = 1.0f * w / count; - int yMax = h / 2 - 8; + int yMax = h / 2; Path path = new Path(); c.translate(0, yMax); float x = 0; @@ -288,36 +336,20 @@ public class RecognitionView { path.lineTo(x, y); } if (deltaX > 4) { - paint.setStrokeWidth(3); + paint.setStrokeWidth(2); } else { - paint.setStrokeWidth(Math.max(1, (int) (deltaX -.05))); + paint.setStrokeWidth(Math.max(0, (int) (deltaX -.05))); } c.drawPath(path, paint); mImage.setImageBitmap(b); - mImage.setVisibility(View.VISIBLE); - MarginLayoutParams mProgressParams = (MarginLayoutParams)mProgress.getLayoutParams(); - mProgressParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, - -h , mContext.getResources().getDisplayMetrics()); - - // Tweak the padding manually to fill out the whole view horizontally. - // TODO: Do this in the xml layout instead. - ((View) mImage.getParent()).setPadding(4, ((View) mImage.getParent()).getPaddingTop(), 3, - ((View) mImage.getParent()).getPaddingBottom()); - mProgress.setLayoutParams(mProgressParams); } - public void finish() { mUiHandler.post(new Runnable() { + @Override public void run() { - mState = State.READY; - exitWorking(); + mSoundIndicator.stop(); } - }); - } - - private void exitWorking() { - mProgress.setVisibility(View.GONE); - mImage.setVisibility(View.VISIBLE); + }); } } diff --git a/java/src/com/android/inputmethod/voice/SettingsUtil.java b/java/src/com/android/inputmethod/voice/SettingsUtil.java index abf52047f..4d746e120 100644 --- a/java/src/com/android/inputmethod/voice/SettingsUtil.java +++ b/java/src/com/android/inputmethod/voice/SettingsUtil.java @@ -17,10 +17,7 @@ package com.android.inputmethod.voice; import android.content.ContentResolver; -import android.database.Cursor; -import android.net.Uri; import android.provider.Settings; -import android.util.Log; /** * Utility for retrieving settings from Settings.Secure. diff --git a/java/src/com/android/inputmethod/voice/SoundIndicator.java b/java/src/com/android/inputmethod/voice/SoundIndicator.java new file mode 100644 index 000000000..543290b32 --- /dev/null +++ b/java/src/com/android/inputmethod/voice/SoundIndicator.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2011 Google Inc. + * + * 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.voice; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.util.AttributeSet; +import android.widget.ImageView; + +import com.android.inputmethod.latin.R; + +/** + * A widget which shows the volume of audio using a microphone icon + */ +public class SoundIndicator extends ImageView { + @SuppressWarnings("unused") + private static final String TAG = "SoundIndicator"; + + private static final float UP_SMOOTHING_FACTOR = 0.9f; + private static final float DOWN_SMOOTHING_FACTOR = 0.4f; + + private static final float AUDIO_METER_MIN_DB = 7.0f; + private static final float AUDIO_METER_DB_RANGE = 20.0f; + + private static final long FRAME_DELAY = 50; + + private Bitmap mDrawingBuffer; + private Canvas mBufferCanvas; + private Bitmap mEdgeBitmap; + private float mLevel = 0.0f; + private Drawable mFrontDrawable; + private Paint mClearPaint; + private Paint mMultPaint; + private int mEdgeBitmapOffset; + + private Handler mHandler; + + private Runnable mDrawFrame = new Runnable() { + public void run() { + invalidate(); + mHandler.postDelayed(mDrawFrame, FRAME_DELAY); + } + }; + + public SoundIndicator(Context context) { + this(context, null); + } + + public SoundIndicator(Context context, AttributeSet attrs) { + super(context, attrs); + + mFrontDrawable = getDrawable(); + BitmapDrawable edgeDrawable = + (BitmapDrawable) context.getResources().getDrawable(R.drawable.vs_popup_mic_edge); + mEdgeBitmap = edgeDrawable.getBitmap(); + mEdgeBitmapOffset = mEdgeBitmap.getHeight() / 2; + + mDrawingBuffer = + Bitmap.createBitmap(mFrontDrawable.getIntrinsicWidth(), + mFrontDrawable.getIntrinsicHeight(), Config.ARGB_8888); + + mBufferCanvas = new Canvas(mDrawingBuffer); + + // Initialize Paints. + mClearPaint = new Paint(); + mClearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + + mMultPaint = new Paint(); + mMultPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); + + mHandler = new Handler(); + } + + @Override + public void onDraw(Canvas canvas) { + //super.onDraw(canvas); + + float w = getWidth(); + float h = getHeight(); + + // Clear the buffer canvas + mBufferCanvas.drawRect(0, 0, w, h, mClearPaint); + + // Set its clip so we don't draw the front image all the way to the top + Rect clip = new Rect(0, + (int) ((1.0 - mLevel) * (h + mEdgeBitmapOffset)) - mEdgeBitmapOffset, + (int) w, + (int) h); + + mBufferCanvas.save(); + mBufferCanvas.clipRect(clip); + + // Draw the front image + mFrontDrawable.setBounds(new Rect(0, 0, (int) w, (int) h)); + mFrontDrawable.draw(mBufferCanvas); + + mBufferCanvas.restore(); + + // Draw the edge image on top of the buffer image with a multiply mode + mBufferCanvas.drawBitmap(mEdgeBitmap, 0, clip.top, mMultPaint); + + // Draw the buffer image (on top of the background image) + canvas.drawBitmap(mDrawingBuffer, 0, 0, null); + } + + /** + * Sets the sound level + * + * @param rmsdB The level of the sound, in dB. + */ + public void setRmsdB(float rmsdB) { + float level = ((rmsdB - AUDIO_METER_MIN_DB) / AUDIO_METER_DB_RANGE); + + level = Math.min(Math.max(0.0f, level), 1.0f); + + // We smooth towards the new level + if (level > mLevel) { + mLevel = (level - mLevel) * UP_SMOOTHING_FACTOR + mLevel; + } else { + mLevel = (level - mLevel) * DOWN_SMOOTHING_FACTOR + mLevel; + } + invalidate(); + } + + public void start() { + mHandler.post(mDrawFrame); + } + + public void stop() { + mHandler.removeCallbacks(mDrawFrame); + } +} diff --git a/java/src/com/android/inputmethod/voice/VoiceIMEConnector.java b/java/src/com/android/inputmethod/voice/VoiceIMEConnector.java new file mode 100644 index 000000000..a3a3ea88e --- /dev/null +++ b/java/src/com/android/inputmethod/voice/VoiceIMEConnector.java @@ -0,0 +1,718 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * 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.voice; + +import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.latin.EditingUtils; +import com.android.inputmethod.latin.LatinIME; +import com.android.inputmethod.latin.LatinIME.UIHandler; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SharedPreferencesCompat; +import com.android.inputmethod.latin.SubtypeSwitcher; +import com.android.inputmethod.latin.SuggestedWords; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.net.Uri; +import android.os.IBinder; +import android.preference.PreferenceManager; +import android.provider.Browser; +import android.speech.SpeechRecognizer; +import android.text.Layout; +import android.text.Selection; +import android.text.Spannable; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.text.style.URLSpan; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.ExtractedTextRequest; +import android.view.inputmethod.InputConnection; +import android.view.inputmethod.InputMethodManager; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class VoiceIMEConnector implements VoiceInput.UiListener { + private static final VoiceIMEConnector sInstance = new VoiceIMEConnector(); + + public static final boolean VOICE_INSTALLED = true; + 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 + // first-run warning dialog or not). + private static final String PREF_HAS_USED_VOICE_INPUT = "has_used_voice_input"; + // Whether or not the user has used voice input from an unsupported locale UI before. + // For example, the user has a Chinese UI but activates voice input. + private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE = + "has_used_voice_input_unsupported_locale"; + // The private IME option used to indicate that no microphone should be shown for a + // given text field. For instance this is specified by the search dialog when the + // dialog is already showing a voice search button. + private static final String IME_OPTION_NO_MICROPHONE = "nm"; + private static final int RECOGNITIONVIEW_HEIGHT_THRESHOLD_RATIO = 6; + + @SuppressWarnings("unused") + private static final String TAG = "VoiceIMEConnector"; + + private boolean mAfterVoiceInput; + private boolean mHasUsedVoiceInput; + private boolean mHasUsedVoiceInputUnsupportedLocale; + private boolean mImmediatelyAfterVoiceInput; + private boolean mIsShowingHint; + private boolean mLocaleSupportedForVoiceInput; + private boolean mPasswordText; + private boolean mRecognizing; + private boolean mShowingVoiceSuggestions; + private boolean mVoiceButtonEnabled; + private boolean mVoiceButtonOnPrimary; + private boolean mVoiceInputHighlighted; + + private InputMethodManager mImm; + private LatinIME mService; + private AlertDialog mVoiceWarningDialog; + private VoiceInput mVoiceInput; + private final VoiceResults mVoiceResults = new VoiceResults(); + private Hints mHints; + private UIHandler mHandler; + private SubtypeSwitcher mSubtypeSwitcher; + // For each word, a list of potential replacements, usually from voice. + private final Map<String, List<CharSequence>> mWordToSuggestions = + new HashMap<String, List<CharSequence>>(); + + public static VoiceIMEConnector init(LatinIME context, SharedPreferences prefs, UIHandler h) { + sInstance.initInternal(context, prefs, h); + return sInstance; + } + + public static VoiceIMEConnector getInstance() { + return sInstance; + } + + private void initInternal(LatinIME service, SharedPreferences prefs, UIHandler h) { + mService = service; + mHandler = h; + mImm = (InputMethodManager) service.getSystemService(Context.INPUT_METHOD_SERVICE); + 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; + } + }); + } + } + + private VoiceIMEConnector() { + // Intentional empty constructor for singleton. + } + + public void resetVoiceStates(boolean isPasswordText) { + mAfterVoiceInput = false; + mImmediatelyAfterVoiceInput = false; + mShowingVoiceSuggestions = false; + mVoiceInputHighlighted = false; + mPasswordText = isPasswordText; + } + + public void flushVoiceInputLogs(boolean configurationChanged) { + if (VOICE_INSTALLED && !configurationChanged) { + if (mAfterVoiceInput) { + mVoiceInput.flushAllTextModificationCounters(); + mVoiceInput.logInputEnded(); + } + mVoiceInput.flushLogs(); + mVoiceInput.cancel(); + } + } + + public void flushAndLogAllTextModificationCounters(int index, CharSequence suggestion, + String wordSeparators) { + if (mAfterVoiceInput && mShowingVoiceSuggestions) { + mVoiceInput.flushAllTextModificationCounters(); + // send this intent AFTER logging any prior aggregated edits. + mVoiceInput.logTextModifiedByChooseSuggestion(suggestion.toString(), index, + wordSeparators, mService.getCurrentInputConnection()); + } + } + + private void showVoiceWarningDialog(final boolean swipe, IBinder token) { + if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(mService); + builder.setCancelable(true); + builder.setIcon(R.drawable.ic_mic_dialog); + builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int whichButton) { + mVoiceInput.logKeyboardWarningDialogOk(); + reallyStartListening(swipe); + } + }); + builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int whichButton) { + mVoiceInput.logKeyboardWarningDialogCancel(); + switchToLastInputMethod(); + } + }); + // When the dialog is dismissed by user's cancellation, switch back to the last input method + builder.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface arg0) { + mVoiceInput.logKeyboardWarningDialogCancel(); + switchToLastInputMethod(); + } + }); + + final CharSequence message; + if (mLocaleSupportedForVoiceInput) { + message = TextUtils.concat( + mService.getText(R.string.voice_warning_may_not_understand), "\n\n", + mService.getText(R.string.voice_warning_how_to_turn_off)); + } else { + message = TextUtils.concat( + mService.getText(R.string.voice_warning_locale_not_supported), "\n\n", + mService.getText(R.string.voice_warning_may_not_understand), "\n\n", + mService.getText(R.string.voice_warning_how_to_turn_off)); + } + builder.setMessage(message); + + builder.setTitle(R.string.voice_warning_title); + mVoiceWarningDialog = builder.create(); + Window window = mVoiceWarningDialog.getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.token = token; + lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; + window.setAttributes(lp); + window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + mVoiceInput.logKeyboardWarningDialogShown(); + mVoiceWarningDialog.show(); + // Make URL in the dialog message clickable + TextView textView = (TextView) mVoiceWarningDialog.findViewById(android.R.id.message); + if (textView != null) { + final CustomLinkMovementMethod method = CustomLinkMovementMethod.getInstance(); + method.setVoiceWarningDialog(mVoiceWarningDialog); + textView.setMovementMethod(method); + } + } + + private static class CustomLinkMovementMethod extends LinkMovementMethod { + private static CustomLinkMovementMethod sLinkMovementMethodInstance = + new CustomLinkMovementMethod(); + private AlertDialog mAlertDialog; + + public void setVoiceWarningDialog(AlertDialog alertDialog) { + mAlertDialog = alertDialog; + } + + public static CustomLinkMovementMethod getInstance() { + return sLinkMovementMethodInstance; + } + + // Almost the same as LinkMovementMethod.onTouchEvent(), but overrides it for + // FLAG_ACTIVITY_NEW_TASK and mAlertDialog.cancel(). + @Override + public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { + int action = event.getAction(); + + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { + int x = (int) event.getX(); + int y = (int) event.getY(); + + x -= widget.getTotalPaddingLeft(); + y -= widget.getTotalPaddingTop(); + + x += widget.getScrollX(); + y += widget.getScrollY(); + + Layout layout = widget.getLayout(); + int line = layout.getLineForVertical(y); + int off = layout.getOffsetForHorizontal(line, x); + + ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); + + if (link.length != 0) { + if (action == MotionEvent.ACTION_UP) { + if (link[0] instanceof URLSpan) { + URLSpan urlSpan = (URLSpan) link[0]; + Uri uri = Uri.parse(urlSpan.getURL()); + Context context = widget.getContext(); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); + if (mAlertDialog != null) { + // Go back to the previous IME for now. + // TODO: If we can find a way to bring the new activity to front + // while keeping the warning dialog, we don't need to cancel here. + mAlertDialog.cancel(); + } + context.startActivity(intent); + } else { + link[0].onClick(widget); + } + } else if (action == MotionEvent.ACTION_DOWN) { + Selection.setSelection(buffer, buffer.getSpanStart(link[0]), + buffer.getSpanEnd(link[0])); + } + return true; + } else { + Selection.removeSelection(buffer); + } + } + return super.onTouchEvent(widget, buffer, event); + } + } + + public void showPunctuationHintIfNecessary() { + InputConnection ic = mService.getCurrentInputConnection(); + if (!mImmediatelyAfterVoiceInput && mAfterVoiceInput && ic != null) { + if (mHints.showPunctuationHintIfNecessary(ic)) { + mVoiceInput.logPunctuationHintDisplayed(); + } + } + mImmediatelyAfterVoiceInput = false; + } + + public void hideVoiceWindow(boolean configurationChanging) { + if (!configurationChanging) { + if (mAfterVoiceInput) + mVoiceInput.logInputEnded(); + if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) { + mVoiceInput.logKeyboardWarningDialogDismissed(); + mVoiceWarningDialog.dismiss(); + mVoiceWarningDialog = null; + } + if (VOICE_INSTALLED & mRecognizing) { + mVoiceInput.cancel(); + } + } + mWordToSuggestions.clear(); + } + + public void setCursorAndSelection(int newSelEnd, int newSelStart) { + if (mAfterVoiceInput) { + mVoiceInput.setCursorPos(newSelEnd); + mVoiceInput.setSelectionSpan(newSelEnd - newSelStart); + } + } + + public void setVoiceInputHighlighted(boolean b) { + mVoiceInputHighlighted = b; + } + + public void setShowingVoiceSuggestions(boolean b) { + mShowingVoiceSuggestions = b; + } + + public boolean isVoiceButtonEnabled() { + return mVoiceButtonEnabled; + } + + public boolean isVoiceButtonOnPrimary() { + return mVoiceButtonOnPrimary; + } + + public boolean isVoiceInputHighlighted() { + return mVoiceInputHighlighted; + } + + public boolean isRecognizing() { + return mRecognizing; + } + + public boolean needsToShowWarningDialog() { + return !mHasUsedVoiceInput + || (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale); + } + + public boolean getAndResetIsShowingHint() { + boolean ret = mIsShowingHint; + mIsShowingHint = false; + return ret; + } + + private void revertVoiceInput() { + InputConnection ic = mService.getCurrentInputConnection(); + if (ic != null) ic.commitText("", 1); + mService.updateSuggestions(); + mVoiceInputHighlighted = false; + } + + public void commitVoiceInput() { + if (VOICE_INSTALLED && mVoiceInputHighlighted) { + InputConnection ic = mService.getCurrentInputConnection(); + if (ic != null) ic.finishComposingText(); + mService.updateSuggestions(); + mVoiceInputHighlighted = false; + } + } + + public boolean logAndRevertVoiceInput() { + if (VOICE_INSTALLED && mVoiceInputHighlighted) { + mVoiceInput.incrementTextModificationDeleteCount( + mVoiceResults.candidates.get(0).toString().length()); + revertVoiceInput(); + return true; + } else { + return false; + } + } + + public void rememberReplacedWord(CharSequence suggestion,String wordSeparators) { + if (mShowingVoiceSuggestions) { + // Retain the replaced word in the alternatives array. + String wordToBeReplaced = EditingUtils.getWordAtCursor( + mService.getCurrentInputConnection(), wordSeparators); + if (!mWordToSuggestions.containsKey(wordToBeReplaced)) { + wordToBeReplaced = wordToBeReplaced.toLowerCase(); + } + if (mWordToSuggestions.containsKey(wordToBeReplaced)) { + List<CharSequence> suggestions = mWordToSuggestions.get(wordToBeReplaced); + if (suggestions.contains(suggestion)) { + suggestions.remove(suggestion); + } + suggestions.add(wordToBeReplaced); + mWordToSuggestions.remove(wordToBeReplaced); + mWordToSuggestions.put(suggestion.toString(), suggestions); + } + } + } + + /** + * Tries to apply any voice alternatives for the word if this was a spoken word and + * there are voice alternatives. + * @param touching The word that the cursor is touching, with position information + * @return true if an alternative was found, false otherwise. + */ + public boolean applyVoiceAlternatives(EditingUtils.SelectedWord touching) { + // Search for result in spoken word alternatives + String selectedWord = touching.mWord.toString().trim(); + if (!mWordToSuggestions.containsKey(selectedWord)) { + selectedWord = selectedWord.toLowerCase(); + } + if (mWordToSuggestions.containsKey(selectedWord)) { + mShowingVoiceSuggestions = true; + List<CharSequence> suggestions = mWordToSuggestions.get(selectedWord); + SuggestedWords.Builder builder = new SuggestedWords.Builder(); + // If the first letter of touching is capitalized, make all the suggestions + // start with a capital letter. + if (Character.isUpperCase(touching.mWord.charAt(0))) { + for (CharSequence word : suggestions) { + String str = word.toString(); + word = Character.toUpperCase(str.charAt(0)) + str.substring(1); + builder.addWord(word); + } + } else { + builder.addWords(suggestions, null); + } + builder.setTypedWordValid(true).setHasMinimalSuggestion(true); + mService.setSuggestions(builder.build()); + mService.setCandidatesViewShown(true); + return true; + } + return false; + } + + public void handleBackspace() { + if (mAfterVoiceInput) { + // Don't log delete if the user is pressing delete at + // the beginning of the text box (hence not deleting anything) + if (mVoiceInput.getCursorPos() > 0) { + // If anything was selected before the delete was pressed, increment the + // delete count by the length of the selection + int deleteLen = mVoiceInput.getSelectionSpan() > 0 ? + mVoiceInput.getSelectionSpan() : 1; + mVoiceInput.incrementTextModificationDeleteCount(deleteLen); + } + } + } + + public void handleCharacter() { + commitVoiceInput(); + if (mAfterVoiceInput) { + // Assume input length is 1. This assumption fails for smiley face insertions. + mVoiceInput.incrementTextModificationInsertCount(1); + } + } + + public void handleSeparator() { + commitVoiceInput(); + if (mAfterVoiceInput){ + // Assume input length is 1. This assumption fails for smiley face insertions. + mVoiceInput.incrementTextModificationInsertPunctuationCount(1); + } + } + + public void handleClose() { + if (VOICE_INSTALLED & mRecognizing) { + mVoiceInput.cancel(); + } + } + + + public void handleVoiceResults(boolean capitalizeFirstWord) { + mAfterVoiceInput = true; + mImmediatelyAfterVoiceInput = true; + + InputConnection ic = mService.getCurrentInputConnection(); + if (!mService.isFullscreenMode()) { + // Start listening for updates to the text from typing, etc. + if (ic != null) { + ExtractedTextRequest req = new ExtractedTextRequest(); + ic.getExtractedText(req, InputConnection.GET_EXTRACTED_TEXT_MONITOR); + } + } + mService.vibrate(); + + final List<CharSequence> nBest = new ArrayList<CharSequence>(); + for (String c : mVoiceResults.candidates) { + if (capitalizeFirstWord) { + c = Character.toUpperCase(c.charAt(0)) + c.substring(1, c.length()); + } + nBest.add(c); + } + if (nBest.size() == 0) { + return; + } + String bestResult = nBest.get(0).toString(); + mVoiceInput.logVoiceInputDelivered(bestResult.length()); + mHints.registerVoiceResult(bestResult); + + if (ic != null) ic.beginBatchEdit(); // To avoid extra updates on committing older text + mService.commitTyped(ic); + EditingUtils.appendText(ic, bestResult); + if (ic != null) ic.endBatchEdit(); + + mVoiceInputHighlighted = true; + mWordToSuggestions.putAll(mVoiceResults.alternatives); + onCancelVoice(); + } + + public void switchToRecognitionStatusView(final Configuration configuration) { + mHandler.post(new Runnable() { + @Override + public void run() { + mService.setCandidatesViewShown(false); + mRecognizing = true; + mVoiceInput.newView(); + View v = mVoiceInput.getView(); + + ViewParent p = v.getParent(); + if (p != null && p instanceof ViewGroup) { + ((ViewGroup) p).removeView(v); + } + + View keyboardView = KeyboardSwitcher.getInstance().getInputView(); + + // The full height of the keyboard is difficult to calculate + // as the dimension is expressed in "mm" and not in "pixel" + // As we add mm, we don't know how the rounding is going to work + // thus we may end up with few pixels extra (or less). + if (keyboardView != null) { + View popupLayout = v.findViewById(R.id.popup_layout); + final int displayHeight = + mService.getResources().getDisplayMetrics().heightPixels; + final int currentHeight = popupLayout.getLayoutParams().height; + final int keyboardHeight = keyboardView.getHeight(); + if (keyboardHeight > currentHeight || keyboardHeight + > (displayHeight / RECOGNITIONVIEW_HEIGHT_THRESHOLD_RATIO)) { + popupLayout.getLayoutParams().height = keyboardHeight; + } + } + mService.setInputView(v); + mService.updateInputViewShown(); + + if (configuration != null) { + mVoiceInput.onConfigurationChanged(configuration); + } + }}); + } + + private void switchToLastInputMethod() { + IBinder token = mService.getWindow().getWindow().getAttributes().token; + mImm.switchToLastInputMethod(token); + } + + private void reallyStartListening(boolean swipe) { + if (!VOICE_INSTALLED) { + return; + } + if (!mHasUsedVoiceInput) { + // The user has started a voice input, so remember that in the + // future (so we don't show the warning dialog after the first run). + SharedPreferences.Editor editor = + PreferenceManager.getDefaultSharedPreferences(mService).edit(); + editor.putBoolean(PREF_HAS_USED_VOICE_INPUT, true); + SharedPreferencesCompat.apply(editor); + mHasUsedVoiceInput = true; + } + + if (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale) { + // The user has started a voice input from an unsupported locale, so remember that + // in the future (so we don't show the warning dialog the next time they do this). + SharedPreferences.Editor editor = + PreferenceManager.getDefaultSharedPreferences(mService).edit(); + editor.putBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, true); + SharedPreferencesCompat.apply(editor); + mHasUsedVoiceInputUnsupportedLocale = true; + } + + // Clear N-best suggestions + mService.clearSuggestions(); + + FieldContext context = makeFieldContext(); + mVoiceInput.startListening(context, swipe); + switchToRecognitionStatusView(null); + } + + public void startListening(final boolean swipe, IBinder token) { + // 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); + } + } + } + + private boolean fieldCanDoVoice(FieldContext fieldContext) { + return !mPasswordText + && mVoiceInput != null + && !mVoiceInput.isBlacklistedField(fieldContext); + } + + private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) { + return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext) + && !(attribute != null + && IME_OPTION_NO_MICROPHONE.equals(attribute.privateImeOptions)) + && SpeechRecognizer.isRecognitionAvailable(mService); + } + + public void loadSettings(EditorInfo attribute, SharedPreferences sp) { + mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false); + mHasUsedVoiceInputUnsupportedLocale = + sp.getBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, false); + + 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)); + } + } + + public void destroy() { + if (VOICE_INSTALLED && mVoiceInput != null) { + mVoiceInput.destroy(); + } + } + + public void onStartInputView(IBinder token) { + // If IME is in voice mode, but still needs to show the voice warning dialog, + // keep showing the warning. + if (mSubtypeSwitcher.isVoiceMode() && token != null) { + // Close keyboard view if it is been shown. + if (KeyboardSwitcher.getInstance().isInputViewShown()) + KeyboardSwitcher.getInstance().getInputView().purgeKeyboardAndClosing(); + startListening(false, token); + } + // If we have no token, onAttachedToWindow will take care of showing dialog and start + // listening. + } + + public void onAttachedToWindow() { + // After onAttachedToWindow, we can show the voice warning dialog. See startListening() + // above. + mSubtypeSwitcher.setVoiceInput(mVoiceInput); + } + + public void onConfigurationChanged(Configuration configuration) { + if (mRecognizing) { + switchToRecognitionStatusView(configuration); + } + } + + @Override + public void onCancelVoice() { + if (mRecognizing) { + if (mSubtypeSwitcher.isVoiceMode()) { + // If voice mode is being canceled within LatinIME (i.e. time-out or user + // cancellation etc.), onCancelVoice() will be called first. LatinIME thinks it's + // still in voice mode. LatinIME needs to call switchToLastInputMethod(). + // Note that onCancelVoice() will be called again from SubtypeSwitcher. + switchToLastInputMethod(); + } else if (mSubtypeSwitcher.isKeyboardMode()) { + // If voice mode is being canceled out of LatinIME (i.e. by user's IME switching or + // as a result of switchToLastInputMethod() etc.), + // onCurrentInputMethodSubtypeChanged() will be called first. LatinIME will know + // that it's in keyboard mode and SubtypeSwitcher will call onCancelVoice(). + mRecognizing = false; + mService.switchToKeyboardView(); + } + } + } + + @Override + public void onVoiceResults(List<String> candidates, + Map<String, List<CharSequence>> alternatives) { + if (!mRecognizing) { + return; + } + mVoiceResults.candidates = candidates; + mVoiceResults.alternatives = alternatives; + mHandler.updateVoiceResults(); + } + + public FieldContext makeFieldContext() { + SubtypeSwitcher switcher = SubtypeSwitcher.getInstance(); + return new FieldContext(mService.getCurrentInputConnection(), + mService.getCurrentInputEditorInfo(), switcher.getInputLocaleStr(), + switcher.getEnabledLanguages()); + } + + private class VoiceResults { + List<String> candidates; + Map<String, List<CharSequence>> alternatives; + } +} diff --git a/java/src/com/android/inputmethod/voice/VoiceInput.java b/java/src/com/android/inputmethod/voice/VoiceInput.java index 4c54dd3c5..2df9e8588 100644 --- a/java/src/com/android/inputmethod/voice/VoiceInput.java +++ b/java/src/com/android/inputmethod/voice/VoiceInput.java @@ -16,24 +16,26 @@ package com.android.inputmethod.voice; -import com.android.inputmethod.latin.EditingUtil; +import com.android.inputmethod.latin.EditingUtils; +import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.speech.RecognitionListener; -import android.speech.SpeechRecognizer; import android.speech.RecognizerIntent; +import android.speech.SpeechRecognizer; import android.util.Log; -import android.view.inputmethod.InputConnection; import android.view.View; import android.view.View.OnClickListener; +import android.view.inputmethod.InputConnection; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -57,6 +59,7 @@ public class VoiceInput implements OnClickListener { private static final String EXTRA_CALLING_PACKAGE = "calling_package"; private static final String EXTRA_ALTERNATES = "android.speech.extra.ALTERNATES"; private static final int MAX_ALT_LIST_LENGTH = 6; + private static boolean DBG = LatinImeLogger.sDBG; private static final String DEFAULT_RECOMMENDED_PACKAGES = "com.android.mms " + @@ -86,6 +89,7 @@ public class VoiceInput implements OnClickListener { private static final String ALTERNATES_BUNDLE = "alternates_bundle"; // This is copied from the VoiceSearch app. + @SuppressWarnings("unused") private static final class AlternatesBundleKeys { public static final String ALTERNATES = "alternates"; public static final String CONFIDENCE = "confidence"; @@ -126,12 +130,12 @@ public class VoiceInput implements OnClickListener { private int mState = DEFAULT; - private final static int MSG_CLOSE_ERROR_DIALOG = 1; + private final static int MSG_RESET = 1; private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { - if (msg.what == MSG_CLOSE_ERROR_DIALOG) { + if (msg.what == MSG_RESET) { mState = DEFAULT; mRecognitionView.finish(); mUiListener.onCancelVoice(); @@ -240,7 +244,7 @@ public class VoiceInput implements OnClickListener { } public void incrementTextModificationInsertPunctuationCount(int count){ - mAfterVoiceInputInsertPunctuationCount += 1; + mAfterVoiceInputInsertPunctuationCount += count; if (mAfterVoiceInputSelectionSpan > 0) { // If text was highlighted before inserting the char, count this as // a delete. @@ -276,8 +280,9 @@ public class VoiceInput implements OnClickListener { * The configuration of the IME changed and may have caused the views to be layed out * again. Restore the state of the recognition view. */ - public void onConfigurationChanged() { + public void onConfigurationChanged(Configuration configuration) { mRecognitionView.restoreState(); + mRecognitionView.getView().dispatchConfigurationChanged(configuration); } /** @@ -305,8 +310,18 @@ public class VoiceInput implements OnClickListener { * @param swipe whether this voice input was started by swipe, for logging purposes */ public void startListening(FieldContext context, boolean swipe) { - mState = DEFAULT; - + if (DBG) { + Log.d(TAG, "startListening: " + context); + } + + if (mState != DEFAULT) { + Log.w(TAG, "startListening in the wrong status " + mState); + } + + // If everything works ok, the voice input should be already in the correct state. As this + // class can be called by third-party, we call reset just to be on the safe side. + reset(); + Locale locale = Locale.getDefault(); String localeString = locale.getLanguage() + "-" + locale.getCountry(); @@ -405,6 +420,7 @@ public class VoiceInput implements OnClickListener { /** * Handle the cancel button. */ + @Override public void onClick(View view) { switch(view.getId()) { case R.id.button: @@ -427,8 +443,7 @@ public class VoiceInput implements OnClickListener { public void logTextModifiedByChooseSuggestion(String suggestion, int index, String wordSeparators, InputConnection ic) { - EditingUtil.Range range = new EditingUtil.Range(); - String wordToBeReplaced = EditingUtil.getWordAtCursor(ic, wordSeparators, range); + String wordToBeReplaced = EditingUtils.getWordAtCursor(ic, wordSeparators); // If we enable phrase-based alternatives, only send up the first word // in suggestion and wordToBeReplaced. mLogger.textModifiedByChooseSuggestion(suggestion.length(), wordToBeReplaced.length(), @@ -491,6 +506,21 @@ public class VoiceInput implements OnClickListener { } /** + * Reset the current voice recognition. + */ + public void reset() { + if (mState != DEFAULT) { + mState = DEFAULT; + + // Remove all pending tasks (e.g., timers to cancel voice input) + mHandler.removeMessages(MSG_RESET); + + mSpeechRecognizer.cancel(); + mRecognitionView.finish(); + } + } + + /** * Cancel in-progress speech recognition. */ public void cancel() { @@ -505,14 +535,9 @@ public class VoiceInput implements OnClickListener { mLogger.cancelDuringError(); break; } - mState = DEFAULT; - - // Remove all pending tasks (e.g., timers to cancel voice input) - mHandler.removeMessages(MSG_CLOSE_ERROR_DIALOG); - mSpeechRecognizer.cancel(); + reset(); mUiListener.onCancelVoice(); - mRecognitionView.finish(); } private int getErrorStringId(int errorType, boolean endpointed) { @@ -547,7 +572,7 @@ public class VoiceInput implements OnClickListener { mState = ERROR; mRecognitionView.showError(error); // Wait a couple seconds and then automatically dismiss message. - mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_CLOSE_ERROR_DIALOG), 2000); + mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_RESET), 2000); } private class ImeRecognitionListener implements RecognitionListener { @@ -556,36 +581,45 @@ public class VoiceInput implements OnClickListener { int mSpeechStart; private boolean mEndpointed = false; + @Override public void onReadyForSpeech(Bundle noiseParams) { mRecognitionView.showListening(); } + @Override public void onBeginningOfSpeech() { mEndpointed = false; mSpeechStart = mWaveBuffer.size(); } + @Override public void onRmsChanged(float rmsdB) { mRecognitionView.updateVoiceMeter(rmsdB); } + @Override public void onBufferReceived(byte[] buf) { try { mWaveBuffer.write(buf); - } catch (IOException e) {} + } catch (IOException e) { + // ignore. + } } + @Override public void onEndOfSpeech() { mEndpointed = true; mState = WORKING; mRecognitionView.showWorking(mWaveBuffer, mSpeechStart, mWaveBuffer.size()); } + @Override public void onError(int errorType) { mState = ERROR; VoiceInput.this.onError(errorType, mEndpointed); } + @Override public void onResults(Bundle resultsBundle) { List<String> results = resultsBundle .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); @@ -638,10 +672,12 @@ public class VoiceInput implements OnClickListener { mRecognitionView.finish(); } + @Override public void onPartialResults(final Bundle partialResults) { // currently - do nothing } + @Override public void onEvent(int eventType, Bundle params) { // do nothing - reserved for events that might be added in the future } diff --git a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java index 0d21133e0..3e65434a2 100644 --- a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java +++ b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java @@ -31,6 +31,7 @@ import android.content.Intent; * on on the VoiceSearch side. */ public class VoiceInputLogger { + @SuppressWarnings("unused") private static final String TAG = VoiceInputLogger.class.getSimpleName(); private static VoiceInputLogger sVoiceInputLogger; @@ -205,14 +206,16 @@ public class VoiceInputLogger { mContext.sendBroadcast(i); } + public void textModifiedByChooseSuggestion(int suggestionLength, int replacedPhraseLength, int index, String before, String after) { setHasLoggingInfo(true); Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED); - i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE, - LoggingEvents.VoiceIme.TEXT_MODIFIED_TYPE_CHOOSE_SUGGESTION); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, suggestionLength); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_REPLACED_LENGTH, replacedPhraseLength); + i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE, + LoggingEvents.VoiceIme.TEXT_MODIFIED_TYPE_CHOOSE_SUGGESTION); + i.putExtra(LoggingEvents.VoiceIme.EXTRA_N_BEST_CHOOSE_INDEX, index); i.putExtra(LoggingEvents.VoiceIme.EXTRA_BEFORE_N_BEST_CHOOSE, before); i.putExtra(LoggingEvents.VoiceIme.EXTRA_AFTER_N_BEST_CHOOSE, after); diff --git a/java/src/com/android/inputmethod/voice/WaveformImage.java b/java/src/com/android/inputmethod/voice/WaveformImage.java index 08d87c8f3..8bac669fc 100644 --- a/java/src/com/android/inputmethod/voice/WaveformImage.java +++ b/java/src/com/android/inputmethod/voice/WaveformImage.java @@ -33,7 +33,9 @@ import java.nio.ShortBuffer; public class WaveformImage { private static final int SAMPLING_RATE = 8000; - private WaveformImage() {} + private WaveformImage() { + // Intentional empty constructor. + } public static Bitmap drawWaveform( ByteArrayOutputStream waveBuffer, int w, int h, int start, int end) { diff --git a/java/src/com/android/inputmethod/voice/Whitelist.java b/java/src/com/android/inputmethod/voice/Whitelist.java index 167b688ca..f4c24de0c 100644 --- a/java/src/com/android/inputmethod/voice/Whitelist.java +++ b/java/src/com/android/inputmethod/voice/Whitelist.java @@ -17,6 +17,7 @@ package com.android.inputmethod.voice; import android.os.Bundle; + import java.util.ArrayList; import java.util.List; |